From 7cbd16b1fc3b59af4540333b33ac19bad659dbe8 Mon Sep 17 00:00:00 2001 From: Arnaud Roland Date: Fri, 26 Apr 2024 16:16:50 +0200 Subject: [PATCH] release: SDK 2.0.0 --- README.md | 2 +- Sources/buildSrc/src/main/java/Consts.kt | 21 +- Sources/gradle.properties | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 4 +- Sources/sdk-stubs/build.gradle.kts | 1 - Sources/sdk/build.gradle.kts | 30 +- Sources/sdk/jacoco.gradle | 4 +- Sources/sdk/proguard-sdk-release.txt | 4 - .../com/batch/android/TestApplication.java | 2 +- .../core/GooglePlayServicesHelperTest.java | 20 +- .../batch/android/AdsIdentifierProvider.java | 49 - ...entifierProviderAvailabilityException.java | 16 - .../java/com/batch/android/AdvertisingID.java | 67 - .../android/AttributesCheckWebservice.java | 3 - .../android/AttributesSendWebservice.java | 4 - .../main/java/com/batch/android/Batch.java | 605 +- .../android/BatchActivityLifecycleHelper.java | 1 - .../android/BatchDataCollectionConfig.java | 123 + .../BatchDisplayReceiptJobService.java | 1 - .../batch/android/BatchEventAttributes.java | 225 + .../com/batch/android/BatchEventData.java | 350 - .../BatchInboxNotificationContent.java | 17 - ...BatchMessagingWebViewJavascriptBridge.java | 4 +- .../com/batch/android/BatchMigration.java | 94 + .../android/BatchPermissionListener.java | 16 + .../android/BatchProfileAttributeEditor.java | 481 + .../java/com/batch/android/BatchPushData.java | 129 - .../android/BatchPushInstanceIDService.java | 20 - .../android/BatchPushMessageReceiver.java | 5 +- .../BatchPushNotificationPresenter.java | 51 +- .../com/batch/android/BatchPushPayload.java | 12 - .../com/batch/android/BatchPushReceiver.java | 40 - .../batch/android/BatchPushRegistration.java | 92 + .../com/batch/android/BatchPushService.java | 2 +- .../batch/android/BatchQueryWebservice.java | 9 - .../batch/android/BatchUserDataEditor.java | 654 - .../com/batch/android/BatchUserProfile.java | 145 - .../com/batch/android/BatchWebservice.java | 83 +- .../main/java/com/batch/android/Config.java | 135 - .../android/LocalCampaignsWebservice.java | 3 - .../com/batch/android/PushWebservice.java | 15 +- .../com/batch/android/StartWebservice.java | 6 +- .../com/batch/android/TrackerWebservice.java | 4 - .../src/main/java/com/batch/android/User.java | 204 - .../com/batch/android/WebserviceLauncher.java | 6 +- .../com/batch/android/WebserviceMetrics.java | 146 - .../android/WebserviceParameterUtils.java | 143 +- .../NotificationPermissionActionRunnable.java | 2 +- .../RedirectNotificationSettingsAction.java | 6 +- .../android/actions/SmartReOptInAction.java | 2 +- .../UserDataBuiltinActionRunnable.java | 11 +- .../UserEventBuiltinActionRunnable.java | 24 +- .../batch/android/core/Base32Encoding.java | 150 - .../batch/android/core/DeeplinkHelper.java | 24 +- .../com/batch/android/core/GenericHelper.java | 10 - .../core/GooglePlayServicesHelper.java | 177 +- .../batch/android/core/InternalPushData.java | 22 - .../core/KVUserPreferencesStorage.java | 92 +- .../java/com/batch/android/core/Logger.java | 15 +- .../core/NotificationAuthorizationStatus.java | 4 +- .../core/NotificationPermissionHelper.java | 29 +- .../core/ObjectUserPreferencesStorage.java | 165 - .../com/batch/android/core/ParameterKeys.java | 8 +- .../com/batch/android/core/Parameters.java | 60 +- .../batch/android/core/ReflectionHelper.java | 22 - .../android/core/SystemParameterHelper.java | 602 - .../core/SystemParameterShortName.java | 122 - .../batch/android/core/TLSSocketFactory.java | 22 +- .../java/com/batch/android/core/TypedID.java | 371 - .../batch/android/core/TypedIDExceptions.java | 34 - .../java/com/batch/android/core/Ulid.java | 142 - .../com/batch/android/core/Webservice.java | 9 +- .../systemparameters/SystemParameter.java | 92 + .../SystemParameterHelper.java | 247 + .../SystemParameterRegistry.java | 223 + .../SystemParameterShortName.java | 102 + .../WatchedSystemParameter.java | 110 + .../fragment/IdentifierDebugFragment.java | 46 +- .../debug/fragment/UserDataDebugFragment.java | 11 +- .../android/displayreceipt/CacheHelper.java | 27 +- .../event/EventAttributesSerializer.java | 62 + .../event/EventAttributesValidator.java | 370 + .../android/event/EventTypedAttribute.java | 14 + .../batch/android/event/InternalEvents.java | 8 +- .../batch/android/inbox/InboxDatasource.java | 30 +- .../android/inbox/InboxFetcherInternal.java | 13 +- .../ModalContentPanGestureDetector.java | 4 +- .../fragment/ModalTemplateFragment.java | 11 +- .../fragment/UniversalTemplateFragment.java | 11 +- .../fragment/WebViewTemplateFragment.java | 11 +- .../android/messaging/gif/GifDrawable.java | 6 +- .../messaging/view/AnimatedCloseButton.java | 7 +- .../android/messaging/view/CloseButton.java | 46 +- .../android/messaging/view/CountdownView.java | 8 +- .../messaging/view/FixedRatioFrameLayout.java | 1 - .../view/MaximumHeightScrollView.java | 4 - .../view/PannableBannerFrameLayout.java | 4 +- .../view/PositionableGradientDrawable.java | 16 +- .../messaging/view/formats/BannerView.java | 4 +- .../view/formats/ImageFormatView.java | 13 +- .../view/formats/UniversalRootView.java | 21 +- .../messaging/view/formats/WebFormatView.java | 49 +- .../messaging/view/helper/StyleHelper.java | 59 +- .../messaging/view/helper/ViewCompat.java | 26 +- .../view/roundimage/RoundedImageView.java | 16 +- .../android/messaging/view/styled/Button.java | 8 +- .../messaging/view/styled/TextView.java | 22 +- .../android/module/BatchModuleMaster.java | 8 +- .../android/module/DataCollectionModule.java | 322 + .../android/module/DisplayReceiptModule.java | 2 +- .../batch/android/module/MessagingModule.java | 2 +- .../batch/android/module/OptOutModule.java | 25 +- .../batch/android/module/ProfileModule.java | 257 + .../com/batch/android/module/PushModule.java | 109 +- .../batch/android/module/TrackerModule.java | 172 +- .../com/batch/android/module/UserModule.java | 264 +- .../LocalCampaignsJITPostDataProvider.java | 2 +- .../android/profile/ProfileDataHelper.java | 212 + .../profile/ProfileDataSerializer.java | 101 + .../profile/ProfileDeletableAttribute.java | 53 + .../ProfilePartialUpdateAttribute.java | 54 + .../profile/ProfileUpdateOperation.java | 217 + .../push/FCMAbstractRegistrationProvider.java | 21 +- .../FCMInstanceIdRegistrationProvider.java | 64 - .../push/FCMTokenRegistrationProvider.java | 16 +- .../push/GCMAbstractRegistrationProvider.java | 93 - .../push/GCMIidRegistrationProvider.java | 50 - .../push/GCMLegacyRegistrationProvider.java | 36 - .../push/PushRegistrationProviderFactory.java | 270 +- .../push/PushRegistrationRegistrar.java | 4 +- .../com/batch/android/push/Registration.java | 31 - .../android/push/formats/APENFormat.java | 5 - .../com/batch/android/query/PushQuery.java | 20 +- .../response/AttributesCheckResponse.java | 12 + .../response/AttributesSendResponse.java | 22 +- .../AttributesCheckResponseDeserializer.java | 6 + .../AttributesSendResponseDeserializer.java | 6 + .../android/runtime/ChangeStateAction.java | 5 +- .../com/batch/android/runtime/Config.java | 137 + .../batch/android/runtime/ConfigAction.java | 15 + .../batch/android/runtime/RuntimeManager.java | 109 +- .../android/tracker/TrackerDatasource.java | 6 +- .../batch/android/tracker/TrackerMode.java | 52 - .../com/batch/android/user/AttributeType.java | 9 +- .../batch/android/user/EmailSubscription.java | 96 - .../batch/android/user/InstallDataEditor.java | 408 + .../batch/android/user/SQLUserDatasource.java | 36 - .../com/batch/android/user/UserAttribute.java | 17 +- .../com/batch/android/user/UserDataDiff.java | 3 +- .../batch/android/user/UserDatasource.java | 3 - .../android/util/DataCollectionUtils.java | 39 + .../com/batch/android/util/MetaDataUtils.java | 4 +- ...AttributesCheckWebserviceListenerImpl.java | 18 + .../AttributesSendWebserviceListenerImpl.java | 22 +- ...com_batchsdk_identifier_debug_fragment.xml | 15 - Sources/sdk/src/main/res/values/strings.xml | 1 - .../com/batch/android/BatchEventDataTest.java | 242 - .../BatchProfileAttributeEditorTest.kt | 232 + .../com/batch/android/BatchPushDataTest.java | 104 - .../java/com/batch/android/BatchUserTest.java | 507 - .../batch/android/EmailSubscriptionTest.java | 123 - .../android/JSONObjectMockitoMatcher.java | 7 + .../android/JSONObjectPartialMatcher.java | 60 + .../com/batch/android/ModuleStatusTest.java | 32 - .../com/batch/android/ProfileModuleTest.kt | 350 + .../java/com/batch/android/TestActivity.java | 2 +- .../com/batch/android/TestApplication.java | 2 +- .../android/actions/ActionModuleTest.java | 5 +- .../android/actions/UserEventActionTest.java | 107 +- .../com/batch/android/core/DeeplinkTest.java | 34 - .../android/core/EmailValidationTest.java | 28 - .../ObjectUserPreferencesStorageTest.java | 143 - .../com/batch/android/core/TestBase32.java | 47 - .../batch/android/core/TestBase32Decode.java | 66 - .../batch/android/core/TestBase32Encode.java | 68 - .../com/batch/android/core/TestTypedID.java | 175 - .../java/com/batch/android/core/TestUlid.java | 59 - .../SystemParameterHelperTest.kt | 44 + .../SystemParameterRegistryTest.kt | 34 + .../systemparameters/SystemParameterTest.kt | 47 + .../java/com/batch/android/di/DITest.java | 6 +- .../event/EventAttributesSerializerTest.kt | 104 + .../event/EventAttributesValidatorTest.kt | 219 + .../inbox/InboxFetcherInternalTest.java | 2 - .../InboxNotificationContentParsingTest.kt | 2 - .../localcampaigns/EventTriggerTest.java | 4 +- .../module/DataCollectionModuleTest.kt | 137 + .../profile/ProfileDataHelperTest.java | 60 + .../profile/ProfileDataSerializerTest.kt | 92 + .../profile/ProfileDeletableAttributeTest.kt | 22 + .../ProfilePartialUpdateAttributeTest.kt | 32 + .../profile/ProfileUpdateOperationTest.kt | 135 + .../query/ResponseDeserializationTest.java | 4 +- .../batch/android/tracker/DatasourceTest.java | 15 + .../android/user/InstallDataEditorTest.java | 173 + .../com/batch/android/user/UserModuleTest.kt | 93 + proguard-mappings/1.20.2/checksum.sha | 1 + proguard-mappings/1.20.2/mapping.txt | 9869 +++++++++++++ proguard-mappings/2.0.0/checksum.sha | 1 + proguard-mappings/2.0.0/mapping.txt | 11880 ++++++++++++++++ 200 files changed, 28894 insertions(+), 7803 deletions(-) delete mode 100644 Sources/sdk/src/main/java/com/batch/android/AdsIdentifierProvider.java delete mode 100644 Sources/sdk/src/main/java/com/batch/android/AdsIdentifierProviderAvailabilityException.java delete mode 100644 Sources/sdk/src/main/java/com/batch/android/AdvertisingID.java create mode 100644 Sources/sdk/src/main/java/com/batch/android/BatchDataCollectionConfig.java create mode 100644 Sources/sdk/src/main/java/com/batch/android/BatchEventAttributes.java delete mode 100644 Sources/sdk/src/main/java/com/batch/android/BatchEventData.java create mode 100644 Sources/sdk/src/main/java/com/batch/android/BatchMigration.java create mode 100644 Sources/sdk/src/main/java/com/batch/android/BatchPermissionListener.java create mode 100644 Sources/sdk/src/main/java/com/batch/android/BatchProfileAttributeEditor.java delete mode 100644 Sources/sdk/src/main/java/com/batch/android/BatchPushData.java delete mode 100644 Sources/sdk/src/main/java/com/batch/android/BatchPushInstanceIDService.java delete mode 100644 Sources/sdk/src/main/java/com/batch/android/BatchPushReceiver.java create mode 100644 Sources/sdk/src/main/java/com/batch/android/BatchPushRegistration.java delete mode 100644 Sources/sdk/src/main/java/com/batch/android/BatchUserDataEditor.java delete mode 100644 Sources/sdk/src/main/java/com/batch/android/BatchUserProfile.java delete mode 100644 Sources/sdk/src/main/java/com/batch/android/Config.java delete mode 100644 Sources/sdk/src/main/java/com/batch/android/User.java delete mode 100644 Sources/sdk/src/main/java/com/batch/android/WebserviceMetrics.java delete mode 100644 Sources/sdk/src/main/java/com/batch/android/core/Base32Encoding.java delete mode 100644 Sources/sdk/src/main/java/com/batch/android/core/ObjectUserPreferencesStorage.java delete mode 100644 Sources/sdk/src/main/java/com/batch/android/core/SystemParameterHelper.java delete mode 100644 Sources/sdk/src/main/java/com/batch/android/core/SystemParameterShortName.java delete mode 100644 Sources/sdk/src/main/java/com/batch/android/core/TypedID.java delete mode 100644 Sources/sdk/src/main/java/com/batch/android/core/TypedIDExceptions.java delete mode 100644 Sources/sdk/src/main/java/com/batch/android/core/Ulid.java create mode 100644 Sources/sdk/src/main/java/com/batch/android/core/systemparameters/SystemParameter.java create mode 100644 Sources/sdk/src/main/java/com/batch/android/core/systemparameters/SystemParameterHelper.java create mode 100644 Sources/sdk/src/main/java/com/batch/android/core/systemparameters/SystemParameterRegistry.java create mode 100644 Sources/sdk/src/main/java/com/batch/android/core/systemparameters/SystemParameterShortName.java create mode 100644 Sources/sdk/src/main/java/com/batch/android/core/systemparameters/WatchedSystemParameter.java create mode 100644 Sources/sdk/src/main/java/com/batch/android/event/EventAttributesSerializer.java create mode 100644 Sources/sdk/src/main/java/com/batch/android/event/EventAttributesValidator.java create mode 100644 Sources/sdk/src/main/java/com/batch/android/event/EventTypedAttribute.java create mode 100644 Sources/sdk/src/main/java/com/batch/android/module/DataCollectionModule.java create mode 100644 Sources/sdk/src/main/java/com/batch/android/module/ProfileModule.java create mode 100644 Sources/sdk/src/main/java/com/batch/android/profile/ProfileDataHelper.java create mode 100644 Sources/sdk/src/main/java/com/batch/android/profile/ProfileDataSerializer.java create mode 100644 Sources/sdk/src/main/java/com/batch/android/profile/ProfileDeletableAttribute.java create mode 100644 Sources/sdk/src/main/java/com/batch/android/profile/ProfilePartialUpdateAttribute.java create mode 100644 Sources/sdk/src/main/java/com/batch/android/profile/ProfileUpdateOperation.java delete mode 100644 Sources/sdk/src/main/java/com/batch/android/push/FCMInstanceIdRegistrationProvider.java delete mode 100644 Sources/sdk/src/main/java/com/batch/android/push/GCMAbstractRegistrationProvider.java delete mode 100644 Sources/sdk/src/main/java/com/batch/android/push/GCMIidRegistrationProvider.java delete mode 100644 Sources/sdk/src/main/java/com/batch/android/push/GCMLegacyRegistrationProvider.java delete mode 100644 Sources/sdk/src/main/java/com/batch/android/push/Registration.java create mode 100644 Sources/sdk/src/main/java/com/batch/android/runtime/Config.java create mode 100644 Sources/sdk/src/main/java/com/batch/android/runtime/ConfigAction.java delete mode 100644 Sources/sdk/src/main/java/com/batch/android/tracker/TrackerMode.java delete mode 100644 Sources/sdk/src/main/java/com/batch/android/user/EmailSubscription.java create mode 100644 Sources/sdk/src/main/java/com/batch/android/user/InstallDataEditor.java create mode 100644 Sources/sdk/src/main/java/com/batch/android/util/DataCollectionUtils.java delete mode 100644 Sources/sdk/src/test/java/com/batch/android/BatchEventDataTest.java create mode 100644 Sources/sdk/src/test/java/com/batch/android/BatchProfileAttributeEditorTest.kt delete mode 100644 Sources/sdk/src/test/java/com/batch/android/BatchPushDataTest.java delete mode 100644 Sources/sdk/src/test/java/com/batch/android/BatchUserTest.java delete mode 100644 Sources/sdk/src/test/java/com/batch/android/EmailSubscriptionTest.java create mode 100644 Sources/sdk/src/test/java/com/batch/android/JSONObjectPartialMatcher.java delete mode 100644 Sources/sdk/src/test/java/com/batch/android/ModuleStatusTest.java create mode 100644 Sources/sdk/src/test/java/com/batch/android/ProfileModuleTest.kt delete mode 100644 Sources/sdk/src/test/java/com/batch/android/core/EmailValidationTest.java delete mode 100644 Sources/sdk/src/test/java/com/batch/android/core/ObjectUserPreferencesStorageTest.java delete mode 100644 Sources/sdk/src/test/java/com/batch/android/core/TestBase32.java delete mode 100644 Sources/sdk/src/test/java/com/batch/android/core/TestBase32Decode.java delete mode 100644 Sources/sdk/src/test/java/com/batch/android/core/TestBase32Encode.java delete mode 100644 Sources/sdk/src/test/java/com/batch/android/core/TestTypedID.java delete mode 100644 Sources/sdk/src/test/java/com/batch/android/core/TestUlid.java create mode 100644 Sources/sdk/src/test/java/com/batch/android/core/systemparameters/SystemParameterHelperTest.kt create mode 100644 Sources/sdk/src/test/java/com/batch/android/core/systemparameters/SystemParameterRegistryTest.kt create mode 100644 Sources/sdk/src/test/java/com/batch/android/core/systemparameters/SystemParameterTest.kt create mode 100644 Sources/sdk/src/test/java/com/batch/android/event/EventAttributesSerializerTest.kt create mode 100644 Sources/sdk/src/test/java/com/batch/android/event/EventAttributesValidatorTest.kt create mode 100644 Sources/sdk/src/test/java/com/batch/android/module/DataCollectionModuleTest.kt create mode 100644 Sources/sdk/src/test/java/com/batch/android/profile/ProfileDataHelperTest.java create mode 100644 Sources/sdk/src/test/java/com/batch/android/profile/ProfileDataSerializerTest.kt create mode 100644 Sources/sdk/src/test/java/com/batch/android/profile/ProfileDeletableAttributeTest.kt create mode 100644 Sources/sdk/src/test/java/com/batch/android/profile/ProfilePartialUpdateAttributeTest.kt create mode 100644 Sources/sdk/src/test/java/com/batch/android/profile/ProfileUpdateOperationTest.kt create mode 100644 Sources/sdk/src/test/java/com/batch/android/user/InstallDataEditorTest.java create mode 100644 Sources/sdk/src/test/java/com/batch/android/user/UserModuleTest.kt create mode 100644 proguard-mappings/1.20.2/checksum.sha create mode 100644 proguard-mappings/1.20.2/mapping.txt create mode 100644 proguard-mappings/2.0.0/checksum.sha create mode 100644 proguard-mappings/2.0.0/mapping.txt diff --git a/README.md b/README.md index 35b56ff..a883a05 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ The Batch Android SDK allows you to build meaningful communication experience in Our [📕 setup documentation](https://doc.batch.com/ios/prerequisites) details the steps to take for an easy and successful integration. # Prerequisites -The Batch Android SDK requires Android Studio 4 and Android API 15. +The Batch Android SDK requires Android 5.0 (Lollipop / API Level 21). # Documentation - [Setup guide](https://doc.batch.com/android/prerequisites): start your implementation here! diff --git a/Sources/buildSrc/src/main/java/Consts.kt b/Sources/buildSrc/src/main/java/Consts.kt index 1ea03ac..74019e4 100644 --- a/Sources/buildSrc/src/main/java/Consts.kt +++ b/Sources/buildSrc/src/main/java/Consts.kt @@ -1,22 +1,21 @@ object ProjectConsts { const val COMPILE_SDK = 34 - const val KOTLIN_VERSION = "1.7.21" - const val KOTLIN_COROUTINES_VERSION = "1.6.4" + const val KOTLIN_VERSION = "1.9.0" + const val KOTLIN_COROUTINES_VERSION = "1.7.1" const val ANDROID_LINT_VERSION = "30.1.2" - const val ANDROID_GRADLE_PLUGIN_VERSION = "8.0.2" + const val ANDROID_GRADLE_PLUGIN_VERSION = "8.3.0" const val GMS_GRADLE_PLUGIN_VERSION = "4.3.14" } object SDKConsts { - const val VERSION = "1.21.1" - const val API_LEVEL = 70 + const val VERSION = "2.0.0" + const val API_LEVEL = 200 const val MESSAGING_API_LEVEL = 12 - const val MIN_SDK = 15 - const val TARGET_SDK = 34 + const val MIN_SDK = 21 const val R_PREFIX = "com_batchsdk_" const val NAMESPACE = "com.batch.android" const val TEST_NAMESPACE = "com.batch.android.test" @@ -28,14 +27,6 @@ object SDKConsts { // usually wants lower versions for compatibility. object DependenciesVersions { const val ANDROIDX = "1.0.0" - const val PLAY_SERVICES = "11.8.0" - } -} - -object SampleConsts { - object DependenciesVersions { - const val ANDROIDX = "1.1.0" - const val PLAY_SERVICES = "16.0.0" } } diff --git a/Sources/gradle.properties b/Sources/gradle.properties index 8e57b60..14cc6be 100644 --- a/Sources/gradle.properties +++ b/Sources/gradle.properties @@ -17,6 +17,6 @@ org.gradle.jvmargs=-Xmx4096m -Dfile.encoding=UTF-8 org.gradle.caching=true org.gradle.configureondemand=false android.useAndroidX=true -android.enableJetifier=true +android.enableJetifier=false gnsp.disableApplyOnlyOnRootProjectEnforcement=true kotlin.stdlib.default.dependency=false diff --git a/Sources/gradle/wrapper/gradle-wrapper.properties b/Sources/gradle/wrapper/gradle-wrapper.properties index 1ccbcb8..70ed048 100644 --- a/Sources/gradle/wrapper/gradle-wrapper.properties +++ b/Sources/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Jul 12 10:10:59 CEST 2023 +#Tue Apr 16 15:13:35 CEST 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/Sources/sdk-stubs/build.gradle.kts b/Sources/sdk-stubs/build.gradle.kts index c51c4f8..1a07c08 100644 --- a/Sources/sdk-stubs/build.gradle.kts +++ b/Sources/sdk-stubs/build.gradle.kts @@ -9,7 +9,6 @@ android { defaultConfig { minSdk = SDKConsts.MIN_SDK - targetSdk = SDKConsts.TARGET_SDK } buildTypes { diff --git a/Sources/sdk/build.gradle.kts b/Sources/sdk/build.gradle.kts index a6015cd..deec597 100644 --- a/Sources/sdk/build.gradle.kts +++ b/Sources/sdk/build.gradle.kts @@ -1,12 +1,11 @@ import org.gradle.api.tasks.testing.logging.TestLogEvent -import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.archivesName plugins { id("com.android.library") id("org.jetbrains.kotlin.android") } -// Required for Groovy compatiblity, which cannot use Consts.kt +// Required for Groovy compatibility, which cannot use Consts.kt ext { set("mavenGroupId", SDKConsts.MAVEN_GROUP_ID) set("mavenArtifact", SDKConsts.MAVEN_ARTIFACT) @@ -26,7 +25,6 @@ android { defaultConfig { minSdk = SDKConsts.MIN_SDK - targetSdk = SDKConsts.TARGET_SDK buildConfigField("String", "SDK_VERSION", "\"${SDKConsts.VERSION}\"") buildConfigField("Integer", "API_LEVEL", "${SDKConsts.API_LEVEL}") @@ -71,7 +69,6 @@ android { } testOptions { - execution = "ANDROIDX_TEST_ORCHESTRATOR" unitTests { isReturnDefaultValues = true isIncludeAndroidResources = true @@ -116,29 +113,24 @@ tasks.register("printVersion") { } dependencies { + val androidXLibraryVersion = SDKConsts.DependenciesVersions.ANDROIDX - val playServicesVersion = SDKConsts.DependenciesVersions.PLAY_SERVICES - val kotlinVersion = ProjectConsts.KOTLIN_VERSION val kotlinCoroutinesVersion = ProjectConsts.KOTLIN_COROUTINES_VERSION - compileOnly("com.google.android.gms:play-services-gcm:${playServicesVersion}") - compileOnly("com.google.android.gms:play-services-location:${playServicesVersion}") - compileOnly("com.google.android.gms:play-services-nearby:${playServicesVersion}") - compileOnly("com.google.android.play:review:2.0.1") - compileOnly("com.google.firebase:firebase-iid:21.1.0") - compileOnly("com.google.firebase:firebase-messaging:22.0.0") + api("androidx.core:core:${androidXLibraryVersion}") + compileOnly(project(":sdk-stubs")) compileOnly(project(":sdk-processor")) annotationProcessor(project(":sdk-processor")) lintChecks(project(":sdk-lint")) - api("androidx.core:core:${androidXLibraryVersion}") - compileOnly("androidx.appcompat:appcompat:${androidXLibraryVersion}") + compileOnly("com.google.android.play:review:2.0.1") + compileOnly("com.google.firebase:firebase-messaging:22.0.0") compileOnly("com.google.android.material:material:${androidXLibraryVersion}") + compileOnly("androidx.appcompat:appcompat:${androidXLibraryVersion}") compileOnly("androidx.dynamicanimation:dynamicanimation:$androidXLibraryVersion") androidTestImplementation("junit:junit:4.13.2") - androidTestImplementation("androidx.annotation:annotation:${androidXLibraryVersion}") androidTestImplementation("androidx.test:core-ktx:1.5.0") androidTestImplementation("androidx.test:rules:1.5.0") androidTestImplementation("androidx.test:runner:1.5.2") @@ -146,12 +138,9 @@ dependencies { androidTestImplementation("androidx.test.espresso:espresso-intents:3.5.1") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") androidTestImplementation("androidx.test.ext:truth:1.5.0") - - androidTestImplementation("com.google.android.gms:play-services-gcm:${playServicesVersion}") - androidTestImplementation("com.google.android.gms:play-services-location:${playServicesVersion}") - androidTestImplementation("com.google.android.gms:play-services-nearby:${playServicesVersion}") androidTestImplementation("com.google.firebase:firebase-core:17.4.3") androidTestImplementation("androidx.appcompat:appcompat:${androidXLibraryVersion}") + androidTestImplementation("androidx.annotation:annotation:${androidXLibraryVersion}") testImplementation("junit:junit:4.13.2") testImplementation("org.mockito:mockito-core:5.4.0") @@ -162,9 +151,6 @@ dependencies { testImplementation("androidx.test.espresso:espresso-intents:3.5.1") testImplementation("androidx.test.espresso:espresso-core:3.5.1") testImplementation("androidx.test.ext:truth:1.5.0") - testImplementation("com.google.android.gms:play-services-gcm:${playServicesVersion}") - testImplementation("com.google.android.gms:play-services-location:${playServicesVersion}") - testImplementation("com.google.android.gms:play-services-nearby:${playServicesVersion}") testImplementation("androidx.appcompat:appcompat:${androidXLibraryVersion}") testImplementation("org.robolectric:robolectric:4.9.2") diff --git a/Sources/sdk/jacoco.gradle b/Sources/sdk/jacoco.gradle index ad26373..1ecf085 100644 --- a/Sources/sdk/jacoco.gradle +++ b/Sources/sdk/jacoco.gradle @@ -41,7 +41,7 @@ task testDebugCoverageUnitTest(dependsOn: ['instrument', 'testDebugUnitTest']) { structure(name: 'TestCoverage') { classfiles { fileset( - dir: "$buildDir/intermediates/javac/debug/classes", + dir: "$buildDir/intermediates/javac/debug/compileDebugJavaWithJavac/classes", excludes: '**/R.class,**/R$*.class,**/BuildConfig.*' ) } @@ -81,7 +81,7 @@ task instrument(dependsOn: 'compileDebugUnitTestSources') { classpath: configurations.jacocoAnt.asPath) ant.instrument(destdir: offline_instrumented_outputDir) { - fileset(dir: "$buildDir.path/intermediates/javac/debug/classes") + fileset(dir: "$buildDir.path/intermediates/javac/debug/compileDebugJavaWithJavac/classes") } } } diff --git a/Sources/sdk/proguard-sdk-release.txt b/Sources/sdk/proguard-sdk-release.txt index 8bb9574..2c7b6d9 100644 --- a/Sources/sdk/proguard-sdk-release.txt +++ b/Sources/sdk/proguard-sdk-release.txt @@ -20,12 +20,8 @@ public *; } --keepnames class com.batch.android.BatchPushReceiver - -keepnames class com.batch.android.BatchPushService --keepnames class com.batch.android.BatchPushInstanceIDService - -keep class com.batch.android.msgpack.core.buffer.MessageBuffer {} -keep class com.google.android.gms.common.GooglePlayServicesUtil { diff --git a/Sources/sdk/src/androidTest/java/com/batch/android/TestApplication.java b/Sources/sdk/src/androidTest/java/com/batch/android/TestApplication.java index 485b8b6..7e1bc21 100644 --- a/Sources/sdk/src/androidTest/java/com/batch/android/TestApplication.java +++ b/Sources/sdk/src/androidTest/java/com/batch/android/TestApplication.java @@ -9,6 +9,6 @@ public class TestApplication extends Application { public void onCreate() { super.onCreate(); FirebaseApp.initializeApp(this); - Batch.setConfig(new com.batch.android.Config("FAKE_API_KEY")); + Batch.start("FAKE_API_KEY"); } } diff --git a/Sources/sdk/src/androidTest/java/com/batch/android/core/GooglePlayServicesHelperTest.java b/Sources/sdk/src/androidTest/java/com/batch/android/core/GooglePlayServicesHelperTest.java index c36d9ca..ba4442d 100644 --- a/Sources/sdk/src/androidTest/java/com/batch/android/core/GooglePlayServicesHelperTest.java +++ b/Sources/sdk/src/androidTest/java/com/batch/android/core/GooglePlayServicesHelperTest.java @@ -9,7 +9,6 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import com.google.android.gms.common.ConnectionResult; -import java.util.concurrent.CountDownLatch; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -23,7 +22,6 @@ public class GooglePlayServicesHelperTest { private Context appContext; - private CountDownLatch latch; @Before public void setUp() { @@ -33,11 +31,10 @@ public void setUp() { /** * Test the version get * - * @throws Exception */ @Test - public void testGetLibVersion() throws Exception { - Integer version = GooglePlayServicesHelper.getGooglePlayServicesLibVersion(appContext); + public void testGetLibVersion() { + Integer version = GooglePlayServicesHelper.getGooglePlayServicesLibVersion(); assertNotNull(version); assertTrue(version >= 4030500); @@ -46,24 +43,21 @@ public void testGetLibVersion() throws Exception { /** * Test the availability get * - * @throws Exception */ @Test - public void testGetLibAvailability() throws Exception { + public void testGetLibAvailability() { Integer availability = GooglePlayServicesHelper.getGooglePlayServicesAvailabilityInteger(appContext); - assertNotNull(availability); - assertTrue(availability == 0); - assertTrue("SUCCESS".equals(GooglePlayServicesHelper.getGooglePlayServicesAvailabilityString(availability))); + assertEquals(0, (int) availability); + assertEquals("SUCCESS", GooglePlayServicesHelper.getGooglePlayServicesAvailabilityString(availability)); } /** - * Test the google environnement availability response + * Test the google environment availability response * - * @throws Exception */ @Test - public void testCheckGoogleServicesAvailability() throws Exception { + public void testCheckGoogleServicesAvailability() { final Integer playServicesAvailability = GooglePlayServicesHelper.getGooglePlayServicesAvailabilityInteger( appContext ); diff --git a/Sources/sdk/src/main/java/com/batch/android/AdsIdentifierProvider.java b/Sources/sdk/src/main/java/com/batch/android/AdsIdentifierProvider.java deleted file mode 100644 index c6ff142..0000000 --- a/Sources/sdk/src/main/java/com/batch/android/AdsIdentifierProvider.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.batch.android; - -import com.batch.android.annotation.PublicSDK; - -/** - * @deprecated Batch doesn't collects the Android Advertising Identifier anymore. - */ -@PublicSDK -@Deprecated -public interface AdsIdentifierProvider { - /** - * Is this provider available to use? This is the place to check if the libraries are here at - * runtime and if the user enabled/disabled your provider. - *

- * If not available, you should throw a {@link AdsIdentifierProviderAvailabilityException} with - * the human-readable error message. - */ - void checkAvailability() throws AdsIdentifierProviderAvailabilityException; - - /** - * Retrieve the advertising id value and the opt-out state asynchronously - * - * @param listener - */ - void getAdsIdentifier(AdsIdentifierListener listener); - - /** - * Interface used to callback from - * @deprecated Batch doesn't collects the Android Advertising Identifier anymore. - */ - @PublicSDK - @Deprecated - interface AdsIdentifierListener { - /** - * Called on success with the id & if the user selected to opt-out from ads - * - * @param id - * @param limited - */ - void onSuccess(String id, boolean limited); - - /** - * Called on error - * - * @param e - */ - void onError(Exception e); - } -} diff --git a/Sources/sdk/src/main/java/com/batch/android/AdsIdentifierProviderAvailabilityException.java b/Sources/sdk/src/main/java/com/batch/android/AdsIdentifierProviderAvailabilityException.java deleted file mode 100644 index 001c585..0000000 --- a/Sources/sdk/src/main/java/com/batch/android/AdsIdentifierProviderAvailabilityException.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.batch.android; - -import com.batch.android.annotation.PublicSDK; - -/** - * - * @deprecated Batch doesn't collects the Android Advertising Identifier anymore. - */ -@PublicSDK -@Deprecated -public class AdsIdentifierProviderAvailabilityException extends Exception { - - public AdsIdentifierProviderAvailabilityException(String message) { - super(message); - } -} diff --git a/Sources/sdk/src/main/java/com/batch/android/AdvertisingID.java b/Sources/sdk/src/main/java/com/batch/android/AdvertisingID.java deleted file mode 100644 index 99ede2f..0000000 --- a/Sources/sdk/src/main/java/com/batch/android/AdvertisingID.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.batch.android; - -import android.content.Context; -import androidx.annotation.Nullable; -import com.batch.android.processor.Module; -import com.batch.android.processor.Singleton; - -/** - * Object that encapsulate advertising ID - * - * @deprecated Batch doesn't collects the Android Advertising Identifier anymore. - * @hide - */ -@Module -@Singleton -@Deprecated -public final class AdvertisingID { - - public AdvertisingID() {} - - /** - * Tell if the process to retrieve advertising ID is already complete - * - * @return This method always return false. - * @deprecated Batch doesn't support advertising id anymore. - */ - @Deprecated - public boolean isReady() { - return false; - } - - /** - * Get the advertising ID - * - * @return This method always return null. - * @throws IllegalStateException Cannot throw - * @deprecated Batch doesn't support advertising id anymore. - */ - @Deprecated - @Nullable - public String get() throws IllegalStateException { - return null; - } - - /** - * Is the use of the advertising ID limited - * - * @return This method always return false. - * @throws IllegalStateException Cannot throw - * @deprecated Batch doesn't support advertising id anymore. - */ - @Deprecated - public boolean isLimited() throws IllegalStateException { - return false; - } - - /** - * Is the advertising ID not null - * - * @return This method always return false. - * @deprecated Batch doesn't support advertising id anymore. - */ - @Deprecated - public boolean isNotNull() { - return false; - } -} diff --git a/Sources/sdk/src/main/java/com/batch/android/AttributesCheckWebservice.java b/Sources/sdk/src/main/java/com/batch/android/AttributesCheckWebservice.java index 3877a74..c6551b9 100644 --- a/Sources/sdk/src/main/java/com/batch/android/AttributesCheckWebservice.java +++ b/Sources/sdk/src/main/java/com/batch/android/AttributesCheckWebservice.java @@ -81,7 +81,6 @@ protected List getQueries() { public void run() { try { Logger.internal(TAG, "Attributes check webservice started"); - webserviceMetrics.onWebserviceStarted(this); /* * Read response @@ -89,10 +88,8 @@ public void run() { JSONObject response = null; try { response = getStandardResponseBodyIfValid(); - webserviceMetrics.onWebserviceFinished(this, true); } catch (WebserviceError error) { Logger.internal(TAG, error.getReason().toString(), error.getCause()); - webserviceMetrics.onWebserviceFinished(this, false); switch (error.getReason()) { case NETWORK_ERROR: diff --git a/Sources/sdk/src/main/java/com/batch/android/AttributesSendWebservice.java b/Sources/sdk/src/main/java/com/batch/android/AttributesSendWebservice.java index afd7af4..92b2ce7 100644 --- a/Sources/sdk/src/main/java/com/batch/android/AttributesSendWebservice.java +++ b/Sources/sdk/src/main/java/com/batch/android/AttributesSendWebservice.java @@ -93,18 +93,14 @@ protected List getQueries() { public void run() { try { Logger.internal(TAG, "Attributes send webservice started"); - webserviceMetrics.onWebserviceStarted(this); - /* * Read response */ JSONObject response = null; try { response = getStandardResponseBodyIfValid(); - webserviceMetrics.onWebserviceFinished(this, true); } catch (WebserviceError error) { Logger.internal(error.getReason().toString(), error.getCause()); - webserviceMetrics.onWebserviceFinished(this, false); switch (error.getReason()) { case NETWORK_ERROR: diff --git a/Sources/sdk/src/main/java/com/batch/android/Batch.java b/Sources/sdk/src/main/java/com/batch/android/Batch.java index 00f8dd8..fee9608 100644 --- a/Sources/sdk/src/main/java/com/batch/android/Batch.java +++ b/Sources/sdk/src/main/java/com/batch/android/Batch.java @@ -1,6 +1,5 @@ package com.batch.android; -import android.annotation.SuppressLint; import android.app.Activity; import android.app.Application; import android.app.PendingIntent; @@ -38,12 +37,14 @@ import com.batch.android.di.providers.ActionModuleProvider; import com.batch.android.di.providers.BatchModuleMasterProvider; import com.batch.android.di.providers.BatchNotificationChannelsManagerProvider; +import com.batch.android.di.providers.DataCollectionModuleProvider; import com.batch.android.di.providers.EventDispatcherModuleProvider; import com.batch.android.di.providers.InboxFetcherInternalProvider; import com.batch.android.di.providers.LocalBroadcastManagerProvider; import com.batch.android.di.providers.MessagingModuleProvider; import com.batch.android.di.providers.OptOutModuleProvider; import com.batch.android.di.providers.ParametersProvider; +import com.batch.android.di.providers.ProfileModuleProvider; import com.batch.android.di.providers.PushModuleProvider; import com.batch.android.di.providers.RuntimeManagerProvider; import com.batch.android.di.providers.TaskExecutorProvider; @@ -56,10 +57,9 @@ import com.batch.android.module.BatchModule; import com.batch.android.module.OptOutModule; import com.batch.android.module.PushModule; -import com.batch.android.module.UserModule; -import com.batch.android.push.Registration; import com.batch.android.runtime.RuntimeManager; import com.batch.android.runtime.State; +import com.batch.android.user.InstallDataEditor; import com.google.firebase.messaging.RemoteMessage; import java.util.ArrayList; import java.util.Date; @@ -68,30 +68,20 @@ import java.util.Locale; import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicReference; /** * Entry point of the Batch library */ @PublicSDK +@SuppressWarnings({ "unused" }) public final class Batch { - /** - * Batch API key - */ - private static Config config; - /** * Install object build on Batch start */ + @Nullable private static Install install; - /** - * User object build on Batch start - */ - @SuppressLint("StaticFieldLeak") - private static com.batch.android.User user; - /** * Broadcast receiver of Batch */ @@ -100,25 +90,24 @@ public final class Batch { * Temp intent stored to be handled at the next start */ private static Intent newIntent; + /** * Helper to handle excluded activities from manifest */ + @NonNull private static final ExcludedActivityHelper excludedActivityHelper = new ExcludedActivityHelper(); /** * Current session ID (changed at each start) */ + @Nullable private static String sessionID; + /** * Was the user already warned about being opted-out and attempting a start */ private static boolean didLogOptOutWarning = false; - /** - * Default placement - */ - public static final String DEFAULT_PLACEMENT = "DEFAULT"; - /** * Notification tag. *

@@ -163,180 +152,86 @@ public final class Batch { */ public static final String EXTRA_REGISTRATION_SENDER_ID = "sender_id"; - // ----------------------------------------------------> - - private static BatchModule moduleMaster; + /** + * One module to rule them all + */ + @NonNull + private static final BatchModule moduleMaster; static { moduleMaster = BatchModuleMasterProvider.get(); } - // ----------------------------------------------------> - private Batch() {} /** - * Return the api key
- * If you call this method before calling setConfig, it will return null - * - * @return API key if available, null otherwise - */ - public static String getAPIKey() { - final StringBuilder apikey = new StringBuilder(); - RuntimeManagerProvider - .get() - .run(state -> { - if (config != null) { - apikey.append(config.apikey); - } - }); - - if (apikey.length() > 0) { - return apikey.toString(); - } - - return null; - } - - /** - * Get the current user profile.
- * You should use this method if you want to modify user language/region or provide a custom ID to identify this user (like an account).
- *
- * Be carefull : Do not use it if you don't know what you are doing, - * giving a bad custom user ID can result in failure into offer delivery and restore
- *
- * You must call this method after {@link #onStart(Activity)} otherwise it will return null - * - * @return instance of BatchUser to set properties, null if you call it before onStart. - * @deprecated Please use Batch.User methods instead - */ - @Deprecated - public static BatchUserProfile getUserProfile() { - try { - Context context = RuntimeManagerProvider.get().getContext(); - if (context != null) { - return new BatchUserProfile(context); - } - } catch (Exception e) { - Logger.error(UserModule.TAG, "Error while retrieving BatchUser", e); - } - - Logger.warning(UserModule.TAG, "Call to getUserProfile() made before onStart or after onStop. Returns null"); - - return null; - } - - /** - * Set the configuration of Batch.
+ * Set the API Key of Batch.
*
* You should call this method before any other, only one time.
- * Typically on the onCreate of your MainActivity. + * Typically on the onCreate of your Application class. * - * @param config - */ - public static void setConfig(final Config config) { - RuntimeManagerProvider - .get() - .changeState(state -> { - if (state != State.OFF) { - Logger.error("You cannot update Batch's Configuration after Batch.onStart() has been called."); - return null; - } - - Batch.config = config; - - Logger.loggerDelegate = config.loggerDelegate; - - return state; - }); - } - - /** - * Can Batch use Advertising ID - *

- * Batch doesn't collects Android Advertising Identifier anymore. - * @deprecated This method does nothing, please stop using it - * and see {@link BatchUserDataEditor#setAttributionIdentifier(String) - * @return Always return false. + * @param apiKey Your Batch API Key */ - @Deprecated - public static boolean shouldUseAdvertisingID() { - return false; + public static void start(@NonNull final String apiKey) { + RuntimeManagerProvider.get().updateConfig(config -> config.setApikey(apiKey)); } /** - * Can Batch use advanced device information + * Set data migrations you want to disable. * - * @return + * @param migrations EnumSet of Migrations to disable. See {@link BatchMigration} */ - public static boolean shouldUseAdvancedDeviceInformation() { - final AtomicBoolean shouldUse = new AtomicBoolean(true); - RuntimeManagerProvider - .get() - .run(state -> { - if (config != null) { - shouldUse.set(config.shouldUseAdvancedDeviceInformation); - } - }); - - return shouldUse.get(); + public static void disableMigration(@NonNull EnumSet migrations) { + //noinspection ConstantConditions + if (migrations == null) { + Logger.error("You cannot use disableMigration with null value."); + return; + } + RuntimeManagerProvider.get().updateConfig(config -> config.setMigrations(BatchMigration.toValue(migrations))); } /** - * Can Batch use the PlayServices Instance ID API (if available), or fallback to classic GCM. + * Set if Batch should send its logs to an object of yours (default = null)
+ *
+ * Be careful with your implementation: setting this can impact stability and performance
+ * You should only use it if you know what you are doing. * - * @return - * @deprecated Please migrate to FCM + * @param delegate An object implementing {@link LoggerDelegate} */ - @Deprecated - public static boolean shouldUseGoogleInstanceID() { - final AtomicBoolean shouldUse = new AtomicBoolean(true); - RuntimeManagerProvider - .get() - .run(state -> { - if (config != null) { - shouldUse.set(config.shouldUseGoogleInstanceID); - } - }); - - return shouldUse.get(); + public static void setLoggerDelegate(@Nullable LoggerDelegate delegate) { + RuntimeManagerProvider.get().updateConfig(config -> config.setLoggerDelegate(delegate)); } /** - * Should Batch automatically register to push notificaitons - * This method is not supported anymore: Batch will always register for push. + * Set the log level that Batch should use * - * @return Always true - * @deprecated Please remove this call, as it doesn't do anything anymore + * @param level The level of the logger to use */ - @Deprecated - public static boolean shouldAutoRegisterForPush() { - return true; + public static void setLoggerLevel(@NonNull LoggerLevel level) { + //noinspection ConstantConditions + if (level == null) { + Logger.error("You cannot setLoggerLevel with null value"); + return; + } + RuntimeManagerProvider.get().updateConfig(config -> config.setLoggerLevel(level)); } /** - * Get the current logger level + * Configure the SDK Automatic Data Collection. * - * @return + * @param editor A callback which will be called with an instance of the data collection config. + * Once your callback ends, Batch will persist the changes. */ - public static LoggerLevel getLoggerLevel() { - final AtomicReference levelToUse = new AtomicReference<>(LoggerLevel.ERROR); - RuntimeManagerProvider - .get() - .run(state -> { - if (config != null) { - levelToUse.set(config.loggerLevel); - } - }); - - return levelToUse.get(); + public static void updateAutomaticDataCollection(BatchDataCollectionConfig.Editor editor) { + DataCollectionModuleProvider.get().updateDataCollectionConfig(editor); } /** - * Get the id of the current session, random uuid used internaly by Batch to identify the app session. + * Get the id of the current session, random uuid used internally by Batch to identify the app session. * * @return session id if any, null otherwise */ + @Nullable public static String getSessionID() { final StringBuilder sessionID = new StringBuilder(); @@ -355,22 +250,6 @@ public static String getSessionID() { return null; } - /** - * Check if Batch is running in dev mode
- * NB : if you call this method before {@link Batch#setConfig(Config)}, you'll always have the default value : false - * - * @return true if Batch is running in dev mode, false if not - * @deprecated This method is not needed, since all DEV API Keys start with "DEV". - */ - @Deprecated - public static boolean isRunningInDevMode() { - final String apiKey = Batch.getAPIKey(); - if (apiKey != null) { - return apiKey.toLowerCase(Locale.US).startsWith("dev"); - } - return false; - } - /** * Copy Batch's internal data from an intent to another. * This is useful if you've got an activity that will not get a chance to start Batch before closing itself, @@ -417,9 +296,9 @@ public static String getBroadcastPermissionName(@NonNull Context context) { * - Prevent {@link Batch#onStart(Activity)} or {@link Batch#onServiceCreate(Context, boolean)} from doing anything at all * - Disable any network capability from the SDK * - Disable all In-App campaigns - * - Make the Inbox module return an error immediatly when used - * - Make the SDK reject any BatchUserProfile or {@link BatchUserDataEditor#save()} calls - * - Make the SDK reject calls to {@link Batch.User#trackEvent(String)}, {@link Batch.User#trackTransaction(double)}, {@link Batch.User#trackLocation(Location)} and any related methods + * - Make the Inbox module return an error immediately when used + * - Make the SDK reject any BatchUserProfile or {@link BatchProfileAttributeEditor#save()} calls + * - Make the SDK reject calls to {@link Batch.Profile#trackEvent(String)}, {@link Batch.Profile#trackLocation(Location)} and any related methods *

* Even if you opt in afterwards, data that has been generated while opted out WILL be lost. *

@@ -567,7 +446,7 @@ private Debug() {} *

* Warning: This method might expose critical data. * - * @param context + * @param context Android's context */ public static void startDebugActivity(@NonNull Context context) { Intent intent = new Intent(context, BatchDebugActivity.class); @@ -594,6 +473,7 @@ private Inbox() {} */ @NonNull public static BatchInboxFetcher getFetcher(@NonNull Context context) { + //noinspection ConstantConditions if (context == null) { throw new IllegalArgumentException("Context cannot be null"); } @@ -616,26 +496,12 @@ public static BatchInboxFetcher getFetcher( @NonNull String userIdentifier, @NonNull String authenticationKey ) { + //noinspection ConstantConditions if (context == null) { throw new IllegalArgumentException("Context cannot be null"); } return new BatchInboxFetcher(InboxFetcherInternalProvider.get(context, userIdentifier, authenticationKey)); } - - /** - * Get an inbox fetcher for the specified user identifier. - * Batch must be started for all of the fetcher's features to work, but you can call this method before starting Batch (such as in your activity's onCreate) - * - * @param userIdentifier User identifier for which you want the notifications - * @param authenticationKey Secret authentication key: it should be computed your backend and given to this method - * @return an instance of BatchInboxFetcher with the wanted configuration - * @deprecated Use getFetcher(Context,String,String), which is more reliable - */ - @Deprecated - @NonNull - public static BatchInboxFetcher getFetcher(@NonNull String userIdentifier, @NonNull String authenticationKey) { - return new BatchInboxFetcher(InboxFetcherInternalProvider.get(null, userIdentifier, authenticationKey)); - } } // ----------------------------------------------------> @@ -667,17 +533,6 @@ private Push() {} // ------------------------------------------------> - /** - * Set the FCM/GCM Sender Id. You can find more info on how to create it in our documentation. - * - * @param gcmSenderId Google API sender ID (for example: 670330094152) - * @deprecated Please migrate to FCM: https://batch.com/doc/android/advanced/fcm-migration.html - */ - @Deprecated - public static void setGCMSenderId(String gcmSenderId) { - PushModuleProvider.get().setGCMSenderId(gcmSenderId); - } - /** * Set a custom small icon resource that push notifications will use.
* @@ -713,6 +568,7 @@ public static void setLargeIcon(Bitmap largeIcon) { * Get the channels manager, allowing you to tweak how notifications will behave regarding * the channels feature introduced in Android 8.0 (API 26) */ + @NonNull public static BatchNotificationChannelsManager getChannelsManager() { return BatchNotificationChannelsManagerProvider.get(); } @@ -736,6 +592,7 @@ public static void dismissNotifications() { * * @return Type of notifications you previously set. Be careful, as this can be null if you never used setNotificationsType() or if your context is invalid */ + @Nullable public static EnumSet getNotificationsType(Context context) { return PushModuleProvider.get().getNotificationsType(context); } @@ -760,7 +617,7 @@ public static void setNotificationsType(EnumSet types) { * call this method before doing anything else into the {@link BroadcastReceiver#onReceive(Context, Intent)} method. * If it returns true, you should not handle the push. * - * @param intent + * @param intent Android's intent that hold the push * @return true if the push is for Batch and you shouldn't handle it, false otherwise */ public static boolean isBatchPush(Intent intent) { @@ -800,7 +657,7 @@ public static boolean isManualDisplayModeActivated() { * Set manual display mode for push notifications.
* If you set manual display mode to true, no notifications will be shown automatically and you'll have to display it by yourself. * - * @param manualDisplay + * @param manualDisplay Whether manual display mode is enabled or not. */ public static void setManualDisplay(boolean manualDisplay) { PushModuleProvider.get().setManualDisplay(manualDisplay); @@ -853,6 +710,7 @@ public static void appendBatchData(@NonNull RemoteMessage remoteMessage, @NonNul * @return A PendingIntent instance, wrapping the given Intent. */ @NonNull + @SuppressWarnings("ConstantConditions") public static PendingIntent makePendingIntent( @NonNull Context context, @NonNull Intent intent, @@ -887,6 +745,7 @@ public static PendingIntent makePendingIntent( * @return A PendingIntent instance, wrapping the given Intent. */ @NonNull + @SuppressWarnings("ConstantConditions") public static PendingIntent makePendingIntent( @NonNull Context context, @NonNull Intent intent, @@ -919,6 +778,7 @@ public static PendingIntent makePendingIntent( * @return A PendingIntent set to open Batch's builtin action activity to open the specified deeplink. Can be null if the deeplink is not valid. */ @Nullable + @SuppressWarnings("ConstantConditions") public static PendingIntent makePendingIntentForDeeplink( @NonNull Context context, @NonNull String deeplink, @@ -951,6 +811,7 @@ public static PendingIntent makePendingIntentForDeeplink( * @return A PendingIntent set to open Batch's builtin action activity to open the specified deeplink. Can be null if the deeplink is not valid. */ @Nullable + @SuppressWarnings("ConstantConditions") public static PendingIntent makePendingIntentForDeeplink( @NonNull Context context, @NonNull String deeplink, @@ -985,7 +846,7 @@ public static boolean shouldDisplayPush(Context context, Intent intent) { * Should the developer handle and display this push, or will Batch display it? * Use this method to know if Batch will ignore this push, and that displaying it is your responsibility * - * @param context + * @param context Android's context * @param remoteMessage The Firebase message * @return true if the push will not be processed by Batch and should be handled, false otherwise */ @@ -996,8 +857,8 @@ public static boolean shouldDisplayPush(Context context, RemoteMessage remoteMes /** * Call this method to display the notification for this intent. * - * @param context - * @param intent + * @param context Android's context + * @param intent Android's intent */ public static void displayNotification(Context context, Intent intent) { PushModuleProvider.get().displayNotification(context, intent, null, false); @@ -1006,8 +867,8 @@ public static void displayNotification(Context context, Intent intent) { /** * Call this method to display the notification for this intent. * - * @param context - * @param intent + * @param context Android's context + * @param intent Android's intent * @param bypassManualMode If true, This method will ignore the manual mode value and always display the notification */ public static void displayNotification(Context context, Intent intent, boolean bypassManualMode) { @@ -1018,8 +879,8 @@ public static void displayNotification(Context context, Intent intent, boolean b * Call this method to display the notification for this intent. * Allows an interceptor to be set for this call, overriding the global one set using {@link Batch.Push#setNotificationInterceptor(BatchNotificationInterceptor)} * - * @param context - * @param intent + * @param context Android's context + * @param intent Android's intent */ public static void displayNotification( @NonNull Context context, @@ -1033,9 +894,9 @@ public static void displayNotification( * Call this method to display the notification for this intent. * Allows an interceptor to be set for this call, overriding the global one set using {@link Batch.Push#setNotificationInterceptor(BatchNotificationInterceptor)} * - * @param context - * @param intent - * @param interceptor + * @param context Android's context + * @param intent Android's intent + * @param interceptor An optional notification interceptor * @param bypassManualMode If true, This method will ignore the manual mode value and always display the notification */ public static void displayNotification( @@ -1079,7 +940,7 @@ public static void setAdditionalIntentFlags(Integer flags) { /** * Call this method when you just displayed a Batch push notification by yourself. * - * @param context + * @param context Android's context * @param intent the gcm push intent */ public static void onNotificationDisplayed(Context context, Intent intent) { @@ -1089,7 +950,7 @@ public static void onNotificationDisplayed(Context context, Intent intent) { /** * Call this method when you just displayed a Batch push notification by yourself. * - * @param context + * @param context Android's context * @param remoteMessage The Firebase message */ public static void onNotificationDisplayed(Context context, RemoteMessage remoteMessage) { @@ -1097,16 +958,18 @@ public static void onNotificationDisplayed(Context context, RemoteMessage remote } /** - * Get the last known push token. - * The returned token might be outdated and invalid if this method is called + * Get the current push registration. + *

+ * The returned registration might be outdated and invalid if this method is called * too early in your application lifecycle. *

* Batch MUST be started in order to use this method. * - * @return A push token, null if unavailable. + * @return A push registration, null if unavailable. */ - public static String getLastKnownPushToken() { - return PushModuleProvider.get().getRegistrationID(); + @Nullable + public static BatchPushRegistration getRegistration() { + return PushModuleProvider.get().getRegistration(); } /** @@ -1128,13 +991,34 @@ public static void refreshRegistration() { /** * Request the notification runtime permission. + *

* Android 13 (API 33) introduced a new runtime permission for notifications called POST_NOTIFICATIONS. * Without this permission, apps on Android 13 cannot show notifications. - * This method does nothing on Android 12 and lower, or if your application does not target API 33 or higher. + *

+ * Note: This method does nothing on Android 12 and lower, or if your application does not target API 33 or higher. + *

* @param context requesting the permission */ public static void requestNotificationPermission(@NonNull Context context) { - PushModuleProvider.get().requestNotificationPermission(context); + PushModuleProvider.get().requestNotificationPermission(context, null); + } + + /** + * Request the notification runtime permission. + *

+ * Android 13 (API 33) introduced a new runtime permission for notifications called POST_NOTIFICATIONS. + * Without this permission, apps on Android 13 cannot show notifications. + *

+ * Note: This method does nothing on Android 12 and lower, or if your application does not target API 33 or higher. + *

+ * @param context requesting the permission + * @param listener Callback notifying whether the permission has been granted or not. Note that the permission will be considered as granted on Android 12 and lower. Listener will not be triggered if your application does not target API 33 or higher. + */ + public static void requestNotificationPermission( + @NonNull Context context, + @Nullable BatchPermissionListener listener + ) { + PushModuleProvider.get().requestNotificationPermission(context, listener); } } @@ -1152,7 +1036,7 @@ private EventDispatcher() {} * Add an event dispatcher. * The Batch SDK must be opt-in for the dispatcher to receive events. * - * @param dispatcher + * @param dispatcher The Batch Event Dispatcher to add */ public static void addDispatcher(BatchEventDispatcher dispatcher) { EventDispatcherModuleProvider.get().addEventDispatcher(dispatcher); @@ -1161,7 +1045,7 @@ public static void addDispatcher(BatchEventDispatcher dispatcher) { /** * Remove an event dispatcher. * - * @param dispatcher + * @param dispatcher The Batch Event Dispatcher to remove */ public static boolean removeDispatcher(BatchEventDispatcher dispatcher) { return EventDispatcherModuleProvider.get().removeEventDispatcher(dispatcher); @@ -1169,7 +1053,7 @@ public static boolean removeDispatcher(BatchEventDispatcher dispatcher) { /** * Represents the type of the dispatched event in {@link BatchEventDispatcher#dispatchEvent(Type, Payload)}. - * Declared under Batch.EventDispatcher to avoid ambiguity with {@link BatchEventData}. + * Declared under Batch.EventDispatcher to avoid ambiguity with {@link BatchEventAttributes}. */ @PublicSDK public enum Type { @@ -1194,7 +1078,7 @@ public boolean isMessagingEvent() { /** * Accessor to the payload of the dispatched event in {@link BatchEventDispatcher#dispatchEvent(Type, Payload)}. - * Declared under Batch.EventDispatcher to avoid ambiguity with {@link BatchEventData} and {@link BatchPushPayload}. + * Declared under Batch.EventDispatcher to avoid ambiguity with {@link BatchEventAttributes} and {@link BatchPushPayload}. */ @PublicSDK public interface Payload { @@ -1233,14 +1117,14 @@ public interface Payload { * - An Open for a push campaign * - A CTA click or Global tap containing a deeplink or a custom action for a messaging campaign * - * @return + * @return Whether it is a positive action or not */ boolean isPositiveAction(); /** * Get a value from a key within the custom payload associated with the event. * - * @param key + * @param key The key of the value to get * @return the corresponding value or null if none is set. */ @Nullable @@ -1293,71 +1177,50 @@ public static String getInstallationID() { /** * Read the language. * - * @return The custom language set with {@link BatchUserDataEditor}. Returns null by default. + * @return The custom language set with {@link InstallDataEditor}. Returns null by default. */ @Nullable public static String getLanguage(@NonNull Context context) { + //noinspection ConstantConditions if (context == null) { throw new IllegalArgumentException("Context cannot be null"); } - - return new com.batch.android.User(context).getLanguage(); + return UserModuleProvider.get().getLanguage(context); } /** * Read the region. * - * @return The custom region set with {@link BatchUserDataEditor}. Returns null by default. + * @return The custom region set with {@link InstallDataEditor}. Returns null by default. */ @Nullable public static String getRegion(@NonNull Context context) { + //noinspection ConstantConditions if (context == null) { throw new IllegalArgumentException("Context cannot be null"); } - - return new com.batch.android.User(context).getRegion(); + return UserModuleProvider.get().getRegion(context); } /** * Read the custom identifier. * - * @return The custom identifier set with {@link BatchUserDataEditor}. Returns null by default. + * @return The custom identifier set with {@link InstallDataEditor}. Returns null by default. */ @Nullable public static String getIdentifier(@NonNull Context context) { + //noinspection ConstantConditions if (context == null) { throw new IllegalArgumentException("Context cannot be null"); } - return new com.batch.android.User(context).getCustomID(); - } - - /** - * Get the user data editor. Batch must be started to save it. - * - * @return A BatchUserDataEditor instance. - * @deprecated Use {@link #editor()} - */ - @Deprecated - public static BatchUserDataEditor getEditor() { - return editor(); - } - - /** - * Get the user data editor. Batch must be started to save it. - * Note that you should chain calls to the returned editor. - * If you call this method again, you will get another editor that's not aware of changes made elsewhere that have not been saved. - * - * @return A BatchUserDataEditor instance. - */ - public static BatchUserDataEditor editor() { - return new BatchUserDataEditor(); + return UserModuleProvider.get().getCustomID(context); } /** * Read the saved attributes. Reading is asynchronous so as not to interfere with saving operations. * - * @param context + * @param context Android's context * @param listener Pass a listener to be notified of the fetch result. */ public static void fetchAttributes( @@ -1370,7 +1233,7 @@ public static void fetchAttributes( /** * Read the saved tag collections. Reading is asynchronous so as not to interfere with saving operations. * - * @param context + * @param context Android's context * @param listener Pass a listener to be notified of the fetch result. */ public static void fetchTagCollections( @@ -1381,24 +1244,43 @@ public static void fetchTagCollections( } /** - * Track an event. - * You can call this method from any thread. Batch must be started at some point, or events won't be sent to the server. + * Clear all tags and attributes set on an installation and their local cache returned by fetchAttributes and + * fetchTagCollections. This doesn't affect data set on profiles using Batch.Profile. + */ + public static void clearInstallationData() { + UserModuleProvider.get().clearInstallationData(); + } + } + + /** + * Batch Profile module + */ + @PublicSDK + public static final class Profile { + + private Profile() {} + + /** + * Identify the user's installation with an omnichannel profile. * - * @param event The event name. + * @param identifier the custom user identifier or null to erase */ - public static void trackEvent(@NonNull String event) { - trackEvent(event, null, (BatchEventData) null); + public static void identify(@Nullable String identifier) { + ProfileModuleProvider.get().identify(identifier); } /** - * Track an event. - * You can call this method from any thread. Batch must be started at some point, or events won't be sent to the server. + * Get a profile attribute editor. + *

+ * Batch must be started to save it. + * Note that you should chain calls to the returned editor. + * If you call this method again, you will get another editor that's not aware of changes made elsewhere that have not been saved. * - * @param event The event name. - * @param label The event label. Can be null. + * @return A BatchProfileAttributeEditor instance. */ - public static void trackEvent(@NonNull String event, String label) { - trackEvent(event, label, (BatchEventData) null); + @NonNull + public static BatchProfileAttributeEditor editor() { + return new BatchProfileAttributeEditor(); } /** @@ -1406,22 +1288,9 @@ public static void trackEvent(@NonNull String event, String label) { * You can call this method from any thread. Batch must be started at some point, or events won't be sent to the server. * * @param event The event name. - * @param label The event label. Can be null. - * @param data The event data. Can be null. - * @deprecated See {@link Batch.User#trackEvent(String, String, BatchEventData)}. Data sent using this method might be truncated if it can't be converted to a {@link BatchEventData} instance. - */ - @Deprecated - public static void trackEvent(@NonNull String event, String label, JSONObject data) { - BatchEventData convertedData = null; - if (data != null) { - Logger.info( - UserModule.TAG, - "Tracking events with the legacy data format has been deprecated. The event will be tracked, but some data may be truncated: please migrate to Batch.User.trackEvent(String, String, BatchEventData)" - ); - convertedData = new BatchEventData(data); - } - // Do not call trackPublicEvent with the JSON data directly: it needs conversion. - trackEvent(event, label, convertedData); + */ + public static void trackEvent(@NonNull String event) { + ProfileModuleProvider.get().trackPublicEvent(event, null); } /** @@ -1429,23 +1298,10 @@ public static void trackEvent(@NonNull String event, String label, JSONObject da * You can call this method from any thread. Batch must be started at some point, or events won't be sent to the server. * * @param event The event name. - * @param label The event label. Can be null. - * @param data The event data. Can be null. - */ - public static void trackEvent(@NonNull String event, String label, BatchEventData data) { - try { - JSONObject jsonData = null; - if (data != null) { - jsonData = data.toInternalJSON(); - } - UserModuleProvider.get().trackPublicEvent(event, label, jsonData); - } catch (JSONException e) { - Logger.error( - UserModule.TAG, - "Could not process BatchEventData, refusing to track event. This is an internal error: please contact us." - ); - Logger.internal(UserModule.TAG, "Could not convert BatchEventData", e); - } + * @param attributes The event attributes. Can be null. + */ + public static void trackEvent(@NonNull String event, @Nullable BatchEventAttributes attributes) { + ProfileModuleProvider.get().trackPublicEvent(event, attributes); } /** @@ -1460,49 +1316,6 @@ public static void trackEvent(@NonNull String event, String label, BatchEventDat public static void trackLocation(@NonNull Location location) { UserModuleProvider.get().trackLocation(location); } - - /** - * Track a transaction. - * You can call this method from any thread. Batch must be started at some point, or events won't be sent to the server. - * - * @param amount Transaction amount. - */ - public static void trackTransaction(double amount) { - trackTransaction(amount, null); - } - - /** - * Track a transaction. - * You can call this method from any thread. Batch must be started at some point, or events won't be sent to the server. - * - * @param amount Transaction amount. - * @param data Transaction data. Can be null. - */ - public static void trackTransaction(double amount, JSONObject data) { - try { - JSONObject convertedDataJSON = null; - if (data != null) { - BatchEventData convertedData = new BatchEventData(data); - convertedDataJSON = convertedData.toInternalJSON(); - } - UserModuleProvider.get().trackTransaction(amount, convertedDataJSON); - } catch (JSONException e) { - Logger.error( - UserModule.TAG, - "Could not process BatchEventData, refusing to track transaction. This is an internal error: please contact us." - ); - Logger.internal(UserModule.TAG, "Could not convert BatchEventData", e); - } - } - - /** - * Print the currently known attributes and tags for a user to logcat. - *

- * For debug purposes only. Don't rely on the log format, because it can change at any time without warning. - */ - public static void printDebugInformation() { - UserModule.printDebugInfo(); - } } /** @@ -1678,7 +1491,7 @@ public static DisplayHint embed(@NonNull FrameLayout layout) { * Toggle whether mobile landings should be shown directly rather than displaying a notification * when the app is in foreground. *

- * Default is true. + * Default is false. * * @param showForegroundLandings True to enable show landings, false to display a notification like when the application is in the background. */ @@ -1732,8 +1545,8 @@ public static void setLifecycleListener(@Nullable LifecycleListener listener) { * * @param context Your activity's context. Can't be null. * @param message Message to display. Can't be null. - * @throws IllegalArgumentException - * @throws BatchMessagingException + * @throws IllegalArgumentException If some parameters are null. + * @throws BatchMessagingException When loading fail */ @NonNull public static DialogFragment loadFragment(@NonNull Context context, @NonNull BatchMessage message) @@ -1753,8 +1566,8 @@ public static DialogFragment loadFragment(@NonNull Context context, @NonNull Bat * @param context Your activity's context. Can't be null. * @param message Message to display. Can't be null. * @return A Banner instance. - * @throws IllegalArgumentException - * @throws BatchMessagingException + * @throws IllegalArgumentException If some parameters are null. + * @throws BatchMessagingException When loading fail */ @NonNull public static BatchBannerView loadBanner(@NonNull Context context, @NonNull BatchMessage message) @@ -1935,7 +1748,7 @@ public static void onCreate(final Activity activity) { *
* Will fail and log an Error if

* @@ -1955,7 +1768,7 @@ public static void onStart(final Activity activity) { *
* Will fail and log an Error if * @@ -1981,7 +1794,7 @@ public static void onServiceDestroy(final Context context) { * Method to call on your main activity {@link Activity#onNewIntent(Intent)}
* Calling this method if Batch is already stopped or not started will do nothing * - * @param intent + * @param intent Android's intent */ public static void onNewIntent(final Activity activity, final Intent intent) { newIntent = intent; @@ -2018,7 +1831,7 @@ private static void doBatchStart(final Context context, final boolean bumpRetain boolean hasStarted = RuntimeManagerProvider .get() - .changeState(state -> { + .changeState((state, config) -> { if (config == null) { Logger.error( "You must set the configuration before starting Batch. Please call setConfig on onCreate of your Application subclass" @@ -2226,20 +2039,17 @@ else if (lastStop == null && state == State.READY) { /* * Get API Key */ - if (config.apikey == null) { - Logger.error("API key provided in Config is null, aborting start"); + if (config.getApikey() == null) { + Logger.error("API key provided in Batch.start is null, aborting start"); return null; } /* - * Init device/user/install data + * Init device/install data */ if (Batch.install == null) { Batch.install = new Install(applicationContext); } - if (Batch.user == null) { - Batch.user = new com.batch.android.User(applicationContext); - } /* * Create new session id @@ -2320,13 +2130,16 @@ else if (lastStop == null && state == State.READY) { intentParser.markOpenAsAlreadyTracked(); try { - BatchPushPayload pushPayload = BatchPushPayload.payloadFromReceiverExtras( - intentParser.getPushBundle() - ); - EventDispatcher.Payload payload = new PushEventPayload(pushPayload, true); - EventDispatcherModuleProvider - .get() - .dispatchEvent(EventDispatcher.Type.NOTIFICATION_OPEN, payload); + Bundle pushBundle = intentParser.getPushBundle(); + if (pushBundle != null) { + BatchPushPayload pushPayload = BatchPushPayload.payloadFromReceiverExtras(pushBundle); + EventDispatcher.Payload payload = new PushEventPayload(pushPayload, true); + EventDispatcherModuleProvider + .get() + .dispatchEvent(EventDispatcher.Type.NOTIFICATION_OPEN, payload); + } else { + Logger.internal("Could not get the push bundle."); + } } catch (BatchPushPayload.ParsingException | IllegalArgumentException e) { Logger.internal("Could not dispatch NOTIFICATION_OPEN", e); } @@ -2365,12 +2178,13 @@ else if (lastStop == null && state == State.READY) { ); // Log if dev mode to warn the dev - final String apiKey = Batch.getAPIKey(); - if (apiKey != null && apiKey.toLowerCase(Locale.US).startsWith("dev")) { - Logger.warning( - "Batch (" + Parameters.SDK_VERSION + ") is running in dev mode (your API key is a dev one)" - ); - } + runtimeManager.readConfig(config -> { + if (config.getApikey() != null && config.getApikey().toLowerCase(Locale.US).startsWith("dev")) { + Logger.warning( + "Batch (" + Parameters.SDK_VERSION + ") is running in dev mode (your API key is a dev one)" + ); + } + }); final String installID = Batch.User.getInstallationID(); if (installID != null) { @@ -2396,7 +2210,7 @@ private static void onStop(final Context _context, final boolean fromService, fi .get() .changeStateIf( State.READY, - state -> { + (state, config) -> { Logger.internal("onStop called with state " + state); if (fromService) { @@ -2505,7 +2319,7 @@ private static void doStop() { .get() .changeStateIf( State.FINISHING, - state -> { + (state, config) -> { Logger.internal("doStop, called with state " + state); // Call modules @@ -2542,40 +2356,20 @@ private static void doStop() { private static void clearCachedInstallData() { Logger.internal(OptOutModule.TAG, "Clearing cached install data"); install = null; - user = null; } // ---------------------------------------------> - /** - * Return the advertising ID object if available - * - * @deprecated this method has been deprecated and does nothing. - * @return Always return null. - */ - @Deprecated - static AdvertisingID getAdvertisingID() { - return null; - } - /** * Return the install object if available * * @return the install if available, null otherwise */ + @Nullable static Install getInstall() { return install; } - /** - * Return the user object if available - * - * @return the user if available, null otherwise - */ - static com.batch.android.User getUser() { - return user; - } - // -----------------------------------------------> /** @@ -2584,10 +2378,6 @@ static com.batch.android.User getUser() { private static void updateVersionManagement() { try { String currentVersion = Parameters.SDK_VERSION; - if (currentVersion == null) { - throw new NullPointerException("Unable to retrieve current lib version"); - } - String savedVersion = ParametersProvider .get(RuntimeManagerProvider.get().getContext()) .get(ParameterKeys.LIB_CURRENTVERSION_KEY); @@ -2596,7 +2386,6 @@ private static void updateVersionManagement() { .get(RuntimeManagerProvider.get().getContext()) .set(ParameterKeys.LIB_CURRENTVERSION_KEY, currentVersion, true); } else if (!savedVersion.equals(currentVersion)) { // new version - manageUpdate(savedVersion, currentVersion); ParametersProvider .get(RuntimeManagerProvider.get().getContext()) .set(ParameterKeys.LIB_CURRENTVERSION_KEY, currentVersion, true); @@ -2609,14 +2398,6 @@ private static void updateVersionManagement() { } } - /** - * Called when the lib has been updated - * - * @param previousVersion - * @param currentVersion - */ - private static void manageUpdate(String previousVersion, String currentVersion) {} - private static class InternalBroadcastReceiver extends BroadcastReceiver { @Override diff --git a/Sources/sdk/src/main/java/com/batch/android/BatchActivityLifecycleHelper.java b/Sources/sdk/src/main/java/com/batch/android/BatchActivityLifecycleHelper.java index 175340e..a886c8f 100644 --- a/Sources/sdk/src/main/java/com/batch/android/BatchActivityLifecycleHelper.java +++ b/Sources/sdk/src/main/java/com/batch/android/BatchActivityLifecycleHelper.java @@ -13,7 +13,6 @@ * Important note: While this removes the need for most lifecycle activities, you still MUST add Batch.onNewIntent(this, intent) in all your activities * */ -@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) @SuppressWarnings("unused") @PublicSDK public class BatchActivityLifecycleHelper implements Application.ActivityLifecycleCallbacks { diff --git a/Sources/sdk/src/main/java/com/batch/android/BatchDataCollectionConfig.java b/Sources/sdk/src/main/java/com/batch/android/BatchDataCollectionConfig.java new file mode 100644 index 0000000..4a0fb3e --- /dev/null +++ b/Sources/sdk/src/main/java/com/batch/android/BatchDataCollectionConfig.java @@ -0,0 +1,123 @@ +package com.batch.android; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.batch.android.annotation.PublicSDK; + +/** + * Batch Automatic Data Collection related configuration. + */ +@PublicSDK +public class BatchDataCollectionConfig { + + /** + * Editor interface to edit the BatchDataCollectionConfig + */ + @PublicSDK + public interface Editor { + void edit(BatchDataCollectionConfig config); + } + + /** + * Whether Batch should resolve the user's region/location from the ip address. + * Default: false + */ + @Nullable + private Boolean geoIPEnabled; + + /** + * Whether Batch should send the device brand information. + * Default: false + */ + @Nullable + private Boolean deviceBrandEnabled; + + /** + * Whether Batch should send the device model information. + * Default: false + */ + @Nullable + private Boolean deviceModelEnabled; + + /** + * Set whether Batch can resolve the user's region/location from the ip address. + * + * @param geoIPEnabled Whether Batch can resolve the geoip. + * @return This BatchDataCollectionConfig instance for method chaining + */ + public BatchDataCollectionConfig setGeoIPEnabled(boolean geoIPEnabled) { + this.geoIPEnabled = geoIPEnabled; + return this; + } + + /** + * Set whether Batch should send the device brand information. + * + * @param deviceBrandEnabled Whether Batch can collect the device brand. + * @return This BatchDataCollectionConfig instance for method chaining + */ + public BatchDataCollectionConfig setDeviceBrandEnabled(boolean deviceBrandEnabled) { + this.deviceBrandEnabled = deviceBrandEnabled; + return this; + } + + /** + * Set whether Batch should send the device model information. + * + * @param deviceModelEnabled Whether Batch can collect the device model. + * @return This BatchDataCollectionConfig instance for method chaining + */ + public BatchDataCollectionConfig setDeviceModelEnabled(boolean deviceModelEnabled) { + this.deviceModelEnabled = deviceModelEnabled; + return this; + } + + /** + * Get whether the geoip is enabled to resolve the user's location/region on server side. + * + * @return whether the geoip is enabled to resolve the user's location/region. + */ + @Nullable + public Boolean isGeoIpEnabled() { + return geoIPEnabled; + } + + /** + * Get whether the device brand collect is enabled (null mean unchanged from last modification or default value : false). + * + * @return Whether the device brand collect is enabled t. + */ + @Nullable + public Boolean isDeviceBrandEnabled() { + return deviceBrandEnabled; + } + + /** + * Get whether the device model collect is enabled (null mean unchanged from last modification or default value : false). + * + * @return Whether the device model collect is enabled. + */ + @Nullable + public Boolean isDeviceModelEnabled() { + return deviceModelEnabled; + } + + /** + * To String method + * @return A string representation of the data collection config. + */ + @NonNull + @Override + public String toString() { + return ( + "BatchDataCollectionConfig{" + + "geoIPEnabled=" + + geoIPEnabled + + ", deviceBrandEnabled=" + + deviceBrandEnabled + + ", deviceModelEnabled=" + + deviceModelEnabled + + '}' + ); + } +} diff --git a/Sources/sdk/src/main/java/com/batch/android/BatchDisplayReceiptJobService.java b/Sources/sdk/src/main/java/com/batch/android/BatchDisplayReceiptJobService.java index 614aa9d..3c7afd8 100644 --- a/Sources/sdk/src/main/java/com/batch/android/BatchDisplayReceiptJobService.java +++ b/Sources/sdk/src/main/java/com/batch/android/BatchDisplayReceiptJobService.java @@ -14,7 +14,6 @@ * JobService implementation of Batch Display Receipt */ -@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public class BatchDisplayReceiptJobService extends JobService { private static final String TAG = "BatchDisplayReceiptJobService"; diff --git a/Sources/sdk/src/main/java/com/batch/android/BatchEventAttributes.java b/Sources/sdk/src/main/java/com/batch/android/BatchEventAttributes.java new file mode 100644 index 0000000..060a718 --- /dev/null +++ b/Sources/sdk/src/main/java/com/batch/android/BatchEventAttributes.java @@ -0,0 +1,225 @@ +package com.batch.android; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.batch.android.annotation.PublicSDK; +import com.batch.android.event.EventAttributesValidator; +import com.batch.android.event.EventTypedAttribute; +import com.batch.android.user.AttributeType; +import java.net.URI; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Object holding attributes to be associated to an event + * Keys should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. + */ +@PublicSDK +public class BatchEventAttributes { + + /** + * Reserved key used to set a label on events in the install centric data model + * and activate compatibility flows + */ + public static final String LABEL_KEY = "$label"; + + /** + * Reserved key used to set tags on events in the install centric data model + * and activate compatibility flows + */ + public static final String TAGS_KEY = "$tags"; + + @NonNull + private final Map attributes; + + @Nullable + private Set tags; + + @Nullable + private String label; + + public BatchEventAttributes() { + attributes = new HashMap<>(); + } + + /** + * @hide + * Private getter + */ + @NonNull + public Map getAttributes() { + return attributes; + } + + /** + * @hide + * Private getter + */ + @Nullable + public Set getTags() { + return tags; + } + + /** + * @hide + * Private getter + */ + @Nullable + public String getLabel() { + return label; + } + + /** + * Add a string attribute for the specified key + * + * @param key Attribute key. Should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. + * @param value String value to add. Can't be longer than 64 characters, and can't be empty or null. For better results, you should trim/lowercase your strings, and use slugs when possible. + * @return Same BatchEventAttributes instance, for chaining + */ + public BatchEventAttributes put(@NonNull String key, @NonNull String value) { + if (LABEL_KEY.equals(key)) { + this.label = value; + return this; + } + attributes.put(key, new EventTypedAttribute(value, AttributeType.STRING)); + return this; + } + + /** + * Add an URL attribute for the specified key + * + * @param key Attribute key. Should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. + * @param value URL value to add. Can't be longer than 2048 characters, and can't be empty or null. + * @return Same BatchEventAttributes instance, for chaining + */ + public BatchEventAttributes put(@NonNull String key, @NonNull URI value) { + attributes.put(key, new EventTypedAttribute(value, AttributeType.URL)); + return this; + } + + /** + * Add a float attribute for the specified key + * + * @param key Attribute key. Should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. + * @param value Float value to add. + * @return Same BatchEventAttributes instance, for chaining + */ + public BatchEventAttributes put(@NonNull String key, float value) { + attributes.put(key, new EventTypedAttribute(value, AttributeType.DOUBLE)); + return this; + } + + /** + * Add a double attribute for the specified key + * + * @param key Attribute key. Should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. + * @param value Double value to add. + * @return Same BatchEventAttributes instance, for chaining + */ + public BatchEventAttributes put(@NonNull String key, double value) { + attributes.put(key, new EventTypedAttribute(value, AttributeType.DOUBLE)); + return this; + } + + /** + * Add a integer attribute for the specified key + * + * @param key Attribute key. Should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. + * @param value Integer value to add. + * @return Same BatchEventAttributes instance, for chaining + */ + public BatchEventAttributes put(@NonNull String key, int value) { + attributes.put(key, new EventTypedAttribute(value, AttributeType.LONG)); + return this; + } + + /** + * Add a long attribute for the specified key + * + * @param key Attribute key. Should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. + * @param value Long value to add. + * @return Same BatchEventAttributes instance, for chaining + */ + public BatchEventAttributes put(@NonNull String key, long value) { + attributes.put(key, new EventTypedAttribute(value, AttributeType.LONG)); + return this; + } + + /** + * Add a boolean attribute for the specified key + * + * @param key Attribute key. Should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. + * @param value Boolean value to add. + * @return Same BatchEventAttributes instance, for chaining + */ + public BatchEventAttributes put(@NonNull String key, boolean value) { + attributes.put(key, new EventTypedAttribute(value, AttributeType.BOOL)); + return this; + } + + /** + * Add a date attribute for the specified key + * + * @param key Attribute key. Should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. + * @param value Date value to add. + * @return Same BatchEventAttributes instance, for chaining + */ + public BatchEventAttributes put(@NonNull String key, @NonNull Date value) { + attributes.put(key, new EventTypedAttribute(value.getTime(), AttributeType.DATE)); + return this; + } + + /** + * Add an object attribute for the specified key + * + * @param key Attribute key. Should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. + * @param value BatchEventAttributes value to add. + * @return Same BatchEventAttributes instance, for chaining + */ + public BatchEventAttributes put(@NonNull String key, @NonNull BatchEventAttributes value) { + attributes.put(key, new EventTypedAttribute(value, AttributeType.OBJECT)); + return this; + } + + /** + * Add a list of object attribute for the specified key + * + * @param key Attribute key. Should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. + * @param value A List of BatchEventAttributes value to add. + * @return Same BatchEventAttributes instance, for chaining + */ + public BatchEventAttributes putObjectList(@NonNull String key, @NonNull List value) { + attributes.put(key, new EventTypedAttribute(new ArrayList<>(value), AttributeType.OBJECT_ARRAY)); + return this; + } + + /** + * Add a list of string attribute for the specified key + * + * @param key Attribute key. Should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. + * @param value A List of String value to add. + * @return Same BatchEventAttributes instance, for chaining + */ + public BatchEventAttributes putStringList(@NonNull String key, @NonNull List value) { + if (TAGS_KEY.equals(key)) { + this.tags = new LinkedHashSet<>(value); + return this; + } + attributes.put(key, new EventTypedAttribute(new ArrayList<>(value), AttributeType.STRING_ARRAY)); + return this; + } + + /** + * Validate the event data. + * + * @return A list of human readable errors as strings if the event data does not validates successfully, An empty list if not. If the data does not validate, Batch will refuse to track an event with it. + */ + public List validateEventAttributes() { + return EventAttributesValidator.computeValidationErrors(this); + } +} diff --git a/Sources/sdk/src/main/java/com/batch/android/BatchEventData.java b/Sources/sdk/src/main/java/com/batch/android/BatchEventData.java deleted file mode 100644 index db11eea..0000000 --- a/Sources/sdk/src/main/java/com/batch/android/BatchEventData.java +++ /dev/null @@ -1,350 +0,0 @@ -package com.batch.android; - -import android.text.TextUtils; -import androidx.annotation.NonNull; -import com.batch.android.annotation.PublicSDK; -import com.batch.android.core.Logger; -import com.batch.android.json.JSONArray; -import com.batch.android.json.JSONException; -import com.batch.android.json.JSONObject; -import com.batch.android.module.TrackerModule; -import com.batch.android.user.AttributeType; -import java.net.URI; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Locale; -import java.util.Map; -import java.util.Set; -import java.util.TreeSet; - -/** - * Object holding data to be associated to an event - * Keys should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. - */ -@PublicSDK -public class BatchEventData { - - private static final int MAXIMUM_VALUES = 15; - private static final int MAXIMUM_TAGS = 10; - private static final int MAXIMUM_STRING_LENGTH = 64; - private static final int MAXIMUM_URL_LENGTH = 2048; - - private Map attributes; - private Set tags; - private boolean convertedFromLegacyAPI = false; - - public BatchEventData() { - init(); - } - - BatchEventData(@NonNull JSONObject fromJSON) { - init(); - convertedFromLegacyAPI = true; - - TreeSet sortedLegacyKeys = new TreeSet<>((o1, o2) -> - o1.toLowerCase(Locale.US).compareTo(o2.toLowerCase(Locale.US)) - ); - sortedLegacyKeys.addAll(fromJSON.keySet()); - - for (String key : sortedLegacyKeys) { - Object value = fromJSON.opt(key); - if (value != null) { - if (value instanceof String) { - put(key, (String) value); - } else if (value instanceof Boolean) { - put(key, (Boolean) value); - } else if (value instanceof Float) { - put(key, (Float) value); - } else if (value instanceof Double) { - put(key, (Double) value); - } else if (value instanceof Integer) { - put(key, (Integer) value); - } else if (value instanceof Long) { - put(key, (Long) value); - } else if (value instanceof URI) { - put(key, (URI) value); - } - } - } - } - - private void init() { - attributes = new HashMap<>(); - tags = new HashSet<>(); - } - - Map getAttributes() { - return attributes; - } - - Set getTags() { - return tags; - } - - boolean getConvertedFromLegacyAPI() { - return convertedFromLegacyAPI; - } - - /** - * Add a tag - * - * @param tag Tag to add. Can't be longer than 64 characters, and can't be empty or null. For better results, you should trim/lowercase your strings, and use slugs when possible. - * @return Same BatchEventData instance, for chaining - */ - public BatchEventData addTag(String tag) { - if (tags.size() >= MAXIMUM_TAGS) { - Logger.internal( - TrackerModule.TAG, - "BatchEventData: Event data cannot hold more than 10 tags. Ignoring: '" + tag + "'" - ); - return this; - } - - if (enforceStringValue(tag)) { - tags.add(tag.toLowerCase(Locale.US)); - return this; - } - - return this; - } - - /** - * Add a string attribute for the specified key - * - * @param key Attribute key. Should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. - * @param value String value to add. Can't be longer than 64 characters, and can't be empty or null. For better results, you should trim/lowercase your strings, and use slugs when possible. - * @return Same BatchEventData instance, for chaining - */ - public BatchEventData put(String key, String value) { - if (enforceAttributesCount(key) && enforceAttributeName(key) && enforceStringValue(value)) { - attributes.put(normalizeKey(key), new TypedAttribute(value, AttributeType.STRING)); - return this; - } - return this; - } - - /** - * Add an URL attribute for the specified key - * - * @param key Attribute key. Should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. - * @param value URL value to add. Can't be longer than 2048 characters, and can't be empty or null. - * @return Same BatchEventData instance, for chaining - */ - public BatchEventData put(String key, URI value) { - if (enforceAttributesCount(key) && enforceAttributeName(key) && enforceURIValue(value)) { - attributes.put(normalizeKey(key), new TypedAttribute(value, AttributeType.URL)); - return this; - } - return this; - } - - /** - * Add a float attribute for the specified key - * - * @param key Attribute key. Should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. - * @param value Float value to add. - * @return Same BatchEventData instance, for chaining - */ - public BatchEventData put(String key, float value) { - if (enforceAttributeName(key) && enforceAttributesCount(key)) { - attributes.put(normalizeKey(key), new TypedAttribute(value, AttributeType.DOUBLE)); - return this; - } - return this; - } - - /** - * Add a double attribute for the specified key - * - * @param key Attribute key. Should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. - * @param value Double value to add. - * @return Same BatchEventData instance, for chaining - */ - public BatchEventData put(String key, double value) { - if (enforceAttributeName(key) && enforceAttributesCount(key)) { - attributes.put(normalizeKey(key), new TypedAttribute(value, AttributeType.DOUBLE)); - return this; - } - return this; - } - - /** - * Add a integer attribute for the specified key - * - * @param key Attribute key. Should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. - * @param value Integer value to add. - * @return Same BatchEventData instance, for chaining - */ - public BatchEventData put(String key, int value) { - if (enforceAttributeName(key) && enforceAttributesCount(key)) { - attributes.put(normalizeKey(key), new TypedAttribute(value, AttributeType.LONG)); - return this; - } - return this; - } - - /** - * Add a long attribute for the specified key - * - * @param key Attribute key. Should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. - * @param value Long value to add. - * @return Same BatchEventData instance, for chaining - */ - public BatchEventData put(String key, long value) { - if (enforceAttributeName(key) && enforceAttributesCount(key)) { - attributes.put(normalizeKey(key), new TypedAttribute(value, AttributeType.LONG)); - return this; - } - return this; - } - - /** - * Add a boolean attribute for the specified key - * - * @param key Attribute key. Should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. - * @param value Boolean value to add. - * @return Same BatchEventData instance, for chaining - */ - public BatchEventData put(String key, boolean value) { - if (enforceAttributeName(key) && enforceAttributesCount(key)) { - attributes.put(normalizeKey(key), new TypedAttribute(value, AttributeType.BOOL)); - return this; - } - return this; - } - - /** - * Add a date attribute for the specified key - * - * @param key Attribute key. Should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. - * @param value Date value to add. - * @return Same BatchEventData instance, for chaining - */ - public BatchEventData put(String key, Date value) { - if (enforceAttributeName(key) && enforceAttributesCount(key) && enforceDateValue(value)) { - attributes.put(normalizeKey(key), new TypedAttribute(value.getTime(), AttributeType.DATE)); - return this; - } - return this; - } - - JSONObject toInternalJSON() throws JSONException { - JSONObject obj = new JSONObject(); - JSONObject attributes = new JSONObject(); - - TypedAttribute attribute; - for (Map.Entry entry : this.attributes.entrySet()) { - attribute = entry.getValue(); - attributes.put(entry.getKey().toLowerCase(Locale.US) + "." + attribute.type.getTypeChar(), attribute.value); - } - - obj.put("attributes", attributes); - obj.put("tags", new JSONArray(tags)); - - if (convertedFromLegacyAPI) { - obj.put("converted", true); - } - - return obj; - } - - private boolean enforceAttributesCount(String key) { - if (attributes.size() == MAXIMUM_VALUES && !attributes.containsKey(key)) { - Logger.internal( - TrackerModule.TAG, - "BatchEventData: Event data cannot hold more than 15 attributes. Ignoring attribute: '" + key + "'" - ); - return false; - } - return true; - } - - private boolean enforceStringValue(String value) { - if (TextUtils.isEmpty(value)) { - Logger.internal( - TrackerModule.TAG, - "BatchEventData: Cannot add a null or empty string attribute/tag. Ignoring." - ); - return false; - } - - if (value.length() > MAXIMUM_STRING_LENGTH) { - Logger.internal( - TrackerModule.TAG, - "BatchEventData: String attributes and tags can't be longer than " + - MAXIMUM_STRING_LENGTH + - " characters. Ignoring." - ); - return false; - } - - return true; - } - - private boolean enforceURIValue(URI value) { - if (TextUtils.isEmpty(value.toString())) { - Logger.internal( - TrackerModule.TAG, - "BatchEventData: Cannot add a null or empty URL attribute/tag. Ignoring." - ); - return false; - } - - if (value.toString().length() > MAXIMUM_URL_LENGTH) { - Logger.internal( - TrackerModule.TAG, - "BatchEventData: URL attributes can't be longer than " + MAXIMUM_URL_LENGTH + " characters. Ignoring." - ); - return false; - } - - if (value.getScheme() == null || value.getAuthority() == null) { - Logger.error( - TrackerModule.TAG, - "BatchEventData: URL attributes must follow the format 'scheme://[authority][path][?query][#fragment]'. Ignoring." - ); - return false; - } - - return true; - } - - private boolean enforceDateValue(Date value) { - if (value == null) { - Logger.internal(TrackerModule.TAG, "BatchEventData: Cannot add a null date attribute/tag. Ignoring."); - return false; - } - - return true; - } - - private boolean enforceAttributeName(String key) { - if (TextUtils.isEmpty(key) || !BatchUserDataEditor.ATTR_KEY_PATTERN.matcher(key).matches()) { - Logger.internal( - TrackerModule.TAG, - "BatchEventData: Invalid key. Please make sure that the key is made of letters, underscores and numbers only (a-zA-Z0-9_). It also can't be longer than 30 characters. Ignoring value '" + - key + - "'." - ); - return false; - } - - return true; - } - - private String normalizeKey(String key) { - return key.toLowerCase(Locale.US); - } - - static class TypedAttribute { - - public Object value; - public AttributeType type; - - TypedAttribute(Object value, AttributeType type) { - this.value = value; - this.type = type; - } - } -} diff --git a/Sources/sdk/src/main/java/com/batch/android/BatchInboxNotificationContent.java b/Sources/sdk/src/main/java/com/batch/android/BatchInboxNotificationContent.java index 3ef9b29..22656a2 100644 --- a/Sources/sdk/src/main/java/com/batch/android/BatchInboxNotificationContent.java +++ b/Sources/sdk/src/main/java/com/batch/android/BatchInboxNotificationContent.java @@ -1,6 +1,5 @@ package com.batch.android; -import android.app.Activity; import android.content.Context; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -10,12 +9,7 @@ import com.batch.android.di.providers.OptOutModuleProvider; import com.batch.android.di.providers.RuntimeManagerProvider; import com.batch.android.inbox.InboxNotificationContentInternal; -import com.batch.android.json.JSONException; import com.batch.android.json.JSONObject; -import com.batch.android.messaging.PayloadParser; -import com.batch.android.messaging.PayloadParsingException; -import com.batch.android.messaging.model.BannerMessage; -import com.batch.android.messaging.model.Message; import com.batch.android.module.MessagingModule; import java.util.Date; import java.util.HashMap; @@ -72,17 +66,6 @@ public boolean isUnread() { return internalContent.isUnread; } - /** - * Flag indicating whether this notification is deleted or not. - * - * @return true if notification is deleted - * @deprecated You should refresh your copy of the data with getFetchedNotifications() after using markAsDeleted. - */ - @Deprecated - public boolean isDeleted() { - return internalContent.isDeleted; - } - @NonNull public Date getDate() { return (Date) internalContent.date.clone(); diff --git a/Sources/sdk/src/main/java/com/batch/android/BatchMessagingWebViewJavascriptBridge.java b/Sources/sdk/src/main/java/com/batch/android/BatchMessagingWebViewJavascriptBridge.java index 7d9a4a1..77be10c 100644 --- a/Sources/sdk/src/main/java/com/batch/android/BatchMessagingWebViewJavascriptBridge.java +++ b/Sources/sdk/src/main/java/com/batch/android/BatchMessagingWebViewJavascriptBridge.java @@ -10,6 +10,7 @@ import androidx.annotation.VisibleForTesting; import com.batch.android.annotation.PublicSDK; import com.batch.android.core.Logger; +import com.batch.android.di.providers.UserModuleProvider; import com.batch.android.json.JSONException; import com.batch.android.json.JSONObject; import com.batch.android.messaging.WebViewActionListener; @@ -159,7 +160,8 @@ protected String getCustomUserID() { @VisibleForTesting @Nullable protected String getAttributionID() { - return Batch.getUser().getAttributionID(); + Logger.warning("Attribution identifier is not supported anymore"); + return null; } @NonNull diff --git a/Sources/sdk/src/main/java/com/batch/android/BatchMigration.java b/Sources/sdk/src/main/java/com/batch/android/BatchMigration.java new file mode 100644 index 0000000..a8655db --- /dev/null +++ b/Sources/sdk/src/main/java/com/batch/android/BatchMigration.java @@ -0,0 +1,94 @@ +package com.batch.android; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.batch.android.annotation.PublicSDK; +import java.util.EnumSet; + +@PublicSDK +public enum BatchMigration { + /** + * No migrations disabled + */ + NONE(0), + + /** + * Whether Bath should automatically identify logged-in user when running the SDK V2 for the first time. + * This mean user with a custom_user_id will be automatically attached a to a Profile and can be targeted within a Project scope. + */ + CUSTOM_ID(1), + + /** + * Whether Bath should automatically attach current installation's data (language/region/customDataAttributes...) + * to the User's Profile when running the SDK for the first time. + */ + CUSTOM_DATA(1 << 1); + + /** + * The integer value + */ + private final int value; + + /** + * Constructor + * + * @param value Integer value of the migration + */ + BatchMigration(int value) { + this.value = value; + } + + /** + * Convert integer value in enum set of migrations + * + * @param value The integer value of migrations + * @return An enumSet of Migration + */ + @NonNull + public static EnumSet fromValue(int value) { + EnumSet migrations = EnumSet.noneOf(BatchMigration.class); + for (BatchMigration migration : values()) { + if (migration != NONE && (value & migration.value) == migration.value) { + migrations.add(migration); + } + } + if (migrations.isEmpty()) { + migrations.add(BatchMigration.NONE); + } + return migrations; + } + + /** + * Convert an EnumSet of migration to an integer value + * + * @param migrations EnumSet of migrations to convert + * @return The integer value of migrations + */ + public static int toValue(@NonNull EnumSet migrations) { + int val = 0; + for (BatchMigration migration : migrations) { + val |= migration.value; + } + return val; + } + + /** + * Whether the Custom User ID migration is disabled + * + * @param value migrations value + * @return true if its disabled, false otherwise + */ + public static boolean isCustomIDMigrationDisabled(@Nullable Integer value) { + return (value != null && (fromValue(value).contains(BatchMigration.CUSTOM_ID))); + } + + /** + * Whether the Custom Data migration is disabled + * + * @param value migrations value + * @return true if its disabled, false otherwise + */ + public static boolean isCustomDataMigrationDisabled(@Nullable Integer value) { + return (value != null && (fromValue(value).contains(BatchMigration.CUSTOM_DATA))); + } +} diff --git a/Sources/sdk/src/main/java/com/batch/android/BatchPermissionListener.java b/Sources/sdk/src/main/java/com/batch/android/BatchPermissionListener.java new file mode 100644 index 0000000..e3aca8a --- /dev/null +++ b/Sources/sdk/src/main/java/com/batch/android/BatchPermissionListener.java @@ -0,0 +1,16 @@ +package com.batch.android; + +import com.batch.android.annotation.PublicSDK; + +/** + * Interface for requesting runtime permission with callback. + */ +@PublicSDK +public interface BatchPermissionListener { + /** + * Method called when the permission has been requested with the user's permission result. + * + * @param granted Whether the permission requested has been granted. + */ + void onPermissionRequested(boolean granted); +} diff --git a/Sources/sdk/src/main/java/com/batch/android/BatchProfileAttributeEditor.java b/Sources/sdk/src/main/java/com/batch/android/BatchProfileAttributeEditor.java new file mode 100644 index 0000000..4c2f189 --- /dev/null +++ b/Sources/sdk/src/main/java/com/batch/android/BatchProfileAttributeEditor.java @@ -0,0 +1,481 @@ +package com.batch.android; + +import android.content.Context; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.batch.android.annotation.PublicSDK; +import com.batch.android.core.Logger; +import com.batch.android.di.providers.ProfileModuleProvider; +import com.batch.android.di.providers.RuntimeManagerProvider; +import com.batch.android.di.providers.UserModuleProvider; +import com.batch.android.profile.ProfileDataHelper; +import com.batch.android.profile.ProfileDataHelper.AttributeValidationException; +import com.batch.android.profile.ProfileUpdateOperation; +import com.batch.android.user.AttributeType; +import com.batch.android.user.InstallDataEditor; +import com.batch.android.user.UserAttribute; +import java.net.URI; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +/** + * Batch Profile Attribute Editor + *

+ * Profiles centralize data and events from multiple sources (Apps, Websites, APIs) in a single place based on the Custom ID. + * They also store a profile's email address and email subscriptions. + *

+ * The Batch Profile Attribute Editor allows you to update profiles to: + *

+ * Set attributes + * Set email subscription status and email address + * Set a language & region + */ +@PublicSDK +public class BatchProfileAttributeEditor extends InstallDataEditor { + + /** + * Logger tag + */ + private static final String TAG = "BatchProfileAttributeEditor"; + + /** + * Internal SDK model of an omnichannel profile + */ + private final ProfileUpdateOperation profileUpdateOperation = new ProfileUpdateOperation(); + + /** + * Constructor + */ + BatchProfileAttributeEditor() { + super(); + } + + /** + * Set the language of this profile.
+ * Overrides the detected installation language. + * + * @param language lowercase, ISO 639 formatted string. null to reset. + * @return This object instance, for method chaining + */ + @Override + public BatchProfileAttributeEditor setLanguage(final @Nullable String language) { + if (ProfileDataHelper.isNotValidLanguage(language)) { + Logger.error(TAG, "setLanguage called with invalid language (must be at least 2 chars)"); + return this; + } + this.profileUpdateOperation.setLanguage(language); + super.setLanguage(language); + return this; + } + + /** + * Set the region of this profile.
+ * Overrides the detected installation region. + * + * @param region uppercase, ISO 3166 formatted string. null to reset. + * @return This object instance, for method chaining + */ + public BatchProfileAttributeEditor setRegion(final @Nullable String region) { + if (ProfileDataHelper.isNotValidRegion(region)) { + Logger.error(TAG, "setRegion called with invalid region (must be at least 2 chars)"); + return this; + } + this.profileUpdateOperation.setRegion(region); + super.setRegion(region); + return this; + } + + /** + * Set the profile email address. + *

+ * Note: This method requires to already have a registered identifier for the user + * or to call {@link Batch.Profile#identify(String)} method before this one. + * @param email Email address string + * @return This object instance, for method chaining. + */ + public BatchProfileAttributeEditor setEmailAddress(final @Nullable String email) { + Context context = RuntimeManagerProvider.get().getContext(); + if (context == null) { + Logger.error(TAG, "Batch does not have a context yet. Make sure Batch is started beforehand."); + return this; + } + + // Ensure profile is logged in + String customUserID = UserModuleProvider.get().getCustomID(context); + if (customUserID == null) { + Logger.error( + TAG, + "You cannot set/reset an email to an anonymous profile. Please use the `Batch.Profile.identify` method beforehand." + ); + return this; + } + + // Ensure email is valid + if (ProfileDataHelper.isNotValidEmail(email)) { + Logger.error( + TAG, + "setEmail called with invalid email format. Please ensure to respect the following regex: .@.\\..* and 128 char max length. " + ); + return this; + } + this.profileUpdateOperation.setEmail(email); + return this; + } + + /** + * Set the profile email marketing subscription state. + *

+ * Note that profile's subscription status is automatically set to unsubscribed when they click + * an unsubscribe link. + * @param state State of the subscription + * @return This object instance, for method chaining. + */ + public BatchProfileAttributeEditor setEmailMarketingSubscription(@NonNull BatchEmailSubscriptionState state) { + this.profileUpdateOperation.setEmailMarketing(state); + return this; + } + + /** + * Set a custom profile attribute for a key. + * + * @param key Attribute key, can't be null. It should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. + * @param value Attribute value. + * @return This object instance, for method chaining + */ + public BatchProfileAttributeEditor setAttribute(final @NonNull String key, final long value) { + try { + String normalizedKey = ProfileDataHelper.normalizeAttributeKey(key); + this.profileUpdateOperation.addAttribute(normalizedKey, new UserAttribute(value, AttributeType.LONG)); + } catch (AttributeValidationException e) { + e.printErrorMessage(TAG, key); + return this; + } + super.setAttribute(key, value); + return this; + } + + /** + * Set a custom profile attribute for a key. + * + * @param key Attribute key, can't be null. It should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. + * @param value Attribute value. + * @return This object instance, for method chaining + */ + public BatchProfileAttributeEditor setAttribute(final @NonNull String key, final double value) { + try { + String normalizedKey = ProfileDataHelper.normalizeAttributeKey(key); + this.profileUpdateOperation.addAttribute(normalizedKey, new UserAttribute(value, AttributeType.DOUBLE)); + } catch (AttributeValidationException e) { + e.printErrorMessage(TAG, key); + return this; + } + super.setAttribute(key, value); + return this; + } + + /** + * Set a custom profile attribute for a key. + * + * @param key Attribute key, can't be null. It should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. + * @param value Attribute value. + * @return This object instance, for method chaining + */ + public BatchProfileAttributeEditor setAttribute(final @NonNull String key, final boolean value) { + try { + String normalizedKey = ProfileDataHelper.normalizeAttributeKey(key); + this.profileUpdateOperation.addAttribute(normalizedKey, new UserAttribute(value, AttributeType.BOOL)); + } catch (AttributeValidationException e) { + e.printErrorMessage(TAG, key); + return this; + } + super.setAttribute(key, value); + return this; + } + + /** + * Set a custom profile attribute for a key. + * + * @param key Attribute key, can't be null. It should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. + * @param value Attribute value, can't be null. Note that since timezones are not supported, this will typically represent UTC dates. + * @return This object instance, for method chaining + */ + public BatchProfileAttributeEditor setAttribute(final @NonNull String key, @NonNull final Date value) { + try { + ProfileDataHelper.assertNotNull(value); + String normalizedKey = ProfileDataHelper.normalizeAttributeKey(key); + this.profileUpdateOperation.addAttribute(normalizedKey, new UserAttribute(value, AttributeType.DATE)); + } catch (AttributeValidationException e) { + e.printErrorMessage(TAG, key); + return this; + } + super.setAttribute(key, value); + return this; + } + + /** + * Set a custom profile attribute for a key. + * + * @param key Attribute key, can't be null. It should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. + * @param value Attribute value, can't be null or empty. Must be a string not longer than 64 characters. For better results, you should make them upper/lowercase and trim the whitespaces. + * @return This object instance, for method chaining + */ + public BatchProfileAttributeEditor setAttribute(final @NonNull String key, final @NonNull String value) { + try { + ProfileDataHelper.assertNotNull(value); + String normalizedKey = ProfileDataHelper.normalizeAttributeKey(key); + if (ProfileDataHelper.isNotValidStringValue(value)) { + Logger.error( + TAG, + "String attributes can't be null or longer than " + + ProfileDataHelper.ATTR_STRING_MAX_LENGTH + + " characters. Ignoring attribute '" + + key + + "'" + ); + return this; + } + this.profileUpdateOperation.addAttribute(normalizedKey, new UserAttribute(value, AttributeType.STRING)); + } catch (AttributeValidationException e) { + e.printErrorMessage(TAG, key); + return this; + } + super.setAttribute(key, value); + return this; + } + + /** + * Set a custom profile attribute for a key. + * + * @param key Attribute key, can't be null. It should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. + * @param value Attribute value, can't be null or empty. Must be a valid URI not longer than 2048 character. + * @return This object instance, for method chaining + */ + public BatchProfileAttributeEditor setAttribute(final @NonNull String key, final @NonNull URI value) { + try { + ProfileDataHelper.assertNotNull(value); + String normalizedKey = ProfileDataHelper.normalizeAttributeKey(key); + if (ProfileDataHelper.isURITooLong(value)) { + Logger.error( + TAG, + "URL attributes can't be null or longer than " + + ProfileDataHelper.ATTR_URL_MAX_LENGTH + + " characters. Ignoring attribute '" + + key + + "'" + ); + return this; + } + if (ProfileDataHelper.isNotValidURIValue(value)) { + Logger.error( + TAG, + "URL attributes must follow the format 'scheme://[authority][path][?query][#fragment]'. Ignoring attribute '" + + key + + "'" + ); + return this; + } + this.profileUpdateOperation.addAttribute( + normalizedKey, + new UserAttribute(value.toString(), AttributeType.URL) + ); + } catch (AttributeValidationException e) { + e.printErrorMessage(TAG, key); + return this; + } + super.setAttribute(key, value); + return this; + } + + /** + * Set a custom profile attribute for a key. + * + * @param key Attribute key, can't be null. It should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. + * @param value Attribute value, can't be null or empty. Must be a valid List not longer than X items. + * @return This object instance, for method chaining + */ + public BatchProfileAttributeEditor setAttribute(final @NonNull String key, final @NonNull List value) { + try { + String normalizedKey = ProfileDataHelper.normalizeAttributeKey(key); + if (ProfileDataHelper.isNotValidStringArray(value)) { + Logger.error( + TAG, + "Array of string attributes must not be longer than 25 items, only values of type String and must respect the string attribute limitations. Ignoring attribute '" + + key + + "'" + ); + return this; + } + this.profileUpdateOperation.addAttribute( + normalizedKey, + new UserAttribute(new ArrayList<>(value), AttributeType.STRING_ARRAY) + ); + } catch (AttributeValidationException e) { + e.printErrorMessage(TAG, key); + return this; + } + super.clearTagCollection(key); + for (String item : value) { + super.addTag(key, item); + } + return this; + } + + /** + * Removes a custom attribute.
+ * Does nothing if it was not set. + * + * @param key Attribute key + * @return This object instance, for method chaining + */ + public BatchProfileAttributeEditor removeAttribute(@NonNull String key) { + try { + String normalizedKey = ProfileDataHelper.normalizeAttributeKey(key); + this.profileUpdateOperation.removeAttribute(normalizedKey); + } catch (AttributeValidationException e) { + e.printErrorMessage(TAG, key); + return this; + } + // We do both: super.removeAttribute and clearTagCollection since we don't know + // the type for the install-based compat, so we don't know if we should remove + // a tag collection or an attribute. This will not if attribute or collection doesn't exist. + super.removeAttribute(key); + super.clearTagCollection(key); + return this; + } + + /** + * Add a string value in the specified array attribute. If empty, the collection will automatically be created. + * + * @param key The array attribute to add the value to. Cannot be null. Must be a string of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. + * @param value The value to add. Cannot be null or empty. Must be a string no longer than 64 characters. + * @return This object instance, for method chaining + */ + public BatchProfileAttributeEditor addToArray(final @NonNull String key, final @NonNull String value) { + try { + String normalizedKey = ProfileDataHelper.normalizeAttributeKey(key); + if (ProfileDataHelper.isNotValidStringValue(value)) { + Logger.error( + TAG, + "Strings in Array attributes can't be null or longer than " + + ProfileDataHelper.ATTR_STRING_MAX_LENGTH + + " characters. Ignoring attribute '" + + key + + "'" + ); + return this; + } + this.profileUpdateOperation.addToList(normalizedKey, Arrays.asList(value)); + } catch (AttributeValidationException e) { + e.printErrorMessage(TAG, key); + return this; + } + super.addTag(key, value); + return this; + } + + /** + * Add a list of strings in the specified array attribute. If empty, the collection will automatically be created. + * + * @param key The array attribute to add the value to. Cannot be null. Must be a string of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. + * @param values The strings to add. Cannot be null or empty. Must be strings no longer than 64 characters and max 25 items + * @return This object instance, for method chaining + */ + public BatchProfileAttributeEditor addToArray(final @NonNull String key, final @NonNull List values) { + try { + String normalizedKey = ProfileDataHelper.normalizeAttributeKey(key); + if (ProfileDataHelper.isNotValidStringArray(values)) { + Logger.error( + TAG, + "Array of string attributes must not be longer than 25 items, only values of type String and must respect the string attribute limitations. Ignoring attribute '" + + key + + "'" + ); + return this; + } + this.profileUpdateOperation.addToList(normalizedKey, new ArrayList<>(values)); + } catch (AttributeValidationException e) { + e.printErrorMessage(TAG, key); + return this; + } + for (String value : values) { + super.addTag(key, value); + } + return this; + } + + /** + * Removes a string from an array attribute. + * Does nothing if the tag does not exist. + * + * @param key Array attribute name + * @param value The value to remove + * @return This object instance, for method chaining + */ + public BatchProfileAttributeEditor removeFromArray(final @NonNull String key, final @NonNull String value) { + try { + String normalizedKey = ProfileDataHelper.normalizeAttributeKey(key); + if (ProfileDataHelper.isNotValidStringValue(value)) { + Logger.error( + TAG, + "Strings in Array attributes can't be null or longer than " + + ProfileDataHelper.ATTR_STRING_MAX_LENGTH + + " characters. Ignoring attribute '" + + key + + "'" + ); + return this; + } + this.profileUpdateOperation.removeFromList(normalizedKey, new ArrayList<>(Arrays.asList(value))); + } catch (AttributeValidationException e) { + e.printErrorMessage(TAG, key); + return this; + } + super.removeTag(key, value); + return this; + } + + /** + * Removes a list of strings from an array attribute. + * Does nothing if the tag does not exist. + * + * @param key Array attribute name + * @param values The values to remove + * @return This object instance, for method chaining + */ + public BatchProfileAttributeEditor removeFromArray(final @NonNull String key, final @NonNull List values) { + try { + String normalizedKey = ProfileDataHelper.normalizeAttributeKey(key); + if (ProfileDataHelper.isNotValidStringArray(values)) { + Logger.error( + TAG, + "Array of string attributes must not be longer than 25 items, only values of type String and must respect the string attribute limitations. Ignoring attribute '" + + key + + "'" + ); + return this; + } + this.profileUpdateOperation.removeFromList(normalizedKey, values); + } catch (AttributeValidationException e) { + e.printErrorMessage(TAG, key); + return this; + } + for (String value : values) { + super.removeTag(key, value); + } + return this; + } + + /** + * Save all of the pending changes made in that editor. + * Note if Batch is not started, your changes will be enqueue until it start. + * Once you called "save", you need to get a new editor in order to make further changes. + *

+ * This action cannot be undone. + */ + public void save() { + super.save(); + ProfileModuleProvider.get().handleProfileDataChanged(this.profileUpdateOperation); + } +} diff --git a/Sources/sdk/src/main/java/com/batch/android/BatchPushData.java b/Sources/sdk/src/main/java/com/batch/android/BatchPushData.java deleted file mode 100644 index 33179fc..0000000 --- a/Sources/sdk/src/main/java/com/batch/android/BatchPushData.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.batch.android; - -import android.content.Context; -import android.content.Intent; -import com.batch.android.annotation.PublicSDK; -import com.batch.android.core.InternalPushData; - -/** - * Convenience object to retrieve Batch data out of a Batch Push intent - * - * @deprecated Use {@link BatchPushPayload} - */ -@PublicSDK -@Deprecated -public class BatchPushData { - - /** - * Internal push data - */ - private InternalPushData internalPushData; - /** - * Saved application context - */ - private Context context; - - // ------------------------------------------------> - - /** - * Build a BatchPushData object out of a Batch Push intent - * - * @param context context of your application - * @param intent Batch push intent - * @throws NullPointerException if context or intent is null - * @throws IllegalArgumentException if the intent is not a Batch Push one (always check with {@link Batch.Push#isBatchPush(Intent)} ) - */ - public BatchPushData(Context context, Intent intent) { - if (intent == null) { - throw new NullPointerException("intent==null"); - } - - if (context == null) { - throw new NullPointerException("context==null"); - } - - this.context = context.getApplicationContext(); - - internalPushData = InternalPushData.getPushDataForReceiverIntent(intent); - if (internalPushData == null) { - throw new IllegalArgumentException("intent is not a Batch Push one"); - } - } - - // ------------------------------------------------> - - /** - * Does this push contains a deeplink - * - * @return true if this push contains a deeplink, false otherwise - */ - public boolean hasDeeplink() { - return internalPushData.hasScheme(); - } - - /** - * Get the deeplink url contained in this push.
- * You should always check if the push contains a deeplink using {@link #hasDeeplink()} - * - * @return the deeplink if any, null otherwise - */ - public String getDeeplink() { - return internalPushData.getScheme(); - } - - /** - * Does this push contains a custom large icon - * - * @return true if this push contains a custom large icon to download, false otherwise - */ - public boolean hasCustomLargeIcon() { - return internalPushData.hasCustomBigIcon(); - } - - /** - * Get the custom large icon url contained in this push.
- * You should always check if the push contains a custom large icon using {@link #hasCustomLargeIcon()}.
- *
- * The url returned by this method is already optimized for the device, you have to download the image and use it in the notification - * - * @return the custom large icon url if any, null otherwise - */ - public String getCustomLargeIconURL() { - String url = internalPushData.getCustomBigIconURL(); - if (url == null) { - return null; - } - - return ImageDownloadWebservice.buildImageURL(context, url, internalPushData.getCustomBigIconAvailableDensity()); - } - - /** - * Does this push contains a big picture - * - * @return true if this push contains a big picture to download, false otherwise - */ - public boolean hasBigPicture() { - return internalPushData.hasCustomBigImage(); - } - - /** - * Get the big picture url contained in this push.
- * You should always check if the push contains a big picture using {@link #hasBigPicture()}.
- *
- * The url returned by this method is already optimized for the device, you have to download the image and use it in the notification - * - * @return the big picture url if any, null otherwise - */ - public String getBigPictureURL() { - String url = internalPushData.getCustomBigImageURL(); - if (url == null) { - return null; - } - - return ImageDownloadWebservice.buildImageURL( - context, - url, - internalPushData.getCustomBigImageAvailableDensity() - ); - } -} diff --git a/Sources/sdk/src/main/java/com/batch/android/BatchPushInstanceIDService.java b/Sources/sdk/src/main/java/com/batch/android/BatchPushInstanceIDService.java deleted file mode 100644 index d0d0cd8..0000000 --- a/Sources/sdk/src/main/java/com/batch/android/BatchPushInstanceIDService.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.batch.android; - -import com.batch.android.annotation.PublicSDK; -import com.batch.android.di.providers.PushModuleProvider; -import com.google.android.gms.iid.InstanceIDListenerService; - -/** - * Batch's service for handling Google's Instance ID token refresh - * - */ -@PublicSDK -public class BatchPushInstanceIDService extends InstanceIDListenerService { - - @Override - public void onTokenRefresh() { - Batch.onServiceCreate(this, false); - PushModuleProvider.get().refreshRegistration(); - Batch.onServiceDestroy(this); - } -} diff --git a/Sources/sdk/src/main/java/com/batch/android/BatchPushMessageReceiver.java b/Sources/sdk/src/main/java/com/batch/android/BatchPushMessageReceiver.java index fcf39d7..5ec3c06 100644 --- a/Sources/sdk/src/main/java/com/batch/android/BatchPushMessageReceiver.java +++ b/Sources/sdk/src/main/java/com/batch/android/BatchPushMessageReceiver.java @@ -1,17 +1,14 @@ package com.batch.android; -import android.Manifest; import android.annotation.SuppressLint; import android.app.job.JobInfo; import android.app.job.JobScheduler; import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; import android.text.TextUtils; -import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; @@ -48,7 +45,7 @@ public void onReceive(Context context, Intent intent) { if (isFCMMessage(intent)) { final String messageID = getGoogleMessageID(intent); if (isDuplicateMessage(messageID)) { - Logger.info(TAG, "Got a duplicate message_id from FCM, ignoring."); + Logger.info(TAG, "Got a duplicate message_id from FCM: " + messageID + " , ignoring."); return; } if (presentNotification(context, intent)) { diff --git a/Sources/sdk/src/main/java/com/batch/android/BatchPushNotificationPresenter.java b/Sources/sdk/src/main/java/com/batch/android/BatchPushNotificationPresenter.java index 182194f..3fc041c 100644 --- a/Sources/sdk/src/main/java/com/batch/android/BatchPushNotificationPresenter.java +++ b/Sources/sdk/src/main/java/com/batch/android/BatchPushNotificationPresenter.java @@ -78,6 +78,11 @@ public class BatchPushNotificationPresenter { */ private static final int DEFAULT_NO_NOTIFICATION = -100; + /** + * FCM Message ID Key + */ + private static final String GOOGLE_MESSAGE_ID_KEY = "google.message_id"; + static void displayForPush(Context context, Bundle extras) throws NotificationInterceptorRuntimeException { if (extras != null && !extras.isEmpty()) { BatchPushPayload payload; @@ -92,6 +97,9 @@ static void displayForPush(Context context, Bundle extras) throws NotificationIn return; } + String googleMessageId = extras.getString(GOOGLE_MESSAGE_ID_KEY); + Logger.info(TAG, "Batch push received with google message_id: " + googleMessageId); + InternalPushData internalPushData = payload.getInternalData(); if (internalPushData == null) { return; @@ -113,34 +121,10 @@ static void displayForPush(Context context, Bundle extras) throws NotificationIn Logger.internal(TAG, "Ignoring push cause manual display is activated"); return; } - - // If the push is about geofencing, we have to refresh geofences - //TODO: add this to shouldDisplayPush - /*if (internalPushData.isLocalCampainsRefresh()) { - _handleLocalCampaignsSilentPush(context); - }*/ - presentNotification(context, extras, payload, pushModule.getNotificationInterceptor()); } } - /** - * Internal method - */ - private static void _handleLocalCampaignsSilentPush(Context context) { - Context appContext = context.getApplicationContext(); - - // TODO Retry if an Exception is caught or if we fall in onError - // TODO Save campaigns - try { - TaskExecutorProvider - .get(context) - .submit(new LocalCampaignsWebservice(appContext, LocalCampaignsWebserviceListenerImplProvider.get())); - } catch (Exception ex) { - Logger.internal(TAG, "Can't refresh local campaigns. " + ex.toString()); - } - } - /** * Internal method */ @@ -200,7 +184,7 @@ public static void presentNotification( /* * Get title */ - if (title == null || title.length() == 0) { + if (title == null || title.isEmpty()) { try { // Default message title. title = context.getPackageManager().getApplicationLabel(appInfo).toString(); @@ -282,7 +266,7 @@ public static void presentNotification( */ Bitmap bigPicture = null; try { - if (Build.VERSION.SDK_INT >= 16 && batchData.hasCustomBigImage()) { + if (batchData.hasCustomBigImage()) { String cacheID = PushImageCache.buildIdentifierForURL(batchData.getCustomBigImageURL()); Bitmap customBigPicture = PushImageCache.getImageFromCache(context, cacheID); if (customBigPicture == null) { // if cache is null, download it @@ -324,7 +308,7 @@ public static void presentNotification( color = PushModuleProvider.get().getNotificationColor(); } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && color == PushModule.NO_COLOR) { + if (color == PushModule.NO_COLOR) { color = getAppPrimaryColor(context); } @@ -449,14 +433,10 @@ public static void presentNotification( InternalPushData.Format notificationFormat = batchData.getNotificationFormat(); NotificationFormat notificationFormatImpl = null; if (notificationFormat == InternalPushData.Format.APEN) { - if (APENFormat.isSupported()) { - notificationFormatImpl = new APENFormat(title, alert, largeIcon, bigPicture); - Logger.internal(TAG, "Using APEN (ex-news) format"); - if (!ReflectionHelper.optOutOfSmartReply(builder)) { - Logger.internal(TAG, "Cannot opt out of Smart Reply"); - } - } else { - Logger.internal(TAG, "News format has been requested but is unsupported"); + notificationFormatImpl = new APENFormat(title, alert, largeIcon, bigPicture); + Logger.internal(TAG, "Using APEN (ex-news) format"); + if (!ReflectionHelper.optOutOfSmartReply(builder)) { + Logger.internal(TAG, "Cannot opt out of Smart Reply"); } } @@ -691,7 +671,6 @@ private static Integer getMetaDataSmallIconResId(Context context) { return null; } - @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) private static int getAppPrimaryColor(Context context) { TypedValue typedValue = new TypedValue(); ContextThemeWrapper cw = new ContextThemeWrapper(context, context.getApplicationInfo().theme); diff --git a/Sources/sdk/src/main/java/com/batch/android/BatchPushPayload.java b/Sources/sdk/src/main/java/com/batch/android/BatchPushPayload.java index 2aa41da..c0d9d39 100644 --- a/Sources/sdk/src/main/java/com/batch/android/BatchPushPayload.java +++ b/Sources/sdk/src/main/java/com/batch/android/BatchPushPayload.java @@ -294,18 +294,6 @@ public List getActions() { return actions != null ? actions : new ArrayList<>(); } - /** - * Get the notification priority - *

- * This integer value is the same one as priorities defined in {@link androidx.core.app.NotificationCompat} - * - * @deprecated Since Android 8.0, "priority" became "importance", and is now set on the channel itself. You should infer the priority from the channel, using {@link #getChannel()} - */ - @Deprecated - public int getPriority() { - return internalPushData.getPriority().toSupportPriority(); - } - /** * Get the notification group name. Meant to be used with {@link androidx.core.app.NotificationCompat.Builder#setGroup(String)} * diff --git a/Sources/sdk/src/main/java/com/batch/android/BatchPushReceiver.java b/Sources/sdk/src/main/java/com/batch/android/BatchPushReceiver.java deleted file mode 100644 index 43698c5..0000000 --- a/Sources/sdk/src/main/java/com/batch/android/BatchPushReceiver.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.batch.android; - -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import com.batch.android.annotation.PublicSDK; -import com.batch.android.compat.WakefulBroadcastReceiver; -import com.batch.android.core.Logger; -import com.batch.android.module.PushModule; - -/** - * Batch's legacy implementation of GCM's Push BroadcastReceiver - * - */ -@PublicSDK -public class BatchPushReceiver extends WakefulBroadcastReceiver { - - @Override - public void onReceive(Context context, Intent intent) { - Logger.internal( - PushModule.TAG, - "BatchPushReceiver called. Disabling the broadcast receiver from the PackageManager." - ); - // Ask the package manager to disable ourselves - try { - final ComponentName selfComponent = new ComponentName(context, BatchPushReceiver.class); - context - .getPackageManager() - .setComponentEnabledSetting( - selfComponent, - PackageManager.COMPONENT_ENABLED_STATE_DISABLED, - PackageManager.DONT_KILL_APP - ); - } catch (Exception e) { - Logger.error(PushModule.TAG, "Could not disable BatchPushReceiver."); - Logger.internal(PushModule.TAG, "Could not disable BatchPushReceiver.", e); - } - } -} diff --git a/Sources/sdk/src/main/java/com/batch/android/BatchPushRegistration.java b/Sources/sdk/src/main/java/com/batch/android/BatchPushRegistration.java new file mode 100644 index 0000000..eaa1b3b --- /dev/null +++ b/Sources/sdk/src/main/java/com/batch/android/BatchPushRegistration.java @@ -0,0 +1,92 @@ +package com.batch.android; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.batch.android.annotation.PublicSDK; + +/** + * Class holding the push registration information. + */ +@PublicSDK +public class BatchPushRegistration { + + /** + * The Push registration provider. Might be FCM-Token or HMS. + */ + @NonNull + private final String provider; + + /** + * The Push registration identifier (Push Token). + */ + @NonNull + private final String registrationID; + + /** + * The Sender ID of the provider, or equivalent. For example: "8122930293" + * Also known as the GCP Project Number + */ + @Nullable + private final String senderID; + + /** + * The GCP Project ID. For example "batch_sample". + * Not to be confused with Sender ID, which is the Project Number. (FCM only) + */ + @Nullable + private final String gcpProjectID; + + public BatchPushRegistration( + @NonNull String provider, + @NonNull String registrationID, + @Nullable String senderID, + @Nullable String gcpProjectID + ) { + this.provider = provider; + this.registrationID = registrationID; + this.senderID = senderID; + this.gcpProjectID = gcpProjectID; + } + + /** + * Get the Push registration provider. Might be FCM-Token or HMS. + * + * @return The Push registration provider. Might be FCM-Token or HMS. + */ + @NonNull + public String getProvider() { + return provider; + } + + /** + * Get the registration Push Token (also known as registration id). + * + * @return The Push Token. + */ + @NonNull + public String getToken() { + return registrationID; + } + + /** + * The Sender ID of the provider, or equivalent. Also known as the GCP Project Number. + * For example: "8122930293" + * + * @return The Sender ID of the provider or null. + */ + @Nullable + public String getSenderID() { + return senderID; + } + + /** + * The GCP Project ID. For example "batch_sample". + * Not to be confused with Sender ID, which is the Project Number. (FCM only) + * + * @return he GCP Project ID or null. + */ + @Nullable + public String getGcpProjectID() { + return gcpProjectID; + } +} diff --git a/Sources/sdk/src/main/java/com/batch/android/BatchPushService.java b/Sources/sdk/src/main/java/com/batch/android/BatchPushService.java index 68f0bbd..3910435 100644 --- a/Sources/sdk/src/main/java/com/batch/android/BatchPushService.java +++ b/Sources/sdk/src/main/java/com/batch/android/BatchPushService.java @@ -35,7 +35,7 @@ protected void onHandleIntent(Intent intent) { Logger.internal(TAG, "Error while handing notification", e); } finally { // Release the wake lock provided by the WakefulBroadcastReceiver. - BatchPushReceiver.completeWakefulIntent(intent); + BatchPushMessageReceiver.completeWakefulIntent(intent); } } } diff --git a/Sources/sdk/src/main/java/com/batch/android/BatchQueryWebservice.java b/Sources/sdk/src/main/java/com/batch/android/BatchQueryWebservice.java index 0f00bf0..1153b9f 100644 --- a/Sources/sdk/src/main/java/com/batch/android/BatchQueryWebservice.java +++ b/Sources/sdk/src/main/java/com/batch/android/BatchQueryWebservice.java @@ -2,7 +2,6 @@ import android.content.Context; import com.batch.android.core.Logger; -import com.batch.android.di.providers.WebserviceMetricsProvider; import com.batch.android.json.JSONArray; import com.batch.android.json.JSONException; import com.batch.android.json.JSONObject; @@ -40,8 +39,6 @@ abstract class BatchQueryWebservice extends BatchWebservice { */ private List responses; - protected WebserviceMetrics webserviceMetrics; - // -------------------------------------------> /** @@ -54,7 +51,6 @@ abstract class BatchQueryWebservice extends BatchWebservice { protected BatchQueryWebservice(Context context, RequestType type, String baseURLFormat, String... parameters) throws MalformedURLException { super(context, type, baseURLFormat, parameters); - this.webserviceMetrics = WebserviceMetricsProvider.get(); } // -------------------------------------------> @@ -123,11 +119,6 @@ protected void parseResponse(JSONObject jsonResponse) throws JSONException, Ille */ handleParameters(jsonResponse); - /* - * Register server id (i) - */ - handleServerID(jsonResponse); - /* * Parse response to retrieve responses for queries */ diff --git a/Sources/sdk/src/main/java/com/batch/android/BatchUserDataEditor.java b/Sources/sdk/src/main/java/com/batch/android/BatchUserDataEditor.java deleted file mode 100644 index 156c30f..0000000 --- a/Sources/sdk/src/main/java/com/batch/android/BatchUserDataEditor.java +++ /dev/null @@ -1,654 +0,0 @@ -package com.batch.android; - -import android.content.Context; -import android.text.TextUtils; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import com.batch.android.annotation.PublicSDK; -import com.batch.android.core.GenericHelper; -import com.batch.android.core.Logger; -import com.batch.android.core.Promise; -import com.batch.android.di.providers.RuntimeManagerProvider; -import com.batch.android.di.providers.UserModuleProvider; -import com.batch.android.module.UserModule; -import com.batch.android.user.EmailSubscription; -import com.batch.android.user.SQLUserDatasource; -import com.batch.android.user.UserOperation; -import com.batch.android.user.UserOperationQueue; -import java.net.URI; -import java.util.Arrays; -import java.util.Date; -import java.util.List; -import java.util.Locale; -import java.util.Objects; -import java.util.regex.Pattern; - -/** - * Batch User data editor - */ -@PublicSDK -public class BatchUserDataEditor { - - /** - * @hide - */ - public static final String TAG = "BatchUserDataEditor"; - static final Pattern ATTR_KEY_PATTERN = Pattern.compile("^[a-zA-Z0-9_]{1,30}$"); - static final String ATTRIBUTION_ID_FORMAT = "[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}"; - private static final int LANGUAGE_INDEX = 0; - private static final int REGION_INDEX = 1; - private static final int IDENTIFIER_INDEX = 2; - private static final int ATTR_STRING_MAX_LENGTH = 64; // Also applies to tag values - private static final int ATTR_URL_MAX_LENGTH = 2048; - private static final int EMAIL_MAX_LENGTH = 128; - private final UserOperationQueue operationQueue = new UserOperationQueue(); - private boolean[] updatedFields = { false, false, false }; - private String[] userFields = { null, null, null }; - private EmailSubscription emailSubscription; - - BatchUserDataEditor() {} - - //region Public API - - /** - * Set the language of this user.
- * Overrides the detected user language. - * - * @param language lowercase, ISO 639 formatted string. null to reset. - * @return This object instance, for method chaining - */ - public BatchUserDataEditor setLanguage(final @Nullable String language) { - if (language != null && language.trim().length() < 2) { - Logger.error(TAG, "setLanguage called with invalid language (must be at least 2 chars)"); - return this; - } - - this.userFields[LANGUAGE_INDEX] = language; - this.updatedFields[LANGUAGE_INDEX] = true; - return this; - } - - /** - * Set the region of this user.
- * Overrides the detected user region. - * - * @param region uppercase, ISO 3166 formatted string. null to reset. - * @return This object instance, for method chaining - */ - public BatchUserDataEditor setRegion(final @Nullable String region) { - if (region != null && region.trim().length() < 2) { - Logger.error(TAG, "setRegion called with invalid region (must be at least 2 chars)"); - return this; - } - - this.userFields[REGION_INDEX] = region; - this.updatedFields[REGION_INDEX] = true; - return this; - } - - /** - * Set the user identifier.
- * Be careful: you should make sure the identifier uniquely identifies a user. When pushing an identifier, all installations with that identifier will get the Push, which can cause some privacy issues if done wrong. - * - * @param identifier Identifier string - * @return This object instance, for method chaining - */ - public BatchUserDataEditor setIdentifier(final @Nullable String identifier) { - if (identifier != null && identifier.trim().length() > 1024) { - Logger.error(TAG, "setIdentifier called with invalid identifier (must be less than 1024 chars)"); - return this; - } - - this.userFields[IDENTIFIER_INDEX] = identifier; - this.updatedFields[IDENTIFIER_INDEX] = true; - return this; - } - - /** - * Set the user attribution identifier.
- * - * @param attributionID A valid uuid lowercase string or null to reset - * @return This object instance, for method chaining - */ - public BatchUserDataEditor setAttributionIdentifier(final @Nullable String attributionID) { - if (attributionID != null && !Pattern.matches(ATTRIBUTION_ID_FORMAT, attributionID)) { - Logger.error( - TAG, - "setAttributionIdentifier called with invalid identifier. Should be a valid uuid lowercase string" - ); - return this; - } - - operationQueue.addFirstOperation(datasource -> { - Context context = RuntimeManagerProvider.get().getContext(); - if (context == null) { - throw new UserModule.SaveException( - "Error while applying. Make sure Batch is started beforehand, and not globally opted out from.", - "'context' was null while saving." - ); - } - User user = Batch.getUser(); - String oldAttributionID = user.getAttributionID(); - user.setAttributionID(attributionID); - if (!Objects.equals(oldAttributionID, attributionID)) { - user.sendAttributionIDChangedEvent(); - } - }); - return this; - } - - /** - * Set the user email. - * - * Note: This method requires to already have a registered identifier for the user - * or to call {@link BatchUserDataEditor#setIdentifier} method before this one. - * @param email Email string - * @return This object instance, for method chaining. - */ - public BatchUserDataEditor setEmail(final @Nullable String email) { - Context context = RuntimeManagerProvider.get().getContext(); - if (context == null) { - Logger.warning(TAG, "Batch does not have a context yet. Make sure Batch is started beforehand."); - return this; - } - - // Ensure we already have a custom user identifier - // or setIdentifier has been previously called in this editor instance - if ( - Batch.User.getIdentifier(context) == null && - ( - !updatedFields[IDENTIFIER_INDEX] || - (updatedFields[IDENTIFIER_INDEX] && userFields[IDENTIFIER_INDEX] == null) - ) - ) { - Logger.error( - TAG, - "setEmail called whereas identifier is null. Please ensure to call setIdentifier before using this method." - ); - return this; - } - - // Deleting email case - if (email == null) { - if (emailSubscription == null) { - emailSubscription = new EmailSubscription(null); - } else { - emailSubscription.setEmail(null); - } - return this; - } - - // Ensure email is not too long - if (email.length() > EMAIL_MAX_LENGTH) { - Logger.error(TAG, "Email can't be longer than " + EMAIL_MAX_LENGTH + " characters. Ignoring."); - return this; - } - - // Ensure email has the right format - if (!GenericHelper.isValidEmail(email)) { - Logger.error( - TAG, - "setEmail called with invalid email format." + - " Please ensure to respect the following regex: .@.\\..* " - ); - return this; - } - - if (emailSubscription == null) { - emailSubscription = new EmailSubscription(email.trim()); - } else { - emailSubscription.setEmail(email.trim()); - } - return this; - } - - /** - * Set the user email marketing subscription state. - * - * @param state State of the subscription - * @return This object instance, for method chaining. - */ - public BatchUserDataEditor setEmailMarketingSubscriptionState(@NonNull BatchEmailSubscriptionState state) { - if (emailSubscription == null) { - emailSubscription = new EmailSubscription(); - } - emailSubscription.addSubscription(EmailSubscription.Kind.MARKETING, state); - return this; - } - - /** - * Set a custom user attribute for a key. - * - * @param key Attribute key, can't be null. It should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. - * @param value Attribute value. - * @return This object instance, for method chaining - */ - public BatchUserDataEditor setAttribute(final @NonNull String key, final long value) { - final String normalizedKey; - try { - normalizedKey = normalizeAttributeKey(key); - } catch (AttributeValidationException e) { - return this; - } - operationQueue.addOperation(datasource -> datasource.setAttribute(normalizedKey, value)); - return this; - } - - /** - * Set a custom user attribute for a key. - * - * @param key Attribute key, can't be null. It should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. - * @param value Attribute value. - * @return This object instance, for method chaining - */ - public BatchUserDataEditor setAttribute(final @NonNull String key, final double value) { - final String normalizedKey; - try { - normalizedKey = normalizeAttributeKey(key); - } catch (AttributeValidationException e) { - return this; - } - - operationQueue.addOperation(datasource -> datasource.setAttribute(normalizedKey, value)); - return this; - } - - /** - * Set a custom user attribute for a key. - * - * @param key Attribute key, can't be null. It should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. - * @param value Attribute value. - * @return This object instance, for method chaining - */ - public BatchUserDataEditor setAttribute(final @NonNull String key, final boolean value) { - final String normalizedKey; - try { - normalizedKey = normalizeAttributeKey(key); - } catch (AttributeValidationException e) { - return this; - } - operationQueue.addOperation(datasource -> datasource.setAttribute(normalizedKey, value)); - return this; - } - - /** - * Set a custom user attribute for a key. - * - * @param key Attribute key, can't be null. It should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. - * @param value Attribute value, can't be null. Note that since timezones are not supported, this will typically represent UTC dates. - * @return This object instance, for method chaining - */ - public BatchUserDataEditor setAttribute(final @NonNull String key, @NonNull Date value) { - final String normalizedKey; - try { - normalizedKey = normalizeAttributeKey(key); - } catch (AttributeValidationException e) { - return this; - } - - //noinspection ConstantConditions - if (value == null) { - Logger.error(TAG, "setAttribute cannot be used with a null value. Ignoring attribute '" + key + "'"); - return this; - } - - // Dates are mutable! - final Date date = (Date) value.clone(); - - synchronized (operationQueue) { - operationQueue.addOperation(datasource -> datasource.setAttribute(normalizedKey, date)); - } - - return this; - } - - /** - * Set a custom user attribute for a key. - * - * @param key Attribute key, can't be null. It should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. - * @param value Attribute value, can't be null or empty. Must be a string not longer than 64 characters. For better results, you should make them upper/lowercase and trim the whitespaces. - * @return This object instance, for method chaining - */ - public BatchUserDataEditor setAttribute(final @NonNull String key, final @NonNull String value) { - final String normalizedKey; - try { - normalizedKey = normalizeAttributeKey(key); - } catch (AttributeValidationException e) { - return this; - } - - //noinspection ConstantConditions - if (value == null || value.length() > ATTR_STRING_MAX_LENGTH) { - Logger.error( - TAG, - "String attributes can't be null or longer than " + - ATTR_STRING_MAX_LENGTH + - " characters. Ignoring attribute '" + - key + - "'" - ); - return this; - } - operationQueue.addOperation(datasource -> datasource.setAttribute(normalizedKey, value)); - return this; - } - - /** - * Set a custom user attribute for a key. - * - * @param key Attribute key, can't be null. It should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. - * @param value Attribute value, can't be null or empty. Must be a valid URI not longer than 2048 character. - * @return This object instance, for method chaining - */ - public BatchUserDataEditor setAttribute(final @NonNull String key, final @NonNull URI value) { - final String normalizedKey; - try { - normalizedKey = normalizeAttributeKey(key); - } catch (AttributeValidationException e) { - return this; - } - - //noinspection ConstantConditions - if (value == null || value.toString().length() > ATTR_URL_MAX_LENGTH) { - Logger.error( - TAG, - "URL attributes can't be null or longer than " + - ATTR_URL_MAX_LENGTH + - " characters. Ignoring attribute '" + - key + - "'" - ); - return this; - } - if (value.getScheme() == null || value.getAuthority() == null) { - Logger.error( - TAG, - "URL attributes must follow the format 'scheme://[authority][path][?query][#fragment]'. Ignoring attribute '" + - key + - "'" - ); - return this; - } - - operationQueue.addOperation(datasource -> datasource.setAttribute(normalizedKey, value)); - return this; - } - - /** - * Removes a custom attribute.
- * Does nothing if it was not set. - * - * @param key Attribute key - * @return This object instance, for method chaining - */ - public BatchUserDataEditor removeAttribute(@NonNull String key) { - final String normalizedKey; - try { - normalizedKey = normalizeAttributeKey(key); - } catch (AttributeValidationException e) { - return this; - } - operationQueue.addOperation(datasource -> datasource.removeAttribute(normalizedKey)); - return this; - } - - /** - * Removes all attributes. - * - * @return This object instance, for method chaining - */ - public BatchUserDataEditor clearAttributes() { - operationQueue.addOperation(SQLUserDatasource::clearAttributes); - return this; - } - - /** - * Add a tag in the specified collection. If empty, the collection will automatically be created. - * - * @param collection The collection to add the tag to. Cannot be null. Must be a string of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. - * @param tag The tag to add. Cannot be null or empty. Must be a string no longer than 64 characters. - * @return This object instance, for method chaining - */ - public BatchUserDataEditor addTag(final @NonNull String collection, final @NonNull String tag) { - final String normalizedCollection; - final String normalizedValue; - try { - normalizedCollection = normalizeTagCollection(collection); - } catch (AttributeValidationException e) { - Logger.error( - TAG, - String.format( - "Invalid collection. Please make sure that the collection is made of letters, underscores and numbers only (a-zA-Z0-9_). It also can't be longer than 30 characters. Ignoring tag '%s' for collection '%s'.", - collection, - tag - ) - ); - return this; - } - try { - normalizedValue = normalizeTagValue(tag); - } catch (AttributeValidationException e) { - Logger.error( - TAG, - String.format( - "Invalid tag. Please make sure that the tag is made of letters, underscores and numbers only (a-zA-Z0-9_). It also can't be longer than 255 characters. Ignoring tag '%s' for collection '%s'.", - collection, - tag - ) - ); - return this; - } - - operationQueue.addOperation(datasource -> datasource.addTag(normalizedCollection, normalizedValue)); - return this; - } - - /** - * Removes a tag from a collection. - * Does nothing if the tag does not exist. - * - * @param collection Collection name - * @param tag Tag name - * @return This object instance, for method chaining - */ - public BatchUserDataEditor removeTag(final @NonNull String collection, final @NonNull String tag) { - final String normalizedCollection; - final String normalizedValue; - try { - normalizedCollection = normalizeTagCollection(collection); - } catch (AttributeValidationException e) { - Logger.error( - TAG, - String.format( - "Invalid collection. Please make sure that the collection is made of letters, underscores and numbers only (a-zA-Z0-9_). It also can't be longer than 30 characters. Ignoring tag '%s' for collection '%s'.", - collection, - tag - ) - ); - return this; - } - try { - normalizedValue = normalizeTagValue(tag); - } catch (AttributeValidationException e) { - Logger.error( - TAG, - String.format( - "Invalid tag. Please make sure that the tag is made of letters, underscores and numbers only (a-zA-Z0-9_). It also can't be longer than 255 characters. Ignoring tag '%s' for collection '%s'.", - collection, - tag - ) - ); - return this; - } - operationQueue.addOperation(datasource -> datasource.removeTag(normalizedCollection, normalizedValue)); - return this; - } - - /** - * Removes all tags. - * - * @return This object instance, for method chaining - */ - public BatchUserDataEditor clearTags() { - operationQueue.addOperation(SQLUserDatasource::clearTags); - return this; - } - - /** - * Removes all tags from a collection. - * Does nothing if the tag collection does not exist. - * - * @param collection Tag collection. - * @return This object instance, for method chaining - */ - public BatchUserDataEditor clearTagCollection(final @NonNull String collection) { - try { - final String normalizedCollection = normalizeTagCollection(collection); - operationQueue.addOperation(datasource -> datasource.clearTags(normalizedCollection)); - } catch (AttributeValidationException e) { - Logger.error( - TAG, - String.format("Invalid tag collection. Ignoring tag collection clear request '%s' .", collection) - ); - return this; - } - return this; - } - - /** - * Save all of the pending changes made in that editor. - * Note if Batch is not started, your changes will be enqueue until it start. - * Once you called "save", you need to get a new editor in order to make further changes. - *

- * This action cannot be undone. - */ - public void save() { - final List pendingOperationQueue = popOperationQueue(); - UserModuleProvider.get().addOperationQueueAndSubmit(500, new UserOperationQueue(pendingOperationQueue)); - } - - Promise saveSync() { - final Promise promise = new Promise<>(); - final List pendingOperationQueue = popOperationQueue(); - Runnable runnable = () -> { - try { - UserModule.applyUserOperationsSync(pendingOperationQueue); - promise.resolve(null); - } catch (UserModule.SaveException e) { - Logger.error(TAG, e.getMessage()); - promise.reject(e); - } - }; - runnable.run(); - return promise; - } - - //endregion - - //region Private helpers - - private String normalizeAttributeKey(final String key) throws AttributeValidationException { - if (TextUtils.isEmpty(key) || !ATTR_KEY_PATTERN.matcher(key).matches()) { - Logger.error( - TAG, - "Invalid key. Please make sure that the key is made of letters, underscores and numbers only (a-zA-Z0-9_). It also can't be longer than 30 characters. Ignoring attribute '" + - key + - "'." - ); - throw new AttributeValidationException(); - } - - return key.toLowerCase(Locale.US); - } - - private String normalizeTagCollection(final String collection) throws AttributeValidationException { - if (TextUtils.isEmpty(collection) || !ATTR_KEY_PATTERN.matcher(collection).matches()) { - throw new AttributeValidationException(); - } - - return collection.toLowerCase(Locale.US); - } - - private String normalizeTagValue(final String value) throws AttributeValidationException { - if (TextUtils.isEmpty(value) || value.length() > ATTR_STRING_MAX_LENGTH) { - throw new AttributeValidationException(); - } - - return value.toLowerCase(Locale.US); - } - - @Nullable - private UserOperation getEmailUpdateOperation() { - if (emailSubscription == null) { - return null; - } - return datasource -> { - emailSubscription.sendEmailSubscriptionEvent(); - }; - } - - @Nullable - private UserOperation getUserUpdateOperation() { - if (!updatedFields[LANGUAGE_INDEX] && !updatedFields[REGION_INDEX] && !updatedFields[IDENTIFIER_INDEX]) { - // Nothing to do - return null; - } - - return datasource -> { - Context context = RuntimeManagerProvider.get().getContext(); - if (context == null) { - throw new UserModule.SaveException( - "Error while applying. Make sure Batch is started beforehand, and not globally opted out from.", - "'context' was null while saving." - ); - } - - String[] previousUserFields = new String[] { - Batch.User.getLanguage(context), - Batch.User.getRegion(context), - Batch.User.getIdentifier(context), - }; - - final User user = new User(context); - if (updatedFields[LANGUAGE_INDEX]) { - user.setLanguage(userFields[LANGUAGE_INDEX]); - } - - if (updatedFields[REGION_INDEX]) { - user.setRegion(userFields[REGION_INDEX]); - } - - if (updatedFields[IDENTIFIER_INDEX]) { - user.setCustomID(userFields[IDENTIFIER_INDEX]); - } - - if (!Arrays.equals(userFields, previousUserFields)) { - // At least one field has changed, we send new version of data - user.sendChangeEvent(); - } - }; - } - - private List popOperationQueue() { - final List pendingOperationQueue = operationQueue.popOperations(); - UserOperation userUpdateOperation = getUserUpdateOperation(); - if (userUpdateOperation != null) { - pendingOperationQueue.add(0, userUpdateOperation); - } - - UserOperation emailUpdateOperation = getEmailUpdateOperation(); - if (emailUpdateOperation != null) { - pendingOperationQueue.add(emailUpdateOperation); - } - - return pendingOperationQueue; - } - - private static final class AttributeValidationException extends Exception { - - public AttributeValidationException() { - super(); - } - } - //endregion -} diff --git a/Sources/sdk/src/main/java/com/batch/android/BatchUserProfile.java b/Sources/sdk/src/main/java/com/batch/android/BatchUserProfile.java deleted file mode 100644 index f63034c..0000000 --- a/Sources/sdk/src/main/java/com/batch/android/BatchUserProfile.java +++ /dev/null @@ -1,145 +0,0 @@ -package com.batch.android; - -import android.content.Context; -import android.text.TextUtils; -import com.batch.android.annotation.PublicSDK; - -/** - * User profile that contains user specific targeting data - * - * @deprecated Please use Batch.User methods instead - */ -@PublicSDK -@Deprecated -public final class BatchUserProfile { - - /** - * Saved context - */ - private Context context; - - // ---------------------------------------------> - - /** - * @param context - */ - BatchUserProfile(Context context) { - if (context == null) { - throw new NullPointerException("context==null"); - } - this.context = context; - } - - // ----------------------------------------------> - - /** - * Set the language of this user.
- * Setting this will affect targeting of this user, use it only if you know what you're doing. - * - * @param language a string that represent a locale language (ex: fr, en, pt, ru etc...) - * @return - * @deprecated Please use Batch.User methods instead - */ - @Deprecated - public BatchUserProfile setLanguage(String language) { - Batch.User.editor().setLanguage(language).saveSync(); - return this; - } - - /** - * Get the current language of this user.
- * If you set a custom one using {@link #setLanguage(String)} this method will return this one - * otherwise it will return the device default. - * - * @return - * @deprecated Please use Batch.User methods instead - */ - @Deprecated - public String getLanguage() { - return Batch.User.getLanguage(context); - } - - /** - * Did the user have a custom language - * - * @return - */ - boolean hasCustomLanguage() { - return !TextUtils.isEmpty(Batch.User.getLanguage(context)); - } - - /** - * Set the region (country) of this user.
- * Setting this will affect targeting of this user, use it only if you know what you're doing. - * - * @param region a string that represent a locale region (country) (ex: FR, US, BR, RU etc...) - * @return - * @deprecated Please use Batch.User methods instead - */ - @Deprecated - public BatchUserProfile setRegion(String region) { - Batch.User.editor().setRegion(region).saveSync(); - return this; - } - - /** - * Get the current region of this user.
- * If you set a custom one using {@link #setRegion(String)} this method will return this one - * otherwise it will return the device default. - * - * @return - * @deprecated Please use Batch.User methods instead - */ - @Deprecated - public String getRegion() { - return Batch.User.getRegion(context); - } - - /** - * Did the user have a custom region - * - * @return - * @deprecated Please use Batch.User methods instead - */ - @Deprecated - boolean hasCustomRegion() { - return !TextUtils.isEmpty(Batch.User.getRegion(context)); - } - - /** - * Set the custom user identifier to Batch.
- * You should use this method if you have your own login system.
- *
- * Be carefull : Do not use it if you don't know what you are doing, - * giving a bad custom user ID can result in failure into offer delivery and restore
- * - * @param customID - * @deprecated Please use Batch.User methods instead - */ - @Deprecated - public BatchUserProfile setCustomID(String customID) { - Batch.User.editor().setIdentifier(customID).saveSync(); - return this; - } - - /** - * Return the custom ID of the user if you specified any using the {@link #setCustomID(String)} - * - * @return customID if any, null otherwise - * @deprecated Please use Batch.User methods instead - */ - @Deprecated - public String getCustomID() { - return Batch.User.getIdentifier(context); - } - - /** - * Get the data version - * - * @return - * @deprecated Please use Batch.User methods instead - */ - long getVersion() { - return new com.batch.android.User(context).getVersion(); - } -} diff --git a/Sources/sdk/src/main/java/com/batch/android/BatchWebservice.java b/Sources/sdk/src/main/java/com/batch/android/BatchWebservice.java index fe3d982..bf8f7dc 100644 --- a/Sources/sdk/src/main/java/com/batch/android/BatchWebservice.java +++ b/Sources/sdk/src/main/java/com/batch/android/BatchWebservice.java @@ -2,24 +2,26 @@ import android.content.Context; import android.text.TextUtils; -import com.batch.android.WebserviceMetrics.Metric; import com.batch.android.core.Logger; import com.batch.android.core.ParameterKeys; import com.batch.android.core.Parameters; -import com.batch.android.core.SystemParameterHelper; import com.batch.android.core.Webservice; import com.batch.android.core.WebserviceErrorCause; +import com.batch.android.core.systemparameters.SystemParameter; +import com.batch.android.core.systemparameters.SystemParameterHelper; +import com.batch.android.core.systemparameters.SystemParameterRegistry; import com.batch.android.di.providers.ParametersProvider; -import com.batch.android.di.providers.WebserviceMetricsProvider; +import com.batch.android.di.providers.SystemParameterRegistryProvider; +import com.batch.android.di.providers.UserModuleProvider; import com.batch.android.json.JSONArray; import com.batch.android.json.JSONObject; +import com.batch.android.module.UserModule; import com.batch.android.post.JSONPostDataProvider; import com.batch.android.post.PostDataProvider; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Map; /** * Batch webservice that extends {@link Webservice} and can access {@link SystemParameterHelper}.
@@ -50,7 +52,7 @@ public abstract class BatchWebservice extends Webservice { protected BatchWebservice(Context context, RequestType type, String baseURLFormat, String... parameters) throws MalformedURLException { super(context, type, baseURLFormat, addBatchApiKey(parameters)); - // Add property parameters if needeed + // Add property parameters if needed addPropertyParameters(); } @@ -124,9 +126,9 @@ protected PostDataProvider getPostDataProvider() { * Add user data if any */ try { - User user = new User(applicationContext); - String language = user.getLanguage(); - String region = user.getRegion(); + UserModule userModule = UserModuleProvider.get(); + String language = userModule.getLanguage(applicationContext); + String region = userModule.getRegion(applicationContext); if (!TextUtils.isEmpty(language) || !TextUtils.isEmpty(region)) { JSONObject upr = new JSONObject(); @@ -139,38 +141,12 @@ protected PostDataProvider getPostDataProvider() { upr.put("ure", region); } - upr.put("upv", user.getVersion()); + upr.put("upv", userModule.getVersion(applicationContext)); body.put("upr", upr); } } catch (Exception e) { Logger.internal(TAG, "Error while adding upr to body", e); } - - /* - * Add metrics if any - */ - try { - Map metrics = WebserviceMetricsProvider.get().getMetrics(); - if (metrics != null && !metrics.isEmpty()) { - JSONArray metricsJSON = new JSONArray(); - - for (String wsShortName : metrics.keySet()) { - Metric metric = metrics.get(wsShortName); - - JSONObject metricJSON = new JSONObject(); - metricJSON.put("u", wsShortName); - metricJSON.put("s", metric.success); - metricJSON.put("t", metric.time); - - metricsJSON.put(metricJSON); - } - - body.put("metrics", metricsJSON); - } - } catch (Exception e) { - Logger.internal(TAG, "Error while adding metrics to the body", e); - } - return new JSONPostDataProvider(body); } @@ -191,30 +167,36 @@ protected void onRetry(WebserviceErrorCause cause) { private void addPropertyParameters() { try { String parameterKey = getPropertyParameterKey(); - if (parameterKey != null && parameterKey.length() > 0) { + if (parameterKey != null && !parameterKey.isEmpty()) { // Retrieve value from the given key. String value = ParametersProvider.get(applicationContext).get(parameterKey); - if (value == null || value.length() == 0) { + if (value == null || value.isEmpty()) { return; } // Build the list. List list = new ArrayList<>(Arrays.asList(value.split(","))); - if (list == null || list.size() == 0) { + if (list.isEmpty()) { return; } // Add available data. + SystemParameterRegistry systemParameterRegistry = SystemParameterRegistryProvider.get( + applicationContext + ); for (String string : list) { // Parameters String data = ParametersProvider.get(applicationContext).get(string); // System parameters - if (data == null || data.length() == 0) { - data = SystemParameterHelper.getValue(string, applicationContext); + if (data == null || data.isEmpty()) { + SystemParameter parameter = systemParameterRegistry.getSystemParamByShortname(string); + if (parameter != null) { + data = parameter.getValue(); + } } - if (data == null || data.length() == 0) { + if (data == null || data.isEmpty()) { Logger.internal(TAG, "Unable to find parameter value for key " + string); continue; } @@ -276,25 +258,6 @@ protected void handleParameters(JSONObject body) { } } - /** - * Read server id from ws response - * - * @param body - */ - protected void handleServerID(JSONObject body) { - if (body == null) { - throw new NullPointerException("Null body json"); - } - - try { - if (body.has("i") && !body.isNull("i")) { - ParametersProvider.get(applicationContext).set(ParameterKeys.SERVER_ID_KEY, body.getString("i"), true); - } - } catch (Exception e) { - Logger.internal(TAG, "Error while reading server id into WS response", e); - } - } - // ----------------------------------------> /** diff --git a/Sources/sdk/src/main/java/com/batch/android/Config.java b/Sources/sdk/src/main/java/com/batch/android/Config.java deleted file mode 100644 index fb12004..0000000 --- a/Sources/sdk/src/main/java/com/batch/android/Config.java +++ /dev/null @@ -1,135 +0,0 @@ -package com.batch.android; - -import com.batch.android.annotation.PublicSDK; - -/** - * Class to build a configuration for Batch SDK - * - */ -@PublicSDK -public final class Config { - - /** - * The API key used for Batch - */ - String apikey; - - /** - * Should Batch use advanced device information or not - */ - boolean shouldUseAdvancedDeviceInformation = true; - /** - * Should Batch use the Play Services Instance ID API (if available), or fallback to classic GCM. - */ - boolean shouldUseGoogleInstanceID = true; - - /** - * Should Batch send Logs to a 3rd party class - */ - LoggerDelegate loggerDelegate = null; - /** - * Level of log Batch should use - */ - LoggerLevel loggerLevel = LoggerLevel.INFO; - - // -----------------------------------------> - - /** - * @param apikey - */ - public Config(String apikey) { - this.apikey = apikey; - } - - // -----------------------------------------> - - /** - * Method kept for compatibility: Batch will not use the Android ID in any situation - * - * @deprecated No replacement. - */ - @Deprecated - public Config setCanUseAndroidID(boolean canUse) { - return this; - } - - /** - * Batch doesn't support Android Advertising Identifier anymore. - * @param canUse This parameter does nothing. - * @deprecated This method does nothing, please stop using it and see {@link BatchUserDataEditor#setAttributionIdentifier(String)} - */ - @Deprecated - public Config setCanUseAdvertisingID(boolean canUse) { - return this; - } - - /** - * Set if Batch can use advanced device identifiers (default = true)
- *
- * Advanced device identifiers include information about the device itself, but nothing that - * directly identify the user, such as but not limited to: - * - Device model - * - Device brand - * - Carrier name - *
- * Setting this to false have a negative impact on core Batch features
- * You should only use it if you know what you are doing. - * - * @param canUse Can Batch use advanced device information? - */ - public Config setCanUseAdvancedDeviceInformation(boolean canUse) { - shouldUseAdvancedDeviceInformation = canUse; - return this; - } - - /** - * Set if Batch should send its logs to an object of yours (default = null)
- *
- * Be careful with your implementation: setting this can impact stability and performance
- * You should only use it if you know what you are doing. - * - * @param delegate An object implementing {@link LoggerDelegate} - */ - public Config setLoggerDelegate(LoggerDelegate delegate) { - loggerDelegate = delegate; - return this; - } - - /** - * Set the log level Batch should use - * - * @param level - * @return - */ - public Config setLoggerLevel(LoggerLevel level) { - loggerLevel = level; - return this; - } - - /** - * Set if Batch can use the Google Play Services Instance ID api (default = true)
- * Setting this to false will make Batch fallback on the classic (and deprecated) GCM API. - *
- * You should only use it if you know what you are doing. - * - * @param canUse can Batch use the Instance ID - * @deprecated Please switch to Firebase Cloud Messaging - */ - @Deprecated - public Config setCanUseInstanceID(boolean canUse) { - shouldUseGoogleInstanceID = canUse; - return this; - } - - /** - * Set if Batch should automatically register for pushes using FCM or GCM. - * Note: This doesn't do anything anymore - * - * @param shouldAutomaticallyRegisterPush Doesn't do anything - * @deprecated This feature isn't supported anymore - */ - @Deprecated - public Config setShouldAutomaticallyRegisterPush(boolean shouldAutomaticallyRegisterPush) { - return this; - } -} diff --git a/Sources/sdk/src/main/java/com/batch/android/LocalCampaignsWebservice.java b/Sources/sdk/src/main/java/com/batch/android/LocalCampaignsWebservice.java index c9e2535..39b5131 100644 --- a/Sources/sdk/src/main/java/com/batch/android/LocalCampaignsWebservice.java +++ b/Sources/sdk/src/main/java/com/batch/android/LocalCampaignsWebservice.java @@ -54,7 +54,6 @@ protected List getQueries() { public void run() { try { Logger.internal(TAG, "local campaigns webservice started"); - webserviceMetrics.onWebserviceStarted(this); MetricRegistry.localCampaignsSyncResponseTime.startTimer(); /* * Read response @@ -63,7 +62,6 @@ public void run() { try { response = getStandardResponseBodyIfValid(); MetricRegistry.localCampaignsSyncResponseTime.observeDuration(); - webserviceMetrics.onWebserviceFinished(this, true); } catch (WebserviceError error) { Logger.internal( TAG, @@ -71,7 +69,6 @@ public void run() { error.getCause() ); MetricRegistry.localCampaignsSyncResponseTime.observeDuration(); - webserviceMetrics.onWebserviceFinished(this, false); switch (error.getReason()) { case NETWORK_ERROR: diff --git a/Sources/sdk/src/main/java/com/batch/android/PushWebservice.java b/Sources/sdk/src/main/java/com/batch/android/PushWebservice.java index ac80d0b..8ee9ed7 100644 --- a/Sources/sdk/src/main/java/com/batch/android/PushWebservice.java +++ b/Sources/sdk/src/main/java/com/batch/android/PushWebservice.java @@ -7,7 +7,6 @@ import com.batch.android.core.Parameters; import com.batch.android.core.TaskRunnable; import com.batch.android.json.JSONObject; -import com.batch.android.push.Registration; import com.batch.android.query.PushQuery; import com.batch.android.query.Query; import com.batch.android.query.QueryType; @@ -29,17 +28,20 @@ class PushWebservice extends BatchQueryWebservice implements TaskRunnable { /** * The registration information */ - private Registration registration; + private final BatchPushRegistration registration; /** * Listener of this WS */ - private PushWebserviceListener listener; + private final PushWebserviceListener listener; // ------------------------------------------> - protected PushWebservice(Context context, @NonNull Registration registration, PushWebserviceListener listener) - throws MalformedURLException { + protected PushWebservice( + Context context, + @NonNull BatchPushRegistration registration, + PushWebserviceListener listener + ) throws MalformedURLException { super(context, RequestType.POST, Parameters.PUSH_WS_URL); if (registration == null) { throw new NullPointerException("registration==null"); @@ -68,7 +70,6 @@ protected List getQueries() { public void run() { try { Logger.internal(TAG, "push webservice started"); - webserviceMetrics.onWebserviceStarted(this); /* * Read response @@ -76,10 +77,8 @@ public void run() { JSONObject response = null; try { response = getStandardResponseBodyIfValid(); - webserviceMetrics.onWebserviceFinished(this, true); } catch (WebserviceError error) { Logger.internal(TAG, "Error on PushWebservice : " + error.getReason().toString(), error.getCause()); - webserviceMetrics.onWebserviceFinished(this, false); switch (error.getReason()) { case NETWORK_ERROR: diff --git a/Sources/sdk/src/main/java/com/batch/android/StartWebservice.java b/Sources/sdk/src/main/java/com/batch/android/StartWebservice.java index 55525bb..c1404c8 100644 --- a/Sources/sdk/src/main/java/com/batch/android/StartWebservice.java +++ b/Sources/sdk/src/main/java/com/batch/android/StartWebservice.java @@ -7,7 +7,6 @@ import com.batch.android.core.TaskRunnable; import com.batch.android.di.providers.PushModuleProvider; import com.batch.android.json.JSONObject; -import com.batch.android.push.Registration; import com.batch.android.query.PushQuery; import com.batch.android.query.Query; import com.batch.android.query.QueryType; @@ -81,7 +80,7 @@ protected List getQueries() { queries.add(new StartQuery(applicationContext, fromPush, pushId, userActivity)); // Add push query if we have a push token - Registration registration = PushModuleProvider.get().getRegistration(applicationContext); + BatchPushRegistration registration = PushModuleProvider.get().getRegistration(applicationContext); if (registration != null) { queries.add(new PushQuery(applicationContext, registration)); } @@ -93,7 +92,6 @@ protected List getQueries() { public void run() { try { Logger.internal(TAG, "start webservice started"); - webserviceMetrics.onWebserviceStarted(this); /* * Read response @@ -101,10 +99,8 @@ public void run() { JSONObject response = null; try { response = getStandardResponseBodyIfValid(); - webserviceMetrics.onWebserviceFinished(this, true); } catch (WebserviceError error) { Logger.internal(TAG, "Error on StartWebservice : " + error.getReason().toString(), error.getCause()); - webserviceMetrics.onWebserviceFinished(this, false); switch (error.getReason()) { case NETWORK_ERROR: diff --git a/Sources/sdk/src/main/java/com/batch/android/TrackerWebservice.java b/Sources/sdk/src/main/java/com/batch/android/TrackerWebservice.java index 12e2cc7..e844ef0 100644 --- a/Sources/sdk/src/main/java/com/batch/android/TrackerWebservice.java +++ b/Sources/sdk/src/main/java/com/batch/android/TrackerWebservice.java @@ -66,18 +66,14 @@ protected List getQueries() { public void run() { try { Logger.internal(TAG, "tracker webservice started"); - webserviceMetrics.onWebserviceStarted(this); - /* * Read response */ JSONObject response = null; try { response = getStandardResponseBodyIfValid(); - webserviceMetrics.onWebserviceFinished(this, true); } catch (WebserviceError error) { Logger.internal(TAG, "Error on TrackerWebservice : " + error.getReason().toString(), error.getCause()); - webserviceMetrics.onWebserviceFinished(this, false); switch (error.getReason()) { case NETWORK_ERROR: diff --git a/Sources/sdk/src/main/java/com/batch/android/User.java b/Sources/sdk/src/main/java/com/batch/android/User.java deleted file mode 100644 index 71b8d06..0000000 --- a/Sources/sdk/src/main/java/com/batch/android/User.java +++ /dev/null @@ -1,204 +0,0 @@ -package com.batch.android; - -import android.content.Context; -import androidx.annotation.Nullable; -import com.batch.android.core.Logger; -import com.batch.android.core.ParameterKeys; -import com.batch.android.di.providers.ParametersProvider; -import com.batch.android.di.providers.TrackerModuleProvider; -import com.batch.android.event.InternalEvents; -import com.batch.android.json.JSONException; -import com.batch.android.json.JSONObject; -import com.batch.android.module.UserModule; - -/** - * Object that encapsulate user data - * - * @hide - */ -final class User { - - /** - * Saved context - */ - private Context context; - - // --------------------------------------------> - - /** - * @param context - */ - protected User(Context context) { - if (context == null) { - throw new NullPointerException("Null context"); - } - - this.context = context.getApplicationContext(); - } - - // -------------------------------------------> - - /** - * Set the new language - * - * @param language can be null - */ - public void setLanguage(@Nullable String language) { - if (language != null) { - ParametersProvider.get(context).set(ParameterKeys.USER_PROFILE_LANGUAGE_KEY, language, true); - } else { - ParametersProvider.get(context).remove(ParameterKeys.USER_PROFILE_LANGUAGE_KEY); - } - } - - /** - * Return the language if any, null otherwise - * - * @return - */ - public String getLanguage() { - return ParametersProvider.get(context).get(ParameterKeys.USER_PROFILE_LANGUAGE_KEY); - } - - // -------------------------------------------> - - /** - * Set the new region - * - * @param region can be null - */ - public void setRegion(@Nullable String region) { - if (region != null) { - ParametersProvider.get(context).set(ParameterKeys.USER_PROFILE_REGION_KEY, region, true); - } else { - ParametersProvider.get(context).remove(ParameterKeys.USER_PROFILE_REGION_KEY); - } - } - - /** - * Return the region if any, null otherwise - * - * @return - */ - public String getRegion() { - return ParametersProvider.get(context).get(ParameterKeys.USER_PROFILE_REGION_KEY); - } - - // -------------------------------------------> - - /** - * Set the new customID - * - * @param customID can be null - */ - public void setCustomID(@Nullable String customID) { - if (customID != null) { - ParametersProvider.get(context).set(ParameterKeys.CUSTOM_ID, customID, true); - } else { - ParametersProvider.get(context).remove(ParameterKeys.CUSTOM_ID); - } - } - - /** - * Return the custom ID if any, null otherwise - * - * @return - */ - public String getCustomID() { - return ParametersProvider.get(context).get(ParameterKeys.CUSTOM_ID); - } - - /** - * Set the new attribution id - * - * @param attributionID can be null - */ - public void setAttributionID(@Nullable String attributionID) { - if (attributionID != null) { - ParametersProvider.get(context).set(ParameterKeys.ATTRIBUTION_ID, attributionID, true); - } else { - ParametersProvider.get(context).remove(ParameterKeys.ATTRIBUTION_ID); - } - } - - /** - * Return the attribution ID if any, null otherwise - * - * @return - */ - @Nullable - public String getAttributionID() { - return ParametersProvider.get(context).get(ParameterKeys.ATTRIBUTION_ID); - } - - // -------------------------------------------> - - /** - * Get the data version - * - * @return - */ - public long getVersion() { - String version = ParametersProvider.get(context).get(ParameterKeys.USER_DATA_VERSION); - if (version == null) { - return 1; - } - - try { - return Long.parseLong(version); - } catch (Exception e) { - return 1; - } - } - - /** - * Get the data version and increment it - * - * @return - */ - private synchronized long incrementVersion() { - long newVersion = getVersion() + 1; - ParametersProvider.get(context).set(ParameterKeys.USER_DATA_VERSION, Long.toString(newVersion), true); - return newVersion; - } - - public void sendAttributionIDChangedEvent() { - final String attributionIdentifier = getAttributionID(); - JSONObject attributionParam = new JSONObject(); - try { - if (attributionIdentifier != null) { - attributionParam.put("attribution_id", attributionIdentifier); - } else { - attributionParam.put("attribution_id", JSONObject.NULL); - } - TrackerModuleProvider.get().track(InternalEvents.ATTRIBUTION_ID_CHANGED, attributionParam); - } catch (JSONException e) { - Logger.internal(UserModule.TAG, "Could not track " + InternalEvents.ATTRIBUTION_ID_CHANGED, e); - } - } - - public void sendChangeEvent() { - try { - final JSONObject params = new JSONObject(); - - final String region = getRegion(); - if (region != null) { - params.put("ure", region); - } - - final String language = getLanguage(); - if (language != null) { - params.put("ula", language); - } - - final String customID = getCustomID(); - if (customID != null) { - params.put("cus", customID); - } - params.put("upv", incrementVersion()); - TrackerModuleProvider.get().track(InternalEvents.PROFILE_CHANGED, params); - } catch (JSONException e) { - Logger.internal(UserModule.TAG, "Could not track " + InternalEvents.PROFILE_CHANGED, e); - } - } -} diff --git a/Sources/sdk/src/main/java/com/batch/android/WebserviceLauncher.java b/Sources/sdk/src/main/java/com/batch/android/WebserviceLauncher.java index ad8c759..aece3be 100644 --- a/Sources/sdk/src/main/java/com/batch/android/WebserviceLauncher.java +++ b/Sources/sdk/src/main/java/com/batch/android/WebserviceLauncher.java @@ -11,7 +11,6 @@ import com.batch.android.post.DisplayReceiptPostDataProvider; import com.batch.android.post.LocalCampaignsJITPostDataProvider; import com.batch.android.post.MetricPostDataProvider; -import com.batch.android.push.Registration; import com.batch.android.runtime.RuntimeManager; import com.batch.android.webservice.listener.DisplayReceiptWebserviceListener; import com.batch.android.webservice.listener.LocalCampaignsJITWebserviceListener; @@ -127,7 +126,10 @@ public static TaskRunnable initMetricWebservice( /** * Launch the push webservice */ - public static boolean launchPushWebservice(RuntimeManager runtimeManager, @NonNull Registration registration) { + public static boolean launchPushWebservice( + RuntimeManager runtimeManager, + @NonNull BatchPushRegistration registration + ) { try { TaskExecutorProvider .get(runtimeManager.getContext()) diff --git a/Sources/sdk/src/main/java/com/batch/android/WebserviceMetrics.java b/Sources/sdk/src/main/java/com/batch/android/WebserviceMetrics.java deleted file mode 100644 index 09a986f..0000000 --- a/Sources/sdk/src/main/java/com/batch/android/WebserviceMetrics.java +++ /dev/null @@ -1,146 +0,0 @@ -package com.batch.android; - -import com.batch.android.core.Logger; -import com.batch.android.core.Webservice; -import com.batch.android.inbox.InboxFetchWebserviceClient; -import com.batch.android.processor.Module; -import com.batch.android.processor.Singleton; -import java.util.HashMap; -import java.util.Map; - -/** - * Static class that tracks webservices metrics for report - * - * @hide - */ -@Module -@Singleton -public class WebserviceMetrics { - - private static final String TAG = "WebserviceMetrics"; - - /** - * Metrics saved for future report - */ - private final Map metrics = new HashMap<>(); - /** - * Map that saves start time for webservices - */ - private final Map webservicesStartTime = new HashMap<>(); - - // ----------------------------------------------> - - /** - * Method that a webservice should call to report that its starting - * - * @param webservice - */ - void onWebserviceStarted(Webservice webservice) { - if (webservice == null) { - throw new NullPointerException("webservice==null"); - } - - String shortName = shortNames.get(webservice.getClass()); - if (shortName == null) { - Logger.internal(TAG, "Unknown webservice reported for metrics (" + webservice.getClass() + "), aborting"); - return; - } - - synchronized (webservicesStartTime) { - webservicesStartTime.put(shortName, System.currentTimeMillis()); - } - } - - /** - * Method that a webservice should call to report its success or failure - * - * @param webservice - * @param success - */ - void onWebserviceFinished(Webservice webservice, boolean success) { - if (webservice == null) { - throw new NullPointerException("webservice==null"); - } - - String shortName = shortNames.get(webservice.getClass()); - if (shortName == null) { - Logger.internal(TAG, "Unknown webservice reported for metrics (" + webservice.getClass() + "), aborting"); - return; - } - - Long startTime = webservicesStartTime.get(shortName); - if (startTime == null) { - Logger.internal(TAG, "Webservice finished without start recorded (" + shortName + "), aborting"); - return; - } - - Metric metric = new Metric(success, System.currentTimeMillis() - startTime); - - synchronized (webservicesStartTime) { - webservicesStartTime.remove(shortName); - } - - synchronized (metrics) { - metrics.put(shortName, metric); - } - } - - /** - * Get the current saved metrics for report. Calling this method will clear saved metrics - * - * @return - */ - Map getMetrics() { - synchronized (metrics) { - Map currentMetrics = new HashMap<>(metrics); - metrics.clear(); - return currentMetrics; - } - } - - // ----------------------------------------------> - - /** - * Static map of shortnames for webservice reporting - */ - private static Map, String> shortNames = new HashMap<>(); - - static { - shortNames.put(StartWebservice.class, "s"); - shortNames.put(TrackerWebservice.class, "tr"); - shortNames.put(PushWebservice.class, "t"); - shortNames.put(AttributesSendWebservice.class, "ats"); - shortNames.put(AttributesCheckWebservice.class, "atc"); - shortNames.put(LocalCampaignsWebservice.class, "lc"); - shortNames.put(InboxFetchWebserviceClient.class, "inbox"); - } - - // -----------------------------------------------> - - /** - * Static object that represent a webservice metric - * - */ - static final class Metric { - - /** - * Was this webservice call a success - */ - protected boolean success; - /** - * Duration of the webservice call - */ - protected long time; - - // ------------------------------------------> - - /** - * @param success - * @param time - */ - private Metric(boolean success, long time) { - this.success = success; - this.time = time; - } - } -} diff --git a/Sources/sdk/src/main/java/com/batch/android/WebserviceParameterUtils.java b/Sources/sdk/src/main/java/com/batch/android/WebserviceParameterUtils.java index 7afddcd..c02beab 100644 --- a/Sources/sdk/src/main/java/com/batch/android/WebserviceParameterUtils.java +++ b/Sources/sdk/src/main/java/com/batch/android/WebserviceParameterUtils.java @@ -1,19 +1,13 @@ package com.batch.android; import android.content.Context; -import android.text.TextUtils; import androidx.annotation.NonNull; -import com.batch.android.core.Logger; -import com.batch.android.core.ParameterKeys; -import com.batch.android.core.SystemParameterHelper; -import com.batch.android.core.SystemParameterShortName; -import com.batch.android.core.Webservice; -import com.batch.android.di.providers.ParametersProvider; -import com.batch.android.di.providers.PushModuleProvider; -import com.batch.android.di.providers.TrackerModuleProvider; +import com.batch.android.core.systemparameters.SystemParameter; +import com.batch.android.core.systemparameters.SystemParameterRegistry; +import com.batch.android.core.systemparameters.SystemParameterShortName; +import com.batch.android.di.providers.DataCollectionModuleProvider; +import com.batch.android.di.providers.SystemParameterRegistryProvider; import com.batch.android.json.JSONObject; -import java.util.Arrays; -import java.util.Date; import java.util.HashMap; import java.util.Map; @@ -22,14 +16,12 @@ */ public class WebserviceParameterUtils { - private static final String TAG = "WebserviceParameterUtils"; - /** * Get webservice ids parameters as map * @param context context * @return A Map of parameters to attach in a webservice */ - public static Map getWebserviceIdsAsMap(Context context) { + public static Map getWebserviceIdsAsMap(@NonNull Context context) { return buildIds(context); } @@ -38,7 +30,7 @@ public static Map getWebserviceIdsAsMap(Context context) { * @param context context * @return A JSONObject of parameters to attach in a webservice */ - public static JSONObject getWebserviceIdsAsJson(Context context) { + public static JSONObject getWebserviceIdsAsJson(@NonNull Context context) { return new JSONObject(buildIds(context)); } @@ -48,117 +40,26 @@ public static JSONObject getWebserviceIdsAsJson(Context context) { * @return map of ids */ private static Map buildIds(@NonNull Context context) { - /* - * Build ids object - */ Map ids = new HashMap<>(); - /* - * Add modules data - */ - try { - ids.put("m_e", TrackerModuleProvider.get().getState()); - ids.put("m_p", PushModuleProvider.get().getState()); - } catch (Exception e) { - Logger.internal(TAG, "Error while adding module parameters into parameters", e); - } - - /* - * Build all parameters - */ - String baseIdsParameterString = ParametersProvider.get(context).get(ParameterKeys.WEBSERVICE_IDS_PARAMETERS); - String[] baseParameters; - if (!TextUtils.isEmpty(baseIdsParameterString)) { - baseParameters = baseIdsParameterString.split(","); - } else { - baseParameters = new String[] {}; - } - - String advancedIdsParameterString = ParametersProvider - .get(context) - .get(ParameterKeys.WEBSERVICE_IDS_ADVANCED_PARAMETERS); - String[] advancedParameters; - if (!TextUtils.isEmpty(advancedIdsParameterString) && Batch.shouldUseAdvancedDeviceInformation()) { - advancedParameters = advancedIdsParameterString.split(","); - } else { - advancedParameters = new String[] {}; - } - - String[] parameters; - - if (advancedParameters.length == 0) { - parameters = baseParameters; - } else if (baseParameters.length == 0) { - parameters = advancedParameters; - } else { - parameters = Arrays.copyOf(baseParameters, baseParameters.length + advancedParameters.length); - System.arraycopy(advancedParameters, 0, parameters, baseParameters.length, advancedParameters.length); - } - - for (String parameter : parameters) { - try { - if (SystemParameterShortName.INSTALL_ID.shortName.equals(parameter)) { - Install install = Batch.getInstall(); - String val = install.getInstallID(); - - if (val != null) { - ids.put(parameter, val); - } - } else if (SystemParameterShortName.DEVICE_INSTALL_DATE.shortName.equals(parameter)) { - Install install = Batch.getInstall(); - Date val = install.getInstallDate(); - - if (val != null) { - ids.put(parameter, Webservice.formatDate(val)); - } - } else if (SystemParameterShortName.SERVER_ID.shortName.equals(parameter)) { - String val = ParametersProvider.get(context).get(ParameterKeys.SERVER_ID_KEY); - if (val != null) { - ids.put(parameter, val); - } - } else if (SystemParameterShortName.SESSION_ID.shortName.equals(parameter)) { - String val = Batch.getSessionID(); - if (val != null) { - ids.put(parameter, val); - } - } else if (SystemParameterShortName.CUSTOM_USER_ID.shortName.equals(parameter)) { - User user = Batch.getUser(); - if (user != null) { - String customID = user.getCustomID(); - if (customID != null) { - ids.put(parameter, customID); - } - } - } else if (SystemParameterShortName.ATTRIBUTION_ID.shortName.equals(parameter)) { - User user = Batch.getUser(); - if (user != null) { - String attributionID = user.getAttributionID(); - if (attributionID != null) { - ids.put(parameter, attributionID); - } - } - } else if (SystemParameterShortName.BRIDGE_VERSION.shortName.equals(parameter)) { - String val = SystemParameterHelper.getBridgeVersion(); - - if (val != null && !val.isEmpty()) { - ids.put(parameter, val); - } - } else if (SystemParameterShortName.PLUGIN_VERSION.shortName.equals(parameter)) { - String val = SystemParameterHelper.getPluginVersion(); - - if (val != null && !val.isEmpty()) { - ids.put(parameter, val); - } - } else { - String val = SystemParameterHelper.getValue(parameter, context); - if (val != null) { - ids.put(parameter, val); - } + // Adding system parameters entries + SystemParameterRegistry systemParameterRegistry = SystemParameterRegistryProvider.get(context); + for (SystemParameter parameter : systemParameterRegistry.getParameters()) { + // Ensure this data is allowed to be send + if (parameter.isAllowed()) { + String val = parameter.getValue(); + if (val != null && !val.isEmpty()) { + ids.put(parameter.getShortName().shortName, val); } - } catch (Exception e) { - Logger.internal(TAG, "Error while adding " + parameter + " post id", e); } } + // Adding data collection entry + Map dataCollection = new HashMap<>(); + boolean geoipEnabled = Boolean.TRUE.equals( + DataCollectionModuleProvider.get().getDataCollectionConfig().isGeoIpEnabled() + ); + dataCollection.put("geoip", geoipEnabled); + ids.put("data_collection", dataCollection); return ids; } } diff --git a/Sources/sdk/src/main/java/com/batch/android/actions/NotificationPermissionActionRunnable.java b/Sources/sdk/src/main/java/com/batch/android/actions/NotificationPermissionActionRunnable.java index 7674a31..1d15540 100644 --- a/Sources/sdk/src/main/java/com/batch/android/actions/NotificationPermissionActionRunnable.java +++ b/Sources/sdk/src/main/java/com/batch/android/actions/NotificationPermissionActionRunnable.java @@ -27,7 +27,7 @@ public void performAction( Logger.error(TAG, "Tried to perform a notif. permission request action, but no context was available"); return; } - final NotificationPermissionHelper notificationPermissionHelper = new NotificationPermissionHelper(); + final NotificationPermissionHelper notificationPermissionHelper = new NotificationPermissionHelper(null); notificationPermissionHelper.requestPermission(context, true, null); } } diff --git a/Sources/sdk/src/main/java/com/batch/android/actions/RedirectNotificationSettingsAction.java b/Sources/sdk/src/main/java/com/batch/android/actions/RedirectNotificationSettingsAction.java index 8ad89f2..fdba08e 100644 --- a/Sources/sdk/src/main/java/com/batch/android/actions/RedirectNotificationSettingsAction.java +++ b/Sources/sdk/src/main/java/com/batch/android/actions/RedirectNotificationSettingsAction.java @@ -37,14 +37,10 @@ public void performAction( if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS); intent.putExtra(Settings.EXTRA_APP_PACKAGE, context.getPackageName()); - } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + } else { intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS"); intent.putExtra("app_package", context.getPackageName()); intent.putExtra("app_uid", context.getApplicationInfo().uid); - } else { - intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); - intent.addCategory(Intent.CATEGORY_DEFAULT); - intent.setData(Uri.parse("package:" + context.getPackageName())); } context.startActivity(intent); } diff --git a/Sources/sdk/src/main/java/com/batch/android/actions/SmartReOptInAction.java b/Sources/sdk/src/main/java/com/batch/android/actions/SmartReOptInAction.java index b409f69..245817b 100644 --- a/Sources/sdk/src/main/java/com/batch/android/actions/SmartReOptInAction.java +++ b/Sources/sdk/src/main/java/com/batch/android/actions/SmartReOptInAction.java @@ -43,7 +43,7 @@ public void performAction( // Not running on Android 13, no need for permission. return; } - final NotificationPermissionHelper notificationPermissionHelper = new NotificationPermissionHelper(); + final NotificationPermissionHelper notificationPermissionHelper = new NotificationPermissionHelper(null); if (notificationPermissionHelper.isNotificationPermissionGranted(context)) { Logger.internal(TAG, "Notification permission is already granted, aborting."); return; diff --git a/Sources/sdk/src/main/java/com/batch/android/actions/UserDataBuiltinActionRunnable.java b/Sources/sdk/src/main/java/com/batch/android/actions/UserDataBuiltinActionRunnable.java index 275ff8f..2097aed 100644 --- a/Sources/sdk/src/main/java/com/batch/android/actions/UserDataBuiltinActionRunnable.java +++ b/Sources/sdk/src/main/java/com/batch/android/actions/UserDataBuiltinActionRunnable.java @@ -4,13 +4,14 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.batch.android.Batch; -import com.batch.android.BatchUserDataEditor; +import com.batch.android.BatchProfileAttributeEditor; import com.batch.android.UserActionRunnable; import com.batch.android.UserActionSource; import com.batch.android.core.Logger; import com.batch.android.json.JSONException; import com.batch.android.json.JSONObject; import com.batch.android.module.ActionModule; +import com.batch.android.user.InstallDataEditor; import java.util.Locale; public class UserDataBuiltinActionRunnable implements UserActionRunnable { @@ -60,13 +61,13 @@ public void performAction( if (action.equals("add")) { Logger.internal(TAG, "Adding tag " + tag + " to collection " + collection); - BatchUserDataEditor editor = Batch.User.editor(); - editor.addTag(collection, tag); + BatchProfileAttributeEditor editor = Batch.Profile.editor(); + editor.addToArray(collection, tag); editor.save(); } else if (action.equals("remove")) { Logger.internal(TAG, "Removing tag " + tag + " to collection " + collection); - BatchUserDataEditor editor = Batch.User.editor(); - editor.removeTag(collection, tag); + BatchProfileAttributeEditor editor = Batch.Profile.editor(); + editor.removeFromArray(collection, tag); editor.save(); } else { Logger.internal(TAG, "Could not perform tag edit action: Unknown action"); diff --git a/Sources/sdk/src/main/java/com/batch/android/actions/UserEventBuiltinActionRunnable.java b/Sources/sdk/src/main/java/com/batch/android/actions/UserEventBuiltinActionRunnable.java index f0f8cfe..20f37ad 100644 --- a/Sources/sdk/src/main/java/com/batch/android/actions/UserEventBuiltinActionRunnable.java +++ b/Sources/sdk/src/main/java/com/batch/android/actions/UserEventBuiltinActionRunnable.java @@ -4,7 +4,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.batch.android.Batch; -import com.batch.android.BatchEventData; +import com.batch.android.BatchEventAttributes; import com.batch.android.UserActionRunnable; import com.batch.android.UserActionSource; import com.batch.android.core.Logger; @@ -15,7 +15,9 @@ import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Date; +import java.util.List; import java.util.Locale; public class UserEventBuiltinActionRunnable implements UserActionRunnable { @@ -60,20 +62,24 @@ public void performAction( return; } + BatchEventAttributes data = new BatchEventAttributes(); String label = json.reallyOptString("l", null); + if (label != null) { + data.put(BatchEventAttributes.LABEL_KEY, label); + } - BatchEventData data = new BatchEventData(); - - JSONArray tags = json.optJSONArray("t"); - if (tags != null && tags.length() > 0) { - for (int i = 0; i < tags.length(); i++) { - String tag = tags.optString(i, null); + JSONArray jsonTags = json.optJSONArray("t"); + if (jsonTags != null && jsonTags.length() > 0) { + List tags = new ArrayList<>(); + for (int i = 0; i < jsonTags.length(); i++) { + String tag = jsonTags.optString(i, null); if (tag != null && tag.length() > 0) { - data.addTag(tag); + tags.add(tag); } else { Logger.internal(TAG, "Could not add tag in event action : tag value is null or invalid"); } } + data.putStringList(BatchEventAttributes.TAGS_KEY, tags); } JSONObject argsData = json.optJSONObject("a"); @@ -103,7 +109,7 @@ public void performAction( } } - Batch.User.trackEvent(event, label, data); + Batch.Profile.trackEvent(event, data); } catch (JSONException e) { Logger.internal(TAG, "Json object failure : " + e.getLocalizedMessage()); } diff --git a/Sources/sdk/src/main/java/com/batch/android/core/Base32Encoding.java b/Sources/sdk/src/main/java/com/batch/android/core/Base32Encoding.java deleted file mode 100644 index 1524fc2..0000000 --- a/Sources/sdk/src/main/java/com/batch/android/core/Base32Encoding.java +++ /dev/null @@ -1,150 +0,0 @@ -package com.batch.android.core; - -import java.io.ByteArrayOutputStream; -import java.nio.charset.Charset; -import java.util.Arrays; -import java.util.Locale; -import java.util.Objects; - -/** - * This class implements base32 encoding and decoding - *

- * This implementation is not suitable as a general-purpose base32 encoding/decoding because it is tailor-made for use - * with typed identifiers; this means we always encode 20 bytes and therefore we _do not_ handle padding ! - */ -public class Base32Encoding { - - private static final Charset UTF_8_CHARSET = Charset.forName("UTF-8"); - - static final int INPUT_BLOCK_SIZE = 5; - static final int ENCODED_BLOCK_SIZE = 8; - - byte[] encode; - byte[] decodeMap; - - /** - * Construct a new Base32Encoding using {@param encoder} as the encoding alphabet. - * - * @param encoder The encoding alphabet (must be 32 chars) - */ - public Base32Encoding(String encoder) { - Objects.requireNonNull(encoder); - if (encoder.length() != 32) { - String message = String.format( - Locale.US, - "encoder \"%s\" (length: %d) is invalid, must be 32 chars", - encoder, - encoder.length() - ); - throw new IllegalArgumentException(message); - } - - this.encode = new byte[32]; - System.arraycopy(encoder.getBytes(UTF_8_CHARSET), 0, this.encode, 0, 32); - - this.decodeMap = new byte[256]; - Arrays.fill(this.decodeMap, (byte) 0xff); - - for (int i = 0; i < this.encode.length; i++) { - byte index = this.encode[i]; - this.decodeMap[index] = (byte) i; - } - } - - public static class EncodeException extends Exception { - - public EncodeException(String message) { - super(message); - } - } - - /** - * Encode the input bytes {@param src} to the output stream {@param outputStream}. - * This method does _not_ handle padding, therefore {@param src} must have a length that is a multiple of 5. - * - * @param outputStream The output stream where we will write the encoded bytes - * @param src The input bytes to encode. Its length must be a multiple of 5. - */ - public void encode(ByteArrayOutputStream outputStream, byte[] src) throws EncodeException { - Objects.requireNonNull(outputStream); - Objects.requireNonNull(src); - if ((src.length % INPUT_BLOCK_SIZE) != 0) { - throw new EncodeException("invalid input size, must be a multiple of 5 because padding is not implemented"); - } - - int i = 0; // position in src - int length = src.length; - while (length > 0) { - byte[] buf = new byte[8]; - buf[0] = (byte) ((src[i] & 0b11111000) >> 3); - buf[1] = (byte) (((src[i] & 0b00000111) << 2) | ((src[i + 1] & 0b11000000) >> 6)); - buf[2] = (byte) ((src[i + 1] & 0b00111110) >> 1); - buf[3] = (byte) (((src[i + 1] & 0b00000001) << 4) | ((src[i + 2] & 0b11110000) >> 4)); - buf[4] = (byte) (((src[i + 2] & 0b00001111) << 1) | ((src[i + 3] & 0b10000000) >> 7)); - buf[5] = (byte) ((src[i + 3] & 0b01111100) >> 2); - buf[6] = (byte) (((src[i + 3] & 0b00000011) << 3) | ((src[i + 4] & 0b11100000) >> 5)); - buf[7] = (byte) (src[i + 4] & 0b00011111); - - i += INPUT_BLOCK_SIZE; - length -= INPUT_BLOCK_SIZE; - - // 8 outputs - for (byte b : buf) { - outputStream.write(this.encode[b]); - } - } - } - - public static class DecodeException extends Exception { - - public DecodeException(String message) { - super(message); - } - } - - /** - * Decode the input string {@param srcString} and writes the resulting bytes to a new {@link ByteArrayOutputStream}. - * - * @param srcString The input string to decode - * @return a {@link ByteArrayOutputStream} containing the decoded data - * @throws DecodeException if there's any error while decoding - */ - public ByteArrayOutputStream decode(String srcString) throws DecodeException { - byte[] src = srcString.getBytes(UTF_8_CHARSET); - - int i = 0; // position in src - int length = src.length; - - if (length % ENCODED_BLOCK_SIZE != 0) { - String message = String.format("invalid base32 string \"%s\"", srcString); - throw new DecodeException(message); - } - - ByteArrayOutputStream output = new ByteArrayOutputStream(length); - - while (length > 0) { - byte[] buf = new byte[ENCODED_BLOCK_SIZE]; - - System.arraycopy(src, i, buf, 0, buf.length); - - length -= buf.length; - i += buf.length; - - for (int j = 0; j < buf.length; j++) { - buf[j] = this.decodeMap[buf[j]]; - if (buf[j] == (byte) 0xff) { - String message = String.format("invalid base32 string \"%s\"", srcString); - throw new DecodeException(message); - } - } - - output.write(((buf[0] & 0b00011111) << 3) | ((buf[1] & 0b00011100) >> 2)); - output.write(((buf[1] & 0b00000011) << 6) | ((buf[2] & 0b00011111) << 1) | ((buf[3] & 0b00010000) >> 4)); - output.write(((buf[3] & 0b00001111) << 4) | ((buf[4] & 0b00011110) >> 1)); - output.write(((buf[4] & 0b00000001) << 7) | ((buf[5] & 0b00011111) << 2) | ((buf[6] & 0b00011000) >> 3)); - output.write(((buf[6] & 0b00000111) << 5) | (buf[7] & 0b00011111)); - } - - return output; - } -} diff --git a/Sources/sdk/src/main/java/com/batch/android/core/DeeplinkHelper.java b/Sources/sdk/src/main/java/com/batch/android/core/DeeplinkHelper.java index 89e8aec..5d19220 100644 --- a/Sources/sdk/src/main/java/com/batch/android/core/DeeplinkHelper.java +++ b/Sources/sdk/src/main/java/com/batch/android/core/DeeplinkHelper.java @@ -5,10 +5,8 @@ import android.content.Context; import android.content.Intent; import android.net.Uri; -import android.os.Build; import android.os.Bundle; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import java.util.Locale; /** @@ -20,22 +18,15 @@ public class DeeplinkHelper { * Gets a VIEW intent that will result in a Custom Tab. * Note: On unsupported API Levels (<18), this will return null */ - @Nullable + @NonNull static Intent getCustomTabIntent(@NonNull Uri uri) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) { - return null; - } - final Intent i = new Intent(ACTION_VIEW); - final Bundle b = new Bundle(); b.putBinder("android.support.customtabs.extra.SESSION", null); b.putBoolean("android.support.customtabs.extra.SHARE_MENU_ITEM", true); b.putInt("android.support.customtabs.extra.TITLE_VISIBILITY", 1); - i.putExtras(b); i.setData(uri); - return i; } @@ -61,25 +52,18 @@ static boolean customTabSupportsURI(@NonNull Uri uri) { * @param useNewTask Open in a new task (unsupported on custom tabs) * @return Intent to attempt to open for the deeplink */ - @Nullable + @NonNull public static Intent getIntent(@NonNull String rawDeeplink, boolean useCustomTabIfPossible, boolean useNewTask) { Uri uri = Uri.parse(rawDeeplink); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - uri = uri.normalizeScheme(); - } - + uri = uri.normalizeScheme(); if (useCustomTabIfPossible && customTabSupportsURI(uri)) { - final Intent customTabIntent = getCustomTabIntent(uri); - if (customTabIntent != null) { - return customTabIntent; - } + return getCustomTabIntent(uri); } final Intent i = new Intent(ACTION_VIEW, uri); if (useNewTask) { i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); } - return i; } diff --git a/Sources/sdk/src/main/java/com/batch/android/core/GenericHelper.java b/Sources/sdk/src/main/java/com/batch/android/core/GenericHelper.java index 57b61dd..e074580 100644 --- a/Sources/sdk/src/main/java/com/batch/android/core/GenericHelper.java +++ b/Sources/sdk/src/main/java/com/batch/android/core/GenericHelper.java @@ -10,7 +10,6 @@ import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Locale; -import java.util.regex.Pattern; /** * Generic helper that contains generic helpful methods @@ -18,11 +17,6 @@ */ public class GenericHelper { - /** - * Valid email pattern - */ - private static final Pattern EMAIL_KEY_PATTERN = Pattern.compile("^(\\S+@\\S+\\.\\S+)$"); - /** * Check if the permission is available * @@ -158,8 +152,4 @@ public static int DPtoPixel(int dp, Context context) { DisplayMetrics metrics = resources.getDisplayMetrics(); return Math.round((float) dp * metrics.density); } - - public static boolean isValidEmail(String email) { - return EMAIL_KEY_PATTERN.matcher(email).matches(); - } } diff --git a/Sources/sdk/src/main/java/com/batch/android/core/GooglePlayServicesHelper.java b/Sources/sdk/src/main/java/com/batch/android/core/GooglePlayServicesHelper.java index 0206600..beabb46 100644 --- a/Sources/sdk/src/main/java/com/batch/android/core/GooglePlayServicesHelper.java +++ b/Sources/sdk/src/main/java/com/batch/android/core/GooglePlayServicesHelper.java @@ -2,7 +2,6 @@ import android.content.Context; import com.batch.android.module.PushModule; -import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.Method; @@ -12,23 +11,11 @@ */ public final class GooglePlayServicesHelper { - /** - * The version of the Google Play Services lib that contains push - */ - private static final int PUSH_ID_VERSION = 4030500; - - /** - * The version of the Google Play Services that contain the Instance ID methods - */ - private static final int INSTANCE_ID_VERSION = 7571000; - /** * The first version of the Google Play Services the contain Firebase Cloud Messaging methods */ private static final int FCM_ID_VERSION = 9000000; - // -------------------------------------------------> - /** * Is the availability of the lib already checked (to avoid redo too much introspection) */ @@ -41,10 +28,10 @@ public final class GooglePlayServicesHelper { // --------------------------------------------------> /** - * retrieve the google play services' isGooglePlayServicesAvailable result as a string + * Retrieve the google play services' isGooglePlayServicesAvailable result as a string * - * @param availability - * @return version of the lib if available, null if the lib is unavailable + * @param availability The Google Play Service availability code + * @return The availability status */ public static String getGooglePlayServicesAvailabilityString(Integer availability) { if (availability == null) { @@ -75,26 +62,25 @@ public static Integer getGooglePlayServicesAvailabilityInteger(Context context) // Get the class, throws ClassNotFoundException if not available Class clazz = Class.forName("com.google.android.gms.common.GooglePlayServicesUtil"); /* - * Check if we are in a Google Play environement (not true for Amazon devices for exemple) + * Check if we are in a Google Play environment (not true for Amazon devices for exemple) */ Method method = clazz.getMethod("isGooglePlayServicesAvailable", Context.class); return (Integer) method.invoke(null, context); } catch (ClassNotFoundException e) { return null; } catch (Exception e) { - Logger.error(PushModule.TAG, "Error while retreiving Google Play Services lib availability", e); + Logger.error(PushModule.TAG, "Error while retrieving Google Play Services lib availability", e); return null; } } /** - * retrieve the google play services version if the lib regardless if it is available - * on rutime or not + * Retrieve the google play services version if the lib regardless if it is available + * on runtime or not * - * @param context * @return version of the lib if available, null if the lib is not here */ - public static Integer getGooglePlayServicesLibVersion(Context context) { + public static Integer getGooglePlayServicesLibVersion() { /* * Check cache to avoid redo multiple time */ @@ -104,169 +90,32 @@ public static Integer getGooglePlayServicesLibVersion(Context context) { try { // Get the class, throws ClassNotFoundException if not available - Class clazz = Class.forName("com.google.android.gms.common.GooglePlayServicesUtil"); - - /* - * retrieve the version - */ + Class clazz = Class.forName("com.google.android.gms.common.GoogleApiAvailability"); + // Retrieve version Field f = clazz.getField("GOOGLE_PLAY_SERVICES_VERSION_CODE"); libVersionCached = f.getInt(null); return libVersionCached; } catch (ClassNotFoundException e) { return null; } catch (Exception e) { - Logger.error(PushModule.TAG, "Error while retreiving Google Play Services lib version", e); + Logger.error(PushModule.TAG, "Error while retrieving Google Play Services lib version", e); return null; } finally { versionChecked = true; } } - // ------------------------------------------------> - - /** - * Check if GCM is available - * - * @param context - * @return Integer errorID. The error's ID. 0 if the library is available both at integration and runtime. Can be null. - */ - public static Integer isPushAvailable(Context context) { - Integer libVersion = getGooglePlayServicesLibVersion(context); - if ( - libVersion == null || libVersion < PUSH_ID_VERSION || !ReflectionHelper.isGMSGoogleCloudMessagingPresent() - ) { - return null; - } - - return getGooglePlayServicesAvailabilityInteger(context); - } - - /** - * Get the push token from GCM. Be careful, this method is synchronous and can take a long time. - * - * @param context Application context - * @return Push token or null if unavailable - */ - public static String getPushToken(Context context, String senderID) { - try { - final Context appContext = context.getApplicationContext(); - - /* - * Retrieve infos - */ - Class clazz = Class.forName("com.google.android.gms.gcm.GoogleCloudMessaging"); - Method singletonMethod = clazz.getMethod("getInstance", Context.class); - Method registerMethod = clazz.getMethod("register", String[].class); - Object singleton = singletonMethod.invoke(null, appContext); - - String[] senderIds = { senderID }; - Object[] args = { senderIds }; - return (String) registerMethod.invoke(singleton, args); - } catch (Exception e) { - // Check for the INVALID_SENDER exception to inform the developer - if (isInvalidSenderException(e)) { - Logger.error( - PushModule.TAG, - "GCM sender id is invalid. Please check your GCM configuration. More info: " + Parameters.DOMAIN_URL - ); - return null; - } else { - if (e.getCause() != null) { - Logger.error( - PushModule.TAG, - "Error while requesting push token to GCM : " + e.getCause().getLocalizedMessage() - ); - } - } - - Logger.error(PushModule.TAG, "Error while registering for push", e); - return null; - } - } - - // ------------------------------------------------> - - /** - * Check if InstanceID based GCM is available - * - * @param context - * @return Integer errorID. The error's ID. 0 if the library is available both at integration and runtime. Can be null. - */ - public static Integer isInstanceIdPushAvailable(Context context) { - Integer libVersion = getGooglePlayServicesLibVersion(context); - if (libVersion == null || libVersion < INSTANCE_ID_VERSION || !ReflectionHelper.isGMSInstanceIDPresent()) { - return null; - } - - return getGooglePlayServicesAvailabilityInteger(context); - } - - /** - * Get the instance token (not the instance id itself), usable with GCM - */ - public static String getInstancePushToken(Context context, String senderID) { - try { - final Context appContext = context.getApplicationContext(); - - /* - * Retrieve infos - */ - Class clazz = Class.forName("com.google.android.gms.iid.InstanceID"); - Method singletonMethod = clazz.getMethod("getInstance", Context.class); - Method registerMethod = clazz.getMethod("getToken", String.class, String.class); - Object singleton = singletonMethod.invoke(null, appContext); - - Object[] args = { senderID, "GCM" }; - return (String) registerMethod.invoke(singleton, args); - } catch (Exception e) { - Logger.internal(PushModule.TAG, "Error while registering for instance id push", e); - - final Throwable cause = e.getCause(); - if (cause instanceof IOException) { - String publicErrorReason; - switch (cause.getMessage()) { - case "INVALID_SENDER": - publicErrorReason = "Sender ID is invalid"; - break; - default: - publicErrorReason = "Unknown error"; - break; - } - - Logger.error(PushModule.TAG, "Could not get GCM Instance ID: " + publicErrorReason); - } - return null; - } - } - - /** - * Check if the exception is an INVALID_SENDER one - * - * @param e - * @return - */ - private static boolean isInvalidSenderException(Exception e) { - return ( - e.getCause() != null && - (e.getCause() instanceof IOException) && - "INVALID_SENDER".equals(e.getCause().getMessage()) - ); - } - - // ------------------------------------------------> - /** * Check if FCM is available * - * @param context + * @param context Android's context * @return Integer errorID. The error's ID. 0 if the library is available both at integration and runtime. Can be null. */ public static Integer isFCMAvailable(Context context) { - Integer libVersion = getGooglePlayServicesLibVersion(context); + Integer libVersion = getGooglePlayServicesLibVersion(); if (libVersion == null || libVersion < FCM_ID_VERSION) { return null; } - return getGooglePlayServicesAvailabilityInteger(context); } } diff --git a/Sources/sdk/src/main/java/com/batch/android/core/InternalPushData.java b/Sources/sdk/src/main/java/com/batch/android/core/InternalPushData.java index 600440e..3dc9e9d 100644 --- a/Sources/sdk/src/main/java/com/batch/android/core/InternalPushData.java +++ b/Sources/sdk/src/main/java/com/batch/android/core/InternalPushData.java @@ -623,28 +623,6 @@ public enum Priority { HIGH, MAX; - @TargetApi(Build.VERSION_CODES.JELLY_BEAN) - public int toAndroidPriority() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - return 0; - } - - switch (this) { - case UNDEFINED: - case DEFAULT: - default: - return Notification.PRIORITY_DEFAULT; - case MIN: - return Notification.PRIORITY_MIN; - case LOW: - return Notification.PRIORITY_LOW; - case HIGH: - return Notification.PRIORITY_HIGH; - case MAX: - return Notification.PRIORITY_MAX; - } - } - public int toSupportPriority() { switch (this) { case UNDEFINED: diff --git a/Sources/sdk/src/main/java/com/batch/android/core/KVUserPreferencesStorage.java b/Sources/sdk/src/main/java/com/batch/android/core/KVUserPreferencesStorage.java index 1b50760..2a9ab16 100644 --- a/Sources/sdk/src/main/java/com/batch/android/core/KVUserPreferencesStorage.java +++ b/Sources/sdk/src/main/java/com/batch/android/core/KVUserPreferencesStorage.java @@ -2,12 +2,16 @@ import android.content.Context; import android.content.SharedPreferences; +import androidx.annotation.AnyThread; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import com.batch.android.processor.Module; import com.batch.android.processor.Singleton; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; /** * UserPreferences implementation of key/value Storage @@ -44,20 +48,31 @@ public class KVUserPreferencesStorage { private boolean useLegacyStorage; /** + * Single thread executor for reading shared prefs + */ + ExecutorService executor = Executors.newSingleThreadExecutor(new NamedThreadFactory()); + + /** + * Constructor * @param context used to get shared prefs */ - public KVUserPreferencesStorage(Context context) { - if (context == null) { - throw new NullPointerException("Null context"); - } - preferences = - context.getApplicationContext().getSharedPreferences(SHARED_PREFERENCES_FILENAME, Context.MODE_PRIVATE); + public KVUserPreferencesStorage(@NonNull Context context) { + // Get shared prefs + preferences = getPreferences(context, SHARED_PREFERENCES_FILENAME); // Check if a data migration is needed migrateIfNeeded(context); } - public boolean persist(String key, String value) { + /** + * Save value into the Shared Preferences + * + * @param key The name of the preference to add. + * @param value The value of the preference to modify. If null equals to remove. + * @return true if operation succeed + */ + @AnyThread + public boolean persist(@NonNull String key, @Nullable String value) { if (useLegacyStorage) { return persistOnLegacyStorage(key, value); } @@ -70,13 +85,28 @@ public boolean persist(String key, String value) { } } + /** + * Get a value from the Shared Preferences + * + * @param key The name of the preference to get. + * @return the value or null + */ @Nullable - public String get(String key) { + @AnyThread + public String get(@NonNull String key) { return get(key, null); } + /** + * Get a value from the Shared Preferences + * + * @param key The name of the preference to get. + * @param defaultValue The value to fallback if operation failed or key doesn't exist. + * @return the value found or default value + */ @Nullable - public String get(String key, String defaultValue) { + @AnyThread + public String get(@NonNull String key, @Nullable String defaultValue) { if (useLegacyStorage) { return getOnLegacyStorage(key, defaultValue); } @@ -87,16 +117,42 @@ public String get(String key, String defaultValue) { return value; } - public boolean contains(String key) { - return preferences.contains(key); + /** + * Check if a value is in the Shared Preferences + * @param key The name of the preference to get. + * @return true if exists + * @throws Exception exception + */ + @AnyThread + public boolean contains(@NonNull String key) throws Exception { + return executor.submit(() -> preferences.contains(key)).get(); } - public void remove(String key) { + /** + * Remove value from the Shared Preferences + * @param key The name of the preference to remove. + */ + @AnyThread + public void remove(@NonNull String key) { preferences.edit().remove(key).apply(); } + /** + * Get the Shared Preferences in a Future + * + * @param context Android's context + * @param name The name of the shared preferences file + * @return the shared prefs + */ + @AnyThread + private SharedPreferences getPreferences(@NonNull Context context, @NonNull String name) { + Context applicationContext = context.getApplicationContext(); + return applicationContext.getSharedPreferences(name, Context.MODE_PRIVATE); + } + @Nullable - private String getOnLegacyStorage(String key, String defaultValue) { + @AnyThread + private String getOnLegacyStorage(@NonNull String key, @Nullable String defaultValue) { Cryptor cryptor = CryptorFactory.getCryptorForType(CryptorFactory.CryptorType.EAS_BASE64); String value = preferences.getString(key, null); if (value == null) { @@ -105,6 +161,7 @@ private String getOnLegacyStorage(String key, String defaultValue) { return cryptor.decrypt(value); } + @AnyThread private boolean persistOnLegacyStorage(String key, String value) { Cryptor cryptor = CryptorFactory.getCryptorForType(CryptorFactory.CryptorType.EAS_BASE64); try { @@ -136,10 +193,7 @@ protected void migrateIfNeeded(Context context) { Logger.internal(TAG, "Data encryption has been successfully migrated"); } else { // Fallback on legacy storage - preferences = - context - .getApplicationContext() - .getSharedPreferences(LEGACY_SHARED_PREFERENCES_FILENAME, Context.MODE_PRIVATE); + preferences = getPreferences(context, LEGACY_SHARED_PREFERENCES_FILENAME); useLegacyStorage = true; } } @@ -155,9 +209,7 @@ protected boolean migrate(Context context) { Cryptor cryptor = CryptorFactory.getCryptorForType(CryptorFactory.CryptorType.EAS_BASE64); // Get data to migrate - SharedPreferences oldPreferences = context - .getApplicationContext() - .getSharedPreferences(LEGACY_SHARED_PREFERENCES_FILENAME, Context.MODE_PRIVATE); + SharedPreferences oldPreferences = getPreferences(context, LEGACY_SHARED_PREFERENCES_FILENAME); Map decryptedData = new HashMap<>(); for (Map.Entry entry : oldPreferences.getAll().entrySet()) { diff --git a/Sources/sdk/src/main/java/com/batch/android/core/Logger.java b/Sources/sdk/src/main/java/com/batch/android/core/Logger.java index 4f98d2e..64c7abf 100644 --- a/Sources/sdk/src/main/java/com/batch/android/core/Logger.java +++ b/Sources/sdk/src/main/java/com/batch/android/core/Logger.java @@ -1,7 +1,8 @@ package com.batch.android.core; import android.util.Log; -import com.batch.android.Batch; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.batch.android.LoggerDelegate; import com.batch.android.LoggerLevel; @@ -27,8 +28,16 @@ public final class Logger { * Logger delegate (optional) * The logger delegate is another logger which receives the same logs as this logger */ + @Nullable public static LoggerDelegate loggerDelegate = null; + /** + * Logger level + * Level that logger should use + */ + @NonNull + public static LoggerLevel loggerLevel = LoggerLevel.INFO; + /** * Is the logger in dev mode */ @@ -43,8 +52,8 @@ private static boolean shouldEnableDevLogs() { // -----------------------------------------> - public static boolean shouldLogForLevel(LoggerLevel level) { - return dev || Batch.getLoggerLevel().canLog(level); + public static boolean shouldLogForLevel(@NonNull LoggerLevel level) { + return dev || loggerLevel.canLog(level); } /** diff --git a/Sources/sdk/src/main/java/com/batch/android/core/NotificationAuthorizationStatus.java b/Sources/sdk/src/main/java/com/batch/android/core/NotificationAuthorizationStatus.java index f9d2ab8..bf1778c 100644 --- a/Sources/sdk/src/main/java/com/batch/android/core/NotificationAuthorizationStatus.java +++ b/Sources/sdk/src/main/java/com/batch/android/core/NotificationAuthorizationStatus.java @@ -13,6 +13,7 @@ import androidx.core.app.NotificationManagerCompat; import com.batch.android.BatchNotificationChannelsManager; import com.batch.android.BatchNotificationChannelsManagerPrivateHelper; +import com.batch.android.BatchPushRegistration; import com.batch.android.PushNotificationType; import com.batch.android.WebserviceLauncher; import com.batch.android.di.providers.BatchNotificationChannelsManagerProvider; @@ -23,7 +24,6 @@ import com.batch.android.event.InternalEvents; import com.batch.android.json.JSONException; import com.batch.android.json.JSONObject; -import com.batch.android.push.Registration; import com.batch.android.runtime.RuntimeManager; import java.util.EnumSet; @@ -83,7 +83,7 @@ public static void checkForNotificationAuthorizationChange(@NonNull Context cont RuntimeManager runtimeManager = RuntimeManagerProvider.get(); boolean sdkReady = runtimeManager.runIfReady(() -> { // Trigger a push token webservice - Registration registration = PushModuleProvider.get().getRegistration(context); + BatchPushRegistration registration = PushModuleProvider.get().getRegistration(context); if (registration == null) { Logger.internal( "Notif. Authorization changed but no registration is available. Not sending update to the server." diff --git a/Sources/sdk/src/main/java/com/batch/android/core/NotificationPermissionHelper.java b/Sources/sdk/src/main/java/com/batch/android/core/NotificationPermissionHelper.java index 96005ea..ac74e95 100644 --- a/Sources/sdk/src/main/java/com/batch/android/core/NotificationPermissionHelper.java +++ b/Sources/sdk/src/main/java/com/batch/android/core/NotificationPermissionHelper.java @@ -11,6 +11,7 @@ import androidx.annotation.RequiresApi; import com.batch.android.BatchNotificationChannelsManagerPrivateHelper; import com.batch.android.BatchPermissionActivity; +import com.batch.android.BatchPermissionListener; import com.batch.android.di.providers.BatchNotificationChannelsManagerProvider; import com.batch.android.di.providers.LocalBroadcastManagerProvider; @@ -21,6 +22,16 @@ public class NotificationPermissionHelper extends BroadcastReceiver { public static final String PERMISSION_NOTIFICATION = "android.permission.POST_NOTIFICATIONS"; + /** + * Public notification permission callback + */ + @Nullable + private final BatchPermissionListener listener; + + public NotificationPermissionHelper(@Nullable BatchPermissionListener listener) { + this.listener = listener; + } + @RequiresApi(api = Build.VERSION_CODES.N) public boolean isNotificationPermissionGranted(Context context) { NotificationManager notificationManager = context.getSystemService(NotificationManager.class); @@ -44,11 +55,17 @@ public void requestPermission( ) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { // Not running on Android 13, no need for permission. + if (listener != null) { + listener.onPermissionRequested(true); + } return; } if (isNotificationPermissionGranted(context)) { Logger.internal(TAG, "Notifications are already enabled, not requesting permission."); + if (listener != null) { + listener.onPermissionRequested(true); + } return; } @@ -87,7 +104,7 @@ public void requestPermission( @RequiresApi(api = Build.VERSION_CODES.O) public boolean isPermissionAlreadyAskedFromOlderSDK(@NonNull Context context) { NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); - return manager.getNotificationChannels().size() > 0; + return !manager.getNotificationChannels().isEmpty(); } /** @@ -106,15 +123,19 @@ public void requestPermissionFromOlderSDK(@NonNull Context context) { /** * Broadcast receiver to handle the permission result - * @param context context - * @param intent broadcasted + * @param context Context + * @param intent Broadcasted intent from BatchPermissionActivity */ @Override public void onReceive(Context context, Intent intent) { String permission = intent.getStringExtra(BatchPermissionActivity.EXTRA_PERMISSION); // Ensure receiver is called for the right permission if (PERMISSION_NOTIFICATION.equals(permission)) { - // Permission result is accessible from extra's intent at BatchPermissionActivity.EXTRA_RESULT + // Notify user whether the permission is granted or not + boolean granted = intent.getBooleanExtra(BatchPermissionActivity.EXTRA_RESULT, false); + if (listener != null) { + listener.onPermissionRequested(granted); + } NotificationAuthorizationStatus.checkForNotificationAuthorizationChange(context); // Unregister receiver as it is registered when permission is requested LocalBroadcastManagerProvider.get(context).unregisterReceiver(this); diff --git a/Sources/sdk/src/main/java/com/batch/android/core/ObjectUserPreferencesStorage.java b/Sources/sdk/src/main/java/com/batch/android/core/ObjectUserPreferencesStorage.java deleted file mode 100644 index 3064c1d..0000000 --- a/Sources/sdk/src/main/java/com/batch/android/core/ObjectUserPreferencesStorage.java +++ /dev/null @@ -1,165 +0,0 @@ -package com.batch.android.core; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.content.SharedPreferences; -import com.batch.android.processor.Module; -import com.batch.android.processor.Singleton; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.io.StreamCorruptedException; - -/** - * UserPreferences implementation of object Storage - * - */ -@Module -@Singleton -public class ObjectUserPreferencesStorage { - - private static final String TAG = "ObjectUserPreferencesStorage"; - - /** - * Name of the shared preferences file - */ - private static final String SHARED_PREFERENCES_FILENAME = "bastion_o"; - - // -------------------------------------> - - /** - * Reference of SharedPreferences - */ - protected SharedPreferences preferences; - /** - * Cryptor used to crypt/decrypt data - */ - private Cryptor cryptor; - - // -------------------------------------> - - /** - * @param context - */ - public ObjectUserPreferencesStorage(Context context) { - if (context == null) { - throw new NullPointerException("Null context"); - } - - preferences = - context.getApplicationContext().getSharedPreferences(SHARED_PREFERENCES_FILENAME, Context.MODE_PRIVATE); - cryptor = CryptorFactory.getCryptorForType(CryptorFactory.CryptorType.EAS_BASE64); - } - - // -------------------------------------> - - public boolean persist(String key, Serializable value) { - try { - return preferences.edit().putString(key, serialize(value)).commit(); - } catch (Exception e) { - Logger.internal(TAG, "Error while persisting object for key " + key, e); - return false; - } - } - - public Object get(String key) throws IOException { - try { - return deserialize(preferences.getString(key, null)); - } catch (Exception e) { - throw new IOException(e.getMessage()); - } - } - - public boolean contains(String key) { - return preferences.contains(key); - } - - @SuppressLint("ApplySharedPref") - public void remove(String key) { - preferences.edit().remove(key).commit(); - } - - // -------------------------------------> - - /** - * Serialize the object to a String using Base64 encode - * - * @param object - * @return - * @throws IOException - */ - private String serialize(Serializable object) throws IOException { - if (object == null) { - throw new NullPointerException("Null object"); - } - - ByteArrayOutputStream baos = null; - ObjectOutputStream oos = null; - try { - baos = new ByteArrayOutputStream(); - oos = new ObjectOutputStream(baos); - oos.writeObject(object); - return ByteArrayHelper.getUTF8String(cryptor.encrypt(baos.toByteArray())); - } finally { - if (oos != null) { - try { - oos.close(); - } catch (Exception e) { - Logger.internal(TAG, "Error while closing ObjectOutputStream", e); - } - } - - if (baos != null) { - try { - baos.close(); - } catch (Exception e) { - Logger.internal(TAG, "Error while closing ByteArrayOutputStream", e); - } - } - } - } - - /** - * Deserialize the serialized String using Base64 - * - * @param serialized - * @return - * @throws StreamCorruptedException - * @throws IOException - * @throws ClassNotFoundException - */ - private Object deserialize(String serialized) throws StreamCorruptedException, IOException, ClassNotFoundException { - if (serialized == null) { - return null; - } - - ByteArrayInputStream ais = null; - ObjectInputStream ois = null; - try { - byte[] data = cryptor.decryptToByte(serialized); - ais = new ByteArrayInputStream(data); - ois = new ObjectInputStream(ais); - Object value = ois.readObject(); - return value; - } finally { - if (ais != null) { - try { - ais.close(); - } catch (Exception e) { - Logger.internal(TAG, "Error while closing ArrayInputStream", e); - } - } - - if (ois != null) { - try { - ois.close(); - } catch (Exception e) { - Logger.internal(TAG, "Error while closing ObjectInputStream", e); - } - } - } - } -} diff --git a/Sources/sdk/src/main/java/com/batch/android/core/ParameterKeys.java b/Sources/sdk/src/main/java/com/batch/android/core/ParameterKeys.java index 2a0741e..2958ba2 100644 --- a/Sources/sdk/src/main/java/com/batch/android/core/ParameterKeys.java +++ b/Sources/sdk/src/main/java/com/batch/android/core/ParameterKeys.java @@ -106,24 +106,20 @@ public final class ParameterKeys public final static String DEFAULT_RETRY_NUMBER_KEY = "ws.defaultRetry"; public final static String DEFAULT_CONNECT_TIMEOUT_KEY = "ws.defaultconnectTimeout"; public final static String DEFAULT_READ_TIMEOUT_KEY = "ws.defaultreadTimeout"; - public final static String WEBSERVICE_IDS_PARAMETERS = "app.ids.pattern"; - public final static String WEBSERVICE_IDS_ADVANCED_PARAMETERS = "app.ids.pattern_advanced"; public final static String INSTALL_ID_KEY = "app.install.id"; public final static String INSTALL_TIMESTAMP_KEY = "app.install.timestamp"; - public final static String SERVER_ID_KEY = "app.server.id"; public final static String TASK_EXECUTOR_MIN_POOL = "app.executor.minpool"; public final static String TASK_EXECUTOR_MAX_POOL = "app.executor.maxpool"; public final static String TASK_EXECUTOR_THREADTTL = "app.executor.threadttl"; public final static String SCHEME_CODE_PATTERN = "app.scheme.codepattern"; public final static String CUSTOM_ID = "app.id.custom"; - public final static String ATTRIBUTION_ID = "app.id.attribution"; public final static String USER_DATA_VERSION = "app.profile.version"; + public final static String PROJECT_KEY = "app.project.key"; public final static String SERVER_TIMESTAMP = "ws.server.timestamp"; public final static String EVENT_TRACKER_INITIAL_DELAY = "tracker.delay.initial"; public final static String EVENT_TRACKER_MAX_DELAY = "tracker.delay.max"; public final static String EVENT_TRACKER_BATCH_QUANTITY = "tracker.batch.quantity"; public final static String EVENT_TRACKER_EVENTS_LIMIT = "tracker.db.limit"; - public final static String EVENT_TRACKER_STATE = "tracker.state"; public final static String PUSH_REGISTRATION_ID_KEY = "push.registration.id"; public final static String PUSH_REGISTRATION_PROVIDER_KEY = "push.registration.provider"; public final static String PUSH_REGISTRATION_SENDERID_KEY = "push.registration.sender_id"; @@ -143,5 +139,7 @@ public final class ParameterKeys public final static String SHARED_PREFS_STORAGE_VERSION = "app.shared_prefs.version"; + public final static String DATA_COLLECTION_CONFIG_KEY = "data.privacy.config"; + } //@formatter:on diff --git a/Sources/sdk/src/main/java/com/batch/android/core/Parameters.java b/Sources/sdk/src/main/java/com/batch/android/core/Parameters.java index 351a604..999e3f7 100644 --- a/Sources/sdk/src/main/java/com/batch/android/core/Parameters.java +++ b/Sources/sdk/src/main/java/com/batch/android/core/Parameters.java @@ -1,6 +1,8 @@ package com.batch.android.core; import android.content.Context; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.batch.android.BuildConfig; import com.batch.android.di.providers.KVUserPreferencesStorageProvider; import com.batch.android.processor.Module; @@ -172,7 +174,6 @@ public final class Parameters { appParameters.put(ParameterKeys.LOCAL_CAMPAIGNS_JIT_WS_CONNECT_TIMEOUT_KEY, "1000"); appParameters.put(ParameterKeys.LOCAL_CAMPAIGNS_WS_INITIAL_DELAY, "5"); - appParameters.put(ParameterKeys.EVENT_TRACKER_STATE, "2"); appParameters.put(ParameterKeys.EVENT_TRACKER_INITIAL_DELAY, "10000"); appParameters.put(ParameterKeys.EVENT_TRACKER_MAX_DELAY, "120000"); appParameters.put(ParameterKeys.EVENT_TRACKER_BATCH_QUANTITY, "20"); @@ -184,8 +185,6 @@ public final class Parameters { appParameters.put(ParameterKeys.TASK_EXECUTOR_MAX_POOL, "5"); appParameters.put(ParameterKeys.TASK_EXECUTOR_THREADTTL, "1000"); appParameters.put(ParameterKeys.SCHEME_CODE_PATTERN, "^batch[A-Za-z0-9]{4,}://unlock/code/([^/\\?]+)"); - appParameters.put(ParameterKeys.WEBSERVICE_IDS_PARAMETERS, "lvl,mlvl,dla,dre,dtz,osv,da,apv,apc,bid,di,i,idv,cus,lda,fda,did,sdk,brv,plv,s,nkd"); - appParameters.put(ParameterKeys.WEBSERVICE_IDS_ADVANCED_PARAMETERS, "dty,brd,ntn,ntc,son,sop,sco"); } //@formatter:on @@ -202,7 +201,7 @@ public final class Parameters { /** * Application context */ - protected Context applicationContext; + private final Context applicationContext; /** * Cache parameters, lost at app close @@ -212,7 +211,7 @@ public final class Parameters { // -------------------------------------------> /** - * @param context + * @param context The Android's context */ public Parameters(Context context) { if (context == null) { @@ -231,7 +230,7 @@ public Parameters(Context context) { /** * Get parameter value * - * @param key + * @param key The key of the parameter * @return value if found, null otherwise */ public String get(String key) { @@ -251,25 +250,20 @@ public String get(String key) { return userValue; } - String appValue = appParameters.get(key); - if (appValue != null) { - return appValue; - } - - return null; + return appParameters.get(key); } /** * Get parameter value. * - * @param key - * @param failure + * @param key The key of the parameter + * @param fallback The fallback if no value found * @return value if found, failure otherwise. */ - public String get(String key, String failure) { + public String get(String key, String fallback) { String value = get(key); if (value == null || value.length() == 0) { - return failure; + return fallback; } return value; @@ -278,11 +272,11 @@ public String get(String key, String failure) { /** * Set the parameter * - * @param key - * @param value + * @param key The key of the parameter + * @param value the value of the parameter * @param save if true, the value will be here at next app launch, it will be lost otherwise */ - public void set(String key, String value, boolean save) { + public void set(@NonNull String key, @NonNull String value, boolean save) { if (key == null) { throw new NullPointerException("Null key"); } @@ -300,10 +294,36 @@ public void set(String key, String value, boolean save) { } } + /** + * Set the parameter or remove it if null + * + * @param key The key of the parameter + * @param value the value of the parameter + * @param save if true, the value will be here at next app launch, it will be lost otherwise + */ + public void setOrRemove(@NonNull String key, @Nullable String value, boolean save) { + if (key == null) { + throw new NullPointerException("Null key"); + } + + if (value == null) { + this.remove(key); + return; + } + + synchronized (cacheParameters) { + cacheParameters.put(key, value); + } + + if (save) { + KVUserPreferencesStorageProvider.get(applicationContext).persist(PARAMETERS_KEY_PREFIX + key, value); + } + } + /** * Remove the value of the given parameter * - * @param key + * @param key The key of the parameter to remove */ public void remove(String key) { if (key == null) { diff --git a/Sources/sdk/src/main/java/com/batch/android/core/ReflectionHelper.java b/Sources/sdk/src/main/java/com/batch/android/core/ReflectionHelper.java index a414508..469a155 100644 --- a/Sources/sdk/src/main/java/com/batch/android/core/ReflectionHelper.java +++ b/Sources/sdk/src/main/java/com/batch/android/core/ReflectionHelper.java @@ -85,27 +85,5 @@ public static void optOutOfDarkModeRecursively(@Nullable View view) { } } } - - //endregion - - //region Google Play Services - - public static boolean isGMSGoogleCloudMessagingPresent() { - try { - Class.forName("com.google.android.gms.gcm.GoogleCloudMessaging"); - return true; - } catch (Throwable ex) { - return false; - } - } - - public static boolean isGMSInstanceIDPresent() { - try { - Class.forName("com.google.android.gms.iid.InstanceID"); - return true; - } catch (Throwable ex) { - return false; - } - } //endregion } diff --git a/Sources/sdk/src/main/java/com/batch/android/core/SystemParameterHelper.java b/Sources/sdk/src/main/java/com/batch/android/core/SystemParameterHelper.java deleted file mode 100644 index 0df9e87..0000000 --- a/Sources/sdk/src/main/java/com/batch/android/core/SystemParameterHelper.java +++ /dev/null @@ -1,602 +0,0 @@ -package com.batch.android.core; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; -import android.content.res.Configuration; -import android.graphics.Point; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; -import android.os.Build; -import android.telephony.TelephonyManager; -import android.util.DisplayMetrics; -import android.view.Display; -import android.view.WindowManager; -import java.util.Date; -import java.util.Locale; -import java.util.TimeZone; - -/** - * Helper to retrieve Android system configuration. - */ -public final class SystemParameterHelper { - - private static final String TAG = "SystemParameterHelper"; - - /** - * Return the bundle name of the application. - * - * @param applicationContext The application context. - * @return The application bundle name. - */ - public static String getBundleName(Context applicationContext) { - return applicationContext.getPackageName(); - } - - /** - * Get the current device timezone. - * - * @return timezone or null on failure. - */ - public static String getDeviceTimezone() { - try { - return TimeZone.getDefault().getID(); - } catch (Exception e) { - return null; - } - } - - /** - * Get the current device language - * - * @return language - */ - public static String getDeviceLanguage() { - final Locale locale = Locale.getDefault(); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - return locale.toLanguageTag(); - } - - // Pre lollipop fallback - - String language = locale.getLanguage(); - - // fix wrong android device locale - if (language.equals("in")) { - return "id"; - } - if (language.equals("iw")) { - return "he"; - } - if (language.equals("ji")) { - return "yi"; - } - return language; - } - - /** - * Get the current device country - * - * @return country - */ - public static String getDeviceCountry() { - return Locale.getDefault().getCountry(); - } - - /** - * Return the device date formatted with RFC 3339 format - * - * @return - */ - public static String getDeviceDate() { - return Webservice.formatDate(new Date()); - } - - /** - * Get very first installation date. - * - * @param applicationContext The application context. - * @return Installation date or null on failure. - */ - public static Long getFirstInstallDate(Context applicationContext) { - try { - PackageManager packageManager = applicationContext.getPackageManager(); - PackageInfo informations = packageManager.getPackageInfo(applicationContext.getPackageName(), 0); - - return informations.firstInstallTime; - } catch (Exception ignored) {} - - return null; - } - - /** - * Get last update date. - * - * @param applicationContext The application context. - * @return Last update date or null on failure. - */ - @SuppressLint("NewApi") - public static Long getLastUpdateDate(Context applicationContext) { - try { - PackageManager packageManager = applicationContext.getPackageManager(); - PackageInfo informations = packageManager.getPackageInfo(applicationContext.getPackageName(), 0); - - return informations.lastUpdateTime; - } catch (Exception ignored) {} - - return null; - } - - /** - * Return the Brand name of the device - * - * @return Brand name if found, null otherwise - */ - public static String getDeviceBrand() { - try { - return Build.BRAND; - } catch (Exception ignored) {} - - return null; - } - - /** - * Return the device model of the phone. - * - * @return The device model if found, null otherwise. - */ - public static String getDeviceModel() { - try { - return Build.MODEL; - } catch (Exception ignored) {} - - return null; - } - - /** - * Return the current version of the application. - * - * @param applicationContext The application context. - * @return AppVersion if found, null otherwise - */ - public static String getAppVersion(Context applicationContext) { - try { - PackageInfo infos = applicationContext - .getPackageManager() - .getPackageInfo(getBundleName(applicationContext), 0); - return infos.versionName; - } catch (NameNotFoundException e) { - return null; - } - } - - /** - * Return the current version code of the application. - * - * @param applicationContext The application context. - * @return AppVersion code if found, null otherwise - */ - public static Integer getAppVersionCode(Context applicationContext) { - try { - PackageManager packageManager = applicationContext.getApplicationContext().getPackageManager(); - PackageInfo informations = packageManager.getPackageInfo( - applicationContext.getApplicationContext().getPackageName(), - 0 - ); - - return informations.versionCode; - } catch (Exception e) { - return null; - } - } - - /** - * Return the version of Android of the phone. - * - * @return Version. - */ - public static String getOSVersion() { - return String.format("Android %s", Build.VERSION.RELEASE); - } - - private static ConnectivityManager getConnectivityManager(Context applicationContext) { - if (!GenericHelper.checkPermission("android.permission.ACCESS_NETWORK_STATE", applicationContext)) { - return null; - } - - return (ConnectivityManager) applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE); - } - - private static TelephonyManager getTelephonyManager(Context applicationContext) { - return (TelephonyManager) applicationContext.getSystemService(Context.TELEPHONY_SERVICE); - } - - /* - * SIM informations. - */ - - /** - * Get the telephony operator name. - * - * @param applicationContext The application context. - * @return Operator name or null. - */ - public static String getSimOperatorName(Context applicationContext) { - /* - * Need permission READ_PHONE_STATE - */ - if (!GenericHelper.checkPermission("android.permission.READ_PHONE_STATE", applicationContext)) { - return null; - } - - try { - return SystemParameterHelper.getTelephonyManager(applicationContext).getSimOperatorName(); - } catch (Exception e) { - return null; - } - } - - /** - * Get the operator MCC+MNC (Mobile Country Code + Mobile Network Code) - * - * @param applicationContext The application context. - * @return The Mobile code or null. - */ - public static String getSimOperator(Context applicationContext) { - try { - return SystemParameterHelper.getTelephonyManager(applicationContext).getSimOperator(); - } catch (Exception e) { - return null; - } - } - - /** - * Get the operator ISO country code. - * - * @param applicationContext The application context. - * @return The country code of null. - */ - public static String getSimCountryIso(Context applicationContext) { - /* - * Need permission READ_PHONE_STATE - */ - if (!GenericHelper.checkPermission("android.permission.READ_PHONE_STATE", applicationContext)) { - return null; - } - - try { - return SystemParameterHelper.getTelephonyManager(applicationContext).getSimCountryIso(); - } catch (Exception e) { - return null; - } - } - - /** - * Get the mobile network name. - * - * @param applicationContext The application context. - * @return Network name or null. - */ - public static String getNetworkOperatorName(Context applicationContext) { - /* - * Need permission READ_PHONE_STATE - */ - if (!GenericHelper.checkPermission("android.permission.READ_PHONE_STATE", applicationContext)) { - return null; - } - - try { - return SystemParameterHelper.getTelephonyManager(applicationContext).getNetworkOperatorName(); - } catch (Exception e) { - return null; - } - } - - /** - * Get the network ISO country code. - * - * @param applicationContext The application context. - * @return Network country core or null. - */ - public static String getNetworkCountryIso(Context applicationContext) { - /* - * Need permission READ_PHONE_STATE - */ - if (!GenericHelper.checkPermission("android.permission.READ_PHONE_STATE", applicationContext)) { - return null; - } - - try { - return SystemParameterHelper.getTelephonyManager(applicationContext).getNetworkCountryIso(); - } catch (Exception e) { - return null; - } - } - - // ----------------------------------------> - - private static NetworkInfo getNetworkInfos(Context applicationContext) { - /* - * Need the ACCESS_NETWORK_STATE - */ - if (!GenericHelper.checkPermission("android.permission.ACCESS_NETWORK_STATE", applicationContext)) { - return null; - } - - try { - ConnectivityManager connectivityManager = (ConnectivityManager) applicationContext.getSystemService( - Context.CONNECTIVITY_SERVICE - ); - // noinspection AndroidLintMissingPermission - return connectivityManager.getActiveNetworkInfo(); - } catch (Exception e) { - return null; - } - } - - /** - * Tell whether the network is in roaming mode. - * - * @param applicationContext The application context. - * @return true/false, null on failure. - */ - public static Boolean isNetRoaming(Context applicationContext) { - /* - * Need the ACCESS_NETWORK_STATE - */ - if (!GenericHelper.checkPermission("android.permission.ACCESS_NETWORK_STATE", applicationContext)) { - return null; - } - - try { - return SystemParameterHelper.getNetworkInfos(applicationContext).isRoaming(); - } catch (Exception e) { - return null; - } - } - - /** - * Get the version of the Bridge currently using Batch if available - * - * @return Bridge version string - */ - public static String getBridgeVersion() { - return System.getProperty(Parameters.BRIDGE_VERSION_ENVIRONEMENT_VAR, ""); - } - - /** - * Get the version of the Plugin currently using Batch if available - * - * @return Plugin version string - */ - public static String getPluginVersion() { - return System.getProperty(Parameters.PLUGIN_VERSION_ENVIRONEMENT_VAR, ""); - } - - // ------------------------------------------------------> - - /** - * Get the screen height - * - * @param context - * @return height if found, 0 on error - */ - - public static int getScreenHeight(Context context) { - try { - return getScreenSize(context).y; - } catch (Exception e) { - return 0; - } - } - - /** - * Get screen width - * - * @param context - * @return width if found, 0 on error - */ - public static int getScreenWidth(Context context) { - try { - return getScreenSize(context).x; - } catch (Exception e) { - return 0; - } - } - - /** - * Get the screen size of the device - * - * @param context - * @return - */ - @SuppressLint("NewApi") - @SuppressWarnings("deprecation") - private static Point getScreenSize(Context context) { - WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); - Display display = wm.getDefaultDisplay(); - - Point size = new Point(); - - display.getSize(size); - - if (size.x >= size.y) { // Always consider that width should be < to height - int y = size.y; - - size.y = size.x; - size.x = y; - } - - return size; - } - - /** - * Return the current display orientation ( http://stackoverflow.com/a/4698003 ) - * - * @param context - * @return {@link Configuration#ORIENTATION_LANDSCAPE} or {@link Configuration#ORIENTATION_PORTRAIT}. {@link Configuration#ORIENTATION_UNDEFINED} on error - */ - public static int getScreenOrientation(Context context) { - try { - return context.getResources().getConfiguration().orientation; - } catch (Exception e) { - return Configuration.ORIENTATION_UNDEFINED; - } - } - - /** - * Return the connected network kind - * - * @param context - * @return null if unknown (usually means that ACCESS_NETWORK_STATE isn't granted), 1 for wifi/ethernet/dummy, 0 for everything else. - */ - public static Integer getNetworkKind(Context context) { - try { - ConnectivityManager connectivityMgr = getConnectivityManager(context); - if (connectivityMgr == null) { - return null; - } - - // noinspection AndroidLintMissingPermission - NetworkInfo activeNetworkInfo = connectivityMgr.getActiveNetworkInfo(); - if (activeNetworkInfo == null || !activeNetworkInfo.isConnected()) { - return null; - } - - int type = activeNetworkInfo.getType(); - - if ( - type == ConnectivityManager.TYPE_WIFI || - type == ConnectivityManager.TYPE_DUMMY || - type == ConnectivityManager.TYPE_ETHERNET || - type == ConnectivityManager.TYPE_WIMAX - ) { - return 1; - } - - return 0; - } catch (Exception e) { - return null; - } - } - - // ------------------------------------------------------> - - /** - * Get property data from it's short parameter name. - * - * @param shortName - * @return - */ - public static String getValue(String shortName, Context context) { - // Find short parameter in enum. - SystemParameterShortName param = null; - try { - param = SystemParameterShortName.fromShortValue(shortName); - } catch (IllegalStateException e) { - Logger.internal(TAG, "Invalid short name : " + shortName); - return null; - } - - // Retrieve the value. - String value = null; - switch (param) { - case BUNDLE_NAME: - value = getBundleName(context); - break; - case DEVICE_TIMEZONE: - value = getDeviceTimezone(); - break; - case FIRST_INSTALL_DATE: - value = Webservice.formatDate(new Date(getFirstInstallDate(context))); - break; - case LAST_UPDATE_DATE: - value = Webservice.formatDate(new Date(getLastUpdateDate(context))); - break; - case BRAND: - value = getDeviceBrand(); - break; - case SDK_LEVEL: - value = String.valueOf(Build.VERSION.SDK_INT); - break; - case APPLICATION_VERSION: - value = getAppVersion(context); - break; - case APPLICATION_CODE: - value = String.valueOf(getAppVersionCode(context)); - break; - case OS_VERSION: - value = getOSVersion(); - break; - case SIM_OPERATOR_NAME: - value = getSimOperatorName(context); - break; - case SIM_OPERATOR: - value = getSimOperator(context); - break; - case SIM_COUNTRY: - value = getSimCountryIso(context); - break; - case NETWORK_NAME: - value = getNetworkOperatorName(context); - break; - case NETWORK_COUNTRY: - value = getNetworkCountryIso(context); - break; - case ROAMING: - value = String.valueOf(isNetRoaming(context)); - break; - case DEVICE_LANGUAGE: - value = getDeviceLanguage(); - break; - case DEVICE_REGION: - value = getDeviceCountry(); - break; - case DEVICE_TYPE: - value = getDeviceModel(); - break; - case DEVICE_DATE: - value = getDeviceDate(); - break; - case API_LEVEL: - value = String.valueOf(Parameters.API_LEVEL); - break; - case MESSAGING_API_LEVEL: - value = String.valueOf(Parameters.MESSAGING_API_LEVEL); - break; - case SCREEN_HEIGHT: - value = String.valueOf(getScreenHeight(context)); - break; - case SCREEN_WIDTH: - value = String.valueOf(getScreenWidth(context)); - break; - case SCREEN_ORIENTATION: - { - int orientation = getScreenOrientation(context); - if (orientation == Configuration.ORIENTATION_LANDSCAPE) { - return "L"; - } else if (orientation == Configuration.ORIENTATION_PORTRAIT) { - return "P"; - } else { - return "U"; - } - } - case NETWORK_KIND: - { - Integer kind = getNetworkKind(context); - if (kind == null) { - return null; - } else { - return String.valueOf(kind); - } - } - default: - break; - } - - return value; - } -} diff --git a/Sources/sdk/src/main/java/com/batch/android/core/SystemParameterShortName.java b/Sources/sdk/src/main/java/com/batch/android/core/SystemParameterShortName.java deleted file mode 100644 index ef053d1..0000000 --- a/Sources/sdk/src/main/java/com/batch/android/core/SystemParameterShortName.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.batch.android.core; - -/** - * Enum of system parameter short names - * - */ -public enum SystemParameterShortName { - BUNDLE_NAME("bid"), - - DEVICE_TIMEZONE("dtz"), - - FIRST_INSTALL_DATE("fda"), - - LAST_UPDATE_DATE("lda"), - - BRAND("brd"), - - SDK_LEVEL("sdk"), - - DEVICE_TYPE("dty"), - - DEVICE_LANGUAGE("dla"), - - DEVICE_REGION("dre"), - - DEVICE_DATE("da"), - - /** - * ID if the installation on the device - */ - INSTALL_ID("di"), - /** - * Date of the install of Batch's first launch - */ - DEVICE_INSTALL_DATE("did"), - - /** - * ID of the installation on the server - */ - SERVER_ID("i"), - - ATTRIBUTION_ID("idv"), - - /** - * Session id, regenerated at each start - */ - SESSION_ID("s"), - - APPLICATION_VERSION("apv"), - - APPLICATION_CODE("apc"), - - OS_VERSION("osv"), - - SIM_OPERATOR_NAME("son"), - - SIM_OPERATOR("sop"), - - SIM_COUNTRY("sco"), - - NETWORK_NAME("ntn"), - - NETWORK_COUNTRY("ntc"), - - ROAMING("roa"), - - API_LEVEL("lvl"), - - MESSAGING_API_LEVEL("mlvl"), - - CUSTOM_USER_ID("cus"), - - /** - * Same bridge/plugin version as the useragent - */ - BRIDGE_VERSION("brv"), - - PLUGIN_VERSION("plv"), - - SCREEN_WIDTH("sw"), - - SCREEN_HEIGHT("sh"), - - SCREEN_ORIENTATION("so"), - - NETWORK_KIND("nkd"); - - /** - * Unique short name. - */ - public String shortName; - - /** - * Standad constructor. - * - * @param name - */ - SystemParameterShortName(String name) { - shortName = name; - } - - /** - * Retrieve the Enum value from a string - * - * @param shortName - * @return - * @throws IllegalStateException if not found - */ - public static SystemParameterShortName fromShortValue(String shortName) { - if (shortName == null) { - throw new NullPointerException("Null short name"); - } - - for (SystemParameterShortName param : values()) { - if (param.shortName.equalsIgnoreCase(shortName)) { - return param; - } - } - - throw new IllegalStateException("No system parameter found for short name : " + shortName); - } -} diff --git a/Sources/sdk/src/main/java/com/batch/android/core/TLSSocketFactory.java b/Sources/sdk/src/main/java/com/batch/android/core/TLSSocketFactory.java index f3b2178..c33e7a0 100644 --- a/Sources/sdk/src/main/java/com/batch/android/core/TLSSocketFactory.java +++ b/Sources/sdk/src/main/java/com/batch/android/core/TLSSocketFactory.java @@ -4,7 +4,6 @@ import java.io.IOException; import java.net.InetAddress; import java.net.Socket; -import java.net.UnknownHostException; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; @@ -16,21 +15,15 @@ public class TLSSocketFactory extends SSLSocketFactory { - private static List enabledProtocols; + private static final List enabledProtocols; - private SSLSocketFactory internalSSLSocketFactory; - private String[] protocols; + private final SSLSocketFactory internalSSLSocketFactory; + private final String[] protocols; static { enabledProtocols = new ArrayList<>(); - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT_WATCH) { - enabledProtocols.add("TLSv1"); - enabledProtocols.add("TLSv1.1"); - enabledProtocols.add("TLSv1.2"); - } else if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) { - enabledProtocols.add("TLSv1.2"); - } else { - enabledProtocols.add("TLSv1.2"); + enabledProtocols.add("TLSv1.2"); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { enabledProtocols.add("TLSv1.3"); } } @@ -67,13 +60,12 @@ public Socket createSocket(Socket s, String host, int port, boolean autoClose) t } @Override - public Socket createSocket(String host, int port) throws IOException, UnknownHostException { + public Socket createSocket(String host, int port) throws IOException { return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port)); } @Override - public Socket createSocket(String host, int port, InetAddress localHost, int localPort) - throws IOException, UnknownHostException { + public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException { return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port, localHost, localPort)); } diff --git a/Sources/sdk/src/main/java/com/batch/android/core/TypedID.java b/Sources/sdk/src/main/java/com/batch/android/core/TypedID.java deleted file mode 100644 index 657c7d1..0000000 --- a/Sources/sdk/src/main/java/com/batch/android/core/TypedID.java +++ /dev/null @@ -1,371 +0,0 @@ -package com.batch.android.core; - -import androidx.annotation.NonNull; -import com.batch.android.core.TypedIDExceptions.*; -import java.io.ByteArrayOutputStream; -import java.nio.ByteBuffer; -import java.nio.charset.Charset; -import java.util.Locale; -import java.util.Objects; -import java.util.UUID; -import java.util.zip.CRC32; - -public class TypedID { - - private static final Charset UTF_8_CHARSET = Charset.forName("UTF-8"); - - static final String CUSTOM_ENCODING = "0123456789abcdefghjkmnpqrstvwxyz"; - - private static final char SEPARATOR = '_'; - private static final int MAX_TYPE_LENGTH = 10; - private static final int BASE32_PART_LENGTH = 32; - - private static final Base32Encoding base32Encoding = new Base32Encoding(CUSTOM_ENCODING); - - public final String type; - public final Ulid ulid; - - TypedID(String type, Ulid ulid) throws InvalidTypeException { - checkTypeIsAlnum(type); - - Objects.requireNonNull(type); - Objects.requireNonNull(ulid); - - this.type = type; - this.ulid = ulid; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - TypedID typedID = (TypedID) o; - return type.equals(typedID.type) && ulid.equals(typedID.ulid); - } - - @Override - public int hashCode() { - return Objects.hash(type, ulid); - } - - /** - * Encodes the binary representation of this typed identifier to a byte array - * - * @return a binary representation of the typed identifier - */ - public byte[] toBytes() { - ByteArrayOutputStream output = new ByteArrayOutputStream(); - for (byte b : type.getBytes(UTF_8_CHARSET)) { - output.write(b); - } - output.write(SEPARATOR); - for (byte b : ulid.toBytes()) { - output.write(b); - } - return output.toByteArray(); - } - - /** - * Decodes a binary representation of a typed identifier. - * - * @param input The bytes of the typed identifier - * @return A valid typed identifier - * @throws InvalidTypeException when the type is invalid for some reason - * @throws InvalidSizeException when some part of the typed identifier doesn't have the right size - * @throws InvalidSeparatorException when the separator is invalid or not present - */ - public static TypedID fromBytes(byte[] input) - throws InvalidSeparatorException, InvalidTypeException, InvalidSizeException { - Objects.requireNonNull(input); - - // Find the separator - int separatorPos = -1; - for (int i = 0; i < input.length; i++) { - if (input[i] == SEPARATOR) { - separatorPos = i; - break; - } - } - if (separatorPos == -1) { - throw new InvalidSeparatorException(); - } - if (separatorPos > MAX_TYPE_LENGTH) { - throw new InvalidTypeException("type is too long"); - } - - // Extract and validate the type - String type = new String(input, 0, separatorPos, UTF_8_CHARSET); - checkTypeIsAlnum(type); - - // Extract the ULID - int remainingLength = input.length - (separatorPos + 1); - if (remainingLength != Ulid.ULID_BYTES) { - String message = String.format(Locale.US, "invalid ulid of length %d", remainingLength); - throw new InvalidSizeException(message); - } - - byte[] ulidBytes = new byte[Ulid.ULID_BYTES]; - System.arraycopy(input, separatorPos + 1, ulidBytes, 0, Ulid.ULID_BYTES); - - Ulid ulid; - try { - ulid = Ulid.from(ulidBytes); - } catch (Ulid.InvalidBufferSizeException e) { - throw new InvalidSizeException(e.getMessage()); - } - - return newWithULID(type, ulid); - } - - /** - * Encodes the text representation of this typed identifier to a string - * - * @return a text representation of the typed identifier - */ - @NonNull - public String toString() { - // First get the checksum - byte[] checksummableBytes = toBytes(); - int checksum = getChecksum(checksummableBytes); - - // Then encode - ByteArrayOutputStream output = new ByteArrayOutputStream(); - for (byte b : type.getBytes(UTF_8_CHARSET)) { - output.write(b); - } - output.write(SEPARATOR); - encodeMainPart(ulid, checksum, output); - - return new String(output.toByteArray(), UTF_8_CHARSET); - } - - /** - * Generates a new typed identifier of the type {@code type} and with a new random ULID using - * - * @param type The type of the typed identifier - * @return A valid typed identifier instance - * @throws InvalidTypeException when the type is invalid for some reason - */ - public static TypedID newWithRandomULID(String type) throws InvalidTypeException { - Ulid ulid = Ulid.randomUlid(); - return newWithULID(type, ulid); - } - - /** - * Generates a new typed identifier of the type {@code type} and with the ULID {@code ulid}. - * Does some sanity checks on the type and ULID. - * - * @param type The type of the typed identifier - * @param ulid The ULID for the typed identifier - * @return A valid typed identifier instance - * @throws InvalidTypeException when the type is invalid for some reason - */ - public static TypedID newWithULID(String type, Ulid ulid) throws InvalidTypeException { - Objects.requireNonNull(type); - if (type.length() == 0) { - throw new InvalidTypeException("type is empty"); - } - if (type.length() > MAX_TYPE_LENGTH) { - throw new InvalidTypeException("type " + type + " is invalid"); - } - Objects.requireNonNull(ulid); - - return new TypedID(type, ulid); - } - - /** - * Generates a new typed identifier of the type {@code type} and with the UUID {@code uuid}. - * Does some sanity checks on the type and ULID. - * - * @param type The type of the typed identifier - * @param uuid The base UUID of the ULID for the typed identifier ( - * @return A valid typed identifier instance - * @throws InvalidTypeException when the type is invalid for some reason - */ - public static TypedID newWithUUID(String type, UUID uuid) throws InvalidTypeException, InvalidSizeException { - Objects.requireNonNull(type); - if (type.length() == 0) { - throw new InvalidTypeException("type is empty"); - } - if (type.length() > MAX_TYPE_LENGTH) { - throw new InvalidTypeException("type " + type + " is invalid"); - } - ByteBuffer buffer = ByteBuffer - .allocate(16) - .putLong(uuid.getMostSignificantBits()) - .putLong(uuid.getLeastSignificantBits()); - Ulid ulid; - try { - ulid = Ulid.from(buffer.array()); - } catch (Ulid.InvalidBufferSizeException e) { - throw new InvalidSizeException(e.getMessage()); - } - Objects.requireNonNull(ulid); - return new TypedID(type, ulid); - } - - /** - * Parse parses the input string as a typed identifier. - * - * @param input The input string - * @return A valid typed identifier - * @throws InvalidTypeException when the type is invalid for some reason - * @throws InvalidSizeException when some part of the typed identifier doesn't have the right size - * @throws InvalidSeparatorException when the separator is invalid or not present - * @throws InvalidChecksumException when the checksum is invalid - * @throws InvalidIDException when any part of the typed identifier is invalid - */ - public static TypedID parse(String input) - throws InvalidTypeException, InvalidSizeException, InvalidSeparatorException, InvalidChecksumException, InvalidIDException { - Objects.requireNonNull(input); - - int separatorPos = input.indexOf(SEPARATOR); - if (separatorPos == -1) { - throw new InvalidSeparatorException(); - } - - // Extract and validate the type - String type = input.substring(0, separatorPos); - if (type.length() > MAX_TYPE_LENGTH) { - throw new InvalidTypeException("type is too long"); - } - checkTypeIsAlnum(type); - - // Decode the main part - String mainPart = input.substring(separatorPos + 1); - DecodedMainPart decodedMainPart = decodeMainPart(mainPart); - - // Compute the checksum and verify it - ByteArrayOutputStream checksummableBytes = new ByteArrayOutputStream(); - for (byte b : type.getBytes(UTF_8_CHARSET)) { - checksummableBytes.write(b); - } - checksummableBytes.write(SEPARATOR); - for (byte b : decodedMainPart.ulid.toBytes()) { - checksummableBytes.write(b); - } - - int computedChecksum = getChecksum(checksummableBytes.toByteArray()); - if (computedChecksum != decodedMainPart.checksum) { - String message = String.format("invalid checksum %x", decodedMainPart.checksum); - throw new InvalidChecksumException(message); - } - - // Finally populate the result typed identifier - return new TypedID(type, decodedMainPart.ulid); - } - - /** - * Encode the main part of a typed identifier to base32 - * - * @param ulid The ULID of the typed identifier - * @param checksum The checksum, CRC32(type+separator+ulid bytes) - * @param output The base32-encoded main part of the typed identifier - */ - private static void encodeMainPart(Ulid ulid, int checksum, ByteArrayOutputStream output) { - ByteBuffer buffer = ByteBuffer.allocate(Ulid.ULID_BYTES + 4); - buffer.put(ulid.toBytes()); - buffer.putInt(checksum); - - try { - base32Encoding.encode(output, buffer.array()); - } catch (Base32Encoding.EncodeException e) { - throw new IllegalStateException("invalid main part", e); - } - } - - private static final class DecodedMainPart { - - private final Ulid ulid; - - int checksum; - - public DecodedMainPart(Ulid ulid, int checksum) { - this.ulid = ulid; - this.checksum = checksum; - } - } - - /*** - * Decode the main part of a typed identifier from base32. - * - * @param input The base32-encoded main part of a typed identifier - * @return A {@link DecodedMainPart} record. - * @throws InvalidSizeException when some part of the typed identifier doesn't have the right size - * @throws InvalidIDException when any part of the typed identifier is invalid - */ - private static DecodedMainPart decodeMainPart(String input) throws InvalidSizeException, InvalidIDException { - if (input.length() != BASE32_PART_LENGTH) { - String message = String.format("invalid main part \"%s\"", input); - throw new InvalidSizeException(message); - } - - // Decode the data - ByteBuffer data; - try { - ByteArrayOutputStream decodedData = base32Encoding.decode(input); - data = ByteBuffer.wrap(decodedData.toByteArray()); - } catch (Base32Encoding.DecodeException e) { - String message = String.format("invalid base32 main part \"%s\"", input); - throw new InvalidIDException(message); - } - - // Extract the ULID - byte[] ulidData = new byte[Ulid.ULID_BYTES]; - data.get(ulidData); - Ulid ulid; - try { - ulid = Ulid.from(ulidData); - } catch (Ulid.InvalidBufferSizeException e) { - throw new InvalidSizeException(e.getMessage()); - } - - // Extract the checksum - int checksum = data.getInt(); - - return new DecodedMainPart(ulid, checksum); - } - - /** - * Computes a CRC32 checksum of {@code data}. - * - * @param data The data to compute the checksum of - * @return A CRC32 checksum - */ - private static int getChecksum(byte[] data) { - Objects.requireNonNull(data); - - CRC32 crc32 = new CRC32(); - crc32.update(data); - return (int) crc32.getValue(); - } - - /** - * Validates that all characters in {@code type} are ASCII alphanumerical characters. - * - * @param type A string - * @throws InvalidTypeException when the type is invalid for some reason - */ - private static void checkTypeIsAlnum(String type) throws InvalidTypeException { - byte[] bytes = type.getBytes(UTF_8_CHARSET); - for (byte c : bytes) { - if (isNotAlnum(c)) { - throw new InvalidTypeException("type contains a non alphanumeric character"); - } - } - } - - /** - * Checks if the character {@code c} is ASCII alphanumerical. - * - * @param c The character to check - * @return true if the character is not alphanumerical, false otherwise. - */ - private static boolean isNotAlnum(byte c) { - return (c < '0' || c > '9') && (c < 'A' || c > 'Z') && (c < 'a' || c > 'z'); - } -} diff --git a/Sources/sdk/src/main/java/com/batch/android/core/TypedIDExceptions.java b/Sources/sdk/src/main/java/com/batch/android/core/TypedIDExceptions.java deleted file mode 100644 index a819696..0000000 --- a/Sources/sdk/src/main/java/com/batch/android/core/TypedIDExceptions.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.batch.android.core; - -public class TypedIDExceptions { - - public static class InvalidIDException extends Exception { - - public InvalidIDException(String s) { - super(s); - } - } - - public static class InvalidSeparatorException extends Exception {} - - public static class InvalidSizeException extends Exception { - - public InvalidSizeException(String s) { - super(s); - } - } - - public static class InvalidTypeException extends Exception { - - public InvalidTypeException(String s) { - super(s); - } - } - - public static class InvalidChecksumException extends Exception { - - public InvalidChecksumException(String s) { - super(s); - } - } -} diff --git a/Sources/sdk/src/main/java/com/batch/android/core/Ulid.java b/Sources/sdk/src/main/java/com/batch/android/core/Ulid.java deleted file mode 100644 index 5415a98..0000000 --- a/Sources/sdk/src/main/java/com/batch/android/core/Ulid.java +++ /dev/null @@ -1,142 +0,0 @@ -package com.batch.android.core; - -import java.io.ByteArrayOutputStream; -import java.nio.ByteBuffer; -import java.nio.charset.Charset; -import java.security.SecureRandom; -import java.util.Arrays; -import java.util.Locale; - -public class Ulid { - - /** - * Charset - */ - private static final Charset UTF_8_CHARSET = Charset.forName("UTF-8"); - - /** - * Generator used to get random bytes when creating a new ulid - */ - private static final SecureRandom SECURE_RANDOM = new SecureRandom(); - - /** - * Ulid buffer size (6 timestamp + 10 random) - */ - public static int ULID_BYTES = 16; - - /** - * Ulid buffer - */ - private final byte[] buffer; - - /** - * Create a new Ulid object from a buffer - * - * @param buffer The Ulid buffer, must be 16 bytes - * @return The Ulid object - */ - public static Ulid from(byte[] buffer) throws InvalidBufferSizeException { - if (buffer.length != ULID_BYTES) { - throw new InvalidBufferSizeException("Ulid must be a 16 bytes buffer"); - } - return new Ulid(buffer); - } - - /** - * Create a new Ulid object from a string - * - * @param ulidString The encoded Base32 string representation - * @return The ulid object - * @throws Base32Encoding.DecodeException when the ulid string is not valid - */ - public static Ulid from(String ulidString) throws Base32Encoding.DecodeException { - Base32Encoding encoder = new Base32Encoding(TypedID.CUSTOM_ENCODING); - String padding = "aaaaaa"; - ByteArrayOutputStream decodedData = encoder.decode(padding.concat(ulidString.toLowerCase(Locale.US))); - byte[] buffer = Arrays.copyOfRange(decodedData.toByteArray(), 4, 20); - return new Ulid(buffer); - } - - /** - * Create a new Ulid with the current timestamp and random bytes - * - * @return ulid - */ - public static Ulid randomUlid() { - byte[] buffer = Ulid.generateUlidBuffer(); - return new Ulid(buffer); - } - - /** - * Private constructor - * - * @param buffer ulid buffer - */ - private Ulid(byte[] buffer) { - this.buffer = buffer; - } - - /** - * Get this Ulid as a byte array - * - * @return A binary representation of the Ulid - */ - public byte[] toBytes() { - return this.buffer; - } - - /** - * Get the ULID String representation - * - * @return The encoded Base32 string representation - * @throws Base32Encoding.EncodeException When the buffer to encode is invalid - */ - public String toULIDString() throws Base32Encoding.EncodeException { - Base32Encoding encoder = new Base32Encoding(TypedID.CUSTOM_ENCODING); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - encoder.encode(bos, ByteArrayHelper.concat(new byte[4], this.buffer)); - return new String(bos.toByteArray(), UTF_8_CHARSET).substring(6); - } - - /** - * Generate a new Ulid buffer with the current timestamp + random bytes - * - * @return The generated Ulid buffer - */ - private static byte[] generateUlidBuffer() { - // Timestamp part (6 bytes) - DateProvider dateProvider = new SystemDateProvider(); - long timestamp = dateProvider.getCurrentDate().getTime(); - ByteBuffer byteBuffer = ByteBuffer.allocate(8).putLong(timestamp); - byte[] timestampBuffer = Arrays.copyOfRange(byteBuffer.array(), 2, 8); - - // Random part (10 bytes) - byte[] randomBuffer = SECURE_RANDOM.generateSeed(10); - - return ByteArrayHelper.concat(timestampBuffer, randomBuffer); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof Ulid)) { - return false; - } - Ulid ulid = (Ulid) o; - return Arrays.equals(buffer, ulid.buffer); - } - - @Override - public int hashCode() { - return Arrays.hashCode(buffer); - } - - public static class InvalidBufferSizeException extends Exception { - - public InvalidBufferSizeException(String message) { - super(message); - } - } -} diff --git a/Sources/sdk/src/main/java/com/batch/android/core/Webservice.java b/Sources/sdk/src/main/java/com/batch/android/core/Webservice.java index 69f166e..21e52f0 100644 --- a/Sources/sdk/src/main/java/com/batch/android/core/Webservice.java +++ b/Sources/sdk/src/main/java/com/batch/android/core/Webservice.java @@ -1,14 +1,15 @@ package com.batch.android.core; import android.content.Context; +import android.net.TrafficStats; import android.text.TextUtils; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.batch.android.Batch; import com.batch.android.core.URLBuilder.CryptorMode; import com.batch.android.core.Webservice.WebserviceError.Reason; import com.batch.android.di.providers.OptOutModuleProvider; import com.batch.android.di.providers.ParametersProvider; +import com.batch.android.di.providers.RuntimeManagerProvider; import com.batch.android.di.providers.SecureDateProviderProvider; import com.batch.android.json.JSONException; import com.batch.android.json.JSONObject; @@ -36,6 +37,7 @@ import java.util.Map; import java.util.TimeZone; import java.util.UUID; +import java.util.concurrent.atomic.AtomicReference; import java.util.zip.GZIPInputStream; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLHandshakeException; @@ -181,7 +183,9 @@ protected void addGetParameter(String key, String value) { */ protected static String[] addBatchApiKey(String[] parameters) { final String[] retParams = new String[parameters.length + 1]; - retParams[0] = Batch.getAPIKey(); + AtomicReference apiKey = new AtomicReference<>(); + RuntimeManagerProvider.get().readConfig(config -> apiKey.set(config.getApikey())); + retParams[0] = apiKey.toString(); System.arraycopy(parameters, 0, retParams, 1, parameters.length); return retParams; } @@ -436,6 +440,7 @@ public byte[] executeRequest() throws WebserviceError { ByteArrayOutputStream baos = null; try { try { + TrafficStats.setThreadStatsTag((int) Thread.currentThread().getId()); connection = buildConnection(); connection.connect(); } catch (IOException ce) { diff --git a/Sources/sdk/src/main/java/com/batch/android/core/systemparameters/SystemParameter.java b/Sources/sdk/src/main/java/com/batch/android/core/systemparameters/SystemParameter.java new file mode 100644 index 0000000..9144ced --- /dev/null +++ b/Sources/sdk/src/main/java/com/batch/android/core/systemparameters/SystemParameter.java @@ -0,0 +1,92 @@ +package com.batch.android.core.systemparameters; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +public class SystemParameter { + + /** + * Specific implementation of the value to get + */ + public interface SystemParameterGetter { + String get(); + } + + /** + * The system parameter short name enum + */ + @NonNull + protected SystemParameterShortName shortName; + + /** + * Specific implementation of the system parameter value to get + */ + @NonNull + protected SystemParameterGetter getter; + + /** + * Whether this parameter is allowed to be tracked + */ + protected boolean allowed = true; + + /** + * Constructor + * + * @param shortName The system parameter short name enum + * @param getter Specific implementation of the system parameter value to get + */ + public SystemParameter(@NonNull SystemParameterShortName shortName, @NonNull SystemParameterGetter getter) { + this.shortName = shortName; + this.getter = getter; + } + + /** + * Constructor + * + * @param shortName The system parameter short name enum + * @param getter Specific implementation of the system parameter value to get + * @param allowed Flag indicating whether this parameter is allowed to be send + */ + public SystemParameter( + @NonNull SystemParameterShortName shortName, + @NonNull SystemParameterGetter getter, + boolean allowed + ) { + this.shortName = shortName; + this.getter = getter; + this.allowed = allowed; + } + + /** + * Get the value + * + * @return The value of the parameter + */ + @Nullable + public String getValue() { + return getter.get(); + } + + /** + * Get the system parameter short name enum + * + * @return the system parameter short name enum + */ + @NonNull + public SystemParameterShortName getShortName() { + return shortName; + } + + /** + * Whether this parameter is allowed to be tracked + * + * @return true when allowed, false otherwise + */ + public boolean isAllowed() { + return this.allowed; + } + + public void setAllowed(boolean allowed) { + this.allowed = allowed; + } +} diff --git a/Sources/sdk/src/main/java/com/batch/android/core/systemparameters/SystemParameterHelper.java b/Sources/sdk/src/main/java/com/batch/android/core/systemparameters/SystemParameterHelper.java new file mode 100644 index 0000000..7dc52d8 --- /dev/null +++ b/Sources/sdk/src/main/java/com/batch/android/core/systemparameters/SystemParameterHelper.java @@ -0,0 +1,247 @@ +package com.batch.android.core.systemparameters; + +import android.content.Context; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.os.Build; +import androidx.annotation.NonNull; +import com.batch.android.core.Logger; +import com.batch.android.core.Parameters; +import com.batch.android.core.Webservice; +import com.batch.android.json.JSONException; +import com.batch.android.json.JSONObject; +import java.util.Date; +import java.util.List; +import java.util.Locale; +import java.util.TimeZone; + +/** + * Helper to retrieve Android system configuration. + */ +public final class SystemParameterHelper { + + private static final String TAG = "SystemParameterHelper"; + + /** + * Return the bundle name of the application. + * + * @param applicationContext The application context. + * @return The application bundle name. + */ + public static String getBundleName(Context applicationContext) { + return applicationContext.getPackageName(); + } + + /** + * Get the current device timezone. + * + * @return timezone or null on failure. + */ + public static String getDeviceTimezone() { + try { + return TimeZone.getDefault().getID(); + } catch (Exception e) { + return null; + } + } + + /** + * Get the current device language + * + * @return language + */ + public static String getDeviceLanguage() { + return Locale.getDefault().toLanguageTag(); + } + + /** + * Get the current device country + * + * @return country + */ + public static String getDeviceCountry() { + return Locale.getDefault().getCountry(); + } + + /** + * Return the device date formatted with RFC 3339 format + * + * @return The current date + */ + public static String getDeviceDate() { + return Webservice.formatDate(new Date()); + } + + /** + * Get very first installation date. + * + * @param applicationContext The application context. + * @return Installation date or null on failure. + */ + public static Long getFirstInstallDate(Context applicationContext) { + try { + PackageManager packageManager = applicationContext.getPackageManager(); + PackageInfo information = packageManager.getPackageInfo(applicationContext.getPackageName(), 0); + + return information.firstInstallTime; + } catch (Exception ignored) {} + + return null; + } + + /** + * Get last update date. + * + * @param applicationContext The application context. + * @return Last update date or null on failure. + */ + public static Long getLastUpdateDate(Context applicationContext) { + try { + PackageManager packageManager = applicationContext.getPackageManager(); + PackageInfo information = packageManager.getPackageInfo(applicationContext.getPackageName(), 0); + + return information.lastUpdateTime; + } catch (Exception ignored) {} + + return null; + } + + /** + * Return the Brand name of the device + * + * @return Brand name if found, null otherwise + */ + public static String getDeviceBrand() { + try { + return Build.BRAND; + } catch (Exception ignored) {} + + return null; + } + + /** + * Return the device model of the phone. + * + * @return The device model if found, null otherwise. + */ + public static String getDeviceModel() { + try { + return Build.MODEL; + } catch (Exception ignored) {} + + return null; + } + + /** + * Return the current version of the application. + * + * @param applicationContext The application context. + * @return AppVersion if found, null otherwise + */ + public static String getAppVersion(Context applicationContext) { + try { + PackageInfo info = applicationContext + .getPackageManager() + .getPackageInfo(getBundleName(applicationContext), 0); + return info.versionName; + } catch (NameNotFoundException e) { + return null; + } + } + + /** + * Return the current version code of the application. + * + * @param applicationContext The application context. + * @return AppVersion code if found, null otherwise + */ + public static Integer getAppVersionCode(Context applicationContext) { + try { + PackageManager packageManager = applicationContext.getApplicationContext().getPackageManager(); + PackageInfo information = packageManager.getPackageInfo( + applicationContext.getApplicationContext().getPackageName(), + 0 + ); + + return information.versionCode; + } catch (Exception e) { + return null; + } + } + + /** + * Return the version of Android of the phone. + * + * @return Version. + */ + public static String getOSVersion() { + return String.format("Android %s", Build.VERSION.RELEASE); + } + + /** + * Get the version of the Bridge currently using Batch if available + * + * @return Bridge version string + */ + public static String getBridgeVersion() { + return System.getProperty(Parameters.BRIDGE_VERSION_ENVIRONEMENT_VAR, ""); + } + + /** + * Get the version of the Plugin currently using Batch if available + * + * @return Plugin version string + */ + public static String getPluginVersion() { + return System.getProperty(Parameters.PLUGIN_VERSION_ENVIRONEMENT_VAR, ""); + } + + /** + * Get the android sdk api level + * @return The android sdk api level + */ + public static String getOSSdkLevel() { + return String.valueOf(Build.VERSION.SDK_INT); + } + + /** + * Get the batch sdk api level + * @return The batch sdk api level + */ + public static String getSdkApiLevel() { + return String.valueOf(Parameters.API_LEVEL); + } + + /** + * Get the batch sdk messaging api level + * @return The batch sdk messaging api level + */ + public static String getSdkMessagingApiLevel() { + return String.valueOf(Parameters.MESSAGING_API_LEVEL); + } + + /** + * Serialize a list of SystemParameter to a json object. + *

+ * This is used to send the payload of an _NATIVE_DATA_CHANGE event when a native data change. + * @param parameters A list of system parameter + * @return A JSONObject related to the given list of parameters + * @throws JSONException parsing exception + */ + public static JSONObject serializeSystemParameters(@NonNull List parameters) + throws JSONException { + JSONObject serializedParameters = new JSONObject(); + for (WatchedSystemParameter parameter : parameters) { + String paramKey = parameter.getShortName().serializedName; + if (paramKey == null) { + continue; + } + serializedParameters.put( + paramKey, + parameter.getLastValue() != null ? parameter.getLastValue() : JSONObject.NULL + ); + } + return serializedParameters; + } +} diff --git a/Sources/sdk/src/main/java/com/batch/android/core/systemparameters/SystemParameterRegistry.java b/Sources/sdk/src/main/java/com/batch/android/core/systemparameters/SystemParameterRegistry.java new file mode 100644 index 0000000..47f8d4e --- /dev/null +++ b/Sources/sdk/src/main/java/com/batch/android/core/systemparameters/SystemParameterRegistry.java @@ -0,0 +1,223 @@ +package com.batch.android.core.systemparameters; + +import android.content.Context; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.batch.android.Batch; +import com.batch.android.core.ParameterKeys; +import com.batch.android.core.Webservice; +import com.batch.android.di.providers.DataCollectionModuleProvider; +import com.batch.android.di.providers.ParametersProvider; +import com.batch.android.di.providers.UserModuleProvider; +import com.batch.android.processor.Module; +import com.batch.android.processor.Provide; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import javax.inject.Singleton; + +/** + * Simple class to centralize all system parameters (native data) + */ +@Module +@Singleton +public class SystemParameterRegistry { + + /** + * List of all natives + */ + private final List parameters = new ArrayList<>(22); + + @Provide + public static SystemParameterRegistry provide(@NonNull Context context) { + return new SystemParameterRegistry(context); + } + + /** + * Constructor + * Build all system parameters + */ + private SystemParameterRegistry(@NonNull Context context) { + // Non-watched system parameters + SystemParameter installId = new SystemParameter( + SystemParameterShortName.INSTALL_ID, + Batch.User::getInstallationID + ); + SystemParameter sessionId = new SystemParameter(SystemParameterShortName.SESSION_ID, Batch::getSessionID); + + SystemParameter customUserId = new SystemParameter( + SystemParameterShortName.CUSTOM_USER_ID, + () -> UserModuleProvider.get().getCustomID(context) + ); + SystemParameter deviceDate = new SystemParameter( + SystemParameterShortName.DEVICE_CURRENT_DATE, + SystemParameterHelper::getDeviceDate + ); + + // Watched system parameter + SystemParameter deviceInstallDate = new WatchedSystemParameter( + context, + SystemParameterShortName.DEVICE_INSTALL_DATE, + () -> ParametersProvider.get(context).get(ParameterKeys.INSTALL_TIMESTAMP_KEY) + ); + + SystemParameter bundleName = new WatchedSystemParameter( + context, + SystemParameterShortName.APP_BUNDLE_ID, + () -> SystemParameterHelper.getBundleName(context) + ); + + SystemParameter deviceLanguage = new WatchedSystemParameter( + context, + SystemParameterShortName.DEVICE_LANGUAGE, + SystemParameterHelper::getDeviceLanguage + ); + SystemParameter deviceRegion = new WatchedSystemParameter( + context, + SystemParameterShortName.DEVICE_REGION, + SystemParameterHelper::getDeviceCountry + ); + SystemParameter deviceTimezone = new WatchedSystemParameter( + context, + SystemParameterShortName.DEVICE_TIMEZONE, + SystemParameterHelper::getDeviceTimezone + ); + + SystemParameter deviceType = new WatchedSystemParameter( + context, + SystemParameterShortName.DEVICE_TYPE, + SystemParameterHelper::getDeviceModel, + Boolean.TRUE.equals(DataCollectionModuleProvider.get().getDataCollectionConfig().isDeviceModelEnabled()) + ); + + SystemParameter deviceBrand = new WatchedSystemParameter( + context, + SystemParameterShortName.DEVICE_BRAND, + SystemParameterHelper::getDeviceBrand, + Boolean.TRUE.equals(DataCollectionModuleProvider.get().getDataCollectionConfig().isDeviceBrandEnabled()) + ); + + SystemParameter appVersion = new WatchedSystemParameter( + context, + SystemParameterShortName.APPLICATION_VERSION, + () -> SystemParameterHelper.getAppVersion(context) + ); + SystemParameter appBuildNumber = new WatchedSystemParameter( + context, + SystemParameterShortName.APPLICATION_CODE, + () -> String.valueOf(SystemParameterHelper.getAppVersionCode(context)) + ); + + SystemParameter osVersion = new WatchedSystemParameter( + context, + SystemParameterShortName.OS_VERSION, + SystemParameterHelper::getOSVersion + ); + SystemParameter osSdkLevel = new WatchedSystemParameter( + context, + SystemParameterShortName.OS_SDK_LEVEL, + SystemParameterHelper::getOSSdkLevel + ); + + SystemParameter sdkApiLevel = new WatchedSystemParameter( + context, + SystemParameterShortName.SDK_API_LEVEL, + SystemParameterHelper::getSdkApiLevel + ); + SystemParameter messagingApiLevel = new WatchedSystemParameter( + context, + SystemParameterShortName.SDK_MESSAGING_API_LEVEL, + SystemParameterHelper::getSdkMessagingApiLevel + ); + + SystemParameter firstInstallDate = new WatchedSystemParameter( + context, + SystemParameterShortName.FIRST_INSTALL_DATE, + () -> { + Long firstDate = SystemParameterHelper.getFirstInstallDate(context); + return firstDate != null ? Webservice.formatDate(new Date(firstDate)) : null; + } + ); + SystemParameter lastUpdateDate = new WatchedSystemParameter( + context, + SystemParameterShortName.LAST_UPDATE_DATE, + () -> { + Long updateDate = SystemParameterHelper.getLastUpdateDate(context); + return updateDate != null ? Webservice.formatDate(new Date(updateDate)) : null; + } + ); + + SystemParameter bridgeVersion = new WatchedSystemParameter( + context, + SystemParameterShortName.BRIDGE_VERSION, + SystemParameterHelper::getBridgeVersion + ); + SystemParameter pluginVersion = new WatchedSystemParameter( + context, + SystemParameterShortName.PLUGIN_VERSION, + SystemParameterHelper::getPluginVersion + ); + + parameters.add(installId); + parameters.add(deviceInstallDate); + parameters.add(bundleName); + parameters.add(sessionId); + parameters.add(customUserId); + parameters.add(deviceLanguage); + parameters.add(deviceRegion); + parameters.add(deviceTimezone); + parameters.add(deviceType); + parameters.add(deviceDate); + parameters.add(deviceBrand); + parameters.add(appVersion); + parameters.add(appBuildNumber); + parameters.add(osVersion); + parameters.add(osSdkLevel); + parameters.add(sdkApiLevel); + parameters.add(messagingApiLevel); + parameters.add(firstInstallDate); + parameters.add(lastUpdateDate); + parameters.add(bridgeVersion); + parameters.add(pluginVersion); + } + + /** + * Get all system parameters + * @return All system parameters + */ + public List getParameters() { + return parameters; + } + + /** + * Get all watched parameters + *

+ * Watched parameter mean value is persisted from shared preferences and detect changes. + * @return watched parameters + */ + public List getWatchedParameters() { + List syncedParameters = new ArrayList<>(17); + for (SystemParameter parameter : this.parameters) { + if (parameter instanceof WatchedSystemParameter) { + syncedParameters.add((WatchedSystemParameter) parameter); + } + } + return syncedParameters; + } + + /** + * Get a specific system parameter object by its value + * + * @param shortname the short name parameter (eg: "di" for install_id) + * @return The system parameter associated to the given shortname or null. + */ + @Nullable + public SystemParameter getSystemParamByShortname(String shortname) { + for (SystemParameter parameter : this.parameters) { + if (parameter.getShortName().shortName.equals(shortname)) { + return parameter; + } + } + return null; + } +} diff --git a/Sources/sdk/src/main/java/com/batch/android/core/systemparameters/SystemParameterShortName.java b/Sources/sdk/src/main/java/com/batch/android/core/systemparameters/SystemParameterShortName.java new file mode 100644 index 0000000..ad4af0c --- /dev/null +++ b/Sources/sdk/src/main/java/com/batch/android/core/systemparameters/SystemParameterShortName.java @@ -0,0 +1,102 @@ +package com.batch.android.core.systemparameters; + +/** + * Enum of system parameter short names + * + */ +public enum SystemParameterShortName { + APP_BUNDLE_ID("bid", "app_bundle_id"), + + DEVICE_TIMEZONE("dtz", "device_timezone"), + + FIRST_INSTALL_DATE("fda", "first_installation_date"), + + LAST_UPDATE_DATE("lda", "last_installation_date"), + + DEVICE_BRAND("brd", "device_brand"), + + OS_SDK_LEVEL("sdk", "os_sdk_level"), + + DEVICE_TYPE("dty", "device_type"), + + DEVICE_LANGUAGE("dla", "device_language"), + + DEVICE_REGION("dre", "device_region"), + + DEVICE_CURRENT_DATE("da", null), + + /** + * ID if the installation on the device + */ + INSTALL_ID("di", null), + /** + * Date of the install of Batch's first launch + */ + DEVICE_INSTALL_DATE("did", "device_installation_date"), + + /** + * Session id, regenerated at each start + */ + SESSION_ID("s", null), + + APPLICATION_VERSION("apv", "app_version"), + + APPLICATION_CODE("apc", "app_build_number"), + + OS_VERSION("osv", "os_version"), + + SDK_API_LEVEL("lvl", "sdk_api_level"), + + SDK_MESSAGING_API_LEVEL("mlvl", "sdk_m_api_level"), + + CUSTOM_USER_ID("cus", null), + + /** + * Same bridge/plugin version as the user-agent + */ + BRIDGE_VERSION("brv", "bridge_version"), + + PLUGIN_VERSION("plv", "plugin_version"); + + /** + * Unique short name. + */ + public final String shortName; + + /** + * Serialized name. + */ + public final String serializedName; + + /** + * Standard constructor. + * + * @param name The short name of the parameter + * @param serializedName The serialized name used in webservice 'native data changed event) + */ + SystemParameterShortName(String name, String serializedName) { + shortName = name; + this.serializedName = serializedName; + } + + /** + * Retrieve the Enum value from a string + * + * @param shortName The short name of the parameter + * @return The SystemParameterShortName enum + * @throws IllegalStateException if not found + */ + public static SystemParameterShortName fromShortValue(String shortName) { + if (shortName == null) { + throw new NullPointerException("Null short name"); + } + + for (SystemParameterShortName param : values()) { + if (param.shortName.equalsIgnoreCase(shortName)) { + return param; + } + } + + throw new IllegalStateException("No system parameter found for short name : " + shortName); + } +} diff --git a/Sources/sdk/src/main/java/com/batch/android/core/systemparameters/WatchedSystemParameter.java b/Sources/sdk/src/main/java/com/batch/android/core/systemparameters/WatchedSystemParameter.java new file mode 100644 index 0000000..0c293f0 --- /dev/null +++ b/Sources/sdk/src/main/java/com/batch/android/core/systemparameters/WatchedSystemParameter.java @@ -0,0 +1,110 @@ +package com.batch.android.core.systemparameters; + +import static com.batch.android.core.Parameters.PARAMETERS_KEY_PREFIX; + +import android.content.Context; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.WorkerThread; +import com.batch.android.di.providers.KVUserPreferencesStorageProvider; +import java.util.Objects; + +public class WatchedSystemParameter extends SystemParameter { + + private static final String SHARED_PREFERENCES_KEY_PREFIX = PARAMETERS_KEY_PREFIX.concat("system.param."); + + /** + * The value of the parameter + */ + @Nullable + private String lastValue; + + /** + * Android's context requires to access the shared preferences. + */ + @NonNull + private final Context context; + + /** + * Constructor + * + * @param context Android's context requires to access the shared preferences. + * @param shortName The system parameter short name enum + * @param getter Specific implementation of the system parameter value to get + */ + public WatchedSystemParameter( + @NonNull Context context, + @NonNull SystemParameterShortName shortName, + @NonNull SystemParameterGetter getter + ) { + super(shortName, getter); + this.context = context; + } + + /** + * Constructor + * + * @param context Android's context requires to access the shared preferences. + * @param shortName The system parameter short name enum + * @param getter Specific implementation of the system parameter value to get + * @param allowed Flag indicating whether this parameter is allowed to be send + */ + public WatchedSystemParameter( + @NonNull Context context, + @NonNull SystemParameterShortName shortName, + @NonNull SystemParameterGetter getter, + boolean allowed + ) { + super(shortName, getter, allowed); + this.context = context; + } + + /** + * Detect if the values has changed since the last time we get it. + * + *

+ * This will save the new value if it changed + * + * @return whether this parameter has changed or not + */ + @WorkerThread + public boolean hasChanged() { + // Get the last saved value + this.lastValue = KVUserPreferencesStorageProvider.get(context).get(getSharedPreferencesKey(), null); + + // Get current value + String value = getter.get(); + + // Check if value has changed + boolean hasChanged = !Objects.equals(value, this.lastValue); + + // Keep new value as last + this.lastValue = value; + + // Save if value has changed + if (hasChanged) { + KVUserPreferencesStorageProvider.get(context).persist(getSharedPreferencesKey(), lastValue); + } + return hasChanged; + } + + /** + * Get the last value saved + * This mean return value from shared pref if you didn't call ``detectChanges` yet, + * or the last value read from the specific getter if value has changed + * @return The last value read + */ + @Nullable + public String getLastValue() { + return lastValue; + } + + /** + * Build the shared preference key + * + * @return the shared preference key + */ + private String getSharedPreferencesKey() { + return SHARED_PREFERENCES_KEY_PREFIX.concat(this.shortName.shortName); + } +} diff --git a/Sources/sdk/src/main/java/com/batch/android/debug/fragment/IdentifierDebugFragment.java b/Sources/sdk/src/main/java/com/batch/android/debug/fragment/IdentifierDebugFragment.java index 8688e36..4a7b3a2 100644 --- a/Sources/sdk/src/main/java/com/batch/android/debug/fragment/IdentifierDebugFragment.java +++ b/Sources/sdk/src/main/java/com/batch/android/debug/fragment/IdentifierDebugFragment.java @@ -10,16 +10,14 @@ import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import com.batch.android.Batch; +import com.batch.android.BatchPushRegistration; import com.batch.android.BuildConfig; import com.batch.android.R; -import com.batch.android.core.ParameterKeys; -import com.batch.android.di.providers.ParametersProvider; public class IdentifierDebugFragment extends Fragment implements View.OnClickListener { private TextView sdkVersion; private TextView installId; - private TextView advertisingId; private TextView pushToken; public static IdentifierDebugFragment newInstance() { @@ -37,36 +35,14 @@ private String getShareString() { Batch.User.getInstallationID() ) ); - - String attributionID = ParametersProvider.get(getContext()).get(ParameterKeys.ATTRIBUTION_ID); - if (attributionID != null) { - shareContent = - shareContent.concat( - String.format( - "%s: %s\n", - getString(R.string.com_batchsdk_identifier_debug_fragment_advertising_id), - attributionID - ) - ); - } else { - shareContent = - shareContent.concat( - String.format( - "%s: %s\n", - getString(R.string.com_batchsdk_identifier_debug_fragment_advertising_id), - getString(R.string.com_batchsdk_debug_view_empty) - ) - ); - } - - String token = Batch.Push.getLastKnownPushToken(); - if (token != null) { + BatchPushRegistration registration = Batch.Push.getRegistration(); + if (registration != null) { shareContent = shareContent.concat( String.format( "%s: %s\n", getString(R.string.com_batchsdk_identifier_debug_fragment_push_token), - token + registration.getToken() ) ); } else { @@ -93,7 +69,6 @@ public View onCreateView( View view = inflater.inflate(R.layout.com_batchsdk_identifier_debug_fragment, container, false); sdkVersion = view.findViewById(R.id.com_batchsdk_identifier_debug_fragment_sdk_version); installId = view.findViewById(R.id.com_batchsdk_identifier_debug_fragment_install_id); - advertisingId = view.findViewById(R.id.com_batchsdk_identifier_debug_fragment_advertising_id); pushToken = view.findViewById(R.id.com_batchsdk_identifier_debug_fragment_push_token); View shareButton = view.findViewById(R.id.com_batchsdk_identifier_debug_fragment_share_button); @@ -108,16 +83,9 @@ public void onActivityCreated(@Nullable Bundle savedInstanceState) { sdkVersion.setText(BuildConfig.SDK_VERSION); installId.setText(Batch.User.getInstallationID()); - String attributionID = ParametersProvider.get(getContext()).get(ParameterKeys.ATTRIBUTION_ID); - if (attributionID != null) { - advertisingId.setText(attributionID); - } else { - advertisingId.setText(R.string.com_batchsdk_debug_view_empty); - } - - String token = Batch.Push.getLastKnownPushToken(); - if (token != null) { - pushToken.setText(token); + BatchPushRegistration registration = Batch.Push.getRegistration(); + if (registration != null) { + pushToken.setText(registration.getToken()); } else { pushToken.setText(R.string.com_batchsdk_debug_view_empty); } diff --git a/Sources/sdk/src/main/java/com/batch/android/debug/fragment/UserDataDebugFragment.java b/Sources/sdk/src/main/java/com/batch/android/debug/fragment/UserDataDebugFragment.java index e77812c..11c6d0a 100644 --- a/Sources/sdk/src/main/java/com/batch/android/debug/fragment/UserDataDebugFragment.java +++ b/Sources/sdk/src/main/java/com/batch/android/debug/fragment/UserDataDebugFragment.java @@ -16,6 +16,7 @@ import com.batch.android.BatchUserAttribute; import com.batch.android.R; import com.batch.android.debug.adapter.CollectionAdapter; +import com.batch.android.di.providers.UserModuleProvider; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Locale; @@ -46,7 +47,7 @@ private String formatAttribute(BatchUserAttribute attribute) { private void loadAttributes() { if (attributeAdapter == null) { attributeAdapter = - new ArrayAdapter<>(getContext(), android.R.layout.simple_list_item_1, android.R.id.text1); + new ArrayAdapter<>(requireContext(), android.R.layout.simple_list_item_1, android.R.id.text1); } else { attributeAdapter.clear(); attributeAdapter.notifyDataSetChanged(); @@ -54,7 +55,7 @@ private void loadAttributes() { attributeList.setAdapter(attributeAdapter); Batch.User.fetchAttributes( - getContext(), + requireContext(), new BatchAttributesFetchListener() { @Override public void onSuccess(@NonNull Map attributes) { @@ -76,7 +77,7 @@ public void onError() { private void loadCollections() { if (collectionAdapter == null) { - collectionAdapter = new CollectionAdapter(getContext()); + collectionAdapter = new CollectionAdapter(requireContext()); } else { collectionAdapter.clear(); collectionAdapter.notifyDataSetChanged(); @@ -84,7 +85,7 @@ private void loadCollections() { collectionList.setAdapter(collectionAdapter); Batch.User.fetchTagCollections( - getContext(), + requireContext(), new BatchTagCollectionsFetchListener() { @Override public void onSuccess(@NonNull Map> tagCollections) { @@ -121,7 +122,7 @@ public View onCreateView( public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - String userId = Batch.User.getIdentifier(getContext()); + String userId = UserModuleProvider.get().getCustomID(requireContext()); if (userId == null) { customUserId.setText(R.string.com_batchsdk_debug_view_empty); } else { diff --git a/Sources/sdk/src/main/java/com/batch/android/displayreceipt/CacheHelper.java b/Sources/sdk/src/main/java/com/batch/android/displayreceipt/CacheHelper.java index df9d493..f1d990b 100644 --- a/Sources/sdk/src/main/java/com/batch/android/displayreceipt/CacheHelper.java +++ b/Sources/sdk/src/main/java/com/batch/android/displayreceipt/CacheHelper.java @@ -30,8 +30,8 @@ public abstract class CacheHelper { /** * Get the display receipt directory * - * @param context - * @return + * @param context Android's context + * @return The display receipt cache directory */ @Nullable private static File getCacheDir(@NonNull Context context) { @@ -65,6 +65,11 @@ private static Long getTimestampFromFilename(String filename) { @Nullable public static byte[] read(@NonNull File inputFile) { + return CacheHelper.readFileBytes(inputFile); + } + + @Nullable + private static byte[] readFileBytes(@NonNull File inputFile) { int size = (int) inputFile.length(); if (size > 0L) { byte[] bytes = new byte[size]; @@ -93,13 +98,16 @@ public static File write(@NonNull Context context, long timestamp, byte[] data) } public static boolean write(File outputFile, byte[] data) { + return CacheHelper.writeData(outputFile, data); + } + + private static boolean writeData(File outputFile, byte[] data) { try (OutputStream out = new FileOutputStream(outputFile, false)) { out.write(data); } catch (Exception e) { Logger.internal(TAG, "Could not write receipt", e); return false; } - Logger.internal(TAG, "Successfully wrote " + outputFile.getAbsolutePath()); return true; } @@ -107,8 +115,8 @@ public static boolean write(File outputFile, byte[] data) { /** * Recursively delete all files in a directory, then delete the directory itself * - * @param dir - * @return + * @param dir The directory to delete + * @return Whether the directory has been successfully deleted */ private static boolean deleteDirectory(@NonNull File dir) { if (dir.exists() && dir.isDirectory()) { @@ -129,8 +137,8 @@ private static boolean deleteDirectory(@NonNull File dir) { /** * Delete cached display receipt * - * @param context - * @return + * @param context Android's Context + * @return Whether the deleted operation has succeed */ public static boolean deleteAll(@NonNull Context context) { File dir = new File(context.getCacheDir(), CACHE_DIR); @@ -141,9 +149,9 @@ public static boolean deleteAll(@NonNull Context context) { * Return a sorted list of File matching available cached display receipt. * Don't load the cached file in memory, only list them. * - * @param context + * @param context Android's context * @param debug If true return all cached files in any order - * @return + * @return The cached files or null */ @Nullable public static List getCachedFiles(@NonNull Context context, boolean debug) { @@ -151,7 +159,6 @@ public static List getCachedFiles(@NonNull Context context, boolean debug) if (cacheDir == null) { return null; } - File[] files = cacheDir.listFiles(); if (files != null) { List output; diff --git a/Sources/sdk/src/main/java/com/batch/android/event/EventAttributesSerializer.java b/Sources/sdk/src/main/java/com/batch/android/event/EventAttributesSerializer.java new file mode 100644 index 0000000..3c8599d --- /dev/null +++ b/Sources/sdk/src/main/java/com/batch/android/event/EventAttributesSerializer.java @@ -0,0 +1,62 @@ +package com.batch.android.event; + +import com.batch.android.BatchEventAttributes; +import com.batch.android.json.JSONArray; +import com.batch.android.json.JSONException; +import com.batch.android.json.JSONObject; +import java.util.Collection; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +public class EventAttributesSerializer { + + public static JSONObject serialize(BatchEventAttributes eventAttributes) throws JSONException { + JSONObject obj = new JSONObject(); + JSONObject attributes = serializeObject(eventAttributes); + obj.put("attributes", attributes); + obj.put("label", eventAttributes.getLabel()); + if (eventAttributes.getTags() != null) { + obj.put("tags", new JSONArray(eventAttributes.getTags())); + } + return obj; + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + public static JSONObject serializeObject(BatchEventAttributes eventAttributes) + throws JSONException, ClassCastException { + JSONObject obj = new JSONObject(); + for (Map.Entry entry : eventAttributes.getAttributes().entrySet()) { + EventTypedAttribute attribute = entry.getValue(); + String prefixedKey = entry.getKey().toLowerCase(Locale.US) + "." + attribute.type.getTypeChar(); + + switch (attribute.type) { + case URL: + obj.put(prefixedKey, attribute.value.toString()); + break; + case OBJECT: + obj.put(prefixedKey, serializeObject((BatchEventAttributes) attribute.value)); + break; + case OBJECT_ARRAY: + obj.put(prefixedKey, serializeList((List) attribute.value)); + break; + case STRING_ARRAY: + obj.put(prefixedKey, new JSONArray((Collection) attribute.value)); + break; + default: + obj.put(prefixedKey, attribute.value); + break; + } + } + return obj; + } + + public static JSONArray serializeList(List eventAttributesList) throws JSONException { + JSONArray array = new JSONArray(); + + for (BatchEventAttributes eventData : eventAttributesList) { + array.put(serializeObject(eventData)); + } + return array; + } +} diff --git a/Sources/sdk/src/main/java/com/batch/android/event/EventAttributesValidator.java b/Sources/sdk/src/main/java/com/batch/android/event/EventAttributesValidator.java new file mode 100644 index 0000000..fbbdb59 --- /dev/null +++ b/Sources/sdk/src/main/java/com/batch/android/event/EventAttributesValidator.java @@ -0,0 +1,370 @@ +package com.batch.android.event; + +import com.batch.android.BatchEventAttributes; +import com.batch.android.user.AttributeType; +import java.net.URI; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +/** + * Class that validates that a BatchEventAttributes object is valid + */ +public class EventAttributesValidator { + + /** + * Class that hold a human readable error. + */ + private static class ValidationError { + + private final String message; + private final Breadcrumbs breadcrumbs; + + public ValidationError(String message, Breadcrumbs breadcrumbs) { + this.message = message; + this.breadcrumbs = breadcrumbs; + } + + public String render() { + String attributePath = String.join(".", breadcrumbs.getItems()); + if (attributePath.isEmpty()) { + attributePath = ""; + } + return attributePath + ": " + message; + } + } + + /** + * Breadcrumbs is similar to an ariane thread, keeping track of where we are in an object + * For example, ["purchased_item", "name"] is the breadcrumb for a "name" attribute in a sub object + * attribute named "purchased_item". + */ + private static class Breadcrumbs { + + private final List items; + + public Breadcrumbs(List items) { + this.items = items; + } + + public Breadcrumbs appending(String item) { + List mutatedItems = new ArrayList<>(items); + mutatedItems.add(item); + return new Breadcrumbs(mutatedItems); + } + + public Breadcrumbs appending(int index) { + List mutatedItems = new ArrayList<>(items); + mutatedItems.set(mutatedItems.size() - 1, mutatedItems.get(mutatedItems.size() - 1) + "[" + index + "]"); + return new Breadcrumbs(mutatedItems); + } + + public int getDepth() { + return items.size(); + } + + public List getItems() { + return items; + } + } + + private static final int LABEL_MAX_LENGTH = 200; + private static final int TAG_MAX_LENGTH = 64; + private static final int TAGS_MAX_COUNT = 10; + private static final int ATTRIBUTES_MAX_COUNT = 20; + private static final int URL_MAX_LENGTH = 2048; + private static final int STRING_MAX_LENGTH = 200; + private static final int ARRAY_ITEMS_MAX_COUNT = 25; + private static final Pattern attributeNameRegexp = Pattern.compile("^[a-zA-Z0-9_]{1,30}$"); + + public static boolean isEventNameValid(String eventName) { + return attributeNameRegexp.matcher(eventName).matches(); + } + + public static List computeValidationErrors(BatchEventAttributes eventData) { + List errors = new ArrayList<>(); + List validationErrors = visitObject(eventData, new Breadcrumbs(new ArrayList<>())); + for (ValidationError validationError : validationErrors) { + errors.add(validationError.render()); + } + return errors; + } + + private static List visitObject(BatchEventAttributes eventData, Breadcrumbs breadcrumbs) { + int depth = breadcrumbs.getDepth(); + if (depth > 3) { + return Collections.singletonList( + new ValidationError("Object attributes cannot be nested in more than three levels", breadcrumbs) + ); + } + if (eventData.getAttributes().isEmpty() && eventData.getLabel() == null && eventData.getTags() == null) { + return new ArrayList<>(); + } + List errors = new ArrayList<>(); + if (depth > 0) { + if (eventData.getLabel() != null) { + errors.add( + new ValidationError("Labels are not allowed in sub-objects", breadcrumbs.appending("$label")) + ); + } + if (eventData.getTags() != null) { + errors.add(new ValidationError("Tags are not allowed in sub-objects", breadcrumbs.appending("$tags"))); + } + } else { + if (eventData.getLabel() != null) { + wrapAndMergeErrorMessages(visitLabel(eventData.getLabel()), breadcrumbs.appending("$label"), errors); + } + if (eventData.getTags() != null) { + mergeErrors(visitTags(new ArrayList<>(eventData.getTags()), breadcrumbs.appending("$tags")), errors); + } + } + Map attributes = eventData.getAttributes(); + if (attributes.size() > ATTRIBUTES_MAX_COUNT) { + errors.add( + new ValidationError( + "objects cannot hold more than " + ATTRIBUTES_MAX_COUNT + " attributes", + breadcrumbs + ) + ); + } + for (Map.Entry entry : attributes.entrySet()) { + String attributeName = entry.getKey(); + EventTypedAttribute attributeValue = entry.getValue(); + ValidationError attributeNameError = visitAttributeName(attributeName, breadcrumbs); + if (attributeNameError != null) { + errors.add(attributeNameError); + continue; + } + Breadcrumbs attributeBreadcrumbs = breadcrumbs.appending(attributeName); + mergeErrors(visitAttributeValue(attributeValue, attributeBreadcrumbs), errors); + } + return errors; + } + + private static ValidationError visitAttributeName(String name, Breadcrumbs breadcrumbs) { + String baseError = "invalid attribute name '" + name + "':"; + if (!name.equals(name.toLowerCase())) { + return new ValidationError(baseError + " object has been tampered with", breadcrumbs); + } + if (!attributeNameRegexp.matcher(name).matches()) { + return new ValidationError( + baseError + + " please make sure that the key is made of letters, underscores and numbers only (a-zA-Z0-9_). It also can't be longer than 30 characters", + breadcrumbs + ); + } + return null; + } + + private static List visitAttributeValue(EventTypedAttribute attribute, Breadcrumbs breadcrumbs) { + List errors = new ArrayList<>(); + ValidationError genericTypecastError = new ValidationError( + "attribute is not of the right underlying type. this is an internal error and should be reported", + breadcrumbs + ); + switch (attribute.type) { + case URL: + if (attribute.value instanceof URI) { + mergeError(visitAttributeURLValue((URI) attribute.value, breadcrumbs), errors); + } else { + errors.add(genericTypecastError); + } + break; + case STRING: + if (attribute.value instanceof String) { + mergeError(visitAttributeStringValue((String) attribute.value, breadcrumbs), errors); + } else { + errors.add(genericTypecastError); + } + break; + case DOUBLE: + case LONG: + if (!(attribute.value instanceof Number)) { + errors.add(genericTypecastError); + } + break; + case BOOL: + if (!(attribute.value instanceof Boolean)) { + errors.add(genericTypecastError); + } + break; + case DATE: + if (!(attribute.value instanceof Long)) { + errors.add(genericTypecastError); + } + break; + case OBJECT_ARRAY: + case STRING_ARRAY: + if (attribute.value instanceof List) { + List anyArrayValue = (List) attribute.value; + ValidationError baseArrayError = visitAttributeArrayValueBase(anyArrayValue, breadcrumbs); + if (baseArrayError != null) { + errors.add(baseArrayError); + } else { + if (attribute.type == AttributeType.OBJECT_ARRAY) { + try { + @SuppressWarnings("unchecked") + List objectArrayValue = (List) anyArrayValue; + mergeErrors(visitAttributeObjectArrayValue(objectArrayValue, breadcrumbs), errors); + } catch (ClassCastException e) { + errors.add(genericTypecastError); + } + } else if (attribute.type == AttributeType.STRING_ARRAY) { + try { + @SuppressWarnings("unchecked") + List stringArrayValue = (List) anyArrayValue; + mergeErrors(visitAttributeStringArrayValue(stringArrayValue, breadcrumbs), errors); + } catch (ClassCastException e) { + errors.add(genericTypecastError); + } + } + } + } else { + errors.add(genericTypecastError); + } + break; + case OBJECT: + if (attribute.value instanceof BatchEventAttributes) { + mergeErrors(visitObject((BatchEventAttributes) attribute.value, breadcrumbs), errors); + } else { + errors.add(genericTypecastError); + } + break; + } + return errors; + } + + private static ValidationError visitAttributeArrayValueBase(List value, Breadcrumbs breadcrumbs) { + int depth = breadcrumbs.getDepth(); + if (depth > 3) { + return new ValidationError("array attributes cannot be nested in more than three levels", breadcrumbs); + } + if (value.size() > ARRAY_ITEMS_MAX_COUNT) { + return new ValidationError( + "array attributes cannot have more than " + ARRAY_ITEMS_MAX_COUNT + " elements", + breadcrumbs + ); + } + return null; + } + + private static List visitAttributeStringArrayValue(List array, Breadcrumbs breadcrumbs) { + List errors = new ArrayList<>(); + for (int i = 0; i < array.size(); i++) { + String value = array.get(i); + Breadcrumbs itemBreadcrumbs = breadcrumbs.appending(i); + mergeError(visitAttributeStringValue(value, itemBreadcrumbs), errors); + } + return errors; + } + + private static List visitAttributeObjectArrayValue( + List array, + Breadcrumbs breadcrumbs + ) { + List errors = new ArrayList<>(); + for (int i = 0; i < array.size(); i++) { + BatchEventAttributes value = array.get(i); + Breadcrumbs itemBreadcrumbs = breadcrumbs.appending(i); + mergeErrors(visitObject(value, itemBreadcrumbs), errors); + } + return errors; + } + + private static ValidationError visitAttributeStringValue(String value, Breadcrumbs breadcrumbs) { + if (value.trim().isEmpty()) { + return new ValidationError("string attribute cannot be empty or made of whitespace", breadcrumbs); + } + if (value.length() > STRING_MAX_LENGTH) { + return new ValidationError( + "string attribute cannot be longer than " + STRING_MAX_LENGTH + " characters", + breadcrumbs + ); + } + if (value.contains("\n")) { + return new ValidationError("string attribute cannot be multiline", breadcrumbs); + } + return null; + } + + private static ValidationError visitAttributeURLValue(URI value, Breadcrumbs breadcrumbs) { + if (value.toString().length() > URL_MAX_LENGTH) { + return new ValidationError( + "URL attributes cannot be longer than " + URL_MAX_LENGTH + " characters", + breadcrumbs + ); + } + if (value.getScheme() == null || value.getAuthority() == null) { + return new ValidationError( + "URL attributes must follow the format 'scheme://[authority][path][?query][#fragment]'", + breadcrumbs + ); + } + return null; + } + + private static List visitLabel(String label) { + List errors = new ArrayList<>(); + if (label.length() > LABEL_MAX_LENGTH) { + errors.add("cannot be longer than 200 characters"); + } + if (label.trim().isEmpty()) { + errors.add("cannot be empty or only made of whitespace"); + } + if (label.contains("\n")) { + errors.add("cannot be multiline"); + } + return errors; + } + + private static List visitTags(List tags, Breadcrumbs breadcrumbs) { + List errors = new ArrayList<>(); + if (tags.size() > TAGS_MAX_COUNT) { + errors.add(new ValidationError("must not contain more than " + TAGS_MAX_COUNT + " values", breadcrumbs)); + } + for (int i = 0; i < tags.size(); i++) { + String tag = tags.get(i); + String error = visitTag(tag); + if (error != null) { + errors.add(new ValidationError(error, breadcrumbs.appending(i))); + } + } + return errors; + } + + private static String visitTag(String tag) { + if (tag.trim().isEmpty()) { + return "tag cannot be empty or made of whitespace"; + } + if (tag.length() > TAG_MAX_LENGTH) { + return "tag cannot be longer than " + TAG_MAX_LENGTH; + } + if (tag.contains("\n")) { + return "tag cannot be multiline"; + } + return null; + } + + private static void wrapAndMergeErrorMessages( + List messages, + Breadcrumbs breadcrumbs, + List accumulator + ) { + for (String message : messages) { + accumulator.add(new ValidationError(message, breadcrumbs)); + } + } + + private static void mergeError(ValidationError error, List accumulator) { + if (error != null) { + accumulator.add(error); + } + } + + private static void mergeErrors(List errors, List accumulator) { + accumulator.addAll(errors); + } +} diff --git a/Sources/sdk/src/main/java/com/batch/android/event/EventTypedAttribute.java b/Sources/sdk/src/main/java/com/batch/android/event/EventTypedAttribute.java new file mode 100644 index 0000000..2153b9f --- /dev/null +++ b/Sources/sdk/src/main/java/com/batch/android/event/EventTypedAttribute.java @@ -0,0 +1,14 @@ +package com.batch.android.event; + +import com.batch.android.user.AttributeType; + +public class EventTypedAttribute { + + public Object value; + public AttributeType type; + + public EventTypedAttribute(Object value, AttributeType type) { + this.value = value; + this.type = type; + } +} diff --git a/Sources/sdk/src/main/java/com/batch/android/event/InternalEvents.java b/Sources/sdk/src/main/java/com/batch/android/event/InternalEvents.java index c69dedd..8c881f5 100644 --- a/Sources/sdk/src/main/java/com/batch/android/event/InternalEvents.java +++ b/Sources/sdk/src/main/java/com/batch/android/event/InternalEvents.java @@ -15,12 +15,10 @@ private InternalEvents() {} public static final String MESSAGING = "_MESSAGING"; public static final String LOCAL_CAMPAIGN_VIEWED = "_LC_VIEW"; - - public static final String PROFILE_CHANGED = "_PROFILE_CHANGED"; + public static final String NATIVE_DATA_CHANGED = "_NATIVE_DATA_CHANGED"; public static final String INSTALL_DATA_CHANGED = "_INSTALL_DATA_CHANGED"; + public static final String PROFILE_DATA_CHANGED = "_PROFILE_DATA_CHANGED"; public static final String INSTALL_DATA_CHANGED_TRACK_FAILURE = "_INSTALL_DATA_CHANGED_TRACK_FAIL"; - public static final String EMAIL_CHANGED = "_EMAIL_CHANGED"; - public static final String ATTRIBUTION_ID_CHANGED = "_ATTRIBUTION_ID_CHANGED"; public static final String LOCATION_CHANGED = "_LOCATION_CHANGED"; public static final String NOTIFICATION_STATUS_CHANGE = "_NOTIF_STATUS_CHANGE"; @@ -32,5 +30,7 @@ private InternalEvents() {} public static final String OPT_OUT = "_OPT_OUT"; public static final String OPT_OUT_AND_WIPE_DATA = "_OPTOUT_WIPE_DATA"; + public static final String PROFILE_IDENTIFY = "_PROFILE_IDENTIFY"; + public static final String FIND_MY_INSTALLATION = "_FIND_MY_INSTALLATION"; } diff --git a/Sources/sdk/src/main/java/com/batch/android/inbox/InboxDatasource.java b/Sources/sdk/src/main/java/com/batch/android/inbox/InboxDatasource.java index 5fb3211..f0911f0 100644 --- a/Sources/sdk/src/main/java/com/batch/android/inbox/InboxDatasource.java +++ b/Sources/sdk/src/main/java/com/batch/android/inbox/InboxDatasource.java @@ -11,6 +11,7 @@ import com.batch.android.Batch; import com.batch.android.core.InternalPushData; import com.batch.android.core.Logger; +import com.batch.android.core.NamedThreadFactory; import com.batch.android.json.JSONException; import com.batch.android.json.JSONObject; import com.batch.android.processor.Module; @@ -30,10 +31,6 @@ public final class InboxDatasource { private static final String TAG = "InboxDatasource"; - /** - * Saved app context - */ - private Context context; /** * The SQLLite DB */ @@ -41,7 +38,7 @@ public final class InboxDatasource { /** * The DB Helper */ - private InboxDatabaseHelper databaseHelper; + private final InboxDatabaseHelper databaseHelper; // --------------------------------------------> @@ -49,9 +46,11 @@ public InboxDatasource(Context context) throws SQLiteException { if (context == null) { throw new NullPointerException("context==null"); } + databaseHelper = new InboxDatabaseHelper(context.getApplicationContext()); + open(); + } - this.context = context.getApplicationContext(); - databaseHelper = new InboxDatabaseHelper(this.context); + private void open() { database = databaseHelper.getWritableDatabase(); } @@ -61,7 +60,7 @@ public InboxDatasource(Context context) throws SQLiteException { public void wipeData() { if (database == null) { Logger.internal(TAG, "Attempted to wipe data on a closed database"); - database = databaseHelper.getWritableDatabase(); + open(); } database.delete(InboxDatabaseHelper.TABLE_NOTIFICATIONS, null, null); @@ -173,8 +172,9 @@ protected long getNotificationTime(String notificationId) { * Try to get the fetcher ID from the SQLite * Create and insert it if it doesn't exist * - * @param type - * @param identifier + * @param type The fetcher type + * @param identifier The user identifier + * @return The fetcher identifier */ public long getFetcherID(FetcherType type, String identifier) { if (TextUtils.isEmpty(identifier)) { @@ -183,7 +183,7 @@ public long getFetcherID(FetcherType type, String identifier) { if (database == null) { Logger.internal(TAG, "Attempted to get/insert a fetcher to a closed database"); - database = databaseHelper.getWritableDatabase(); + open(); } final ContentValues values = new ContentValues(); @@ -231,9 +231,9 @@ public long getFetcherID(FetcherType type, String identifier) { /** * Look in database for cached notifications * - * @param cursor - * @param fetcherId - * @return + * @param cursor The cursor + * @param fetcherId The fetcher identifier + * @return A list of candidate notifications */ public List getCandidateNotifications( @Nullable String cursor, @@ -366,7 +366,7 @@ public boolean insertResponse(InboxWebserviceResponse response, long fetcherId) protected boolean insert(InboxNotificationContentInternal notification, long fetcherId) { if (database == null) { Logger.internal(TAG, "Attempted to insert a notification to a closed database"); - database = databaseHelper.getWritableDatabase(); + open(); } if (notification == null) { diff --git a/Sources/sdk/src/main/java/com/batch/android/inbox/InboxFetcherInternal.java b/Sources/sdk/src/main/java/com/batch/android/inbox/InboxFetcherInternal.java index fda29e6..c34fea6 100644 --- a/Sources/sdk/src/main/java/com/batch/android/inbox/InboxFetcherInternal.java +++ b/Sources/sdk/src/main/java/com/batch/android/inbox/InboxFetcherInternal.java @@ -424,13 +424,10 @@ protected void runFetchWSClient(InboxFetchWebserviceClient client) { private boolean sync(@Nullable final String cursor, final InboxWebserviceListener wsClientListener) { if (datasource != null && fetcherId != -1) { - List candidates = datasource.getCandidateNotifications( - cursor, - maxPageSize, - fetcherId - ); - + List candidates; + candidates = datasource.getCandidateNotifications(cursor, maxPageSize, fetcherId); if (!candidates.isEmpty()) { + List finalCandidates = candidates; fetchExecutor.execute(() -> { Context c = context != null ? context : RuntimeManagerProvider.get().getContext(); if (c == null) { @@ -457,7 +454,7 @@ private boolean sync(@Nullable final String cursor, final InboxWebserviceListene maxPageSize, cursor, fetcherId, - candidates, + finalCandidates, wsClientListener ) .run(); @@ -529,7 +526,7 @@ private List handleFetchSuccess( InboxWebserviceResponse response, boolean askedForNewNotifications ) throws ResultHandlingError { - if (response.notifications.size() == 0) { + if (response.notifications.isEmpty()) { if (response.didTimeout) { throw new ResultHandlingError( "Server did timeout, but returned no notifications at all.", diff --git a/Sources/sdk/src/main/java/com/batch/android/messaging/ModalContentPanGestureDetector.java b/Sources/sdk/src/main/java/com/batch/android/messaging/ModalContentPanGestureDetector.java index dd5c520..411de17 100644 --- a/Sources/sdk/src/main/java/com/batch/android/messaging/ModalContentPanGestureDetector.java +++ b/Sources/sdk/src/main/java/com/batch/android/messaging/ModalContentPanGestureDetector.java @@ -182,9 +182,7 @@ private void startFallbackCancelAnimation() { ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(targetView, pvtX, pvtY, pvsX, pvsY); animator.setInterpolator(new OvershootInterpolator()); animator.setDuration(ANIMATION_DURATION); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { - animator.setAutoCancel(true); - } + animator.setAutoCancel(true); animator.start(); cancellationAnimations = new Object[] { animator }; } diff --git a/Sources/sdk/src/main/java/com/batch/android/messaging/fragment/ModalTemplateFragment.java b/Sources/sdk/src/main/java/com/batch/android/messaging/fragment/ModalTemplateFragment.java index 2f3bdd2..1035807 100644 --- a/Sources/sdk/src/main/java/com/batch/android/messaging/fragment/ModalTemplateFragment.java +++ b/Sources/sdk/src/main/java/com/batch/android/messaging/fragment/ModalTemplateFragment.java @@ -79,19 +79,16 @@ public void onCreate(@Nullable Bundle savedInstanceState) { setRetainInstance(true); } + @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final Dialog dialog = super.onCreateDialog(savedInstanceState); final Window window = dialog.getWindow(); - if (showStatusbar) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && statusbarBackgroundTranslucent) { + if (showStatusbar && window != null) { + if (statusbarBackgroundTranslucent) { window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } - if ( - Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && - statusbarBackgroundColor != null && - statusbarBackgroundColor != Color.TRANSPARENT - ) { + if (statusbarBackgroundColor != null && statusbarBackgroundColor != Color.TRANSPARENT) { window.setStatusBarColor(statusbarBackgroundColor); } } diff --git a/Sources/sdk/src/main/java/com/batch/android/messaging/fragment/UniversalTemplateFragment.java b/Sources/sdk/src/main/java/com/batch/android/messaging/fragment/UniversalTemplateFragment.java index e60fd1d..a2e9d6b 100644 --- a/Sources/sdk/src/main/java/com/batch/android/messaging/fragment/UniversalTemplateFragment.java +++ b/Sources/sdk/src/main/java/com/batch/android/messaging/fragment/UniversalTemplateFragment.java @@ -99,19 +99,16 @@ public void onCreate(@Nullable Bundle savedInstanceState) { setRetainInstance(true); } + @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final Dialog dialog = super.onCreateDialog(savedInstanceState); final Window window = dialog.getWindow(); - if (showStatusbar) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && statusbarBackgroundTranslucent) { + if (showStatusbar && window != null) { + if (statusbarBackgroundTranslucent) { window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } - if ( - Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && - statusbarBackgroundColor != null && - statusbarBackgroundColor != Color.TRANSPARENT - ) { + if (statusbarBackgroundColor != null && statusbarBackgroundColor != Color.TRANSPARENT) { window.setStatusBarColor(statusbarBackgroundColor); } } diff --git a/Sources/sdk/src/main/java/com/batch/android/messaging/fragment/WebViewTemplateFragment.java b/Sources/sdk/src/main/java/com/batch/android/messaging/fragment/WebViewTemplateFragment.java index bfa0149..dfbb5cb 100644 --- a/Sources/sdk/src/main/java/com/batch/android/messaging/fragment/WebViewTemplateFragment.java +++ b/Sources/sdk/src/main/java/com/batch/android/messaging/fragment/WebViewTemplateFragment.java @@ -116,19 +116,16 @@ public void onSaveInstanceState(@NonNull Bundle outState) { this.webView.saveState(outState); } + @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final Dialog dialog = super.onCreateDialog(savedInstanceState); final Window window = dialog.getWindow(); - if (showStatusbar) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && statusbarBackgroundTranslucent) { + if (showStatusbar && window != null) { + if (statusbarBackgroundTranslucent) { window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } - if ( - Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && - statusbarBackgroundColor != null && - statusbarBackgroundColor != Color.TRANSPARENT - ) { + if (statusbarBackgroundColor != null && statusbarBackgroundColor != Color.TRANSPARENT) { window.setStatusBarColor(statusbarBackgroundColor); } } diff --git a/Sources/sdk/src/main/java/com/batch/android/messaging/gif/GifDrawable.java b/Sources/sdk/src/main/java/com/batch/android/messaging/gif/GifDrawable.java index 0304de7..fb42883 100644 --- a/Sources/sdk/src/main/java/com/batch/android/messaging/gif/GifDrawable.java +++ b/Sources/sdk/src/main/java/com/batch/android/messaging/gif/GifDrawable.java @@ -16,6 +16,7 @@ import androidx.annotation.Nullable; import androidx.annotation.UiThread; import androidx.annotation.WorkerThread; +import com.batch.android.core.Logger; import com.batch.android.core.NamedThreadFactory; import java.util.LinkedList; import java.util.Queue; @@ -76,11 +77,10 @@ private void produceNextFrame() { gifDecoder.advance(); FrameInfo nextFrame = new FrameInfo(gifDecoder.getNextFrame(), gifDecoder.getNextDelay()); Message.obtain(mainThreadHandler, MESSAGE_FRAME_PRODUCED, nextFrame).sendToTarget(); - } catch (OutOfMemoryError e) { - //TODO: Batch log + } catch (Exception | OutOfMemoryError e) { ranOutOfMemory = true; Message.obtain(mainThreadHandler, MESSAGE_RAN_OUT_OF_MEMORY).sendToTarget(); - Log.e("GIF", "Ran out of memory " + e); + Logger.error("Failed producing next gif frame.", e); } } diff --git a/Sources/sdk/src/main/java/com/batch/android/messaging/view/AnimatedCloseButton.java b/Sources/sdk/src/main/java/com/batch/android/messaging/view/AnimatedCloseButton.java index 1d81608..ce7bb2f 100644 --- a/Sources/sdk/src/main/java/com/batch/android/messaging/view/AnimatedCloseButton.java +++ b/Sources/sdk/src/main/java/com/batch/android/messaging/view/AnimatedCloseButton.java @@ -56,12 +56,7 @@ private void onAnimationFrame() { } else { countdownProgress = ((float) animationEndDate - currentAnimationTime) / duration; } - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - postInvalidateOnAnimation(); - } else { - postInvalidate(); - } + postInvalidateOnAnimation(); } @Override diff --git a/Sources/sdk/src/main/java/com/batch/android/messaging/view/CloseButton.java b/Sources/sdk/src/main/java/com/batch/android/messaging/view/CloseButton.java index 1bfee7d..b5c8769 100644 --- a/Sources/sdk/src/main/java/com/batch/android/messaging/view/CloseButton.java +++ b/Sources/sdk/src/main/java/com/batch/android/messaging/view/CloseButton.java @@ -77,30 +77,27 @@ public CloseButton(Context context, AttributeSet attrs, int defStyleAttr) { init(); } - @TargetApi(Build.VERSION_CODES.LOLLIPOP) public CloseButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); init(); } public void init() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - setOutlineProvider( - new ViewOutlineProvider() { - @Override - public void getOutline(View view, Outline outline) { - outline.setOval( - getPadding(), - getPadding(), - view.getWidth() - getPadding(), - view.getHeight() - getPadding() - ); - } + setOutlineProvider( + new ViewOutlineProvider() { + @Override + public void getOutline(View view, Outline outline) { + outline.setOval( + getPadding(), + getPadding(), + view.getWidth() - getPadding(), + view.getHeight() - getPadding() + ); } - ); + } + ); - setClipToOutline(true); - } + setClipToOutline(true); refreshPaint(); //TODO: How to translate this? @@ -346,18 +343,14 @@ public void applyStyleRules(Map rules) { setGlyphWidth((int) (density * val.intValue())); } } else if ("elevation".equalsIgnoreCase(rule.getKey())) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - Float val = StyleHelper.optFloat(rule.getValue()); - if (val != null) { - setElevation(StyleHelper.dpToPixels(res, val)); - } + Float val = StyleHelper.optFloat(rule.getValue()); + if (val != null) { + setElevation(StyleHelper.dpToPixels(res, val)); } } else if ("z-index".equalsIgnoreCase(rule.getKey())) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - Float val = StyleHelper.optFloat(rule.getValue()); - if (val != null) { - setZ(StyleHelper.dpToPixels(res, val)); - } + Float val = StyleHelper.optFloat(rule.getValue()); + if (val != null) { + setZ(StyleHelper.dpToPixels(res, val)); } } } @@ -389,7 +382,6 @@ public void jumpDrawablesToCurrentState() { } } - @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public void drawableHotspotChanged(float x, float y) { super.drawableHotspotChanged(x, y); diff --git a/Sources/sdk/src/main/java/com/batch/android/messaging/view/CountdownView.java b/Sources/sdk/src/main/java/com/batch/android/messaging/view/CountdownView.java index 397795f..e276378 100644 --- a/Sources/sdk/src/main/java/com/batch/android/messaging/view/CountdownView.java +++ b/Sources/sdk/src/main/java/com/batch/android/messaging/view/CountdownView.java @@ -7,7 +7,6 @@ import android.graphics.drawable.ClipDrawable; import android.graphics.drawable.ShapeDrawable; import android.graphics.drawable.shapes.RectShape; -import android.os.Build; import android.os.Parcelable; import android.view.Gravity; import android.view.animation.AnimationUtils; @@ -75,12 +74,7 @@ private void onAnimationFrame() { } else { setProgress((int) ((((float) animationEndDate - currentAnimationTime) / duration) * MAX_PROGRESS)); } - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - postInvalidateOnAnimation(); - } else { - postInvalidate(); - } + postInvalidateOnAnimation(); } @Override diff --git a/Sources/sdk/src/main/java/com/batch/android/messaging/view/FixedRatioFrameLayout.java b/Sources/sdk/src/main/java/com/batch/android/messaging/view/FixedRatioFrameLayout.java index a17d803..28fcc8d 100644 --- a/Sources/sdk/src/main/java/com/batch/android/messaging/view/FixedRatioFrameLayout.java +++ b/Sources/sdk/src/main/java/com/batch/android/messaging/view/FixedRatioFrameLayout.java @@ -30,7 +30,6 @@ public FixedRatioFrameLayout(@NonNull Context context, @Nullable AttributeSet at super(context, attrs, defStyleAttr); } - @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public FixedRatioFrameLayout( @NonNull Context context, @Nullable AttributeSet attrs, diff --git a/Sources/sdk/src/main/java/com/batch/android/messaging/view/MaximumHeightScrollView.java b/Sources/sdk/src/main/java/com/batch/android/messaging/view/MaximumHeightScrollView.java index 79a0085..3a8ad59 100644 --- a/Sources/sdk/src/main/java/com/batch/android/messaging/view/MaximumHeightScrollView.java +++ b/Sources/sdk/src/main/java/com/batch/android/messaging/view/MaximumHeightScrollView.java @@ -1,10 +1,8 @@ package com.batch.android.messaging.view; import android.content.Context; -import android.os.Build; import android.util.AttributeSet; import android.widget.ScrollView; -import androidx.annotation.RequiresApi; /** * A {@link ScrollView} that supports setting a maximum height @@ -25,8 +23,6 @@ public MaximumHeightScrollView(Context context, AttributeSet attrs, int defStyle super(context, attrs, defStyleAttr); } - @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) - @SuppressWarnings("unused") public MaximumHeightScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } diff --git a/Sources/sdk/src/main/java/com/batch/android/messaging/view/PannableBannerFrameLayout.java b/Sources/sdk/src/main/java/com/batch/android/messaging/view/PannableBannerFrameLayout.java index 59a8d28..e318c58 100644 --- a/Sources/sdk/src/main/java/com/batch/android/messaging/view/PannableBannerFrameLayout.java +++ b/Sources/sdk/src/main/java/com/batch/android/messaging/view/PannableBannerFrameLayout.java @@ -319,9 +319,7 @@ private void startFallbackCancelAnimation() { ObjectAnimator animator = ObjectAnimator.ofFloat(this, "translationY", getTranslationY(), 0); animator.setInterpolator(new OvershootInterpolator()); animator.setDuration(cancellationAnimationDuration); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { - animator.setAutoCancel(true); - } + animator.setAutoCancel(true); animator.start(); cancellationAnimation = animator; } diff --git a/Sources/sdk/src/main/java/com/batch/android/messaging/view/PositionableGradientDrawable.java b/Sources/sdk/src/main/java/com/batch/android/messaging/view/PositionableGradientDrawable.java index 68f34f0..99beeaf 100644 --- a/Sources/sdk/src/main/java/com/batch/android/messaging/view/PositionableGradientDrawable.java +++ b/Sources/sdk/src/main/java/com/batch/android/messaging/view/PositionableGradientDrawable.java @@ -534,18 +534,7 @@ of the fill (if any) without worrying about blending artifacts. float rad = mStrokePaint.getStrokeWidth(); - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { - canvas.saveLayer(mRect.left - rad, mRect.top - rad, mRect.right + rad, mRect.bottom + rad, mLayerPaint); - } else { - canvas.saveLayer( - mRect.left - rad, - mRect.top - rad, - mRect.right + rad, - mRect.bottom + rad, - mLayerPaint, - Canvas.ALL_SAVE_FLAG - ); - } + canvas.saveLayer(mRect.left - rad, mRect.top - rad, mRect.right + rad, mRect.bottom + rad, mLayerPaint); // don't perform the filter in our individual paints // since the layer will do it for us @@ -1047,9 +1036,6 @@ private boolean isOpaqueForState() { @Override public void getOutline(Outline outline) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - return; - } final GradientState st = mGradientState; final Rect bounds = getBounds(); // only report non-zero alpha if shape being drawn is opaque diff --git a/Sources/sdk/src/main/java/com/batch/android/messaging/view/formats/BannerView.java b/Sources/sdk/src/main/java/com/batch/android/messaging/view/formats/BannerView.java index 0e1256e..388e239 100644 --- a/Sources/sdk/src/main/java/com/batch/android/messaging/view/formats/BannerView.java +++ b/Sources/sdk/src/main/java/com/batch/android/messaging/view/formats/BannerView.java @@ -181,9 +181,7 @@ private SeparatedFlexboxLayout makeContentLayout(Map contentStyl layout.applyStyleRules(contentStyleRules); layout.setClipChildren(false); layout.setClipToPadding(false); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - layout.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES); - } + layout.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES); VerticalEdge contentPinnedEdge = getPinnedVerticalEdge(contentStyleRules); diff --git a/Sources/sdk/src/main/java/com/batch/android/messaging/view/formats/ImageFormatView.java b/Sources/sdk/src/main/java/com/batch/android/messaging/view/formats/ImageFormatView.java index 1465e05..6bafa53 100644 --- a/Sources/sdk/src/main/java/com/batch/android/messaging/view/formats/ImageFormatView.java +++ b/Sources/sdk/src/main/java/com/batch/android/messaging/view/formats/ImageFormatView.java @@ -178,11 +178,9 @@ private RelativeLayout addRootContainerView() { ); // Animate layout changes, such as the resizing of the image container - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - final LayoutTransition lt = new LayoutTransition(); - lt.enableTransitionType(LayoutTransition.CHANGING); - rootContainer.setLayoutTransition(lt); - } + final LayoutTransition lt = new LayoutTransition(); + lt.enableTransitionType(LayoutTransition.CHANGING); + rootContainer.setLayoutTransition(lt); addView(rootContainer); @@ -245,9 +243,7 @@ private ProgressBar addImageLoader(@NonNull FrameLayout container) { final ProgressBar imageLoader = new ProgressBar(context); imageLoader.setId(ViewCompat.generateViewId()); imageLoader.setIndeterminate(true); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - imageLoader.setIndeterminateTintList(ColorStateList.valueOf(Color.WHITE)); - } + imageLoader.setIndeterminateTintList(ColorStateList.valueOf(Color.WHITE)); FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, @@ -394,7 +390,6 @@ private void displayImage(AsyncImageDownloadTask.Result result) { //region System inset handling @Override - @RequiresApi(api = Build.VERSION_CODES.KITKAT_WATCH) public WindowInsets onApplyWindowInsets(WindowInsets insets) { // Apparently, the relative layout does not really like to apply the insets, so convert it as // margin diff --git a/Sources/sdk/src/main/java/com/batch/android/messaging/view/formats/UniversalRootView.java b/Sources/sdk/src/main/java/com/batch/android/messaging/view/formats/UniversalRootView.java index a867193..5486e5e 100644 --- a/Sources/sdk/src/main/java/com/batch/android/messaging/view/formats/UniversalRootView.java +++ b/Sources/sdk/src/main/java/com/batch/android/messaging/view/formats/UniversalRootView.java @@ -6,7 +6,6 @@ import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Point; -import android.os.Build; import android.os.SystemClock; import android.text.TextUtils; import android.util.Pair; @@ -21,7 +20,6 @@ import android.widget.RelativeLayout; import android.widget.ScrollView; import androidx.annotation.NonNull; -import androidx.annotation.RequiresApi; import com.batch.android.R; import com.batch.android.core.ReflectionHelper; import com.batch.android.messaging.AsyncImageDownloadTask; @@ -208,9 +206,7 @@ private void setupContentLayout() { contentLayout.setAlignItems(FlexboxLayout.ALIGN_ITEMS_CENTER); contentLayout.setJustifyContent(FlexboxLayout.JUSTIFY_CONTENT_CENTER); contentLayout.applyStyleRules(contentStyleRules); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - contentLayout.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES); - } + contentLayout.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES); originalContentPaddingTop = contentLayout.getPaddingTop(); @@ -354,9 +350,7 @@ private void setupHeroLayout() { heroImageView.setScaleType(ImageView.ScaleType.CENTER_CROP); if (!TextUtils.isEmpty(message.heroDescription)) { heroImageView.setContentDescription(message.heroDescription); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - heroImageView.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES); - } + heroImageView.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES); } views.add(new Pair<>(heroImageView, new DOMNode("image", "image"))); @@ -380,12 +374,10 @@ private void setupHeroLayout() { heroLoader = new ProgressBar(context); heroLoader.setIndeterminate(true); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - if (darkProgressBar) { - heroLoader.setIndeterminateTintList(ColorStateList.valueOf(Color.BLACK)); - } else { - heroLoader.setIndeterminateTintList(ColorStateList.valueOf(Color.WHITE)); - } + if (darkProgressBar) { + heroLoader.setIndeterminateTintList(ColorStateList.valueOf(Color.BLACK)); + } else { + heroLoader.setIndeterminateTintList(ColorStateList.valueOf(Color.WHITE)); } final FrameLayout.LayoutParams progressLayoutParams = new FrameLayout.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, @@ -589,7 +581,6 @@ public void onHeroDownloaded(AsyncImageDownloadTask.Result result) { } } - @RequiresApi(api = Build.VERSION_CODES.KITKAT_WATCH) @Override public WindowInsets onApplyWindowInsets(WindowInsets insets) { topInset = insets.getSystemWindowInsetTop(); diff --git a/Sources/sdk/src/main/java/com/batch/android/messaging/view/formats/WebFormatView.java b/Sources/sdk/src/main/java/com/batch/android/messaging/view/formats/WebFormatView.java index d4e3a23..ae1e581 100644 --- a/Sources/sdk/src/main/java/com/batch/android/messaging/view/formats/WebFormatView.java +++ b/Sources/sdk/src/main/java/com/batch/android/messaging/view/formats/WebFormatView.java @@ -118,12 +118,11 @@ public WebFormatView( webSettings.setSupportZoom(false); webSettings.setDefaultTextEncodingName("utf-8"); webSettings.setSupportMultipleWindows(true); - if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) { - // Work around an issue where android could show "ERR_CACHE_MISS" - // In a perfect world we would like to make use of the browser cache - // but as those messages are usually one shot, it doesn't really matter. - webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); - } + + // Work around an issue where android could show "ERR_CACHE_MISS" + // In a perfect world we would like to make use of the browser cache + // but as those messages are usually one shot, it doesn't really matter. + webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); webView.addJavascriptInterface(jsInterface, "_batchAndroidBridge"); webView.setWebChromeClient( @@ -143,17 +142,22 @@ public boolean onCreateWindow( // view.getHitTestResult() returns the source of the image // rather than the url. if (result.getType() == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) { - Message href = view.getHandler().obtainMessage(); - view.requestFocusNodeHref(href); - Bundle data = href.getData(); - if (data != null) { - String imageUrl = data.getString("url"); - if (imageUrl != null && !imageUrl.isEmpty()) { - url = imageUrl; + Handler handler = view.getHandler(); + if (handler != null) { + Message href = handler.obtainMessage(); + view.requestFocusNodeHref(href); + Bundle data = href.getData(); + if (data != null) { + String imageUrl = data.getString("url"); + if (imageUrl != null && !imageUrl.isEmpty()) { + url = imageUrl; + } } } } - actionListener.onOpenDeeplinkAction(url, null, null); + if (url != null) { + actionListener.onOpenDeeplinkAction(url, null, null); + } } return super.onCreateWindow(view, isDialog, isUserGesture, resultMsg); } @@ -293,11 +297,7 @@ public void onReceivedError( ) { super.onReceivedError(view, errorCode, description, failingUrl); // Only needed when API lvl < 21 - if ( - Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP && - !mainFrameFinished && - (failingUrl != null && failingUrl.equals(view.getUrl())) - ) { + if (!mainFrameFinished && (failingUrl != null && failingUrl.equals(view.getUrl()))) { handleWebViewError(description, errorCode); } } @@ -505,12 +505,10 @@ private ProgressBar addWebViewLoader(@NonNull RelativeLayout container) { } } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - if (darkProgressBar) { - webViewLoader.setIndeterminateTintList(ColorStateList.valueOf(Color.BLACK)); - } else { - webViewLoader.setIndeterminateTintList(ColorStateList.valueOf(Color.WHITE)); - } + if (darkProgressBar) { + webViewLoader.setIndeterminateTintList(ColorStateList.valueOf(Color.BLACK)); + } else { + webViewLoader.setIndeterminateTintList(ColorStateList.valueOf(Color.WHITE)); } RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams( @@ -563,7 +561,6 @@ private AnimatedCloseButton addCloseButton(@NonNull RelativeLayout container) { //region System inset handling @Override - @RequiresApi(api = Build.VERSION_CODES.KITKAT_WATCH) public WindowInsets onApplyWindowInsets(WindowInsets insets) { // Apparently, the relative layout does not really like to apply the insets, so convert it as // margin diff --git a/Sources/sdk/src/main/java/com/batch/android/messaging/view/helper/StyleHelper.java b/Sources/sdk/src/main/java/com/batch/android/messaging/view/helper/StyleHelper.java index a7aca21..c7c39f2 100644 --- a/Sources/sdk/src/main/java/com/batch/android/messaging/view/helper/StyleHelper.java +++ b/Sources/sdk/src/main/java/com/batch/android/messaging/view/helper/StyleHelper.java @@ -200,18 +200,14 @@ public static void applyCommonRules(View targetView, Map rules) targetView.setAlpha(val); } } else if ("elevation".equalsIgnoreCase(rule.getKey())) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - Float val = optFloat(rule.getValue()); - if (val != null) { - targetView.setElevation(dpToPixels(res, val)); - } + Float val = optFloat(rule.getValue()); + if (val != null) { + targetView.setElevation(dpToPixels(res, val)); } } else if ("z-index".equalsIgnoreCase(rule.getKey())) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - Float val = optFloat(rule.getValue()); - if (val != null) { - targetView.setZ(dpToPixels(res, val)); - } + Float val = optFloat(rule.getValue()); + if (val != null) { + targetView.setZ(dpToPixels(res, val)); } } else if ("clip-subviews".equalsIgnoreCase(rule.getKey())) { Float val = optFloat(rule.getValue()); @@ -269,12 +265,7 @@ else if ("padding-left".equalsIgnoreCase(rule.getKey())) { finalDrawable = getPressableGradientDrawable(backgroundGradient); } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - targetView.setBackground(finalDrawable); - } else { - //noinspection deprecation - targetView.setBackgroundDrawable(finalDrawable); - } + targetView.setBackground(finalDrawable); } else if (backgroundColor != null) { // Simply set the background color if we don't need more advanced stuff // Buttons require another tinting way @@ -292,7 +283,7 @@ else if ("padding-left".equalsIgnoreCase(rule.getKey())) { } } - if (cornerRadius != null && shouldClipToOutline && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + if (cornerRadius != null && shouldClipToOutline) { targetView.setClipToOutline(true); } } @@ -733,32 +724,12 @@ public static int darkenColor(int color) { * @return A drawable that will be darkened on press */ private static Drawable getPressableGradientDrawable(PositionableGradientDrawable baseDrawable) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - // Generate a mask using the same shape. That way we can ripple a transparent drawable easily - PositionableGradientDrawable mask = (PositionableGradientDrawable) baseDrawable - .getConstantState() - .newDrawable() - .mutate(); - mask.setColor(Color.WHITE); - return new RippleDrawable(ColorStateList.valueOf(RIPPLE_COLOR), baseDrawable, mask); - } else { - // Mutate the original drawable so we can keep the corner radius - PositionableGradientDrawable darkDrawable = (PositionableGradientDrawable) baseDrawable - .getConstantState() - .newDrawable() - .mutate(); - darkDrawable.setStroke(0, Color.TRANSPARENT); - darkDrawable.setColor(RIPPLE_COLOR); - - LayerDrawable ld = new LayerDrawable(new Drawable[] { baseDrawable, darkDrawable }); - - StateListDrawable stateListDrawable = new StateListDrawable(); - stateListDrawable.addState(new int[] { android.R.attr.state_pressed }, ld); - stateListDrawable.addState(new int[] { android.R.attr.state_focused }, ld); - stateListDrawable.addState(new int[] { android.R.attr.state_activated }, ld); - stateListDrawable.addState(new int[] {}, baseDrawable); - - return stateListDrawable; - } + // Generate a mask using the same shape. That way we can ripple a transparent drawable easily + PositionableGradientDrawable mask = (PositionableGradientDrawable) baseDrawable + .getConstantState() + .newDrawable() + .mutate(); + mask.setColor(Color.WHITE); + return new RippleDrawable(ColorStateList.valueOf(RIPPLE_COLOR), baseDrawable, mask); } } diff --git a/Sources/sdk/src/main/java/com/batch/android/messaging/view/helper/ViewCompat.java b/Sources/sdk/src/main/java/com/batch/android/messaging/view/helper/ViewCompat.java index bb74a5d..7b73649 100644 --- a/Sources/sdk/src/main/java/com/batch/android/messaging/view/helper/ViewCompat.java +++ b/Sources/sdk/src/main/java/com/batch/android/messaging/view/helper/ViewCompat.java @@ -21,25 +21,15 @@ import android.content.Context; import android.content.res.Resources; import android.graphics.Point; -import android.os.Build; import android.util.DisplayMetrics; import android.view.View; import android.view.accessibility.AccessibilityManager; -import java.util.concurrent.atomic.AtomicInteger; /** * Compat view methods */ public class ViewCompat { - private static AtomicInteger sNextGeneratedId = null; - - static { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) { - sNextGeneratedId = new AtomicInteger(1); - } - } - /** * Generate a value suitable for use in {@link View#setId(int)}. * This value will not collide with ID values generated at build time by aapt for R.id. @@ -47,21 +37,7 @@ public class ViewCompat { * @return a generated ID value */ public static int generateViewId() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - return View.generateViewId(); - } else { - for (;;) { - final int result = sNextGeneratedId.get(); - // aapt-generated IDs have the high byte nonzero; clamp to the range under that. - int newValue = result + 1; - if (newValue > 0x00FFFFFF) { - newValue = 1; // Roll over to 1, not 0. - } - if (sNextGeneratedId.compareAndSet(result, newValue)) { - return result; - } - } - } + return View.generateViewId(); } public static Point getScreenSize(Context context) { diff --git a/Sources/sdk/src/main/java/com/batch/android/messaging/view/roundimage/RoundedImageView.java b/Sources/sdk/src/main/java/com/batch/android/messaging/view/roundimage/RoundedImageView.java index cbe2e4b..bf99c38 100755 --- a/Sources/sdk/src/main/java/com/batch/android/messaging/view/roundimage/RoundedImageView.java +++ b/Sources/sdk/src/main/java/com/batch/android/messaging/view/roundimage/RoundedImageView.java @@ -544,11 +544,9 @@ public void applyStyleRules(Map rules) { setAlpha(val); } } else if ("elevation".equalsIgnoreCase(rule.getKey())) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - Float val = StyleHelper.optFloat(rule.getValue()); - if (val != null) { - setElevation(val); - } + Float val = StyleHelper.optFloat(rule.getValue()); + if (val != null) { + setElevation(val); } } else if ("scale".equalsIgnoreCase(rule.getKey())) { final String value = rule.getValue(); @@ -558,11 +556,9 @@ public void applyStyleRules(Map rules) { setScaleType(ScaleType.FIT_CENTER); } } else if ("z-index".equalsIgnoreCase(rule.getKey())) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - Float val = StyleHelper.optFloat(rule.getValue()); - if (val != null) { - setZ(StyleHelper.dpToPixels(getResources(), val)); - } + Float val = StyleHelper.optFloat(rule.getValue()); + if (val != null) { + setZ(StyleHelper.dpToPixels(getResources(), val)); } } else if ("rounded-corners".equalsIgnoreCase(rule.getKey())) { final String value = rule.getValue(); diff --git a/Sources/sdk/src/main/java/com/batch/android/messaging/view/styled/Button.java b/Sources/sdk/src/main/java/com/batch/android/messaging/view/styled/Button.java index da3537e..1d84f25 100644 --- a/Sources/sdk/src/main/java/com/batch/android/messaging/view/styled/Button.java +++ b/Sources/sdk/src/main/java/com/batch/android/messaging/view/styled/Button.java @@ -30,11 +30,9 @@ public void applyStyleRules(Map rules) { for (Map.Entry rule : rules.entrySet()) { if ("elevation".equalsIgnoreCase(rule.getKey())) { // The base CSS got rid of the elevation, but buttons add another! - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - Float val = StyleHelper.optFloat(rule.getValue()); - if (val != null && val == 0) { - setStateListAnimator(null); - } + Float val = StyleHelper.optFloat(rule.getValue()); + if (val != null && val == 0) { + setStateListAnimator(null); } } } diff --git a/Sources/sdk/src/main/java/com/batch/android/messaging/view/styled/TextView.java b/Sources/sdk/src/main/java/com/batch/android/messaging/view/styled/TextView.java index 79fe675..8131620 100644 --- a/Sources/sdk/src/main/java/com/batch/android/messaging/view/styled/TextView.java +++ b/Sources/sdk/src/main/java/com/batch/android/messaging/view/styled/TextView.java @@ -1,7 +1,6 @@ package com.batch.android.messaging.view.styled; import android.annotation.SuppressLint; -import android.annotation.TargetApi; import android.content.Context; import android.graphics.Color; import android.graphics.Typeface; @@ -44,7 +43,6 @@ public TextView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } - @TargetApi(Build.VERSION_CODES.LOLLIPOP) public TextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @@ -113,11 +111,9 @@ protected static void applyStyleRules(android.widget.TextView targetTextView, Ma ); } } else if ("letter-spacing".equalsIgnoreCase(rule.getKey())) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - Float spacing = StyleHelper.optFloat(rule.getValue()); - if (spacing != null) { - targetTextView.setLetterSpacing(spacing); - } + Float spacing = StyleHelper.optFloat(rule.getValue()); + if (spacing != null) { + targetTextView.setLetterSpacing(spacing); } } else if ("line-height".equalsIgnoreCase(rule.getKey())) { Float height = StyleHelper.optFloat(rule.getValue()); @@ -176,14 +172,10 @@ protected static void applyStyleRules(android.widget.TextView targetTextView, Ma targetTextView.setTypeface(computedTypeface); if (lineSpacingMultiply != 0 || lineSpacingAdd != 0) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - targetTextView.setLineSpacing( - lineSpacingAdd != 0 ? lineSpacingAdd : targetTextView.getLineSpacingExtra(), - lineSpacingMultiply != 0 ? lineSpacingMultiply : targetTextView.getLineSpacingMultiplier() - ); - } else { - targetTextView.setLineSpacing(lineSpacingAdd, lineSpacingMultiply); - } + targetTextView.setLineSpacing( + lineSpacingAdd != 0 ? lineSpacingAdd : targetTextView.getLineSpacingExtra(), + lineSpacingMultiply != 0 ? lineSpacingMultiply : targetTextView.getLineSpacingMultiplier() + ); } } diff --git a/Sources/sdk/src/main/java/com/batch/android/module/BatchModuleMaster.java b/Sources/sdk/src/main/java/com/batch/android/module/BatchModuleMaster.java index bcd3464..7813fbd 100644 --- a/Sources/sdk/src/main/java/com/batch/android/module/BatchModuleMaster.java +++ b/Sources/sdk/src/main/java/com/batch/android/module/BatchModuleMaster.java @@ -3,10 +3,12 @@ import android.content.Context; import androidx.annotation.NonNull; import com.batch.android.di.providers.ActionModuleProvider; +import com.batch.android.di.providers.DataCollectionModuleProvider; import com.batch.android.di.providers.DisplayReceiptModuleProvider; import com.batch.android.di.providers.EventDispatcherModuleProvider; import com.batch.android.di.providers.LocalCampaignsModuleProvider; import com.batch.android.di.providers.MessagingModuleProvider; +import com.batch.android.di.providers.ProfileModuleProvider; import com.batch.android.di.providers.PushModuleProvider; import com.batch.android.di.providers.TrackerModuleProvider; import com.batch.android.di.providers.UserModuleProvider; @@ -17,7 +19,7 @@ import java.util.List; /** - * Module master that dispatch to subcribed modules + * Module master that dispatch to subscribed modules * */ @Module @@ -27,7 +29,7 @@ public class BatchModuleMaster extends BatchModule { /** * Subscribed modules */ - private List modules; + private final List modules; private BatchModuleMaster(List modules) { this.modules = modules; @@ -45,6 +47,8 @@ public static BatchModuleMaster provide() { modules.add(PushModuleProvider.get()); modules.add(TrackerModuleProvider.get()); modules.add(UserModuleProvider.get()); + modules.add(ProfileModuleProvider.get()); + modules.add(DataCollectionModuleProvider.get()); return new BatchModuleMaster(modules); } diff --git a/Sources/sdk/src/main/java/com/batch/android/module/DataCollectionModule.java b/Sources/sdk/src/main/java/com/batch/android/module/DataCollectionModule.java new file mode 100644 index 0000000..c04f0e2 --- /dev/null +++ b/Sources/sdk/src/main/java/com/batch/android/module/DataCollectionModule.java @@ -0,0 +1,322 @@ +package com.batch.android.module; + +import android.content.Context; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.batch.android.BatchDataCollectionConfig; +import com.batch.android.core.Logger; +import com.batch.android.core.ParameterKeys; +import com.batch.android.core.systemparameters.SystemParameter; +import com.batch.android.core.systemparameters.SystemParameterHelper; +import com.batch.android.core.systemparameters.SystemParameterRegistry; +import com.batch.android.core.systemparameters.SystemParameterShortName; +import com.batch.android.core.systemparameters.WatchedSystemParameter; +import com.batch.android.di.providers.ParametersProvider; +import com.batch.android.di.providers.RuntimeManagerProvider; +import com.batch.android.di.providers.SystemParameterRegistryProvider; +import com.batch.android.di.providers.TaskExecutorProvider; +import com.batch.android.di.providers.TrackerModuleProvider; +import com.batch.android.event.InternalEvents; +import com.batch.android.json.JSONException; +import com.batch.android.json.JSONObject; +import com.batch.android.processor.Module; +import com.batch.android.processor.Provide; +import com.batch.android.processor.Singleton; +import com.batch.android.util.DataCollectionUtils; +import java.util.ArrayList; +import java.util.List; + +/** + * Data Collection Module + */ +@Module +@Singleton +public class DataCollectionModule extends BatchModule { + + private static final String TAG = "DataCollection"; + + /** + * The current data collection configuration + */ + @NonNull + private final BatchDataCollectionConfig dataCollectionConfig = new BatchDataCollectionConfig(); + + /** + * Data collection config in cache + * Used to keep updates of the data collection config when the SDK isn't started yet. + */ + @Nullable + private BatchDataCollectionConfig cachedDataCollectionConfig; + + /** + * DI access method + * + * @return A new instance of the DataCollection module + */ + @Provide + public static DataCollectionModule provide() { + return new DataCollectionModule(); + } + + // region BatchModule + /** + * Get module identifier + * + * @return The module identifier + */ + @Override + public String getId() { + return "datacollection"; + } + + /** + * Get module state + * + * @return The module state (1 = enabled) + */ + @Override + public int getState() { + return 1; + } + + /** + * Method called when the batch SDK received the context + * + * @param applicationContext The application's context + */ + @Override + public void batchContextBecameAvailable(@NonNull Context applicationContext) { + super.batchContextBecameAvailable(applicationContext); + synchronized (dataCollectionConfig) { + // Load data collection config from shared pref + loadDataCollectionConfig(applicationContext); + + // Check if we have a data collection config in cache + if (cachedDataCollectionConfig != null) { + Logger.internal(TAG, "Cached data config found, trying to send changes"); + try { + onDataCollectionConfigChanged(cachedDataCollectionConfig); + } catch (JSONException e) { + Logger.error(TAG, "Failed sending data collection changed event", e); + } + } + } + } + + /** + * Method called when Batch did start + */ + @Override + public void batchDidStart() { + super.batchDidStart(); + Context context = RuntimeManagerProvider.get().getContext(); + if (context != null) { + TaskExecutorProvider.get(context).submit(() -> this.systemParametersMayHaveChanged(context)); + } + } + + // endregion + + /** + * Check if some system parameter values have changed. + * + * @param context Android's context + */ + private void systemParametersMayHaveChanged(@NonNull Context context) { + SystemParameterRegistry registry = SystemParameterRegistryProvider.get(context); + List parameters = registry.getWatchedParameters(); + List hasChangedParameters = new ArrayList<>(); + for (WatchedSystemParameter parameter : parameters) { + if (parameter.hasChanged()) { + if (parameter.isAllowed()) { + hasChangedParameters.add(parameter); + } + } + } + if (!hasChangedParameters.isEmpty()) { + Logger.internal(TAG, "Some native data has changed, sending it."); + try { + sendNativeDataChangedEvent(SystemParameterHelper.serializeSystemParameters(hasChangedParameters)); + } catch (JSONException e) { + Logger.error(TAG, "Some natives data has changed but the serialization failed.", e); + } + } else { + Logger.internal(TAG, "No native detection change"); + } + } + + /** + * Update the current data collection config + * + * @param editor User's modification of the data collection config. + */ + public void updateDataCollectionConfig(BatchDataCollectionConfig.Editor editor) { + synchronized (dataCollectionConfig) { + BatchDataCollectionConfig config = new BatchDataCollectionConfig(); + editor.edit(config); + Logger.internal(TAG, "Updating automatic data collection configuration: ".concat(config.toString())); + try { + this.onDataCollectionConfigChanged(config); + } catch (JSONException e) { + Logger.error(TAG, "Failed sending data collection changed event", e); + } + } + } + + /** + * Get the current data collection config + * + * @return The data collection configuration + */ + public BatchDataCollectionConfig getDataCollectionConfig() { + synchronized (dataCollectionConfig) { + return dataCollectionConfig; + } + } + + /** + * Handle modification of the data collection configuration + */ + private void onDataCollectionConfigChanged(@NonNull BatchDataCollectionConfig config) throws JSONException { + Context context = RuntimeManagerProvider.get().getContext(); + if (context == null) { + Logger.internal(TAG, "Context not available yet, caching config"); + // We do not have a context, we keep data collection config in cache. + this.cachedDataCollectionConfig = config; + return; + } + + if (DataCollectionUtils.areConfigsEquals(config, this.dataCollectionConfig)) { + // Do nothing is config hasn't changed + Logger.internal(TAG, "No change detected for data collection config."); + this.cachedDataCollectionConfig = null; + return; + } + + JSONObject params = new JSONObject(); + SystemParameterRegistry registry = SystemParameterRegistryProvider.get(context); + + // Check whether geoip has changed (null = unchanged) + if (config.isGeoIpEnabled() != null && config.isGeoIpEnabled() != this.dataCollectionConfig.isGeoIpEnabled()) { + params.put("geoip_resolution", config.isGeoIpEnabled()); + } + + // Check whether device brand has changed (null = unchanged) + if ( + config.isDeviceBrandEnabled() != null && + config.isDeviceBrandEnabled() != this.dataCollectionConfig.isDeviceBrandEnabled() + ) { + SystemParameter deviceBrandParameter = registry.getSystemParamByShortname( + SystemParameterShortName.DEVICE_BRAND.shortName + ); + if (deviceBrandParameter != null) { + deviceBrandParameter.setAllowed(Boolean.TRUE.equals(config.isDeviceBrandEnabled())); + if (Boolean.FALSE.equals(config.isDeviceBrandEnabled())) { + params.put(deviceBrandParameter.getShortName().serializedName, JSONObject.NULL); + } else { + params.put(deviceBrandParameter.getShortName().serializedName, deviceBrandParameter.getValue()); + } + } + } + + // Check whether device model has changed (null = unchanged) + if ( + config.isDeviceModelEnabled() != null && + config.isDeviceModelEnabled() != this.dataCollectionConfig.isDeviceModelEnabled() + ) { + SystemParameter deviceModelParameter = registry.getSystemParamByShortname( + SystemParameterShortName.DEVICE_TYPE.shortName + ); + if (deviceModelParameter != null) { + deviceModelParameter.setAllowed(Boolean.TRUE.equals(config.isDeviceModelEnabled())); + if (Boolean.FALSE.equals(config.isDeviceModelEnabled())) { + params.put(deviceModelParameter.getShortName().serializedName, JSONObject.NULL); + } else { + params.put(deviceModelParameter.getShortName().serializedName, deviceModelParameter.getValue()); + } + } + } + // Send native data changed event + this.sendNativeDataChangedEvent(params); + + // Update current config + if (config.isDeviceBrandEnabled() != null) { + this.dataCollectionConfig.setDeviceBrandEnabled(Boolean.TRUE.equals(config.isDeviceBrandEnabled())); + } + if (config.isDeviceModelEnabled() != null) { + this.dataCollectionConfig.setDeviceModelEnabled(Boolean.TRUE.equals(config.isDeviceModelEnabled())); + } + if (config.isGeoIpEnabled() != null) { + this.dataCollectionConfig.setGeoIPEnabled(Boolean.TRUE.equals(config.isGeoIpEnabled())); + } + + // Persist current config + this.persistDataCollectionConfig(context, dataCollectionConfig); + + // Delete cached config + this.cachedDataCollectionConfig = null; + } + + /** + * Send a NATIVE_DATA_CHANGED event to the backend + * + * @param params The JSON parameters + */ + private void sendNativeDataChangedEvent(JSONObject params) { + TrackerModuleProvider.get().track(InternalEvents.NATIVE_DATA_CHANGED, params); + } + + /** + * Persist a data collection config in the shared preferences as a json string. + * + * @param context The context to access shared preferences + * @param config The BatchDataCollectionConfig to persist + */ + private void persistDataCollectionConfig(@NonNull Context context, @NonNull BatchDataCollectionConfig config) { + JSONObject serializedDataCollectionConfig = new JSONObject(); + try { + serializedDataCollectionConfig.put("geoip", config.isGeoIpEnabled()); + serializedDataCollectionConfig.put("deviceBrand", config.isDeviceBrandEnabled()); + serializedDataCollectionConfig.put("deviceModel", config.isDeviceModelEnabled()); + ParametersProvider + .get(context) + .set(ParameterKeys.DATA_COLLECTION_CONFIG_KEY, serializedDataCollectionConfig.toString(), true); + } catch (JSONException e) { + Logger.error(TAG, "Persisting data collection config has failed", e); + } + } + + /** + * Load the last data collection configuration from the shared preferences + * + * @param context The context to access shared preferences + */ + private void loadDataCollectionConfig(@NonNull Context context) { + String serializedDataCollectionConfig = ParametersProvider + .get(context) + .get(ParameterKeys.DATA_COLLECTION_CONFIG_KEY); + if (serializedDataCollectionConfig != null) { + try { + JSONObject jsonDataCollectionConfig = new JSONObject(serializedDataCollectionConfig); + this.dataCollectionConfig.setGeoIPEnabled(jsonDataCollectionConfig.optBoolean("geoip")); + this.dataCollectionConfig.setDeviceBrandEnabled(jsonDataCollectionConfig.optBoolean("deviceBrand")); + this.dataCollectionConfig.setDeviceModelEnabled(jsonDataCollectionConfig.optBoolean("deviceModel")); + } catch (JSONException e) { + Logger.error(TAG, "Loading data collection config has failed", e); + this.setDefaultDataCollectionConfig(); + } + } else { + // If no configuration found in shared pref, init with default values + this.setDefaultDataCollectionConfig(); + } + } + + /** + * Set default values to the current data collection config. + */ + private void setDefaultDataCollectionConfig() { + this.dataCollectionConfig.setGeoIPEnabled(false); + this.dataCollectionConfig.setDeviceBrandEnabled(false); + this.dataCollectionConfig.setDeviceModelEnabled(false); + } +} diff --git a/Sources/sdk/src/main/java/com/batch/android/module/DisplayReceiptModule.java b/Sources/sdk/src/main/java/com/batch/android/module/DisplayReceiptModule.java index 9a9eef3..7b1a523 100644 --- a/Sources/sdk/src/main/java/com/batch/android/module/DisplayReceiptModule.java +++ b/Sources/sdk/src/main/java/com/batch/android/module/DisplayReceiptModule.java @@ -111,7 +111,7 @@ public void scheduleDisplayReceipt(Context context, @NonNull InternalPushData pu dma = 0; } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && dmi >= 0) { + if (dmi >= 0) { try { JobScheduler scheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); if (scheduler == null) { diff --git a/Sources/sdk/src/main/java/com/batch/android/module/MessagingModule.java b/Sources/sdk/src/main/java/com/batch/android/module/MessagingModule.java index 60a6f18..97bbf8d 100644 --- a/Sources/sdk/src/main/java/com/batch/android/module/MessagingModule.java +++ b/Sources/sdk/src/main/java/com/batch/android/module/MessagingModule.java @@ -93,7 +93,7 @@ public class MessagingModule extends BatchModule { //region: Instance variables - private boolean showForegroundLandings = true; + private boolean showForegroundLandings = false; private boolean automaticMode = true; diff --git a/Sources/sdk/src/main/java/com/batch/android/module/OptOutModule.java b/Sources/sdk/src/main/java/com/batch/android/module/OptOutModule.java index cdfa693..da58f81 100644 --- a/Sources/sdk/src/main/java/com/batch/android/module/OptOutModule.java +++ b/Sources/sdk/src/main/java/com/batch/android/module/OptOutModule.java @@ -3,8 +3,6 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; -import android.content.pm.PackageManager; -import android.os.Bundle; import android.os.Handler; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; @@ -23,6 +21,7 @@ import com.batch.android.json.JSONException; import com.batch.android.processor.Module; import com.batch.android.processor.Singleton; +import com.batch.android.util.MetaDataUtils; /** * Batch's Opt Out Module. @@ -46,8 +45,6 @@ public class OptOutModule extends BatchModule { private static final String SHOULD_SEND_OPTIN_EVENT_KEY = "app.batch.send_optin_event"; - private static final String MANIFEST_OPT_OUT_BY_DEFAULT_KEY = "batch_opted_out_by_default"; - private Boolean isOptedOut = null; private SharedPreferences preferences; @@ -72,7 +69,7 @@ public boolean isOptedOutSync(Context context) { if (prefs.contains(OPTED_OUT_FROM_BATCHSDK_KEY)) { isOptedOut = prefs.getBoolean(OPTED_OUT_FROM_BATCHSDK_KEY, false); } else { - isOptedOut = getManifestBoolean(context, MANIFEST_OPT_OUT_BY_DEFAULT_KEY, false); + isOptedOut = MetaDataUtils.getBooleanMetaData(context, MetaDataUtils.MANIFEST_OPT_OUT_BY_DEFAULT_KEY); prefs.edit().putBoolean(OPTED_OUT_FROM_BATCHSDK_KEY, isOptedOut).apply(); if (isOptedOut) { Logger.info( @@ -191,7 +188,6 @@ public void wipeData(Context context) { Parameters parameters = ParametersProvider.get(context); parameters.remove(ParameterKeys.CUSTOM_ID); - parameters.remove(ParameterKeys.ATTRIBUTION_ID); parameters.remove(ParameterKeys.INSTALL_ID_KEY); parameters.remove(ParameterKeys.INSTALL_TIMESTAMP_KEY); parameters.remove(ParameterKeys.PUSH_APP_VERSION_KEY); @@ -202,23 +198,6 @@ public void wipeData(Context context) { parameters.remove("push.token.provider"); } - private boolean getManifestBoolean(Context context, String key, boolean fallback) { - try { - final Bundle metaData = context - .getPackageManager() - .getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA) - .metaData; - - if (metaData == null) { - return fallback; - } - - return metaData.getBoolean(key, fallback); - } catch (PackageManager.NameNotFoundException e) { - return fallback; - } - } - //region: BatchModule @Override diff --git a/Sources/sdk/src/main/java/com/batch/android/module/ProfileModule.java b/Sources/sdk/src/main/java/com/batch/android/module/ProfileModule.java new file mode 100644 index 0000000..b8ada0f --- /dev/null +++ b/Sources/sdk/src/main/java/com/batch/android/module/ProfileModule.java @@ -0,0 +1,257 @@ +package com.batch.android.module; + +import android.content.Context; +import android.text.TextUtils; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.batch.android.Batch; +import com.batch.android.BatchEventAttributes; +import com.batch.android.BatchMigration; +import com.batch.android.core.Logger; +import com.batch.android.di.providers.RuntimeManagerProvider; +import com.batch.android.di.providers.SQLUserDatasourceProvider; +import com.batch.android.di.providers.TaskExecutorProvider; +import com.batch.android.di.providers.TrackerModuleProvider; +import com.batch.android.di.providers.UserModuleProvider; +import com.batch.android.event.EventAttributesSerializer; +import com.batch.android.event.EventAttributesValidator; +import com.batch.android.event.InternalEvents; +import com.batch.android.json.JSONException; +import com.batch.android.json.JSONObject; +import com.batch.android.processor.Module; +import com.batch.android.processor.Provide; +import com.batch.android.processor.Singleton; +import com.batch.android.profile.ProfileDataHelper; +import com.batch.android.profile.ProfileDataSerializer; +import com.batch.android.profile.ProfileUpdateOperation; +import com.batch.android.user.AttributeType; +import com.batch.android.user.SQLUserDatasource; +import com.batch.android.user.UserAttribute; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; + +/** + * Batch Profile module + * + */ +@Module +@Singleton +public final class ProfileModule extends BatchModule { + + public static final String TAG = "Profile"; + + /** + * Batch Tracker Module + */ + @NonNull + private final TrackerModule trackerModule; + + /** + * ProfileModule constructor + * @param trackerModule The Batch Tracker Module + */ + private ProfileModule(@NonNull TrackerModule trackerModule) { + this.trackerModule = trackerModule; + } + + /** + * DI access method + * @return A new instance of the profile module + */ + @Provide + public static ProfileModule provide() { + return new ProfileModule(TrackerModuleProvider.get()); + } + + // region BatchModule + @Override + public String getId() { + return "profile"; + } + + @Override + public int getState() { + return 1; + } + + // endregion + + /** + * Internal implementation of the identify method + * @param identifier The custom user identifier + */ + public void identify(@Nullable String identifier) { + if (ProfileDataHelper.isNotValidCustomUserID(identifier)) { + Logger.error(TAG, "identify called with invalid identifier (must be less than 1024 chars)"); + return; + } + + Context context = RuntimeManagerProvider.get().getContext(); + if (context == null) { + Logger.error(TAG, "Batch does not have a context yet. Make sure Batch is started."); + return; + } + + // Saving the custom identifier locally + UserModuleProvider.get().setCustomID(context, identifier); + + // Send an identify event to login/logout the profile with the installation + this.sendIdentifyEvent(identifier); + } + + /** + * Handle profile data changed + * @param data The profile data model to handle + */ + public void handleProfileDataChanged(@NonNull ProfileUpdateOperation data) { + try { + JSONObject params = ProfileDataSerializer.serialize(data); + if (params.length() == 0) { + Logger.internal(TAG, "Trying to send an empty profile data changed event, aborting."); + return; + } + trackerModule.track(InternalEvents.PROFILE_DATA_CHANGED, params); + } catch (JSONException e) { + Logger.error(TAG, "Sending profile data changed event failed.", e); + } + } + + /** + * Method called when we the project key has changed. + * + * @param oldProjectKey The old project key bound to the App + * @param newProjectKey The new project key bound to the App + */ + public void onProjectChanged(@Nullable String oldProjectKey, @NonNull String newProjectKey) { + Context context = RuntimeManagerProvider.get().getContext(); + if (context == null) { + Logger.error(TAG, "Batch does not have a context yet. Aborting profile data migrations."); + return; + } + // Migrate only the first time + if (oldProjectKey == null) { + // Migration related configurations + RuntimeManagerProvider + .get() + .readConfig(config -> { + Integer migrations = config.getMigrations(); + // Custom ID Migration + if (BatchMigration.isCustomIDMigrationDisabled(migrations)) { + Logger.internal(TAG, "Custom ID migration has been explicitly disabled."); + } else { + String customUserID = UserModuleProvider.get().getCustomID(context); + if (customUserID != null) { + Logger.internal(TAG, "Automatic custom id migration."); + sendIdentifyEvent(customUserID); + } + } + + // Custom Data Migration + if (BatchMigration.isCustomDataMigrationDisabled(migrations)) { + Logger.internal(TAG, "Custom Data migration has been explicitly disabled."); + } else { + Logger.internal(TAG, "Automatic custom data migration."); + TaskExecutorProvider.get(context).submit(() -> this.migrateCustomData(context)); + } + }); + } + } + + /** + * Migrate the installation related data to the profile + * + * @param context Android's context + */ + private void migrateCustomData(Context context) { + ProfileUpdateOperation profileUpdateOperation = new ProfileUpdateOperation(); + + // Get custom language and region + profileUpdateOperation.setLanguage(UserModuleProvider.get().getLanguage(context)); + profileUpdateOperation.setRegion(UserModuleProvider.get().getRegion(context)); + + // Get custom attributes + final SQLUserDatasource datasource = SQLUserDatasourceProvider.get(context); + Map customAttributes = datasource.getAttributes(); + for (Map.Entry entry : customAttributes.entrySet()) { + profileUpdateOperation.addAttribute(entry.getKey().substring(2), entry.getValue()); // substring 2 to remove datasource "c." prefix + } + // Get custom tags + Map> customTagCollections = datasource.getTagCollections(); + for (Map.Entry> entry : customTagCollections.entrySet()) { + profileUpdateOperation.addAttribute( + entry.getKey(), + new UserAttribute(new ArrayList<>(entry.getValue()), AttributeType.STRING_ARRAY) + ); + } + // Send profile data changed + this.handleProfileDataChanged(profileUpdateOperation); + } + + /** + * Send an internal event for profile identify + * + * @param identifier The custom user identifier + */ + private void sendIdentifyEvent(@Nullable String identifier) { + String installationID = Batch.User.getInstallationID(); + if (installationID == null) { + Logger.error(TAG, "Cannot send identify event since Installation ID is null."); + return; + } + JSONObject params = new JSONObject(); + JSONObject identifiers = new JSONObject(); + try { + identifiers.put("custom_id", identifier != null ? identifier : JSONObject.NULL); + identifiers.put("install_id", installationID); + params.put("identifiers", identifiers); + trackerModule.track(InternalEvents.PROFILE_IDENTIFY, params); + } catch (JSONException e) { + Logger.error(TAG, "Sending identify event failed", e); + } + } + + //region Event Tracking + + /** + * Track a public event + * + * @param event Event name + * @param eventAttributes Event attributes + */ + public void trackPublicEvent(@NonNull String event, @Nullable BatchEventAttributes eventAttributes) { + // Event name validation + boolean nameValidated = !TextUtils.isEmpty(event) && EventAttributesValidator.isEventNameValid(event); + if (!nameValidated) { + Logger.error(TAG, "Invalid event name ('" + event + "'). Not tracking event."); + return; + } + JSONObject eventParameters = new JSONObject(); + if (eventAttributes != null) { + // Event data validation + List errors = eventAttributes.validateEventAttributes(); + if (!errors.isEmpty()) { + Logger.error( + TAG, + "Failed to validate event attributes:\n\n" + String.join("\n", errors) + "\n\nNot tracking event." + ); + return; + } + // Event data serialization + try { + eventParameters = EventAttributesSerializer.serialize(eventAttributes); + } catch (JSONException | ClassCastException e) { + Logger.error( + TAG, + "Could not process BatchEventAttributes, refusing to track event. This is an internal error: please contact us." + ); + Logger.internal(TAG, "BatchEventAttributes serialization did failed - Not tracking event.", e); + return; + } + } + trackerModule.track("E." + event.toUpperCase(Locale.US), eventParameters); + } + //endregion +} diff --git a/Sources/sdk/src/main/java/com/batch/android/module/PushModule.java b/Sources/sdk/src/main/java/com/batch/android/module/PushModule.java index b1f393f..14e0829 100644 --- a/Sources/sdk/src/main/java/com/batch/android/module/PushModule.java +++ b/Sources/sdk/src/main/java/com/batch/android/module/PushModule.java @@ -23,9 +23,11 @@ import com.batch.android.Batch; import com.batch.android.BatchActionActivity; import com.batch.android.BatchNotificationInterceptor; +import com.batch.android.BatchPermissionListener; import com.batch.android.BatchPushHelper; import com.batch.android.BatchPushNotificationPresenter; import com.batch.android.BatchPushPayload; +import com.batch.android.BatchPushRegistration; import com.batch.android.BatchPushService; import com.batch.android.IntentParser; import com.batch.android.PushNotificationType; @@ -46,13 +48,13 @@ import com.batch.android.processor.Provide; import com.batch.android.processor.Singleton; import com.batch.android.push.PushRegistrationProviderFactory; -import com.batch.android.push.Registration; import com.batch.android.runtime.State; import com.google.firebase.messaging.RemoteMessage; import java.util.EnumSet; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; /** * Push Module of Batch @@ -279,42 +281,32 @@ public boolean isBatchPush(RemoteMessage message) { } /** - * Return the push token if available + * Return the push registration if available * * @return token if available, null otherwise */ - public String getRegistrationID() { - final StringBuilder registrationIDBuilder = new StringBuilder(); - + @Nullable + public BatchPushRegistration getRegistration() { + AtomicReference registration = new AtomicReference<>(); RuntimeManagerProvider .get() .run(state -> { if (state != State.OFF) { // We need a context to get the token - final Registration registration = getRegistration(RuntimeManagerProvider.get().getContext()); - if (registration != null) { - registrationIDBuilder.append(registration.registrationID); + Context context = RuntimeManagerProvider.get().getContext(); + if (context != null) { + registration.set(getRegistration(context)); } } }); - - if (registrationIDBuilder.length() > 0) { - return registrationIDBuilder.toString(); - } - - return null; + return registration.get(); } /** * Get the persisted registration */ - public Registration getRegistration(@NonNull Context context) { + public BatchPushRegistration getRegistration(@NonNull Context context) { try { final Parameters parameters = ParametersProvider.get(context); - if (parameters == null) { - Logger.internal(TAG, "Could not fetch registration: failed to read parameters"); - return null; - } - final String registrationID = parameters.get(ParameterKeys.PUSH_REGISTRATION_ID_KEY); if (registrationID == null) { return null; @@ -328,7 +320,7 @@ public Registration getRegistration(@NonNull Context context) { String senderID = parameters.get(ParameterKeys.PUSH_REGISTRATION_SENDERID_KEY); String gcpProjectID = parameters.get(ParameterKeys.PUSH_REGISTRATION_GCPPROJECTID_KEY); - return new Registration(registrationProvider, registrationID, senderID, gcpProjectID); + return new BatchPushRegistration(registrationProvider, registrationID, senderID, gcpProjectID); } catch (Exception e) { Logger.internal(TAG, "Error while retrieving registration id", e); return null; @@ -341,6 +333,7 @@ public Registration getRegistration(@NonNull Context context) { * * @return Type of notifications you previously set. Be careful, as this can be null if you never used setNotificationsType() or if your context is invalid */ + @Nullable public EnumSet getNotificationsType(Context context) { if (context == null) { return null; @@ -384,18 +377,16 @@ public void setNotificationsType(EnumSet types) { final AtomicBoolean handled = new AtomicBoolean(false); final int value = PushNotificationType.toValue(types); - if (RuntimeManagerProvider.get() != null) { - RuntimeManagerProvider - .get() - .run(state -> { - if (state != State.OFF) { - ParametersProvider - .get(RuntimeManagerProvider.get().getContext()) - .set(ParameterKeys.PUSH_NOTIF_TYPE, Integer.toString(value), true); - handled.set(true); - } - }); - } + RuntimeManagerProvider + .get() + .run(state -> { + if (state != State.OFF) { + ParametersProvider + .get(RuntimeManagerProvider.get().getContext()) + .set(ParameterKeys.PUSH_NOTIF_TYPE, Integer.toString(value), true); + handled.set(true); + } + }); if (!handled.get()) { tempNotifType = types; @@ -807,7 +798,7 @@ public void run() { return; } - final Registration registration = new Registration( + final BatchPushRegistration registration = new BatchPushRegistration( provider.getShortname(), registrationID, provider.getSenderID(), @@ -827,14 +818,14 @@ public String getTaskIdentifier() { /** * Injects a registration ID into Batch, either from a builtin provider or the user's */ - private void emitRegistration(@NonNull Context context, @NonNull final Registration registration) { + private void emitRegistration(@NonNull Context context, @NonNull final BatchPushRegistration registration) { final Context appContext = context.getApplicationContext(); // Broadcast a Batch-emitted registration intent final Intent i = new Intent(Batch.ACTION_REGISTRATION_IDENTIFIER_OBTAINED); - i.putExtra(Batch.EXTRA_REGISTRATION_PROVIDER_NAME, registration.provider); - i.putExtra(Batch.EXTRA_REGISTRATION_IDENTIFIER, registration.registrationID); - i.putExtra(Batch.EXTRA_REGISTRATION_SENDER_ID, registration.senderID); + i.putExtra(Batch.EXTRA_REGISTRATION_PROVIDER_NAME, registration.getProvider()); + i.putExtra(Batch.EXTRA_REGISTRATION_IDENTIFIER, registration.getToken()); + i.putExtra(Batch.EXTRA_REGISTRATION_SENDER_ID, registration.getSenderID()); i.setPackage(appContext.getPackageName()); appContext.sendBroadcast(i, Batch.getBroadcastPermissionName(appContext)); @@ -857,20 +848,24 @@ private void emitRegistration(@NonNull Context context, @NonNull final Registrat parameters.set(ParameterKeys.PUSH_APP_VERSION_KEY, getAppVersion(), true); - parameters.set(ParameterKeys.PUSH_REGISTRATION_PROVIDER_KEY, registration.provider, true); + parameters.set(ParameterKeys.PUSH_REGISTRATION_PROVIDER_KEY, registration.getProvider(), true); - parameters.set(ParameterKeys.PUSH_REGISTRATION_ID_KEY, registration.registrationID, true); + parameters.set(ParameterKeys.PUSH_REGISTRATION_ID_KEY, registration.getToken(), true); - if (registration.senderID != null) { - parameters.set(ParameterKeys.PUSH_REGISTRATION_SENDERID_KEY, registration.senderID, true); + if (registration.getSenderID() != null) { + parameters.set( + ParameterKeys.PUSH_REGISTRATION_SENDERID_KEY, + registration.getSenderID(), + true + ); } else { parameters.remove(ParameterKeys.PUSH_REGISTRATION_SENDERID_KEY); } - if (registration.gcpProjectID != null) { + if (registration.getGcpProjectID() != null) { parameters.set( ParameterKeys.PUSH_REGISTRATION_GCPPROJECTID_KEY, - registration.gcpProjectID, + registration.getGcpProjectID(), true ); } else { @@ -878,10 +873,10 @@ private void emitRegistration(@NonNull Context context, @NonNull final Registrat } if ( - !registration.registrationID.equals(currentRegistrationID) || - !registration.provider.equals(currentRegistrationProvider) || - !TextUtils.equals(registration.senderID, currentSenderID) || - !TextUtils.equals(registration.gcpProjectID, currentGCPProjectID) + !registration.getToken().equals(currentRegistrationID) || + !registration.getProvider().equals(currentRegistrationProvider) || + !TextUtils.equals(registration.getSenderID(), currentSenderID) || + !TextUtils.equals(registration.getGcpProjectID(), currentGCPProjectID) ) { WebserviceLauncher.launchPushWebservice(RuntimeManagerProvider.get(), registration); } @@ -932,8 +927,8 @@ public static boolean isBackgroundRestricted(@NonNull Context context) { return false; } - private void printRegistration(@NonNull Registration registration) { - Logger.info(TAG, "Registration ID/Push Token (" + registration.provider + "): " + registration.registrationID); + private void printRegistration(@NonNull BatchPushRegistration registration) { + Logger.info(TAG, "Registration ID/Push Token (" + registration.getProvider() + "): " + registration.getToken()); } /** @@ -941,12 +936,13 @@ private void printRegistration(@NonNull Registration registration) { * Required for Android 13 (api 33) * Do nothing if app target is lower than 13 * @param context requesting the permission + * @param listener callback with permission result */ - public void requestNotificationPermission(@NonNull Context context) { + public void requestNotificationPermission(@NonNull Context context, @Nullable BatchPermissionListener listener) { if (context == null) { throw new IllegalArgumentException("Context can't be null"); } - NotificationPermissionHelper helper = new NotificationPermissionHelper(); + NotificationPermissionHelper helper = new NotificationPermissionHelper(listener); helper.requestPermission(context, false, null); } @@ -993,14 +989,17 @@ public void batchWillStart() { } } + /** + * + * @return + */ + @Nullable private synchronized PushRegistrationProvider getRegistrationProvider() { if (!didSetupRegistrationProvider) { Context context = RuntimeManagerProvider.get().getContext(); if (context != null) { didSetupRegistrationProvider = true; - registrationProvider = - new PushRegistrationProviderFactory(context, Batch.shouldUseGoogleInstanceID(), gcmSenderId) - .getRegistrationProvider(); + registrationProvider = new PushRegistrationProviderFactory(context).getRegistrationProvider(); if (registrationProvider == null) { Logger.error(TAG, "Could not register for notifications."); diff --git a/Sources/sdk/src/main/java/com/batch/android/module/TrackerModule.java b/Sources/sdk/src/main/java/com/batch/android/module/TrackerModule.java index 910b015..763c06c 100644 --- a/Sources/sdk/src/main/java/com/batch/android/module/TrackerModule.java +++ b/Sources/sdk/src/main/java/com/batch/android/module/TrackerModule.java @@ -2,6 +2,7 @@ import android.content.Context; import androidx.annotation.NonNull; +import com.batch.android.BatchPushRegistration; import com.batch.android.FailReason; import com.batch.android.WebserviceLauncher; import com.batch.android.core.Logger; @@ -29,16 +30,15 @@ import com.batch.android.processor.Module; import com.batch.android.processor.Provide; import com.batch.android.processor.Singleton; -import com.batch.android.push.Registration; import com.batch.android.runtime.State; import com.batch.android.tracker.TrackerDatasource; -import com.batch.android.tracker.TrackerMode; import com.batch.android.webservice.listener.TrackerWebserviceListener; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicBoolean; @@ -61,17 +61,17 @@ public final class TrackerModule extends BatchModule implements EventSenderListe /** * Memory event queue that buffers them before saving them in SQLite */ - private Queue memoryStorage = new ConcurrentLinkedQueue<>(); + private final Queue memoryStorage = new ConcurrentLinkedQueue<>(); /** * Executor responsible for persisting the data in the Queue to SQLite */ - private ExecutorService flushExecutor = Executors.newSingleThreadExecutor(new NamedThreadFactory()); + private final ExecutorService flushExecutor = Executors.newSingleThreadExecutor(new NamedThreadFactory()); /** * Boolean that tells if the flushExecutor is working */ - private AtomicBoolean isFlushing = new AtomicBoolean(false); + private final AtomicBoolean isFlushing = new AtomicBoolean(false); /** * Event sender instance @@ -86,10 +86,10 @@ public final class TrackerModule extends BatchModule implements EventSenderListe /** * Modules */ - private OptOutModule optOutModule; - private LocalCampaignsModule localCampaignsModule; - private CampaignManager campaignManager; - private PushModule pushModule; + private final OptOutModule optOutModule; + private final LocalCampaignsModule localCampaignsModule; + private final CampaignManager campaignManager; + private final PushModule pushModule; // --------------------------------------------> @@ -122,48 +122,46 @@ public String getId() { @Override public int getState() { - return getMode().getValue(); + return 1; } @Override public void batchWillStart() { - TrackerMode mode = getMode(); - - if (mode != TrackerMode.OFF) { - try { - batchSendQuantity = - Integer.parseInt( - ParametersProvider - .get(RuntimeManagerProvider.get().getContext()) - .get(ParameterKeys.EVENT_TRACKER_BATCH_QUANTITY) - ); - - //Start the event tracker. - datasource = new TrackerDatasource(RuntimeManagerProvider.get().getContext().getApplicationContext()); - int overflowEventsDeleted = datasource.deleteOverflowEvents( - Integer.parseInt( - ParametersProvider - .get(RuntimeManagerProvider.get().getContext()) - .get(ParameterKeys.EVENT_TRACKER_EVENTS_LIMIT) - ) + try { + batchSendQuantity = + Integer.parseInt( + ParametersProvider + .get(RuntimeManagerProvider.get().getContext()) + .get(ParameterKeys.EVENT_TRACKER_BATCH_QUANTITY) ); - datasource.resetEventStatus(); - Logger.internal(TAG, "Deleted " + overflowEventsDeleted + " overflow events"); + //Start the event tracker. + Context context = RuntimeManagerProvider.get().getContext(); + if (context == null) { + throw new NullPointerException("Context cannot be null"); + } - // Not reconstructed everytime to keep track of the state and only if we are in ON mode - if (mode == TrackerMode.ON && sender == null) { - sender = new EventSender(RuntimeManagerProvider.get(), this); - } - } catch (Exception e) { - Logger.error(TAG, "Error while starting tracker module", e); + int eventsToDeleteLimit = Integer.parseInt( + ParametersProvider.get(context).get(ParameterKeys.EVENT_TRACKER_EVENTS_LIMIT) + ); + + datasource = new TrackerDatasource(context.getApplicationContext()); + int overflowEventsDeleted = datasource.deleteOverflowEvents(eventsToDeleteLimit); + Logger.internal(TAG, "Deleted " + overflowEventsDeleted + " overflow events"); + datasource.resetEventStatus(); + + // Not reconstructed everytime to keep track of the state and only if we are in ON mode + if (sender == null) { + sender = new EventSender(RuntimeManagerProvider.get(), this); } + } catch (Exception e) { + Logger.error(TAG, "Error while starting tracker module", e); } } @Override public void batchDidStart() { - // If it got events before it was started, they will be immediatly written to SQLite and sent as new. + // If it got events before it was started, they will be immediately written to SQLite and sent as new. if (!memoryStorage.isEmpty()) { flush(); } @@ -183,7 +181,7 @@ public void batchDidStop() { /** * Track an event by its name * - * @param name + * @param name The name of the event */ public void track(String name) { track(name, null); @@ -192,8 +190,8 @@ public void track(String name) { /** * Track an event by its name with additional parameters * - * @param name - * @param parameters + * @param name The name of the event + * @param parameters The parameters of the event */ public void track(String name, JSONObject parameters) { track(name, new Date().getTime(), parameters); @@ -202,9 +200,9 @@ public void track(String name, JSONObject parameters) { /** * Track en event by its name, timestamp and with additional parameters * - * @param name - * @param timestamp - * @param parameters + * @param name The name of the event + * @param timestamp The timestamp of the event + * @param parameters The parameters of the event */ public void track(String name, long timestamp, JSONObject parameters) { if (Boolean.TRUE.equals(optOutModule.isOptedOut())) { @@ -212,7 +210,7 @@ public void track(String name, long timestamp, JSONObject parameters) { } if (Parameters.ENABLE_DEV_LOGS && parameters != null) { - Logger.internal(TAG, "Tracking event " + name + " with parameters " + parameters.toString()); + Logger.internal(TAG, "Tracking event " + name + " with parameters " + parameters); } else { Logger.internal(TAG, "Tracking event " + name); } @@ -227,9 +225,9 @@ public void track(String name, long timestamp, JSONObject parameters) { /** * Track a collapsible event by its name, timestamp and with additional parameters * - * @param name - * @param timestamp - * @param parameters + * @param name The name of the event + * @param timestamp The timestamp of the event + * @param parameters The parameters of the event */ public void trackCollapsible(String name, long timestamp, JSONObject parameters) { if (Boolean.TRUE.equals(optOutModule.isOptedOut())) { @@ -240,25 +238,24 @@ public void trackCollapsible(String name, long timestamp, JSONObject parameters) memoryStorage.add(new CollapsibleEvent(RuntimeManagerProvider.get().getContext(), timestamp, name, parameters)); flush(); - // TODO: Don't do that if we're off localCampaignsModule.sendSignal(new EventTrackedSignal(name, parameters)); } /** * Track an event by its name and timestamp * - * @param name - * @param timestamp + * @param name The name of the event + * @param timestamp The timestamp of the event */ public void track(String name, long timestamp) { track(name, timestamp, null); } /** - * Track local campaign vien + * Track local campaign view * - * @param campaignID - * @param eventData + * @param campaignID The campaign identifier + * @param eventData The data of the event */ public void trackCampaignView(@NonNull String campaignID, @NonNull JSONObject eventData) { ViewTracker vt = campaignManager.getViewTracker(); @@ -289,8 +286,8 @@ public void trackCampaignView(@NonNull String campaignID, @NonNull JSONObject ev /** * Track the opt-in event * - * @param context - * @throws JSONException + * @param context Android's context + * @throws JSONException Serialization exception */ void trackOptInEvent(final Context context) throws JSONException { track(InternalEvents.OPT_IN, makeOptBaseEventData(context)); @@ -299,9 +296,9 @@ void trackOptInEvent(final Context context) throws JSONException { /** * Track the opt-out event * - * @param context - * @param name - * @return + * @param context Android's context + * @param name The name of the event + * @return A promise resolving when the request has finished */ Promise trackOptOutEvent(final Context context, String name) { // iOS has debouncing, but is it really useful? @@ -356,20 +353,15 @@ private JSONObject makeOptBaseEventData(Context context) throws JSONException { data.put("cus", customID); } - String attributionID = params.get(ParameterKeys.ATTRIBUTION_ID); - if (attributionID != null) { - data.put("idv", attributionID); - } - - Registration reg = pushModule.getRegistration(context); + BatchPushRegistration reg = pushModule.getRegistration(context); if (reg != null) { - data.put("tok", reg.registrationID); - data.put("provider", reg.provider); - if (reg.senderID != null) { - data.put("senderid", reg.senderID); + data.put("tok", reg.getToken()); + data.put("provider", reg.getProvider()); + if (reg.getSenderID() != null) { + data.put("senderid", reg.getSenderID()); } - if (reg.gcpProjectID != null) { - data.put("gcpproject", reg.gcpProjectID); + if (reg.getGcpProjectID() != null) { + data.put("gcpproject", reg.getGcpProjectID()); } } return data; @@ -441,34 +433,6 @@ private void flush() { }); } - // ------------------------------------------------> - - /** - * Retrieve the current mode of the module - * - * @return mode of the module, fallback on ON - */ - private TrackerMode getMode() { - TrackerMode mode = null; - - try { - mode = - TrackerMode.fromValue( - Integer.parseInt( - ParametersProvider - .get(RuntimeManagerProvider.get().getContext()) - .get(ParameterKeys.EVENT_TRACKER_STATE) - ) - ); - } catch (Exception e) { - Logger.internal(TAG, "Error while reading tracker mode", e); - } - - return mode != null ? mode : TrackerMode.ON; - } - - // ------------------------------------------------> - @Override public void onEventsSendSuccess(final List events) { Logger.internal(TAG, "onEventsSendSuccess"); @@ -482,8 +446,8 @@ public void onEventsSendSuccess(final List events) { for (Event event : events) { ids.add(event.getId()); } - - datasource.deleteEvents(ids.toArray(new String[ids.size()])); + String[] idsArray = new String[ids.size()]; + datasource.deleteEvents(ids.toArray(idsArray)); if (events.size() == batchSendQuantity) { // If we just sent the max number of event in a raw, there's probably more sender.hasNewEvents(); @@ -511,12 +475,14 @@ public void onEventsSendFailure(final List events) { } } + String[] newIdsArray = new String[newIds.size()]; if (!newIds.isEmpty()) { - datasource.updateEventsToNew(newIds.toArray(new String[newIds.size()])); + datasource.updateEventsToNew(newIds.toArray(newIdsArray)); } + String[] oldIdsArray = new String[oldIds.size()]; if (!oldIds.isEmpty()) { - datasource.updateEventsToOld(oldIds.toArray(new String[oldIds.size()])); + datasource.updateEventsToOld(oldIds.toArray(oldIdsArray)); } } }); diff --git a/Sources/sdk/src/main/java/com/batch/android/module/UserModule.java b/Sources/sdk/src/main/java/com/batch/android/module/UserModule.java index f749a55..4dd391e 100644 --- a/Sources/sdk/src/main/java/com/batch/android/module/UserModule.java +++ b/Sources/sdk/src/main/java/com/batch/android/module/UserModule.java @@ -7,8 +7,8 @@ import android.location.Location; import android.os.SystemClock; import android.text.TextUtils; -import androidx.annotation.VisibleForTesting; -import com.batch.android.BatchUserDataEditor; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.batch.android.WebserviceLauncher; import com.batch.android.core.Logger; import com.batch.android.core.NamedThreadFactory; @@ -26,12 +26,14 @@ import com.batch.android.processor.Module; import com.batch.android.processor.Provide; import com.batch.android.processor.Singleton; +import com.batch.android.user.InstallDataEditor; import com.batch.android.user.SQLUserDatasource; import com.batch.android.user.UserAttribute; import com.batch.android.user.UserDataDiff; import com.batch.android.user.UserDatabaseException; import com.batch.android.user.UserOperation; import com.batch.android.user.UserOperationQueue; +import java.util.Collections; import java.util.Date; import java.util.LinkedList; import java.util.List; @@ -55,10 +57,7 @@ public final class UserModule extends BatchModule { public static final String TAG = "User"; public static final String PARAMETER_KEY_LABEL = "label"; public static final String PARAMETER_KEY_DATA = "data"; - public static final String PARAMETER_KEY_AMOUNT = "amount"; - private static final Pattern EVENT_NAME_PATTERN = Pattern.compile("^[a-zA-Z0-9_]{1,30}$"); - private static final long LOCATION_UPDATE_MINIMUM_TIME_MS = 30000; private static final long CIPHER_FALLBACK_RESET_TIME_MS = 172800000L; @@ -69,14 +68,10 @@ private static ScheduledExecutorService makeApplyQueue() { } private final List operationQueues = new LinkedList<>(); - private BroadcastReceiver localBroadcastReceiver; - - private AtomicBoolean checkScheduled = new AtomicBoolean(false); - + private final AtomicBoolean checkScheduled = new AtomicBoolean(false); private long lastLocationTrackTimestamp = 0; - - private TrackerModule trackerModule; + private final TrackerModule trackerModule; private UserModule(TrackerModule trackerModule) { this.trackerModule = trackerModule; @@ -127,7 +122,7 @@ public void batchDidStart() { @Override public void onReceive(Context context, Intent intent) { if (OptOutModule.INTENT_OPTED_IN.equalsIgnoreCase(intent.getAction())) { - userOptedIn(context); + userOptedIn(); } } }; @@ -141,6 +136,123 @@ public void onReceive(Context context, Intent intent) { // endregion + // region Getter & Setter + /** + * Set the new language + * + * @param context Android's context + * @param language The User's language, null to remove + */ + public void setLanguage(@NonNull Context context, @Nullable String language) { + if (language != null) { + ParametersProvider.get(context).set(ParameterKeys.USER_PROFILE_LANGUAGE_KEY, language, true); + } else { + ParametersProvider.get(context).remove(ParameterKeys.USER_PROFILE_LANGUAGE_KEY); + } + } + + /** + * Get the User's language + * + * @param context Android's context + * @return the User's language if any, null otherwise + */ + @Nullable + public String getLanguage(@NonNull Context context) { + return ParametersProvider.get(context).get(ParameterKeys.USER_PROFILE_LANGUAGE_KEY); + } + + /** + * Set the User's region + * + * @param context Android's context + * @param region the User's region, null to remove + */ + public void setRegion(@NonNull Context context, @Nullable String region) { + if (region != null) { + ParametersProvider.get(context).set(ParameterKeys.USER_PROFILE_REGION_KEY, region, true); + } else { + ParametersProvider.get(context).remove(ParameterKeys.USER_PROFILE_REGION_KEY); + } + } + + /** + * Get the User's region + * @param context Android's context + * @return the User's region if any, null otherwise + */ + @Nullable + public String getRegion(@NonNull Context context) { + return ParametersProvider.get(context).get(ParameterKeys.USER_PROFILE_REGION_KEY); + } + + /** + * Set the User's custom identifier + * @param context Android's context + * @param customID the User's custom identifier , null to remove + */ + public void setCustomID(@NonNull Context context, @Nullable String customID) { + if (customID != null) { + ParametersProvider.get(context).set(ParameterKeys.CUSTOM_ID, customID, true); + } else { + ParametersProvider.get(context).remove(ParameterKeys.CUSTOM_ID); + } + } + + /** + * Get the custom ID if any, null otherwise + * @param context Android's context + * @return the custom ID if any, null otherwise + */ + public String getCustomID(@NonNull Context context) { + return ParametersProvider.get(context).get(ParameterKeys.CUSTOM_ID); + } + + /** + * Get the data version + * @param context Android's context + * @return the data version + */ + public long getVersion(@NonNull Context context) { + String version = ParametersProvider.get(context).get(ParameterKeys.USER_DATA_VERSION); + if (version == null) { + return 1; + } + + try { + return Long.parseLong(version); + } catch (Exception e) { + return 1; + } + } + + /** + * Get the data version and increment it + * + * @param context Android's context + */ + public synchronized void incrementVersion(@NonNull Context context) { + long newVersion = getVersion(context) + 1; + ParametersProvider.get(context).set(ParameterKeys.USER_DATA_VERSION, Long.toString(newVersion), true); + } + + /** + * Clear all installation data (attributes + tags) + */ + public void clearInstallationData() { + addOperationQueueAndSubmit( + 0, + new UserOperationQueue( + Collections.singletonList(datasource -> { + datasource.clearAttributes(); + datasource.clearTags(); + }) + ) + ); + } + + //endregion + // region Webservices public void startSendWS(long msDelay) { @@ -179,7 +291,7 @@ public void startSendWS(long msDelay) { WebserviceLauncher.launchAttributesSendWebservice( RuntimeManagerProvider.get(), changeset, - UserAttribute.getServerMapRepresentation(datasource.getAttributes()), + UserAttribute.getServerMapRepresentation(datasource.getAttributes(), true), datasource.getTagCollections() ); } @@ -317,56 +429,6 @@ public void bumpVersion(final long serverVersion) { // endregion - // region Event tracking - - /** - * Track a public event - * - * @param event Event name - * @param label Event label - * @param data Event data, expected to already be converted from BatchEventData. - */ - public void trackPublicEvent(String event, String label, JSONObject data) { - JSONObject params; - - try { - if (data != null) { - params = new JSONObject(data); - } else { - params = new JSONObject(); - } - - if (label != null) { - if (label.length() > 200) { - Logger.internal( - TAG, - "Event label is longer than 200 characters and has been removed from the event" - ); - } else if (label.length() > 0) { - params.put(PARAMETER_KEY_LABEL, label); - } - } - } catch (JSONException e) { - Logger.internal(TAG, "Could not add public event data", e); - params = null; - } - - _trackEvent(event, params); - } - - @VisibleForTesting - protected boolean _trackEvent(String name, JSONObject params) { - boolean nameValidated = !TextUtils.isEmpty(name) && EVENT_NAME_PATTERN.matcher(name).matches(); - - if (!nameValidated) { - Logger.error(TAG, "Invalid event name ('" + name + "'). Not tracking."); - return false; - } - - trackerModule.track("E." + name.toUpperCase(Locale.US), params); - return true; - } - public void trackLocation(Location location) { if (location == null) { return; @@ -410,47 +472,26 @@ public void trackLocation(Location location) { } } - public void trackTransaction(double amount, JSONObject data) { - try { - final JSONObject params = new JSONObject(); - - params.put(PARAMETER_KEY_AMOUNT, amount); - - if (data != null) { - params.put(PARAMETER_KEY_DATA, data.toString()); - } - - trackerModule.track("T", params); - } catch (JSONException e) { - Logger.error(TAG, "Failed to track transaction", e); - } - } - //endregion - // region Apply queue - + // region User operations public static void submitOnApplyQueue(long msDelay, Runnable r) { if (!applyQueue.isShutdown()) { applyQueue.schedule(r, msDelay, TimeUnit.MILLISECONDS); } else { Logger.error( - BatchUserDataEditor.TAG, + InstallDataEditor.TAG, "Could not perform User Data operation. Is this installation currently opted out from Batch?" ); } } - // endregion - - // region User operations - public void addOperationQueueAndSubmit(long msDelay, UserOperationQueue queue) { synchronized (operationQueues) { operationQueues.add(queue); } if (!RuntimeManagerProvider.get().isReady()) { - Logger.internal(BatchUserDataEditor.TAG, "Batch is not started, enqueuing user operations"); + Logger.internal(InstallDataEditor.TAG, "Batch is not started, enqueuing user operations"); return; } // Delay is used to prevent bad use of BatchUserEditor.save() method and trying to batch as much as possible user data transactions. @@ -466,7 +507,7 @@ public void submitOperationQueues(long msDelay) { List operations = new LinkedList<>(); if (operationQueues.size() >= 3) { Logger.warning( - BatchUserDataEditor.TAG, + InstallDataEditor.TAG, "It looks like you are using many instances of BatchUserDataEditor. Please check our documentation to ensure you are using this api correctly: https://doc.batch.com/android/custom-data/custom-attributes#methods" ); } @@ -498,11 +539,6 @@ public static void applyUserOperationsSync(List pendingOperationQ } final SQLUserDatasource datasource = SQLUserDatasourceProvider.get(context); - - if (datasource == null) { - throw new SaveException("Datasource error while applying."); - } - long changeset = Long.parseLong(ParametersProvider.get(context).get(ParameterKeys.USER_DATA_CHANGESET, "0")); changeset++; @@ -526,7 +562,7 @@ public static void applyUserOperationsSync(List pendingOperationQ try { datasource.rollbackTransaction(); } catch (UserDatabaseException e1) { - Logger.internal(BatchUserDataEditor.TAG, "Save - Error while rolling back transaction.", e1); + Logger.internal(InstallDataEditor.TAG, "Save - Error while rolling back transaction.", e1); } throw new SaveException( @@ -562,19 +598,19 @@ public static void applyUserOperationsSync(List pendingOperationQ .get() .track(InternalEvents.INSTALL_DATA_CHANGED, diff.toEventParameters(changeset)); } catch (JSONException e2) { - Logger.internal(BatchUserDataEditor.TAG, "Could not serialize install data diff"); + Logger.internal(InstallDataEditor.TAG, "Could not serialize install data diff"); TrackerModuleProvider.get().track(InternalEvents.INSTALL_DATA_CHANGED_TRACK_FAILURE); } - Logger.internal(BatchUserDataEditor.TAG, "Changeset bumped"); + Logger.internal(InstallDataEditor.TAG, "Changeset bumped"); } else { - Logger.internal(BatchUserDataEditor.TAG, "Changeset not bumped"); + Logger.internal(InstallDataEditor.TAG, "Changeset not bumped"); } } catch (UserDatabaseException e) { try { datasource.rollbackTransaction(); } catch (UserDatabaseException e1) { - Logger.internal(BatchUserDataEditor.TAG, "Error while rolling back transaction.", e1); + Logger.internal(InstallDataEditor.TAG, "Error while rolling back transaction.", e1); } throw new SaveException( @@ -589,10 +625,6 @@ public static class SaveException extends Exception { public String internalErrorMessage; - public SaveException(String message) { - super(message); - } - public SaveException(String message, String internalErrorMessage) { super(message); this.internalErrorMessage = internalErrorMessage; @@ -604,34 +636,13 @@ public SaveException(String message, String internalErrorMessage, Throwable caus } public void log() { - Logger.error(BatchUserDataEditor.TAG, getMessage()); - Logger.internal(BatchUserDataEditor.TAG, internalErrorMessage, getCause()); + Logger.error(InstallDataEditor.TAG, getMessage()); + Logger.internal(InstallDataEditor.TAG, internalErrorMessage, getCause()); } } // endregion - // region Debug - - public static void printDebugInfo() { - submitOnApplyQueue( - 0, - () -> { - final Context context = RuntimeManagerProvider.get().getContext(); - if (context != null) { - SQLUserDatasourceProvider.get(context).printDebugDump(); - } else { - Logger.error( - BatchUserDataEditor.TAG, - "Error while printing User Data Debug information: Batch must be started." - ); - } - } - ); - } - - // endregion - // region Opt Out public static void wipeData(Context context) { @@ -654,11 +665,10 @@ public static void wipeData(Context context) { ); } - public static void userOptedIn(Context context) { + public static void userOptedIn() { if (applyQueue.isShutdown()) { applyQueue = makeApplyQueue(); } } // endregion - } diff --git a/Sources/sdk/src/main/java/com/batch/android/post/LocalCampaignsJITPostDataProvider.java b/Sources/sdk/src/main/java/com/batch/android/post/LocalCampaignsJITPostDataProvider.java index 13522f6..9c727ef 100644 --- a/Sources/sdk/src/main/java/com/batch/android/post/LocalCampaignsJITPostDataProvider.java +++ b/Sources/sdk/src/main/java/com/batch/android/post/LocalCampaignsJITPostDataProvider.java @@ -80,7 +80,7 @@ byte[] pack() throws IOException { // Adding attributes final SQLUserDatasource datasource = SQLUserDatasourceProvider.get(context); - Map attributes = UserAttribute.getServerMapRepresentation(datasource.getAttributes()); + Map attributes = UserAttribute.getServerMapRepresentation(datasource.getAttributes(), true); postData.put(IDS_KEY, ids); postData.put(CAMPAIGNS_KEY, campaignIds); diff --git a/Sources/sdk/src/main/java/com/batch/android/profile/ProfileDataHelper.java b/Sources/sdk/src/main/java/com/batch/android/profile/ProfileDataHelper.java new file mode 100644 index 0000000..2389ebf --- /dev/null +++ b/Sources/sdk/src/main/java/com/batch/android/profile/ProfileDataHelper.java @@ -0,0 +1,212 @@ +package com.batch.android.profile; + +import android.text.TextUtils; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.batch.android.core.Logger; +import java.net.URI; +import java.util.List; +import java.util.Locale; +import java.util.regex.Pattern; + +public class ProfileDataHelper { + + /** + * The custom user identifier max length authorized + */ + private static final int CUSTOM_USER_ID_MAX_LENGTH = 1024; + + /** + * The email max length authorized + */ + private static final int EMAIL_MAX_LENGTH = 256; + + /** + * Valid email pattern + */ + private static final Pattern EMAIL_KEY_PATTERN = Pattern.compile("^[^@\\r\\n\\t]+@[A-z0-9\\-\\.]+\\.[A-z0-9]+$"); + + /** + * Attribute key pattern + */ + public static final Pattern ATTR_KEY_PATTERN = Pattern.compile("^[a-zA-Z0-9_]{1,30}$"); + + /** + * The string attribute and tag values max length authorized + */ + public static final int ATTR_STRING_MAX_LENGTH = 64; + + /** + * Max size of an array of string + */ + private static final int ATTR_STRING_ARRAY_MAX_SIZE = 25; + /** + * The URL attribute max length authorized + */ + public static final int ATTR_URL_MAX_LENGTH = 2048; + + /** + * Whether the identifier is NOT a valid custom user identifier + * + * @param identifier The custom user identifier. + * Null is considered as a valid value since it can be sent to delete + * @return True if NOT valid, false otherwise + */ + public static boolean isNotValidCustomUserID(@Nullable String identifier) { + return identifier != null && identifier.trim().length() > CUSTOM_USER_ID_MAX_LENGTH; + } + + /** + * Whether given email is valid + * + * @param email the profile's email + * @return true if valid, false otherwise + */ + public static boolean isNotValidEmail(String email) { + return email != null && (!EMAIL_KEY_PATTERN.matcher(email).matches() || email.length() > EMAIL_MAX_LENGTH); + } + + /** + * Whether the given language is NOT valid. + * + * @param language the profile's language (null value allowed) + * @return true if NOT valid, false otherwise + */ + public static boolean isNotValidLanguage(@Nullable String language) { + return language != null && language.trim().length() < 2; + } + + /** + * Whether the given region is NOT valid. + * + * @param region the profile's language (null value allowed) + * @return true if NOT valid, false otherwise + */ + public static boolean isNotValidRegion(@Nullable String region) { + return region != null && region.trim().length() < 2; + } + + /** + * Whether the given string attribute is NOT valid. + * + * @param value The value to check + * @return true if NOT valid, false otherwise + */ + public static boolean isNotValidStringValue(@Nullable String value) { + return value == null || value.length() > ATTR_STRING_MAX_LENGTH; + } + + /** + * Whether the given URI attribute is too long.. + * + * @param value The value to check + * @return true if too long, false otherwise + */ + public static boolean isURITooLong(@Nullable URI value) { + return value == null || value.toString().length() > ATTR_URL_MAX_LENGTH; + } + + /** + * Whether the given URI attribute is NOT valid. + * + * @param value The value to check + * @return true if NOT valid, false otherwise + */ + public static boolean isNotValidURIValue(@Nullable URI value) { + return value == null || value.getScheme() == null || value.getAuthority() == null; + } + + /** + * Whether the given List of string attribute is NOT valid. + * + * @param values The value to check + * @return true if NOT valid, false otherwise + */ + public static boolean isNotValidStringArray(@NonNull List values) { + if (values.size() > ATTR_STRING_ARRAY_MAX_SIZE) { + return true; + } + for (String value : values) { + if (value.trim().isEmpty() || value.length() > ATTR_STRING_MAX_LENGTH) { + return true; + } + } + return false; + } + + /** + * Ensure the key has the right format and return it lowercase + * + * @param key The attribute's key + * @return The key in lowercase + * @throws AttributeValidationException Validation exception + */ + public static String normalizeAttributeKey(final String key) throws AttributeValidationException { + if (TextUtils.isEmpty(key) || !ATTR_KEY_PATTERN.matcher(key).matches()) { + throw new AttributeValidationException(AttributeValidationException.Type.INVALID_KEY); + } + return key.toLowerCase(Locale.US); + } + + /** + * Ensure tag value has the right format and return it in lowercase (install mode only) + * @param value The tag + * @return The tag in lowercase + * @throws AttributeValidationException Validation exception + */ + public static String normalizeTagValue(final String value) throws AttributeValidationException { + if (TextUtils.isEmpty(value) || value.length() > ProfileDataHelper.ATTR_STRING_MAX_LENGTH) { + throw new AttributeValidationException(AttributeValidationException.Type.INVALID_STRING_ITEM); + } + return value.toLowerCase(Locale.US); + } + + /** + * Assert an attribute value is not null + * + * @param value the value to check + * @throws AttributeValidationException Exception thrown when value is null + */ + public static void assertNotNull(final Object value) throws AttributeValidationException { + if (value == null) { + throw new AttributeValidationException(AttributeValidationException.Type.NULL_VALUE); + } + } + + /** + * Exception thrown when an attribute validation has failed + */ + public static final class AttributeValidationException extends Exception { + + public enum Type { + INVALID_KEY, + INVALID_STRING_ITEM, + NULL_VALUE, + } + + private final Type errorType; + + public AttributeValidationException(Type errorType) { + this.errorType = errorType; + } + + public void printErrorMessage(String tag, String key) { + switch (this.errorType) { + case NULL_VALUE: + Logger.error( + tag, + "setAttribute cannot be used with a null value. Ignoring attribute '" + key + "'" + ); + break; + case INVALID_KEY: + Logger.error( + tag, + "Invalid key. Please make sure that the key is made of letters, underscores and numbers only (a-zA-Z0-9_). It also can't be longer than 30 characters. Ignoring attribute '" + + key + + "'." + ); + break; + } + } + } +} diff --git a/Sources/sdk/src/main/java/com/batch/android/profile/ProfileDataSerializer.java b/Sources/sdk/src/main/java/com/batch/android/profile/ProfileDataSerializer.java new file mode 100644 index 0000000..c55e263 --- /dev/null +++ b/Sources/sdk/src/main/java/com/batch/android/profile/ProfileDataSerializer.java @@ -0,0 +1,101 @@ +package com.batch.android.profile; + +import androidx.annotation.NonNull; +import com.batch.android.json.JSONArray; +import com.batch.android.json.JSONException; +import com.batch.android.json.JSONObject; +import com.batch.android.user.UserAttribute; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +public class ProfileDataSerializer { + + private static final String EMAIL_KEY = "email"; + private static final String EMAIL_MARKETING = "email_marketing"; + private static final String LANGUAGE_KEY = "language"; + private static final String REGION_KEY = "region"; + private static final String CUSTOM_ATTRIBUTES_KEY = "custom_attributes"; + + /** + * Serialize a ProfileDataModel object. + * + * @param profileUpdateOperation The object to serialize + * @return The serialized json object + * @throws JSONException A potential parsing exception + */ + @NonNull + public static JSONObject serialize(@NonNull ProfileUpdateOperation profileUpdateOperation) throws JSONException { + JSONObject serializedProfile = new JSONObject(); + + ProfileDeletableAttribute email = profileUpdateOperation.getEmail(); + if (email != null) { + serializedProfile.put(EMAIL_KEY, email.getSerializedValue()); + } + + ProfileDeletableAttribute language = profileUpdateOperation.getLanguage(); + if (language != null) { + serializedProfile.put(LANGUAGE_KEY, language.getSerializedValue()); + } + + ProfileDeletableAttribute region = profileUpdateOperation.getRegion(); + if (region != null) { + serializedProfile.put(REGION_KEY, region.getSerializedValue()); + } + + if (profileUpdateOperation.getEmailMarketing() != null) { + serializedProfile.put(EMAIL_MARKETING, profileUpdateOperation.getEmailMarketing().name().toLowerCase()); + } + + Map customAttributes = profileUpdateOperation.getCustomAttributes(); + if (!customAttributes.isEmpty()) { + JSONObject serializedCustomAttributes = new JSONObject(); + Map serverAttributesRepresentation = UserAttribute.getServerMapRepresentation( + customAttributes, + false + ); + for (Map.Entry attribute : serverAttributesRepresentation.entrySet()) { + if (attribute.getValue() instanceof List) { + JSONArray jsonList = new JSONArray((Collection) attribute.getValue()); + serializedCustomAttributes.put(attribute.getKey(), jsonList); + } else if (attribute.getValue() instanceof ProfilePartialUpdateAttribute) { + serializedCustomAttributes.put( + attribute.getKey(), + ProfileDataSerializer.serializePartialUpdateAttribute( + (ProfilePartialUpdateAttribute) attribute.getValue() + ) + ); + } else { + serializedCustomAttributes.put( + attribute.getKey(), + attribute.getValue() == null ? JSONObject.NULL : attribute.getValue() + ); + } + } + serializedProfile.put(CUSTOM_ATTRIBUTES_KEY, serializedCustomAttributes); + } + return serializedProfile; + } + + /** + * Serialize a ProfilePartialUpdateAttribute + * + * @param attribute The object to serialize + * @return The serialized json object + * @throws JSONException A potential parsing exception + */ + @NonNull + public static JSONObject serializePartialUpdateAttribute(@NonNull ProfilePartialUpdateAttribute attribute) + throws JSONException { + JSONObject json = new JSONObject(); + List added = attribute.getAdded(); + List removed = attribute.getRemoved(); + if (added != null && !added.isEmpty()) { + json.put("$add", new JSONArray(attribute.getAdded())); + } + if (removed != null && !removed.isEmpty()) { + json.put("$remove", new JSONArray(attribute.getRemoved())); + } + return json; + } +} diff --git a/Sources/sdk/src/main/java/com/batch/android/profile/ProfileDeletableAttribute.java b/Sources/sdk/src/main/java/com/batch/android/profile/ProfileDeletableAttribute.java new file mode 100644 index 0000000..d427244 --- /dev/null +++ b/Sources/sdk/src/main/java/com/batch/android/profile/ProfileDeletableAttribute.java @@ -0,0 +1,53 @@ +package com.batch.android.profile; + +import androidx.annotation.Nullable; +import com.batch.android.json.JSONObject; + +/** + * A simple class that wrap a String to handle usage of null to delete a value + * since java doesn't have undefined equivalent. + */ +public class ProfileDeletableAttribute { + + /** + * The string value + */ + @Nullable + private final String value; + + /** + * If we should explicitly set null in json to delete the attribute + */ + private final boolean shouldDelete; + + /** + * Constructor + * @param value The string value. If null enforce the delete of the attribute on server-side + */ + public ProfileDeletableAttribute(@Nullable String value) { + this.value = value; + shouldDelete = this.value == null; + } + + /** + * Get the string value + * @return the string value. Can be null. + */ + @Nullable + public String getValue() { + return value; + } + + /** + * Get a serialized json object of this class. + * @return A serialized json object of this class. + */ + @Nullable + public Object getSerializedValue() { + if (value == null && shouldDelete) { + return JSONObject.NULL; + } else { + return value; + } + } +} diff --git a/Sources/sdk/src/main/java/com/batch/android/profile/ProfilePartialUpdateAttribute.java b/Sources/sdk/src/main/java/com/batch/android/profile/ProfilePartialUpdateAttribute.java new file mode 100644 index 0000000..9ad22e5 --- /dev/null +++ b/Sources/sdk/src/main/java/com/batch/android/profile/ProfilePartialUpdateAttribute.java @@ -0,0 +1,54 @@ +package com.batch.android.profile; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; + +public class ProfilePartialUpdateAttribute { + + @Nullable + private List added; + + @Nullable + private List removed; + + public ProfilePartialUpdateAttribute(@Nullable List add) { + this.added = add; + } + + public ProfilePartialUpdateAttribute(@Nullable List add, @Nullable List remove) { + this.added = add; + this.removed = remove; + } + + @Nullable + public List getAdded() { + return added; + } + + @Nullable + public List getRemoved() { + return removed; + } + + public void putInAdded(List elements) { + if (this.added == null) { + this.added = new ArrayList<>(); + } + this.added.addAll(elements); + } + + public void putInRemoved(List elements) { + if (this.removed == null) { + this.removed = new ArrayList<>(); + } + this.removed.addAll(elements); + } + + @NonNull + @Override + public String toString() { + return "ProfilePartialUpdateAttribute{" + "added=" + added + ", removed=" + removed + '}'; + } +} diff --git a/Sources/sdk/src/main/java/com/batch/android/profile/ProfileUpdateOperation.java b/Sources/sdk/src/main/java/com/batch/android/profile/ProfileUpdateOperation.java new file mode 100644 index 0000000..0b0111b --- /dev/null +++ b/Sources/sdk/src/main/java/com/batch/android/profile/ProfileUpdateOperation.java @@ -0,0 +1,217 @@ +package com.batch.android.profile; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.batch.android.BatchEmailSubscriptionState; +import com.batch.android.user.AttributeType; +import com.batch.android.user.UserAttribute; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Internal SDK representation of an Omnichannel Batch Profile + */ +public class ProfileUpdateOperation { + + /** + * Profile related email + */ + @Nullable + private ProfileDeletableAttribute email; + + /** + * Profile related email marketing subscription state + */ + @Nullable + private BatchEmailSubscriptionState emailMarketing; + + /** + * Profile related language + */ + @Nullable + private ProfileDeletableAttribute language; + + /** + * Profile related region + */ + @Nullable + private ProfileDeletableAttribute region; + + /** + * Profile related custom attributes + */ + @NonNull + private final Map customAttributes = new HashMap<>(); + + /** + * Get the email address + * @return The email address + */ + @Nullable + public ProfileDeletableAttribute getEmail() { + return email; + } + + /** + * Set an email address + * @param email The email address + */ + public void setEmail(@Nullable String email) { + this.email = new ProfileDeletableAttribute(email); + } + + /** + * Get the email marketing subscription state + * @return The email marketing subscription state + */ + @Nullable + public BatchEmailSubscriptionState getEmailMarketing() { + return emailMarketing; + } + + /** + * Set an email marketing subscription state + * @param emailMarketing The email marketing subscription state + */ + public void setEmailMarketing(@NonNull BatchEmailSubscriptionState emailMarketing) { + this.emailMarketing = emailMarketing; + } + + /** + * Get the profile language + * @return The profile language + */ + @Nullable + public ProfileDeletableAttribute getLanguage() { + return language; + } + + /** + * Set a profile language + * @param language The profile language + */ + public void setLanguage(@Nullable String language) { + this.language = new ProfileDeletableAttribute(language); + } + + /** + * Get the profile region + * @return The profile region + */ + @Nullable + public ProfileDeletableAttribute getRegion() { + return region; + } + + /** + * Set a profile region + * @param region The profile region + */ + public void setRegion(@Nullable String region) { + this.region = new ProfileDeletableAttribute(region); + } + + /** + * Get the profile custom attributes + * @return The profile custom attributes + */ + @NonNull + public Map getCustomAttributes() { + return customAttributes; + } + + /** + * Add a custom attributes + * @param key The key of the custom attribute + * @param attribute The custom attribute + */ + public void addAttribute(@NonNull String key, @NonNull UserAttribute attribute) { + this.customAttributes.put(key, attribute); + } + + /** + * Add a list of value to an array attribute (existing or not) + * @param key The key of the array attributes + * @param values Values to add + */ + public void addToList(@NonNull String key, @NonNull List values) { + UserAttribute targetAttribute = this.customAttributes.get(key); + + // Case: Array attribute already exist and is a List (meaning setAttribute(string, list) + // has already been called on this key + if (targetAttribute != null && targetAttribute.value instanceof List) { + ArrayList targetList = (ArrayList) targetAttribute.value; + targetList.addAll(values); + } + // Case: Array attribute already exist and is a Partial Update object ($add/$remove) + // (meaning addToArray(string, array) has already been called on this key + else if (targetAttribute != null && targetAttribute.value instanceof ProfilePartialUpdateAttribute) { + ProfilePartialUpdateAttribute targetPartialUpdate = (ProfilePartialUpdateAttribute) targetAttribute.value; + targetPartialUpdate.putInAdded(values); + } + // Case: Array attribute already exist and is null (meaning removeAttribute(string, list) + // has already been called on this key) + else if (targetAttribute != null && targetAttribute.value == null) { + this.customAttributes.put(key, new UserAttribute(values, AttributeType.STRING_ARRAY)); + } + // Case: Array attribute doesn't exist + // (meaning, this key has never been used on this editor instance) + else { + UserAttribute newAttribute = new UserAttribute( + new ProfilePartialUpdateAttribute(values), + AttributeType.STRING_ARRAY + ); + this.customAttributes.put(key, newAttribute); + } + } + + /** + * Remove a profile custom attribute + * @param key The key of custom attribute to remove + */ + public void removeAttribute(String key) { + this.customAttributes.put(key, new UserAttribute(null, AttributeType.DELETED)); + } + + /** + * Remove a list of value from an array attribute + * @param key The key of the array attributes + * @param values Values to remove + */ + public void removeFromList(@NonNull String key, @NonNull List values) { + UserAttribute targetAttribute = this.customAttributes.get(key); + + // Case: Array attribute already exist and is a List (meaning setAttribute(string, list) + // has already been called on this key + if (targetAttribute != null && targetAttribute.value instanceof List) { + ArrayList targetList = (ArrayList) targetAttribute.value; + ArrayList value = (ArrayList) values; + targetList.removeAll(value); + if (targetList.isEmpty()) { + this.customAttributes.remove(key); + } + } + // Case: Array attribute already exist and is a Partial Update object ($add/$remove) + // (meaning addTo/removeFromArray(string, array) has already been called on this key + else if (targetAttribute != null && targetAttribute.value instanceof ProfilePartialUpdateAttribute) { + ProfilePartialUpdateAttribute targetPartialUpdate = (ProfilePartialUpdateAttribute) targetAttribute.value; + targetPartialUpdate.putInRemoved(values); + } + // Case: Array attribute already exist and is null (meaning removeAttribute(string, list) + // has already been called on this key) + else if (targetAttribute != null && targetAttribute.value == null) { + // No need to do something here + } + // Case: Array attribute doesn't exist + // (meaning, this key has never been used on this editor instance) + else { + UserAttribute newAttribute = new UserAttribute( + new ProfilePartialUpdateAttribute(null, values), + AttributeType.STRING_ARRAY + ); + this.customAttributes.put(key, newAttribute); + } + } +} diff --git a/Sources/sdk/src/main/java/com/batch/android/push/FCMAbstractRegistrationProvider.java b/Sources/sdk/src/main/java/com/batch/android/push/FCMAbstractRegistrationProvider.java index 779029e..a49a8d5 100644 --- a/Sources/sdk/src/main/java/com/batch/android/push/FCMAbstractRegistrationProvider.java +++ b/Sources/sdk/src/main/java/com/batch/android/push/FCMAbstractRegistrationProvider.java @@ -1,6 +1,5 @@ package com.batch.android.push; -import android.content.Context; import android.text.TextUtils; import androidx.annotation.Nullable; import com.batch.android.PushRegistrationProvider; @@ -14,21 +13,13 @@ public abstract class FCMAbstractRegistrationProvider implements PushRegistratio protected String senderID = null; protected String fcmProjectID = null; - FCMAbstractRegistrationProvider(Context context) { - loadProjectInformation(context); + FCMAbstractRegistrationProvider() { + loadProjectInformation(); } - public void loadProjectInformation(Context context) { + public void loadProjectInformation() { try { FirebaseApp fbApp = FirebaseApp.getInstance(); - if (fbApp == null) { - Logger.error( - PushModule.TAG, - "Could not register for FCM Push: Could not get a Firebase instance. Is your Firebase project configured?" - ); - return; - } - String senderID = fbApp.getOptions().getGcmSenderId(); if (TextUtils.isEmpty(senderID)) { Logger.error( @@ -37,7 +28,6 @@ public void loadProjectInformation(Context context) { ); return; } - this.senderID = senderID; this.fcmProjectID = fbApp.getOptions().getProjectId(); @@ -62,13 +52,13 @@ public String getGCPProjectID() { } @Override - public void checkServiceAvailability() throws PushRegistrationProviderAvailabilityException { + public void checkServiceAvailability() { // We do nothing here because FCM is checked in the factory } @Override public void checkLibraryAvailability() throws PushRegistrationProviderAvailabilityException { - Logger.internal(PushModule.TAG, "Checking FCM librairies availability"); + Logger.internal(PushModule.TAG, "Checking FCM libraries availability"); if (!isFirebaseCorePresent()) { throw new PushRegistrationProviderAvailabilityException( @@ -98,6 +88,7 @@ private boolean isFirebaseCorePresent() { } } + @SuppressWarnings("BooleanMethodIsAlwaysInverted") public static boolean isFirebaseMessagingPresent() { try { Class.forName("com.google.firebase.messaging.FirebaseMessaging"); diff --git a/Sources/sdk/src/main/java/com/batch/android/push/FCMInstanceIdRegistrationProvider.java b/Sources/sdk/src/main/java/com/batch/android/push/FCMInstanceIdRegistrationProvider.java deleted file mode 100644 index 57ab531..0000000 --- a/Sources/sdk/src/main/java/com/batch/android/push/FCMInstanceIdRegistrationProvider.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.batch.android.push; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.text.TextUtils; -import androidx.annotation.Nullable; -import com.batch.android.core.Logger; -import com.batch.android.module.PushModule; -import com.batch.android.util.MetaDataUtils; -import com.google.firebase.iid.FirebaseInstanceId; -import com.google.firebase.messaging.FirebaseMessaging; - -public class FCMInstanceIdRegistrationProvider extends FCMAbstractRegistrationProvider { - - FCMInstanceIdRegistrationProvider(Context context) { - super(context); - } - - @Override - public String getShortname() { - return "FCM"; - } - - @Override - public void loadProjectInformation(Context context) { - super.loadProjectInformation(context); - // No FCM Project ID on legacy FCM Instance ID - this.fcmProjectID = null; - - int valueResource = MetaDataUtils.getIntMetaData(context, MetaDataUtils.MANIFEST_SENDER_ID_KEY); - if (valueResource != -1) { - String manifestSenderID = context.getString(valueResource); - if (!TextUtils.isEmpty(manifestSenderID)) { - Logger.info(PushModule.TAG, "Using FCM Sender ID from manifest"); - Logger.internal(PushModule.TAG, "Using FCM Sender ID from manifest: " + manifestSenderID); - this.senderID = manifestSenderID; - } - } - } - - @Nullable - @Override - @SuppressLint("MissingFirebaseInstanceTokenRefresh") - public String getRegistration() { - try { - if (senderID == null) { - return null; - } - FirebaseInstanceId fbIID = FirebaseInstanceId.getInstance(); - if (fbIID == null) { - Logger.error( - PushModule.TAG, - "Could not register for FCM Push: Could not get the FirebaseInstanceId." + - " Is your Firebase project configured and initialized?" - ); - return null; - } - return fbIID.getToken(senderID, FirebaseMessaging.INSTANCE_ID_SCOPE); - } catch (Exception e) { - Logger.error(PushModule.TAG, "Could not register for FCM Push.", e); - } - return null; - } -} diff --git a/Sources/sdk/src/main/java/com/batch/android/push/FCMTokenRegistrationProvider.java b/Sources/sdk/src/main/java/com/batch/android/push/FCMTokenRegistrationProvider.java index ef3ceff..585c7fd 100644 --- a/Sources/sdk/src/main/java/com/batch/android/push/FCMTokenRegistrationProvider.java +++ b/Sources/sdk/src/main/java/com/batch/android/push/FCMTokenRegistrationProvider.java @@ -1,7 +1,5 @@ package com.batch.android.push; -import android.annotation.SuppressLint; -import android.content.Context; import androidx.annotation.Nullable; import com.batch.android.core.Logger; import com.batch.android.module.PushModule; @@ -12,8 +10,8 @@ public class FCMTokenRegistrationProvider extends FCMAbstractRegistrationProvider { - FCMTokenRegistrationProvider(Context context) { - super(context); + FCMTokenRegistrationProvider() { + super(); } @Override @@ -23,22 +21,12 @@ public String getShortname() { @Nullable @Override - @SuppressLint("MissingFirebaseInstanceTokenRefresh") public String getRegistration() { try { if (senderID == null) { return null; } FirebaseMessaging firebaseMessaging = FirebaseMessaging.getInstance(); - if (firebaseMessaging == null) { - Logger.error( - PushModule.TAG, - "Could not register for FCM Push using FCM's Token APIs:" + - " Could not get the FirebaseMessaging instance." + - " Is your Firebase project configured and initialized?" - ); - return null; - } Task getTokenTask = firebaseMessaging.getToken(); Tasks.await(getTokenTask, 30000L, TimeUnit.MILLISECONDS); if (!getTokenTask.isSuccessful()) { diff --git a/Sources/sdk/src/main/java/com/batch/android/push/GCMAbstractRegistrationProvider.java b/Sources/sdk/src/main/java/com/batch/android/push/GCMAbstractRegistrationProvider.java deleted file mode 100644 index d0ffc77..0000000 --- a/Sources/sdk/src/main/java/com/batch/android/push/GCMAbstractRegistrationProvider.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.batch.android.push; - -import android.content.Context; -import com.batch.android.PushRegistrationProvider; -import com.batch.android.PushRegistrationProviderAvailabilityException; -import com.batch.android.core.GenericHelper; -import com.batch.android.core.GooglePlayServicesHelper; -import com.batch.android.core.Logger; -import com.batch.android.core.Parameters; -import com.batch.android.module.PushModule; - -public abstract class GCMAbstractRegistrationProvider implements PushRegistrationProvider { - - private static final String TAG = "GCMAbstractRegistrationProvider"; - - protected Context context; - protected String senderID; - - GCMAbstractRegistrationProvider(Context c, String senderID) { - this.context = c.getApplicationContext(); - this.senderID = senderID; - } - - @Override - public String getSenderID() { - return senderID; - } - - @Override - public void checkServiceAvailability() throws PushRegistrationProviderAvailabilityException { - // We do nothing here because GCM is checked in the factory - } - - @Override - public void checkLibraryAvailability() throws PushRegistrationProviderAvailabilityException { - if (!PushModule.isBatchPushServiceAvailable()) { - throw new PushRegistrationProviderAvailabilityException( - "Unable to use GCM: BatchPushService is not declared in Manifest. Subclasses of it will not be taken into consideration: please add Batch's BatchPushService." - ); - } - - Integer pushAvailability = getGMSAvailability(); - - if (pushAvailability == null) { - throw new PushRegistrationProviderAvailabilityException( - "Unable to use GCM because the Google Play Services library is not integrated correctly or not up-to-date. Please include GooglePlayServices into your app (at least -base and -gcm modules)." - ); - } - - if (pushAvailability != 0) { - throw new PushRegistrationProviderAvailabilityException( - "Unable to use GCM because the Google Play Services are not available or not up-to-date on this device. (" + - GooglePlayServicesHelper.getGooglePlayServicesAvailabilityString(pushAvailability) + - ") Please update your Google Play Services, more info: " + - Parameters.DOMAIN_URL - ); - } - - if (!isReceivePermissionAvailable()) { - throw new PushRegistrationProviderAvailabilityException( - "Permission com.google.android.c2dm.permission.RECEIVE is missing." - ); - } - - if (!isC2DMessagePermissionAvailable()) { - throw new PushRegistrationProviderAvailabilityException("Batch.Push : Permission C2D_MESSAGE is missing."); - } - - if (!GenericHelper.isWakeLockPermissionAvailable(context)) { - throw new PushRegistrationProviderAvailabilityException("Batch.Push : Permission WAKE_LOCK is missing."); - } - } - - protected abstract Integer getGMSAvailability(); - - private boolean isReceivePermissionAvailable() { - try { - return GenericHelper.checkPermission("com.google.android.c2dm.permission.RECEIVE", context); - } catch (Exception e) { - Logger.error(TAG, "Error while checking com.google.android.c2dm.permission.RECEIVE permission", e); - return false; - } - } - - private boolean isC2DMessagePermissionAvailable() { - try { - return GenericHelper.checkPermission(context.getPackageName() + ".permission.C2D_MESSAGE", context); - } catch (Exception e) { - Logger.error(TAG, "Error while checking C2D_MESSAGE permission", e); - return false; - } - } -} diff --git a/Sources/sdk/src/main/java/com/batch/android/push/GCMIidRegistrationProvider.java b/Sources/sdk/src/main/java/com/batch/android/push/GCMIidRegistrationProvider.java deleted file mode 100644 index 9c01611..0000000 --- a/Sources/sdk/src/main/java/com/batch/android/push/GCMIidRegistrationProvider.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.batch.android.push; - -import android.content.Context; -import androidx.annotation.Nullable; -import com.batch.android.BatchPushInstanceIDService; -import com.batch.android.PushRegistrationProviderAvailabilityException; -import com.batch.android.core.GooglePlayServicesHelper; -import com.batch.android.core.Logger; -import com.batch.android.core.Parameters; -import com.batch.android.module.PushModule; - -public class GCMIidRegistrationProvider extends GCMAbstractRegistrationProvider { - - GCMIidRegistrationProvider(Context c, String senderID) { - super(c, senderID); - } - - @Override - public String getShortname() { - return "GCM"; - } - - @Override - protected Integer getGMSAvailability() { - return GooglePlayServicesHelper.isInstanceIdPushAvailable(context); - } - - @Override - public void checkLibraryAvailability() throws PushRegistrationProviderAvailabilityException { - try { - @SuppressWarnings("unused") - BatchPushInstanceIDService ignored = new BatchPushInstanceIDService(); - // The service is registered, the superclass is here, enable the use of the instance ID if the dev wants it - } catch (Exception | NoClassDefFoundError e) { - Logger.internal(PushModule.TAG, "Error while instantiating BatchPushInstanceIDService", e); - throw new PushRegistrationProviderAvailabilityException( - "BatchPushInstanceIDService is declared in the Manifest, but the Play Services appear to be too old! This can cause CRASHES in your app: remove it or update your Play Services to version 10.2.9 or higher. This error can also be caused by an incorrect proguard configuration. Falling back on classic GCM, please read the documentation for more info: " + - Parameters.DOMAIN_URL - ); - } - - super.checkLibraryAvailability(); - } - - @Nullable - @Override - public String getRegistration() { - return GooglePlayServicesHelper.getInstancePushToken(context, senderID); - } -} diff --git a/Sources/sdk/src/main/java/com/batch/android/push/GCMLegacyRegistrationProvider.java b/Sources/sdk/src/main/java/com/batch/android/push/GCMLegacyRegistrationProvider.java deleted file mode 100644 index 9998a1a..0000000 --- a/Sources/sdk/src/main/java/com/batch/android/push/GCMLegacyRegistrationProvider.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.batch.android.push; - -import android.content.Context; -import androidx.annotation.Nullable; -import com.batch.android.PushRegistrationProvider; -import com.batch.android.core.GooglePlayServicesHelper; -import com.batch.android.core.Logger; -import com.batch.android.di.providers.RuntimeManagerProvider; -import com.batch.android.module.PushModule; - -public class GCMLegacyRegistrationProvider extends GCMAbstractRegistrationProvider implements PushRegistrationProvider { - - GCMLegacyRegistrationProvider(Context c, String senderID) { - super(c, senderID); - } - - @Override - public String getShortname() { - return "GCM-Legacy"; - } - - protected Integer getGMSAvailability() { - return GooglePlayServicesHelper.isPushAvailable(context); - } - - @Nullable - @Override - public String getRegistration() { - Logger.error( - PushModule.TAG, - "Using Legacy GCM (pre-Instance ID) registration. This compatibility behaviour is deprecated and will be removed in a future release: Please update to a newer provider, such as FCM." - ); - - return GooglePlayServicesHelper.getPushToken(RuntimeManagerProvider.get().getContext(), senderID); - } -} diff --git a/Sources/sdk/src/main/java/com/batch/android/push/PushRegistrationProviderFactory.java b/Sources/sdk/src/main/java/com/batch/android/push/PushRegistrationProviderFactory.java index d8cf11d..f7dd96a 100644 --- a/Sources/sdk/src/main/java/com/batch/android/push/PushRegistrationProviderFactory.java +++ b/Sources/sdk/src/main/java/com/batch/android/push/PushRegistrationProviderFactory.java @@ -1,23 +1,14 @@ package com.batch.android.push; -import android.annotation.SuppressLint; import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.os.Build; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.batch.android.BatchPushInstanceIDService; -import com.batch.android.BatchPushReceiver; import com.batch.android.PushRegistrationProvider; import com.batch.android.PushRegistrationProviderAvailabilityException; import com.batch.android.core.DiscoveryServiceHelper; import com.batch.android.core.GooglePlayServicesHelper; import com.batch.android.core.Logger; -import com.batch.android.di.providers.RuntimeManagerProvider; import com.batch.android.module.PushModule; -import com.batch.android.util.MetaDataUtils; import com.google.firebase.messaging.FirebaseMessaging; import java.util.List; @@ -31,189 +22,46 @@ public class PushRegistrationProviderFactory { private static final String TAG = "PushRegistrationProviderFactory"; private static final String COMPONENT_SENTINEL_VALUE = "com.batch.android.push.PushRegistrationRegistrar"; private static final String COMPONENT_KEY_PREFIX = "com.batch.android.push:"; + private final Context context; - private Context context; - private boolean shouldUseGoogleInstanceID; - private String gcmSenderID; - - public PushRegistrationProviderFactory( - @NonNull Context context, - boolean shouldUseGoogleInstanceID, - @Nullable String gcmSenderID - ) { + public PushRegistrationProviderFactory(@NonNull Context context) { this.context = context.getApplicationContext(); - this.shouldUseGoogleInstanceID = shouldUseGoogleInstanceID; - this.gcmSenderID = gcmSenderID; } + /** + * Get the registration provider. + *

+ * This method only support FCM Token provider or external push provider (like our hms plugin). + *

+ * A provider's decision is final. If it then fails its availability check, another provider will NOT be picked. + * Thus, looking at the manifest to take this decision isn't the Provider's responsibility, but this Factory's. + * To avoid unnecessary work, providers assume that they have been instantiated through this factory, + * and will not check the manifest for their receiver. + * @return The registration provider. + */ @Nullable public PushRegistrationProvider getRegistrationProvider() { - /* - * Due to legacy SDK implementations (all the way back to 1.3), we have to maintain a very - * specific strategy to figure out what provider we pick. - * Here is how it is decided: (User = The app developer using Batch SDK) - * - Look if BatchPushReceiver is in the manifest, meaning that Batch has previously been implemented in this app - * - Yes: Check if Batch.Push.setGCMSenderId has been called (gcmSenderID != null in this method) - * - Yes: Check if BatchPushInstanceIDService is in the manifest, is instanciable, InstanceID allowed in the configuration and runtime libs are here - * - Yes: Use GCM Instance ID - * - No: Fallback on Legacy GCM, and warn that this is deprecated - * - No: Fail - * - No: Fail - * - * else - * - Look if Firebase is available at both compile time and runtime. FCMAbstractRegistrationProvider will enforce firebase-core & firebase-messaing's presences itself. - * - Yes: Check if FCM Token is available( firebase-messaging >= 20.3 ): - * - Yes: Check if sender id is overridden or FCM Instance ID is forced from the manifest: - * - Yes: Check if FCM Instance ID is available: - * Yes: Use FCM Instance ID provider - * No: Fail - * - No: Use FCM Token - * - No: Check if FCM Instance ID is available: - * Yes: Use FCM Instance ID provider - * No: Fail - * - No: query for plugins. - * - * A provider's decision is final. If it then fails its availability check, another provider will NOT be picked. - * Thus, looking at the manifest to take this decision isn't the Provider's responsibility, but this Factory's. - * To avoid unnecessary work, providers assume that they have been instantiated through this factory, - * and will not check the manifest for their receiver. - */ - Logger.internal(TAG, "Determining which registration provider to use..."); - if (isLegacyPushReceiverInManifest()) { - // No need to check for BatchPushService, as this will be done by GCMAbstractRegistrationProvider - if (gcmSenderID != null) { - boolean canUseGCMInstanceID = true; - - if (shouldUseGoogleInstanceID) { - if (isGCMInstanceIdAvailable()) { - Logger.internal(TAG, "GCM Instance ID class available"); - if (!isBatchGCMIidServiceAvailable()) { - Logger.internal( - TAG, - "Batch's BatchPushInstanceIdService not registered in manifest, falling back" - ); - canUseGCMInstanceID = false; - } else { - Logger.internal( - TAG, - "Batch's BatchPushInstanceIdService is registered in manifest, using GCM Instance ID" - ); - } - } else { - Logger.internal(TAG, "GCM Instance ID class unavailable, falling back"); - canUseGCMInstanceID = false; - } - } else { - Logger.internal(PushModule.TAG, "GCM Instance ID disabled by configuration"); - canUseGCMInstanceID = false; - } - - if (canUseGCMInstanceID) { - Logger.internal(TAG, "Using GCM Instance ID provider"); - Logger.warning( - PushModule.TAG, - "Registering for push notifications using GCM Instance ID is deprecated: please consider migrating to FCM. More info in our documentation." - ); - return new GCMIidRegistrationProvider(context, gcmSenderID); - } else { - Logger.internal(TAG, "Using GCM legacy provider"); - Logger.warning( - PushModule.TAG, - "Registering for push notifications using GCM's legacy API is deprecated: please migrate to FCM. More info in our documentation." - ); - return new GCMLegacyRegistrationProvider(context, gcmSenderID); - } - } else { - Logger.internal(TAG, "No GCM Sender ID set: Push is disabled"); - Logger.warning( - PushModule.TAG, - "BatchPushReceiver is present in your manifest, but no Sender ID has been set: skipping push registration. Please migrate to FCM to fix this error." - ); - return null; - } - } - - if (gcmSenderID != null) { - Logger.internal( - TAG, - "Manifest doesn't have BatchPushReceiver but Batch.Push.setGCMSenderId has been called. Skipping Firebase." - ); - Logger.error( - PushModule.TAG, - "BatchPushReceiver is not declared in Manifest, but Batch.Push.setGCMSenderId() has been called. Push registration will be disabled. In order to enable the use of FCM, please remove the Batch.Push.setGCMSenderId() call." - ); - return null; - } - Integer playServiceAvailableError = GooglePlayServicesHelper.isFCMAvailable(context); if (playServiceAvailableError == null || playServiceAvailableError != 0) { // Google play services are missing or doesn't support FCM (too old) - + // Checking for an external push provider (eg: hms) PushRegistrationProvider provider = getExternalPushRegistrationProvider(); if (provider != null) { Logger.info(PushModule.TAG, "Registration ID/Push Token: Using " + provider.getClass().getSimpleName()); return provider; } } - - boolean shouldUseFCMInstanceId = false; - - // Case: firebase-messaging >= 20.3 if (isFCMTokenApiAvailable()) { - if (isSenderIdOverridden()) { - Logger.warning( - "Overriding sender id is deprecated with the FCM's Token APIs, please migrate away from it. See our help center for more info." - ); - shouldUseFCMInstanceId = true; - } else if (shouldForceFirebaseIIDProvider()) { - shouldUseFCMInstanceId = true; - Logger.internal(TAG, "FCM InstanceId provider is forced from the manifest."); - } + Logger.internal(TAG, "Using FCM-Token provider"); + return new FCMTokenRegistrationProvider(); } else { - shouldUseFCMInstanceId = true; - } - - if (shouldUseFCMInstanceId) { - if (isFCMFirebaseInstanceIdAvailable()) { - Logger.internal(TAG, "Using FCM InstanceId provider"); - return new FCMInstanceIdRegistrationProvider(context); - } else if (FCMAbstractRegistrationProvider.isFirebaseMessagingPresent()) { - // This log is only if we have a recent FCM (firebase-messaging >= 22) without IID support. - // Do not log anything if we don't have FCM at all, the provider will take care - // of it when attempting to register. - Logger.error( - PushModule.TAG, - "Trying to use FCM InstanceID but it looks like the library is not present. Please migrate to FCM's Token APIs or add the firebase-iid dependency." - ); - return null; - } - } - - Logger.internal(TAG, "Using FCM-Token provider"); - return new FCMTokenRegistrationProvider(context); - } - - private boolean isLegacyPushReceiverInManifest() { - try { - final PackageManager packageManager = context.getPackageManager(); - final Intent intent = new Intent(context, BatchPushReceiver.class); - - int matchFlag = 0; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - matchFlag = PackageManager.MATCH_DISABLED_COMPONENTS; - } else { - matchFlag = PackageManager.GET_DISABLED_COMPONENTS; - } - - @SuppressLint("QueryPermissionsNeeded") - List resolveInfo = packageManager.queryBroadcastReceivers(intent, matchFlag); - - return resolveInfo.size() > 0; - } catch (Exception e) { - Logger.error(PushModule.TAG, "Could not check if legacy push receiver is in the manifest", e); - return false; + Logger.warning( + TAG, + "Could not register for FCM Push: Ensure you are using firebase-messaging 22.0.0 or higher in your gradle dependencies." + ); } + return null; } /** @@ -235,75 +83,9 @@ private boolean isFCMTokenApiAvailable() { } /** - * Verify if FCM Firebase InstanceId is available - * - * @return true if class exist - */ - private boolean isFCMFirebaseInstanceIdAvailable() { - try { - Class.forName("com.google.firebase.iid.FirebaseInstanceId"); - return true; - } catch (Throwable ex) { - return false; - } - } - - /** - * Verify if GCM InstanceId is available - * - * @return true if class exist + * Try to get an external push provider + * @return An external push provider or null otherwise. */ - private boolean isGCMInstanceIdAvailable() { - try { - Class.forName("com.google.android.gms.iid.InstanceID"); - return true; - } catch (Throwable ex) { - return false; - } - } - - private boolean isBatchGCMIidServiceAvailable() { - try { - final PackageManager packageManager = RuntimeManagerProvider.get().getContext().getPackageManager(); - final Intent intent = new Intent( - RuntimeManagerProvider.get().getContext(), - BatchPushInstanceIDService.class - ); - @SuppressLint("QueryPermissionsNeeded") - List resolveInfo = packageManager.queryIntentServices( - intent, - PackageManager.MATCH_DEFAULT_ONLY - ); - - return resolveInfo.size() > 0; - } catch (Exception | NoClassDefFoundError e) { - Logger.error( - PushModule.TAG, - "Could not check if Batch's GCM Instance ID token refresh service is in the manifest", - e - ); - return false; - } - } - - /** - * Check if we should force using the FCM Instance ID provider from the android manifest - * - * @return true if we should force the provider - */ - private boolean shouldForceFirebaseIIDProvider() { - return MetaDataUtils.getBooleanMetaData(context, MetaDataUtils.MANIFEST_FORCE_FCM_IID_KEY); - } - - /** - * Check if the FCM sender identifier is define from the android manifest - * - * @return true if the SenderId is overridden - */ - private boolean isSenderIdOverridden() { - return MetaDataUtils.getIntMetaData(context, MetaDataUtils.MANIFEST_SENDER_ID_KEY) != -1; - } - public PushRegistrationProvider getExternalPushRegistrationProvider() { List registrarNames = DiscoveryServiceHelper.getComponentNames( context, @@ -365,6 +147,12 @@ public PushRegistrationProvider getExternalPushRegistrationProvider() { return null; } + /** + * Check if the given push provider short name is allowed + * + * @param shortname Push provider shortname + * @return Whether the push provider is allowed + */ public boolean isExternalProviderAllowed(@NonNull String shortname) { // For now, we only support "HMS" return "HMS".equals(shortname); diff --git a/Sources/sdk/src/main/java/com/batch/android/push/PushRegistrationRegistrar.java b/Sources/sdk/src/main/java/com/batch/android/push/PushRegistrationRegistrar.java index 5aeeb6d..9a89ec9 100644 --- a/Sources/sdk/src/main/java/com/batch/android/push/PushRegistrationRegistrar.java +++ b/Sources/sdk/src/main/java/com/batch/android/push/PushRegistrationRegistrar.java @@ -12,8 +12,8 @@ public interface PushRegistrationRegistrar { /** * Instantiate the push registration provider * - * @param context - * @return + * @param context Android's context + * @return A push registration provider */ PushRegistrationProvider getPushRegistrationProvider(Context context); } diff --git a/Sources/sdk/src/main/java/com/batch/android/push/Registration.java b/Sources/sdk/src/main/java/com/batch/android/push/Registration.java deleted file mode 100644 index 5fc78dd..0000000 --- a/Sources/sdk/src/main/java/com/batch/android/push/Registration.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.batch.android.push; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -public class Registration { - - @NonNull - public String provider; - - @NonNull - public String registrationID; - - @Nullable - public String senderID; - - @Nullable - public String gcpProjectID; - - public Registration( - @NonNull String provider, - @NonNull String registrationID, - @Nullable String senderID, - @Nullable String gcpProjectID - ) { - this.provider = provider; - this.registrationID = registrationID; - this.senderID = senderID; - this.gcpProjectID = gcpProjectID; - } -} diff --git a/Sources/sdk/src/main/java/com/batch/android/push/formats/APENFormat.java b/Sources/sdk/src/main/java/com/batch/android/push/formats/APENFormat.java index 3be7c48..6290007 100644 --- a/Sources/sdk/src/main/java/com/batch/android/push/formats/APENFormat.java +++ b/Sources/sdk/src/main/java/com/batch/android/push/formats/APENFormat.java @@ -157,11 +157,6 @@ public void applyArguments(@Nullable JSONObject arguments) { public void applyExtraBuilderConfiguration(@NonNull NotificationCompat.Builder builder) {} - @SuppressLint("AnnotateVersionCheck") - public static boolean isSupported() { - return android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP; - } - @VisibleForTesting LayoutType getLayoutType() { return layoutType; diff --git a/Sources/sdk/src/main/java/com/batch/android/query/PushQuery.java b/Sources/sdk/src/main/java/com/batch/android/query/PushQuery.java index fb3ccb2..033fe07 100644 --- a/Sources/sdk/src/main/java/com/batch/android/query/PushQuery.java +++ b/Sources/sdk/src/main/java/com/batch/android/query/PushQuery.java @@ -1,14 +1,14 @@ package com.batch.android.query; import android.content.Context; +import com.batch.android.BatchPushRegistration; import com.batch.android.core.NotificationAuthorizationStatus; import com.batch.android.di.providers.BatchNotificationChannelsManagerProvider; import com.batch.android.json.JSONException; import com.batch.android.json.JSONObject; -import com.batch.android.push.Registration; /** - * Query to send pushtoken to server + * Query to send push token to server * */ public class PushQuery extends Query { @@ -16,11 +16,11 @@ public class PushQuery extends Query { /** * Registration information */ - private Registration registration; + private BatchPushRegistration registration; // --------------------------------------------> - public PushQuery(Context context, Registration registration) { + public PushQuery(Context context, BatchPushRegistration registration) { super(context, QueryType.PUSH); if (registration == null) { throw new NullPointerException("registration==null"); @@ -34,11 +34,13 @@ public PushQuery(Context context, Registration registration) { @Override public JSONObject toJSON() throws JSONException { JSONObject obj = super.toJSON(); - - obj.put("tok", registration.registrationID); - obj.put("provider", registration.provider); - obj.put("senderid", registration.senderID != null ? registration.senderID : JSONObject.NULL); - obj.put("gcpprojectid", registration.gcpProjectID != null ? registration.gcpProjectID : JSONObject.NULL); + obj.put("tok", registration.getToken()); + obj.put("provider", registration.getProvider()); + obj.put("senderid", registration.getSenderID() != null ? registration.getSenderID() : JSONObject.NULL); + obj.put( + "gcpprojectid", + registration.getGcpProjectID() != null ? registration.getGcpProjectID() : JSONObject.NULL + ); obj.put("nty", getNotificationType()); return obj; diff --git a/Sources/sdk/src/main/java/com/batch/android/query/response/AttributesCheckResponse.java b/Sources/sdk/src/main/java/com/batch/android/query/response/AttributesCheckResponse.java index d91a888..b2979d1 100644 --- a/Sources/sdk/src/main/java/com/batch/android/query/response/AttributesCheckResponse.java +++ b/Sources/sdk/src/main/java/com/batch/android/query/response/AttributesCheckResponse.java @@ -1,5 +1,6 @@ package com.batch.android.query.response; +import androidx.annotation.Nullable; import com.batch.android.query.AttributesCheckQuery; import com.batch.android.query.QueryType; @@ -14,6 +15,8 @@ public class AttributesCheckResponse extends Response { public Long time = null; + private String projectKey; + public AttributesCheckResponse(String queryID) { super(QueryType.ATTRIBUTES_CHECK, queryID); } @@ -36,6 +39,11 @@ public Action getAction() { return Action.UNKNOWN; } + @Nullable + public String getProjectKey() { + return projectKey; + } + public enum Action { OK, BUMP, @@ -63,4 +71,8 @@ public Long getTime() { public void setTime(Long time) { this.time = time; } + + public void setProjectKey(String projectKey) { + this.projectKey = projectKey; + } } diff --git a/Sources/sdk/src/main/java/com/batch/android/query/response/AttributesSendResponse.java b/Sources/sdk/src/main/java/com/batch/android/query/response/AttributesSendResponse.java index b5e9f5e..5622025 100644 --- a/Sources/sdk/src/main/java/com/batch/android/query/response/AttributesSendResponse.java +++ b/Sources/sdk/src/main/java/com/batch/android/query/response/AttributesSendResponse.java @@ -8,9 +8,11 @@ */ public class AttributesSendResponse extends Response { - public String transactionID; + private String transactionID; - public long version = -1L; + private long version = -1L; + + private String projectKey; public AttributesSendResponse(String queryID) { super(QueryType.ATTRIBUTES, queryID); @@ -23,4 +25,20 @@ public void setTransactionID(String transactionID) { public void setVersion(long version) { this.version = version; } + + public String getTransactionID() { + return transactionID; + } + + public long getVersion() { + return version; + } + + public String getProjectKey() { + return projectKey; + } + + public void setProjectKey(String projectKey) { + this.projectKey = projectKey; + } } diff --git a/Sources/sdk/src/main/java/com/batch/android/query/serialization/deserializers/AttributesCheckResponseDeserializer.java b/Sources/sdk/src/main/java/com/batch/android/query/serialization/deserializers/AttributesCheckResponseDeserializer.java index 4dec9ad..866b60b 100644 --- a/Sources/sdk/src/main/java/com/batch/android/query/serialization/deserializers/AttributesCheckResponseDeserializer.java +++ b/Sources/sdk/src/main/java/com/batch/android/query/serialization/deserializers/AttributesCheckResponseDeserializer.java @@ -36,6 +36,12 @@ public AttributesCheckResponse deserialize() throws JSONException { if (json.has("t") && !json.isNull("t")) { response.setTime(json.getLong("t")); } + if (json.hasNonNull("project_key")) { + String projectKey = json.getString("project_key"); + if (!projectKey.isEmpty()) { + response.setProjectKey(projectKey); + } + } return response; } } diff --git a/Sources/sdk/src/main/java/com/batch/android/query/serialization/deserializers/AttributesSendResponseDeserializer.java b/Sources/sdk/src/main/java/com/batch/android/query/serialization/deserializers/AttributesSendResponseDeserializer.java index 96163dc..79a1b9f 100644 --- a/Sources/sdk/src/main/java/com/batch/android/query/serialization/deserializers/AttributesSendResponseDeserializer.java +++ b/Sources/sdk/src/main/java/com/batch/android/query/serialization/deserializers/AttributesSendResponseDeserializer.java @@ -33,6 +33,12 @@ public AttributesSendResponse deserialize() throws JSONException { if (json.hasNonNull("ver")) { response.setVersion(json.getLong("ver")); } + if (json.hasNonNull("project_key")) { + String projectKey = json.getString("project_key"); + if (!projectKey.isEmpty()) { + response.setProjectKey(projectKey); + } + } return response; } } diff --git a/Sources/sdk/src/main/java/com/batch/android/runtime/ChangeStateAction.java b/Sources/sdk/src/main/java/com/batch/android/runtime/ChangeStateAction.java index 0a5043c..d1531bf 100644 --- a/Sources/sdk/src/main/java/com/batch/android/runtime/ChangeStateAction.java +++ b/Sources/sdk/src/main/java/com/batch/android/runtime/ChangeStateAction.java @@ -8,8 +8,9 @@ public interface ChangeStateAction { /** * Action to run * - * @param state current state + * @param state The current state + * @param config The current configuration * @return the new state to set, if null will do nothing */ - State run(State state); + State run(State state, Config config); } diff --git a/Sources/sdk/src/main/java/com/batch/android/runtime/Config.java b/Sources/sdk/src/main/java/com/batch/android/runtime/Config.java new file mode 100644 index 0000000..8cf54d5 --- /dev/null +++ b/Sources/sdk/src/main/java/com/batch/android/runtime/Config.java @@ -0,0 +1,137 @@ +package com.batch.android.runtime; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.batch.android.LoggerDelegate; +import com.batch.android.LoggerLevel; +import com.batch.android.core.Logger; + +/** + * Class to build a runtime configuration for Batch SDK + * + */ +public final class Config { + + /** + * The API key used for Batch + */ + @Nullable + private String apikey; + + /** + * Should Batch send Logs to a 3rd party class + */ + @Nullable + private LoggerDelegate loggerDelegate = null; + + /** + * Level of log Batch should use + */ + @NonNull + private LoggerLevel loggerLevel = LoggerLevel.INFO; + + /** + * Migrations related configuration + */ + @Nullable + private Integer migrations = null; + + /** + * Constructor + */ + public Config() {} + + /** + * Get the Batch API Key. + * + * @return The Batch API Key. + */ + @Nullable + public String getApikey() { + return apikey; + } + + /** + * Set the Batch SDK API Key + * @param apikey The Batch SDK API Key + */ + public void setApikey(@Nullable String apikey) { + this.apikey = apikey; + } + + /** + * Get the current logger delegate + * + * @return The current logger delegate + */ + @Nullable + public LoggerDelegate getLoggerDelegate() { + return loggerDelegate; + } + + /** + * Set if Batch should send its logs to an object of yours (default = null)
+ *
+ * Be careful with your implementation: setting this can impact stability and performance
+ * You should only use it if you know what you are doing. + * + * @param delegate An object implementing {@link LoggerDelegate} + */ + public void setLoggerDelegate(@Nullable LoggerDelegate delegate) { + Logger.loggerDelegate = delegate; + loggerDelegate = delegate; + } + + /** + * Get the current logger level + * + * @return The current logger level + */ + @NonNull + public LoggerLevel getLoggerLevel() { + return loggerLevel; + } + + /** + * Set the log level Batch should use + * + * @param level The level of the logger to set + */ + public void setLoggerLevel(@NonNull LoggerLevel level) { + Logger.loggerLevel = level; + loggerLevel = level; + } + + /** + * Get the migrations configuration + * + * @return the migrations configuration + */ + @Nullable + public Integer getMigrations() { + return migrations; + } + + /** + * Set the current migrations related configuration + * @param migrations The migrations to disable + */ + public void setMigrations(@Nullable Integer migrations) { + this.migrations = migrations; + } + + /** + * Make deep copy of this configuration + * + * @return A new config object + */ + @NonNull + public Config copy() { + Config copy = new Config(); + copy.setApikey(this.apikey); + copy.setLoggerDelegate(this.loggerDelegate); + copy.setLoggerLevel(this.loggerLevel); + copy.setMigrations(migrations); + return copy; + } +} diff --git a/Sources/sdk/src/main/java/com/batch/android/runtime/ConfigAction.java b/Sources/sdk/src/main/java/com/batch/android/runtime/ConfigAction.java new file mode 100644 index 0000000..45b38a6 --- /dev/null +++ b/Sources/sdk/src/main/java/com/batch/android/runtime/ConfigAction.java @@ -0,0 +1,15 @@ +package com.batch.android.runtime; + +import androidx.annotation.NonNull; + +/** + * Action callback to update or read the current configuration object + */ +public interface ConfigAction { + /** + * Action to run + * + * @param config The configuration object to update + */ + void run(@NonNull Config config); +} diff --git a/Sources/sdk/src/main/java/com/batch/android/runtime/RuntimeManager.java b/Sources/sdk/src/main/java/com/batch/android/runtime/RuntimeManager.java index c8b2ce1..4c7591f 100644 --- a/Sources/sdk/src/main/java/com/batch/android/runtime/RuntimeManager.java +++ b/Sources/sdk/src/main/java/com/batch/android/runtime/RuntimeManager.java @@ -3,11 +3,8 @@ import android.app.Activity; import android.app.Application; import android.content.Context; -import android.os.Handler; -import android.os.Looper; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.annotation.VisibleForTesting; import com.batch.android.core.Logger; import com.batch.android.debug.FindMyInstallationHelper; import com.batch.android.processor.Module; @@ -30,19 +27,14 @@ public class RuntimeManager { /** * Application context */ + @Nullable private Context context; - /** - * Handler stored to execute actions on main thread - */ - private Handler handler = new Handler(Looper.getMainLooper()); - - // ---- Context tracking variables ---- /** * RefCount incremented/decremented by onServiceCreate/onServiceDestroy calls. * May be replaced by a Context list later. */ - private AtomicInteger serviceRefCount = new AtomicInteger(0); + private final AtomicInteger serviceRefCount = new AtomicInteger(0); /** * Date of when Batch was last started by a service WITH userActivity = true (or an Activity) * Used for automatic 24h start in activities/services @@ -66,8 +58,6 @@ public class RuntimeManager { */ private SessionManager sessionManager; - // ------------------------------------ - /** * Date of the last stop without finishing */ @@ -80,26 +70,66 @@ public class RuntimeManager { /** * Lock used to modify/get the {@link #state} */ - private ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); + private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); /** * Read lock */ - private ReadLock r = lock.readLock(); + private final ReadLock r = lock.readLock(); /** * Write lock */ - private WriteLock w = lock.writeLock(); + private final WriteLock w = lock.writeLock(); + + /** + * Batch Configuration + */ + @NonNull + private final Config config = new Config(); /** * Debug helper class to copy the installation id to the clipboard */ + @NonNull private final FindMyInstallationHelper installationIdHelper = new FindMyInstallationHelper(); - // -------------------------------------> - + /** + * Constructor + */ public RuntimeManager() {} - // --------------------------------------> + /** + * Execute an action to read the batch configuration + * You should never use this method to update the configuration. + * To do that use {@link #updateConfig(ConfigAction)} + * + * @param action action that will read the config. + */ + public void readConfig(@NonNull ConfigAction action) { + r.lock(); + try { + action.run(config.copy()); + } finally { + r.unlock(); + } + } + + /** + * Execute an action to update the batch configuration. + * Configuration can only be update if the sdk is not started. + * + * @param action action that will modify the config + */ + public void updateConfig(@NonNull ConfigAction action) { + w.lock(); + try { + if (state != State.OFF) { + return; + } + action.run(this.config); + } finally { + w.unlock(); + } + } /** * Execute an action to modify the state @@ -110,7 +140,7 @@ public RuntimeManager() {} public boolean changeState(ChangeStateAction action) { w.lock(); try { - State newState = action.run(state); + State newState = action.run(state, config); if (newState != null) { state = newState; return true; @@ -125,8 +155,8 @@ public boolean changeState(ChangeStateAction action) { /** * Execute an action to modify the state if the current state equals the wanted one * - * @param wantedState - * @param action + * @param wantedState The state we want + * @param action The action to modify the state * @return true if the state has been set, false otherwise */ public boolean changeStateIf(State wantedState, ChangeStateAction action) { @@ -136,7 +166,7 @@ public boolean changeStateIf(State wantedState, ChangeStateAction action) { return false; } - State newState = action.run(state); + State newState = action.run(state, config); if (newState != null) { state = newState; return true; @@ -148,8 +178,6 @@ public boolean changeStateIf(State wantedState, ChangeStateAction action) { } } - // ------------------------------------> - /** * Execute an action with read lock * @@ -167,31 +195,27 @@ public void run(StateAction action) { /** * Execute an action with read lock if the current state equals the wanted state * - * @param wantedState - * @param action - * @return true if the action has been run, false otherwise + * @param wantedState The state we want + * @param action The action to to read state */ - public boolean runIf(State wantedState, StateAction action) { + public void runIf(State wantedState, StateAction action) { r.lock(); try { if (state != wantedState) { - return false; + return; } action.run(state); - return true; } finally { r.unlock(); } } - // --------------------------------------> - /** * Run this action if Batch is ready * - * @param action - * @return true if the action has been runned, false otherwise + * @param action The action to + * @return true if the action has been run, false otherwise */ public boolean runIfReady(final Runnable action) { return runIf(State.READY, action); @@ -200,9 +224,9 @@ public boolean runIfReady(final Runnable action) { /** * Run this action if Batch is at the given wanted state * - * @param wantedState - * @param action - * @return true if the action has been runned, false otherwise + * @param wantedState The state we want + * @param action The action to run + * @return true if the action has been run, false otherwise */ public boolean runIf(State wantedState, final Runnable action) { r.lock(); @@ -254,7 +278,7 @@ public void onStopWithoutFinishing() { * Set the activity, you should NEVER call this method outside of a changeState method
* This method is NOT thread safe * - * @param activity + * @param activity Android's activity */ public void setActivity(Activity activity) { this.activity = activity; @@ -304,7 +328,7 @@ public boolean isReady() { public boolean isRetainedByService() { int refCount = this.serviceRefCount.get(); - // Fix negative refcounts + // Fix negative ref counts if (refCount < 0) { Logger.error( TAG, @@ -351,7 +375,7 @@ public Date getLastUserStartDate() { * Set the context, you should NEVER call this method outside of a changeState method
* This method is NOT thread safe * - * @param context + * @param context Android's context */ public void setContext(Context context) { if (context != null) { // Just in case we got an activity @@ -436,9 +460,4 @@ public String getSessionIdentifier() { public SessionManager getSessionManager() { return sessionManager; } - - @VisibleForTesting - public void clearSessionManager() { - sessionManager = null; - } } diff --git a/Sources/sdk/src/main/java/com/batch/android/tracker/TrackerDatasource.java b/Sources/sdk/src/main/java/com/batch/android/tracker/TrackerDatasource.java index 598c9f3..15e9fff 100644 --- a/Sources/sdk/src/main/java/com/batch/android/tracker/TrackerDatasource.java +++ b/Sources/sdk/src/main/java/com/batch/android/tracker/TrackerDatasource.java @@ -128,11 +128,7 @@ public List extractEventsToSend(int limit) { null, null, null, - "CASE WHEN " + - TrackerDatabaseHelper.COLUMN_NAME + - " LIKE '\\_%' ESCAPE '\\' THEN 1 ELSE 0 END DESC, " + - TrackerDatabaseHelper.COLUMN_DB_ID + - " desc", + TrackerDatabaseHelper.COLUMN_DB_ID + " asc", limitStr ); while (cursor.moveToNext()) { diff --git a/Sources/sdk/src/main/java/com/batch/android/tracker/TrackerMode.java b/Sources/sdk/src/main/java/com/batch/android/tracker/TrackerMode.java deleted file mode 100644 index 140dd32..0000000 --- a/Sources/sdk/src/main/java/com/batch/android/tracker/TrackerMode.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.batch.android.tracker; - -/** - * Define the running mode of the Tracker module - * - */ -public enum TrackerMode { - /** - * Tracker is OFF (no Sqlite & webservice) - */ - OFF(0), - - /** - * Tracker is only storing event in DB, not sending - */ - DB_ONLY(1), - - /** - * Tracker is up & running - */ - ON(2); - - // ----------------------------------------> - - private int value; - - TrackerMode(int value) { - this.value = value; - } - - public int getValue() { - return value; - } - - // -----------------------------------------> - - /** - * Mode from value - * - * @param value - * @return mode if found, null otherwise - */ - public static TrackerMode fromValue(int value) { - for (TrackerMode mode : values()) { - if (mode.getValue() == value) { - return mode; - } - } - - return null; - } -} diff --git a/Sources/sdk/src/main/java/com/batch/android/user/AttributeType.java b/Sources/sdk/src/main/java/com/batch/android/user/AttributeType.java index 6c116cc..697514a 100644 --- a/Sources/sdk/src/main/java/com/batch/android/user/AttributeType.java +++ b/Sources/sdk/src/main/java/com/batch/android/user/AttributeType.java @@ -16,13 +16,16 @@ public enum AttributeType { DATE(5, 't'), - URL(6, 'u'); + URL(6, 'u'), + OBJECT(7, 'o'), + STRING_ARRAY(8, 'a'), + OBJECT_ARRAY(9, 'a'); // ----------------------------------------> - private int value; + private final int value; - private char typeChar; + private final char typeChar; AttributeType(int value, char typeChar) { this.value = value; diff --git a/Sources/sdk/src/main/java/com/batch/android/user/EmailSubscription.java b/Sources/sdk/src/main/java/com/batch/android/user/EmailSubscription.java deleted file mode 100644 index b324f10..0000000 --- a/Sources/sdk/src/main/java/com/batch/android/user/EmailSubscription.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.batch.android.user; - -import android.content.Context; -import androidx.annotation.Nullable; -import com.batch.android.Batch; -import com.batch.android.BatchEmailSubscriptionState; -import com.batch.android.core.Logger; -import com.batch.android.di.providers.RuntimeManagerProvider; -import com.batch.android.di.providers.TrackerModuleProvider; -import com.batch.android.event.InternalEvents; -import com.batch.android.json.JSONException; -import com.batch.android.json.JSONObject; -import java.util.LinkedHashMap; -import java.util.Locale; -import java.util.Map; - -public class EmailSubscription { - - /** - * Enum defining the email kinds for subscription management - */ - public enum Kind { - MARKETING, - } - - private static final String TAG = "EmailSubscription"; - private static final String EMAIL_KEY = "email"; - private static final String CUSTOM_ID_KEY = "custom_id"; - private static final String SUBSCRIPTION_KEY = "subscriptions"; - - @Nullable - private String email; - - private boolean deleteEmail = false; - - private final Map subscriptions = new LinkedHashMap<>(); - - public EmailSubscription() {} - - public EmailSubscription(@Nullable String email) { - if (email == null) { - deleteEmail = true; - } - this.email = email; - } - - public void setEmail(@Nullable String email) { - if (email == null) { - deleteEmail = true; - } - this.email = email; - } - - public void addSubscription(Kind kind, BatchEmailSubscriptionState state) { - this.subscriptions.put(kind, state); - } - - public void sendEmailSubscriptionEvent() { - Context context = RuntimeManagerProvider.get().getContext(); - if (context == null) { - Logger.error("Context cannot be null"); - return; - } - - try { - JSONObject params = new JSONObject(); - - String customId = Batch.User.getIdentifier(context); - if (customId == null) { - Logger.internal(TAG, "Custom user id is null, not sending event."); - return; - } - - params.put(CUSTOM_ID_KEY, customId); - if (email != null) { - params.put(EMAIL_KEY, email); - } else if (deleteEmail) { - params.put(EMAIL_KEY, JSONObject.NULL); - } - - if (!subscriptions.isEmpty()) { - JSONObject subscriptionParam = new JSONObject(); - for (Map.Entry sub : subscriptions.entrySet()) { - subscriptionParam.put( - sub.getKey().toString().toLowerCase(Locale.US), - sub.getValue().toString().toLowerCase(Locale.US) - ); - } - params.put(SUBSCRIPTION_KEY, subscriptionParam); - } - TrackerModuleProvider.get().track(InternalEvents.EMAIL_CHANGED, params); - } catch (JSONException e) { - Logger.internal(TAG, "Failed building email subscription params."); - } - } -} diff --git a/Sources/sdk/src/main/java/com/batch/android/user/InstallDataEditor.java b/Sources/sdk/src/main/java/com/batch/android/user/InstallDataEditor.java new file mode 100644 index 0000000..f991b42 --- /dev/null +++ b/Sources/sdk/src/main/java/com/batch/android/user/InstallDataEditor.java @@ -0,0 +1,408 @@ +package com.batch.android.user; + +import android.content.Context; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.batch.android.core.Logger; +import com.batch.android.core.Promise; +import com.batch.android.di.providers.RuntimeManagerProvider; +import com.batch.android.di.providers.UserModuleProvider; +import com.batch.android.module.UserModule; +import com.batch.android.profile.ProfileDataHelper; +import com.batch.android.profile.ProfileDataHelper.AttributeValidationException; +import java.net.URI; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +/** + * Batch User data editor + */ +public class InstallDataEditor { + + public static final String TAG = "InstallDataEditor"; + private static final int LANGUAGE_INDEX = 0; + private static final int REGION_INDEX = 1; + private final UserOperationQueue operationQueue = new UserOperationQueue(); + private final boolean[] updatedFields = { false, false }; + private final String[] userFields = { null, null }; + private final UserModule userModule; + + protected InstallDataEditor() { + this.userModule = UserModuleProvider.get(); + } + + //region Public API + + /** + * Set the language of this user.
+ * Overrides the detected user language. + * + * @param language lowercase, ISO 639 formatted string. null to reset. + * @return This object instance, for method chaining + */ + protected InstallDataEditor setLanguage(final @Nullable String language) { + if (ProfileDataHelper.isNotValidLanguage(language)) { + Logger.error(TAG, "setLanguage called with invalid language (must be at least 2 chars)"); + return this; + } + this.userFields[LANGUAGE_INDEX] = language; + this.updatedFields[LANGUAGE_INDEX] = true; + return this; + } + + /** + * Set the region of this user.
+ * Overrides the detected user region. + * + * @param region uppercase, ISO 3166 formatted string. null to reset. + * @return This object instance, for method chaining + */ + protected InstallDataEditor setRegion(final @Nullable String region) { + if (ProfileDataHelper.isNotValidRegion(region)) { + Logger.error(TAG, "setRegion called with invalid region (must be at least 2 chars)"); + return this; + } + this.userFields[REGION_INDEX] = region; + this.updatedFields[REGION_INDEX] = true; + return this; + } + + /** + * Set a custom user attribute for a key. + * + * @param key Attribute key, can't be null. It should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. + * @param value Attribute value. + * @return This object instance, for method chaining + */ + protected InstallDataEditor setAttribute(final @NonNull String key, final long value) { + final String normalizedKey; + try { + normalizedKey = ProfileDataHelper.normalizeAttributeKey(key); + } catch (AttributeValidationException e) { + e.printErrorMessage(TAG, key); + return this; + } + operationQueue.addOperation(datasource -> datasource.setAttribute(normalizedKey, value)); + return this; + } + + /** + * Set a custom user attribute for a key. + * + * @param key Attribute key, can't be null. It should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. + * @param value Attribute value. + * @return This object instance, for method chaining + */ + protected InstallDataEditor setAttribute(final @NonNull String key, final double value) { + final String normalizedKey; + try { + normalizedKey = ProfileDataHelper.normalizeAttributeKey(key); + } catch (AttributeValidationException e) { + e.printErrorMessage(TAG, key); + return this; + } + + operationQueue.addOperation(datasource -> datasource.setAttribute(normalizedKey, value)); + return this; + } + + /** + * Set a custom user attribute for a key. + * + * @param key Attribute key, can't be null. It should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. + * @param value Attribute value. + * @return This object instance, for method chaining + */ + protected InstallDataEditor setAttribute(final @NonNull String key, final boolean value) { + final String normalizedKey; + try { + normalizedKey = ProfileDataHelper.normalizeAttributeKey(key); + } catch (AttributeValidationException e) { + e.printErrorMessage(TAG, key); + return this; + } + operationQueue.addOperation(datasource -> datasource.setAttribute(normalizedKey, value)); + return this; + } + + /** + * Set a custom user attribute for a key. + * + * @param key Attribute key, can't be null. It should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. + * @param value Attribute value, can't be null. Note that since timezones are not supported, this will typically represent UTC dates. + * @return This object instance, for method chaining + */ + protected InstallDataEditor setAttribute(final @NonNull String key, @NonNull final Date value) { + final String normalizedKey; + try { + ProfileDataHelper.assertNotNull(value); + normalizedKey = ProfileDataHelper.normalizeAttributeKey(key); + } catch (AttributeValidationException e) { + e.printErrorMessage(TAG, key); + return this; + } + + // Dates are mutable! + final Date date = (Date) value.clone(); + + synchronized (operationQueue) { + operationQueue.addOperation(datasource -> datasource.setAttribute(normalizedKey, date)); + } + + return this; + } + + /** + * Set a custom user attribute for a key. + * + * @param key Attribute key, can't be null. It should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. + * @param value Attribute value, can't be null or empty. Must be a string not longer than 64 characters. For better results, you should make them upper/lowercase and trim the whitespaces. + * @return This object instance, for method chaining + */ + protected InstallDataEditor setAttribute(final @NonNull String key, final @NonNull String value) { + try { + ProfileDataHelper.assertNotNull(value); + String normalizedKey = ProfileDataHelper.normalizeAttributeKey(key); + if (ProfileDataHelper.isNotValidStringValue(value)) { + Logger.error( + TAG, + "String attributes can't be null or longer than " + + ProfileDataHelper.ATTR_STRING_MAX_LENGTH + + " characters. Ignoring attribute '" + + key + + "'" + ); + return this; + } + operationQueue.addOperation(datasource -> datasource.setAttribute(normalizedKey, value)); + } catch (AttributeValidationException e) { + e.printErrorMessage(TAG, key); + return this; + } + return this; + } + + /** + * Set a custom user attribute for a key. + * + * @param key Attribute key, can't be null. It should be made of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. + * @param value Attribute value, can't be null or empty. Must be a valid URI not longer than 2048 character. + * @return This object instance, for method chaining + */ + protected InstallDataEditor setAttribute(final @NonNull String key, final @NonNull URI value) { + final String normalizedKey; + try { + ProfileDataHelper.assertNotNull(value); + normalizedKey = ProfileDataHelper.normalizeAttributeKey(key); + } catch (AttributeValidationException e) { + e.printErrorMessage(TAG, key); + return this; + } + if (ProfileDataHelper.isURITooLong(value)) { + Logger.error( + TAG, + "URL attributes can't be null or longer than " + + ProfileDataHelper.ATTR_URL_MAX_LENGTH + + " characters. Ignoring attribute '" + + key + + "'" + ); + return this; + } + if (ProfileDataHelper.isNotValidURIValue(value)) { + Logger.error( + TAG, + "URL attributes must follow the format 'scheme://[authority][path][?query][#fragment]'. Ignoring attribute '" + + key + + "'" + ); + return this; + } + operationQueue.addOperation(datasource -> datasource.setAttribute(normalizedKey, value)); + return this; + } + + /** + * Removes a custom attribute.
+ * Does nothing if it was not set. + * + * @param key Attribute key + * @return This object instance, for method chaining + */ + protected InstallDataEditor removeAttribute(@NonNull String key) { + final String normalizedKey; + try { + normalizedKey = ProfileDataHelper.normalizeAttributeKey(key); + } catch (AttributeValidationException e) { + e.printErrorMessage(TAG, key); + return this; + } + operationQueue.addOperation(datasource -> datasource.removeAttribute(normalizedKey)); + return this; + } + + /** + * Add a tag in the specified collection. If empty, the collection will automatically be created. + * + * @param collection The collection to add the tag to. Cannot be null. Must be a string of letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters. + * @param tag The tag to add. Cannot be null or empty. Must be a string no longer than 64 characters. + * @return This object instance, for method chaining + */ + protected InstallDataEditor addTag(final @NonNull String collection, final @NonNull String tag) { + final String normalizedCollection; + final String normalizedValue; + try { + normalizedCollection = ProfileDataHelper.normalizeAttributeKey(collection); + } catch (AttributeValidationException e) { + e.printErrorMessage(TAG, collection); + return this; + } + try { + normalizedValue = ProfileDataHelper.normalizeTagValue(tag); + } catch (AttributeValidationException e) { + Logger.error( + TAG, + String.format( + "Invalid tag. Please make sure that the tag is made of letters, underscores and numbers only (a-zA-Z0-9_). It also can't be longer than 255 characters. Ignoring tag '%s' for collection '%s'.", + collection, + tag + ) + ); + return this; + } + operationQueue.addOperation(datasource -> datasource.addTag(normalizedCollection, normalizedValue)); + return this; + } + + /** + * Removes a tag from a collection. + * Does nothing if the tag does not exist. + * + * @param collection Collection name + * @param tag Tag name + * @return This object instance, for method chaining + */ + protected InstallDataEditor removeTag(final @NonNull String collection, final @NonNull String tag) { + final String normalizedCollection; + final String normalizedValue; + try { + normalizedCollection = ProfileDataHelper.normalizeAttributeKey(collection); + } catch (AttributeValidationException e) { + e.printErrorMessage(TAG, collection); + return this; + } + try { + normalizedValue = ProfileDataHelper.normalizeTagValue(tag); + } catch (AttributeValidationException e) { + Logger.error( + TAG, + String.format( + "Invalid tag. Please make sure that the tag is made of letters, underscores and numbers only (a-zA-Z0-9_). It also can't be longer than 255 characters. Ignoring tag '%s' for collection '%s'.", + collection, + tag + ) + ); + return this; + } + operationQueue.addOperation(datasource -> datasource.removeTag(normalizedCollection, normalizedValue)); + return this; + } + + /** + * Removes all tags from a collection. + * Does nothing if the tag collection does not exist. + * + * @param collection Tag collection. + * @return This object instance, for method chaining + */ + protected InstallDataEditor clearTagCollection(final @NonNull String collection) { + try { + final String normalizedCollection = ProfileDataHelper.normalizeAttributeKey(collection); + operationQueue.addOperation(datasource -> datasource.clearTags(normalizedCollection)); + } catch (ProfileDataHelper.AttributeValidationException e) { + Logger.error( + TAG, + String.format("Invalid tag collection. Ignoring tag collection clear request '%s' .", collection) + ); + return this; + } + return this; + } + + /** + * Save all of the pending changes made in that editor. + * Note if Batch is not started, your changes will be enqueue until it start. + * Once you called "save", you need to get a new editor in order to make further changes. + *

+ * This action cannot be undone. + */ + protected void save() { + try { + executeUserUpdateOperation(); + } catch (UserModule.SaveException e) { + Logger.error(TAG, "Failed saving custom user operation for install compatibility."); + } + final List pendingOperationQueue = popOperationQueue(); + UserModuleProvider.get().addOperationQueueAndSubmit(500, new UserOperationQueue(pendingOperationQueue)); + } + + protected Promise saveSync() { + // Making temporary the method public to not break the tests. + // This class will be fully internal in the next development. + final Promise promise = new Promise<>(); + try { + executeUserUpdateOperation(); + } catch (UserModule.SaveException e) { + Logger.error(TAG, "Failed saving custom user operation for install compatibility."); + } + final List pendingOperationQueue = popOperationQueue(); + Runnable runnable = () -> { + try { + UserModule.applyUserOperationsSync(pendingOperationQueue); + promise.resolve(null); + } catch (UserModule.SaveException e) { + Logger.error(TAG, e.getMessage()); + promise.reject(e); + } + }; + runnable.run(); + return promise; + } + + //endregion + + //region Private helpers + private void executeUserUpdateOperation() throws UserModule.SaveException { + if (!updatedFields[LANGUAGE_INDEX] && !updatedFields[REGION_INDEX]) { + // Nothing to do + return; + } + Context context = RuntimeManagerProvider.get().getContext(); + if (context == null) { + throw new UserModule.SaveException( + "Error while applying. Make sure Batch is started beforehand, and not globally opted out from.", + "'context' was null while saving." + ); + } + String[] previousUserFields = new String[] { userModule.getLanguage(context), userModule.getRegion(context) }; + + if (updatedFields[LANGUAGE_INDEX]) { + userModule.setLanguage(context, userFields[LANGUAGE_INDEX]); + } + + if (updatedFields[REGION_INDEX]) { + userModule.setRegion(context, userFields[REGION_INDEX]); + } + + if (!Arrays.equals(userFields, previousUserFields)) { + // At least one field has changed, we increment the user profile version + userModule.incrementVersion(context); + } + } + + private List popOperationQueue() { + return operationQueue.popOperations(); + } + //endregion +} diff --git a/Sources/sdk/src/main/java/com/batch/android/user/SQLUserDatasource.java b/Sources/sdk/src/main/java/com/batch/android/user/SQLUserDatasource.java index f3f3cce..77eba67 100644 --- a/Sources/sdk/src/main/java/com/batch/android/user/SQLUserDatasource.java +++ b/Sources/sdk/src/main/java/com/batch/android/user/SQLUserDatasource.java @@ -499,43 +499,7 @@ private void deleteTag(@NonNull String collection, @NonNull String tag) throws U // endregion - // region Debug - - @Override - public String printDebugDump() { - StringBuilder debugBuilder = new StringBuilder(); - debugBuilder.append("Attributes: {"); - for (Map.Entry entry : getAttributes().entrySet()) { - debugBuilder.append("\n\t"); - debugBuilder.append(entry.getKey()); - debugBuilder.append(": "); - debugBuilder.append(entry.getValue().toString()); - } - debugBuilder.append("\n}\nTag collections: {"); - for (Map.Entry> tagCollection : getTagCollections().entrySet()) { - debugBuilder.append("\n\t"); - debugBuilder.append(tagCollection.getKey()); - debugBuilder.append(": ["); - - for (String tag : tagCollection.getValue()) { - debugBuilder.append("\n\t\t"); - debugBuilder.append(tag); - } - - debugBuilder.append("\n\t]"); - } - debugBuilder.append("\n}"); - - String debugString = debugBuilder.toString(); - - Logger.info(TAG, "Debug User Data dump:\n" + debugString); - return debugString; - } - - // - // region Exception helpers - private void logAndThrow(String msg, Throwable t) throws UserDatabaseException { Logger.internal(UserModule.TAG, msg, t); throw new UserDatabaseException(msg); diff --git a/Sources/sdk/src/main/java/com/batch/android/user/UserAttribute.java b/Sources/sdk/src/main/java/com/batch/android/user/UserAttribute.java index 63cd1ad..e01ca2e 100644 --- a/Sources/sdk/src/main/java/com/batch/android/user/UserAttribute.java +++ b/Sources/sdk/src/main/java/com/batch/android/user/UserAttribute.java @@ -11,12 +11,15 @@ public class UserAttribute { public Object value; public AttributeType type; - public UserAttribute(@NonNull Object value, @NonNull AttributeType type) { + public UserAttribute(@Nullable Object value, @NonNull AttributeType type) { this.value = value; this.type = type; } - public static Map getServerMapRepresentation(Map attributes) { + public static Map getServerMapRepresentation( + Map attributes, + boolean isPrefixed + ) { final Map representation = new HashMap<>(); if (attributes == null) { return representation; @@ -28,10 +31,13 @@ public static Map getServerMapRepresentation(Map serverAttributesRepresentation = UserAttribute.getServerMapRepresentation( - attributes + attributes, + true ); for (Map.Entry attribute : serverAttributesRepresentation.entrySet()) { result.put(attribute.getKey(), attribute.getValue()); diff --git a/Sources/sdk/src/main/java/com/batch/android/user/UserDatasource.java b/Sources/sdk/src/main/java/com/batch/android/user/UserDatasource.java index 6ba210e..9d61cef 100644 --- a/Sources/sdk/src/main/java/com/batch/android/user/UserDatasource.java +++ b/Sources/sdk/src/main/java/com/batch/android/user/UserDatasource.java @@ -3,7 +3,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import java.net.URI; -import java.net.URL; import java.util.Date; import java.util.HashMap; import java.util.Map; @@ -49,6 +48,4 @@ public interface UserDatasource { @Nullable HashMap getAttributes(); - - String printDebugDump(); } diff --git a/Sources/sdk/src/main/java/com/batch/android/util/DataCollectionUtils.java b/Sources/sdk/src/main/java/com/batch/android/util/DataCollectionUtils.java new file mode 100644 index 0000000..5262002 --- /dev/null +++ b/Sources/sdk/src/main/java/com/batch/android/util/DataCollectionUtils.java @@ -0,0 +1,39 @@ +package com.batch.android.util; + +import androidx.annotation.NonNull; +import com.batch.android.BatchDataCollectionConfig; +import java.util.Objects; + +public class DataCollectionUtils { + + /** + * Method to compare two batch privacy data config. + *

+ * Globally used to check if a new config is different from the old one + * So if one of the configs field is null, we consider it as equal because we consider a null field as an unchanged value from the previous configuration. + * @param config The new config + * @param config2 The old config + * @return True if config are unchanged. Example: null, true, false, et false, true, false will return true. + */ + public static boolean areConfigsEquals( + @NonNull BatchDataCollectionConfig config, + @NonNull BatchDataCollectionConfig config2 + ) { + boolean sameGeoip = true; + boolean sameDeviceBrand = true; + boolean sameDeviceModel = true; + + if (config.isGeoIpEnabled() != null && config2.isGeoIpEnabled() != null) { + sameGeoip = Objects.equals(config.isGeoIpEnabled(), config2.isGeoIpEnabled()); + } + + if (config.isDeviceBrandEnabled() != null && config2.isDeviceBrandEnabled() != null) { + sameDeviceBrand = Objects.equals(config.isDeviceBrandEnabled(), config2.isDeviceBrandEnabled()); + } + + if (config.isDeviceModelEnabled() != null && config2.isDeviceModelEnabled() != null) { + sameDeviceModel = Objects.equals(config.isDeviceModelEnabled(), config2.isDeviceModelEnabled()); + } + return sameGeoip && sameDeviceBrand && sameDeviceModel; + } +} diff --git a/Sources/sdk/src/main/java/com/batch/android/util/MetaDataUtils.java b/Sources/sdk/src/main/java/com/batch/android/util/MetaDataUtils.java index fea3493..4da1dba 100644 --- a/Sources/sdk/src/main/java/com/batch/android/util/MetaDataUtils.java +++ b/Sources/sdk/src/main/java/com/batch/android/util/MetaDataUtils.java @@ -9,9 +9,7 @@ */ public class MetaDataUtils { - public static final String MANIFEST_SENDER_ID_KEY = "batch_push_fcm_sender_id_override"; - - public static final String MANIFEST_FORCE_FCM_IID_KEY = "batch_push_force_fcm_iid_provider"; + public static final String MANIFEST_OPT_OUT_BY_DEFAULT_KEY = "batch_opted_out_by_default"; /** * Get the bundle meta data info from the AndroidManifest diff --git a/Sources/sdk/src/main/java/com/batch/android/webservice/listener/impl/AttributesCheckWebserviceListenerImpl.java b/Sources/sdk/src/main/java/com/batch/android/webservice/listener/impl/AttributesCheckWebserviceListenerImpl.java index 707c174..ee92b96 100644 --- a/Sources/sdk/src/main/java/com/batch/android/webservice/listener/impl/AttributesCheckWebserviceListenerImpl.java +++ b/Sources/sdk/src/main/java/com/batch/android/webservice/listener/impl/AttributesCheckWebserviceListenerImpl.java @@ -1,6 +1,12 @@ package com.batch.android.webservice.listener.impl; +import android.content.Context; import com.batch.android.FailReason; +import com.batch.android.core.ParameterKeys; +import com.batch.android.core.Parameters; +import com.batch.android.di.providers.ParametersProvider; +import com.batch.android.di.providers.ProfileModuleProvider; +import com.batch.android.di.providers.RuntimeManagerProvider; import com.batch.android.di.providers.UserModuleProvider; import com.batch.android.query.response.AttributesCheckResponse; import com.batch.android.webservice.listener.AttributesCheckWebserviceListener; @@ -64,6 +70,18 @@ public void onSuccess(AttributesCheckResponse response) { if (!foundValidAction) { UserModuleProvider.get().startCheckWS(DEFAULT_RECHECK_TIME); } + + // Detecting whether project has changed + Context context = RuntimeManagerProvider.get().getContext(); + String projectKey = response.getProjectKey(); + if (projectKey != null && context != null) { + Parameters parameters = ParametersProvider.get(context); + String currentProjectKey = parameters.get(ParameterKeys.PROJECT_KEY); + if (!projectKey.equals(currentProjectKey)) { + parameters.set(ParameterKeys.PROJECT_KEY, projectKey, true); + ProfileModuleProvider.get().onProjectChanged(currentProjectKey, projectKey); + } + } } @Override diff --git a/Sources/sdk/src/main/java/com/batch/android/webservice/listener/impl/AttributesSendWebserviceListenerImpl.java b/Sources/sdk/src/main/java/com/batch/android/webservice/listener/impl/AttributesSendWebserviceListenerImpl.java index a6ca2dd..89e8728 100644 --- a/Sources/sdk/src/main/java/com/batch/android/webservice/listener/impl/AttributesSendWebserviceListenerImpl.java +++ b/Sources/sdk/src/main/java/com/batch/android/webservice/listener/impl/AttributesSendWebserviceListenerImpl.java @@ -1,6 +1,11 @@ package com.batch.android.webservice.listener.impl; +import android.content.Context; import com.batch.android.FailReason; +import com.batch.android.core.ParameterKeys; +import com.batch.android.core.Parameters; +import com.batch.android.di.providers.ParametersProvider; +import com.batch.android.di.providers.RuntimeManagerProvider; import com.batch.android.di.providers.UserModuleProvider; import com.batch.android.query.response.AttributesSendResponse; import com.batch.android.webservice.listener.AttributesSendWebserviceListener; @@ -13,7 +18,22 @@ public class AttributesSendWebserviceListenerImpl implements AttributesSendWebse @Override public void onSuccess(AttributesSendResponse response) { - UserModuleProvider.get().storeTransactionID(response.transactionID, response.version); + UserModuleProvider.get().storeTransactionID(response.getTransactionID(), response.getVersion()); + + // Detecting whether project has changed + Context context = RuntimeManagerProvider.get().getContext(); + String projectKey = response.getProjectKey(); + if (projectKey != null && context != null) { + Parameters parameters = ParametersProvider.get(context); + String currentProjectKey = parameters.get(ParameterKeys.PROJECT_KEY); + if (!projectKey.equals(currentProjectKey)) { + // If we are here this mean we are running on a fresh V2 install and user has + // just wrote some profile data. + // So we save the project key to not trigger the profile data migration from the + // next ATC response otherwise we would erase the data we just sent. + parameters.set(ParameterKeys.PROJECT_KEY, projectKey, true); + } + } } @Override diff --git a/Sources/sdk/src/main/res/layout/com_batchsdk_identifier_debug_fragment.xml b/Sources/sdk/src/main/res/layout/com_batchsdk_identifier_debug_fragment.xml index 01a270e..3cdbfa8 100644 --- a/Sources/sdk/src/main/res/layout/com_batchsdk_identifier_debug_fragment.xml +++ b/Sources/sdk/src/main/res/layout/com_batchsdk_identifier_debug_fragment.xml @@ -31,21 +31,6 @@ android:paddingBottom="16dp" style="@style/com_batchsdk_TextAppearance.Debug.Body" /> - - - - - - Batch SDK Version Installation ID - Advertising ID Push Token Custom User ID diff --git a/Sources/sdk/src/test/java/com/batch/android/BatchEventDataTest.java b/Sources/sdk/src/test/java/com/batch/android/BatchEventDataTest.java deleted file mode 100644 index fa1d8dc..0000000 --- a/Sources/sdk/src/test/java/com/batch/android/BatchEventDataTest.java +++ /dev/null @@ -1,242 +0,0 @@ -package com.batch.android; - -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.filters.SmallTest; -import com.batch.android.json.JSONArray; -import com.batch.android.json.JSONException; -import com.batch.android.json.JSONObject; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; - -@RunWith(AndroidJUnit4.class) -@SmallTest -public class BatchEventDataTest { - - @Test - public void testValidData() throws JSONException, URISyntaxException { - URI uri = new URI("batch://batch.com"); - - BatchEventData data = new BatchEventData(); - data.addTag("FOO"); - data.addTag("bAr"); - data.addTag("baz"); - - data.put("INT", 1); - data.put("LONG", 1L); - data.put("FLOAT", 1.0f); - data.put("DOUBLE", 1.0d); - data.put("BOOL", true); - data.put("STRING", "foobar"); - data.put("123", " 456 "); - data.put("now", new Date(1589466748930L)); - data.put("url", uri); - - JSONObject json = data.toInternalJSON(); - - List tags = jsonArrayToList(json.getJSONArray("tags")); - Assert.assertTrue(tags.contains("foo")); - Assert.assertTrue(tags.contains("bar")); - Assert.assertTrue(tags.contains("baz")); - - JSONObject values = json.getJSONObject("attributes"); - - Assert.assertEquals(1, values.get("int.i")); - Assert.assertEquals(1L, values.get("long.i")); - Assert.assertEquals(1.0f, values.get("float.f")); - Assert.assertEquals(1.0d, values.get("double.f")); - Assert.assertEquals(true, values.get("bool.b")); - Assert.assertEquals("foobar", (String) values.get("string.s")); - Assert.assertEquals(" 456 ", (String) values.get("123.s")); - Assert.assertEquals(1589466748930L, values.get("now.t")); - Assert.assertEquals(uri, values.get("url.u")); - - Assert.assertEquals(null, json.opt("converted")); - } - - @Test - public void testSizeLimits() throws JSONException { - BatchEventData data = new BatchEventData(); - - for (int i = 0; i < 20; i++) { - data.addTag(Integer.toString(i)); - data.put(Integer.toString(i), i); - } - - JSONObject json = data.toInternalJSON(); - JSONArray tags = json.getJSONArray("tags"); - JSONObject values = json.getJSONObject("attributes"); - Assert.assertEquals(10, tags.length()); - Assert.assertEquals(15, values.length()); - } - - @Test - public void testUpdateWhenFull() { - BatchEventData data = new BatchEventData(); - - data.put("hip1", "hop"); - data.put("hip2", "hop"); - data.put("hip3", "hop"); - data.put("hip4", "hop"); - data.put("hip5", "hop"); - data.put("hip6", "hop"); - data.put("hip7", "hop"); - data.put("hip8", "hop"); - data.put("hip9", "hop"); - data.put("hip10", "hop"); - data.put("hip11", "hop"); - data.put("hip12", "hop"); - data.put("hip13", "hop"); - data.put("hip14", "hop"); - data.put("hip15", "hop"); - data.put("hip16", "hop"); - - Map attr = data.getAttributes(); - Assert.assertEquals(attr.get("hip1").value, "hop"); - Assert.assertEquals(attr.get("hip2").value, "hop"); - Assert.assertEquals(attr.get("hip3").value, "hop"); - Assert.assertEquals(attr.get("hip4").value, "hop"); - Assert.assertEquals(attr.get("hip5").value, "hop"); - Assert.assertEquals(attr.get("hip6").value, "hop"); - Assert.assertEquals(attr.get("hip7").value, "hop"); - Assert.assertEquals(attr.get("hip8").value, "hop"); - Assert.assertEquals(attr.get("hip9").value, "hop"); - Assert.assertEquals(attr.get("hip10").value, "hop"); - Assert.assertEquals(attr.get("hip11").value, "hop"); - Assert.assertEquals(attr.get("hip12").value, "hop"); - Assert.assertEquals(attr.get("hip13").value, "hop"); - Assert.assertEquals(attr.get("hip14").value, "hop"); - Assert.assertEquals(attr.get("hip15").value, "hop"); - - data.put("hip5", "test"); - attr = data.getAttributes(); - Assert.assertEquals(attr.get("hip5").value, "test"); - } - - @Test - public void testInvalidData() throws JSONException { - BatchEventData data = new BatchEventData(); - - data.addTag( - "A way too long string that goes for quiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiite too long" + - "Lorem ipsum dolor and other various stuff." - ); - data.addTag(""); - - data.put( - "string", - "A way too long string that goes for quiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiite too long" + - "Lorem ipsum dolor and other various stuff." - ); - data.put("invalid_key%%%", "foobar"); - data.put("key_that_is_too_long_really_it_should_be_more_than_thirty_chars", "foobar"); - data.put("null_date", (Date) null); - - JSONObject json = data.toInternalJSON(); - JSONArray tags = json.getJSONArray("tags"); - JSONObject values = json.getJSONObject("attributes"); - Assert.assertEquals(0, tags.length()); - Assert.assertEquals(0, values.length()); - } - - @Test - public void testLegacyDataConversion() throws JSONException, URISyntaxException { - JSONObject legacyData = new JSONObject(); - URI uri = new URI("batch://batch.com"); - - // Don't remove the casts or the test fails due to JSONObject weirdness - legacyData.put("int", 1); - legacyData.put("long", 1L); - legacyData.put("float", (Float) 1.0f); - legacyData.put("double", (Double) 1.0d); - legacyData.put("bool", true); - legacyData.put("string", "foobar"); - legacyData.put("url", uri); - - BatchEventData data = new BatchEventData(legacyData); - JSONObject json = data.toInternalJSON(); - - Assert.assertEquals(0, json.getJSONArray("tags").length()); - - JSONObject values = json.getJSONObject("attributes"); - - Assert.assertEquals(1, values.get("int.i")); - Assert.assertEquals(1L, values.get("long.i")); - Assert.assertEquals(1.0f, values.get("float.f")); - Assert.assertEquals(1.0d, values.get("double.f")); - Assert.assertEquals(true, values.get("bool.b")); - Assert.assertEquals("foobar", (String) values.get("string.s")); - Assert.assertEquals(uri, (URI) values.get("url.u")); - - Assert.assertTrue(json.getBoolean("converted")); - } - - @Test - public void testLegacyDataConversionOrdering() throws JSONException { - // This test checks that the first 10 legacy array keys are picked in a predictable way - // They should be ordered - - String value = "test"; - - List unorderedKeys = new ArrayList<>(20); - unorderedKeys.add("drLAjNhvYs"); - unorderedKeys.add("wNMFqBvSHe"); - unorderedKeys.add("xZivnkZdZv"); - unorderedKeys.add("ZEZVbaXwDD"); - unorderedKeys.add("tvwZZnHsoJ"); - unorderedKeys.add("nCDiIffIqq"); - unorderedKeys.add("bXybuzBSvX"); - unorderedKeys.add("uImQWnrAyw"); - unorderedKeys.add("dIHDhyyDsk"); - unorderedKeys.add("AEBVYnPTuo"); - unorderedKeys.add("jfzUsSnTDf"); - unorderedKeys.add("vhochDgxOB"); - unorderedKeys.add("bJZgGgwKIM"); - unorderedKeys.add("GvdPlhWfyT"); - unorderedKeys.add("HQiXZQNHLs"); - unorderedKeys.add("wUGgNuvdTY"); - unorderedKeys.add("JHLZaOOoBQ"); - unorderedKeys.add("vemRXpXcUK"); - unorderedKeys.add("MEiAzZWjga"); - unorderedKeys.add("FViUCTCzfE"); - - JSONObject legacyData = new JSONObject(); - for (String key : unorderedKeys) { - legacyData.put(key, value); - } - - BatchEventData data = new BatchEventData(legacyData); - JSONObject json = data.toInternalJSON(); - - JSONObject values = json.getJSONObject("attributes"); - Assert.assertEquals(15, values.length()); - - // Dicts are not ordered, so we need to sort the keys beforehand, and check if they're all there - - List expectedConvertedKeys = new ArrayList<>(unorderedKeys); - expectedConvertedKeys.sort((o1, o2) -> o1.toLowerCase(Locale.US).compareTo(o2.toLowerCase(Locale.US))); - expectedConvertedKeys = expectedConvertedKeys.subList(0, 14); - - for (String key : expectedConvertedKeys) { - Assert.assertNotNull(values.opt(key.toLowerCase(Locale.US) + ".s")); - } - } - - @SuppressWarnings("unchecked") - private List jsonArrayToList(JSONArray json) throws JSONException { - final List array = new ArrayList<>(); - - for (int i = 0; i < json.length(); i++) { - array.add((T) json.get(i)); - } - - return array; - } -} diff --git a/Sources/sdk/src/test/java/com/batch/android/BatchProfileAttributeEditorTest.kt b/Sources/sdk/src/test/java/com/batch/android/BatchProfileAttributeEditorTest.kt new file mode 100644 index 0000000..a5676ac --- /dev/null +++ b/Sources/sdk/src/test/java/com/batch/android/BatchProfileAttributeEditorTest.kt @@ -0,0 +1,232 @@ +package com.batch.android + +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.batch.android.di.DITest +import com.batch.android.di.DITestUtils +import com.batch.android.event.InternalEvents +import com.batch.android.json.JSONArray +import com.batch.android.json.JSONObject +import com.batch.android.module.TrackerModule + +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentMatchers +import org.mockito.Mockito + +import java.net.URI +import java.util.Date + +@RunWith(AndroidJUnit4::class) +@SmallTest +class BatchProfileAttributeEditorTest : DITest() { + + private lateinit var trackerModule : TrackerModule + + override fun setUp() { + super.setUp() + simulateBatchStart(ApplicationProvider.getApplicationContext()) + trackerModule = DITestUtils.mockSingletonDependency(TrackerModule::class.java, null) + } + + @Test + fun testFullMethods() { + Batch.Profile.identify("arnaudr") + BatchProfileAttributeEditor().apply { + setLanguage("fr") + setRegion("FR") + setEmailAddress("test@batch.com") + setEmailMarketingSubscription(BatchEmailSubscriptionState.SUBSCRIBED) + setAttribute("string_att", "hello") + setAttribute("int_att", 3) + setAttribute("double_att", 3.6) + setAttribute("date_att", Date(1596975143943L)) + setAttribute("url_att", URI("https://batch.com/pricing")) + setAttribute("array_att", listOf("michelle", "bresil")) + addToArray("array_partial", listOf("i", "don't")) + removeFromArray("array_partial", "know") + removeFromArray("array_partial_2", listOf("i", "don't")) + addToArray("array_partial_2", "know") + save() + } + + val expectedProfileDataChangedParams = JSONObject().apply { + put("email", "test@batch.com") + put("email_marketing", "subscribed") + put("language", "fr") + put("region", "FR") + put("custom_attributes", JSONObject().apply { + put("string_att.s", "hello") + put("int_att.i", 3L) + put("double_att.f", 3.6) + put("date_att.t", 1596975143943L) + put("url_att.u", "https://batch.com/pricing") + put("array_att.a", JSONArray().apply { + put("michelle") + put("bresil") + }) + put("array_partial.a", JSONObject().apply { + put("\$add", JSONArray().apply { put("i"); put("don't") } ) + put("\$remove", JSONArray().apply { put("know") } ) + }) + put("array_partial_2.a", JSONObject().apply { + put("\$remove", JSONArray().apply { put("i"); put("don't") } ) + put("\$add", JSONArray().apply { put("know") } ) + }) + }) + } + + val expectedInstallDataChangedParams = JSONObject().apply { + put("added", JSONObject().apply { + put("string_att.s", "hello") + put("int_att.i", 3L) + put("double_att.f", 3.6) + put("date_att.t", 1596975143943L) + put("url_att.u", URI("https://batch.com/pricing")) + put("t.array_att", JSONArray().apply { + put("bresil") + put("michelle") + }) + put("t.array_partial", JSONArray().apply { + put("don't") + put("i") + }) + put("t.array_partial_2", JSONArray().apply { + put("know") + }) + }) + } + + // Ensure profile data changed event is sent with rights parameters + Mockito.verify(trackerModule, Mockito.times(1)) + .track(ArgumentMatchers.eq(InternalEvents.PROFILE_DATA_CHANGED), JSONObjectPartialMatcher.eq(expectedProfileDataChangedParams)) + + // Ensure install data changed event is sent with rights parameters + Mockito.verify(trackerModule, Mockito.timeout(2000).times(1)) + .track(ArgumentMatchers.eq(InternalEvents.INSTALL_DATA_CHANGED), JSONObjectPartialMatcher.eq(expectedInstallDataChangedParams)) + } + + /** + * Ensure null values are sent to remove + */ + @Test + fun testFullMethodsWithNull() { + // To fill the initial db state + BatchProfileAttributeEditor().apply { + setLanguage("fr") + setRegion("FR") + setEmailAddress("test@batch.com") + setAttribute("string_att", "hello") + setAttribute("int_att", 3) + setAttribute("double_att", 3.6) + setAttribute("url_att", URI("https://batch.com/pricing")) + setAttribute("array_att", listOf("michelle", "bresil")) + save() + } + // Waiting for debounce + Thread.sleep(1500) + + // Remove some attributes + Batch.Profile.identify("arnaudr") + BatchProfileAttributeEditor().apply { + setLanguage(null) + setRegion(null) + setEmailAddress(null) + removeAttribute("string_att") + removeAttribute("int_att") + removeAttribute("double_att") + removeAttribute("url_att") + removeAttribute("array_att") + save() + } + + // Expected profile data changed event parameter + val expectedProfileDataChangedParams = JSONObject().apply { + put("email", JSONObject.NULL) + put("language", JSONObject.NULL) + put("region", JSONObject.NULL) + put("custom_attributes", JSONObject().apply { + put("string_att", JSONObject.NULL) + put("int_att", JSONObject.NULL) + put("double_att", JSONObject.NULL) + put("url_att", JSONObject.NULL) + put("array_att", JSONObject.NULL) + }) + } + + // Expected profile data changed event parameter + val expectedInstallDataChangedParams = JSONObject().apply { + put("removed", JSONObject().apply { + put("string_att.s", "hello") + put("int_att.i", 3L) + put("double_att.f", 3.6) + put("url_att.u", URI("https://batch.com/pricing")) + put("t.array_att", JSONArray().apply { + put("bresil") + put("michelle") + }) + }) + } + + // Ensure profile data changed event is sent with rights parameters + Mockito.verify(trackerModule, Mockito.times(1)) + .track(ArgumentMatchers.eq(InternalEvents.PROFILE_DATA_CHANGED), JSONObjectPartialMatcher.eq(expectedProfileDataChangedParams)) + + Mockito.verify(trackerModule, Mockito.timeout(1500).times(1)) + .track(ArgumentMatchers.eq(InternalEvents.INSTALL_DATA_CHANGED), JSONObjectPartialMatcher.eq(expectedInstallDataChangedParams)) + } + + /** + * Ensure we do not send null value for email/region/language .. + */ + @Test + fun testOnlyOneAttribute() { + + BatchProfileAttributeEditor().apply { + setAttribute("string_att", "hello") + save() + } + + val expectedParams = JSONObject().apply { + put("custom_attributes", JSONObject().apply { + put("string_att.s", "hello") + }) + } + + val expectedInstallDataChangedParams = JSONObject().apply { + put("added", JSONObject().apply { + put("string_att.s", "hello") + }) + put("removed", JSONObject()) + } + + // Ensure profile data changed event is sent with rights parameters + Mockito.verify(trackerModule, Mockito.times(1)) + .track(ArgumentMatchers.eq(InternalEvents.PROFILE_DATA_CHANGED), JSONObjectMockitoMatcher.eq(expectedParams)) + + // Ensure install data changed event is sent with rights parameters + Mockito.verify(trackerModule, Mockito.timeout(1500).times(1)) + .track(ArgumentMatchers.eq(InternalEvents.INSTALL_DATA_CHANGED), JSONObjectPartialMatcher.eq(expectedInstallDataChangedParams)) + } + + /** + * Ensure we do not send empty event + */ + @Test + fun testEmptyAttributes() { + + BatchProfileAttributeEditor().apply { + save() + } + + // Ensure profile data changed event is sent with rights parameters + Mockito.verify(trackerModule, Mockito.never()) + .track(ArgumentMatchers.eq(InternalEvents.PROFILE_DATA_CHANGED), Mockito.any(JSONObject::class.java)) + + + // Ensure install data changed event is sent with rights parameters + Mockito.verify(trackerModule, Mockito.timeout(1500).times(0)) + .track(ArgumentMatchers.eq(InternalEvents.INSTALL_DATA_CHANGED), Mockito.any(JSONObject::class.java)) + } +} \ No newline at end of file diff --git a/Sources/sdk/src/test/java/com/batch/android/BatchPushDataTest.java b/Sources/sdk/src/test/java/com/batch/android/BatchPushDataTest.java deleted file mode 100644 index c399add..0000000 --- a/Sources/sdk/src/test/java/com/batch/android/BatchPushDataTest.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.batch.android; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import android.content.Context; -import android.content.Intent; -import androidx.test.core.app.ApplicationProvider; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.filters.SmallTest; -import com.batch.android.json.JSONObject; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -/** - * Test the {@link BatchPushData} object - * - */ -@RunWith(AndroidJUnit4.class) -@SmallTest -public class BatchPushDataTest { - - private Context appContext; - - @Before - public void setUp() { - appContext = ApplicationProvider.getApplicationContext(); - } - - /** - * Test that null pointer exeptions are correctly thrown - * - * @throws Exception - */ - @Test - public void testNullPointers() throws Exception { - try { - new BatchPushData(null, new Intent()); - fail(); - } catch (NullPointerException e) { - // Normal - } - - try { - new BatchPushData(appContext, null); - fail(); - } catch (NullPointerException e) { - // Normal - } - } - - /** - * Test that illegal argument exception is correctly thrown if intent is not a batch push one - * - * @throws Exception - */ - @Test - public void testBadIntent() throws Exception { - try { - new BatchPushData(appContext, new Intent()); - } catch (IllegalArgumentException e) { - // Normal - } - } - - /** - * Test data retrieving - * - * @throws Exception - */ - @Test - public void testCompleteIntent() throws Exception { - String deeplink = "sdoifhsoif://oisdhf"; - String largeIconURL = "http://osdihsfoih.com/jqiopqj.png"; - String bigPictureURL = "http://oisdfhsof.com/sdfhsf.png"; - - JSONObject batchData = new JSONObject(); - batchData.put("l", deeplink); - - JSONObject largeIconObject = new JSONObject(); - largeIconObject.put("u", largeIconURL); - batchData.put("bi", largeIconObject); - - JSONObject bigPictureObject = new JSONObject(); - bigPictureObject.put("u", bigPictureURL); - batchData.put("bp", bigPictureObject); - - Intent intent = new Intent(); - intent.putExtra("com.batch", batchData.toString()); - - BatchPushData pushData = new BatchPushData(appContext, intent); - - assertTrue(pushData.hasDeeplink()); - assertEquals(deeplink, pushData.getDeeplink()); - - assertTrue(pushData.hasCustomLargeIcon()); - assertEquals(largeIconURL, pushData.getCustomLargeIconURL()); - - assertTrue(pushData.hasBigPicture()); - assertEquals(bigPictureURL, pushData.getBigPictureURL()); - } -} diff --git a/Sources/sdk/src/test/java/com/batch/android/BatchUserTest.java b/Sources/sdk/src/test/java/com/batch/android/BatchUserTest.java deleted file mode 100644 index eda0877..0000000 --- a/Sources/sdk/src/test/java/com/batch/android/BatchUserTest.java +++ /dev/null @@ -1,507 +0,0 @@ -package com.batch.android; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.eq; - -import android.content.Context; -import androidx.test.core.app.ApplicationProvider; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.filters.SmallTest; -import com.batch.android.core.Promise; -import com.batch.android.di.DITest; -import com.batch.android.di.DITestUtils; -import com.batch.android.di.providers.RuntimeManagerProvider; -import com.batch.android.event.InternalEvents; -import com.batch.android.json.JSONException; -import com.batch.android.json.JSONObject; -import com.batch.android.module.TrackerModule; -import com.batch.android.module.UserModule; -import com.batch.android.user.EmailSubscription; -import com.batch.android.user.UserOperationQueue; -import java.lang.reflect.Field; -import java.net.MalformedURLException; -import java.net.URI; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.powermock.reflect.Whitebox; - -@RunWith(AndroidJUnit4.class) -@SmallTest -public class BatchUserTest extends DITest { - - private BatchUserDataEditor editor; - private Context context; - - @Before - public void setUp() { - super.setUp(); - context = ApplicationProvider.getApplicationContext(); - simulateBatchStart(context); - editor = Batch.User.editor(); - } - - @After - public void tearDown() { - super.tearDown(); - //DI.reset(); - //Batch.getUserProfile().setLanguage(null).setRegion(null).setCustomID(null); - } - - @Test - public void testSetLanguage() throws Exception { - BatchUserProfile user = Batch.getUserProfile(); - assertNotNull(user); - - String originalLanguage = user.getLanguage(); - - user.setLanguage("tr"); - - assertEquals("tr", user.getLanguage()); - - user.setLanguage(null); - - assertEquals(originalLanguage, user.getLanguage()); - } - - @Test - public void testSetRegion() throws Exception { - BatchUserProfile user = Batch.getUserProfile(); - assertNotNull(user); - - String originalRegion = user.getRegion(); - - user.setRegion("BR"); - - assertEquals("BR", user.getRegion()); - - user.setRegion(null); - - assertEquals(originalRegion, user.getRegion()); - } - - @Test - public void testCustomID() throws Exception { - BatchUserProfile user = Batch.getUserProfile(); - assertNotNull(user); - - assertNull(user.getCustomID()); - - user.setCustomID("abcd"); - - assertEquals("abcd", user.getCustomID()); - - user.setCustomID(null); - - assertNull(user.getCustomID()); - } - - @Test - public void testAttributionID() { - User user = new User(context); - - assertNull(user.getAttributionID()); - - user.setAttributionID("abcd"); - - assertEquals("abcd", user.getAttributionID()); - - user.setAttributionID(null); - - assertNull(user.getAttributionID()); - } - - @Test - public void testProfileVersionCustomID() throws Exception { - BatchUserProfile user = Batch.getUserProfile(); - assertNotNull(user); - - user.setCustomID(null); - - long version = user.getVersion(); - assertTrue(version >= 1); - - user.setCustomID(null); - assertEquals(version, user.getVersion()); - - user.setCustomID("en"); - assertTrue(version != user.getVersion()); - - version = user.getVersion(); - user.setCustomID("en"); - assertEquals(version, user.getVersion()); - - user.setCustomID("fr"); - assertTrue(version != user.getVersion()); - - version = user.getVersion(); - user.setCustomID(null); - assertTrue(version != user.getVersion()); - } - - @Test - public void testProfileVersionRegion() throws Exception { - BatchUserProfile user = Batch.getUserProfile(); - assertNotNull(user); - - user.setRegion(null); - - long version = user.getVersion(); - assertTrue(version >= 1); - - user.setRegion(null); - assertEquals(version, user.getVersion()); - - user.setRegion("en"); - assertTrue(version != user.getVersion()); - - version = user.getVersion(); - user.setRegion("en"); - assertEquals(version, user.getVersion()); - - user.setRegion("fr"); - assertTrue(version != user.getVersion()); - - version = user.getVersion(); - user.setRegion(null); - assertTrue(version != user.getVersion()); - } - - @Test - public void testProfileVersionLanguage() throws Exception { - BatchUserProfile user = Batch.getUserProfile(); - assertNotNull(user); - - user.setLanguage(null); - - long version = user.getVersion(); - assertTrue(version >= 1); - - user.setLanguage(null); - assertEquals(version, user.getVersion()); - - user.setLanguage("en"); - assertTrue(version != user.getVersion()); - - version = user.getVersion(); - user.setLanguage("en"); - assertEquals(version, user.getVersion()); - - user.setLanguage("fr"); - assertTrue(version != user.getVersion()); - - version = user.getVersion(); - user.setLanguage(null); - assertTrue(version != user.getVersion()); - } - - @Test - public void testSerialization() throws Exception { - JSONObject json = new WebserviceImpl(context).getJSON(); - - assertFalse(json.has("upr")); - - Batch.getUserProfile().setLanguage("es").setRegion("MX"); - json = new WebserviceImpl(context).getJSON(); - - assertTrue(json.has("upr")); - - JSONObject upr = json.getJSONObject("upr"); - - assertEquals("es", upr.getString("ula")); - assertEquals("MX", upr.getString("ure")); - assertNotNull(upr.getInt("upv")); - } - - @Test - public void testAttributesRead() throws Exception { - editor.setAttribute("today", new Date()); - editor.setAttribute("float_value", 3.2); - editor.setAttribute("int_value", 4); - editor.setAttribute("url_value", new URI("batch://batch.com")); - editor.setAttribute("wrong_url_value", new URI("batch.com")); - editor.saveSync(); - - MockBatchAttributesFetchListener listener = new MockBatchAttributesFetchListener(); - - final Context ctx = RuntimeManagerProvider.get().getContext(); - UserDataAccessor.fetchAttributes(ctx, listener, false); - - Map result = listener.getAttributes(); - - assertTrue(listener.didFinish()); - assertFalse(listener.didFail()); - assertNotNull(result); - assertEquals(4, listener.getAttributes().size()); // 3 attributes were set - - BatchUserAttribute dateValue = result.get("today"); - BatchUserAttribute urlValue = result.get("url_value"); - BatchUserAttribute wrongUrlValue = result.get("wrong_url_value"); - assertNotNull(dateValue); - assertNull(dateValue.getStringValue()); - assertNull(dateValue.getNumberValue()); - assertNull(dateValue.getBooleanValue()); - assertNull(dateValue.getUriValue()); - assertNotNull(dateValue.getDateValue()); - - assertNull(wrongUrlValue); - assertNotNull(urlValue); - assertNotNull(urlValue.getUriValue()); - - // remove changes from test - editor.clearAttributes(); - editor.saveSync(); - } - - @Test - public void testTagCollectionsRead() throws Exception { - editor.clearTags(); - editor.saveSync(); - editor.addTag("collection_1", "tag_1"); - editor.addTag("collection_1", "tag_2"); - editor.addTag("collection_2", "tag_3"); - editor.addTag("collection_3", "TAG_4"); - editor.saveSync(); - - MockBatchTagCollectionsFetchListener listener = new MockBatchTagCollectionsFetchListener(); - - Context ctx = RuntimeManagerProvider.get().getContext(); - - UserDataAccessor.fetchTagCollections(ctx, listener, false); - - Map> result = listener.getTagCollections(); - - assertTrue(listener.didFinish()); - assertFalse(listener.didFail()); - assertNotNull(result); - assertEquals(result.size(), 3); // 3 collections were set - Set collection1 = result.get("collection_1"); - assertTrue(collection1.contains("tag_2")); - assertFalse(collection1.contains("tag_3")); - Set collection3 = result.get("collection_3"); - assertTrue(collection3.contains("tag_4")); // tags are set to lowercase when saved - - // remove changes from test - editor.clearTags(); - editor.saveSync(); - } - - @Test - public void testCustomDataRead() throws Exception { - // Inital test - String initialRegion = Batch.User.getRegion(context); - String initialLanguage = Batch.User.getLanguage(context); - String initialIdentifier = Batch.User.getIdentifier(context); - - assertNull(initialRegion); - assertNull(initialLanguage); - assertNull(initialIdentifier); - - editor.setRegion("az"); - editor.setLanguage("ba"); - editor.setIdentifier("pp"); - - Promise savePromise = editor.saveSync(); - - // No error - assertEquals(Promise.Status.RESOLVED, savePromise.getStatus()); - // Test reading - assertEquals("az", Batch.User.getRegion(context)); - assertEquals("ba", Batch.User.getLanguage(context)); - assertEquals("pp", Batch.User.getIdentifier(context)); - - // Clear custom data - editor.setRegion(null); - editor.setLanguage(null); - editor.setIdentifier(null); - - savePromise = editor.saveSync(); - - // No error - assertEquals(Promise.Status.RESOLVED, savePromise.getStatus()); - - // Test if clearing succeeded and that we're back to initial state. - assertNull(Batch.User.getRegion(context)); - assertNull(Batch.User.getLanguage(context)); - assertEquals(Batch.User.getRegion(context), initialRegion); - assertEquals(Batch.User.getLanguage(context), initialLanguage); - assertNull(Batch.User.getIdentifier(context)); - } - - @Test - public void testUserOperationsStacked() throws Exception { - UserModule module = DITestUtils.mockSingletonDependency(UserModule.class, null); - BatchUserDataEditor editor = Batch.User.editor(); - editor.setAttribute("dummy", "value").save(); - editor.setAttribute("dummy", "value").save(); - Batch.User.editor().setAttribute("dummy", "value").save(); - - Field fieldQueues = UserModule.class.getDeclaredField("operationQueues"); - fieldQueues.setAccessible(true); - List queues = (List) fieldQueues.get(module); - - // Ensure every editor instance has added its queue - Assert.assertEquals(3, queues.size()); - } - - public void testSetEmail() { - // Ensure we can't setEmail wihtout identifier - editor.setEmail("test@batch.com"); - assertNull(Whitebox.getInternalState(editor, "emailSubscription")); - - // Check email is too long - editor - .setIdentifier("identifier") - .setEmail( - "testastringtoolongtobeanemailtestastringtoolongtobeanemailtestastringtoolongtobeanemailtestastringtoolongtobeanemailtestastringtoo@batch.com" - ); - assertNull(Whitebox.getInternalState(editor, "emailSubscription")); - - // Ensure email is set - editor.setIdentifier("identifier").setEmail("test@batch.com"); - EmailSubscription subscription = Whitebox.getInternalState(editor, "emailSubscription"); - assertNotNull(subscription); - assertEquals("test@batch.com", Whitebox.getInternalState(subscription, "email")); - assertFalse(Whitebox.getInternalState(subscription, "deleteEmail")); - - // Ensure we will remove email - editor.setIdentifier("identifier").setEmail(null); - assertNull(Whitebox.getInternalState(subscription, "email")); - assertTrue(Whitebox.getInternalState(subscription, "deleteEmail")); - editor.save(); - } - - @Test - public void testSetAttributionIdentifierEvent() throws JSONException { - TrackerModule trackerModule = DITestUtils.mockSingletonDependency(TrackerModule.class, null); - Whitebox.setInternalState(Batch.class, "user", new User(context)); - - // Ensure attribution id is not valid - JSONObject mockParamEvent = new JSONObject(); - mockParamEvent.put("attribution_id", "abcd"); - editor.setAttributionIdentifier("abcd").saveSync(); - Mockito - .verify(trackerModule, Mockito.never()) - .track(eq(InternalEvents.ATTRIBUTION_ID_CHANGED), JSONObjectMockitoMatcher.eq(mockParamEvent)); - - // Ensure attribution id is valid and event sent - mockParamEvent.put("attribution_id", "cdda802e-fb9c-47ad-9866-0794d394c912"); - editor.setAttributionIdentifier("cdda802e-fb9c-47ad-9866-0794d394c912").saveSync(); - Mockito - .verify(trackerModule) - .track(eq(InternalEvents.ATTRIBUTION_ID_CHANGED), JSONObjectMockitoMatcher.eq(mockParamEvent)); - - // Ensure event is not sent when value did not changed - mockParamEvent.put("attribution_id", "cdda802e-fb9c-47ad-9866-0794d394c912"); - editor.setAttributionIdentifier("cdda802e-fb9c-47ad-9866-0794d394c912").saveSync(); - Mockito - .verify(trackerModule) - .track(eq(InternalEvents.ATTRIBUTION_ID_CHANGED), JSONObjectMockitoMatcher.eq(mockParamEvent)); - - // Ensure event is sent when value is an oaid - mockParamEvent.put("attribution_id", "736ada07-7697-4895-a2b8-0228d23067c7"); - editor.setAttributionIdentifier("736ada07-7697-4895-a2b8-0228d23067c7").saveSync(); - Mockito - .verify(trackerModule) - .track(eq(InternalEvents.ATTRIBUTION_ID_CHANGED), JSONObjectMockitoMatcher.eq(mockParamEvent)); - - // Ensure we send null - mockParamEvent.put("attribution_id", JSONObject.NULL); - editor.setAttributionIdentifier(null).saveSync(); - Mockito - .verify(trackerModule) - .track(eq(InternalEvents.ATTRIBUTION_ID_CHANGED), JSONObjectMockitoMatcher.eq(mockParamEvent)); - } - - @Test - public void testSetEmailSubscription() { - editor.setEmailMarketingSubscriptionState(BatchEmailSubscriptionState.SUBSCRIBED); - EmailSubscription subscription = Whitebox.getInternalState(editor, "emailSubscription"); - assertNotNull(subscription); - HashMap currentSubscription = Whitebox.getInternalState( - subscription, - "subscriptions" - ); - assertEquals(1, currentSubscription.size()); - assertEquals(EmailSubscription.Kind.MARKETING, currentSubscription.keySet().toArray()[0]); - assertEquals(BatchEmailSubscriptionState.SUBSCRIBED, currentSubscription.values().toArray()[0]); - editor.save(); - } - - public static class WebserviceImpl extends BatchWebservice { - - protected WebserviceImpl(Context context) throws MalformedURLException { - super(context, RequestType.POST, "http://test.com/%s"); - } - - public JSONObject getJSON() { - return super.getPostDataProvider().getRawData(); - } - - @Override - protected String getPropertyParameterKey() { - // TODO Auto-generated method stub - return null; - } - - @Override - protected String getURLSorterPatternParameterKey() { - // TODO Auto-generated method stub - return null; - } - - @Override - protected String getCryptorTypeParameterKey() { - // TODO Auto-generated method stub - return null; - } - - @Override - protected String getCryptorModeParameterKey() { - // TODO Auto-generated method stub - return null; - } - - @Override - protected String getPostCryptorTypeParameterKey() { - // TODO Auto-generated method stub - return null; - } - - @Override - protected String getReadCryptorTypeParameterKey() { - // TODO Auto-generated method stub - return null; - } - - @Override - protected String getSpecificConnectTimeoutKey() { - // TODO Auto-generated method stub - return null; - } - - @Override - protected String getSpecificReadTimeoutKey() { - // TODO Auto-generated method stub - return null; - } - - @Override - protected String getSpecificRetryCountKey() { - // TODO Auto-generated method stub - return null; - } - } -} diff --git a/Sources/sdk/src/test/java/com/batch/android/EmailSubscriptionTest.java b/Sources/sdk/src/test/java/com/batch/android/EmailSubscriptionTest.java deleted file mode 100644 index b1b80b5..0000000 --- a/Sources/sdk/src/test/java/com/batch/android/EmailSubscriptionTest.java +++ /dev/null @@ -1,123 +0,0 @@ -package com.batch.android; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.eq; - -import androidx.test.core.app.ApplicationProvider; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.filters.SmallTest; -import com.batch.android.di.DITest; -import com.batch.android.di.DITestUtils; -import com.batch.android.event.InternalEvents; -import com.batch.android.json.JSONException; -import com.batch.android.json.JSONObject; -import com.batch.android.module.TrackerModule; -import com.batch.android.user.EmailSubscription; -import java.util.HashMap; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.powermock.reflect.Whitebox; - -@RunWith(AndroidJUnit4.class) -@SmallTest -public class EmailSubscriptionTest extends DITest { - - private EmailSubscription emailSubscription; - - private TrackerModule trackerModule; - - @Before - public void setUp() { - super.setUp(); - simulateBatchStart(ApplicationProvider.getApplicationContext()); - Batch.User.editor().setIdentifier("id_test").saveSync(); - this.emailSubscription = new EmailSubscription(); - this.trackerModule = DITestUtils.mockSingletonDependency(TrackerModule.class, null); - } - - @After - public void tearDown() { - super.tearDown(); - } - - @Test - public void testSetEmail() { - assertNull(Whitebox.getInternalState(emailSubscription, "email")); - emailSubscription.setEmail("test@batch.com"); - assertEquals("test@batch.com", Whitebox.getInternalState(emailSubscription, "email")); - emailSubscription.setEmail(null); - assertNull(Whitebox.getInternalState(emailSubscription, "email")); - assertTrue(Whitebox.getInternalState(emailSubscription, "deleteEmail")); - } - - @Test - public void testAddSubscription() { - emailSubscription.addSubscription(EmailSubscription.Kind.MARKETING, BatchEmailSubscriptionState.SUBSCRIBED); - HashMap currentSubscription = Whitebox.getInternalState( - emailSubscription, - "subscriptions" - ); - assertEquals(1, currentSubscription.size()); - assertEquals(EmailSubscription.Kind.MARKETING, currentSubscription.keySet().toArray()[0]); - assertEquals(BatchEmailSubscriptionState.SUBSCRIBED, currentSubscription.values().toArray()[0]); - } - - @Test - public void testSendEmailOnly() throws JSONException { - JSONObject expected = new JSONObject(); - expected.put("custom_id", "id_test"); - expected.put("email", "test@batch.com"); - - emailSubscription.setEmail("test@batch.com"); - emailSubscription.sendEmailSubscriptionEvent(); - - Mockito.verify(trackerModule).track(eq(InternalEvents.EMAIL_CHANGED), JSONObjectMockitoMatcher.eq(expected)); - } - - @Test - public void testSendEmailNullOnly() throws JSONException { - JSONObject expected = new JSONObject(); - expected.put("custom_id", "id_test"); - expected.put("email", JSONObject.NULL); - - emailSubscription.setEmail(null); - emailSubscription.sendEmailSubscriptionEvent(); - - Mockito.verify(trackerModule).track(eq(InternalEvents.EMAIL_CHANGED), JSONObjectMockitoMatcher.eq(expected)); - } - - @Test - public void testSendEmailSubscriptionOnly() throws JSONException { - JSONObject expected = new JSONObject(); - expected.put("custom_id", "id_test"); - JSONObject expectedSub = new JSONObject(); - expectedSub.put("marketing", "subscribed"); - expected.put("subscriptions", expectedSub); - - emailSubscription.addSubscription(EmailSubscription.Kind.MARKETING, BatchEmailSubscriptionState.SUBSCRIBED); - emailSubscription.sendEmailSubscriptionEvent(); - - Mockito.verify(trackerModule).track(eq(InternalEvents.EMAIL_CHANGED), JSONObjectMockitoMatcher.eq(expected)); - } - - @Test - public void testSendEmailSubscriptionFull() throws JSONException { - JSONObject expected = new JSONObject(); - expected.put("custom_id", "id_test"); - expected.put("email", "test@batch.com"); - JSONObject expectedSub = new JSONObject(); - expectedSub.put("marketing", "subscribed"); - expected.put("subscriptions", expectedSub); - - emailSubscription.setEmail("test@batch.com"); - emailSubscription.addSubscription(EmailSubscription.Kind.MARKETING, BatchEmailSubscriptionState.SUBSCRIBED); - emailSubscription.sendEmailSubscriptionEvent(); - - Mockito.verify(trackerModule).track(eq(InternalEvents.EMAIL_CHANGED), JSONObjectMockitoMatcher.eq(expected)); - } -} diff --git a/Sources/sdk/src/test/java/com/batch/android/JSONObjectMockitoMatcher.java b/Sources/sdk/src/test/java/com/batch/android/JSONObjectMockitoMatcher.java index 84f226d..7365d03 100644 --- a/Sources/sdk/src/test/java/com/batch/android/JSONObjectMockitoMatcher.java +++ b/Sources/sdk/src/test/java/com/batch/android/JSONObjectMockitoMatcher.java @@ -1,5 +1,6 @@ package com.batch.android; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.batch.android.json.JSONObject; import org.mockito.ArgumentMatcher; @@ -30,4 +31,10 @@ public boolean matches(JSONObject argument) { public static JSONObject eq(@Nullable JSONObject expected) { return Mockito.argThat(new JSONObjectMockitoMatcher(expected)); } + + @NonNull + @Override + public String toString() { + return "JSONObjectMockitoMatcher{" + "expected=" + expected + '}'; + } } diff --git a/Sources/sdk/src/test/java/com/batch/android/JSONObjectPartialMatcher.java b/Sources/sdk/src/test/java/com/batch/android/JSONObjectPartialMatcher.java new file mode 100644 index 0000000..35016fa --- /dev/null +++ b/Sources/sdk/src/test/java/com/batch/android/JSONObjectPartialMatcher.java @@ -0,0 +1,60 @@ +package com.batch.android; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.batch.android.json.JSONArray; +import com.batch.android.json.JSONException; +import com.batch.android.json.JSONObject; +import org.mockito.ArgumentMatcher; +import org.mockito.Mockito; + +public class JSONObjectPartialMatcher implements ArgumentMatcher { + + @Nullable + private final JSONObject expected; + + public JSONObjectPartialMatcher(@Nullable JSONObject expected) { + this.expected = expected; + } + + @Override + public boolean matches(JSONObject argument) { + return isJSONObjectEqual(expected, argument); + } + + private boolean isJSONObjectEqual(JSONObject expected, JSONObject actual) { + if (expected == null) { + return actual == null; + } + + if (actual == expected) { + return true; + } + for (String key : expected.keySet()) { + try { + if (!expected.get(key).equals(actual.get(key))) { + if (expected.get(key) instanceof JSONObject) { + return isJSONObjectEqual(expected.getJSONObject(key), actual.getJSONObject(key)); + } else if (expected.get(key) instanceof JSONArray) { + //FIXME: This is shit but does the job as long we respect the order + return expected.get(key).toString().equals(actual.get(key).toString()); + } + return false; + } + } catch (JSONException e) { + return false; + } + } + return true; + } + + public static JSONObject eq(@Nullable JSONObject expected) { + return Mockito.argThat(new JSONObjectPartialMatcher(expected)); + } + + @NonNull + @Override + public String toString() { + return "JSONObjectPartialMatcher{" + "expected=" + expected + '}'; + } +} diff --git a/Sources/sdk/src/test/java/com/batch/android/ModuleStatusTest.java b/Sources/sdk/src/test/java/com/batch/android/ModuleStatusTest.java deleted file mode 100644 index 0195f0d..0000000 --- a/Sources/sdk/src/test/java/com/batch/android/ModuleStatusTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.batch.android; - -import static org.junit.Assert.assertEquals; - -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.filters.SmallTest; -import com.batch.android.di.DITest; -import com.batch.android.di.providers.PushModuleProvider; -import org.junit.Test; -import org.junit.runner.RunWith; - -/** - * Test statuses of Modules - * - */ -@RunWith(AndroidJUnit4.class) -@SmallTest -public class ModuleStatusTest extends DITest { - - @Test - public void testPushModuleStatus() throws Exception { - assertEquals(2, PushModuleProvider.get().getState()); - - Batch.Push.setGCMSenderId("test"); - - assertEquals(1, PushModuleProvider.get().getState()); - - Batch.Push.setGCMSenderId(null); - - assertEquals(2, PushModuleProvider.get().getState()); - } -} diff --git a/Sources/sdk/src/test/java/com/batch/android/ProfileModuleTest.kt b/Sources/sdk/src/test/java/com/batch/android/ProfileModuleTest.kt new file mode 100644 index 0000000..422c9b7 --- /dev/null +++ b/Sources/sdk/src/test/java/com/batch/android/ProfileModuleTest.kt @@ -0,0 +1,350 @@ +package com.batch.android + +import android.content.Context +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.batch.android.di.DITest +import com.batch.android.di.DITestUtils +import com.batch.android.di.providers.ProfileModuleProvider +import com.batch.android.di.providers.SQLUserDatasourceProvider +import com.batch.android.di.providers.UserModuleProvider +import com.batch.android.event.EventAttributesSerializer +import com.batch.android.event.InternalEvents +import com.batch.android.json.JSONArray +import com.batch.android.json.JSONObject +import com.batch.android.module.ProfileModule +import com.batch.android.module.TrackerModule +import com.batch.android.query.response.AttributesCheckResponse +import com.batch.android.query.response.AttributesSendResponse +import com.batch.android.webservice.listener.impl.AttributesCheckWebserviceListenerImpl +import com.batch.android.webservice.listener.impl.AttributesSendWebserviceListenerImpl +import org.junit.Assert +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentMatchers +import org.mockito.Mockito +import org.powermock.reflect.Whitebox +import java.net.URI +import java.util.Date +import java.util.EnumSet + +@RunWith(AndroidJUnit4::class) +@SmallTest +class ProfileModuleTest : DITest() { + + private lateinit var context: Context + private lateinit var trackerModule : TrackerModule + + override fun setUp() { + super.setUp() + context = ApplicationProvider.getApplicationContext() + Whitebox.setInternalState(Batch::class.java, "install", Install(context)) + trackerModule = DITestUtils.mockSingletonDependency(TrackerModule::class.java, null) + } + + @Test + fun testIdentifyWithNullID() { + simulateBatchStart(context) + + // Default custom id + UserModuleProvider.get().setCustomID(context, "default_cus_test") + + // Given custom id + val customID = null + + // Expected profile identify payload + val expectedParams = JSONObject() + val identifiers = JSONObject() + identifiers.put("custom_id", JSONObject.NULL) + identifiers.put("install_id", Batch.User.getInstallationID()) + expectedParams.put("identifiers", identifiers) + + // Expected profile changed payload (no cus key) + val expectedProfileChangedParams = JSONObject() + expectedProfileChangedParams.put("upv", UserModuleProvider.get().getVersion(context) +1) + + ProfileModuleProvider.get().identify(customID) + + // Verify events are triggered + Mockito.verify(trackerModule, Mockito.timeout(1500).times(1)) + .track(ArgumentMatchers.eq(InternalEvents.PROFILE_IDENTIFY), JSONObjectMockitoMatcher.eq(expectedParams)) + + // Ensure custom identifier has been locally saved + Assert.assertNull(UserModuleProvider.get().getCustomID(context)) + } + + @Test + fun testIdentifyWithValidID() { + simulateBatchStart(context) + + // Given custom id + val customID = "my_test_id" + + // Expected profile identify payload + val expectedParams = JSONObject() + val identifiers = JSONObject() + identifiers.put("custom_id", customID) + identifiers.put("install_id", Batch.User.getInstallationID()) + expectedParams.put("identifiers", identifiers) + + // Expected profile changed payload + val expectedProfileChangedParams = JSONObject() + expectedProfileChangedParams.put("cus", customID) + expectedProfileChangedParams.put("upv", UserModuleProvider.get().getVersion(context) +1) + + ProfileModuleProvider.get().identify(customID) + + // Verify events are triggered + Mockito.verify(trackerModule, Mockito.timeout(1500).times(1)) + .track(ArgumentMatchers.eq(InternalEvents.PROFILE_IDENTIFY), JSONObjectMockitoMatcher.eq(expectedParams)) + + // Ensure custom identifier has been locally saved + Assert.assertEquals(customID, UserModuleProvider.get().getCustomID(context)) + } + + @Test + fun testIdentifyWithInvalidID() { + simulateBatchStart(context) + + // Given custom id (1025 char) + val customID = "my_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_id_1111" + + // Expected profile identify payload + val expectedParams = JSONObject() + val identifiers = JSONObject() + identifiers.put("custom_id", customID) + identifiers.put("install_id", Batch.User.getInstallationID()) + expectedParams.put("identifiers", identifiers) + + // Expected profile changed payload + val expectedProfileChangedParams = JSONObject() + expectedProfileChangedParams.put("cus", customID) + expectedProfileChangedParams.put("upv", UserModuleProvider.get().getVersion(context) +1) + + ProfileModuleProvider.get().identify(customID) + + // Verify events are not triggered + Mockito.verify(trackerModule, Mockito.never()) + .track(ArgumentMatchers.eq(InternalEvents.PROFILE_IDENTIFY), JSONObjectMockitoMatcher.eq(expectedParams)) + + // Ensure custom identifier is still null + Assert.assertNull(UserModuleProvider.get().getCustomID(context)) + } + + @Test + fun testTrackPublicEvent() { + simulateBatchStart(context) + val eventData = BatchEventAttributes().apply { + put("my_car", BatchEventAttributes().apply { + put("brand", "car_brand") + put("year", 2024) + put("4x4", false) + put("model_url", URI("https://batch.com/")) + put("engine", BatchEventAttributes().apply { + put("manufacturer", "manu") + put("cylinders", 6) + put("cylinder_capacity", 3.5) + put("manufacturing_date", Date(1596975143943L)) + }) + }) + put("string_attr", "a_test_string") + put("int_attr", 13) + put("double_attr", 13.4567) + put("date_attr", Date(1596975143943L)) //"2020-08-09T12:12:23.943Z" + put("url_attr", URI("https://batch.com/")) + putStringList("string_list", listOf("A", "B", "C")) + putObjectList("list_items", listOf( + BatchEventAttributes().apply { + put("brand", "brand-1") + put("year", 1998) + }, + BatchEventAttributes().apply { + put("brand", "brand-2") + put("year", 2000) + } + )) + put("\$label", "test_label") + putStringList("\$tags", listOf("tagA", "tagB", "tagC")) + } + ProfileModuleProvider.get().trackPublicEvent("test_event", eventData) + Mockito.verify(trackerModule, Mockito.times(1)).track(ArgumentMatchers.eq("E.TEST_EVENT"), JSONObjectPartialMatcher.eq(EventAttributesSerializer.serialize(eventData))) + } + + @Test + fun testOnProjectChanged() { + simulateBatchStart(context) + val fakeProjectKey = "project_1234567890" + val profileModule = DITestUtils.mockSingletonDependency(ProfileModule::class.java, null) + val atcResponse = AttributesCheckResponse("test_query_id").apply { + setActionString("OK") + projectKey = fakeProjectKey + } + AttributesCheckWebserviceListenerImpl().onSuccess(atcResponse) + Mockito.verify(profileModule, Mockito.times(1)).onProjectChanged(null, fakeProjectKey) + } + + @Test + fun testOnProjectDidNotChanged() { + simulateBatchStart(context) + val fakeProjectKey = "project_1234567890" + val profileModule = DITestUtils.mockSingletonDependency(ProfileModule::class.java, null) + + // We are simulating a fresh install on sdk V2 where use has wrote data to the profile + val atsResponse = AttributesSendResponse("test_query_id").apply { + transactionID = "fake_transaction_id" + version = 1 + projectKey = fakeProjectKey + } + AttributesSendWebserviceListenerImpl().onSuccess(atsResponse) + val atcResponse = AttributesCheckResponse("test_query_id").apply { + setActionString("OK") + projectKey = fakeProjectKey + } + AttributesCheckWebserviceListenerImpl().onSuccess(atcResponse) + // Ensuring onProjectChanged is not triggered + Mockito.verify(profileModule, Mockito.never()).onProjectChanged(null, fakeProjectKey) + } + + @Test + fun testCustomUserIdMigration() { + // Start Batch + simulateBatchStart(context) + + // Set default custom user id + val customUserId = "fake-custom-user-id" + UserModuleProvider.get().setCustomID(context, customUserId) + + // Trigger on project changed + ProfileModuleProvider.get().onProjectChanged(null, "project_1234567890") + + // Ensure identify event is triggered + val expectedParams = JSONObject() + val identifiers = JSONObject() + identifiers.put("custom_id", customUserId) + identifiers.put("install_id", Batch.User.getInstallationID()) + expectedParams.put("identifiers", identifiers) + + Mockito.verify(trackerModule, Mockito.times(1)) + .track(ArgumentMatchers.eq(InternalEvents.PROFILE_IDENTIFY), JSONObjectMockitoMatcher.eq(expectedParams)) + } + + @Test + fun testCustomUserIdMigrationDisabled() { + // Disable migration + Batch.disableMigration(EnumSet.of(BatchMigration.CUSTOM_ID)) + + // Start Batch + simulateBatchStart(context) + + // Set default custom user id + val customUserId = "fake-custom-user-id" + UserModuleProvider.get().setCustomID(context, customUserId) + + // Trigger on project changed + ProfileModuleProvider.get().onProjectChanged(null, "project_1234567890") + + // Ensure identify event is triggered + val expectedParams = JSONObject() + val identifiers = JSONObject() + identifiers.put("custom_id", customUserId) + identifiers.put("install_id", Batch.User.getInstallationID()) + expectedParams.put("identifiers", identifiers) + + Mockito.verify(trackerModule, Mockito.never()) + .track(ArgumentMatchers.eq(InternalEvents.PROFILE_IDENTIFY), JSONObjectMockitoMatcher.eq(expectedParams)) + } + + @Test + fun testCustomDataMigration() { + // Start Batch + simulateBatchStart(context) + + // Set default custom user language and region + UserModuleProvider.get().setLanguage(context, "fr") + UserModuleProvider.get().setRegion(context, "FR") + + // Set legacy custom attributes + SQLUserDatasourceProvider.get(context).apply { + acquireTransactionLock(1) + setAttribute("string_att", "hello") + setAttribute("int_att", 3) + setAttribute("double_att", 3.6) + setAttribute("url_att", URI("https://batch.com/pricing")) + addTag("array_att","attr1") + addTag("array_att","attr2") + commitTransaction() + } + + // Trigger on project changed + ProfileModuleProvider.get().onProjectChanged(null, "project_1234567890") + + // Expected Params + val expectedParams = JSONObject().apply { + put("language", "fr") + put("region", "FR") + put("custom_attributes", JSONObject().apply { + put("string_att.s", "hello") + put("int_att.i", 3L) + put("double_att.f", 3.6) + put("url_att.u", URI("https://batch.com/pricing")) + put("array_att.a", JSONArray().apply { + put("attr2") + put("attr1") + }) + }) + } + + // Ensure profile data changed trigger with expected parameters + Mockito.verify(trackerModule, Mockito.timeout(100).times(1)) + .track(ArgumentMatchers.eq(InternalEvents.PROFILE_DATA_CHANGED), JSONObjectPartialMatcher.eq(expectedParams)) + } + + @Test + fun testCustomDataMigrationDisabled() { + // Disable migration + Batch.disableMigration(EnumSet.of(BatchMigration.CUSTOM_DATA)) + + // Start Batch + simulateBatchStart(context) + + // Set default custom user language and region + UserModuleProvider.get().setLanguage(context, "fr") + UserModuleProvider.get().setRegion(context, "FR") + + // Set legacy custom attributes + SQLUserDatasourceProvider.get(context).apply { + acquireTransactionLock(1) + setAttribute("string_att", "hello") + setAttribute("int_att", 3) + setAttribute("double_att", 3.6) + setAttribute("url_att", URI("https://batch.com/pricing")) + addTag("array_att","attr1") + addTag("array_att","attr2") + commitTransaction() + } + + // Trigger on project changed + ProfileModuleProvider.get().onProjectChanged(null, "project_1234567890") + + // Expected Params + val expectedParams = JSONObject().apply { + put("language", "fr") + put("region", "FR") + put("custom_attributes", JSONObject().apply { + put("string_att.s", "hello") + put("int_att.i", 3L) + put("double_att.f", 3.6) + put("url_att.u", URI("https://batch.com/pricing")) + put("array_att.a", JSONArray().apply { + put("attr2") + put("attr1") + }) + }) + } + + // Ensure profile data changed trigger with expected parameters + Mockito.verify(trackerModule, Mockito.timeout(100).times(0)) + .track(ArgumentMatchers.eq(InternalEvents.PROFILE_DATA_CHANGED), JSONObjectPartialMatcher.eq(expectedParams)) + } +} \ No newline at end of file diff --git a/Sources/sdk/src/test/java/com/batch/android/TestActivity.java b/Sources/sdk/src/test/java/com/batch/android/TestActivity.java index 8f15f77..53658d6 100644 --- a/Sources/sdk/src/test/java/com/batch/android/TestActivity.java +++ b/Sources/sdk/src/test/java/com/batch/android/TestActivity.java @@ -11,7 +11,7 @@ public class TestActivity extends Activity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - Batch.setConfig(new Config("TEST_API_KEY")); + Batch.start("TEST_API_KEY"); Batch.onCreate(this); } diff --git a/Sources/sdk/src/test/java/com/batch/android/TestApplication.java b/Sources/sdk/src/test/java/com/batch/android/TestApplication.java index 82d475b..d5d8576 100644 --- a/Sources/sdk/src/test/java/com/batch/android/TestApplication.java +++ b/Sources/sdk/src/test/java/com/batch/android/TestApplication.java @@ -7,6 +7,6 @@ public class TestApplication extends Application { @Override public void onCreate() { super.onCreate(); - Batch.setConfig(new com.batch.android.Config("FAKE_API_KEY")); + Batch.start("FAKE_API_KEY"); } } diff --git a/Sources/sdk/src/test/java/com/batch/android/actions/ActionModuleTest.java b/Sources/sdk/src/test/java/com/batch/android/actions/ActionModuleTest.java index 1f50c32..be8d39d 100644 --- a/Sources/sdk/src/test/java/com/batch/android/actions/ActionModuleTest.java +++ b/Sources/sdk/src/test/java/com/batch/android/actions/ActionModuleTest.java @@ -16,7 +16,6 @@ import androidx.test.filters.MediumTest; import com.batch.android.Batch; import com.batch.android.BatchTagCollectionsFetchListener; -import com.batch.android.Config; import com.batch.android.UserAction; import com.batch.android.UserActionRunnable; import com.batch.android.UserActionSource; @@ -42,11 +41,9 @@ public class ActionModuleTest extends DITest { @Before public void setUp() { ShadowLog.stream = System.out; - context = ApplicationProvider.getApplicationContext(); - RuntimeManagerProvider.get().setContext(context); - Batch.setConfig(new Config(apiKey)); + Batch.start(apiKey); } @Test diff --git a/Sources/sdk/src/test/java/com/batch/android/actions/UserEventActionTest.java b/Sources/sdk/src/test/java/com/batch/android/actions/UserEventActionTest.java index 9074a74..0b30eeb 100644 --- a/Sources/sdk/src/test/java/com/batch/android/actions/UserEventActionTest.java +++ b/Sources/sdk/src/test/java/com/batch/android/actions/UserEventActionTest.java @@ -1,20 +1,20 @@ package com.batch.android.actions; -import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR2; -import static android.os.Build.VERSION_CODES.P; import static org.mockito.ArgumentMatchers.eq; import android.content.Context; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.MediumTest; +import com.batch.android.BatchEventAttributes; import com.batch.android.di.DITest; import com.batch.android.di.DITestUtils; import com.batch.android.di.providers.RuntimeManagerProvider; import com.batch.android.json.JSONException; import com.batch.android.json.JSONObject; import com.batch.android.module.ActionModule; -import com.batch.android.module.UserModule; +import com.batch.android.module.ProfileModule; +import java.util.Date; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -22,7 +22,6 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; -import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowLog; @RunWith(AndroidJUnit4.class) @@ -31,6 +30,8 @@ public class UserEventActionTest extends DITest { private Context context; + private ProfileModule profileModule; + @Before public void setUp() { ShadowLog.stream = System.out; @@ -38,112 +39,110 @@ public void setUp() { context = ApplicationProvider.getApplicationContext(); RuntimeManagerProvider.get().setContext(context); + + profileModule = DITestUtils.mockSingletonDependency(ProfileModule.class, null); } @Test public void testTrackEventAction() throws JSONException { ActionModule actionModule = new ActionModule(); - UserModule userModule = DITestUtils.mockSingletonDependency(UserModule.class, null); PowerMockito .doNothing() - .when(userModule) - .trackPublicEvent(Mockito.anyString(), Mockito.anyString(), Mockito.any(JSONObject.class)); + .when(profileModule) + .trackPublicEvent(Mockito.anyString(), Mockito.any(BatchEventAttributes.class)); - ArgumentCaptor eventDataCaptor = ArgumentCaptor.forClass(JSONObject.class); + ArgumentCaptor eventDataCaptor = ArgumentCaptor.forClass(BatchEventAttributes.class); String eventJSON = "{'e':'event_test', 'l':'label_test'}"; actionModule.performAction(context, "batch.user.event", new JSONObject(eventJSON), null); - Mockito.verify(userModule).trackPublicEvent(eq("event_test"), eq("label_test"), eventDataCaptor.capture()); + Mockito.verify(profileModule).trackPublicEvent(eq("event_test"), eventDataCaptor.capture()); - JSONObject eventData = eventDataCaptor.getValue(); + BatchEventAttributes eventData = eventDataCaptor.getValue(); Assert.assertNotNull(eventData); - Assert.assertNotNull(eventData.getJSONObject("attributes")); - Assert.assertTrue(eventData.getJSONObject("attributes").keySet().isEmpty()); - Assert.assertNotNull(eventData.getJSONArray("tags")); - Assert.assertEquals(0, eventData.getJSONArray("tags").length()); + Assert.assertNotNull(eventData.getAttributes()); + Assert.assertNotNull(eventData.getLabel()); + Assert.assertEquals("label_test", eventData.getLabel()); + Assert.assertTrue(eventData.getAttributes().isEmpty()); + Assert.assertNull(eventData.getTags()); } @Test public void testTrackEventWithoutLabelAction() throws JSONException { ActionModule actionModule = new ActionModule(); - UserModule userModule = DITestUtils.mockSingletonDependency(UserModule.class, null); PowerMockito .doNothing() - .when(userModule) - .trackPublicEvent(Mockito.anyString(), Mockito.anyString(), Mockito.any(JSONObject.class)); + .when(profileModule) + .trackPublicEvent(Mockito.anyString(), Mockito.any(BatchEventAttributes.class)); - ArgumentCaptor eventDataCaptor = ArgumentCaptor.forClass(JSONObject.class); + ArgumentCaptor eventDataCaptor = ArgumentCaptor.forClass(BatchEventAttributes.class); String eventJSON = "{'e':'event_test'}"; actionModule.performAction(context, "batch.user.event", new JSONObject(eventJSON), null); - Mockito.verify(userModule).trackPublicEvent(eq("event_test"), eq(null), eventDataCaptor.capture()); + Mockito.verify(profileModule).trackPublicEvent(eq("event_test"), eventDataCaptor.capture()); - JSONObject eventData = eventDataCaptor.getValue(); - Assert.assertNotNull(eventData); - Assert.assertNotNull(eventData.getJSONObject("attributes")); - Assert.assertTrue(eventData.getJSONObject("attributes").keySet().isEmpty()); - Assert.assertNotNull(eventData.getJSONArray("tags")); - Assert.assertEquals(0, eventData.getJSONArray("tags").length()); + BatchEventAttributes eventData = eventDataCaptor.getValue(); + Assert.assertNotNull(eventData.getAttributes()); + Assert.assertNull(eventData.getLabel()); + Assert.assertNull(eventData.getTags()); } @Test public void testTrackEventWithTagsAction() throws JSONException { ActionModule actionModule = new ActionModule(); - UserModule userModule = DITestUtils.mockSingletonDependency(UserModule.class, null); PowerMockito .doNothing() - .when(userModule) - .trackPublicEvent(Mockito.anyString(), Mockito.anyString(), Mockito.any(JSONObject.class)); + .when(profileModule) + .trackPublicEvent(Mockito.anyString(), Mockito.any(BatchEventAttributes.class)); - ArgumentCaptor eventDataCaptor = ArgumentCaptor.forClass(JSONObject.class); + ArgumentCaptor eventDataCaptor = ArgumentCaptor.forClass(BatchEventAttributes.class); String eventJSON = "{'e':'event_test', 'l':'label_test', 't':['tag1', 'tag2', 'tag3']}"; actionModule.performAction(context, "batch.user.event", new JSONObject(eventJSON), null); - Mockito.verify(userModule).trackPublicEvent(eq("event_test"), eq("label_test"), eventDataCaptor.capture()); + Mockito.verify(profileModule).trackPublicEvent(eq("event_test"), eventDataCaptor.capture()); - JSONObject eventData = eventDataCaptor.getValue(); + BatchEventAttributes eventData = eventDataCaptor.getValue(); Assert.assertNotNull(eventData); - Assert.assertNotNull(eventData.getJSONObject("attributes")); - Assert.assertTrue(eventData.getJSONObject("attributes").keySet().isEmpty()); - Assert.assertNotNull(eventData.getJSONArray("tags")); - Assert.assertEquals(3, eventData.getJSONArray("tags").length()); - Assert.assertEquals("tag1", eventData.getJSONArray("tags").optString(0)); - Assert.assertEquals("tag2", eventData.getJSONArray("tags").optString(1)); - Assert.assertEquals("tag3", eventData.getJSONArray("tags").optString(2)); + Assert.assertNotNull(eventData.getAttributes()); + Assert.assertNotNull(eventData.getTags()); + Assert.assertEquals(3, eventData.getTags().size()); + Assert.assertEquals("label_test", eventData.getLabel()); + Assert.assertTrue(eventData.getTags().contains("tag1")); + Assert.assertTrue(eventData.getTags().contains("tag2")); + Assert.assertTrue(eventData.getTags().contains("tag3")); } @Test - @Config(sdk = { JELLY_BEAN_MR2, P }) public void testTrackEventWithAttrAction() throws JSONException { ActionModule actionModule = new ActionModule(); - UserModule userModule = DITestUtils.mockSingletonDependency(UserModule.class, null); PowerMockito .doNothing() - .when(userModule) - .trackPublicEvent(Mockito.anyString(), Mockito.anyString(), Mockito.any(JSONObject.class)); + .when(profileModule) + .trackPublicEvent(Mockito.anyString(), Mockito.any(BatchEventAttributes.class)); - ArgumentCaptor eventDataCaptor = ArgumentCaptor.forClass(JSONObject.class); + ArgumentCaptor eventDataCaptor = ArgumentCaptor.forClass(BatchEventAttributes.class); String eventJSON = "{'e':'event_test', 'l':'label_test', 'a':{'bool':true, 'int':64, 'double': 68987.256, 'string':'tototo', 'date': '2020-08-09T12:12:23.943Z'}}}"; actionModule.performAction(context, "batch.user.event", new JSONObject(eventJSON), null); - Mockito.verify(userModule).trackPublicEvent(eq("event_test"), eq("label_test"), eventDataCaptor.capture()); + Mockito.verify(profileModule).trackPublicEvent(eq("event_test"), eventDataCaptor.capture()); - JSONObject eventData = eventDataCaptor.getValue(); + BatchEventAttributes eventData = eventDataCaptor.getValue(); Assert.assertNotNull(eventData); - Assert.assertNotNull(eventData.getJSONObject("attributes")); - Assert.assertTrue(eventData.getJSONObject("attributes").optBoolean("bool.b")); - Assert.assertEquals(64, eventData.getJSONObject("attributes").optInt("int.i")); - Assert.assertEquals(68987.256, eventData.getJSONObject("attributes").optDouble("double.f"), 0); - Assert.assertEquals("tototo", eventData.getJSONObject("attributes").optString("string.s")); - Assert.assertEquals(1596975143943L, eventData.getJSONObject("attributes").optLong("date.t")); - - Assert.assertNotNull(eventData.getJSONArray("tags")); - Assert.assertEquals(0, eventData.getJSONArray("tags").length()); + Assert.assertNotNull(eventData.getAttributes()); + Assert.assertNotNull(eventData.getLabel()); + Assert.assertEquals("label_test", eventData.getLabel()); + Assert.assertEquals(5, eventData.getAttributes().size()); + Assert.assertTrue((Boolean) eventData.getAttributes().get("bool").value); + Assert.assertEquals(64, eventData.getAttributes().get("int").value); + Assert.assertEquals(68987.256, eventData.getAttributes().get("double").value); + Assert.assertEquals("tototo", eventData.getAttributes().get("string").value); + Assert.assertEquals(1596975143943L, eventData.getAttributes().get("date").value); + + Assert.assertNull(eventData.getTags()); } } diff --git a/Sources/sdk/src/test/java/com/batch/android/core/DeeplinkTest.java b/Sources/sdk/src/test/java/com/batch/android/core/DeeplinkTest.java index cce2751..5f5711d 100644 --- a/Sources/sdk/src/test/java/com/batch/android/core/DeeplinkTest.java +++ b/Sources/sdk/src/test/java/com/batch/android/core/DeeplinkTest.java @@ -1,23 +1,16 @@ package com.batch.android.core; -import static android.os.Build.VERSION_CODES.JELLY_BEAN; -import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR1; -import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR2; -import static android.os.Build.VERSION_CODES.P; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import android.content.Intent; import android.net.Uri; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; -import java.util.Objects; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.annotation.Config; /** * Test various deeplink features, such as the generation of a custom tab intent @@ -53,31 +46,4 @@ public void testCustomTabSchemes() { assertFalse(DeeplinkHelper.customTabSupportsURI(Uri.parse("foobar://batch.com"))); } - - @Test - @Config(sdk = { JELLY_BEAN_MR2, P }) - public void testCustomTabIntent() { - final String deeplink = "https://batch.com"; - - final Intent intent = DeeplinkHelper.getIntent(deeplink, true, true); - assertNotNull(intent); - assertEquals(0, (intent.getFlags() & Intent.FLAG_ACTIVITY_NEW_TASK)); - - assertTrue(intent.getBooleanExtra("android.support.customtabs.extra.SHARE_MENU_ITEM", false)); - assertTrue(Objects.requireNonNull(intent.getExtras()).containsKey("android.support.customtabs.extra.SESSION")); - } - - @Test - @Config(sdk = { JELLY_BEAN, JELLY_BEAN_MR1 }) - public void testCustomTabOnOlderAPI() { - final String deeplink = "https://batch.com"; - - assertNull(DeeplinkHelper.getCustomTabIntent(Uri.parse(deeplink))); - - final Intent intent = DeeplinkHelper.getIntent(deeplink, true, true); - assertNotNull(intent); - assertEquals(Intent.FLAG_ACTIVITY_NEW_TASK, (intent.getFlags() & Intent.FLAG_ACTIVITY_NEW_TASK)); - - assertNull(intent.getExtras()); - } } diff --git a/Sources/sdk/src/test/java/com/batch/android/core/EmailValidationTest.java b/Sources/sdk/src/test/java/com/batch/android/core/EmailValidationTest.java deleted file mode 100644 index a9aab7a..0000000 --- a/Sources/sdk/src/test/java/com/batch/android/core/EmailValidationTest.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.batch.android.core; - -import org.junit.Assert; -import org.junit.Test; - -/** - * Test email formats - * - */ -public class EmailValidationTest { - - /** - * Tests email patterns - */ - @Test - public void testEmailPatterns() { - Assert.assertTrue(GenericHelper.isValidEmail("foo@batch.com")); - Assert.assertTrue(GenericHelper.isValidEmail("bar@foo.batch.com")); - Assert.assertTrue(GenericHelper.isValidEmail("bar+foo@batch.com")); - Assert.assertTrue(GenericHelper.isValidEmail("FOObar@Test.Batch.COM")); - - Assert.assertFalse(GenericHelper.isValidEmail("@gmail.com")); - Assert.assertFalse(GenericHelper.isValidEmail("invalid@gmail")); - Assert.assertFalse(GenericHelper.isValidEmail("inva lid@gmail.com")); - Assert.assertFalse(GenericHelper.isValidEmail("invalid@gmail .com")); - Assert.assertFalse(GenericHelper.isValidEmail("invalid@inva lid.gmail.com")); - } -} diff --git a/Sources/sdk/src/test/java/com/batch/android/core/ObjectUserPreferencesStorageTest.java b/Sources/sdk/src/test/java/com/batch/android/core/ObjectUserPreferencesStorageTest.java deleted file mode 100644 index 1208ceb..0000000 --- a/Sources/sdk/src/test/java/com/batch/android/core/ObjectUserPreferencesStorageTest.java +++ /dev/null @@ -1,143 +0,0 @@ -package com.batch.android.core; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; - -import android.content.Context; -import androidx.test.core.app.ApplicationProvider; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.filters.SmallTest; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -/** - * Test UserPreferences object storage - * - */ -@RunWith(AndroidJUnit4.class) -@SmallTest -public class ObjectUserPreferencesStorageTest { - - private Context appContext; - - @Before - public void setUp() { - appContext = ApplicationProvider.getApplicationContext(); - } - - /** - * Test one write & read - * - * @throws Exception - */ - @Test - public void testUserPreferencesWriteRead() throws Exception { - String key = "wrkey"; - ObjectTest obj = generateObject(); - - ObjectUserPreferencesStorage storage = new ObjectUserPreferencesStorage(appContext); - storage.persist(key, obj); - - assertEquals(obj, storage.get(key)); - } - - /** - * Test write & delete - * - * @throws Exception - */ - @Test - public void testUserPreferencesDelete() throws Exception { - String key = "delkey"; - ObjectTest obj = generateObject(); - - ObjectUserPreferencesStorage storage = new ObjectUserPreferencesStorage(appContext); - storage.persist(key, obj); - - assertNotNull(storage.get(key)); - - storage.remove(key); - - assertNull(storage.get(key)); - } - - // ---------------------------------------------> - - /** - * A test object that implements Serializable - * - */ - private static class ObjectTest implements Serializable { - - private static final long serialVersionUID = 1L; - - public String id; - public Map values = new HashMap<>(); - public List array = new ArrayList<>(); - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - - if (obj == null) { - return false; - } - - if (getClass() != obj.getClass()) { - return false; - } - - ObjectTest other = (ObjectTest) obj; - if (array == null) { - if (other.array != null) { - return false; - } - } else if (!array.equals(other.array)) { - return false; - } - - if (id == null) { - if (other.id != null) { - return false; - } - } else if (!id.equals(other.id)) { - return false; - } - - if (values == null) { - if (other.values != null) { - return false; - } - } else if (!values.equals(other.values)) { - return false; - } - - return true; - } - } - - /** - * Generate a test object with values - * - * @return - */ - private static ObjectTest generateObject() { - ObjectTest obj = new ObjectTest(); - obj.id = "defaultID"; - obj.values.put("Test", "Test"); - obj.values.put("Test2", "Test2"); - obj.array.add("Test"); - obj.array.add("Test2"); - - return obj; - } -} diff --git a/Sources/sdk/src/test/java/com/batch/android/core/TestBase32.java b/Sources/sdk/src/test/java/com/batch/android/core/TestBase32.java deleted file mode 100644 index 09496a3..0000000 --- a/Sources/sdk/src/test/java/com/batch/android/core/TestBase32.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.batch.android.core; - -import java.io.ByteArrayOutputStream; -import java.nio.charset.StandardCharsets; -import org.junit.Test; - -public class TestBase32 { - - @Test(expected = IllegalArgumentException.class) - public void testNewBase32EncodingBadEncoder() { - new Base32Encoding("abcd"); - } - - @Test(expected = Base32Encoding.DecodeException.class) - public void testDecodeInvalidLength() throws Base32Encoding.DecodeException { - String input = "foo"; - - Base32Encoding base32Encoding = new Base32Encoding(TypedID.CUSTOM_ENCODING); - base32Encoding.decode(input); - } - - @Test(expected = Base32Encoding.DecodeException.class) - public void testDecodeInvalidChar() throws Base32Encoding.DecodeException { - String input = "foobirba"; - - Base32Encoding base32Encoding = new Base32Encoding(TypedID.CUSTOM_ENCODING); - base32Encoding.decode(input); - } - - @Test(expected = NullPointerException.class) - public void testEncodeNullOutputStream() throws Base32Encoding.EncodeException { - Base32Encoding base32Encoding = new Base32Encoding(TypedID.CUSTOM_ENCODING); - base32Encoding.encode(null, null); - } - - @Test(expected = NullPointerException.class) - public void testEncodeNullSrc() throws Base32Encoding.EncodeException { - Base32Encoding base32Encoding = new Base32Encoding(TypedID.CUSTOM_ENCODING); - base32Encoding.encode(new ByteArrayOutputStream(), null); - } - - @Test(expected = Base32Encoding.EncodeException.class) - public void testEncodeInvalidSrcLength() throws Base32Encoding.EncodeException { - Base32Encoding base32Encoding = new Base32Encoding(TypedID.CUSTOM_ENCODING); - base32Encoding.encode(new ByteArrayOutputStream(), "foo".getBytes(StandardCharsets.UTF_8)); - } -} diff --git a/Sources/sdk/src/test/java/com/batch/android/core/TestBase32Decode.java b/Sources/sdk/src/test/java/com/batch/android/core/TestBase32Decode.java deleted file mode 100644 index 6619bb3..0000000 --- a/Sources/sdk/src/test/java/com/batch/android/core/TestBase32Decode.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.batch.android.core; - -import static org.junit.Assert.assertArrayEquals; - -import java.io.ByteArrayOutputStream; -import java.util.Arrays; -import java.util.Collection; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; - -@RunWith(Parameterized.class) -public class TestBase32Decode { - - @Parameterized.Parameters(name = "{index}: {0}") - public static Collection data() { - return Arrays.asList( - new Object[][] { - { - "0625sq4758psyrgv8yv93ka4ee88rgpa", - new byte[] { - 0x01, - (byte) 0x84, - 0x5c, - (byte) 0xdc, - (byte) 0x87, - 0x2a, - 0x2d, - (byte) 0x9f, - 0x62, - 0x1b, - 0x47, - (byte) 0xb6, - (byte) 0x91, - (byte) 0xcd, - 0x44, - 0x73, - (byte) 0x90, - (byte) 0x8c, - 0x42, - (byte) 0xca, - }, - }, - { "nananana", new byte[] { (byte) 0xaa, (byte) 0xaa, (byte) 0xaa, (byte) 0xaa, (byte) 0xaa } }, - } - ); - } - - private final String input; - private final byte[] expected; - - public TestBase32Decode(String input, byte[] expected) { - this.input = input; - this.expected = expected; - } - - @Test - public void test() throws Base32Encoding.DecodeException { - Base32Encoding encoding = new Base32Encoding(TypedID.CUSTOM_ENCODING); - - ByteArrayOutputStream output = encoding.decode(input); - byte[] outputBytes = output.toByteArray(); - - assertArrayEquals(expected, outputBytes); - } -} diff --git a/Sources/sdk/src/test/java/com/batch/android/core/TestBase32Encode.java b/Sources/sdk/src/test/java/com/batch/android/core/TestBase32Encode.java deleted file mode 100644 index afa81d7..0000000 --- a/Sources/sdk/src/test/java/com/batch/android/core/TestBase32Encode.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.batch.android.core; - -import static org.junit.Assert.assertEquals; - -import java.io.ByteArrayOutputStream; -import java.io.UnsupportedEncodingException; -import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.Collection; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; - -@RunWith(Parameterized.class) -public class TestBase32Encode { - - @Parameterized.Parameters(name = "{index}: {1}") - public static Collection data() { - return Arrays.asList( - new Object[][] { - { - new byte[] { - 0x01, - (byte) 0x84, - 0x5c, - (byte) 0xdc, - (byte) 0x87, - 0x2a, - 0x2d, - (byte) 0x9f, - 0x62, - 0x1b, - 0x47, - (byte) 0xb6, - (byte) 0x91, - (byte) 0xcd, - 0x44, - 0x73, - (byte) 0x90, - (byte) 0x8c, - 0x42, - (byte) 0xca, - }, - "0625sq4758psyrgv8yv93ka4ee88rgpa", - }, - { new byte[] { (byte) 0xaa, (byte) 0xaa, (byte) 0xaa, (byte) 0xaa, (byte) 0xaa }, "nananana" }, - } - ); - } - - private final byte[] input; - private final String expected; - - public TestBase32Encode(byte[] input, String expected) { - this.input = input; - this.expected = expected; - } - - @Test - public void test() throws Base32Encoding.EncodeException, UnsupportedEncodingException { - ByteArrayOutputStream output = new ByteArrayOutputStream(); - Base32Encoding encoding = new Base32Encoding(TypedID.CUSTOM_ENCODING); - encoding.encode(output, input); - - String encoded = output.toString("UTF-8"); - assertEquals(expected, encoded); - } -} diff --git a/Sources/sdk/src/test/java/com/batch/android/core/TestTypedID.java b/Sources/sdk/src/test/java/com/batch/android/core/TestTypedID.java deleted file mode 100644 index 18360f6..0000000 --- a/Sources/sdk/src/test/java/com/batch/android/core/TestTypedID.java +++ /dev/null @@ -1,175 +0,0 @@ -package com.batch.android.core; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import com.batch.android.core.TypedIDExceptions.InvalidSeparatorException; -import com.batch.android.core.TypedIDExceptions.InvalidTypeException; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.UUID; -import org.junit.Test; - -public class TestTypedID { - - @Test(expected = InvalidSeparatorException.class) - public void testParseBadSeparator() - throws InvalidTypeException, TypedIDExceptions.InvalidSizeException, InvalidSeparatorException, TypedIDExceptions.InvalidChecksumException, TypedIDExceptions.InvalidIDException { - TypedID.parse("foobar"); - } - - @Test(expected = InvalidTypeException.class) - public void testParseTypeTooLong() - throws TypedIDExceptions.InvalidIDException, InvalidSeparatorException, TypedIDExceptions.InvalidSizeException, InvalidTypeException, TypedIDExceptions.InvalidChecksumException { - TypedID.parse("foobarfoobarfoobar_abcd"); - } - - @Test(expected = InvalidTypeException.class) - public void testParseTypeNotAlphanumerical() - throws TypedIDExceptions.InvalidSizeException, InvalidSeparatorException, InvalidTypeException, TypedIDExceptions.InvalidIDException, TypedIDExceptions.InvalidChecksumException { - TypedID.parse("---aaa_abcd"); - } - - @Test(expected = TypedIDExceptions.InvalidSizeException.class) - public void testParseBadMainPart() - throws TypedIDExceptions.InvalidSizeException, InvalidSeparatorException, InvalidTypeException, TypedIDExceptions.InvalidChecksumException, TypedIDExceptions.InvalidIDException { - TypedID.parse("project_abcdef"); - } - - @Test(expected = TypedIDExceptions.InvalidIDException.class) - public void testParseInvalidBase32InMainPart() - throws TypedIDExceptions.InvalidSizeException, InvalidSeparatorException, InvalidTypeException, TypedIDExceptions.InvalidChecksumException, TypedIDExceptions.InvalidIDException { - TypedID.parse("reference_0625rst59-m26nph834fa9erg25hfft2"); - } - - @Test(expected = InvalidTypeException.class) - public void testNewWithULIDEmptyType() throws InvalidTypeException { - TypedID.newWithULID("", Ulid.randomUlid()); - } - - @Test(expected = InvalidTypeException.class) - public void testNewWithULIDTypeTooLong() throws InvalidTypeException { - TypedID.newWithULID("foobarfoobarfoobar", Ulid.randomUlid()); - } - - @Test(expected = TypedIDExceptions.InvalidChecksumException.class) - public void testParseInvalidChecksum() - throws TypedIDExceptions.InvalidIDException, InvalidSeparatorException, InvalidTypeException, TypedIDExceptions.InvalidChecksumException, TypedIDExceptions.InvalidSizeException { - TypedID.parse("0eference_0625rst59em26nph834fa9erg25hfft2"); - } - - @Test - public void testInMap() throws InvalidTypeException { - TypedID id = TypedID.newWithRandomULID("project"); - - HashMap m = new HashMap(); - m.put(id, "foo1"); - m.put(id, "foo2"); - - assertTrue(m.containsKey(id)); - assertEquals(1, m.size()); - assertEquals("foo2", m.get(id)); - } - - @Test - public void testParse() - throws TypedIDExceptions.InvalidIDException, InvalidSeparatorException, InvalidTypeException, TypedIDExceptions.InvalidChecksumException, TypedIDExceptions.InvalidSizeException, Ulid.InvalidBufferSizeException { - String input = "reference_0625rst59em26nph834fa9erg25hfft2"; - byte[] expectedULIDBytes = new byte[] { - 0x01, - (byte) 0x84, - 0x5c, - 0x67, - 0x45, - 0x4b, - (byte) 0xa8, - 0x23, - 0x56, - (byte) 0xd1, - 0x40, - (byte) 0xc8, - (byte) 0xf5, - 0x25, - (byte) 0xd8, - (byte) 0x80, - }; - Ulid expectedULID = Ulid.from(expectedULIDBytes); - - TypedID id = TypedID.parse(input); - - assertEquals("reference", id.type); - assertEquals(expectedULID, id.ulid); - assertEquals(input, id.toString()); - } - - @Test - public void testEquals() - throws TypedIDExceptions.InvalidIDException, InvalidTypeException, TypedIDExceptions.InvalidSizeException, InvalidSeparatorException, TypedIDExceptions.InvalidChecksumException { - TypedID id1 = TypedID.newWithRandomULID("project"); - TypedID id2 = TypedID.parse(id1.toString()); - - assertEquals(id1, id2); - } - - @Test - public void testFromBytes() - throws InvalidSeparatorException, TypedIDExceptions.InvalidSizeException, TypedIDExceptions.InvalidIDException, InvalidTypeException, TypedIDExceptions.InvalidChecksumException, IOException, Base32Encoding.DecodeException { - TypedID expectedID = TypedID.parse("foobarbarb_0627qs799mkw3qrk59df2a5h96p4vka4"); - Ulid expectedULID = Ulid.from("01GHXY9TAD4Z0XY4SABBRJHCA9"); - - ByteArrayOutputStream data = new ByteArrayOutputStream(); - data.write("foobarbarb".getBytes(StandardCharsets.UTF_8)); - data.write('_'); - data.write(expectedULID.toBytes()); - - TypedID id = TypedID.fromBytes(data.toByteArray()); - - assertEquals(expectedID, id); - } - - @Test(expected = InvalidTypeException.class) - public void testNewWithUUIDEmptyType() throws InvalidTypeException, TypedIDExceptions.InvalidSizeException { - UUID uuid = UUID.fromString("01848670-AF41-9CF0-E1AD-3977185469CE"); - TypedID.newWithUUID("", uuid); - } - - @Test(expected = InvalidTypeException.class) - public void testNewWithUUIDTypeTooLong() throws InvalidTypeException, TypedIDExceptions.InvalidSizeException { - UUID uuid = UUID.fromString("01848670-AF41-9CF0-E1AD-3977185469CE"); - TypedID.newWithUUID("foobarfoobarfoobar", uuid); - } - - @Test - public void testNewWithUUID() - throws InvalidTypeException, Base32Encoding.EncodeException, TypedIDExceptions.InvalidSizeException { - UUID uuid = UUID.fromString("01848670-AF41-9CF0-E1AD-3977185469CE"); - TypedID id = TypedID.newWithUUID("project", uuid); - assertEquals("01GJ371BT1KKRE3B9SEWC58TEE", id.ulid.toULIDString().toUpperCase()); - } - - @Test(expected = InvalidSeparatorException.class) - public void testFromBytesBadSeparator() - throws InvalidTypeException, TypedIDExceptions.InvalidSizeException, InvalidSeparatorException { - TypedID.fromBytes("fooba".getBytes(StandardCharsets.UTF_8)); - } - - @Test(expected = InvalidTypeException.class) - public void testFromBytesTypeTooLong() - throws TypedIDExceptions.InvalidSizeException, InvalidSeparatorException, InvalidTypeException { - TypedID.fromBytes("foobarfoobarfoobar_abcd".getBytes(StandardCharsets.UTF_8)); - } - - @Test(expected = TypedIDExceptions.InvalidSizeException.class) - public void testFromBytesInvalidULID() - throws TypedIDExceptions.InvalidSizeException, InvalidSeparatorException, InvalidTypeException, IOException { - ByteArrayOutputStream input = new ByteArrayOutputStream(); - input.write("foobar_".getBytes(StandardCharsets.UTF_8)); - input.write(0xff); - input.write(0xfa); - input.write(0xfc); - - TypedID.fromBytes(input.toByteArray()); - } -} diff --git a/Sources/sdk/src/test/java/com/batch/android/core/TestUlid.java b/Sources/sdk/src/test/java/com/batch/android/core/TestUlid.java deleted file mode 100644 index dd98413..0000000 --- a/Sources/sdk/src/test/java/com/batch/android/core/TestUlid.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.batch.android.core; - -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; - -import org.junit.Test; - -public class TestUlid { - - @Test - public void testUlidFromBytes() throws Base32Encoding.EncodeException, Ulid.InvalidBufferSizeException { - String expected = "01gheds1sa5pfp46t7pt8wth3k"; - Ulid ulid = Ulid.from( - new byte[] { - 0x01, - (byte) 0x84, - 0x5c, - (byte) 0xdc, - (byte) 0x87, - 0x2a, - 0x2d, - (byte) 0x9f, - 0x62, - 0x1b, - 0x47, - (byte) 0xb6, - (byte) 0x91, - (byte) 0xcd, - 0x44, - 0x73, - } - ); - assertEquals(expected, ulid.toULIDString()); - } - - @Test - public void testUlidFromString() throws Base32Encoding.DecodeException { - byte[] expected = new byte[] { - 0x01, - (byte) 0x84, - 0x5c, - (byte) 0xdc, - (byte) 0x87, - 0x2a, - 0x2d, - (byte) 0x9f, - 0x62, - 0x1b, - 0x47, - (byte) 0xb6, - (byte) 0x91, - (byte) 0xcd, - 0x44, - 0x73, - }; - Ulid ulid = Ulid.from("01gheds1sa5pfp46t7pt8wth3k"); - assertArrayEquals(expected, ulid.toBytes()); - } -} diff --git a/Sources/sdk/src/test/java/com/batch/android/core/systemparameters/SystemParameterHelperTest.kt b/Sources/sdk/src/test/java/com/batch/android/core/systemparameters/SystemParameterHelperTest.kt new file mode 100644 index 0000000..c6538d7 --- /dev/null +++ b/Sources/sdk/src/test/java/com/batch/android/core/systemparameters/SystemParameterHelperTest.kt @@ -0,0 +1,44 @@ +package com.batch.android.core.systemparameters + +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Assert +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class SystemParameterHelperTest { + + @Test + fun testSerializeSystemParameters() { + val languageParameter = WatchedSystemParameter(ApplicationProvider.getApplicationContext(), SystemParameterShortName.DEVICE_LANGUAGE) { + return@WatchedSystemParameter "en" + }.apply { hasChanged() } + val regionParameter = WatchedSystemParameter(ApplicationProvider.getApplicationContext(), SystemParameterShortName.DEVICE_REGION) { + return@WatchedSystemParameter "EN" + }.apply { hasChanged() } + val timeZoneParameter = WatchedSystemParameter(ApplicationProvider.getApplicationContext(), SystemParameterShortName.DEVICE_TIMEZONE) { + return@WatchedSystemParameter "Europe/Paris" + }.apply { hasChanged() } + val serializedParams = SystemParameterHelper.serializeSystemParameters(listOf(languageParameter, regionParameter, timeZoneParameter)) + + Assert.assertEquals("{\"device_language\":\"en\",\"device_region\":\"EN\",\"device_timezone\":\"Europe\\/Paris\"}", serializedParams.toString()) + } + + @Test + fun testSerializeSystemParametersWithNullValues() { + val languageParameter = WatchedSystemParameter(ApplicationProvider.getApplicationContext(), SystemParameterShortName.DEVICE_LANGUAGE) { + return@WatchedSystemParameter null + }.apply { hasChanged() } + val regionParameter = WatchedSystemParameter(ApplicationProvider.getApplicationContext(), SystemParameterShortName.DEVICE_REGION) { + return@WatchedSystemParameter null + }.apply { hasChanged() } + val timeZoneParameter = WatchedSystemParameter(ApplicationProvider.getApplicationContext(), SystemParameterShortName.DEVICE_TIMEZONE) { + return@WatchedSystemParameter null + }.apply { hasChanged() } + val serializedParams = SystemParameterHelper.serializeSystemParameters(listOf(languageParameter, regionParameter, timeZoneParameter)) + + Assert.assertEquals("{\"device_language\":null,\"device_region\":null,\"device_timezone\":null}", serializedParams.toString()) + } +} \ No newline at end of file diff --git a/Sources/sdk/src/test/java/com/batch/android/core/systemparameters/SystemParameterRegistryTest.kt b/Sources/sdk/src/test/java/com/batch/android/core/systemparameters/SystemParameterRegistryTest.kt new file mode 100644 index 0000000..669ac7e --- /dev/null +++ b/Sources/sdk/src/test/java/com/batch/android/core/systemparameters/SystemParameterRegistryTest.kt @@ -0,0 +1,34 @@ +package com.batch.android.core.systemparameters + +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.batch.android.di.DITest +import com.batch.android.di.providers.SystemParameterRegistryProvider + +import org.junit.Assert +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class SystemParameterRegistryTest : DITest() { + + @Test + fun testGetParameters() { + val registry = SystemParameterRegistryProvider.get(ApplicationProvider.getApplicationContext()) + Assert.assertEquals(SystemParameterShortName.values().size, registry.parameters.size) + } + + @Test + fun testGetWatchedParameters() { + val registry = SystemParameterRegistryProvider.get(ApplicationProvider.getApplicationContext()) + Assert.assertEquals(17, registry.watchedParameters.size) + } + + @Test + fun testGetSystemParamByShortname() { + val registry = SystemParameterRegistryProvider.get(ApplicationProvider.getApplicationContext()) + val parameter = registry.getSystemParamByShortname("apv") + Assert.assertEquals(SystemParameterShortName.APPLICATION_VERSION, parameter?.shortName) + } + +} \ No newline at end of file diff --git a/Sources/sdk/src/test/java/com/batch/android/core/systemparameters/SystemParameterTest.kt b/Sources/sdk/src/test/java/com/batch/android/core/systemparameters/SystemParameterTest.kt new file mode 100644 index 0000000..b3254dd --- /dev/null +++ b/Sources/sdk/src/test/java/com/batch/android/core/systemparameters/SystemParameterTest.kt @@ -0,0 +1,47 @@ +package com.batch.android.core.systemparameters + +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Assert +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class SystemParameterTest { + + @Test + fun testGetValue() { + val parameter = SystemParameter( SystemParameterShortName.APPLICATION_VERSION) { + return@SystemParameter "my-app-version" + } + Assert.assertEquals("my-app-version", parameter.value) + } + + @Test + fun testGetShortname() { + val parameter = SystemParameter(SystemParameterShortName.APPLICATION_VERSION) { + return@SystemParameter "my-app-version" + } + Assert.assertEquals(SystemParameterShortName.APPLICATION_VERSION, parameter.shortName) + } + + @Test + fun testHasChanged() { + val parameter = WatchedSystemParameter(ApplicationProvider.getApplicationContext(), SystemParameterShortName.APPLICATION_VERSION) { + return@WatchedSystemParameter "my-app-version-1" + } + // First time value is null + Assert.assertNull(parameter.lastValue) + + // Ensure the value has changed + Assert.assertTrue(parameter.hasChanged()) + + // Ensure the value is now the right one + Assert.assertEquals("my-app-version-1", parameter.lastValue) + + // Ensure value hasn't changed since getter has hardcoded string + Assert.assertFalse(parameter.hasChanged()) + } + +} \ No newline at end of file diff --git a/Sources/sdk/src/test/java/com/batch/android/di/DITest.java b/Sources/sdk/src/test/java/com/batch/android/di/DITest.java index d8893d9..ebbd583 100644 --- a/Sources/sdk/src/test/java/com/batch/android/di/DITest.java +++ b/Sources/sdk/src/test/java/com/batch/android/di/DITest.java @@ -2,7 +2,6 @@ import android.content.Context; import com.batch.android.Batch; -import com.batch.android.Config; import com.batch.android.di.providers.RuntimeManagerProvider; import com.batch.android.runtime.State; import org.junit.After; @@ -24,9 +23,8 @@ public void tearDown() { } protected void simulateBatchStart(Context context) { - Batch.setConfig(new Config("FAKE_API_KEY")); - - RuntimeManagerProvider.get().changeState(state -> State.READY); + Batch.start("FAKE_API_KEY"); + RuntimeManagerProvider.get().changeState((state, config) -> State.READY); RuntimeManagerProvider.get().setContext(context); } } diff --git a/Sources/sdk/src/test/java/com/batch/android/event/EventAttributesSerializerTest.kt b/Sources/sdk/src/test/java/com/batch/android/event/EventAttributesSerializerTest.kt new file mode 100644 index 0000000..4ca5fa2 --- /dev/null +++ b/Sources/sdk/src/test/java/com/batch/android/event/EventAttributesSerializerTest.kt @@ -0,0 +1,104 @@ +package com.batch.android.event + +import androidx.test.filters.SmallTest +import com.batch.android.BatchEventAttributes +import com.batch.android.json.JSONArray +import org.junit.Assert + +import org.junit.Test +import java.net.URI +import java.util.Date + +@SmallTest +class EventAttributesSerializerTest { + + @Test + fun testSerialize() { + val eventData = BatchEventAttributes().apply { + put("my_car", BatchEventAttributes().apply { + put("brand", "car_brand") + put("year", 2024) + put("4x4", false) + put("model_url", URI("https://batch.com/")) + put("engine", BatchEventAttributes().apply { + put("manufacturer", "manu") + put("cylinders", 6) + put("cylinder_capacity", 3.5) + put("manufacturing_date", Date(1596975143943L)) + }) + }) + put("string_attr", "a_test_string") + put("int_attr", 13) + put("double_attr", 13.4567) + put("date_attr", Date(1596975143943L)) //"2020-08-09T12:12:23.943Z" + put("url_attr", URI("https://batch.com/")) + putStringList("string_list", listOf("A", "B", "C")) + putObjectList("list_items", listOf( + BatchEventAttributes().apply { + put("brand", "car_brand") + put("year", 2024) + put("4x4", false) + put("model_url", URI("https://batch.com/")) + put("engine", BatchEventAttributes().apply { + put("manufacturer", "manu") + put("cylinders", 6) + put("cylinder_capacity", 3.5) + put("manufacturing_date", Date(1596975143943L)) + }) + }, + BatchEventAttributes().apply { + put("brand", "car_brand") + put("year", 2024) + put("4x4", false) + put("model_url", URI("https://batch.com/")) + put("engine", BatchEventAttributes().apply { + put("manufacturer", "manu") + put("cylinders", 6) + put("cylinder_capacity", 3.5) + put("manufacturing_date", Date(1596975143943L)) + }) + } + )) + put("\$label", "test_label") + putStringList("\$tags", listOf("tagA", "tagB", "tagC", "tagC")) + } + + val json = EventAttributesSerializer.serialize(eventData) + Assert.assertEquals("test_label", json["label"]) + Assert.assertEquals(3, json.getJSONArray("tags").length()) + Assert.assertEquals(JSONArray(listOf("tagA", "tagB", "tagC")), json.getJSONArray("tags")) + + val attributes = json.getJSONObject("attributes") + Assert.assertEquals("a_test_string", attributes["string_attr.s"]) + Assert.assertEquals(13, attributes["int_attr.i"]) + Assert.assertEquals(13.4567, attributes["double_attr.f"]) + Assert.assertEquals(1596975143943L, attributes["date_attr.t"]) + Assert.assertEquals("https://batch.com/", attributes["url_attr.u"]) + Assert.assertEquals(JSONArray(listOf("A", "B", "C")), attributes.getJSONArray("string_list.a")) + + val car = attributes.getJSONObject("my_car.o") + Assert.assertEquals("car_brand", car["brand.s"]) + Assert.assertEquals(2024, car["year.i"]) + Assert.assertEquals("https://batch.com/", car["model_url.u"]) + Assert.assertEquals(false, car["4x4.b"]) + + val engine = car.getJSONObject("engine.o") + Assert.assertEquals("manu", engine["manufacturer.s"]) + Assert.assertEquals(6, engine["cylinders.i"]) + Assert.assertEquals(3.5, engine["cylinder_capacity.f"]) + Assert.assertEquals(1596975143943L, engine["manufacturing_date.t"]) + + val items = attributes.getJSONArray("list_items.a") + Assert.assertEquals(2, items.length()) + + val item = items.getJSONObject(0) + Assert.assertEquals("car_brand", item["brand.s"]) + Assert.assertEquals(2024, item["year.i"]) + Assert.assertEquals("https://batch.com/", item["model_url.u"]) + Assert.assertEquals(false, item["4x4.b"]) + Assert.assertEquals("manu", item.getJSONObject("engine.o")["manufacturer.s"]) + Assert.assertEquals(6, item.getJSONObject("engine.o")["cylinders.i"]) + Assert.assertEquals(3.5, item.getJSONObject("engine.o")["cylinder_capacity.f"]) + Assert.assertEquals(1596975143943L, item.getJSONObject("engine.o")["manufacturing_date.t"]) + } +} \ No newline at end of file diff --git a/Sources/sdk/src/test/java/com/batch/android/event/EventAttributesValidatorTest.kt b/Sources/sdk/src/test/java/com/batch/android/event/EventAttributesValidatorTest.kt new file mode 100644 index 0000000..b4938b6 --- /dev/null +++ b/Sources/sdk/src/test/java/com/batch/android/event/EventAttributesValidatorTest.kt @@ -0,0 +1,219 @@ +package com.batch.android.event + +import androidx.test.filters.SmallTest +import com.batch.android.BatchEventAttributes +import org.junit.Assert + +import org.junit.Test +import java.net.URI +import java.util.Date + +@SmallTest +class EventAttributesValidatorTest { + + @Test + fun testIsEventNameValid() { + Assert.assertFalse(EventAttributesValidator.isEventNameValid("invalid event name")) + Assert.assertFalse(EventAttributesValidator.isEventNameValid("invalid-event-name")) + Assert.assertFalse(EventAttributesValidator.isEventNameValid("invalid_event_name@")) + Assert.assertFalse(EventAttributesValidator.isEventNameValid("invalid_event_name\n")) + Assert.assertTrue(EventAttributesValidator.isEventNameValid("valid_event_name")) + } + + @Test + fun testLabelAttribute() { + var errors = EventAttributesValidator.computeValidationErrors(BatchEventAttributes().apply { + put("\$label", "a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_") + }) + Assert.assertTrue(errors[0].equals("\$label: cannot be longer than 200 characters")) + + errors = EventAttributesValidator.computeValidationErrors(BatchEventAttributes().apply { + put("\$label", "") + }) + Assert.assertTrue(errors[0].equals("\$label: cannot be empty or only made of whitespace")) + + errors = EventAttributesValidator.computeValidationErrors(BatchEventAttributes().apply { + put("\$label", "with_multi_\n_line") + }) + Assert.assertTrue(errors[0].equals("\$label: cannot be multiline")) + + errors = EventAttributesValidator.computeValidationErrors(BatchEventAttributes().apply { + put("\$label", "a_valid_label") + }) + Assert.assertTrue(errors.isEmpty()) + } + + @Test + fun testTagsAttribute() { + var errors = EventAttributesValidator.computeValidationErrors(BatchEventAttributes().apply { + putStringList("\$tags", listOf("tag_0", "tag_1", "tag_2", "tag_3", "tag_4", "tag_5", "tag_6", "tag_7", "tag_8","tag_9", "tag_10")) + }) + Assert.assertTrue(errors[0].equals("\$tags: must not contain more than 10 values")) + + errors = EventAttributesValidator.computeValidationErrors(BatchEventAttributes().apply { + putStringList("\$tags", listOf("tag_0", "tag_1", "")) + }) + Assert.assertTrue(errors[0].equals("\$tags[2]: tag cannot be empty or made of whitespace")) + + errors = EventAttributesValidator.computeValidationErrors(BatchEventAttributes().apply { + putStringList("\$tags", listOf("tag_0", "tag_too_long_tag_too_long_tag_too_long_tag_too_long_tag_too_long_")) + }) + Assert.assertTrue(errors[0].equals("\$tags[1]: tag cannot be longer than 64")) + + errors = EventAttributesValidator.computeValidationErrors(BatchEventAttributes().apply { + putStringList("\$tags", listOf("tag_0", "tag_1", "tag_\n_2")) + }) + Assert.assertTrue(errors[0].equals("\$tags[2]: tag cannot be multiline")) + + errors = EventAttributesValidator.computeValidationErrors(BatchEventAttributes().apply { + putStringList("\$tags", listOf("tag_0", "tag_1", "tag_2")) + }) + Assert.assertTrue(errors.isEmpty()) + } + + @Test + fun testStringAttribute() { + var errors = EventAttributesValidator.computeValidationErrors(BatchEventAttributes().apply { + put("string_attr", "a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_") + }) + Assert.assertTrue(errors[0].equals("string_attr: string attribute cannot be longer than 200 characters")) + + errors = EventAttributesValidator.computeValidationErrors(BatchEventAttributes().apply { + put("string_attr", "") + }) + Assert.assertTrue(errors[0].equals("string_attr: string attribute cannot be empty or made of whitespace")) + + errors = EventAttributesValidator.computeValidationErrors(BatchEventAttributes().apply { + put("string_attr", "with_multi_\n_line") + }) + Assert.assertTrue(errors[0].equals("string_attr: string attribute cannot be multiline")) + + + errors = EventAttributesValidator.computeValidationErrors(BatchEventAttributes().apply { + put("string_attr", "a_valid_string") + }) + Assert.assertTrue(errors.isEmpty()) + } + @Test + fun testURLAttribute() { + var errors = EventAttributesValidator.computeValidationErrors(BatchEventAttributes().apply { + put("url_attr", URI("https://batch.com/home?id=a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_to_long")) + }) + Assert.assertTrue(errors[0].equals("url_attr: URL attributes cannot be longer than 2048 characters")) + + errors = EventAttributesValidator.computeValidationErrors(BatchEventAttributes().apply { + put("url_attr", URI("batch.com")) + }) + Assert.assertTrue(errors[0].equals("url_attr: URL attributes must follow the format 'scheme://[authority][path][?query][#fragment]'")) + + errors = EventAttributesValidator.computeValidationErrors(BatchEventAttributes().apply { + put("url_attr", URI("https://batch.com/home?id=123")) + }) + Assert.assertTrue(errors.isEmpty()) + } + + @Test + fun testObjectAttribute() { + var errors = EventAttributesValidator.computeValidationErrors(BatchEventAttributes().apply { + put("obj_attr", BatchEventAttributes().apply { + put("\$label", "a_valid_label") + putStringList("\$tags", listOf("tag_0", "tag_1", "tag_2")) + put("sub_obj_1", BatchEventAttributes().apply { put("sub_obj_2", BatchEventAttributes().apply { put("sub_obj_3", BatchEventAttributes().apply { }) }) }) + }) + }) + Assert.assertTrue(errors[0].equals("obj_attr.\$label: Labels are not allowed in sub-objects")) + Assert.assertTrue(errors[1].equals("obj_attr.\$tags: Tags are not allowed in sub-objects")) + Assert.assertTrue(errors[2].equals("obj_attr.sub_obj_1.sub_obj_2.sub_obj_3: Object attributes cannot be nested in more than three levels")) + + var eventData = BatchEventAttributes() + for (i in 0..20) { + eventData.put("attr_$i", "val") + } + errors = EventAttributesValidator.computeValidationErrors(eventData) + Assert.assertTrue(errors[0].equals(": objects cannot hold more than 20 attributes")) + + eventData = BatchEventAttributes().apply { + put("my_car", BatchEventAttributes().apply { + put("brand", "car_brand") + put("year", 2024) + put("4x4", false) + put("model_url", URI("https://batch.com/")) + put("engine", BatchEventAttributes().apply { + put("manufacturer", "manu") + put("cylinders", 6) + put("cylinder_capacity", 3.5) + put("manufacturing_date", Date(1596975143943L)) + }) + }) + put("string_attr", "a_test_string") + put("int_attr", 13) + put("double_attr", 13.4567) + put("date_attr", Date(1596975143943L)) //"2020-08-09T12:12:23.943Z" + put("url_attr", URI("https://batch.com/")) + putStringList("string_list", listOf("A", "B", "C")) + putObjectList("list_items", listOf( + BatchEventAttributes().apply { + put("brand", "car_brand") + put("year", 2024) + put("4x4", false) + put("model_url", URI("https://batch.com/")) + put("engine", BatchEventAttributes().apply { + put("manufacturer", "manu") + put("cylinders", 6) + put("cylinder_capacity", 3.5) + put("manufacturing_date", Date(1596975143943L)) + }) + }, + BatchEventAttributes().apply { + put("brand", "car_brand") + put("year", 2024) + put("4x4", false) + put("model_url", URI("https://batch.com/")) + put("engine", BatchEventAttributes().apply { + put("manufacturer", "manu") + put("cylinders", 6) + put("cylinder_capacity", 3.5) + put("manufacturing_date", Date(1596975143943L)) + }) + } + )) + put("\$label", "test_label") + putStringList("\$tags", listOf("tagA", "tagB", "tagC", "tagC")) + } + errors = EventAttributesValidator.computeValidationErrors(eventData) + Assert.assertTrue(errors.isEmpty()) + } + + @Test + fun testStringArrayAttribute() { + var errors = EventAttributesValidator.computeValidationErrors(BatchEventAttributes().apply { + putStringList("string_array_attr", listOf("a","b","a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_a_way_too_long_label_")) + }) + Assert.assertTrue(errors[0].equals("string_array_attr[2]: string attribute cannot be longer than 200 characters")) + + errors = EventAttributesValidator.computeValidationErrors(BatchEventAttributes().apply { + putStringList("string_array_attr", listOf("a","","c")) + }) + Assert.assertTrue(errors[0].equals("string_array_attr[1]: string attribute cannot be empty or made of whitespace")) + + errors = EventAttributesValidator.computeValidationErrors(BatchEventAttributes().apply { + putStringList("string_array_attr", listOf("a","with\nlinebreak","c")) + }) + Assert.assertTrue(errors[0].equals("string_array_attr[1]: string attribute cannot be multiline")) + + val list = ArrayList() + for (i in 0..25) { + list.add("val_$i") + } + errors = EventAttributesValidator.computeValidationErrors(BatchEventAttributes().apply { + putStringList("list_attr", list) + }) + Assert.assertTrue(errors[0].equals("list_attr: array attributes cannot have more than 25 elements")) + + errors = EventAttributesValidator.computeValidationErrors(BatchEventAttributes().apply { + putStringList("string_array_attr", listOf("a","b","c")) + }) + Assert.assertTrue(errors.isEmpty()) + } + +} \ No newline at end of file diff --git a/Sources/sdk/src/test/java/com/batch/android/inbox/InboxFetcherInternalTest.java b/Sources/sdk/src/test/java/com/batch/android/inbox/InboxFetcherInternalTest.java index 90f560f..af1edba 100644 --- a/Sources/sdk/src/test/java/com/batch/android/inbox/InboxFetcherInternalTest.java +++ b/Sources/sdk/src/test/java/com/batch/android/inbox/InboxFetcherInternalTest.java @@ -102,9 +102,7 @@ public void onFetchFailure(@NonNull String error) { notifications = fetcher.getPublicFetchedNotifications(); notification = notifications.get(1); - Assert.assertFalse(notification.isDeleted()); fetcher.markAsDeleted(notification); - Assert.assertTrue(notification.isDeleted()); notifications = fetcher.getPublicFetchedNotifications(); Assert.assertEquals(5, notifications.size()); diff --git a/Sources/sdk/src/test/java/com/batch/android/inbox/InboxNotificationContentParsingTest.kt b/Sources/sdk/src/test/java/com/batch/android/inbox/InboxNotificationContentParsingTest.kt index ef3c907..e7c5037 100644 --- a/Sources/sdk/src/test/java/com/batch/android/inbox/InboxNotificationContentParsingTest.kt +++ b/Sources/sdk/src/test/java/com/batch/android/inbox/InboxNotificationContentParsingTest.kt @@ -28,7 +28,6 @@ class InboxNotificationContentParsingTest { Assert.assertEquals("foo", content.body) Assert.assertEquals("bar", content.title) Assert.assertTrue(content.isUnread) - Assert.assertFalse(content.isDeleted) Assert.assertFalse(content.isSilent) Assert.assertEquals("https://batch.com", content.pushPayload.deeplink) Assert.assertEquals(now, content.date) @@ -42,7 +41,6 @@ class InboxNotificationContentParsingTest { Assert.assertEquals("foo", content.body) Assert.assertNull(content.title) Assert.assertFalse(content.isUnread) - Assert.assertFalse(content.isDeleted) Assert.assertFalse(content.isSilent) Assert.assertEquals(BatchNotificationSource.CAMPAIGN, content.source) } diff --git a/Sources/sdk/src/test/java/com/batch/android/localcampaigns/EventTriggerTest.java b/Sources/sdk/src/test/java/com/batch/android/localcampaigns/EventTriggerTest.java index cfec041..1050cf5 100644 --- a/Sources/sdk/src/test/java/com/batch/android/localcampaigns/EventTriggerTest.java +++ b/Sources/sdk/src/test/java/com/batch/android/localcampaigns/EventTriggerTest.java @@ -69,7 +69,7 @@ public void testSignalSentAfterEventTracked() CampaignManagerProvider.get().updateCampaignList(Collections.singletonList(campaign)); // Track the event which is linked to the Local Campaign - Batch.User.trackEvent(EVENT_NAME_TEST); + Batch.Profile.trackEvent(EVENT_NAME_TEST); Mockito .verify(LocalCampaignsModuleProvider.get()) @@ -95,7 +95,7 @@ public void testCampaignDisplayedAfterEventTracked() LocalCampaignsModuleProvider.get().onLocalCampaignsWebserviceFinished(); // Track the event which is linked to the Local Campaign - Batch.User.trackEvent(EVENT_NAME_TEST); + Batch.Profile.trackEvent(EVENT_NAME_TEST); Thread.sleep(2000); diff --git a/Sources/sdk/src/test/java/com/batch/android/module/DataCollectionModuleTest.kt b/Sources/sdk/src/test/java/com/batch/android/module/DataCollectionModuleTest.kt new file mode 100644 index 0000000..9caa8f1 --- /dev/null +++ b/Sources/sdk/src/test/java/com/batch/android/module/DataCollectionModuleTest.kt @@ -0,0 +1,137 @@ +package com.batch.android.module + +import android.content.Context +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.batch.android.Batch +import com.batch.android.JSONObjectMockitoMatcher +import com.batch.android.JSONObjectPartialMatcher +import com.batch.android.WebserviceParameterUtils +import com.batch.android.core.systemparameters.SystemParameterShortName +import com.batch.android.di.DITest +import com.batch.android.di.DITestUtils +import com.batch.android.di.providers.DataCollectionModuleProvider + +import com.batch.android.event.InternalEvents +import com.batch.android.json.JSONObject +import org.junit.Assert + +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentMatchers +import org.mockito.Mockito + +@RunWith(AndroidJUnit4::class) +class DataCollectionModuleTest : DITest() { + + private lateinit var context: Context + private lateinit var trackerModule: TrackerModule + + override fun setUp() { + super.setUp() + context = ApplicationProvider.getApplicationContext() + simulateBatchStart(context) + DataCollectionModuleProvider.get().batchContextBecameAvailable(context) + trackerModule = DITestUtils.mockSingletonDependency(TrackerModule::class.java, null) + } + + @Test + fun testSystemParametersMayHaveChange() { + + // Expected event payload + val expectedParams = JSONObject().apply { + put("device_language", "en-US") + put("device_region", "US") + } + + // Start module (this will check for native changes) + DataCollectionModuleProvider.get().batchDidStart() + + // Verify event is triggered + Mockito.verify(trackerModule, Mockito.timeout(1000).times(1)) + .track(ArgumentMatchers.eq(InternalEvents.NATIVE_DATA_CHANGED), JSONObjectPartialMatcher.eq(expectedParams)) + + } + + @Test + fun testConfigureDataPrivacy() { + // Enable all + Batch.updateAutomaticDataCollection { + it.setGeoIPEnabled(true) + .setDeviceModelEnabled(true) + .setDeviceBrandEnabled(true) + } + // Verify all data are sent + Mockito.verify(trackerModule, Mockito.times(1)) + .track(ArgumentMatchers.eq(InternalEvents.NATIVE_DATA_CHANGED), JSONObjectMockitoMatcher.eq(JSONObject().apply { + put("geoip_resolution", true) + put("device_brand", "Android") + put("device_type", "robolectric") + })) + + // Disable only geoip + Batch.updateAutomaticDataCollection { + it.setGeoIPEnabled(false) + } + // Verify only geoip is sent with false + Mockito.verify(trackerModule, Mockito.times(1)) + .track(ArgumentMatchers.eq(InternalEvents.NATIVE_DATA_CHANGED), JSONObjectMockitoMatcher.eq(JSONObject().apply { + put("geoip_resolution", false) + })) + + + // Disable only device brand and model + Batch.updateAutomaticDataCollection { + it.setDeviceBrandEnabled(false).setDeviceModelEnabled(false) + } + // Verify only device brand and model is sent with null + Mockito.verify(trackerModule, Mockito.times(1)) + .track(ArgumentMatchers.eq(InternalEvents.NATIVE_DATA_CHANGED), JSONObjectMockitoMatcher.eq(JSONObject().apply { + put("device_brand", JSONObject.NULL) + put("device_type", JSONObject.NULL) + })) + + Mockito.reset(trackerModule) + + // Disable all + Batch.updateAutomaticDataCollection { + it.setDeviceBrandEnabled(false).setDeviceModelEnabled(false).setGeoIPEnabled(false) + } + // Verify no event is send since it was already disabled (times(3) for the event triggered before + Mockito.verify(trackerModule, Mockito.never()).track(ArgumentMatchers.eq(InternalEvents.NATIVE_DATA_CHANGED), Mockito.any(JSONObject::class.java)) + } + + @Test + fun testConfigureDataPrivacyForIds() { + // Check default disabled param are not is ids + WebserviceParameterUtils.getWebserviceIdsAsJson(context).apply { + Assert.assertFalse(has(SystemParameterShortName.DEVICE_BRAND.shortName)) + Assert.assertFalse(has(SystemParameterShortName.DEVICE_TYPE.shortName)) + Assert.assertFalse(getJSONObject("data_collection").getBoolean("geoip")) + } + + // Enable all + Batch.updateAutomaticDataCollection { + it.setGeoIPEnabled(true).setDeviceModelEnabled(true).setDeviceBrandEnabled(true) + } + + // Check values are in the ids + WebserviceParameterUtils.getWebserviceIdsAsJson(context).apply { + Assert.assertEquals("Android", get(SystemParameterShortName.DEVICE_BRAND.shortName)) + Assert.assertEquals("robolectric", get(SystemParameterShortName.DEVICE_TYPE.shortName)) + Assert.assertTrue(getJSONObject("data_collection").getBoolean("geoip")) + } + + // Disable all + Batch.updateAutomaticDataCollection { + it.setGeoIPEnabled(false).setDeviceModelEnabled(false).setDeviceBrandEnabled(false) + } + + // Check disabled param are not is ids + WebserviceParameterUtils.getWebserviceIdsAsJson(context).apply { + Assert.assertFalse(has(SystemParameterShortName.DEVICE_BRAND.shortName)) + Assert.assertFalse(has(SystemParameterShortName.DEVICE_TYPE.shortName)) + Assert.assertFalse(getJSONObject("data_collection").getBoolean("geoip")) + } + } +} \ No newline at end of file diff --git a/Sources/sdk/src/test/java/com/batch/android/profile/ProfileDataHelperTest.java b/Sources/sdk/src/test/java/com/batch/android/profile/ProfileDataHelperTest.java new file mode 100644 index 0000000..580f080 --- /dev/null +++ b/Sources/sdk/src/test/java/com/batch/android/profile/ProfileDataHelperTest.java @@ -0,0 +1,60 @@ +package com.batch.android.profile; + +import org.junit.Assert; +import org.junit.Test; + +public class ProfileDataHelperTest { + + @Test + public void testIsNotValidEmail() { + // Valid use case + Assert.assertFalse(ProfileDataHelper.isNotValidEmail("foo@batch.com")); + Assert.assertFalse(ProfileDataHelper.isNotValidEmail("bar@foo.batch.com")); + Assert.assertFalse(ProfileDataHelper.isNotValidEmail("bar+foo@batch.com")); + Assert.assertFalse(ProfileDataHelper.isNotValidEmail("FOObar@Test.Batch.COM")); + + // Invalid use case + Assert.assertTrue(ProfileDataHelper.isNotValidEmail("@gmail.com")); + Assert.assertTrue(ProfileDataHelper.isNotValidEmail("invalid@gmail")); + Assert.assertTrue(ProfileDataHelper.isNotValidEmail("inva\nlid@gmail.com")); + Assert.assertTrue(ProfileDataHelper.isNotValidEmail("invalid@gmail .com")); + Assert.assertTrue(ProfileDataHelper.isNotValidEmail("invalid@inva lid.gmail.com")); + Assert.assertTrue( + ProfileDataHelper.isNotValidEmail( + "testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest@gmail.com" + ) + ); + } + + @Test + public void testIsNotValidCustomUserID() { + Assert.assertFalse(ProfileDataHelper.isNotValidCustomUserID("customId")); + Assert.assertFalse(ProfileDataHelper.isNotValidCustomUserID(null)); + Assert.assertTrue( + ProfileDataHelper.isNotValidCustomUserID( + "my_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_idmy_test_id_1111" + ) + ); + } + + @Test + public void testIsNotValidLanguage() { + Assert.assertFalse(ProfileDataHelper.isNotValidLanguage("fr")); + Assert.assertTrue(ProfileDataHelper.isNotValidLanguage("F")); + } + + @Test + public void testIsNotValidRegion() { + Assert.assertFalse(ProfileDataHelper.isNotValidLanguage("FR")); + Assert.assertTrue(ProfileDataHelper.isNotValidLanguage("F")); + } + + @Test + public void testNormalizeAttributeKey() throws ProfileDataHelper.AttributeValidationException { + Assert.assertEquals("normalized_attribute", ProfileDataHelper.normalizeAttributeKey("Normalized_Attribute")); + Assert.assertThrows( + ProfileDataHelper.AttributeValidationException.class, + () -> ProfileDataHelper.normalizeAttributeKey("wrong-key") + ); + } +} diff --git a/Sources/sdk/src/test/java/com/batch/android/profile/ProfileDataSerializerTest.kt b/Sources/sdk/src/test/java/com/batch/android/profile/ProfileDataSerializerTest.kt new file mode 100644 index 0000000..ca83354 --- /dev/null +++ b/Sources/sdk/src/test/java/com/batch/android/profile/ProfileDataSerializerTest.kt @@ -0,0 +1,92 @@ +package com.batch.android.profile + +import androidx.test.filters.SmallTest +import com.batch.android.BatchEmailSubscriptionState +import com.batch.android.json.JSONArray +import com.batch.android.json.JSONObject +import com.batch.android.user.AttributeType +import com.batch.android.user.UserAttribute +import org.junit.Assert +import org.junit.Test +import java.net.URI +import java.util.Date + +@SmallTest +class ProfileDataSerializerTest { + + @Test + fun testSerialize() { + + val dataModel = ProfileUpdateOperation().apply { + setEmail("test@batch.com") + setLanguage("fr") + setRegion("FR") + setEmailMarketing(BatchEmailSubscriptionState.SUBSCRIBED) + addAttribute("string_att", UserAttribute("hello", AttributeType.STRING)) + addAttribute("int_att", UserAttribute(3, AttributeType.LONG)) + addAttribute("double_att", UserAttribute(3.6, AttributeType.DOUBLE)) + addAttribute("url_att", UserAttribute(URI("https://batch.com/pricing"), AttributeType.URL)) + addAttribute("date_att", UserAttribute(Date(1596975143943L), AttributeType.DATE)) + addAttribute("array_att", UserAttribute(listOf("michel", "bresil"), AttributeType.STRING_ARRAY)) + addToList("array_partial", listOf("i", "don't")) + removeFromList("array_partial", listOf("know")) + } + + val actual = ProfileDataSerializer.serialize(dataModel) + + Assert.assertEquals("test@batch.com", actual.getString("email")) + Assert.assertEquals("fr", actual.getString("language")) + Assert.assertEquals("FR", actual.getString("region")) + Assert.assertEquals("subscribed", actual.getString("email_marketing")) + + val actualCustomAttributes = actual.getJSONObject("custom_attributes") + Assert.assertEquals("hello", actualCustomAttributes.getString("string_att.s")) + Assert.assertEquals(3, actualCustomAttributes.getInt("int_att.i")) + Assert.assertEquals(3.60, actualCustomAttributes.getDouble("double_att.f"), 0.00) + Assert.assertEquals("https://batch.com/pricing", actualCustomAttributes.getString("url_att.u")) + Assert.assertEquals(1596975143943L, actualCustomAttributes.getLong("date_att.t")) + + val actualArrayAttribute = actualCustomAttributes.getJSONArray("array_att.a") + Assert.assertEquals("michel", actualArrayAttribute.getString(0)) + Assert.assertEquals("bresil", actualArrayAttribute.getString(1)) + + val actualPartialAttribute = actualCustomAttributes.getJSONObject("array_partial.a") + val actualAddPartialAttribute = actualPartialAttribute.getJSONArray("\$add") + val actualRemovePartialAttribute = actualPartialAttribute.getJSONArray("\$remove") + Assert.assertEquals("i", actualAddPartialAttribute.getString(0)) + Assert.assertEquals("don't", actualAddPartialAttribute.getString(1)) + Assert.assertEquals("know", actualRemovePartialAttribute.getString(0)) + } + + @Test + fun testSerializePartialUpdateAttribute() { + + // Case: Add only + val attributeAddOnly = ProfilePartialUpdateAttribute(listOf("a","b")) + val expectedAddOnly = JSONObject().apply { + put("\$add", JSONArray(listOf("a","b"))) + } + Assert.assertNull(ProfileDataSerializer.serializePartialUpdateAttribute(attributeAddOnly).optJSONArray("\$remove")) + Assert.assertEquals(expectedAddOnly.toString(), ProfileDataSerializer.serializePartialUpdateAttribute(attributeAddOnly).toString()) + + // Case: Remove only + val attributeRemoveOnly = ProfilePartialUpdateAttribute(null, listOf("a","b")) + val expectedRemoveOnly = JSONObject().apply { + put("\$remove", JSONArray(listOf("a","b"))) + } + Assert.assertNull(ProfileDataSerializer.serializePartialUpdateAttribute(attributeRemoveOnly).optJSONArray("\$add")) + Assert.assertEquals(expectedRemoveOnly.toString(), ProfileDataSerializer.serializePartialUpdateAttribute(attributeRemoveOnly).toString()) + + // Case: Both + val attributeBoth = ProfilePartialUpdateAttribute(listOf("a","b"), listOf("c","d")) + val expectedBoth = JSONObject().apply { + put("\$add", JSONArray(listOf("a","b"))) + put("\$remove", JSONArray(listOf("c","d"))) + } + Assert.assertNotNull(ProfileDataSerializer.serializePartialUpdateAttribute(attributeBoth).optJSONArray("\$add")) + Assert.assertNotNull(ProfileDataSerializer.serializePartialUpdateAttribute(attributeBoth).optJSONArray("\$remove")) + Assert.assertEquals(expectedBoth.toString(), ProfileDataSerializer.serializePartialUpdateAttribute(attributeBoth).toString()) + + + } +} \ No newline at end of file diff --git a/Sources/sdk/src/test/java/com/batch/android/profile/ProfileDeletableAttributeTest.kt b/Sources/sdk/src/test/java/com/batch/android/profile/ProfileDeletableAttributeTest.kt new file mode 100644 index 0000000..361689f --- /dev/null +++ b/Sources/sdk/src/test/java/com/batch/android/profile/ProfileDeletableAttributeTest.kt @@ -0,0 +1,22 @@ +package com.batch.android.profile + +import androidx.test.filters.SmallTest +import com.batch.android.json.JSONObject +import org.junit.Assert +import org.junit.Test + +@SmallTest +class ProfileDeletableAttributeTest { + + @Test + fun testGetValue() { + Assert.assertEquals("value", ProfileDeletableAttribute("value").value) + Assert.assertNull("value", ProfileDeletableAttribute(null).value) + } + + @Test + fun testGetSerializedValue() { + Assert.assertEquals("value", ProfileDeletableAttribute("value").serializedValue) + Assert.assertEquals(JSONObject.NULL, ProfileDeletableAttribute(null).serializedValue) + } +} \ No newline at end of file diff --git a/Sources/sdk/src/test/java/com/batch/android/profile/ProfilePartialUpdateAttributeTest.kt b/Sources/sdk/src/test/java/com/batch/android/profile/ProfilePartialUpdateAttributeTest.kt new file mode 100644 index 0000000..6bbe301 --- /dev/null +++ b/Sources/sdk/src/test/java/com/batch/android/profile/ProfilePartialUpdateAttributeTest.kt @@ -0,0 +1,32 @@ +package com.batch.android.profile + +import androidx.test.filters.SmallTest +import com.batch.android.json.JSONObject +import org.junit.Assert +import org.junit.Test + +@SmallTest +class ProfilePartialUpdateAttributeTest { + + @Test + fun testPutInAdded() { + val partial = ProfilePartialUpdateAttribute(null) + Assert.assertNull(partial.added) + Assert.assertNull(partial.removed) + partial.putInAdded(listOf("a", "b")) + Assert.assertNotNull(partial.added) + Assert.assertNull(partial.removed) + Assert.assertEquals(listOf("a", "b"), partial.added) + } + + @Test + fun testPutInRemoved() { + val partial = ProfilePartialUpdateAttribute(null) + Assert.assertNull(partial.added) + Assert.assertNull(partial.removed) + partial.putInRemoved(listOf("a", "b")) + Assert.assertNotNull(partial.removed) + Assert.assertNull(partial.added) + Assert.assertEquals(listOf("a", "b"), partial.removed) + } +} \ No newline at end of file diff --git a/Sources/sdk/src/test/java/com/batch/android/profile/ProfileUpdateOperationTest.kt b/Sources/sdk/src/test/java/com/batch/android/profile/ProfileUpdateOperationTest.kt new file mode 100644 index 0000000..ece98e6 --- /dev/null +++ b/Sources/sdk/src/test/java/com/batch/android/profile/ProfileUpdateOperationTest.kt @@ -0,0 +1,135 @@ +package com.batch.android.profile + +import androidx.test.filters.SmallTest +import com.batch.android.user.AttributeType +import com.batch.android.user.UserAttribute +import org.junit.Assert + +import org.junit.Test + +@SmallTest +class ProfileUpdateOperationTest { + + @Test + fun testAddToListAfterSetAttribute() { + + val profileUpdateOperation = ProfileUpdateOperation() + profileUpdateOperation.addAttribute("test", UserAttribute(ArrayList(listOf("a")), AttributeType.STRING_ARRAY)) + Assert.assertTrue(profileUpdateOperation.customAttributes.containsKey("test")) + + val value = profileUpdateOperation.customAttributes["test"]?.value as List<*> + Assert.assertEquals(value[0], "a") + + profileUpdateOperation.addToList("test", listOf("b")) + Assert.assertEquals(value[1], "b") + } + + @Test + fun testAddToListFirst() { + val profileUpdateOperation = ProfileUpdateOperation() + profileUpdateOperation.addToList("test", listOf("a")) + Assert.assertTrue(profileUpdateOperation.customAttributes.containsKey("test")) + + val value = profileUpdateOperation.customAttributes["test"]?.value as ProfilePartialUpdateAttribute + Assert.assertEquals(value.added?.get(0), "a") + } + + @Test + fun testAddToListAfterRemoveAttribute() { + + val profileUpdateOperation = ProfileUpdateOperation() + profileUpdateOperation.removeAttribute("test") + Assert.assertTrue(profileUpdateOperation.customAttributes.containsKey("test")) + + Assert.assertNull(profileUpdateOperation.customAttributes["test"]?.value) + profileUpdateOperation.addToList("test", ArrayList(listOf("a"))) + + val value = profileUpdateOperation.customAttributes["test"]?.value as List<*> + Assert.assertEquals(value[0], "a") + } + + @Test + fun testAddToListTwoTimes() { + val profileUpdateOperation = ProfileUpdateOperation() + profileUpdateOperation.addToList("test", ArrayList(listOf("a"))) + Assert.assertTrue(profileUpdateOperation.customAttributes.containsKey("test")) + + val value = profileUpdateOperation.customAttributes["test"]?.value as ProfilePartialUpdateAttribute + Assert.assertEquals(value.added?.get(0), "a") + + profileUpdateOperation.addToList("test", ArrayList(listOf("b"))) + Assert.assertEquals(value.added?.size, 2) + Assert.assertEquals(value.added?.get(1), "b") + } + + @Test + fun testRemoveFromListAfterSetAttribute() { + + val profileUpdateOperation = ProfileUpdateOperation() + profileUpdateOperation.addAttribute("test", UserAttribute(ArrayList(listOf("a", "b")), AttributeType.STRING_ARRAY)) + Assert.assertTrue(profileUpdateOperation.customAttributes.containsKey("test")) + + val value = profileUpdateOperation.customAttributes["test"]?.value as List<*> + Assert.assertEquals(value.size, 2) + + + profileUpdateOperation.removeFromList("test", ArrayList(listOf("b"))) + Assert.assertEquals(value.size, 1) + Assert.assertEquals(value[0], "a") + + profileUpdateOperation.removeFromList("test", ArrayList(listOf("a"))) + Assert.assertFalse(profileUpdateOperation.customAttributes.containsKey("test")) + } + + @Test + fun testRemoveFromListFirst() { + val profileUpdateOperation = ProfileUpdateOperation() + profileUpdateOperation.removeFromList("test", listOf("a")) + Assert.assertTrue(profileUpdateOperation.customAttributes.containsKey("test")) + + val value = profileUpdateOperation.customAttributes["test"]?.value as ProfilePartialUpdateAttribute + Assert.assertEquals(value.removed?.get(0), "a") + } + + @Test + fun testRemoveFromListAfterRemoveAttribute() { + + val profileUpdateOperation = ProfileUpdateOperation() + profileUpdateOperation.removeAttribute("test") + Assert.assertTrue(profileUpdateOperation.customAttributes.containsKey("test")) + + Assert.assertNull(profileUpdateOperation.customAttributes["test"]?.value) + profileUpdateOperation.removeFromList("test", ArrayList(listOf("a"))) + + Assert.assertNull(profileUpdateOperation.customAttributes["test"]?.value) + } + + @Test + fun testRemoveFromListTwoTimes() { + val profileUpdateOperation = ProfileUpdateOperation() + profileUpdateOperation.removeFromList("test", ArrayList(listOf("a"))) + Assert.assertTrue(profileUpdateOperation.customAttributes.containsKey("test")) + + val value = profileUpdateOperation.customAttributes["test"]?.value as ProfilePartialUpdateAttribute + Assert.assertEquals(value.removed?.get(0), "a") + + profileUpdateOperation.removeFromList("test", ArrayList(listOf("b"))) + Assert.assertEquals(value.removed?.size, 2) + Assert.assertEquals(value.removed?.get(1), "b") + } + + @Test + fun testAddToAndRemoveFromList() { + val profileUpdateOperation = ProfileUpdateOperation() + profileUpdateOperation.addToList("test", ArrayList(listOf("a"))) + profileUpdateOperation.removeFromList("test", ArrayList(listOf("b"))) + Assert.assertTrue(profileUpdateOperation.customAttributes.containsKey("test")) + + val value = profileUpdateOperation.customAttributes["test"]?.value as ProfilePartialUpdateAttribute + Assert.assertEquals(value.added?.size, 1) + Assert.assertEquals(value.added?.get(0), "a") + Assert.assertEquals(value.removed?.size, 1) + Assert.assertEquals(value.removed?.get(0), "b") + } + +} \ No newline at end of file diff --git a/Sources/sdk/src/test/java/com/batch/android/query/ResponseDeserializationTest.java b/Sources/sdk/src/test/java/com/batch/android/query/ResponseDeserializationTest.java index f4d84a9..69930a4 100644 --- a/Sources/sdk/src/test/java/com/batch/android/query/ResponseDeserializationTest.java +++ b/Sources/sdk/src/test/java/com/batch/android/query/ResponseDeserializationTest.java @@ -43,8 +43,8 @@ public void testAttributesSendResponseDeserializer() throws JSONException { ); AttributesSendResponse response = deserializer.deserialize(); Assert.assertEquals("dummy_id", response.getQueryID()); - Assert.assertEquals("1234-1234-1234", response.transactionID); - Assert.assertEquals(1L, response.version); + Assert.assertEquals("1234-1234-1234", response.getTransactionID()); + Assert.assertEquals(1L, response.getVersion()); } @Test diff --git a/Sources/sdk/src/test/java/com/batch/android/tracker/DatasourceTest.java b/Sources/sdk/src/test/java/com/batch/android/tracker/DatasourceTest.java index 226ec31..9863762 100644 --- a/Sources/sdk/src/test/java/com/batch/android/tracker/DatasourceTest.java +++ b/Sources/sdk/src/test/java/com/batch/android/tracker/DatasourceTest.java @@ -187,6 +187,21 @@ public void testUpdateEvents() { } } + @Test + public void testEventsOrder() { + datasource.addEvent(new Event(appContext, new Date().getTime(), "_FIRST", null)); + datasource.addEvent(new Event(appContext, new Date().getTime(), "E.SECOND", null)); + datasource.addEvent(new Event(appContext, new Date().getTime(), "THIRD", null)); + datasource.addEvent(new Event(appContext, new Date().getTime(), "_FOURTH", null)); + + List events = datasource.extractEventsToSend(20); + assertEquals(4, events.size()); + assertEquals("_FIRST", events.get(0).getName()); + assertEquals("E.SECOND", events.get(1).getName()); + assertEquals("THIRD", events.get(2).getName()); + assertEquals("_FOURTH", events.get(3).getName()); + } + // --------------------------------------> /** diff --git a/Sources/sdk/src/test/java/com/batch/android/user/InstallDataEditorTest.java b/Sources/sdk/src/test/java/com/batch/android/user/InstallDataEditorTest.java new file mode 100644 index 0000000..380044a --- /dev/null +++ b/Sources/sdk/src/test/java/com/batch/android/user/InstallDataEditorTest.java @@ -0,0 +1,173 @@ +package com.batch.android.user; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import android.content.Context; +import androidx.test.core.app.ApplicationProvider; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.filters.SmallTest; +import com.batch.android.Batch; +import com.batch.android.BatchUserAttribute; +import com.batch.android.MockBatchAttributesFetchListener; +import com.batch.android.MockBatchTagCollectionsFetchListener; +import com.batch.android.UserDataAccessor; +import com.batch.android.core.Promise; +import com.batch.android.di.DITest; +import com.batch.android.di.DITestUtils; +import com.batch.android.di.providers.RuntimeManagerProvider; +import com.batch.android.di.providers.UserModuleProvider; +import com.batch.android.module.UserModule; +import java.lang.reflect.Field; +import java.net.URI; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class InstallDataEditorTest extends DITest { + + private InstallDataEditor editor; + private Context context; + + @Before + public void setUp() { + super.setUp(); + context = ApplicationProvider.getApplicationContext(); + simulateBatchStart(context); + editor = Batch.Profile.editor(); + } + + @After + public void tearDown() { + super.tearDown(); + UserModuleProvider.get().clearInstallationData(); + } + + @Test + public void testAttributesRead() throws Exception { + editor.setAttribute("today", new Date()); + editor.setAttribute("float_value", 3.2); + editor.setAttribute("int_value", 4); + editor.setAttribute("url_value", new URI("batch://batch.com")); + editor.setAttribute("wrong_url_value", new URI("batch.com")); + editor.saveSync(); + + MockBatchAttributesFetchListener listener = new MockBatchAttributesFetchListener(); + + final Context ctx = RuntimeManagerProvider.get().getContext(); + UserDataAccessor.fetchAttributes(ctx, listener, false); + + Map result = listener.getAttributes(); + + assertTrue(listener.didFinish()); + assertFalse(listener.didFail()); + assertNotNull(result); + assertEquals(4, listener.getAttributes().size()); // 3 attributes were set + + BatchUserAttribute dateValue = result.get("today"); + BatchUserAttribute urlValue = result.get("url_value"); + BatchUserAttribute wrongUrlValue = result.get("wrong_url_value"); + assertNotNull(dateValue); + assertNull(dateValue.getStringValue()); + assertNull(dateValue.getNumberValue()); + assertNull(dateValue.getBooleanValue()); + assertNull(dateValue.getUriValue()); + assertNotNull(dateValue.getDateValue()); + + assertNull(wrongUrlValue); + assertNotNull(urlValue); + assertNotNull(urlValue.getUriValue()); + } + + @Test + public void testTagCollectionsRead() throws Exception { + editor.saveSync(); + editor.addTag("collection_1", "tag_1"); + editor.addTag("collection_1", "tag_2"); + editor.addTag("collection_2", "tag_3"); + editor.addTag("collection_3", "TAG_4"); + editor.saveSync(); + + MockBatchTagCollectionsFetchListener listener = new MockBatchTagCollectionsFetchListener(); + + Context ctx = RuntimeManagerProvider.get().getContext(); + + UserDataAccessor.fetchTagCollections(ctx, listener, false); + + Map> result = listener.getTagCollections(); + + assertTrue(listener.didFinish()); + assertFalse(listener.didFail()); + assertNotNull(result); + assertEquals(result.size(), 3); // 3 collections were set + Set collection1 = result.get("collection_1"); + assertTrue(collection1.contains("tag_2")); + assertFalse(collection1.contains("tag_3")); + Set collection3 = result.get("collection_3"); + assertTrue(collection3.contains("tag_4")); // tags are set to lowercase when saved + } + + @Test + public void testCustomDataRead() throws Exception { + // Inital test + String initialRegion = Batch.User.getRegion(context); + String initialLanguage = Batch.User.getLanguage(context); + + assertNull(initialRegion); + assertNull(initialLanguage); + + editor.setRegion("az"); + editor.setLanguage("ba"); + + Promise savePromise = editor.saveSync(); + + // No error + assertEquals(Promise.Status.RESOLVED, savePromise.getStatus()); + // Test reading + assertEquals("az", Batch.User.getRegion(context)); + assertEquals("ba", Batch.User.getLanguage(context)); + + // Clear custom data + editor.setRegion(null); + editor.setLanguage(null); + + savePromise = editor.saveSync(); + + // No error + assertEquals(Promise.Status.RESOLVED, savePromise.getStatus()); + + // Test if clearing succeeded and that we're back to initial state. + assertNull(Batch.User.getRegion(context)); + assertNull(Batch.User.getLanguage(context)); + assertEquals(Batch.User.getRegion(context), initialRegion); + assertEquals(Batch.User.getLanguage(context), initialLanguage); + assertNull(Batch.User.getIdentifier(context)); + } + + @Test + public void testUserOperationsStacked() throws Exception { + UserModule module = DITestUtils.mockSingletonDependency(UserModule.class, null); + InstallDataEditor editor = Batch.Profile.editor(); + editor.setAttribute("dummy", "value").save(); + editor.setAttribute("dummy", "value").save(); + Batch.Profile.editor().setAttribute("dummy", "value").save(); + + Field fieldQueues = UserModule.class.getDeclaredField("operationQueues"); + fieldQueues.setAccessible(true); + List queues = (List) fieldQueues.get(module); + + // Ensure every editor instance has added its queue + Assert.assertEquals(3, queues.size()); + } +} diff --git a/Sources/sdk/src/test/java/com/batch/android/user/UserModuleTest.kt b/Sources/sdk/src/test/java/com/batch/android/user/UserModuleTest.kt new file mode 100644 index 0000000..81de33d --- /dev/null +++ b/Sources/sdk/src/test/java/com/batch/android/user/UserModuleTest.kt @@ -0,0 +1,93 @@ +package com.batch.android.user + +import android.content.Context +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest + +import com.batch.android.MockBatchAttributesFetchListener +import com.batch.android.MockBatchTagCollectionsFetchListener +import com.batch.android.UserDataAccessor +import com.batch.android.di.DITest +import com.batch.android.di.providers.UserModuleProvider +import org.junit.Assert +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +@SmallTest +class UserModuleTest : DITest() { + + private lateinit var context: Context + + override fun setUp() { + super.setUp() + context = ApplicationProvider.getApplicationContext() + simulateBatchStart(context) + } + + @Test + fun testSetLanguage() { + val expected = "fr" + val userModule = UserModuleProvider.get() + // Ensure default value is null + Assert.assertNull(userModule.getLanguage(context)) + // Set a new value + userModule.setLanguage(context, expected) + // Ensure we get the new value + Assert.assertEquals(expected, userModule.getLanguage(context)) + } + + @Test + fun testSetRegion() { + val expected = "FR" + val userModule = UserModuleProvider.get() + // Ensure default value is null + Assert.assertNull(userModule.getRegion(context)) + // Set a new value + userModule.setRegion(context, expected) + // Ensure we get the new value + Assert.assertEquals(expected, userModule.getRegion(context)) + } + + @Test + fun testSetCustomID() { + val expected = "test_custom_user_id" + val userModule = UserModuleProvider.get() + // Ensure default value is null + Assert.assertNull(userModule.getCustomID(context)) + // Set a new value + userModule.setCustomID(context, expected) + // Ensure we get the new value + Assert.assertEquals(expected, userModule.getCustomID(context)) + } + + @Test + fun testClearInstallData() { + val userModule = UserModuleProvider.get() + + // initial state + InstallDataEditor().addTag("collection","tag") + .setAttribute("attribute","string") + .saveSync() + val attributeListener = MockBatchAttributesFetchListener() + val tagsListener = MockBatchTagCollectionsFetchListener() + + // Fetch and ensure data has been saved + UserDataAccessor.fetchAttributes(context, attributeListener, false) + UserDataAccessor.fetchTagCollections(context, tagsListener, false) + Assert.assertEquals(1, attributeListener.attributes.size) + Assert.assertEquals(1, tagsListener.tagCollections.size) + + // Clear data + userModule.clearInstallationData() + + Thread.sleep(100) + + // Fetch again and ensure data has been cleared + UserDataAccessor.fetchAttributes(context, attributeListener, false) + UserDataAccessor.fetchTagCollections(context, tagsListener, false) + Assert.assertEquals(0, attributeListener.attributes.size) + Assert.assertEquals(0, tagsListener.tagCollections.size) + } +} \ No newline at end of file diff --git a/proguard-mappings/1.20.2/checksum.sha b/proguard-mappings/1.20.2/checksum.sha new file mode 100644 index 0000000..c88b795 --- /dev/null +++ b/proguard-mappings/1.20.2/checksum.sha @@ -0,0 +1 @@ +c88e1e745b250f1dec3fd496b353228194991598 public-sdk/Batch.aar diff --git a/proguard-mappings/1.20.2/mapping.txt b/proguard-mappings/1.20.2/mapping.txt new file mode 100644 index 0000000..b5a22e2 --- /dev/null +++ b/proguard-mappings/1.20.2/mapping.txt @@ -0,0 +1,9869 @@ +# compiler: R8 +# compiler_version: 8.0.46 +# common_typos_disable +# {"id":"com.android.tools.r8.mapping","version":"2.1"} +# pg_map_id: a2e4fba +# pg_map_hash: SHA-256 a2e4fba878558b37b00a77051c486cb5b0b1389955ea7a7fa66e45b245886e6d +com.batch.android.AdsIdentifierProvider -> com.batch.android.AdsIdentifierProvider: +# {"id":"sourceFile","fileName":"AdsIdentifierProvider.java"} +com.batch.android.AdsIdentifierProvider$AdsIdentifierListener -> com.batch.android.AdsIdentifierProvider$AdsIdentifierListener: +# {"id":"sourceFile","fileName":"AdsIdentifierProvider.java"} +com.batch.android.AdsIdentifierProviderAvailabilityException -> com.batch.android.AdsIdentifierProviderAvailabilityException: +# {"id":"sourceFile","fileName":"AdsIdentifierProviderAvailabilityException.java"} + 1:1:void (java.lang.String):9:9 -> +com.batch.android.AdvertisingID -> com.batch.android.a: +# {"id":"sourceFile","fileName":"AdvertisingID.java"} + java.lang.String advertisingID -> a + boolean limited -> b + boolean advertisingIdReady -> c + java.lang.String UNAVAILABLE_AD_ID -> e + java.lang.String TAG -> d + 1:1:void ():48:48 -> + 2:8:void ():44:50 -> + 1:1:java.lang.String access$002(com.batch.android.AdvertisingID,java.lang.String):16:16 -> a + 2:2:boolean access$102(com.batch.android.AdvertisingID,boolean):16:16 -> a + 3:7:java.lang.String get():105:109 -> a + 8:8:java.lang.String get():106:106 -> a + 1:1:boolean access$202(com.batch.android.AdvertisingID,boolean):16:16 -> b + 2:11:void initAdvertisingID():57:66 -> b + 12:12:void initAdvertisingID():62:62 -> b + 1:5:boolean isLimited():119:123 -> c + 6:6:boolean isLimited():120:120 -> c + 1:1:boolean isNotNull():132:132 -> d + 1:1:boolean isReady():94:94 -> e +com.batch.android.AdvertisingID$1 -> com.batch.android.a$a: +# {"id":"sourceFile","fileName":"AdvertisingID.java"} + com.batch.android.AdvertisingID this$0 -> a + 1:1:void (com.batch.android.AdvertisingID):67:67 -> + 1:2:void onError(java.lang.Exception):78:79 -> onError + 1:4:void onSuccess(java.lang.String,boolean):70:73 -> onSuccess +com.batch.android.AttributesCheckWebservice -> com.batch.android.b: +# {"id":"sourceFile","fileName":"AttributesCheckWebservice.java"} + java.lang.String TAG -> v + long version -> s + com.batch.android.webservice.listener.AttributesCheckWebserviceListener listener -> u + java.lang.String transactionID -> t + 1:16:void (android.content.Context,long,java.lang.String,com.batch.android.webservice.listener.AttributesCheckWebserviceListener):51:66 -> + 17:17:void (android.content.Context,long,java.lang.String,com.batch.android.webservice.listener.AttributesCheckWebserviceListener):61:61 -> + 18:18:void (android.content.Context,long,java.lang.String,com.batch.android.webservice.listener.AttributesCheckWebserviceListener):57:57 -> + 19:19:void (android.content.Context,long,java.lang.String,com.batch.android.webservice.listener.AttributesCheckWebserviceListener):53:53 -> + 1:1:java.lang.String getSpecificConnectTimeoutKey():180:180 -> A + 1:1:java.lang.String getSpecificReadTimeoutKey():185:185 -> B + 1:1:java.lang.String getSpecificRetryCountKey():190:190 -> C + 1:1:java.lang.String getURLSorterPatternParameterKey():155:155 -> F + 1:1:java.lang.String getPropertyParameterKey():150:150 -> H + 1:3:java.util.List getQueries():73:75 -> I + 1:1:java.lang.String getTaskIdentifier():143:143 -> a + 1:1:java.lang.String getCryptorModeParameterKey():165:165 -> o + 1:1:java.lang.String getCryptorTypeParameterKey():160:160 -> p + 1:52:void run():83:134 -> run + 53:53:void run():128:128 -> run + 54:68:void run():94:108 -> run + 69:69:void run():105:105 -> run + 70:70:void run():102:102 -> run + 71:109:void run():99:137 -> run + 1:1:java.lang.String getPostCryptorTypeParameterKey():170:170 -> v + 1:1:java.lang.String getReadCryptorTypeParameterKey():175:175 -> y +com.batch.android.AttributesCheckWebservice$1 -> com.batch.android.b$a: +# {"id":"sourceFile","fileName":"AttributesCheckWebservice.java"} + int[] $SwitchMap$com$batch$android$core$Webservice$WebserviceError$Reason -> a + 1:1:void ():97:97 -> +com.batch.android.AttributesSendWebservice -> com.batch.android.c: +# {"id":"sourceFile","fileName":"AttributesSendWebservice.java"} + java.lang.String TAG -> w + java.util.Map attributes -> t + long version -> s + java.util.Map tags -> u + com.batch.android.webservice.listener.AttributesSendWebserviceListener listener -> v + 1:21:void (android.content.Context,long,java.util.Map,java.util.Map,com.batch.android.webservice.listener.AttributesSendWebserviceListener):58:78 -> + 22:22:void (android.content.Context,long,java.util.Map,java.util.Map,com.batch.android.webservice.listener.AttributesSendWebserviceListener):72:72 -> + 23:23:void (android.content.Context,long,java.util.Map,java.util.Map,com.batch.android.webservice.listener.AttributesSendWebserviceListener):68:68 -> + 24:24:void (android.content.Context,long,java.util.Map,java.util.Map,com.batch.android.webservice.listener.AttributesSendWebserviceListener):64:64 -> + 25:25:void (android.content.Context,long,java.util.Map,java.util.Map,com.batch.android.webservice.listener.AttributesSendWebserviceListener):60:60 -> + 1:1:java.lang.String getSpecificConnectTimeoutKey():189:189 -> A + 1:1:java.lang.String getSpecificReadTimeoutKey():194:194 -> B + 1:1:java.lang.String getSpecificRetryCountKey():199:199 -> C + 1:1:java.lang.String getURLSorterPatternParameterKey():164:164 -> F + 1:1:java.lang.String getPropertyParameterKey():159:159 -> H + 1:3:java.util.List getQueries():85:87 -> I + 1:1:java.lang.String getTaskIdentifier():152:152 -> a + 1:1:java.lang.String getCryptorModeParameterKey():174:174 -> o + 1:1:java.lang.String getCryptorTypeParameterKey():169:169 -> p + 1:49:void run():95:143 -> run + 50:50:void run():137:137 -> run + 51:65:void run():106:120 -> run + 66:66:void run():117:117 -> run + 67:67:void run():114:114 -> run + 68:103:void run():111:146 -> run + 1:1:java.lang.String getPostCryptorTypeParameterKey():179:179 -> v + 1:1:java.lang.String getReadCryptorTypeParameterKey():184:184 -> y +com.batch.android.AttributesSendWebservice$1 -> com.batch.android.c$a: +# {"id":"sourceFile","fileName":"AttributesSendWebservice.java"} + int[] $SwitchMap$com$batch$android$core$Webservice$WebserviceError$Reason -> a + 1:1:void ():109:109 -> +com.batch.android.Batch -> com.batch.android.Batch: +# {"id":"sourceFile","fileName":"Batch.java"} + android.content.Intent newIntent -> f + com.batch.android.User user -> d + java.lang.String sessionID -> h + boolean didLogOptOutWarning -> i + com.batch.android.core.ExcludedActivityHelper excludedActivityHelper -> g + android.content.BroadcastReceiver receiver -> e + com.batch.android.module.BatchModule moduleMaster -> j + com.batch.android.AdvertisingID advertisingID -> b + com.batch.android.Config config -> a + com.batch.android.Install install -> c + 1:66:void ():110:175 -> + 1:1:void ():180:180 -> + 1:1:void manageUpdate(java.lang.String,java.lang.String):0:0 -> a + 2:2:com.batch.android.Install access$000():78:78 -> a + 3:4:void lambda$getAPIKey$0(java.lang.StringBuilder,com.batch.android.runtime.State):193:194 -> a + 5:12:com.batch.android.runtime.State lambda$setConfig$1(com.batch.android.Config,com.batch.android.runtime.State):245:252 -> a + 13:14:void lambda$getLoggerLevel$5(java.util.concurrent.atomic.AtomicReference,com.batch.android.runtime.State):336:337 -> a + 15:23:void _optOut(android.content.Context,boolean,com.batch.android.BatchOptOutResultListener):505:513 -> a + 24:24:void _optOut(android.content.Context,boolean,com.batch.android.BatchOptOutResultListener):501:501 -> a + 25:28:void lambda$_optOut$7(android.content.Context,java.lang.Void):508:511 -> a + 29:29:void lambda$_optOut$8(com.batch.android.BatchOptOutResultListener,java.lang.Exception):515:515 -> a + 30:401:void doBatchStart(android.content.Context,boolean,boolean):2024:2395 -> a + 402:681:com.batch.android.runtime.State lambda$doBatchStart$9(com.batch.android.runtime.RuntimeManager,boolean,android.content.Context,boolean,java.util.concurrent.atomic.AtomicBoolean,java.lang.StringBuilder,com.batch.android.runtime.State):2031:2310 -> a + 682:712:com.batch.android.runtime.State lambda$doBatchStart$9(com.batch.android.runtime.RuntimeManager,boolean,android.content.Context,boolean,java.util.concurrent.atomic.AtomicBoolean,java.lang.StringBuilder,com.batch.android.runtime.State):2308:2338 -> a + 713:730:com.batch.android.runtime.State lambda$doBatchStart$9(com.batch.android.runtime.RuntimeManager,boolean,android.content.Context,boolean,java.util.concurrent.atomic.AtomicBoolean,java.lang.StringBuilder,com.batch.android.runtime.State):2337:2354 -> a + 731:732:void lambda$doBatchStart$10(com.batch.android.runtime.RuntimeManager,java.util.concurrent.atomic.AtomicBoolean,java.lang.StringBuilder,boolean,com.batch.android.runtime.State):2374:2375 -> a + 733:733:void lambda$doBatchStart$10(com.batch.android.runtime.RuntimeManager,java.util.concurrent.atomic.AtomicBoolean,java.lang.StringBuilder,boolean,com.batch.android.runtime.State):2372:2372 -> a + 734:798:com.batch.android.runtime.State lambda$onStop$11(boolean,android.content.Context,boolean,com.batch.android.runtime.State):2414:2478 -> a + 799:799:com.batch.android.runtime.State lambda$onStop$11(boolean,android.content.Context,boolean,com.batch.android.runtime.State):2466:2466 -> a + 800:800:void lambda$onWebserviceExecutorWorkFinished$12(java.util.concurrent.atomic.AtomicBoolean,com.batch.android.runtime.State):2501:2501 -> a + 801:812:com.batch.android.runtime.State lambda$doStop$13(com.batch.android.runtime.State):2523:2534 -> a + 1:1:void access$100():78:78 -> b + 2:3:void lambda$shouldUseAdvancedDeviceInformation$3(java.util.concurrent.atomic.AtomicBoolean,com.batch.android.runtime.State):286:287 -> b + 4:5:void lambda$getSessionID$6(java.lang.StringBuilder,com.batch.android.runtime.State):355:356 -> b + 6:84:void onStop(android.content.Context,boolean,boolean):2410:2488 -> b + 1:1:void access$200():78:78 -> c + 2:3:void lambda$shouldUseAdvertisingID$2(java.util.concurrent.atomic.AtomicBoolean,com.batch.android.runtime.State):268:269 -> c + 1:1:void copyBatchExtras(android.content.Intent,android.content.Intent):393:393 -> copyBatchExtras + 2:2:void copyBatchExtras(android.os.Bundle,android.os.Bundle):406:406 -> copyBatchExtras + 1:2:void lambda$shouldUseGoogleInstanceID$4(java.util.concurrent.atomic.AtomicBoolean,com.batch.android.runtime.State):306:307 -> d + 3:6:void clearCachedInstallData():2557:2560 -> d + 1:22:void doStop():2519:2540 -> e + 1:1:com.batch.android.AdvertisingID getAdvertisingID():2571:2571 -> f + 1:1:com.batch.android.Install getInstall():2580:2580 -> g + 1:11:java.lang.String getAPIKey():189:199 -> getAPIKey + 1:1:java.lang.String getBroadcastPermissionName(android.content.Context):416:416 -> getBroadcastPermissionName + 1:10:com.batch.android.LoggerLevel getLoggerLevel():332:341 -> getLoggerLevel + 1:12:java.lang.String getSessionID():350:361 -> getSessionID + 1:9:com.batch.android.BatchUserProfile getUserProfile():220:228 -> getUserProfile + 1:1:com.batch.android.User getUser():2589:2589 -> h + 1:10:void onWebserviceExecutorWorkFinished():2498:2507 -> i + 1:1:boolean isOptedOut(android.content.Context):548:548 -> isOptedOut + 2:2:boolean isOptedOut(android.content.Context):546:546 -> isOptedOut + 1:3:boolean isRunningInDevMode():376:378 -> isRunningInDevMode + 1:23:void updateVersionManagement():2599:2621 -> j + 1:3:void onCreate(android.app.Activity):1935:1937 -> onCreate + 1:1:void onDestroy(android.app.Activity):2017:2017 -> onDestroy + 1:2:void onNewIntent(android.app.Activity,android.content.Intent):1996:1997 -> onNewIntent + 1:1:void onServiceCreate(android.content.Context,boolean):1975:1975 -> onServiceCreate + 1:1:void onServiceDestroy(android.content.Context):1986:1986 -> onServiceDestroy + 1:1:void onStart(android.app.Activity):1954:1954 -> onStart + 1:1:void onStop(android.app.Activity):2007:2007 -> onStop + 1:1:void optIn(android.content.Context):535:535 -> optIn + 2:2:void optIn(android.content.Context):533:533 -> optIn + 1:1:void optOut(android.content.Context):442:442 -> optOut + 2:2:void optOut(android.content.Context,com.batch.android.BatchOptOutResultListener):458:458 -> optOut + 1:1:void optOutAndWipeData(android.content.Context):472:472 -> optOutAndWipeData + 2:2:void optOutAndWipeData(android.content.Context,com.batch.android.BatchOptOutResultListener):491:491 -> optOutAndWipeData + 1:2:void setConfig(com.batch.android.Config):243:244 -> setConfig + 1:1:void setFindMyInstallationEnabled(boolean):560:560 -> setFindMyInstallationEnabled + 1:10:boolean shouldUseAdvancedDeviceInformation():282:291 -> shouldUseAdvancedDeviceInformation + 1:10:boolean shouldUseAdvertisingID():264:273 -> shouldUseAdvertisingID + 1:10:boolean shouldUseGoogleInstanceID():302:311 -> shouldUseGoogleInstanceID +com.batch.android.Batch$1 -> com.batch.android.Batch$a: +# {"id":"sourceFile","fileName":"Batch.java"} +com.batch.android.Batch$Actions -> com.batch.android.Batch$Actions: +# {"id":"sourceFile","fileName":"Batch.java"} + 1:1:void ():1854:1854 -> + 1:1:void addDrawableAlias(java.lang.String,int):1894:1894 -> addDrawableAlias + 1:1:boolean performAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject):1911:1911 -> performAction + 1:1:void register(com.batch.android.UserAction):1866:1866 -> register + 1:1:void setDeeplinkInterceptor(com.batch.android.BatchDeeplinkInterceptor):1920:1920 -> setDeeplinkInterceptor + 1:1:void unregister(java.lang.String):1878:1878 -> unregister +com.batch.android.Batch$Debug -> com.batch.android.Batch$Debug: +# {"id":"sourceFile","fileName":"Batch.java"} + 1:1:void ():571:571 -> + 1:2:void startDebugActivity(android.content.Context):582:583 -> startDebugActivity +com.batch.android.Batch$EventDispatcher -> com.batch.android.Batch$EventDispatcher: +# {"id":"sourceFile","fileName":"Batch.java"} + 1:1:void ():1158:1158 -> + 1:1:void addDispatcher(com.batch.android.BatchEventDispatcher):1167:1167 -> addDispatcher + 1:1:boolean removeDispatcher(com.batch.android.BatchEventDispatcher):1176:1176 -> removeDispatcher +com.batch.android.Batch$EventDispatcher$Payload -> com.batch.android.Batch$EventDispatcher$Payload: +# {"id":"sourceFile","fileName":"Batch.java"} +com.batch.android.Batch$EventDispatcher$Type -> com.batch.android.Batch$EventDispatcher$Type: +# {"id":"sourceFile","fileName":"Batch.java"} + com.batch.android.Batch$EventDispatcher$Type[] $VALUES -> a + 1:9:void ():1185:1193 -> + 10:10:void ():1183:1183 -> + 1:1:void (java.lang.String,int):1184:1184 -> + 1:1:com.batch.android.Batch$EventDispatcher$Type[] $values():1183:1183 -> a + 1:1:boolean isMessagingEvent():1200:1200 -> isMessagingEvent + 1:1:boolean isNotificationEvent():1196:1196 -> isNotificationEvent + 1:1:com.batch.android.Batch$EventDispatcher$Type valueOf(java.lang.String):1183:1183 -> valueOf + 1:1:com.batch.android.Batch$EventDispatcher$Type[] values():1183:1183 -> values +com.batch.android.Batch$Inbox -> com.batch.android.Batch$Inbox: +# {"id":"sourceFile","fileName":"Batch.java"} + 1:1:void ():595:595 -> + 1:2:com.batch.android.BatchInboxFetcher getFetcher(android.content.Context):609:610 -> getFetcher + 3:3:com.batch.android.BatchInboxFetcher getFetcher(android.content.Context):607:607 -> getFetcher + 4:4:com.batch.android.BatchInboxFetcher getFetcher(android.content.Context,java.lang.String,java.lang.String):631:631 -> getFetcher + 5:5:com.batch.android.BatchInboxFetcher getFetcher(android.content.Context,java.lang.String,java.lang.String):629:629 -> getFetcher + 6:6:com.batch.android.BatchInboxFetcher getFetcher(java.lang.String,java.lang.String):646:646 -> getFetcher +com.batch.android.Batch$InternalBroadcastReceiver -> com.batch.android.Batch$b: +# {"id":"sourceFile","fileName":"Batch.java"} + 1:1:void ():2633:2633 -> + 2:2:void (com.batch.android.Batch$1):2633:2633 -> + 1:12:void onReceive(android.content.Context,android.content.Intent):2641:2652 -> onReceive + 13:13:void onReceive(android.content.Context,android.content.Intent):2649:2649 -> onReceive +com.batch.android.Batch$Messaging -> com.batch.android.Batch$Messaging: +# {"id":"sourceFile","fileName":"Batch.java"} + 1:1:void ():1528:1528 -> + 1:1:boolean hasPendingMessage():1830:1830 -> hasPendingMessage + 1:1:boolean isDoNotDisturbEnabled():1821:1821 -> isDoNotDisturbEnabled + 1:1:com.batch.android.BatchBannerView loadBanner(android.content.Context,com.batch.android.BatchMessage):1771:1771 -> loadBanner + 1:1:androidx.fragment.app.DialogFragment loadFragment(android.content.Context,com.batch.android.BatchMessage):1752:1752 -> loadFragment + 1:1:com.batch.android.BatchMessage popPendingMessage():1843:1843 -> popPendingMessage + 1:1:void setAutomaticMode(boolean):1706:1706 -> setAutomaticMode + 1:1:void setDoNotDisturbEnabled(boolean):1814:1814 -> setDoNotDisturbEnabled + 1:1:void setLifecycleListener(com.batch.android.Batch$Messaging$LifecycleListener):1728:1728 -> setLifecycleListener + 1:1:void setShowForegroundLandings(boolean):1695:1695 -> setShowForegroundLandings + 1:1:void setTypefaceOverride(android.graphics.Typeface,android.graphics.Typeface):1719:1719 -> setTypefaceOverride + 1:1:void show(android.content.Context,com.batch.android.BatchMessage):1794:1794 -> show + 2:2:void show(android.content.Context,com.batch.android.BatchMessage):1792:1792 -> show + 3:3:void show(android.content.Context,com.batch.android.BatchMessage):1789:1789 -> show +com.batch.android.Batch$Messaging$DisplayHint -> com.batch.android.Batch$Messaging$DisplayHint: +# {"id":"sourceFile","fileName":"Batch.java"} + com.batch.android.Batch$Messaging$DisplayHintStrategy strategy -> a + android.view.View view -> b + 1:3:void (android.view.View,com.batch.android.Batch$Messaging$DisplayHintStrategy):1650:1652 -> + 1:1:com.batch.android.Batch$Messaging$DisplayHint embed(android.widget.FrameLayout):1678:1678 -> embed + 2:2:com.batch.android.Batch$Messaging$DisplayHint embed(android.widget.FrameLayout):1675:1675 -> embed + 1:1:com.batch.android.Batch$Messaging$DisplayHint findUsingView(android.view.View):1665:1665 -> findUsingView + 2:2:com.batch.android.Batch$Messaging$DisplayHint findUsingView(android.view.View):1662:1662 -> findUsingView +com.batch.android.Batch$Messaging$DisplayHintProvider -> com.batch.android.Batch$Messaging$DisplayHintProvider: +# {"id":"sourceFile","fileName":"Batch.java"} +com.batch.android.Batch$Messaging$DisplayHintStrategy -> com.batch.android.Batch$Messaging$a: +# {"id":"sourceFile","fileName":"Batch.java"} + com.batch.android.Batch$Messaging$DisplayHintStrategy EMBED -> b + com.batch.android.Batch$Messaging$DisplayHintStrategy[] $VALUES -> c + com.batch.android.Batch$Messaging$DisplayHintStrategy TRANSVERSE_HIERARCHY -> a + 1:2:void ():1635:1636 -> + 3:3:void ():1634:1634 -> + 1:1:void (java.lang.String,int):1634:1634 -> + 1:1:com.batch.android.Batch$Messaging$DisplayHintStrategy[] $values():1634:1634 -> a + 1:1:com.batch.android.Batch$Messaging$DisplayHintStrategy valueOf(java.lang.String):1634:1634 -> valueOf + 1:1:com.batch.android.Batch$Messaging$DisplayHintStrategy[] values():1634:1634 -> values +com.batch.android.Batch$Messaging$LifecycleListener -> com.batch.android.Batch$Messaging$LifecycleListener: +# {"id":"sourceFile","fileName":"Batch.java"} +com.batch.android.Batch$Messaging$LifecycleListener2 -> com.batch.android.Batch$Messaging$LifecycleListener2: +# {"id":"sourceFile","fileName":"Batch.java"} +com.batch.android.Batch$Push -> com.batch.android.Batch$Push: +# {"id":"sourceFile","fileName":"Batch.java"} + 1:1:void ():658:658 -> + 1:1:void appendBatchData(android.content.Intent,android.content.Intent):826:826 -> appendBatchData + 2:2:void appendBatchData(android.os.Bundle,android.content.Intent):837:837 -> appendBatchData + 3:3:void appendBatchData(com.google.firebase.messaging.RemoteMessage,android.content.Intent):848:848 -> appendBatchData + 1:1:void dismissNotifications():739:739 -> dismissNotifications + 1:1:void displayNotification(android.content.Context,android.content.Intent):1012:1012 -> displayNotification + 2:2:void displayNotification(android.content.Context,android.content.Intent,boolean):1023:1023 -> displayNotification + 3:3:void displayNotification(android.content.Context,android.content.Intent,com.batch.android.BatchNotificationInterceptor):1038:1038 -> displayNotification + 4:4:void displayNotification(android.content.Context,android.content.Intent,com.batch.android.BatchNotificationInterceptor,boolean):1056:1056 -> displayNotification + 5:5:void displayNotification(android.content.Context,com.google.firebase.messaging.RemoteMessage):1063:1063 -> displayNotification + 6:6:void displayNotification(android.content.Context,com.google.firebase.messaging.RemoteMessage,com.batch.android.BatchNotificationInterceptor):1075:1075 -> displayNotification + 1:1:com.batch.android.BatchNotificationChannelsManager getChannelsManager():726:726 -> getChannelsManager + 1:1:java.lang.String getLastKnownPushToken():1118:1118 -> getLastKnownPushToken + 1:1:java.util.EnumSet getNotificationsType(android.content.Context):749:749 -> getNotificationsType + 1:1:boolean isBatchPush(android.content.Intent):776:776 -> isBatchPush + 2:2:boolean isBatchPush(com.google.firebase.messaging.RemoteMessage):788:788 -> isBatchPush + 1:1:boolean isManualDisplayModeActivated():805:805 -> isManualDisplayModeActivated + 1:1:android.app.PendingIntent makePendingIntent(android.content.Context,android.content.Intent,android.os.Bundle):882:882 -> makePendingIntent + 2:2:android.app.PendingIntent makePendingIntent(android.content.Context,android.content.Intent,android.os.Bundle):879:879 -> makePendingIntent + 3:3:android.app.PendingIntent makePendingIntent(android.content.Context,android.content.Intent,android.os.Bundle):875:875 -> makePendingIntent + 4:4:android.app.PendingIntent makePendingIntent(android.content.Context,android.content.Intent,android.os.Bundle):871:871 -> makePendingIntent + 5:5:android.app.PendingIntent makePendingIntent(android.content.Context,android.content.Intent,com.google.firebase.messaging.RemoteMessage):916:916 -> makePendingIntent + 6:6:android.app.PendingIntent makePendingIntent(android.content.Context,android.content.Intent,com.google.firebase.messaging.RemoteMessage):913:913 -> makePendingIntent + 7:7:android.app.PendingIntent makePendingIntent(android.content.Context,android.content.Intent,com.google.firebase.messaging.RemoteMessage):909:909 -> makePendingIntent + 8:8:android.app.PendingIntent makePendingIntent(android.content.Context,android.content.Intent,com.google.firebase.messaging.RemoteMessage):905:905 -> makePendingIntent + 1:1:android.app.PendingIntent makePendingIntentForDeeplink(android.content.Context,java.lang.String,android.os.Bundle):948:948 -> makePendingIntentForDeeplink + 2:2:android.app.PendingIntent makePendingIntentForDeeplink(android.content.Context,java.lang.String,android.os.Bundle):945:945 -> makePendingIntentForDeeplink + 3:3:android.app.PendingIntent makePendingIntentForDeeplink(android.content.Context,java.lang.String,android.os.Bundle):941:941 -> makePendingIntentForDeeplink + 4:4:android.app.PendingIntent makePendingIntentForDeeplink(android.content.Context,java.lang.String,android.os.Bundle):937:937 -> makePendingIntentForDeeplink + 5:5:android.app.PendingIntent makePendingIntentForDeeplink(android.content.Context,java.lang.String,com.google.firebase.messaging.RemoteMessage):980:980 -> makePendingIntentForDeeplink + 6:6:android.app.PendingIntent makePendingIntentForDeeplink(android.content.Context,java.lang.String,com.google.firebase.messaging.RemoteMessage):977:977 -> makePendingIntentForDeeplink + 7:7:android.app.PendingIntent makePendingIntentForDeeplink(android.content.Context,java.lang.String,com.google.firebase.messaging.RemoteMessage):973:973 -> makePendingIntentForDeeplink + 8:8:android.app.PendingIntent makePendingIntentForDeeplink(android.content.Context,java.lang.String,com.google.firebase.messaging.RemoteMessage):969:969 -> makePendingIntentForDeeplink + 1:1:void onNotificationDisplayed(android.content.Context,android.content.Intent):1095:1095 -> onNotificationDisplayed + 2:2:void onNotificationDisplayed(android.content.Context,com.google.firebase.messaging.RemoteMessage):1105:1105 -> onNotificationDisplayed + 1:1:void refreshRegistration():1135:1135 -> refreshRegistration + 1:1:void requestNotificationPermission(android.content.Context):1146:1146 -> requestNotificationPermission + 1:1:void setAdditionalIntentFlags(java.lang.Integer):1085:1085 -> setAdditionalIntentFlags + 1:1:void setGCMSenderId(java.lang.String):687:687 -> setGCMSenderId + 1:1:void setLargeIcon(android.graphics.Bitmap):718:718 -> setLargeIcon + 1:1:void setManualDisplay(boolean):815:815 -> setManualDisplay + 1:1:void setNotificationInterceptor(com.batch.android.BatchNotificationInterceptor):1127:1127 -> setNotificationInterceptor + 1:1:void setNotificationsColor(int):798:798 -> setNotificationsColor + 1:1:void setNotificationsType(java.util.EnumSet):764:764 -> setNotificationsType + 1:1:void setSmallIconResourceId(int):696:696 -> setSmallIconResourceId + 1:1:void setSound(android.net.Uri):709:709 -> setSound + 1:1:boolean shouldDisplayPush(android.content.Context,android.content.Intent):990:990 -> shouldDisplayPush + 2:2:boolean shouldDisplayPush(android.content.Context,com.google.firebase.messaging.RemoteMessage):1002:1002 -> shouldDisplayPush +com.batch.android.Batch$User -> com.batch.android.Batch$User: +# {"id":"sourceFile","fileName":"Batch.java"} + 1:1:void ():1284:1284 -> + 1:1:com.batch.android.BatchUserDataEditor editor():1363:1363 -> editor + 1:1:void fetchAttributes(android.content.Context,com.batch.android.BatchAttributesFetchListener):1376:1376 -> fetchAttributes + 1:1:void fetchTagCollections(android.content.Context,com.batch.android.BatchTagCollectionsFetchListener):1389:1389 -> fetchTagCollections + 1:1:com.batch.android.BatchUserDataEditor getEditor():1352:1352 -> getEditor + 1:1:java.lang.String getIdentifier(android.content.Context):1341:1341 -> getIdentifier + 2:2:java.lang.String getIdentifier(android.content.Context):1338:1338 -> getIdentifier + 1:3:java.lang.String getInstallationID():1294:1296 -> getInstallationID + 1:1:java.lang.String getLanguage(android.content.Context):1313:1313 -> getLanguage + 2:2:java.lang.String getLanguage(android.content.Context):1310:1310 -> getLanguage + 1:1:java.lang.String getRegion(android.content.Context):1327:1327 -> getRegion + 2:2:java.lang.String getRegion(android.content.Context):1324:1324 -> getRegion + 1:1:void printDebugInformation():1513:1513 -> printDebugInformation + 1:1:void trackEvent(java.lang.String):1399:1399 -> trackEvent + 2:2:void trackEvent(java.lang.String,java.lang.String):1410:1410 -> trackEvent + 3:10:void trackEvent(java.lang.String,java.lang.String,com.batch.android.json.JSONObject):1426:1433 -> trackEvent + 11:19:void trackEvent(java.lang.String,java.lang.String,com.batch.android.BatchEventData):1448:1456 -> trackEvent + 1:1:void trackLocation(android.location.Location):1470:1470 -> trackLocation + 1:1:void trackTransaction(double):1480:1480 -> trackTransaction + 2:11:void trackTransaction(double,com.batch.android.json.JSONObject):1494:1503 -> trackTransaction +com.batch.android.BatchActionActivity -> com.batch.android.BatchActionActivity: +# {"id":"sourceFile","fileName":"BatchActionActivity.java"} + java.lang.String TAG -> a + 1:1:void ():20:20 -> + 1:1:android.content.Intent addPayloadToIntent(android.content.Intent,android.os.Bundle):28:28 -> a + 2:5:androidx.core.app.TaskStackBuilder addPayloadToTaskStackBuilder(androidx.core.app.TaskStackBuilder,android.os.Bundle):38:41 -> a + 6:40:void launchDeeplink(android.content.Intent,java.lang.String):56:90 -> a + 41:46:void launchDeeplink(android.content.Intent,java.lang.String):81:86 -> a + 47:94:void launchDeeplink(android.content.Intent,java.lang.String):64:111 -> a + 95:100:void launchDeeplink(android.content.Intent,java.lang.String):102:107 -> a + 101:126:void launchDeeplink(android.content.Intent,java.lang.String):94:119 -> a + 1:2:void onDestroy():163:164 -> onDestroy + 1:19:void onStart():124:142 -> onStart + 20:20:void onStart():136:136 -> onStart + 21:39:void onStart():134:152 -> onStart + 1:2:void onStop():157:158 -> onStop +com.batch.android.BatchActionService -> com.batch.android.BatchActionService: +# {"id":"sourceFile","fileName":"BatchActionService.java"} + java.lang.String TAG -> a + java.lang.String ACTION_EXTRA_IDENTIFIER -> c + java.lang.String INTENT_ACTION -> b + java.lang.String ACTION_EXTRA_DISMISS_NOTIFICATION_ID -> e + java.lang.String ACTION_EXTRA_ARGS -> d + 1:1:void ():28:28 -> + 1:47:void onHandleIntent(android.content.Intent):33:79 -> onHandleIntent +com.batch.android.BatchActivityLifecycleHelper -> com.batch.android.BatchActivityLifecycleHelper: +# {"id":"sourceFile","fileName":"BatchActivityLifecycleHelper.java"} + 1:1:void ():19:19 -> + 1:1:void onActivityCreated(android.app.Activity,android.os.Bundle):23:23 -> onActivityCreated + 1:1:void onActivityDestroyed(android.app.Activity):47:47 -> onActivityDestroyed + 1:1:void onActivityStarted(android.app.Activity):28:28 -> onActivityStarted + 1:1:void onActivityStopped(android.app.Activity):39:39 -> onActivityStopped +com.batch.android.BatchAlertContent -> com.batch.android.BatchAlertContent: +# {"id":"sourceFile","fileName":"BatchAlertContent.java"} + java.lang.String trackingIdentifier -> a + java.lang.String body -> c + com.batch.android.BatchAlertContent$CTA acceptCTA -> e + java.lang.String title -> b + java.lang.String cancelLabel -> d + 1:8:void (com.batch.android.messaging.model.AlertMessage):26:33 -> + 1:1:com.batch.android.BatchAlertContent$CTA getAcceptCTA():59:59 -> getAcceptCTA + 1:1:java.lang.String getBody():49:49 -> getBody + 1:1:java.lang.String getCancelLabel():54:54 -> getCancelLabel + 1:1:java.lang.String getTitle():44:44 -> getTitle + 1:1:java.lang.String getTrackingIdentifier():39:39 -> getTrackingIdentifier +com.batch.android.BatchAlertContent$CTA -> com.batch.android.BatchAlertContent$CTA: +# {"id":"sourceFile","fileName":"BatchAlertContent.java"} + com.batch.android.json.JSONObject args -> c + java.lang.String label -> a + java.lang.String action -> b + 1:8:void (com.batch.android.messaging.model.CTA):71:78 -> + 1:1:java.lang.String getAction():90:90 -> getAction + 1:1:com.batch.android.json.JSONObject getArgs():95:95 -> getArgs + 1:1:java.lang.String getLabel():85:85 -> getLabel +com.batch.android.BatchAttributesFetchListener -> com.batch.android.BatchAttributesFetchListener: +# {"id":"sourceFile","fileName":"BatchAttributesFetchListener.java"} +com.batch.android.BatchBannerContent -> com.batch.android.BatchBannerContent: +# {"id":"sourceFile","fileName":"BatchBannerContent.java"} + java.lang.String mediaAccessibilityDescription -> g + java.lang.String mediaURL -> f + java.lang.Long autoCloseTimeMillis -> i + java.util.List ctas -> d + com.batch.android.BatchBannerContent$Action globalTapAction -> e + java.lang.String trackingIdentifier -> a + boolean showCloseButton -> h + java.lang.String body -> c + java.lang.String title -> b + 1:1:void (com.batch.android.messaging.model.BannerMessage):36:36 -> + 2:34:void (com.batch.android.messaging.model.BannerMessage):24:56 -> + 1:1:java.lang.Long getAutoCloseTimeMillis():93:93 -> getAutoCloseTimeMillis + 1:1:java.lang.String getBody():69:69 -> getBody + 1:1:java.util.List getCtas():73:73 -> getCtas + 1:1:com.batch.android.BatchBannerContent$Action getGlobalTapAction():77:77 -> getGlobalTapAction + 1:1:java.lang.String getMediaAccessibilityDescription():85:85 -> getMediaAccessibilityDescription + 1:1:java.lang.String getMediaURL():81:81 -> getMediaURL + 1:1:java.lang.String getTitle():65:65 -> getTitle + 1:1:java.lang.String getTrackingIdentifier():61:61 -> getTrackingIdentifier + 1:1:boolean isShowCloseButton():89:89 -> isShowCloseButton +com.batch.android.BatchBannerContent$Action -> com.batch.android.BatchBannerContent$Action: +# {"id":"sourceFile","fileName":"BatchBannerContent.java"} + com.batch.android.json.JSONObject args -> b + java.lang.String action -> a + 1:7:void (com.batch.android.messaging.model.Action):103:109 -> + 1:1:java.lang.String getAction():116:116 -> getAction + 1:1:com.batch.android.json.JSONObject getArgs():121:121 -> getArgs +com.batch.android.BatchBannerContent$CTA -> com.batch.android.BatchBannerContent$CTA: +# {"id":"sourceFile","fileName":"BatchBannerContent.java"} + java.lang.String label -> c + 1:2:void (com.batch.android.messaging.model.CTA):131:132 -> + 1:1:java.lang.String getLabel():137:137 -> getLabel +com.batch.android.BatchBannerView -> com.batch.android.BatchBannerView: +# {"id":"sourceFile","fileName":"BatchBannerView.java"} + com.batch.android.messaging.model.BannerMessage message -> b + com.batch.android.messaging.view.formats.EmbeddedBannerContainer shownContainer -> c + com.batch.android.MessagingAnalyticsDelegate analyticsDelegate -> e + com.batch.android.BatchMessage rawMessage -> a + boolean shown -> d + 1:1:void (com.batch.android.BatchMessage,com.batch.android.messaging.model.BannerMessage,com.batch.android.MessagingAnalyticsDelegate):39:39 -> + 2:13:void (com.batch.android.BatchMessage,com.batch.android.messaging.model.BannerMessage,com.batch.android.MessagingAnalyticsDelegate):31:42 -> + 1:8:void lambda$show$0(android.view.View):123:130 -> a + 9:16:void lambda$embed$1(android.widget.FrameLayout):163:170 -> a + 1:2:void dismiss(boolean):186:187 -> dismiss + 1:9:void embed(android.widget.FrameLayout):152:160 -> embed + 10:10:void embed(android.widget.FrameLayout):149:149 -> embed + 1:25:void show(android.app.Activity):64:88 -> show + 26:26:void show(android.app.Activity):58:58 -> show + 27:35:void show(android.view.View):112:120 -> show + 36:36:void show(android.view.View):109:109 -> show +com.batch.android.BatchBannerViewPrivateHelper -> com.batch.android.d: +# {"id":"sourceFile","fileName":"BatchBannerViewPrivateHelper.java"} + 1:1:void ():10:10 -> + 1:1:com.batch.android.BatchBannerView newInstance(com.batch.android.BatchMessage,com.batch.android.messaging.model.BannerMessage,com.batch.android.MessagingAnalyticsDelegate):17:17 -> a +com.batch.android.BatchDeeplinkInterceptor -> com.batch.android.BatchDeeplinkInterceptor: +# {"id":"sourceFile","fileName":"BatchDeeplinkInterceptor.java"} + 1:1:android.content.Intent getFallbackIntent(android.content.Context):31:31 -> getFallbackIntent +com.batch.android.BatchDisplayReceiptJobService -> com.batch.android.BatchDisplayReceiptJobService: +# {"id":"sourceFile","fileName":"BatchDisplayReceiptJobService.java"} + java.lang.String TAG -> a + 1:1:void ():18:18 -> + 1:3:boolean onStartJob(android.app.job.JobParameters):24:26 -> onStartJob +com.batch.android.BatchDisplayReceiptJobService$SendReceiptTask -> com.batch.android.BatchDisplayReceiptJobService$a: +# {"id":"sourceFile","fileName":"BatchDisplayReceiptJobService.java"} + java.lang.ref.WeakReference originService -> a + android.app.job.JobParameters originJobParameters -> b + 1:3:void (android.app.job.JobService,android.app.job.JobParameters):40:42 -> + 1:10:java.lang.Void doInBackground(java.lang.Void[]):47:56 -> a + 1:1:java.lang.Object doInBackground(java.lang.Object[]):35:35 -> doInBackground +com.batch.android.BatchEmailSubscriptionState -> com.batch.android.BatchEmailSubscriptionState: +# {"id":"sourceFile","fileName":"BatchEmailSubscriptionState.java"} + com.batch.android.BatchEmailSubscriptionState[] $VALUES -> a + 1:2:void ():10:11 -> + 3:3:void ():8:8 -> + 1:1:void (java.lang.String,int):9:9 -> + 1:1:com.batch.android.BatchEmailSubscriptionState[] $values():8:8 -> a + 1:1:com.batch.android.BatchEmailSubscriptionState valueOf(java.lang.String):8:8 -> valueOf + 1:1:com.batch.android.BatchEmailSubscriptionState[] values():8:8 -> values +com.batch.android.BatchEventData -> com.batch.android.BatchEventData: +# {"id":"sourceFile","fileName":"BatchEventData.java"} + java.util.Map attributes -> a + int MAXIMUM_STRING_LENGTH -> f + int MAXIMUM_URL_LENGTH -> g + int MAXIMUM_VALUES -> d + java.util.Set tags -> b + int MAXIMUM_TAGS -> e + boolean convertedFromLegacyAPI -> c + 1:1:void ():37:37 -> + 2:5:void ():35:38 -> + 6:6:void (com.batch.android.json.JSONObject):41:41 -> + 7:38:void (com.batch.android.json.JSONObject):35:66 -> + 1:1:int lambda$new$0(java.lang.String,java.lang.String):46:46 -> a + 2:2:java.util.Map getAttributes():78:78 -> a + 3:20:boolean enforceURIValue(java.net.URI):286:303 -> a + 21:21:boolean enforceDateValue(java.util.Date):315:315 -> a + 22:23:boolean enforceAttributeName(java.lang.String):323:324 -> a + 1:10:com.batch.android.BatchEventData addTag(java.lang.String):96:105 -> addTag + 1:1:boolean getConvertedFromLegacyAPI():86:86 -> b + 2:3:boolean enforceAttributesCount(java.lang.String):253:254 -> b + 1:1:java.util.Set getTags():82:82 -> c + 2:11:boolean enforceStringValue(java.lang.String):264:273 -> c + 1:2:void init():73:74 -> d + 3:3:java.lang.String normalizeKey(java.lang.String):337:337 -> d + 1:14:com.batch.android.json.JSONObject toInternalJSON():233:246 -> e + 1:2:com.batch.android.BatchEventData put(java.lang.String,java.lang.String):120:121 -> put + 3:4:com.batch.android.BatchEventData put(java.lang.String,java.net.URI):135:136 -> put + 5:6:com.batch.android.BatchEventData put(java.lang.String,float):150:151 -> put + 7:8:com.batch.android.BatchEventData put(java.lang.String,double):165:166 -> put + 9:10:com.batch.android.BatchEventData put(java.lang.String,int):180:181 -> put + 11:12:com.batch.android.BatchEventData put(java.lang.String,long):195:196 -> put + 13:14:com.batch.android.BatchEventData put(java.lang.String,boolean):210:211 -> put + 15:16:com.batch.android.BatchEventData put(java.lang.String,java.util.Date):225:226 -> put +com.batch.android.BatchEventData$TypedAttribute -> com.batch.android.BatchEventData$a: +# {"id":"sourceFile","fileName":"BatchEventData.java"} + com.batch.android.user.AttributeType type -> b + java.lang.Object value -> a + 1:3:void (java.lang.Object,com.batch.android.user.AttributeType):345:347 -> +com.batch.android.BatchEventDispatcher -> com.batch.android.BatchEventDispatcher: +# {"id":"sourceFile","fileName":"BatchEventDispatcher.java"} +com.batch.android.BatchImageContent -> com.batch.android.BatchImageContent: +# {"id":"sourceFile","fileName":"BatchImageContent.java"} + com.batch.android.BatchImageContent$Action globalTapAction -> a + long globalTapDelay -> b + int autoCloseDelay -> g + boolean isFullscreen -> h + com.batch.android.messaging.Size2D imageSize -> f + boolean allowSwipeToDismiss -> c + java.lang.String imageDescription -> e + java.lang.String imageURL -> d + 1:11:void (com.batch.android.messaging.model.ImageMessage):27:37 -> + 1:1:int getAutoCloseDelay():75:75 -> getAutoCloseDelay + 1:1:com.batch.android.BatchImageContent$Action getGlobalTapAction():102:102 -> getGlobalTapAction + 1:1:long getGlobalTapDelay():98:98 -> getGlobalTapDelay + 1:1:java.lang.String getImageDescription():86:86 -> getImageDescription + 1:4:android.graphics.Point getImageSize():79:82 -> getImageSize + 1:1:java.lang.String getImageURL():90:90 -> getImageURL + 1:1:boolean isAllowSwipeToDismiss():94:94 -> isAllowSwipeToDismiss + 1:1:boolean isFullscreen():71:71 -> isFullscreen +com.batch.android.BatchImageContent$Action -> com.batch.android.BatchImageContent$Action: +# {"id":"sourceFile","fileName":"BatchImageContent.java"} + com.batch.android.json.JSONObject args -> b + java.lang.String action -> a + 1:7:void (com.batch.android.messaging.model.Action):48:54 -> + 1:1:java.lang.String getAction():61:61 -> getAction + 1:1:com.batch.android.json.JSONObject getArgs():66:66 -> getArgs +com.batch.android.BatchInAppMessage -> com.batch.android.BatchInAppMessage: +# {"id":"sourceFile","fileName":"BatchInAppMessage.java"} + com.batch.android.json.JSONObject customPayload -> d + java.lang.String campaignId -> f + java.lang.String LANDING_PAYLOAD_KEY -> i + com.batch.android.json.JSONObject landingPayload -> c + java.lang.String CAMPAIGN_TOKEN_KEY -> k + java.lang.String CUSTOM_PAYLOAD_KEY -> j + com.batch.android.BatchInAppMessage$Content cachedContent -> h + java.lang.String CAMPAIGN_EVENT_DATA_KEY -> m + java.lang.String CAMPAIGN_ID_KEY -> l + java.lang.String campaignToken -> e + com.batch.android.json.JSONObject eventData -> g + 1:6:void (java.lang.String,java.lang.String,com.batch.android.json.JSONObject,com.batch.android.json.JSONObject,com.batch.android.json.JSONObject):73:78 -> + 1:25:com.batch.android.BatchInAppMessage getInstanceFromBundle(android.os.Bundle):39:63 -> a + 26:26:com.batch.android.BatchInAppMessage getInstanceFromBundle(android.os.Bundle):50:50 -> a + 27:34:android.os.Bundle getBundleRepresentation():103:110 -> a + 1:1:com.batch.android.json.JSONObject getCustomPayloadInternal():91:91 -> b + 1:1:com.batch.android.json.JSONObject getJSON():83:83 -> c + 1:1:java.lang.String getKind():96:96 -> d + 1:1:java.lang.String getCampaignId():115:115 -> e + 1:1:com.batch.android.json.JSONObject getEventData():119:119 -> f + 1:1:java.lang.String getCampaignToken():178:178 -> getCampaignToken + 1:23:com.batch.android.BatchInAppMessage$Content getContent():146:168 -> getContent + 1:8:com.batch.android.json.JSONObject getCustomPayload():125:132 -> getCustomPayload +com.batch.android.BatchInAppMessage$Content -> com.batch.android.BatchInAppMessage$Content: +# {"id":"sourceFile","fileName":"BatchInAppMessage.java"} +com.batch.android.BatchInboxFetcher -> com.batch.android.BatchInboxFetcher: +# {"id":"sourceFile","fileName":"BatchInboxFetcher.java"} + com.batch.android.inbox.InboxFetcherInternal impl -> a + android.os.Handler handler -> b + 1:1:void (com.batch.android.inbox.InboxFetcherInternal):38:38 -> + 2:5:void (com.batch.android.inbox.InboxFetcherInternal):36:39 -> + 1:1:android.os.Handler access$000(com.batch.android.BatchInboxFetcher):32:32 -> a + 1:22:void fetchNewNotifications(com.batch.android.BatchInboxFetcher$OnNewNotificationsFetchedListener):123:144 -> fetchNewNotifications + 1:19:void fetchNextPage(com.batch.android.BatchInboxFetcher$OnNextPageFetchedListener):155:173 -> fetchNextPage + 1:1:java.util.List getFetchedNotifications():111:111 -> getFetchedNotifications + 1:1:boolean hasMore():76:76 -> hasMore + 1:1:void markAllAsRead():92:92 -> markAllAsRead + 1:1:void markAsDeleted(com.batch.android.BatchInboxNotificationContent):101:101 -> markAsDeleted + 1:1:void markAsRead(com.batch.android.BatchInboxNotificationContent):85:85 -> markAsRead + 1:1:void setFetchLimit(int):57:57 -> setFetchLimit + 1:1:void setFilterSilentNotifications(boolean):67:67 -> setFilterSilentNotifications + 1:1:void setHandlerOverride(android.os.Handler):184:184 -> setHandlerOverride + 1:1:void setMaxPageSize(int):47:47 -> setMaxPageSize +com.batch.android.BatchInboxFetcher$1 -> com.batch.android.BatchInboxFetcher$a: +# {"id":"sourceFile","fileName":"BatchInboxFetcher.java"} + com.batch.android.BatchInboxFetcher this$0 -> b + com.batch.android.BatchInboxFetcher$OnNewNotificationsFetchedListener val$originalListener -> a + 1:1:void (com.batch.android.BatchInboxFetcher,com.batch.android.BatchInboxFetcher$OnNewNotificationsFetchedListener):126:126 -> + 1:1:void lambda$onFetchSuccess$0(com.batch.android.BatchInboxFetcher$OnNewNotificationsFetchedListener,java.util.List,boolean,boolean):134:134 -> a + 2:2:void lambda$onFetchFailure$1(com.batch.android.BatchInboxFetcher$OnNewNotificationsFetchedListener,java.lang.String):140:140 -> a + 1:1:void onFetchFailure(java.lang.String):140:140 -> onFetchFailure + 1:1:void onFetchSuccess(java.util.List,boolean,boolean):133:133 -> onFetchSuccess +com.batch.android.BatchInboxFetcher$2 -> com.batch.android.BatchInboxFetcher$b: +# {"id":"sourceFile","fileName":"BatchInboxFetcher.java"} + com.batch.android.BatchInboxFetcher this$0 -> b + com.batch.android.BatchInboxFetcher$OnNextPageFetchedListener val$originalListener -> a + 1:1:void (com.batch.android.BatchInboxFetcher,com.batch.android.BatchInboxFetcher$OnNextPageFetchedListener):158:158 -> + 1:1:void lambda$onFetchSuccess$0(com.batch.android.BatchInboxFetcher$OnNextPageFetchedListener,java.util.List,boolean):164:164 -> a + 2:2:void lambda$onFetchFailure$1(com.batch.android.BatchInboxFetcher$OnNextPageFetchedListener,java.lang.String):169:169 -> a + 1:1:void onFetchFailure(java.lang.String):169:169 -> onFetchFailure + 1:1:void onFetchSuccess(java.util.List,boolean):164:164 -> onFetchSuccess +com.batch.android.BatchInboxFetcher$OnNewNotificationsFetchedListener -> com.batch.android.BatchInboxFetcher$OnNewNotificationsFetchedListener: +# {"id":"sourceFile","fileName":"BatchInboxFetcher.java"} +com.batch.android.BatchInboxFetcher$OnNextPageFetchedListener -> com.batch.android.BatchInboxFetcher$OnNextPageFetchedListener: +# {"id":"sourceFile","fileName":"BatchInboxFetcher.java"} +com.batch.android.BatchInboxNotificationContent -> com.batch.android.BatchInboxNotificationContent: +# {"id":"sourceFile","fileName":"BatchInboxNotificationContent.java"} + com.batch.android.inbox.InboxNotificationContentInternal internalContent -> a + java.lang.String TAG -> c + com.batch.android.BatchPushPayload batchPushPayloadCache -> b + 1:1:void (com.batch.android.inbox.InboxNotificationContentInternal):42:42 -> + 2:10:void (com.batch.android.inbox.InboxNotificationContentInternal):35:43 -> + 1:33:void displayLandingMessage(android.content.Context):154:186 -> displayLandingMessage + 1:1:java.lang.String getBody():63:63 -> getBody + 1:1:java.util.Date getDate():88:88 -> getDate + 1:1:java.lang.String getNotificationIdentifier():53:53 -> getNotificationIdentifier + 1:5:com.batch.android.BatchPushPayload getPushPayload():122:126 -> getPushPayload + 1:1:java.util.Map getRawPayload():112:112 -> getRawPayload + 1:1:com.batch.android.BatchNotificationSource getSource():68:68 -> getSource + 1:1:java.lang.String getTitle():58:58 -> getTitle + 1:2:boolean hasLandingMessage():135:136 -> hasLandingMessage + 1:1:boolean isDeleted():83:83 -> isDeleted + 1:1:boolean isSilent():100:100 -> isSilent + 1:1:boolean isUnread():72:72 -> isUnread +com.batch.android.BatchInterstitialContent -> com.batch.android.BatchInterstitialContent: +# {"id":"sourceFile","fileName":"BatchInterstitialContent.java"} + java.lang.String mediaAccessibilityDescription -> g + java.lang.String mediaURL -> f + java.util.List ctas -> e + java.lang.String trackingIdentifier -> a + boolean showCloseButton -> h + java.lang.String title -> c + java.lang.String header -> b + java.lang.String body -> d + 1:1:void (com.batch.android.messaging.model.UniversalMessage):35:35 -> + 2:30:void (com.batch.android.messaging.model.UniversalMessage):27:55 -> + 1:1:java.lang.String getBody():72:72 -> getBody + 1:1:java.util.List getCtas():76:76 -> getCtas + 1:1:java.lang.String getHeader():64:64 -> getHeader + 1:1:java.lang.String getMediaAccessibilityDescription():84:84 -> getMediaAccessibilityDescription + 1:1:java.lang.String getMediaURL():80:80 -> getMediaURL + 1:1:java.lang.String getTitle():68:68 -> getTitle + 1:1:java.lang.String getTrackingIdentifier():60:60 -> getTrackingIdentifier + 1:1:boolean shouldShowCloseButton():88:88 -> shouldShowCloseButton +com.batch.android.BatchInterstitialContent$CTA -> com.batch.android.BatchInterstitialContent$CTA: +# {"id":"sourceFile","fileName":"BatchInterstitialContent.java"} + com.batch.android.json.JSONObject args -> c + java.lang.String label -> a + java.lang.String action -> b + 1:8:void (com.batch.android.messaging.model.CTA):100:107 -> + 1:1:java.lang.String getAction():119:119 -> getAction + 1:1:com.batch.android.json.JSONObject getArgs():124:124 -> getArgs + 1:1:java.lang.String getLabel():114:114 -> getLabel +com.batch.android.BatchLandingMessage -> com.batch.android.BatchLandingMessage: +# {"id":"sourceFile","fileName":"BatchLandingMessage.java"} + com.batch.android.json.JSONObject landing -> d + java.lang.String GOOGLE_PREFIX -> f + android.os.Bundle payload -> c + boolean isDisplayedFromInbox -> e + 1:1:void (android.os.Bundle,com.batch.android.json.JSONObject):29:29 -> + 2:6:void (android.os.Bundle,com.batch.android.json.JSONObject):27:31 -> + 1:5:android.os.Bundle cleanBundle(android.os.Bundle):41:45 -> a + 6:7:android.os.Bundle getBundleRepresentation():85:86 -> a + 8:8:void setIsDisplayedFromInbox(boolean):105:105 -> a + 1:7:com.batch.android.json.JSONObject getCustomPayloadInternal():61:67 -> b + 1:1:com.batch.android.json.JSONObject getJSON():53:53 -> c + 1:1:java.lang.String getKind():78:78 -> d + 1:1:android.os.Bundle getPushBundle():91:91 -> getPushBundle + 1:1:boolean isDisplayedFromInbox():101:101 -> isDisplayedFromInbox +com.batch.android.BatchMessage -> com.batch.android.BatchMessage: +# {"id":"sourceFile","fileName":"BatchMessage.java"} + java.lang.String KIND_KEY -> a + java.lang.String DATA_KEY -> b + 1:1:void ():24:24 -> + android.os.Bundle getBundleRepresentation() -> a + com.batch.android.json.JSONObject getCustomPayloadInternal() -> b + com.batch.android.json.JSONObject getJSON() -> c + java.lang.String getKind() -> d + 1:19:com.batch.android.BatchMessage$Format getFormat():112:130 -> getFormat + 1:22:com.batch.android.BatchMessage getMessageForBundle(android.os.Bundle):74:95 -> getMessageForBundle + 23:23:com.batch.android.BatchMessage getMessageForBundle(android.os.Bundle):76:76 -> getMessageForBundle + 24:24:com.batch.android.BatchMessage getMessageForBundle(android.os.Bundle):71:71 -> getMessageForBundle + 1:5:void writeToBundle(android.os.Bundle):48:52 -> writeToBundle + 6:6:void writeToBundle(android.os.Bundle):45:45 -> writeToBundle + 1:5:void writeToIntent(android.content.Intent):61:65 -> writeToIntent + 6:6:void writeToIntent(android.content.Intent):58:58 -> writeToIntent +com.batch.android.BatchMessage$Format -> com.batch.android.BatchMessage$Format: +# {"id":"sourceFile","fileName":"BatchMessage.java"} + com.batch.android.BatchMessage$Format[] $VALUES -> a + 1:25:void ():148:172 -> + 26:26:void ():142:142 -> + 1:1:void (java.lang.String,int):143:143 -> + 1:1:com.batch.android.BatchMessage$Format[] $values():142:142 -> a + 1:1:com.batch.android.BatchMessage$Format valueOf(java.lang.String):142:142 -> valueOf + 1:1:com.batch.android.BatchMessage$Format[] values():142:142 -> values +com.batch.android.BatchMessageAction -> com.batch.android.BatchMessageAction: +# {"id":"sourceFile","fileName":"BatchMessageAction.java"} + com.batch.android.json.JSONObject args -> b + java.lang.String action -> a + 1:7:void (com.batch.android.messaging.model.Action):24:30 -> + 1:1:java.lang.String getAction():37:37 -> getAction + 1:1:com.batch.android.json.JSONObject getArgs():42:42 -> getArgs + 1:1:boolean isDismissAction():46:46 -> isDismissAction +com.batch.android.BatchMessageCTA -> com.batch.android.BatchMessageCTA: +# {"id":"sourceFile","fileName":"BatchMessageCTA.java"} + java.lang.String label -> c + 1:2:void (com.batch.android.messaging.model.CTA):20:21 -> + 1:1:java.lang.String getLabel():26:26 -> getLabel +com.batch.android.BatchMessagingException -> com.batch.android.BatchMessagingException: +# {"id":"sourceFile","fileName":"BatchMessagingException.java"} + 1:1:void ():12:12 -> + 2:2:void (java.lang.String):16:16 -> + 3:3:void (java.lang.String,java.lang.Throwable):20:20 -> + 4:4:void (java.lang.Throwable):24:24 -> +com.batch.android.BatchMessagingWebViewJavascriptBridge -> com.batch.android.BatchMessagingWebViewJavascriptBridge: +# {"id":"sourceFile","fileName":"BatchMessagingWebViewJavascriptBridge.java"} + android.content.Context applicationContext -> a + com.batch.android.messaging.WebViewActionListener actionListener -> c + com.batch.android.BatchMessage message -> b + java.lang.String TAG -> d + 1:4:void (android.content.Context,com.batch.android.BatchMessage,com.batch.android.messaging.WebViewActionListener):37:40 -> + 1:6:java.lang.String makeSuccessResult(com.batch.android.BatchMessagingWebViewJavascriptBridge$BridgeResultProvider):82:87 -> a + 7:12:java.lang.String makeErrorResult(java.lang.String):93:98 -> a + 13:38:com.batch.android.BatchMessagingWebViewJavascriptBridge$BridgeResultProvider getMethodResultProvider(java.lang.String,com.batch.android.json.JSONObject):104:129 -> a + 39:40:com.batch.android.BatchMessagingWebViewJavascriptBridge$BridgeResultProvider getMethodResultProvider(java.lang.String,com.batch.android.json.JSONObject):126:127 -> a + 41:41:com.batch.android.BatchMessagingWebViewJavascriptBridge$BridgeResultProvider getMethodResultProvider(java.lang.String,com.batch.android.json.JSONObject):116:116 -> a + 42:46:com.batch.android.BatchMessagingWebViewJavascriptBridge$BridgeResultProvider getMethodResultProvider(java.lang.String,com.batch.android.json.JSONObject):106:110 -> a + 47:63:com.batch.android.BatchMessagingWebViewJavascriptBridge$BridgeResultProvider getMethodResultProvider(java.lang.String,com.batch.android.json.JSONObject):108:124 -> a + 64:67:com.batch.android.BatchMessagingWebViewJavascriptBridge$BridgeResultProvider getMethodResultProvider(java.lang.String,com.batch.android.json.JSONObject):118:121 -> a + 68:68:com.batch.android.BatchMessagingWebViewJavascriptBridge$BridgeResultProvider getMethodResultProvider(java.lang.String,com.batch.android.json.JSONObject):114:114 -> a + 69:69:com.batch.android.BatchMessagingWebViewJavascriptBridge$BridgeResultProvider getMethodResultProvider(java.lang.String,com.batch.android.json.JSONObject):112:112 -> a + 70:80:java.lang.String getAdvertisingID():162:172 -> a + 81:84:void dismiss(com.batch.android.json.JSONObject):213:216 -> a + 1:3:java.lang.String getAdvertisingIDValue():185:187 -> b + 4:15:void openDeeplink(com.batch.android.json.JSONObject):239:250 -> b + 16:16:void openDeeplink(com.batch.android.json.JSONObject):241:241 -> b + 1:1:java.lang.String getCustomLanguage():144:144 -> c + 2:15:void performAction(com.batch.android.json.JSONObject):221:234 -> c + 16:16:void performAction(com.batch.android.json.JSONObject):223:223 -> c + 1:5:java.lang.String getCustomPayload():196:200 -> d + 1:1:java.lang.String getCustomRegion():150:150 -> e + 1:1:java.lang.String getCustomUserID():156:156 -> f + 1:1:com.batch.android.BatchMessagingWebViewJavascriptBridge$BridgeResultProvider getGenericSuccessResultProvider():257:257 -> g + 1:1:java.lang.String getInstallationID():138:138 -> h + 1:5:java.lang.String getTrackingID():205:209 -> i + 1:1:boolean isAdvertisingIDAllowedByConfig():178:178 -> j + 1:1:java.lang.String lambda$getGenericSuccessResultProvider$0():257:257 -> k + 1:30:java.lang.String postMessage(java.lang.String,java.lang.String):46:75 -> postMessage + 31:32:java.lang.String postMessage(java.lang.String,java.lang.String):71:72 -> postMessage + 33:34:java.lang.String postMessage(java.lang.String,java.lang.String):68:69 -> postMessage + 35:36:java.lang.String postMessage(java.lang.String,java.lang.String):64:65 -> postMessage + 37:38:java.lang.String postMessage(java.lang.String,java.lang.String):57:58 -> postMessage + 39:39:java.lang.String postMessage(java.lang.String,java.lang.String):47:47 -> postMessage +com.batch.android.BatchMessagingWebViewJavascriptBridge$1 -> com.batch.android.BatchMessagingWebViewJavascriptBridge$a: +# {"id":"sourceFile","fileName":"BatchMessagingWebViewJavascriptBridge.java"} +com.batch.android.BatchMessagingWebViewJavascriptBridge$BridgeResultProvider -> com.batch.android.BatchMessagingWebViewJavascriptBridge$b: +# {"id":"sourceFile","fileName":"BatchMessagingWebViewJavascriptBridge.java"} + java.lang.String getResult() -> a +com.batch.android.BatchMessagingWebViewJavascriptBridge$BridgeResultProviderException -> com.batch.android.BatchMessagingWebViewJavascriptBridge$c: +# {"id":"sourceFile","fileName":"BatchMessagingWebViewJavascriptBridge.java"} + 1:1:void (java.lang.String):273:273 -> + 1:1:java.lang.String getMessage():280:280 -> getMessage +com.batch.android.BatchMessagingWebViewJavascriptBridge$BridgeResultProviderRuntimeException -> com.batch.android.BatchMessagingWebViewJavascriptBridge$d: +# {"id":"sourceFile","fileName":"BatchMessagingWebViewJavascriptBridge.java"} + java.lang.String internalMessage -> b + int code -> a + 1:3:void (int,java.lang.String):295:297 -> + 4:6:void (int,java.lang.String,java.lang.Throwable):305:307 -> + 1:1:int getCode():311:311 -> a + 1:1:java.lang.String getMessage():317:317 -> getMessage +com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause -> com.batch.android.BatchMessagingWebViewJavascriptBridge$e: +# {"id":"sourceFile","fileName":"BatchMessagingWebViewJavascriptBridge.java"} + com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause BAD_HTTP_STATUSCODE -> c + com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause TIMEOUT -> d + com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause UNKNOWN -> a + com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause SSL -> b + com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause[] $VALUES -> e + 1:4:void ():324:327 -> + 5:5:void ():323:323 -> + 1:1:void (java.lang.String,int):323:323 -> + 1:1:com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause[] $values():323:323 -> a + 1:1:com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause valueOf(java.lang.String):323:323 -> valueOf + 1:1:com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause[] values():323:323 -> values +com.batch.android.BatchMessagingWebViewJavascriptBridge$UnknownMethodException -> com.batch.android.BatchMessagingWebViewJavascriptBridge$f: +# {"id":"sourceFile","fileName":"BatchMessagingWebViewJavascriptBridge.java"} + 1:1:void ():321:321 -> + 2:2:void (com.batch.android.BatchMessagingWebViewJavascriptBridge$1):321:321 -> +com.batch.android.BatchModalContent -> com.batch.android.BatchModalContent: +# {"id":"sourceFile","fileName":"BatchModalContent.java"} + java.lang.String mediaAccessibilityDescription -> g + java.lang.String mediaURL -> f + java.lang.Long autoCloseTimeMillis -> i + java.util.List ctas -> d + com.batch.android.BatchModalContent$Action globalTapAction -> e + java.lang.String trackingIdentifier -> a + boolean showCloseButton -> h + java.lang.String body -> c + java.lang.String title -> b + 1:1:void (com.batch.android.messaging.model.ModalMessage):36:36 -> + 2:34:void (com.batch.android.messaging.model.ModalMessage):24:56 -> + 1:1:java.lang.Long getAutoCloseTimeMillis():93:93 -> getAutoCloseTimeMillis + 1:1:java.lang.String getBody():69:69 -> getBody + 1:1:java.util.List getCtas():73:73 -> getCtas + 1:1:com.batch.android.BatchModalContent$Action getGlobalTapAction():77:77 -> getGlobalTapAction + 1:1:java.lang.String getMediaAccessibilityDescription():85:85 -> getMediaAccessibilityDescription + 1:1:java.lang.String getMediaURL():81:81 -> getMediaURL + 1:1:java.lang.String getTitle():65:65 -> getTitle + 1:1:java.lang.String getTrackingIdentifier():61:61 -> getTrackingIdentifier + 1:1:boolean isShowCloseButton():89:89 -> isShowCloseButton +com.batch.android.BatchModalContent$Action -> com.batch.android.BatchModalContent$Action: +# {"id":"sourceFile","fileName":"BatchModalContent.java"} + com.batch.android.json.JSONObject args -> b + java.lang.String action -> a + 1:7:void (com.batch.android.messaging.model.Action):103:109 -> + 1:1:java.lang.String getAction():116:116 -> getAction + 1:1:com.batch.android.json.JSONObject getArgs():121:121 -> getArgs +com.batch.android.BatchModalContent$CTA -> com.batch.android.BatchModalContent$CTA: +# {"id":"sourceFile","fileName":"BatchModalContent.java"} + java.lang.String label -> c + 1:2:void (com.batch.android.messaging.model.CTA):131:132 -> + 1:1:java.lang.String getLabel():137:137 -> getLabel +com.batch.android.BatchNotificationAction -> com.batch.android.BatchNotificationAction: +# {"id":"sourceFile","fileName":"BatchNotificationAction.java"} + 1:36:void ():21:56 -> + 1:39:java.util.List getSupportActions(android.content.Context,java.util.List,com.batch.android.BatchPushPayload,java.lang.Integer):87:125 -> getSupportActions + 40:50:java.util.List getSupportActions(android.content.Context,java.util.List,com.batch.android.BatchPushPayload,java.lang.Integer):123:133 -> getSupportActions + 51:65:java.util.List getSupportActions(android.content.Context,java.util.List,com.batch.android.BatchPushPayload,java.lang.Integer):131:145 -> getSupportActions + 66:66:java.util.List getSupportActions(android.content.Context,java.util.List,com.batch.android.BatchPushPayload,java.lang.Integer):139:139 -> getSupportActions + 67:67:java.util.List getSupportActions(android.content.Context,java.util.List,com.batch.android.BatchPushPayload,java.lang.Integer):84:84 -> getSupportActions +com.batch.android.BatchNotificationChannelsManager -> com.batch.android.BatchNotificationChannelsManager: +# {"id":"sourceFile","fileName":"BatchNotificationChannelsManager.java"} + com.batch.android.module.PushModule pushModule -> d + com.batch.android.BatchNotificationChannelsManager$NotificationChannelIdInterceptor channelIdInterceptor -> c + java.lang.String channelOverride -> a + com.batch.android.BatchNotificationChannelsManager$ChannelNameProvider channelNameProvider -> b + 1:16:void (com.batch.android.module.PushModule):37:52 -> + 17:17:void (com.batch.android.module.PushModule):38:38 -> + 1:14:java.lang.String getChannelId(com.batch.android.BatchPushPayload):59:72 -> a + 15:35:void registerBatchChannelIfNeeded(android.content.Context):90:110 -> a + 36:43:void registerBatchChannelIfNeeded(android.content.Context):108:115 -> a + 44:57:java.lang.String getBatchChannelName():126:139 -> a + 1:1:boolean isChannelIdOverridden():86:86 -> b + 1:1:boolean openSystemChannelSettings(android.content.Context):215:215 -> openSystemChannelSettings + 2:8:boolean openSystemChannelSettings(android.content.Context,java.lang.String):236:242 -> openSystemChannelSettings + 9:9:boolean openSystemChannelSettings(android.content.Context,java.lang.String):234:234 -> openSystemChannelSettings + 10:10:boolean openSystemChannelSettings(android.content.Context,java.lang.String):230:230 -> openSystemChannelSettings + 1:1:com.batch.android.BatchNotificationChannelsManager provide():43:43 -> provide + 1:1:void setChannelIdInterceptor(com.batch.android.BatchNotificationChannelsManager$NotificationChannelIdInterceptor):203:203 -> setChannelIdInterceptor + 1:1:void setChannelIdOverride(java.lang.String):162:162 -> setChannelIdOverride + 1:1:void setChannelName(android.content.Context,int):191:191 -> setChannelName + 1:1:void setChannelNameProvider(com.batch.android.BatchNotificationChannelsManager$ChannelNameProvider):179:179 -> setChannelNameProvider +com.batch.android.BatchNotificationChannelsManager$ChannelNameProvider -> com.batch.android.BatchNotificationChannelsManager$ChannelNameProvider: +# {"id":"sourceFile","fileName":"BatchNotificationChannelsManager.java"} +com.batch.android.BatchNotificationChannelsManager$NotificationChannelIdInterceptor -> com.batch.android.BatchNotificationChannelsManager$NotificationChannelIdInterceptor: +# {"id":"sourceFile","fileName":"BatchNotificationChannelsManager.java"} +com.batch.android.BatchNotificationChannelsManager$StringResChannelNameProvider -> com.batch.android.BatchNotificationChannelsManager$StringResChannelNameProvider: +# {"id":"sourceFile","fileName":"BatchNotificationChannelsManager.java"} + android.content.Context context -> a + int resId -> b + 1:3:void (android.content.Context,int):280:282 -> + 1:1:java.lang.String getDefaultChannelName():287:287 -> getDefaultChannelName +com.batch.android.BatchNotificationChannelsManagerPrivateHelper -> com.batch.android.e: +# {"id":"sourceFile","fileName":"BatchNotificationChannelsManagerPrivateHelper.java"} + 1:1:void ():9:9 -> + 1:1:java.lang.String getChannelId(com.batch.android.BatchNotificationChannelsManager):13:13 -> a + 2:2:void registerBatchChannelIfNeeded(com.batch.android.BatchNotificationChannelsManager,android.content.Context):17:17 -> a +com.batch.android.BatchNotificationInterceptor -> com.batch.android.BatchNotificationInterceptor: +# {"id":"sourceFile","fileName":"BatchNotificationInterceptor.java"} + 1:1:void ():17:17 -> +com.batch.android.BatchNotificationSource -> com.batch.android.BatchNotificationSource: +# {"id":"sourceFile","fileName":"BatchNotificationSource.java"} + com.batch.android.BatchNotificationSource[] $VALUES -> a + 1:4:void ():11:14 -> + 5:5:void ():9:9 -> + 1:1:void (java.lang.String,int):10:10 -> + 1:1:com.batch.android.BatchNotificationSource[] $values():9:9 -> a + 1:1:com.batch.android.BatchNotificationSource valueOf(java.lang.String):9:9 -> valueOf + 1:1:com.batch.android.BatchNotificationSource[] values():9:9 -> values +com.batch.android.BatchOptOutResultListener -> com.batch.android.BatchOptOutResultListener: +# {"id":"sourceFile","fileName":"BatchOptOutResultListener.java"} +com.batch.android.BatchOptOutResultListener$ErrorPolicy -> com.batch.android.BatchOptOutResultListener$ErrorPolicy: +# {"id":"sourceFile","fileName":"BatchOptOutResultListener.java"} + com.batch.android.BatchOptOutResultListener$ErrorPolicy[] $VALUES -> a + 1:6:void ():19:24 -> + 7:7:void ():14:14 -> + 1:1:void (java.lang.String,int):15:15 -> + 1:1:com.batch.android.BatchOptOutResultListener$ErrorPolicy[] $values():14:14 -> a + 1:1:com.batch.android.BatchOptOutResultListener$ErrorPolicy valueOf(java.lang.String):14:14 -> valueOf + 1:1:com.batch.android.BatchOptOutResultListener$ErrorPolicy[] values():14:14 -> values +com.batch.android.BatchPermissionActivity -> com.batch.android.BatchPermissionActivity: +# {"id":"sourceFile","fileName":"BatchPermissionActivity.java"} + long requestPermissionTimestamp -> b + java.lang.String permission -> a + int DETECT_PERMISSION_ALREADY_DENIED_THRESHOLD -> d + int BATCH_PERMISSION_REQUEST_CODE -> e + java.lang.String TAG -> c + 1:27:void ():22:48 -> + 1:7:void requestPermission():74:80 -> a + 1:6:void onCreate(android.os.Bundle):52:57 -> onCreate + 1:2:void onDestroy():129:130 -> onDestroy + 1:30:void onRequestPermissionsResult(int,java.lang.String[],int[]):89:118 -> onRequestPermissionsResult + 1:6:void onStart():63:68 -> onStart + 1:2:void onStop():123:124 -> onStop +com.batch.android.BatchPushData -> com.batch.android.BatchPushData: +# {"id":"sourceFile","fileName":"BatchPushData.java"} + com.batch.android.core.InternalPushData internalPushData -> a + android.content.Context context -> b + 1:14:void (android.content.Context,android.content.Intent):36:49 -> + 15:15:void (android.content.Context,android.content.Intent):42:42 -> + 16:16:void (android.content.Context,android.content.Intent):38:38 -> + 1:9:java.lang.String getBigPictureURL():118:126 -> getBigPictureURL + 10:10:java.lang.String getBigPictureURL():123:123 -> getBigPictureURL + 1:6:java.lang.String getCustomLargeIconURL():92:97 -> getCustomLargeIconURL + 1:1:java.lang.String getDeeplink():71:71 -> getDeeplink + 1:1:boolean hasBigPicture():106:106 -> hasBigPicture + 1:1:boolean hasCustomLargeIcon():80:80 -> hasCustomLargeIcon + 1:1:boolean hasDeeplink():61:61 -> hasDeeplink +com.batch.android.BatchPushHelper -> com.batch.android.f: +# {"id":"sourceFile","fileName":"BatchPushHelper.java"} + 1:1:void ():18:18 -> + 1:6:boolean canDisplayPush(android.content.Context,com.batch.android.core.InternalPushData):30:35 -> a + 7:7:boolean canDisplayPush(android.content.Context,com.batch.android.core.InternalPushData):32:32 -> a + 8:15:android.os.Bundle firebaseMessageToReceiverBundle(com.google.firebase.messaging.RemoteMessage):56:63 -> a + 16:17:boolean installIDMatchesCurrent(android.content.Context,java.lang.String):75:76 -> a +com.batch.android.BatchPushInstanceIDService -> com.batch.android.BatchPushInstanceIDService: +# {"id":"sourceFile","fileName":"BatchPushInstanceIDService.java"} + 1:1:void ():12:12 -> + 1:3:void onTokenRefresh():16:18 -> onTokenRefresh +com.batch.android.BatchPushJobService -> com.batch.android.BatchPushJobService: +# {"id":"sourceFile","fileName":"BatchPushJobService.java"} + java.lang.String TAG -> a + 1:1:void ():20:20 -> + 1:12:boolean onStartJob(android.app.job.JobParameters):29:40 -> onStartJob + 1:1:boolean onStopJob(android.app.job.JobParameters):46:46 -> onStopJob +com.batch.android.BatchPushJobService$PresentPushTask -> com.batch.android.BatchPushJobService$a: +# {"id":"sourceFile","fileName":"BatchPushJobService.java"} + android.os.Bundle pushData -> a + android.app.job.JobParameters originJobParameters -> c + java.lang.ref.WeakReference originService -> b + 1:4:void (android.os.Bundle,android.app.job.JobService,android.app.job.JobParameters):62:65 -> + 1:29:java.lang.Void doInBackground(java.lang.Void[]):70:98 -> a + 30:32:java.lang.Void doInBackground(java.lang.Void[]):92:94 -> a + 33:43:java.lang.Void doInBackground(java.lang.Void[]):90:100 -> a + 1:1:java.lang.Object doInBackground(java.lang.Object[]):50:50 -> doInBackground +com.batch.android.BatchPushMessageDismissReceiver -> com.batch.android.BatchPushMessageDismissReceiver: +# {"id":"sourceFile","fileName":"BatchPushMessageDismissReceiver.java"} + java.lang.String TAG -> d + 1:1:void ():17:17 -> + 1:21:void onReceive(android.content.Context,android.content.Intent):24:44 -> onReceive + 22:22:void onReceive(android.content.Context,android.content.Intent):30:30 -> onReceive +com.batch.android.BatchPushMessageReceiver -> com.batch.android.BatchPushMessageReceiver: +# {"id":"sourceFile","fileName":"BatchPushMessageReceiver.java"} + java.util.ArrayDeque handledMessageIDs -> f + int MAX_HANDLED_MESSAGE_IDS_COUNT -> e + java.lang.String TAG -> d + 1:1:void ():39:39 -> + 1:1:void ():29:29 -> + 1:27:boolean presentNotification(android.content.Context,android.content.Intent):77:103 -> a + 28:28:boolean isDuplicateMessage(java.lang.String):162:162 -> a + 29:35:java.lang.String getGoogleMessageID(android.content.Intent):183:189 -> a + 36:36:int getHandledMessageIDsSize():198:198 -> a + 1:2:boolean isFCMMessage(android.content.Intent):64:65 -> b + 3:28:boolean scheduleJob(android.content.Context,android.content.Intent):113:138 -> b + 29:49:boolean scheduleJob(android.content.Context,android.content.Intent):121:141 -> b + 50:52:void markMessageAsHandled(java.lang.String):170:172 -> b + 53:53:void resetHandledMessageIDs():203:203 -> b + 1:5:void startPresentationService(android.content.Context,android.content.Intent):148:152 -> c + 1:15:void onReceive(android.content.Context,android.content.Intent):44:58 -> onReceive +com.batch.android.BatchPushNotificationPresenter -> com.batch.android.g: +# {"id":"sourceFile","fileName":"BatchPushNotificationPresenter.java"} + java.lang.String TAG -> a + int DEFAULT_NO_NOTIFICATION -> e + java.lang.String CUSTOM_SMALL_ICON_FIREBASE_METADATA_NAME -> c + java.lang.String CUSTOM_SMALL_ICON_METADATA_NAME -> b + java.lang.String CUSTOM_COLOR_METADATA -> d + 1:1:void ():59:59 -> + 1:42:void displayForPush(android.content.Context,android.os.Bundle):82:123 -> a + 43:52:void _handleLocalCampaignsSilentPush(android.content.Context):131:140 -> a + 53:257:void presentNotification(android.content.Context,android.os.Bundle,com.batch.android.BatchPushPayload,com.batch.android.BatchNotificationInterceptor):154:358 -> a + 258:324:void presentNotification(android.content.Context,android.os.Bundle,com.batch.android.BatchPushPayload,com.batch.android.BatchNotificationInterceptor):352:418 -> a + 325:392:void presentNotification(android.content.Context,android.os.Bundle,com.batch.android.BatchPushPayload,com.batch.android.BatchNotificationInterceptor):417:484 -> a + 393:459:void presentNotification(android.content.Context,android.os.Bundle,com.batch.android.BatchPushPayload,com.batch.android.BatchNotificationInterceptor):480:546 -> a + 460:460:void presentNotification(android.content.Context,android.os.Bundle,com.batch.android.BatchPushPayload,com.batch.android.BatchNotificationInterceptor):208:208 -> a + 461:504:boolean trySendLandingToForegroundApp(android.content.Context,android.os.Bundle,com.batch.android.core.InternalPushData):560:603 -> a + 505:509:android.graphics.Bitmap resizeLargeIcon(android.content.Context,android.graphics.Bitmap):613:617 -> a + 510:530:void applyNotificationFormat(android.content.Context,com.batch.android.push.formats.NotificationFormat,androidx.core.app.NotificationCompat$Builder):734:754 -> a + 1:5:int getAppPrimaryColor(android.content.Context):696:700 -> b + 1:26:int getDefaults(android.content.Context):629:654 -> c + 1:10:java.lang.Integer getMetaDataPushColor(android.content.Context):714:723 -> d + 1:15:java.lang.Integer getMetaDataSmallIconResId(android.content.Context):674:688 -> e +com.batch.android.BatchPushPayload -> com.batch.android.BatchPushPayload: +# {"id":"sourceFile","fileName":"BatchPushPayload.java"} + com.batch.android.core.InternalPushData internalPushData -> a + android.os.Bundle rawData -> b + 1:8:void (android.os.Bundle):50:57 -> + 9:9:void (android.os.Bundle):54:54 -> + 10:15:void (com.google.firebase.messaging.RemoteMessage):60:65 -> + 1:1:com.batch.android.core.InternalPushData getInternalData():352:352 -> a + 1:2:java.util.List getActions():293:294 -> getActions + 1:9:java.lang.String getBigPictureURL(android.content.Context):257:265 -> getBigPictureURL + 10:10:java.lang.String getBigPictureURL(android.content.Context):262:262 -> getBigPictureURL + 1:1:java.lang.String getChannel():334:334 -> getChannel + 1:6:java.lang.String getCustomLargeIconURL(android.content.Context):231:236 -> getCustomLargeIconURL + 1:1:java.lang.String getDeeplink():210:210 -> getDeeplink + 1:1:java.lang.String getGroup():315:315 -> getGroup + 1:5:com.batch.android.BatchMessage getLandingMessage():282:286 -> getLandingMessage + 1:1:int getPriority():306:306 -> getPriority + 1:1:android.os.Bundle getPushBundle():346:346 -> getPushBundle + 1:1:boolean hasBigPicture():245:245 -> hasBigPicture + 1:1:boolean hasCustomLargeIcon():219:219 -> hasCustomLargeIcon + 1:1:boolean hasDeeplink():200:200 -> hasDeeplink + 1:1:boolean hasLandingMessage():273:273 -> hasLandingMessage + 1:1:boolean isGroupSummary():324:324 -> isGroupSummary + 1:7:com.batch.android.BatchPushPayload payloadFromBundle(android.os.Bundle):86:92 -> payloadFromBundle + 8:8:com.batch.android.BatchPushPayload payloadFromBundle(android.os.Bundle):89:89 -> payloadFromBundle + 9:9:com.batch.android.BatchPushPayload payloadFromBundle(android.os.Bundle):83:83 -> payloadFromBundle + 1:1:com.batch.android.BatchPushPayload payloadFromFirebaseMessage(com.google.firebase.messaging.RemoteMessage):153:153 -> payloadFromFirebaseMessage + 2:2:com.batch.android.BatchPushPayload payloadFromFirebaseMessage(com.google.firebase.messaging.RemoteMessage):150:150 -> payloadFromFirebaseMessage + 1:1:com.batch.android.BatchPushPayload payloadFromReceiverExtras(android.os.Bundle):134:134 -> payloadFromReceiverExtras + 2:2:com.batch.android.BatchPushPayload payloadFromReceiverExtras(android.os.Bundle):131:131 -> payloadFromReceiverExtras + 1:7:com.batch.android.BatchPushPayload payloadFromReceiverIntent(android.content.Intent):110:116 -> payloadFromReceiverIntent + 8:8:com.batch.android.BatchPushPayload payloadFromReceiverIntent(android.content.Intent):113:113 -> payloadFromReceiverIntent + 9:9:com.batch.android.BatchPushPayload payloadFromReceiverIntent(android.content.Intent):107:107 -> payloadFromReceiverIntent + 1:1:void writeToBundle(android.os.Bundle):172:172 -> writeToBundle + 2:2:void writeToBundle(android.os.Bundle):169:169 -> writeToBundle + 1:1:void writeToIntentExtras(android.content.Intent):187:187 -> writeToIntentExtras + 2:2:void writeToIntentExtras(android.content.Intent):184:184 -> writeToIntentExtras +com.batch.android.BatchPushPayload$ParsingException -> com.batch.android.BatchPushPayload$ParsingException: +# {"id":"sourceFile","fileName":"BatchPushPayload.java"} + 1:1:void ():33:33 -> + 2:2:void (java.lang.String):37:37 -> + 3:3:void (java.lang.String,java.lang.Throwable):42:42 -> +com.batch.android.BatchPushReceiver -> com.batch.android.BatchPushReceiver: +# {"id":"sourceFile","fileName":"BatchPushReceiver.java"} + 1:1:void ():17:17 -> + 1:17:void onReceive(android.content.Context,android.content.Intent):21:37 -> onReceive +com.batch.android.BatchPushService -> com.batch.android.BatchPushService: +# {"id":"sourceFile","fileName":"BatchPushService.java"} + java.lang.String TAG -> a + 1:1:void ():21:21 -> + 1:11:void onHandleIntent(android.content.Intent):28:38 -> onHandleIntent + 12:19:void onHandleIntent(android.content.Intent):31:38 -> onHandleIntent + 20:20:void onHandleIntent(android.content.Intent):35:35 -> onHandleIntent + 21:27:void onHandleIntent(android.content.Intent):33:39 -> onHandleIntent +com.batch.android.BatchQueryWebservice -> com.batch.android.h: +# {"id":"sourceFile","fileName":"BatchQueryWebservice.java"} + java.util.List responses -> p + java.util.List queries -> o + com.batch.android.WebserviceMetrics webserviceMetrics -> q + java.lang.String TAG -> r + 1:2:void (android.content.Context,com.batch.android.core.Webservice$RequestType,java.lang.String,java.lang.String[]):56:57 -> + java.util.List getQueries() -> I + 1:5:com.batch.android.query.response.Response getResponseFor(java.lang.Class,com.batch.android.query.QueryType):218:222 -> a + 6:6:com.batch.android.query.response.Response getResponseFor(java.lang.Class,com.batch.android.query.QueryType):219:219 -> a + 7:8:com.batch.android.query.response.Response getResponseForType(com.batch.android.query.QueryType):239:240 -> a + 1:2:com.batch.android.query.Query getQueryForID(java.lang.String):255:256 -> b + 1:55:void parseQueries(com.batch.android.json.JSONObject):145:199 -> c + 56:56:void parseQueries(com.batch.android.json.JSONObject):196:196 -> c + 57:57:void parseQueries(com.batch.android.json.JSONObject):193:193 -> c + 58:58:void parseQueries(com.batch.android.json.JSONObject):190:190 -> c + 59:59:void parseQueries(com.batch.android.json.JSONObject):187:187 -> c + 60:80:void parseQueries(com.batch.android.json.JSONObject):184:204 -> c + 81:81:void parseQueries(com.batch.android.json.JSONObject):175:175 -> c + 82:86:void parseQueries(com.batch.android.json.JSONObject):151:155 -> c + 87:87:void parseQueries(com.batch.android.json.JSONObject):146:146 -> c + 1:11:void parseResponse(com.batch.android.json.JSONObject):124:134 -> d + 1:33:com.batch.android.post.PostDataProvider getPostDataProvider():69:101 -> w +com.batch.android.BatchQueryWebservice$1 -> com.batch.android.h$a: +# {"id":"sourceFile","fileName":"BatchQueryWebservice.java"} + int[] $SwitchMap$com$batch$android$query$QueryType -> a + 1:1:void ():182:182 -> +com.batch.android.BatchTagCollectionsFetchListener -> com.batch.android.BatchTagCollectionsFetchListener: +# {"id":"sourceFile","fileName":"BatchTagCollectionsFetchListener.java"} +com.batch.android.BatchUserAttribute -> com.batch.android.BatchUserAttribute: +# {"id":"sourceFile","fileName":"BatchUserAttribute.java"} + 1:3:void (java.lang.Object,com.batch.android.BatchUserAttribute$Type):15:17 -> + 1:2:java.lang.Boolean getBooleanValue():46:47 -> getBooleanValue + 1:2:java.util.Date getDateValue():22:23 -> getDateValue + 1:2:java.lang.Number getNumberValue():38:39 -> getNumberValue + 1:2:java.lang.String getStringValue():30:31 -> getStringValue + 1:2:java.net.URI getUriValue():54:55 -> getUriValue +com.batch.android.BatchUserAttribute$Type -> com.batch.android.BatchUserAttribute$Type: +# {"id":"sourceFile","fileName":"BatchUserAttribute.java"} + com.batch.android.BatchUserAttribute$Type[] $VALUES -> a + 1:6:void ():62:67 -> + 7:7:void ():60:60 -> + 1:1:void (java.lang.String,int):61:61 -> + 1:1:com.batch.android.BatchUserAttribute$Type[] $values():60:60 -> a + 1:1:com.batch.android.BatchUserAttribute$Type valueOf(java.lang.String):60:60 -> valueOf + 1:1:com.batch.android.BatchUserAttribute$Type[] values():60:60 -> values +com.batch.android.BatchUserDataEditor -> com.batch.android.BatchUserDataEditor: +# {"id":"sourceFile","fileName":"BatchUserDataEditor.java"} + int ATTR_URL_MAX_LENGTH -> j + int EMAIL_MAX_LENGTH -> k + java.util.regex.Pattern ATTR_KEY_PATTERN -> e + int IDENTIFIER_INDEX -> h + int ATTR_STRING_MAX_LENGTH -> i + int LANGUAGE_INDEX -> f + boolean[] updatedFields -> b + int REGION_INDEX -> g + com.batch.android.user.EmailSubscription emailSubscription -> d + java.lang.String[] userFields -> c + com.batch.android.user.UserOperationQueue operationQueue -> a + 1:1:void ():35:35 -> + 1:1:void ():51:51 -> + 2:5:void ():44:47 -> + 1:1:void lambda$setAttribute$0(java.lang.String,long,com.batch.android.user.SQLUserDatasource):202:202 -> a + 2:2:void lambda$setAttribute$1(java.lang.String,double,com.batch.android.user.SQLUserDatasource):221:221 -> a + 3:3:void lambda$setAttribute$2(java.lang.String,boolean,com.batch.android.user.SQLUserDatasource):239:239 -> a + 4:4:void lambda$setAttribute$3(java.lang.String,java.util.Date,com.batch.android.user.SQLUserDatasource):268:268 -> a + 5:5:void lambda$setAttribute$5(java.lang.String,java.net.URI,com.batch.android.user.SQLUserDatasource):342:342 -> a + 6:6:void lambda$addTag$7(java.lang.String,java.lang.String,com.batch.android.user.SQLUserDatasource):411:411 -> a + 7:7:void lambda$clearTagCollection$9(java.lang.String,com.batch.android.user.SQLUserDatasource):476:476 -> a + 8:12:void lambda$saveSync$10(java.util.List,com.batch.android.core.Promise):504:508 -> a + 13:23:java.lang.String normalizeAttributeKey(java.lang.String):520:530 -> a + 24:30:java.lang.String normalizeAttributeKey(java.lang.String):521:527 -> a + 31:34:com.batch.android.user.UserOperation getEmailUpdateOperation():551:554 -> a + 35:35:void lambda$getEmailUpdateOperation$11(com.batch.android.user.SQLUserDatasource):555:555 -> a + 1:27:com.batch.android.BatchUserDataEditor addTag(java.lang.String,java.lang.String):385:411 -> addTag + 28:30:com.batch.android.BatchUserDataEditor addTag(java.lang.String,java.lang.String):400:402 -> addTag + 31:31:com.batch.android.BatchUserDataEditor addTag(java.lang.String,java.lang.String):400:400 -> addTag + 32:34:com.batch.android.BatchUserDataEditor addTag(java.lang.String,java.lang.String):387:389 -> addTag + 35:35:com.batch.android.BatchUserDataEditor addTag(java.lang.String,java.lang.String):387:387 -> addTag + 1:1:void lambda$removeAttribute$6(java.lang.String,com.batch.android.user.SQLUserDatasource):360:360 -> b + 2:2:void lambda$removeTag$8(java.lang.String,java.lang.String,com.batch.android.user.SQLUserDatasource):452:452 -> b + 3:7:java.lang.String normalizeTagCollection(java.lang.String):534:538 -> b + 8:8:java.lang.String normalizeTagCollection(java.lang.String):535:535 -> b + 9:14:com.batch.android.user.UserOperation getUserUpdateOperation():561:566 -> b + 15:44:void lambda$getUserUpdateOperation$12(com.batch.android.user.SQLUserDatasource):567:596 -> b + 45:45:void lambda$getUserUpdateOperation$12(com.batch.android.user.SQLUserDatasource):569:569 -> b + 1:1:void lambda$setAttribute$4(java.lang.String,java.lang.String,com.batch.android.user.SQLUserDatasource):301:301 -> c + 2:6:java.lang.String normalizeTagValue(java.lang.String):542:546 -> c + 7:7:java.lang.String normalizeTagValue(java.lang.String):543:543 -> c + 8:16:java.util.List popOperationQueue():602:610 -> c + 1:1:com.batch.android.BatchUserDataEditor clearAttributes():370:370 -> clearAttributes + 1:6:com.batch.android.BatchUserDataEditor clearTagCollection(java.lang.String):475:480 -> clearTagCollection + 7:7:com.batch.android.BatchUserDataEditor clearTagCollection(java.lang.String):478:478 -> clearTagCollection + 1:1:com.batch.android.BatchUserDataEditor clearTags():462:462 -> clearTags + 1:12:com.batch.android.core.Promise saveSync():500:511 -> d + 1:5:com.batch.android.BatchUserDataEditor removeAttribute(java.lang.String):356:360 -> removeAttribute + 1:26:com.batch.android.BatchUserDataEditor removeTag(java.lang.String,java.lang.String):427:452 -> removeTag + 27:29:com.batch.android.BatchUserDataEditor removeTag(java.lang.String,java.lang.String):442:444 -> removeTag + 30:30:com.batch.android.BatchUserDataEditor removeTag(java.lang.String,java.lang.String):442:442 -> removeTag + 31:33:com.batch.android.BatchUserDataEditor removeTag(java.lang.String,java.lang.String):429:431 -> removeTag + 34:34:com.batch.android.BatchUserDataEditor removeTag(java.lang.String,java.lang.String):429:429 -> removeTag + 1:2:void save():495:496 -> save + 1:5:com.batch.android.BatchUserDataEditor setAttribute(java.lang.String,long):198:202 -> setAttribute + 6:11:com.batch.android.BatchUserDataEditor setAttribute(java.lang.String,double):216:221 -> setAttribute + 12:16:com.batch.android.BatchUserDataEditor setAttribute(java.lang.String,boolean):235:239 -> setAttribute + 17:33:com.batch.android.BatchUserDataEditor setAttribute(java.lang.String,java.util.Date):253:269 -> setAttribute + 34:51:com.batch.android.BatchUserDataEditor setAttribute(java.lang.String,java.lang.String):284:301 -> setAttribute + 52:52:com.batch.android.BatchUserDataEditor setAttribute(java.lang.String,java.lang.String):291:291 -> setAttribute + 53:80:com.batch.android.BatchUserDataEditor setAttribute(java.lang.String,java.net.URI):315:342 -> setAttribute + 81:81:com.batch.android.BatchUserDataEditor setAttribute(java.lang.String,java.net.URI):333:333 -> setAttribute + 82:82:com.batch.android.BatchUserDataEditor setAttribute(java.lang.String,java.net.URI):322:322 -> setAttribute + 1:52:com.batch.android.BatchUserDataEditor setEmail(java.lang.String):118:169 -> setEmail + 1:4:com.batch.android.BatchUserDataEditor setEmailMarketingSubscriptionState(com.batch.android.BatchEmailSubscriptionState):181:184 -> setEmailMarketingSubscriptionState + 1:7:com.batch.android.BatchUserDataEditor setIdentifier(java.lang.String):99:105 -> setIdentifier + 1:7:com.batch.android.BatchUserDataEditor setLanguage(java.lang.String):63:69 -> setLanguage + 1:7:com.batch.android.BatchUserDataEditor setRegion(java.lang.String):81:87 -> setRegion +com.batch.android.BatchUserDataEditor$AttributeValidationException -> com.batch.android.BatchUserDataEditor$a: +# {"id":"sourceFile","fileName":"BatchUserDataEditor.java"} + 1:1:void ():619:619 -> +com.batch.android.BatchUserProfile -> com.batch.android.BatchUserProfile: +# {"id":"sourceFile","fileName":"BatchUserProfile.java"} + android.content.Context context -> a + 1:5:void (android.content.Context):26:30 -> + 6:6:void (android.content.Context):28:28 -> + 1:1:long getVersion():143:143 -> a + 1:1:boolean hasCustomLanguage():68:68 -> b + 1:1:boolean hasCustomRegion():106:106 -> c + 1:1:java.lang.String getCustomID():133:133 -> getCustomID + 1:1:java.lang.String getLanguage():59:59 -> getLanguage + 1:1:java.lang.String getRegion():95:95 -> getRegion + 1:1:com.batch.android.BatchUserProfile setCustomID(java.lang.String):121:121 -> setCustomID + 1:1:com.batch.android.BatchUserProfile setLanguage(java.lang.String):45:45 -> setLanguage + 1:1:com.batch.android.BatchUserProfile setRegion(java.lang.String):81:81 -> setRegion +com.batch.android.BatchWebViewContent -> com.batch.android.BatchWebViewContent: +# {"id":"sourceFile","fileName":"BatchWebViewContent.java"} + java.lang.String url -> a + 1:2:void (com.batch.android.messaging.model.WebViewMessage):16:17 -> + 1:1:java.lang.String getURL():22:22 -> getURL +com.batch.android.BatchWebservice -> com.batch.android.i: +# {"id":"sourceFile","fileName":"BatchWebservice.java"} + com.batch.android.core.WebserviceErrorCause lastFailureCause -> m + int retryCount -> l + java.lang.String TAG -> n + 1:1:void (android.content.Context,com.batch.android.core.Webservice$RequestType,java.lang.String,java.lang.String[]):52:52 -> + 2:19:void (android.content.Context,com.batch.android.core.Webservice$RequestType,java.lang.String,java.lang.String[]):37:54 -> + 1:30:void addPropertyParameters():193:222 -> G + 31:39:void addPropertyParameters():218:226 -> G + java.lang.String getPropertyParameterKey() -> H + 1:5:void onRetry(com.batch.android.core.WebserviceErrorCause):179:183 -> a + 6:31:void handleParameters(com.batch.android.json.JSONObject):250:275 -> a + 32:32:void handleParameters(com.batch.android.json.JSONObject):246:246 -> a + 33:37:java.lang.String generateAcceptLanguage(android.content.Context):346:350 -> a + 1:24:void addDefaultHeaders():61:84 -> b + 25:29:void handleServerID(com.batch.android.json.JSONObject):290:294 -> b + 30:30:void handleServerID(com.batch.android.json.JSONObject):286:286 -> b + 31:56:java.lang.String generateUserAgent(android.content.Context):308:333 -> b + 1:82:com.batch.android.post.PostDataProvider getPostDataProvider():93:174 -> w +com.batch.android.BuildConfig -> com.batch.android.a.a: +# {"id":"sourceFile","fileName":"BuildConfig.java"} + java.lang.Integer API_LEVEL -> d + java.lang.String WS_DOMAIN -> i + java.lang.String SDK_VERSION -> h + java.lang.Integer MESSAGING_API_LEVEL -> g + boolean ENABLE_DEBUG_LOGGER -> e + boolean ENABLE_WS_INTERCEPTOR -> f + boolean DEBUG -> a + java.lang.String BUILD_TYPE -> c + java.lang.String LIBRARY_PACKAGE_NAME -> b + 1:7:void ():11:17 -> + 1:1:void ():6:6 -> +com.batch.android.Config -> com.batch.android.Config: +# {"id":"sourceFile","fileName":"Config.java"} + com.batch.android.LoggerDelegate loggerDelegate -> e + java.lang.String apikey -> a + com.batch.android.LoggerLevel loggerLevel -> f + boolean shouldUseAdvertisingID -> b + boolean shouldUseAdvancedDeviceInformation -> c + boolean shouldUseGoogleInstanceID -> d + 1:1:void (java.lang.String):43:43 -> + 2:27:void (java.lang.String):19:44 -> + 1:1:com.batch.android.Config setCanUseAdvancedDeviceInformation(boolean):90:90 -> setCanUseAdvancedDeviceInformation + 1:1:com.batch.android.Config setCanUseAdvertisingID(boolean):68:68 -> setCanUseAdvertisingID + 1:1:com.batch.android.Config setCanUseInstanceID(boolean):129:129 -> setCanUseInstanceID + 1:1:com.batch.android.Config setLoggerDelegate(com.batch.android.LoggerDelegate):103:103 -> setLoggerDelegate + 1:1:com.batch.android.Config setLoggerLevel(com.batch.android.LoggerLevel):114:114 -> setLoggerLevel +com.batch.android.DeeplinkInterceptorRuntimeException -> com.batch.android.a.b: +# {"id":"sourceFile","fileName":"DeeplinkInterceptorRuntimeException.java"} + java.lang.RuntimeException wrappedRuntimeException -> a + 1:2:void (java.lang.RuntimeException):17:18 -> + 1:1:java.lang.RuntimeException getWrappedRuntimeException():22:22 -> a +com.batch.android.DisplayReceiptWebservice -> com.batch.android.j: +# {"id":"sourceFile","fileName":"DisplayReceiptWebservice.java"} + com.batch.android.webservice.listener.DisplayReceiptWebserviceListener listener -> n + java.lang.String TAG -> o + 1:5:void (android.content.Context,com.batch.android.webservice.listener.DisplayReceiptWebserviceListener,com.batch.android.post.DisplayReceiptPostDataProvider,java.lang.String[]):32:36 -> + 6:6:void (android.content.Context,com.batch.android.webservice.listener.DisplayReceiptWebserviceListener,com.batch.android.post.DisplayReceiptPostDataProvider,java.lang.String[]):34:34 -> + 1:1:java.lang.String getSpecificRetryCountKey():62:62 -> C + 1:1:java.lang.String getTaskIdentifier():52:52 -> a + 1:1:java.lang.String getCryptorTypeParameterKey():57:57 -> p + 1:5:void run():42:46 -> run +com.batch.android.FailReason -> com.batch.android.FailReason: +# {"id":"sourceFile","fileName":"FailReason.java"} + com.batch.android.FailReason[] $VALUES -> a + 1:17:void ():14:30 -> + 18:18:void ():9:9 -> + 1:1:void (java.lang.String,int):10:10 -> + 1:1:com.batch.android.FailReason[] $values():9:9 -> a + 1:1:com.batch.android.FailReason valueOf(java.lang.String):9:9 -> valueOf + 1:1:com.batch.android.FailReason[] values():9:9 -> values +com.batch.android.ImageDownloadWebservice -> com.batch.android.k: +# {"id":"sourceFile","fileName":"ImageDownloadWebservice.java"} + java.lang.String TAG -> m + java.lang.String url -> l + 1:2:void (android.content.Context,java.lang.String,java.util.List):25:26 -> + 1:1:java.lang.String getSpecificConnectTimeoutKey():148:148 -> A + 1:1:java.lang.String getSpecificReadTimeoutKey():153:153 -> B + 1:1:java.lang.String getSpecificRetryCountKey():158:158 -> C + 1:1:java.lang.String getURLSorterPatternParameterKey():123:123 -> F + 1:20:android.graphics.Bitmap run():86:105 -> G + 21:28:android.graphics.Bitmap run():102:109 -> G + 1:13:java.lang.String buildImageURL(android.content.Context,java.lang.String,java.util.List):44:56 -> a + 14:20:java.lang.String appendDensityToImageURL(java.lang.String,java.lang.Double):73:79 -> a + 1:1:java.lang.String getCryptorModeParameterKey():133:133 -> o + 1:1:java.lang.String getCryptorTypeParameterKey():128:128 -> p + 1:1:java.lang.String getPostCryptorTypeParameterKey():138:138 -> v + com.batch.android.post.PostDataProvider getPostDataProvider() -> w + 1:1:java.lang.String getReadCryptorTypeParameterKey():143:143 -> y +com.batch.android.InAppMessageUserActionSource -> com.batch.android.InAppMessageUserActionSource: +# {"id":"sourceFile","fileName":"InAppMessageUserActionSource.java"} +com.batch.android.Install -> com.batch.android.l: +# {"id":"sourceFile","fileName":"Install.java"} + java.util.Date installDate -> b + java.lang.String installID -> a + 1:7:void (android.content.Context):30:36 -> + 8:8:void (android.content.Context):32:32 -> + 1:1:java.util.Date getInstallDate():56:56 -> a + 2:2:java.lang.String generateInstallID(android.content.Context):84:84 -> a + 1:1:java.lang.String getInstallID():47:47 -> b + 2:11:java.util.Date getInstallDate(android.content.Context):96:105 -> b + 1:4:java.lang.String getInstallID(android.content.Context):68:71 -> c +com.batch.android.IntentParser -> com.batch.android.m: +# {"id":"sourceFile","fileName":"IntentParser.java"} + java.lang.String FROM_PUSH_LEGACY_KEY -> g + java.lang.String FROM_PUSH_KEY -> f + java.lang.String PUSH_ID_LEGACY_KEY -> i + java.lang.String PUSH_ID_KEY -> h + android.content.Intent intent -> a + java.lang.String TAG -> c + com.batch.android.BatchPushPayload payload -> b + java.lang.String ALREADY_TRACKED_OPEN_KEY -> e + java.lang.String ALREADY_SHOWN_LANDING_KEY -> d + 1:1:void (android.app.Activity):72:72 -> + 2:2:void (android.content.Intent):80:80 -> + 3:33:void (android.content.Intent):62:92 -> + 1:5:boolean comesFromPush():106:110 -> a + 6:15:void putPushExtrasToIntent(android.os.Bundle,com.batch.android.core.InternalPushData,android.content.Intent):236:245 -> a + 16:18:void copyExtras(android.content.Intent,android.content.Intent):257:259 -> a + 19:45:void copyExtras(android.os.Bundle,android.os.Bundle):270:296 -> a + 1:5:com.batch.android.BatchMessage getLanding():181:185 -> b + 1:2:android.os.Bundle getPushBundle():226:227 -> c + 1:8:com.batch.android.core.InternalPushData getPushData():213:220 -> d + 1:7:java.lang.String getPushId():195:201 -> e + 1:5:boolean hasLanding():143:147 -> f + 1:1:boolean hasPushPayload():97:97 -> g + 1:5:boolean isLandingAlreadyShown():156:160 -> h + 1:5:boolean isOpenAlreadyTracked():119:123 -> i + 1:5:void markLandingAsAlreadyShown():167:171 -> j + 1:4:void markOpenAsAlreadyTracked():130:133 -> k +com.batch.android.LocalCampaignsJITWebservice -> com.batch.android.n: +# {"id":"sourceFile","fileName":"LocalCampaignsJITWebservice.java"} + com.batch.android.webservice.listener.LocalCampaignsJITWebserviceListener listener -> n + java.lang.String TAG -> o + 1:5:void (android.content.Context,com.batch.android.webservice.listener.LocalCampaignsJITWebserviceListener,com.batch.android.post.LocalCampaignsJITPostDataProvider,java.lang.String[]):30:34 -> + 6:6:void (android.content.Context,com.batch.android.webservice.listener.LocalCampaignsJITWebserviceListener,com.batch.android.post.LocalCampaignsJITPostDataProvider,java.lang.String[]):32:32 -> + 1:1:java.lang.String getSpecificConnectTimeoutKey():63:63 -> A + 1:1:java.lang.String getSpecificReadTimeoutKey():68:68 -> B + 1:1:java.lang.String getSpecificRetryCountKey():73:73 -> C + 1:1:java.lang.String getTaskIdentifier():39:39 -> a + 1:14:void run():44:57 -> run +com.batch.android.LocalCampaignsWebservice -> com.batch.android.o: +# {"id":"sourceFile","fileName":"LocalCampaignsWebservice.java"} + com.batch.android.webservice.listener.LocalCampaignsWebserviceListener listener -> s + java.lang.String TAG -> t + 1:2:void (android.content.Context,com.batch.android.webservice.listener.LocalCampaignsWebserviceListener):38:39 -> + 1:1:java.lang.String getSpecificConnectTimeoutKey():173:173 -> A + 1:1:java.lang.String getSpecificReadTimeoutKey():178:178 -> B + 1:1:java.lang.String getSpecificRetryCountKey():183:183 -> C + 1:1:java.lang.String getURLSorterPatternParameterKey():148:148 -> F + 1:1:java.lang.String getPropertyParameterKey():143:143 -> H + 1:3:java.util.List getQueries():46:48 -> I + 1:1:java.lang.String getTaskIdentifier():136:136 -> a + 1:1:java.lang.String getCryptorModeParameterKey():158:158 -> o + 1:1:java.lang.String getCryptorTypeParameterKey():153:153 -> p + 1:59:void run():56:114 -> run + 60:60:void run():113:113 -> run + 61:77:void run():111:127 -> run + 78:81:void run():68:71 -> run + 82:101:void run():68:87 -> run + 102:102:void run():84:84 -> run + 103:103:void run():81:81 -> run + 104:156:void run():78:130 -> run + 1:1:java.lang.String getPostCryptorTypeParameterKey():163:163 -> v + 1:1:java.lang.String getReadCryptorTypeParameterKey():168:168 -> y +com.batch.android.LocalCampaignsWebservice$1 -> com.batch.android.o$a: +# {"id":"sourceFile","fileName":"LocalCampaignsWebservice.java"} + int[] $SwitchMap$com$batch$android$core$Webservice$WebserviceError$Reason -> a + 1:1:void ():76:76 -> +com.batch.android.LoggerDelegate -> com.batch.android.LoggerDelegate: +# {"id":"sourceFile","fileName":"LoggerDelegate.java"} +com.batch.android.LoggerLevel -> com.batch.android.LoggerLevel: +# {"id":"sourceFile","fileName":"LoggerLevel.java"} + com.batch.android.LoggerLevel[] $VALUES -> b + int level -> a + 1:5:void ():7:11 -> + 6:6:void ():5:5 -> + 1:2:void (java.lang.String,int,int):15:16 -> + 1:1:com.batch.android.LoggerLevel[] $values():5:5 -> a + 1:1:boolean canLog(com.batch.android.LoggerLevel):21:21 -> canLog + 1:1:com.batch.android.LoggerLevel valueOf(java.lang.String):5:5 -> valueOf + 1:1:com.batch.android.LoggerLevel[] values():5:5 -> values +com.batch.android.MessagingActivity -> com.batch.android.MessagingActivity: +# {"id":"sourceFile","fileName":"MessagingActivity.java"} + android.content.BroadcastReceiver dismissReceiver -> a + java.lang.String ROTATED -> c + java.lang.String TAG -> b + java.lang.String DIALOG_FRAGMENT_TAG -> d + 1:7:void ():23:29 -> + 1:12:boolean showMessage(com.batch.android.BatchMessage):110:121 -> a + 1:4:void finish():98:101 -> finish + 1:23:void onCreate(android.os.Bundle):40:62 -> onCreate + 24:48:void onCreate(android.os.Bundle):44:68 -> onCreate + 1:3:void onDestroy():91:93 -> onDestroy + 1:6:void onDialogDismiss(androidx.fragment.app.DialogFragment):129:134 -> onDialogDismiss + 1:2:void onSaveInstanceState(android.os.Bundle):73:74 -> onSaveInstanceState + 1:2:void onStart():79:80 -> onStart + 1:2:void onStop():85:86 -> onStop + 1:6:void startActivityForMessage(android.content.Context,com.batch.android.BatchMessage):143:148 -> startActivityForMessage +com.batch.android.MessagingActivity$1 -> com.batch.android.MessagingActivity$a: +# {"id":"sourceFile","fileName":"MessagingActivity.java"} + com.batch.android.MessagingActivity this$0 -> a + 1:1:void (com.batch.android.MessagingActivity):29:29 -> + 1:2:void onReceive(android.content.Context,android.content.Intent):32:33 -> onReceive +com.batch.android.MessagingAnalyticsDelegate -> com.batch.android.p: +# {"id":"sourceFile","fileName":"MessagingAnalyticsDelegate.java"} + java.lang.String STATE_KEY_CALLED_METHODS -> g + com.batch.android.module.MessagingModule messagingModule -> a + com.batch.android.module.TrackerModule trackerModule -> b + com.batch.android.messaging.model.Message message -> d + java.util.ArrayList calledMethods -> f + com.batch.android.BatchMessage sourceMessage -> e + com.batch.android.module.EventDispatcherModule eventDispatcherModule -> c + 1:1:void (com.batch.android.module.MessagingModule,com.batch.android.module.TrackerModule,com.batch.android.module.EventDispatcherModule,com.batch.android.messaging.model.Message,com.batch.android.BatchMessage):54:54 -> + 2:15:void (com.batch.android.module.MessagingModule,com.batch.android.module.TrackerModule,com.batch.android.module.EventDispatcherModule,com.batch.android.messaging.model.Message,com.batch.android.BatchMessage):46:59 -> + 1:4:com.batch.android.MessagingAnalyticsDelegate provide(com.batch.android.messaging.model.Message,com.batch.android.BatchMessage):64:67 -> a + 5:12:boolean ensureOnce(java.lang.String):75:82 -> a + 13:27:void onGlobalTap(com.batch.android.messaging.model.Action):88:102 -> a + 28:28:void onGlobalTap(com.batch.android.messaging.model.Action):97:97 -> a + 29:44:void onCTAClicked(int,com.batch.android.messaging.model.CTA):109:124 -> a + 45:45:void onCTAClicked(int,com.batch.android.messaging.model.CTA):119:119 -> a + 46:70:void onWebViewClickTracked(com.batch.android.messaging.model.Action,java.lang.String):133:157 -> a + 71:71:void onWebViewClickTracked(com.batch.android.messaging.model.Action,java.lang.String):152:152 -> a + 72:78:void onClosedError(com.batch.android.messaging.model.MessagingError):177:183 -> a + 79:79:void onClosedError(com.batch.android.messaging.model.MessagingError):181:181 -> a + 80:86:void onAutoClosedAfterDelay():192:198 -> a + 87:87:void onAutoClosedAfterDelay():196:196 -> a + 88:88:void onSaveInstanceState(android.os.Bundle):239:239 -> a + 1:7:void onClosed():166:172 -> b + 8:8:void onClosed():170:170 -> b + 9:11:void restoreState(android.os.Bundle):231:233 -> b + 1:4:void onViewDismissed():219:222 -> c + 1:12:void onViewShown():203:214 -> d + 13:13:void onViewShown():212:212 -> d +com.batch.android.MetricWebservice -> com.batch.android.q: +# {"id":"sourceFile","fileName":"MetricWebservice.java"} + java.lang.String TAG -> o + com.batch.android.webservice.listener.MetricWebserviceListener listener -> n + 1:5:void (android.content.Context,com.batch.android.webservice.listener.MetricWebserviceListener,com.batch.android.post.MetricPostDataProvider,java.lang.String[]):25:29 -> + 6:6:void (android.content.Context,com.batch.android.webservice.listener.MetricWebserviceListener,com.batch.android.post.MetricPostDataProvider,java.lang.String[]):27:27 -> + 1:1:java.lang.String getSpecificRetryCountKey():50:50 -> C + 1:1:java.lang.String getTaskIdentifier():45:45 -> a + 1:6:void run():34:39 -> run +com.batch.android.NotificationInterceptorRuntimeException -> com.batch.android.s: +# {"id":"sourceFile","fileName":"NotificationInterceptorRuntimeException.java"} + java.lang.RuntimeException wrappedRuntimeException -> a + 1:2:void (java.lang.RuntimeException):17:18 -> + 1:1:java.lang.RuntimeException getWrappedRuntimeException():22:22 -> a +com.batch.android.PrivateNotificationContentHelper -> com.batch.android.t: +# {"id":"sourceFile","fileName":"PrivateNotificationContentHelper.java"} + 1:1:void ():12:12 -> + 1:1:com.batch.android.inbox.InboxNotificationContentInternal getInternalContent(com.batch.android.BatchInboxNotificationContent):15:15 -> a + 2:2:com.batch.android.BatchInboxNotificationContent getPublicContent(com.batch.android.inbox.InboxNotificationContentInternal):19:19 -> a +com.batch.android.PushNotificationType -> com.batch.android.PushNotificationType: +# {"id":"sourceFile","fileName":"PushNotificationType.java"} + com.batch.android.PushNotificationType[] $VALUES -> b + int value -> a + 1:21:void ():15:35 -> + 22:22:void ():10:10 -> + 1:2:void (java.lang.String,int,int):47:48 -> + 1:1:com.batch.android.PushNotificationType[] $values():10:10 -> a + 1:10:java.util.EnumSet fromValue(int):54:63 -> fromValue + 1:2:int toValue(java.util.EnumSet):72:73 -> toValue + 1:1:com.batch.android.PushNotificationType valueOf(java.lang.String):10:10 -> valueOf + 1:1:com.batch.android.PushNotificationType[] values():10:10 -> values +com.batch.android.PushRegistrationProvider -> com.batch.android.PushRegistrationProvider: +# {"id":"sourceFile","fileName":"PushRegistrationProvider.java"} +com.batch.android.PushRegistrationProviderAvailabilityException -> com.batch.android.PushRegistrationProviderAvailabilityException: +# {"id":"sourceFile","fileName":"PushRegistrationProviderAvailabilityException.java"} + 1:1:void (java.lang.String):9:9 -> +com.batch.android.PushUserActionSource -> com.batch.android.PushUserActionSource: +# {"id":"sourceFile","fileName":"PushUserActionSource.java"} +com.batch.android.PushWebservice -> com.batch.android.u: +# {"id":"sourceFile","fileName":"PushWebservice.java"} + com.batch.android.webservice.listener.PushWebserviceListener listener -> t + com.batch.android.push.Registration registration -> s + java.lang.String TAG -> u + 1:11:void (android.content.Context,com.batch.android.push.Registration,com.batch.android.webservice.listener.PushWebserviceListener):43:53 -> + 12:12:void (android.content.Context,com.batch.android.push.Registration,com.batch.android.webservice.listener.PushWebserviceListener):49:49 -> + 13:13:void (android.content.Context,com.batch.android.push.Registration,com.batch.android.webservice.listener.PushWebserviceListener):45:45 -> + 1:1:java.lang.String getSpecificConnectTimeoutKey():164:164 -> A + 1:1:java.lang.String getSpecificReadTimeoutKey():169:169 -> B + 1:1:java.lang.String getSpecificRetryCountKey():174:174 -> C + 1:1:java.lang.String getURLSorterPatternParameterKey():139:139 -> F + 1:1:java.lang.String getPropertyParameterKey():134:134 -> H + 1:3:java.util.List getQueries():60:62 -> I + 1:1:java.lang.String getTaskIdentifier():127:127 -> a + 1:1:java.lang.String getCryptorModeParameterKey():149:149 -> o + 1:1:java.lang.String getCryptorTypeParameterKey():144:144 -> p + 1:49:void run():70:118 -> run + 50:50:void run():112:112 -> run + 51:65:void run():81:95 -> run + 66:66:void run():92:92 -> run + 67:67:void run():89:89 -> run + 68:103:void run():86:121 -> run + 1:1:java.lang.String getPostCryptorTypeParameterKey():154:154 -> v + 1:1:java.lang.String getReadCryptorTypeParameterKey():159:159 -> y +com.batch.android.PushWebservice$1 -> com.batch.android.u$a: +# {"id":"sourceFile","fileName":"PushWebservice.java"} + int[] $SwitchMap$com$batch$android$core$Webservice$WebserviceError$Reason -> a + 1:1:void ():84:84 -> +com.batch.android.StartWebservice -> com.batch.android.v: +# {"id":"sourceFile","fileName":"StartWebservice.java"} + java.lang.String TAG -> w + com.batch.android.webservice.listener.StartWebserviceListener listener -> s + boolean userActivity -> v + java.lang.String pushId -> u + boolean fromPush -> t + 1:9:void (android.content.Context,boolean,java.lang.String,boolean,com.batch.android.webservice.listener.StartWebserviceListener):64:72 -> + 10:10:void (android.content.Context,boolean,java.lang.String,boolean,com.batch.android.webservice.listener.StartWebserviceListener):66:66 -> + 1:1:java.lang.String getSpecificConnectTimeoutKey():189:189 -> A + 1:1:java.lang.String getSpecificReadTimeoutKey():194:194 -> B + 1:1:java.lang.String getSpecificRetryCountKey():199:199 -> C + 1:1:java.lang.String getURLSorterPatternParameterKey():164:164 -> F + 1:1:java.lang.String getPropertyParameterKey():159:159 -> H + 1:8:java.util.List getQueries():79:86 -> I + 1:1:java.lang.String getTaskIdentifier():152:152 -> a + 1:1:java.lang.String getCryptorModeParameterKey():174:174 -> o + 1:1:java.lang.String getCryptorTypeParameterKey():169:169 -> p + 1:49:void run():95:143 -> run + 50:50:void run():137:137 -> run + 51:65:void run():106:120 -> run + 66:66:void run():117:117 -> run + 67:67:void run():114:114 -> run + 68:103:void run():111:146 -> run + 1:1:java.lang.String getPostCryptorTypeParameterKey():179:179 -> v + 1:1:java.lang.String getReadCryptorTypeParameterKey():184:184 -> y +com.batch.android.StartWebservice$1 -> com.batch.android.v$a: +# {"id":"sourceFile","fileName":"StartWebservice.java"} + int[] $SwitchMap$com$batch$android$core$Webservice$WebserviceError$Reason -> a + 1:1:void ():109:109 -> +com.batch.android.TrackerWebservice -> com.batch.android.w: +# {"id":"sourceFile","fileName":"TrackerWebservice.java"} + com.batch.android.webservice.listener.TrackerWebserviceListener listener -> s + java.lang.String TAG -> v + java.util.List events -> t + boolean canBypassOptOut -> u + 1:12:void (android.content.Context,com.batch.android.webservice.listener.TrackerWebserviceListener,java.util.List,boolean):35:46 -> + 13:13:void (android.content.Context,com.batch.android.webservice.listener.TrackerWebserviceListener,java.util.List,boolean):41:41 -> + 14:14:void (android.content.Context,com.batch.android.webservice.listener.TrackerWebserviceListener,java.util.List,boolean):37:37 -> + 1:1:java.lang.String getSpecificConnectTimeoutKey():156:156 -> A + 1:1:java.lang.String getSpecificReadTimeoutKey():161:161 -> B + 1:1:java.lang.String getSpecificRetryCountKey():166:166 -> C + 1:1:java.lang.String getURLSorterPatternParameterKey():131:131 -> F + 1:1:java.lang.String getPropertyParameterKey():126:126 -> H + 1:3:java.util.List getQueries():58:60 -> I + 1:1:java.lang.String getTaskIdentifier():119:119 -> a + 1:1:boolean canBypassOptOut():53:53 -> i + 1:1:java.lang.String getCryptorModeParameterKey():141:141 -> o + 1:1:java.lang.String getCryptorTypeParameterKey():136:136 -> p + 1:41:void run():68:108 -> run + 42:56:void run():79:93 -> run + 57:57:void run():90:90 -> run + 58:58:void run():87:87 -> run + 59:88:void run():84:113 -> run + 89:93:void run():110:114 -> run + 1:1:java.lang.String getPostCryptorTypeParameterKey():146:146 -> v + 1:1:java.lang.String getReadCryptorTypeParameterKey():151:151 -> y +com.batch.android.TrackerWebservice$1 -> com.batch.android.w$a: +# {"id":"sourceFile","fileName":"TrackerWebservice.java"} + int[] $SwitchMap$com$batch$android$core$Webservice$WebserviceError$Reason -> a + 1:1:void ():82:82 -> +com.batch.android.User -> com.batch.android.x: +# {"id":"sourceFile","fileName":"User.java"} + android.content.Context context -> a + 1:6:void (android.content.Context):31:36 -> + 7:7:void (android.content.Context):33:33 -> + 1:3:void setCustomID(java.lang.String):96:98 -> a + 4:4:java.lang.String getCustomID():108:108 -> a + 1:3:void setLanguage(java.lang.String):48:50 -> b + 4:4:java.lang.String getLanguage():60:60 -> b + 1:3:void setRegion(java.lang.String):72:74 -> c + 4:4:java.lang.String getRegion():84:84 -> c + 1:7:long getVersion():119:125 -> d + 1:2:long incrementVersion():137:138 -> e + 1:22:void sendChangeEvent():144:165 -> f +com.batch.android.UserAction -> com.batch.android.UserAction: +# {"id":"sourceFile","fileName":"UserAction.java"} + com.batch.android.UserActionRunnable runnable -> b + java.lang.String identifier -> a + 1:17:void (java.lang.String,com.batch.android.UserActionRunnable):22:38 -> + 18:18:void (java.lang.String,com.batch.android.UserActionRunnable):34:34 -> + 19:19:void (java.lang.String,com.batch.android.UserActionRunnable):29:29 -> + 20:20:void (java.lang.String,com.batch.android.UserActionRunnable):25:25 -> + 1:1:java.lang.String getIdentifier():43:43 -> getIdentifier + 1:1:com.batch.android.UserActionRunnable getRunnable():48:48 -> getRunnable +com.batch.android.UserActionRunnable -> com.batch.android.UserActionRunnable: +# {"id":"sourceFile","fileName":"UserActionRunnable.java"} +com.batch.android.UserActionSource -> com.batch.android.UserActionSource: +# {"id":"sourceFile","fileName":"UserActionSource.java"} +com.batch.android.UserDataAccessor -> com.batch.android.y: +# {"id":"sourceFile","fileName":"UserDataAccessor.java"} + 1:1:void ():19:19 -> + 1:37:void fetchTagCollections(android.content.Context,com.batch.android.BatchTagCollectionsFetchListener,boolean):31:67 -> a + 38:38:void fetchTagCollections(android.content.Context,com.batch.android.BatchTagCollectionsFetchListener,boolean):28:28 -> a + 39:64:void lambda$fetchTagCollections$1(android.content.Context,boolean,com.batch.android.BatchTagCollectionsFetchListener):33:58 -> a + 65:67:void lambda$fetchTagCollections$0(com.batch.android.BatchTagCollectionsFetchListener,java.util.Map):47:49 -> a + 68:139:void fetchAttributes(android.content.Context,com.batch.android.BatchAttributesFetchListener,boolean):81:152 -> a + 140:140:void fetchAttributes(android.content.Context,com.batch.android.BatchAttributesFetchListener,boolean):78:78 -> a + 141:169:void lambda$fetchAttributes$3(android.content.Context,boolean,com.batch.android.BatchAttributesFetchListener):83:111 -> a + 170:170:void lambda$fetchAttributes$3(android.content.Context,boolean,com.batch.android.BatchAttributesFetchListener):108:108 -> a + 171:171:void lambda$fetchAttributes$3(android.content.Context,boolean,com.batch.android.BatchAttributesFetchListener):105:105 -> a + 172:172:void lambda$fetchAttributes$3(android.content.Context,boolean,com.batch.android.BatchAttributesFetchListener):102:102 -> a + 173:173:void lambda$fetchAttributes$3(android.content.Context,boolean,com.batch.android.BatchAttributesFetchListener):99:99 -> a + 174:221:void lambda$fetchAttributes$3(android.content.Context,boolean,com.batch.android.BatchAttributesFetchListener):96:143 -> a + 222:224:void lambda$fetchAttributes$2(com.batch.android.BatchAttributesFetchListener,java.util.HashMap):132:134 -> a +com.batch.android.UserDataAccessor$1 -> com.batch.android.y$a: +# {"id":"sourceFile","fileName":"UserDataAccessor.java"} + int[] $SwitchMap$com$batch$android$user$AttributeType -> a + 1:1:void ():94:94 -> +com.batch.android.WebserviceLauncher -> com.batch.android.z: +# {"id":"sourceFile","fileName":"WebserviceLauncher.java"} + java.lang.String TAG -> a + 1:1:void ():33:33 -> + 1:4:boolean launchStartWebservice(com.batch.android.runtime.RuntimeManager,boolean,java.lang.String,boolean):48:51 -> a + 5:16:boolean launchStartWebservice(com.batch.android.runtime.RuntimeManager,boolean,java.lang.String,boolean):49:60 -> a + 17:19:com.batch.android.core.TaskRunnable initTrackerWebservice(com.batch.android.runtime.RuntimeManager,java.util.List,com.batch.android.webservice.listener.TrackerWebserviceListener):79:81 -> a + 20:22:com.batch.android.core.TaskRunnable initOptOutTrackerWebservice(android.content.Context,java.util.List,com.batch.android.webservice.listener.TrackerWebserviceListener):99:101 -> a + 23:25:com.batch.android.core.TaskRunnable initMetricWebservice(android.content.Context,com.batch.android.post.MetricPostDataProvider,com.batch.android.webservice.listener.MetricWebserviceListener):120:122 -> a + 26:28:boolean launchPushWebservice(com.batch.android.runtime.RuntimeManager,com.batch.android.push.Registration):133:135 -> a + 29:34:boolean launchPushWebservice(com.batch.android.runtime.RuntimeManager,com.batch.android.push.Registration):134:139 -> a + 35:38:boolean launchAttributesSendWebservice(com.batch.android.runtime.RuntimeManager,long,java.util.Map,java.util.Map):152:155 -> a + 39:50:boolean launchAttributesSendWebservice(com.batch.android.runtime.RuntimeManager,long,java.util.Map,java.util.Map):153:164 -> a + 51:54:boolean launchAttributesCheckWebservice(com.batch.android.runtime.RuntimeManager,long,java.lang.String):176:179 -> a + 55:65:boolean launchAttributesCheckWebservice(com.batch.android.runtime.RuntimeManager,long,java.lang.String):177:187 -> a + 66:70:boolean launchLocalCampaignsWebservice(com.batch.android.runtime.RuntimeManager):195:199 -> a + 71:79:boolean launchLocalCampaignsWebservice(com.batch.android.runtime.RuntimeManager):196:204 -> a + 80:87:boolean launchLocalCampaignsJITWebservice(com.batch.android.runtime.RuntimeManager,java.util.List,com.batch.android.webservice.listener.LocalCampaignsJITWebserviceListener):214:221 -> a + 88:91:boolean launchDisplayReceiptWebservice(android.content.Context,com.batch.android.post.DisplayReceiptPostDataProvider,com.batch.android.webservice.listener.DisplayReceiptWebserviceListener):240:243 -> a +com.batch.android.WebserviceMetrics -> com.batch.android.a0: +# {"id":"sourceFile","fileName":"WebserviceMetrics.java"} + java.util.Map metrics -> a + java.util.Map webservicesStartTime -> b + java.util.Map shortNames -> d + java.lang.String TAG -> c + 1:10:void ():106:115 -> + 1:12:void ():18:29 -> + 1:9:void onWebserviceStarted(com.batch.android.core.Webservice):43:51 -> a + 10:10:void onWebserviceStarted(com.batch.android.core.Webservice):40:40 -> a + 11:31:void onWebserviceFinished(com.batch.android.core.Webservice,boolean):65:85 -> a + 32:32:void onWebserviceFinished(com.batch.android.core.Webservice,boolean):81:81 -> a + 33:33:void onWebserviceFinished(com.batch.android.core.Webservice,boolean):62:62 -> a + 34:38:java.util.Map getMetrics():94:98 -> a +com.batch.android.WebserviceMetrics$1 -> com.batch.android.a0$a: +# {"id":"sourceFile","fileName":"WebserviceMetrics.java"} +com.batch.android.WebserviceMetrics$Metric -> com.batch.android.a0$b: +# {"id":"sourceFile","fileName":"WebserviceMetrics.java"} + long time -> b + boolean success -> a + 1:1:void (boolean,long,com.batch.android.WebserviceMetrics$1):124:124 -> + 2:4:void (boolean,long):141:143 -> +com.batch.android.WebserviceParameterUtils -> com.batch.android.b0: +# {"id":"sourceFile","fileName":"WebserviceParameterUtils.java"} + java.lang.String TAG -> a + 1:1:void ():23:23 -> + 1:116:java.util.Map buildIds(android.content.Context):54:169 -> a + 1:1:com.batch.android.json.JSONObject getWebserviceIdsAsJson(android.content.Context):42:42 -> b + 1:1:java.util.Map getWebserviceIdsAsMap(android.content.Context):33:33 -> c +com.batch.android.actions.ClipboardActionRunnable -> com.batch.android.b.a: +# {"id":"sourceFile","fileName":"ClipboardActionRunnable.java"} + java.lang.String TAG -> a + java.lang.String IDENTIFIER -> c + java.lang.String BASE_ERROR_MSG -> b + 1:1:void ():18:18 -> + 1:17:void performAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject,com.batch.android.UserActionSource):33:49 -> performAction +com.batch.android.actions.DeeplinkActionRunnable -> com.batch.android.b.b: +# {"id":"sourceFile","fileName":"DeeplinkActionRunnable.java"} + java.lang.String IDENTIFIER -> c + java.lang.String TAG -> b + java.lang.String ARGUMENT_SHOW_LINK_INAPP -> e + com.batch.android.module.ActionModule actionModule -> a + java.lang.String ARGUMENT_DEEPLINK_URL -> d + 1:2:void (com.batch.android.module.ActionModule):29:30 -> + 1:17:void launchDeeplink(android.content.Context,java.lang.String,boolean):35:51 -> a + 18:48:void launchDeeplink(android.content.Context,java.lang.String,boolean):42:72 -> a + 49:54:void launchDeeplink(android.content.Context,java.lang.String,boolean):63:68 -> a + 55:80:void launchDeeplink(android.content.Context,java.lang.String,boolean) -> a + 1:16:void performAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject,com.batch.android.UserActionSource):91:106 -> performAction + 17:34:void performAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject,com.batch.android.UserActionSource):103:120 -> performAction + 35:35:void performAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject,com.batch.android.UserActionSource):113:113 -> performAction + 36:36:void performAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject,com.batch.android.UserActionSource):111:111 -> performAction +com.batch.android.actions.GroupActionRunnable -> com.batch.android.b.c: +# {"id":"sourceFile","fileName":"GroupActionRunnable.java"} + java.lang.String IDENTIFIER -> b + com.batch.android.module.ActionModule actionModule -> a + 1:2:void (com.batch.android.module.ActionModule):23:24 -> + 1:35:void performAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject,com.batch.android.UserActionSource):44:78 -> performAction +com.batch.android.actions.LocalCampaignsRefreshActionRunnable -> com.batch.android.b.d: +# {"id":"sourceFile","fileName":"LocalCampaignsRefreshActionRunnable.java"} + java.lang.String TAG -> a + java.lang.String IDENTIFIER -> b + 1:1:void ():15:15 -> + 1:5:void performAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject,com.batch.android.UserActionSource):27:31 -> performAction +com.batch.android.actions.NotificationPermissionActionRunnable -> com.batch.android.b.e: +# {"id":"sourceFile","fileName":"NotificationPermissionActionRunnable.java"} + java.lang.String TAG -> a + java.lang.String IDENTIFIER -> b + 1:1:void ():13:13 -> + 1:5:void performAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject,com.batch.android.UserActionSource):27:31 -> performAction +com.batch.android.actions.RatingActionRunnable -> com.batch.android.b.f: +# {"id":"sourceFile","fileName":"RatingActionRunnable.java"} + java.lang.String TAG -> a + java.lang.String IDENTIFIER -> b + 1:1:void ():25:25 -> + 1:8:void lambda$performAction$0(android.content.Context,java.lang.Exception):40:47 -> a + 9:15:void lambda$performAction$0(android.content.Context,java.lang.Exception):44:50 -> a + 16:29:void lambda$tryOpenPlayStoreInAppRating$2(android.content.Context,com.batch.android.core.Promise):59:72 -> a + 30:51:void lambda$tryOpenPlayStoreInAppRating$2(android.content.Context,com.batch.android.core.Promise):65:86 -> a + 52:61:void lambda$tryOpenPlayStoreInAppRating$1(com.batch.android.core.Promise,com.google.android.play.core.review.ReviewManager,android.app.Activity,com.google.android.play.core.tasks.Task):73:82 -> a + 62:65:void openStore(android.content.Context):92:95 -> a + 1:1:com.batch.android.core.Promise tryOpenPlayStoreInAppRating(android.content.Context):55:55 -> b + 1:5:void performAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject,com.batch.android.UserActionSource):35:39 -> performAction +com.batch.android.actions.RatingActionRunnable$RatingActionRunnableException -> com.batch.android.b.f$a: +# {"id":"sourceFile","fileName":"RatingActionRunnable.java"} + 1:1:void (java.lang.String,java.lang.Throwable):102:102 -> +com.batch.android.actions.RedirectNotificationSettingsAction -> com.batch.android.b.g: +# {"id":"sourceFile","fileName":"RedirectNotificationSettingsAction.java"} + java.lang.String TAG -> a + java.lang.String IDENTIFIER -> b + 1:1:void ():16:16 -> + 1:19:void performAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject,com.batch.android.UserActionSource):31:49 -> performAction +com.batch.android.actions.SmartReOptInAction -> com.batch.android.b.h: +# {"id":"sourceFile","fileName":"SmartReOptInAction.java"} + java.lang.String TAG -> a + java.lang.String IDENTIFIER -> b + 1:1:void ():24:24 -> + 1:4:void redirectToNotificationSettings(android.content.Context):92:95 -> a + 1:16:void onReceive(android.content.Context,android.content.Intent):70:85 -> onReceive + 1:27:void performAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject,com.batch.android.UserActionSource):38:64 -> performAction +com.batch.android.actions.UserDataBuiltinActionRunnable -> com.batch.android.b.i: +# {"id":"sourceFile","fileName":"UserDataBuiltinActionRunnable.java"} + java.lang.String TAG -> a + java.lang.String IDENTIFIER -> b + 1:1:void ():16:16 -> + 1:47:void performAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject,com.batch.android.UserActionSource):29:75 -> performAction +com.batch.android.actions.UserEventBuiltinActionRunnable -> com.batch.android.b.j: +# {"id":"sourceFile","fileName":"UserEventBuiltinActionRunnable.java"} + java.lang.String TAG -> a + java.lang.String IDENTIFIER -> b + 1:1:void ():21:21 -> + 1:9:java.util.Date parseDate(java.lang.String):28:36 -> a + 1:59:void performAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject,com.batch.android.UserActionSource):50:108 -> performAction +com.batch.android.adsidentifier.GCMAdsIdentifierProvider -> com.batch.android.c.a: +# {"id":"sourceFile","fileName":"GCMAdsIdentifierProvider.java"} + android.content.Context context -> a + 1:2:void (android.content.Context):15:16 -> + 1:1:android.content.Context access$000(com.batch.android.adsidentifier.GCMAdsIdentifierProvider):11:11 -> a + 2:2:boolean isGMSAdvertisingIdClientPresent():36:36 -> a + 1:8:void checkAvailability():21:28 -> checkAvailability + 9:9:void checkAvailability():22:22 -> checkAvailability + 1:3:void getAdsIdentifier(com.batch.android.AdsIdentifierProvider$AdsIdentifierListener):52:54 -> getAdsIdentifier + 4:4:void getAdsIdentifier(com.batch.android.AdsIdentifierProvider$AdsIdentifierListener):46:46 -> getAdsIdentifier +com.batch.android.adsidentifier.GCMAdsIdentifierProvider$1 -> com.batch.android.c.a$a: +# {"id":"sourceFile","fileName":"GCMAdsIdentifierProvider.java"} + com.batch.android.AdsIdentifierProvider$AdsIdentifierListener val$listener -> a + com.batch.android.adsidentifier.GCMAdsIdentifierProvider this$0 -> b + 1:1:void (com.batch.android.adsidentifier.GCMAdsIdentifierProvider,com.batch.android.AdsIdentifierProvider$AdsIdentifierListener):55:55 -> + 1:1:java.lang.String getTaskIdentifier():93:93 -> a + 1:25:void run():62:86 -> run +com.batch.android.annotation.PublicSDK -> com.batch.android.d.a: +# {"id":"sourceFile","fileName":"PublicSDK.java"} +com.batch.android.compat.LocalBroadcastManager -> com.batch.android.e.a: +# {"id":"sourceFile","fileName":"LocalBroadcastManager.java"} + android.content.Context mAppContext -> a + java.lang.String TAG -> f + android.os.Handler mHandler -> e + int MSG_EXEC_PENDING_BROADCASTS -> h + java.util.HashMap mReceivers -> b + boolean DEBUG -> g + java.util.ArrayList mPendingBroadcasts -> d + java.util.HashMap mActions -> c + 1:1:void (android.content.Context):94:94 -> + 2:14:void (android.content.Context):85:97 -> + 1:1:void access$000(com.batch.android.compat.LocalBroadcastManager):49:49 -> a + 2:19:void registerReceiver(android.content.BroadcastReceiver,android.content.IntentFilter):119:136 -> a + 20:43:void unregisterReceiver(android.content.BroadcastReceiver):148:171 -> a + 44:103:boolean sendBroadcast(android.content.Intent):184:243 -> a + 104:104:boolean sendBroadcast(android.content.Intent):240:240 -> a + 105:105:boolean sendBroadcast(android.content.Intent):237:237 -> a + 106:137:boolean sendBroadcast(android.content.Intent):231:262 -> a + 138:150:void executePendingBroadcasts():280:292 -> a + 151:151:void executePendingBroadcasts():288:288 -> a + 1:2:void sendBroadcastSync(android.content.Intent):272:273 -> b +com.batch.android.compat.LocalBroadcastManager$1 -> com.batch.android.e.a$a: +# {"id":"sourceFile","fileName":"LocalBroadcastManager.java"} + com.batch.android.compat.LocalBroadcastManager this$0 -> a + 1:1:void (com.batch.android.compat.LocalBroadcastManager,android.os.Looper):97:97 -> + 1:6:void handleMessage(android.os.Message):100:105 -> handleMessage + 7:7:void handleMessage(android.os.Message):102:102 -> handleMessage +com.batch.android.compat.LocalBroadcastManager$BroadcastRecord -> com.batch.android.e.a$b: +# {"id":"sourceFile","fileName":"LocalBroadcastManager.java"} + android.content.Intent intent -> a + java.util.ArrayList receivers -> b + 1:3:void (android.content.Intent,java.util.ArrayList):74:76 -> +com.batch.android.compat.LocalBroadcastManager$ReceiverRecord -> com.batch.android.e.a$c: +# {"id":"sourceFile","fileName":"LocalBroadcastManager.java"} + android.content.IntentFilter filter -> a + android.content.BroadcastReceiver receiver -> b + boolean broadcasting -> c + 1:3:void (android.content.IntentFilter,android.content.BroadcastReceiver):57:59 -> + 1:1:java.lang.String toString():64:64 -> toString +com.batch.android.compat.WakefulBroadcastReceiver -> com.batch.android.e.b: +# {"id":"sourceFile","fileName":"WakefulBroadcastReceiver.java"} + android.util.SparseArray mActiveWakeLocks -> b + java.lang.String EXTRA_WAKE_LOCK_ID -> a + int mNextId -> c + 1:2:void ():63:64 -> + 1:1:void ():59:59 -> + 1:20:boolean completeWakefulIntent(android.content.Intent):119:138 -> completeWakefulIntent + 1:17:android.content.ComponentName startWakefulService(android.content.Context,android.content.Intent):81:97 -> startWakefulService + 18:26:android.content.ComponentName startWakefulService(android.content.Context,android.content.Intent):95:103 -> startWakefulService +com.batch.android.core.Base32Encoding -> com.batch.android.f.a: +# {"id":"sourceFile","fileName":"Base32Encoding.java"} + java.nio.charset.Charset UTF_8_CHARSET -> c + byte[] decodeMap -> b + byte[] encode -> a + int INPUT_BLOCK_SIZE -> d + int ENCODED_BLOCK_SIZE -> e + 1:1:void ():17:17 -> + 1:21:void (java.lang.String):30:50 -> + 22:26:void (java.lang.String):33:37 -> + 27:33:void (java.lang.String):33:39 -> + 1:25:void encode(java.io.ByteArrayOutputStream,byte[]):69:93 -> a + 26:26:void encode(java.io.ByteArrayOutputStream,byte[]):72:72 -> a + 27:59:java.io.ByteArrayOutputStream decode(java.lang.String):113:145 -> a + 60:61:java.io.ByteArrayOutputStream decode(java.lang.String):119:120 -> a +com.batch.android.core.Base32Encoding$DecodeException -> com.batch.android.f.a$a: +# {"id":"sourceFile","fileName":"Base32Encoding.java"} + 1:1:void (java.lang.String):101:101 -> +com.batch.android.core.Base32Encoding$EncodeException -> com.batch.android.f.a$b: +# {"id":"sourceFile","fileName":"Base32Encoding.java"} + 1:1:void (java.lang.String):57:57 -> +com.batch.android.core.ByteArrayHelper -> com.batch.android.f.b: +# {"id":"sourceFile","fileName":"ByteArrayHelper.java"} + char[] hexArray -> b + java.lang.String UTF_8 -> a + 1:1:void ():26:26 -> + 1:1:void ():16:16 -> + 1:6:byte[] concat(byte[],byte[]):38:43 -> a + 7:9:byte[] getUTF8Bytes(java.lang.String):72:74 -> a + 10:13:java.lang.String SHA1Base64Encoded(byte[]):130:133 -> a + 14:14:java.lang.String SHA1Base64Encoded(byte[]):126:126 -> a + 15:23:byte[] fromInputStream(java.io.InputStream):138:146 -> a + 24:24:byte[] fromInputStream(java.io.InputStream):138:138 -> a + 1:10:java.lang.String bytesToHex(byte[]):87:96 -> b + 11:16:byte[] hexToBytes(java.lang.String):106:111 -> b + 1:3:java.lang.String getUTF8String(byte[]):58:60 -> c +com.batch.android.core.Cryptor -> com.batch.android.f.c: +# {"id":"sourceFile","fileName":"Cryptor.java"} + java.lang.String encrypt(java.lang.String) -> a + byte[] encrypt(byte[]) -> a + java.lang.String decrypt(java.lang.String) -> b + byte[] decrypt(byte[]) -> b + byte[] decryptToByte(java.lang.String) -> c +com.batch.android.core.CryptorFactory -> com.batch.android.f.d: +# {"id":"sourceFile","fileName":"CryptorFactory.java"} + java.lang.String DEFAULT_PRIVATE_KEY_PART -> a + 1:1:void ():10:10 -> + 1:1:com.batch.android.core.Cryptor getCryptorForType(java.lang.String):26:26 -> a + 2:2:com.batch.android.core.Cryptor getCryptorForType(java.lang.String,java.lang.String):37:37 -> a + 3:3:com.batch.android.core.Cryptor getCryptorForTypeValue(int):47:47 -> a + 4:4:com.batch.android.core.Cryptor getCryptorForTypeValue(int,java.lang.String):58:58 -> a + 5:5:com.batch.android.core.Cryptor getCryptorForType(com.batch.android.core.CryptorFactory$CryptorType):68:68 -> a + 6:17:com.batch.android.core.Cryptor getCryptorForType(com.batch.android.core.CryptorFactory$CryptorType,java.lang.String):84:95 -> a + 18:18:com.batch.android.core.Cryptor getCryptorForType(com.batch.android.core.CryptorFactory$CryptorType,java.lang.String):93:93 -> a + 19:19:com.batch.android.core.Cryptor getCryptorForType(com.batch.android.core.CryptorFactory$CryptorType,java.lang.String):91:91 -> a + 20:20:com.batch.android.core.Cryptor getCryptorForType(com.batch.android.core.CryptorFactory$CryptorType,java.lang.String):89:89 -> a + 21:24:byte[] buildDefaultKey():107:110 -> a +com.batch.android.core.CryptorFactory$1 -> com.batch.android.f.d$a: +# {"id":"sourceFile","fileName":"CryptorFactory.java"} + int[] $SwitchMap$com$batch$android$core$CryptorFactory$CryptorType -> a + 1:1:void ():87:87 -> +com.batch.android.core.CryptorFactory$CryptorType -> com.batch.android.f.d$b: +# {"id":"sourceFile","fileName":"CryptorFactory.java"} + com.batch.android.core.CryptorFactory$CryptorType EAS -> b + com.batch.android.core.CryptorFactory$CryptorType EAS_BASE64_GZIP -> e + com.batch.android.core.CryptorFactory$CryptorType EAS_BASE64 -> d + com.batch.android.core.CryptorFactory$CryptorType EAS_HEX -> c + int value -> a + com.batch.android.core.CryptorFactory$CryptorType[] $VALUES -> f + 1:13:void ():123:135 -> + 14:14:void ():119:119 -> + 1:2:void (java.lang.String,int,int):141:142 -> + 1:1:com.batch.android.core.CryptorFactory$CryptorType[] $values():119:119 -> a + 2:2:com.batch.android.core.CryptorFactory$CryptorType fromString(java.lang.String):161:161 -> a + 3:4:com.batch.android.core.CryptorFactory$CryptorType fromValue(int):174:175 -> a + 1:1:int getValue():148:148 -> b + 1:1:com.batch.android.core.CryptorFactory$CryptorType valueOf(java.lang.String):119:119 -> valueOf + 1:1:com.batch.android.core.CryptorFactory$CryptorType[] values():119:119 -> values +com.batch.android.core.DateProvider -> com.batch.android.f.e: +# {"id":"sourceFile","fileName":"DateProvider.java"} + com.batch.android.date.BatchDate getCurrentDate() -> a +com.batch.android.core.DeeplinkHelper -> com.batch.android.f.f: +# {"id":"sourceFile","fileName":"DeeplinkHelper.java"} + 1:1:void ():17:17 -> + 1:4:boolean customTabSupportsURI(android.net.Uri):46:49 -> a + 5:19:android.content.Intent getIntent(java.lang.String,boolean,boolean):66:80 -> a + 20:24:android.content.Intent getFallbackIntent(android.content.Context):93:97 -> a + 1:13:android.content.Intent getCustomTabIntent(android.net.Uri):25:37 -> b +com.batch.android.core.DiscoveryServiceHelper -> com.batch.android.f.g: +# {"id":"sourceFile","fileName":"DiscoveryServiceHelper.java"} + java.lang.String TAG -> a + 1:1:void ():13:13 -> + 1:10:java.util.List getComponentNames(android.content.Context,java.lang.Class,java.lang.String,java.lang.String):23:32 -> a + 11:27:android.os.Bundle getMetadata(android.content.Context,java.lang.Class):40:56 -> a +com.batch.android.core.EASBase64Cryptor -> com.batch.android.f.h: +# {"id":"sourceFile","fileName":"EASBase64Cryptor.java"} + java.lang.String TAG -> d + 1:1:void (java.lang.String):17:17 -> + 1:3:byte[] encrypt(byte[]):25:27 -> a + 4:6:java.lang.String encrypt(java.lang.String):35:37 -> a + 1:3:byte[] decrypt(byte[]):45:47 -> b + 4:6:java.lang.String decrypt(java.lang.String):55:57 -> b + 1:3:byte[] decryptToByte(java.lang.String):65:67 -> c +com.batch.android.core.EASBase64GzipCryptor -> com.batch.android.f.i: +# {"id":"sourceFile","fileName":"EASBase64GzipCryptor.java"} + java.lang.String TAG -> d + 1:1:void (java.lang.String):22:22 -> + 1:3:byte[] encrypt(byte[]):58:60 -> a + 4:6:java.lang.String encrypt(java.lang.String):68:70 -> a + 1:3:byte[] decrypt(byte[]):78:80 -> b + 4:6:java.lang.String decrypt(java.lang.String):88:90 -> b + 1:3:byte[] decryptToByte(java.lang.String):98:100 -> c + 1:8:byte[] gzip(byte[]):29:36 -> e + 9:9:byte[] gzip(byte[]):28:28 -> e + 1:12:byte[] ungzip(byte[]):41:52 -> f + 13:13:byte[] ungzip(byte[]):40:40 -> f +com.batch.android.core.EASCryptor -> com.batch.android.f.j: +# {"id":"sourceFile","fileName":"EASCryptor.java"} + java.lang.String cipherAlgorithm -> a + javax.crypto.spec.SecretKeySpec privateKey -> b + java.lang.String TAG -> c + 1:25:void (java.lang.String):31:55 -> + 26:26:void (java.lang.String):37:37 -> + 27:27:void (java.lang.String):33:33 -> + 1:3:byte[] encrypt(byte[]):63:65 -> a + 4:4:java.lang.String encrypt(java.lang.String):72:72 -> a + 1:3:byte[] decrypt(byte[]):78:80 -> b + 4:4:java.lang.String decrypt(java.lang.String):87:87 -> b + 1:1:byte[] decryptToByte(java.lang.String):92:92 -> c + 2:5:byte[] decryptAES(byte[]):117:120 -> c + 1:4:byte[] encryptAES(byte[]):104:107 -> d +com.batch.android.core.EASHexCryptor -> com.batch.android.f.k: +# {"id":"sourceFile","fileName":"EASHexCryptor.java"} + java.lang.String TAG -> d + 1:1:void (java.lang.String):15:15 -> + 1:3:byte[] encrypt(byte[]):23:25 -> a + 4:6:java.lang.String encrypt(java.lang.String):33:35 -> a + 1:3:byte[] decrypt(byte[]):43:45 -> b + 4:6:java.lang.String decrypt(java.lang.String):53:55 -> b + 1:3:byte[] decryptToByte(java.lang.String):63:65 -> c +com.batch.android.core.ExcludedActivityHelper -> com.batch.android.f.l: +# {"id":"sourceFile","fileName":"ExcludedActivityHelper.java"} + java.util.Map checkedActivities -> d + android.content.Intent intent -> a + java.lang.String EXCLUDED_ACTIVITY_META_DATA -> c + java.lang.String TAG -> b + 1:1:void ():34:34 -> + 1:1:void ():16:16 -> + 1:19:boolean activityIsExcludedFromManifest(android.app.Activity):59:77 -> a + 20:20:boolean hasIntent():86:86 -> a + 1:5:void saveIntentIfNeeded(android.app.Activity):42:46 -> b + 6:7:android.content.Intent popIntent():95:96 -> b +com.batch.android.core.FixedSizeArrayList -> com.batch.android.f.m: +# {"id":"sourceFile","fileName":"FixedSizeArrayList.java"} + int maxSize -> a + 1:2:void (int):25:26 -> + 1:5:boolean add(java.lang.Object):30:34 -> add +com.batch.android.core.ForwardReadableInputStream -> com.batch.android.f.n: +# {"id":"sourceFile","fileName":"ForwardReadableInputStream.java"} + int maxReadPosition -> d + int[] firstBytes -> a + java.io.InputStream wrappedInputStream -> b + int readPosition -> c + 1:1:void (java.io.InputStream,int):26:26 -> + 2:9:void (java.io.InputStream,int):23:30 -> + 1:1:int[] getFirstBytes():57:57 -> a + 1:5:void readFirstBytes(int):35:39 -> c + 6:6:void readFirstBytes(int):37:37 -> c + 1:6:int read():45:50 -> read +com.batch.android.core.GenericHelper -> com.batch.android.f.o: +# {"id":"sourceFile","fileName":"GenericHelper.java"} + java.util.regex.Pattern EMAIL_KEY_PATTERN -> a + 1:1:void ():24:24 -> + 1:1:void ():19:19 -> + 1:1:boolean checkPermission(java.lang.String,android.content.Context):34:34 -> a + 2:14:java.lang.String readMD5(byte[]):67:79 -> a + 15:19:java.lang.Float getScreenDensity(android.content.Context):109:113 -> a + 20:22:int DPtoPixel(int,android.content.Context):157:159 -> a + 23:23:int DPtoPixel(int,android.content.Context):150:150 -> a + 24:24:boolean isValidEmail(java.lang.String):163:163 -> a + 1:4:boolean isTargetLowerThan13(android.content.Context):51:54 -> b + 5:14:java.lang.String readMD5(java.lang.String):89:98 -> b + 15:17:float pixelToDP(int,android.content.Context):135:137 -> b + 18:18:float pixelToDP(int,android.content.Context):128:128 -> b + 1:3:boolean isWakeLockPermissionAvailable(android.content.Context):40:42 -> c +com.batch.android.core.GooglePlayServicesHelper -> com.batch.android.f.p: +# {"id":"sourceFile","fileName":"GooglePlayServicesHelper.java"} + java.lang.Integer libVersionCached -> f + boolean versionChecked -> e + int FCM_ID_VERSION -> d + int PUSH_ID_VERSION -> b + int INSTANCE_ID_VERSION -> c + int ADVERTISING_ID_VERSION -> a + 1:1:void ():13:13 -> + 1:18:java.lang.String getGooglePlayServicesAvailabilityString(java.lang.Integer):56:73 -> a + 19:25:java.lang.String getGooglePlayServicesAvailabilityString(java.lang.Integer):65:71 -> a + 26:26:java.lang.String getGooglePlayServicesAvailabilityString(java.lang.Integer):63:63 -> a + 27:35:java.lang.String getGooglePlayServicesAvailabilityString(java.lang.Integer):61:69 -> a + 36:45:java.lang.Integer getGooglePlayServicesAvailabilityInteger(android.content.Context):81:90 -> a + 46:69:java.lang.String getInstancePushToken(android.content.Context,java.lang.String):236:259 -> a + 70:77:java.lang.String getInstancePushToken(android.content.Context,java.lang.String):256:263 -> a + 78:80:boolean isInvalidSenderException(java.lang.Exception):277:279 -> a + 1:21:java.lang.Integer getGooglePlayServicesLibVersion(android.content.Context):106:126 -> b + 22:26:java.lang.Integer getGooglePlayServicesLibVersion(android.content.Context):123:127 -> b + 27:27:java.lang.Integer getGooglePlayServicesLibVersion(android.content.Context):126:126 -> b + 28:53:java.lang.String getPushToken(android.content.Context,java.lang.String):179:204 -> b + 54:61:java.lang.String getPushToken(android.content.Context,java.lang.String):202:209 -> b + 1:11:boolean isAdvertisingIDAvailable(android.content.Context):139:149 -> c + 1:6:java.lang.Integer isFCMAvailable(android.content.Context):292:297 -> d + 1:6:java.lang.Integer isInstanceIdPushAvailable(android.content.Context):223:228 -> e + 1:8:java.lang.Integer isPushAvailable(android.content.Context):161:168 -> f +com.batch.android.core.InternalPushData -> com.batch.android.f.q: +# {"id":"sourceFile","fileName":"InternalPushData.java"} + java.lang.String IS_SILENT_KEY -> f + java.lang.String LANDING_KEY -> h + java.lang.String CUSTOM_BIG_IMAGE_KEY -> j + java.lang.String PRIORITY_KEY -> l + java.lang.String IS_GROUP_SUMMARY_KEY -> n + java.lang.String TYPE_KEY -> p + java.lang.String VARIANT_KEY -> r + java.lang.String VISIBILITY_KEY -> t + java.lang.String FORMAT_ARGS_KEY -> v + java.lang.String OLD_BIG_PICTURE_ICON_BEHAVIOUR -> x + java.lang.String jsonPayload -> a + java.lang.String SCHEME_KEY -> c + java.lang.String INSTALL_ID_KEY -> e + java.lang.String IS_LOCAL_CAMPAIGNS_REFRESH_KEY -> g + java.lang.String CUSTOM_BIG_ICON_KEY -> i + java.lang.String ACTION_KEY -> k + java.lang.String GROUP_NAME_KEY -> m + java.lang.String OPEN_DATA_KEY -> o + java.lang.String EXPERIMENT_KEY -> q + java.lang.String CHANNEL_KEY -> s + java.lang.String FORMAT_KEY -> u + java.lang.String RECEIPT_KEY -> w + com.batch.android.json.JSONObject payload -> b + java.lang.String BATCH_BUNDLE_KEY -> y + java.lang.String ID_KEY -> d + 1:10:void (java.lang.String):143:152 -> + 11:11:void (java.lang.String):145:145 -> + 12:18:void (com.batch.android.json.JSONObject):156:162 -> + 19:19:void (com.batch.android.json.JSONObject):158:158 -> + 1:1:boolean hasScheme():224:224 -> A + 1:1:boolean isGroupSummary():487:487 -> B + 1:1:boolean isLocalCampainsRefresh():217:217 -> C + 1:2:boolean isSchemeEmpty():228:229 -> D + 1:1:boolean isSilent():209:209 -> E + 1:1:boolean shouldUseLegacyBigPictureIconBehaviour():584:584 -> F + 1:1:com.batch.android.core.InternalPushData getPushDataForReceiverIntent(android.content.Intent):171:171 -> a + 2:2:com.batch.android.core.InternalPushData getPushDataForReceiverIntent(android.content.Intent):168:168 -> a + 3:6:com.batch.android.core.InternalPushData getPushDataForReceiverBundle(android.os.Bundle):175:178 -> a + 7:11:com.batch.android.core.InternalPushData getPushDataForFirebaseMessage(com.google.firebase.messaging.RemoteMessage):190:194 -> a + 12:50:java.util.List getActions():341:379 -> a + 51:51:java.lang.String nullSafeGetString(com.batch.android.json.JSONObject,java.lang.String):593:593 -> a + 52:52:com.batch.android.json.JSONArray nullSafeGetJSONArray(java.lang.String):609:609 -> a + 1:1:java.lang.String getChannel():452:452 -> b + 2:2:com.batch.android.json.JSONObject nullSafeGetJSONObject(java.lang.String):601:601 -> b + 1:15:java.util.List getCustomBigIconAvailableDensity():273:287 -> c + 16:16:java.lang.String nullSafeGetString(java.lang.String):588:588 -> c + 1:6:java.lang.String getCustomBigIconURL():264:269 -> d + 1:15:java.util.List getCustomBigImageAvailableDensity():317:331 -> e + 1:6:java.lang.String getCustomBigImageURL():308:313 -> f + 1:8:java.util.Map getExtraParameters():529:536 -> g + 1:2:java.lang.String getGroup():474:475 -> h + 1:1:java.lang.String getInstallId():241:241 -> i + 1:1:java.lang.String getJsonPayload():202:202 -> j + 1:1:com.batch.android.json.JSONObject getLandingMessage():249:249 -> k + 1:1:com.batch.android.core.InternalPushData$Format getNotificationFormat():515:515 -> l + 1:1:com.batch.android.json.JSONObject getNotificationFormatArguments():523:523 -> m + 1:4:java.util.Map getOpenData():549:552 -> n + 1:17:com.batch.android.core.InternalPushData$Priority getPriority():422:438 -> o + 18:18:com.batch.android.core.InternalPushData$Priority getPriority():436:436 -> o + 19:19:com.batch.android.core.InternalPushData$Priority getPriority():434:434 -> o + 20:33:com.batch.android.core.InternalPushData$Priority getPriority():432:445 -> o + 1:1:java.lang.String getPushId():237:237 -> p + 1:7:java.util.Map getReceiptEventData():565:571 -> q + 1:6:long getReceiptMaxDelay():413:418 -> r + 1:6:long getReceiptMinDelay():404:409 -> s + 1:13:com.batch.android.core.InternalPushData$ReceiptMode getReceiptMode():387:399 -> t + 14:14:com.batch.android.core.InternalPushData$ReceiptMode getReceiptMode():396:396 -> t + 15:15:com.batch.android.core.InternalPushData$ReceiptMode getReceiptMode():394:394 -> t + 1:1:java.lang.String getScheme():233:233 -> u + 1:10:com.batch.android.BatchNotificationSource getSource():456:465 -> v + 1:1:int getVisibility():499:499 -> w + 1:8:boolean hasCustomBigIcon():253:260 -> x + 1:8:boolean hasCustomBigImage():297:304 -> y + 1:1:boolean hasLandingMessage():245:245 -> z +com.batch.android.core.InternalPushData$1 -> com.batch.android.f.q$a: +# {"id":"sourceFile","fileName":"InternalPushData.java"} + int[] $SwitchMap$com$batch$android$core$InternalPushData$Priority -> a + 1:1:void ():632:632 -> +com.batch.android.core.InternalPushData$Format -> com.batch.android.f.q$b: +# {"id":"sourceFile","fileName":"InternalPushData.java"} + com.batch.android.core.InternalPushData$Format[] $VALUES -> c + com.batch.android.core.InternalPushData$Format APEN -> b + com.batch.android.core.InternalPushData$Format DEFAULT -> a + 1:3:void ():667:669 -> + 4:4:void ():666:666 -> + 1:1:void (java.lang.String,int):666:666 -> + 1:1:com.batch.android.core.InternalPushData$Format[] $values():666:666 -> a + 2:5:com.batch.android.core.InternalPushData$Format fromString(java.lang.String):672:675 -> a + 1:1:com.batch.android.core.InternalPushData$Format valueOf(java.lang.String):666:666 -> valueOf + 1:1:com.batch.android.core.InternalPushData$Format[] values():666:666 -> values +com.batch.android.core.InternalPushData$Priority -> com.batch.android.f.q$c: +# {"id":"sourceFile","fileName":"InternalPushData.java"} + com.batch.android.core.InternalPushData$Priority[] $VALUES -> g + com.batch.android.core.InternalPushData$Priority LOW -> d + com.batch.android.core.InternalPushData$Priority MIN -> c + com.batch.android.core.InternalPushData$Priority DEFAULT -> b + com.batch.android.core.InternalPushData$Priority UNDEFINED -> a + com.batch.android.core.InternalPushData$Priority MAX -> f + com.batch.android.core.InternalPushData$Priority HIGH -> e + 1:6:void ():619:624 -> + 7:7:void ():618:618 -> + 1:1:void (java.lang.String,int):618:618 -> + 1:1:com.batch.android.core.InternalPushData$Priority[] $values():618:618 -> a + 1:5:int toAndroidPriority():628:632 -> b + 1:1:int toSupportPriority():649:649 -> c + 1:1:com.batch.android.core.InternalPushData$Priority valueOf(java.lang.String):618:618 -> valueOf + 1:1:com.batch.android.core.InternalPushData$Priority[] values():618:618 -> values +com.batch.android.core.InternalPushData$ReceiptMode -> com.batch.android.f.q$d: +# {"id":"sourceFile","fileName":"InternalPushData.java"} + com.batch.android.core.InternalPushData$ReceiptMode DEFAULT -> a + com.batch.android.core.InternalPushData$ReceiptMode[] $VALUES -> d + com.batch.android.core.InternalPushData$ReceiptMode FORCE -> c + com.batch.android.core.InternalPushData$ReceiptMode DISPLAY -> b + 1:3:void ():680:682 -> + 4:4:void ():679:679 -> + 1:1:void (java.lang.String,int):679:679 -> + 1:1:com.batch.android.core.InternalPushData$ReceiptMode[] $values():679:679 -> a + 1:1:com.batch.android.core.InternalPushData$ReceiptMode valueOf(java.lang.String):679:679 -> valueOf + 1:1:com.batch.android.core.InternalPushData$ReceiptMode[] values():679:679 -> values +com.batch.android.core.KVUserPreferencesStorage -> com.batch.android.f.r: +# {"id":"sourceFile","fileName":"KVUserPreferencesStorage.java"} + android.content.SharedPreferences preferences -> a + int STORAGE_VERSION -> f + java.lang.String TAG -> c + boolean useLegacyStorage -> b + java.lang.String SHARED_PREFERENCES_FILENAME -> e + java.lang.String LEGACY_SHARED_PREFERENCES_FILENAME -> d + 1:9:void (android.content.Context):49:57 -> + 10:10:void (android.content.Context):51:51 -> + 1:4:java.lang.String get(java.lang.String,java.lang.String):80:83 -> a + 5:5:boolean contains(java.lang.String):91:91 -> a + 6:25:boolean migrate(android.content.Context):155:174 -> a + 1:1:java.lang.String get(java.lang.String):75:75 -> b + 2:7:java.lang.String getOnLegacyStorage(java.lang.String,java.lang.String):100:105 -> b + 8:26:void migrateIfNeeded(android.content.Context):125:143 -> b + 1:8:boolean persist(java.lang.String,java.lang.String):61:68 -> c + 9:9:void remove(java.lang.String):95:95 -> c + 1:6:boolean persistOnLegacyStorage(java.lang.String,java.lang.String):109:114 -> d +com.batch.android.core.Logger -> com.batch.android.f.s: +# {"id":"sourceFile","fileName":"Logger.java"} + com.batch.android.LoggerDelegate loggerDelegate -> c + java.lang.String PUBLIC_TAG -> a + java.lang.String INTERNAL_TAG -> b + boolean dev -> d + 1:1:void ():35:35 -> + 1:1:void ():14:14 -> + 1:1:boolean shouldEnableDevLogs():41:41 -> a + 2:2:boolean shouldLogForLevel(com.batch.android.LoggerLevel):47:47 -> a + 3:11:void error(java.lang.String,java.lang.String,java.lang.Throwable):244:252 -> a + 12:12:void error(java.lang.String,java.lang.Throwable):264:264 -> a + 13:21:void error(java.lang.String,java.lang.String):274:282 -> a + 22:22:void error(java.lang.String):293:293 -> a + 1:9:void info(java.lang.String,java.lang.String,java.lang.Throwable):120:128 -> b + 10:10:void info(java.lang.String,java.lang.Throwable):140:140 -> b + 11:19:void info(java.lang.String,java.lang.String):150:158 -> b + 20:20:void info(java.lang.String):169:169 -> b + 1:9:void internal(java.lang.String,java.lang.String,java.lang.Throwable):306:314 -> c + 10:10:void internal(java.lang.String,java.lang.Throwable):326:326 -> c + 11:19:void internal(java.lang.String,java.lang.String):336:344 -> c + 20:20:void internal(java.lang.String):355:355 -> c + 1:9:void verbose(java.lang.String,java.lang.String,java.lang.Throwable):58:66 -> d + 10:10:void verbose(java.lang.String,java.lang.Throwable):78:78 -> d + 11:19:void verbose(java.lang.String,java.lang.String):88:96 -> d + 20:20:void verbose(java.lang.String):107:107 -> d + 1:9:void warning(java.lang.String,java.lang.String,java.lang.Throwable):182:190 -> e + 10:10:void warning(java.lang.String,java.lang.Throwable):202:202 -> e + 11:19:void warning(java.lang.String,java.lang.String):212:220 -> e + 20:20:void warning(java.lang.String):231:231 -> e +com.batch.android.core.MessagePackWebservice -> com.batch.android.f.t: +# {"id":"sourceFile","fileName":"MessagePackWebservice.java"} + com.batch.android.post.MessagePackPostDataProvider dataProvider -> l + java.lang.String MSGPACK_SCHEMA_VERSION -> m + 1:5:void (android.content.Context,com.batch.android.post.MessagePackPostDataProvider,java.lang.String,java.lang.String[]):21:25 -> + 6:6:void (android.content.Context,com.batch.android.post.MessagePackPostDataProvider,java.lang.String,java.lang.String[]):23:23 -> + 1:1:java.lang.String getSpecificConnectTimeoutKey():82:82 -> A + 1:1:java.lang.String getSpecificReadTimeoutKey():87:87 -> B + 1:1:java.lang.String getSpecificRetryCountKey():92:92 -> C + 1:1:java.lang.String getURLSorterPatternParameterKey():67:67 -> F + 1:1:com.batch.android.post.MessagePackPostDataProvider getPostDataProvider():52:52 -> G + 1:3:java.lang.String[] addSchemaVersion(java.lang.String[]):36:38 -> b + 1:1:java.lang.String getCryptorModeParameterKey():77:77 -> o + 1:1:java.lang.String getCryptorTypeParameterKey():72:72 -> p + 1:3:java.util.Map getHeaders():44:46 -> r + 1:1:java.lang.String getPostCryptorTypeParameterKey():57:57 -> v + 1:1:com.batch.android.post.PostDataProvider getPostDataProvider():9:9 -> w + 1:1:java.lang.String getReadCryptorTypeParameterKey():62:62 -> y +com.batch.android.core.NamedThreadFactory -> com.batch.android.f.u: +# {"id":"sourceFile","fileName":"NamedThreadFactory.java"} + java.util.concurrent.ThreadFactory defaultFactory -> b + java.lang.String suffix -> a + 1:1:void ():13:13 -> + 1:1:void ():17:17 -> + 2:2:void ():15:15 -> + 3:4:void (java.lang.String):19:20 -> + 1:5:java.lang.Thread newThread(java.lang.Runnable):25:29 -> newThread +com.batch.android.core.NotificationAuthorizationStatus -> com.batch.android.f.v: +# {"id":"sourceFile","fileName":"NotificationAuthorizationStatus.java"} + java.lang.String TAG -> a + java.lang.Boolean lastNotificationAuthorizationStatus -> b + 1:1:void ():30:30 -> + 1:8:void lambda$checkForNotificationAuthorizationChange$0(android.content.Context,com.batch.android.runtime.RuntimeManager):86:93 -> a + 9:17:boolean shouldTrackNotificationStatusChangeEvent(android.content.Context,boolean):113:121 -> a + 18:28:boolean canAppShowNotifications(android.content.Context,com.batch.android.BatchNotificationChannelsManager):133:143 -> a + 29:46:boolean canAppShowNotificationsForChannel(android.content.Context,java.lang.String):149:166 -> a + 47:50:boolean areAppNotificationsEnabled(android.content.Context,android.app.NotificationManager):176:179 -> a + 51:64:boolean areBatchNotificationsEnabled(android.content.Context):188:201 -> a + 65:68:boolean isDefaultChannelEnabled(android.app.NotificationManager,com.batch.android.BatchNotificationChannelsManager):212:215 -> a + 69:69:boolean isDefaultChannelEnabled(android.app.NotificationManager,com.batch.android.BatchNotificationChannelsManager):213:213 -> a + 70:91:boolean canChannelShowNotifications(android.app.NotificationManager,java.lang.String,boolean):231:252 -> a + 1:1:void checkForNotificationAuthorizationChange(android.content.Context):47:47 -> b + 2:19:void checkForNotificationAuthorizationChange(android.content.Context):45:62 -> b + 20:40:void checkForNotificationAuthorizationChange(android.content.Context):60:80 -> b + 41:59:void checkForNotificationAuthorizationChange(android.content.Context):79:97 -> b +com.batch.android.core.NotificationPermissionHelper -> com.batch.android.f.w: +# {"id":"sourceFile","fileName":"NotificationPermissionHelper.java"} + java.lang.String TAG -> a + java.lang.String PERMISSION_NOTIFICATION -> c + java.lang.String BASE_TARGET_LOG_MESSAGE -> b + 1:1:void ():17:17 -> + 1:5:boolean isNotificationPermissionGranted(android.content.Context):26:30 -> a + 6:45:void requestPermission(android.content.Context,boolean,android.content.BroadcastReceiver):45:84 -> a + 1:2:boolean isPermissionAlreadyAskedFromOlderSDK(android.content.Context):89:90 -> b + 1:1:void requestPermissionFromOlderSDK(android.content.Context):102:102 -> c + 2:2:void requestPermissionFromOlderSDK(android.content.Context):101:101 -> c + 1:7:void onReceive(android.content.Context,android.content.Intent):114:120 -> onReceive +com.batch.android.core.ObjectUserPreferencesStorage -> com.batch.android.f.x: +# {"id":"sourceFile","fileName":"ObjectUserPreferencesStorage.java"} + com.batch.android.core.Cryptor cryptor -> b + android.content.SharedPreferences preferences -> a + java.lang.String TAG -> c + java.lang.String SHARED_PREFERENCES_FILENAME -> d + 1:8:void (android.content.Context):47:54 -> + 9:9:void (android.content.Context):49:49 -> + 1:3:boolean persist(java.lang.String,java.io.Serializable):61:63 -> a + 4:4:boolean contains(java.lang.String):77:77 -> a + 5:22:java.lang.String serialize(java.io.Serializable):102:119 -> a + 23:36:java.lang.String serialize(java.io.Serializable):109:122 -> a + 37:37:java.lang.String serialize(java.io.Serializable):96:96 -> a + 1:19:java.lang.Object deserialize(java.lang.String):142:160 -> b + 20:33:java.lang.Object deserialize(java.lang.String):150:163 -> b + 1:3:java.lang.Object get(java.lang.String):70:72 -> c + 1:1:void remove(java.lang.String):82:82 -> d +com.batch.android.core.PackageUtils -> com.batch.android.f.y: +# {"id":"sourceFile","fileName":"PackageUtils.java"} + 1:1:void ():9:9 -> + 1:1:boolean isPackageInstalled(android.content.pm.PackageManager,java.lang.String):17:17 -> a +com.batch.android.core.ParameterKeys -> com.batch.android.f.z: +# {"id":"sourceFile","fileName":"ParameterKeys.java"} + java.lang.String DEFAULT_READ_TIMEOUT_KEY -> I0 + java.lang.String USER_PROFILE_REGION_KEY -> j1 + java.lang.String IMAGE_WS_READ_TIMEOUT_KEY -> I + java.lang.String TRACKER_WS_PROPERTY_KEY -> j + java.lang.String LOCAL_CAMPAIGNS_WS_INITIAL_DELAY -> E0 + java.lang.String PUSH_NOTIF_LAST_AUTH_STATUS_SENT -> f1 + java.lang.String METRIC_WS_RETRYCOUNT_KEY -> A0 + java.lang.String PUSH_REGISTRATION_PROVIDER_KEY -> b1 + java.lang.String ATTR_SEND_WS_CONNECT_TIMEOUT_KEY -> Q + java.lang.String TRACKER_WS_READ_TIMEOUT_KEY -> r + java.lang.String ATTR_CHECK_WS_RETRYCOUNT_KEY -> Y + java.lang.String MESSAGE_PACK_WS_RETRYCOUNT_KEY -> v0 + java.lang.String PUSH_WS_CONNECT_TIMEOUT_KEY -> z + java.lang.String MESSAGE_PACK_WS_READ_CRYPTORTYPE_KEY -> r0 + java.lang.String START_WS_PROPERTY_KEY -> a + java.lang.String INBOX_WS_RETRYCOUNT_KEY -> n0 + java.lang.String ATTR_LOCAL_CAMPAIGNS_WS_READ_TIMEOUT_KEY -> j0 + java.lang.String START_WS_READ_TIMEOUT_KEY -> i + java.lang.String IMAGE_WS_CONNECT_TIMEOUT_KEY -> H + java.lang.String ATTR_LOCAL_CAMPAIGNS_WS_POST_CRYPTORTYPE_KEY -> f0 + java.lang.String ATTR_LOCAL_CAMPAIGNS_WS_PROPERTY_KEY -> b0 + java.lang.String TRACKER_WS_CONNECT_TIMEOUT_KEY -> q + java.lang.String ATTR_SEND_WS_RETRYCOUNT_KEY -> P + java.lang.String DISPLAY_RECEIPT_WS_CRYPTORTYPE_KEY -> y0 + java.lang.String EVENT_TRACKER_STATE -> Z0 + java.lang.String PUSH_WS_RETRYCOUNT_KEY -> y + java.lang.String ATTR_CHECK_WS_READ_CRYPTORTYPE_KEY -> X + java.lang.String EVENT_TRACKER_INITIAL_DELAY -> V0 + java.lang.String SCHEME_CODE_PATTERN -> R0 + java.lang.String SERVER_ID_KEY -> N0 + java.lang.String DEFAULT_CONNECT_TIMEOUT_KEY -> H0 + java.lang.String USER_PROFILE_LANGUAGE_KEY -> i1 + java.lang.String ATTR_SEND_WS_URLSORTER_PATTERN_KEY -> K + java.lang.String LOCAL_CAMPAIGNS_JIT_WS_CONNECT_TIMEOUT_KEY -> D0 + java.lang.String PUSH_NOTIF_TYPE -> e1 + java.lang.String TRACKER_WS_CRYPTORTYPE_KEY -> l + java.lang.String PUSH_REGISTRATION_ID_KEY -> a1 + java.lang.String ATTR_CHECK_WS_PROPERTY_KEY -> S + java.lang.String PUSH_WS_URLSORTER_PATTERN_KEY -> t + java.lang.String MESSAGE_PACK_WS_CRYPTORMODE_KEY -> u0 + java.lang.String MESSAGE_PACK_WS_POST_CRYPTORTYPE_KEY -> q0 + java.lang.String START_WS_CRYPTORTYPE_KEY -> c + java.lang.String IMAGE_WS_URLSORTER_PATTERN_KEY -> B + java.lang.String INBOX_WS_POST_CRYPTORTYPE_KEY -> m0 + java.lang.String ATTR_LOCAL_CAMPAIGNS_WS_CONNECT_TIMEOUT_KEY -> i0 + java.lang.String TRACKER_WS_URLSORTER_PATTERN_KEY -> k + java.lang.String ATTR_SEND_WS_PROPERTY_KEY -> J + java.lang.String ATTR_LOCAL_CAMPAIGNS_WS_CRYPTORMODE_KEY -> e0 + java.lang.String ATTR_CHECK_WS_READ_TIMEOUT_KEY -> a0 + java.lang.String PUSH_WS_PROPERTY_KEY -> s + java.lang.String ATTR_SEND_WS_READ_TIMEOUT_KEY -> R + java.lang.String DISPLAY_RECEIPT_WS_RETRYCOUNT_KEY -> z0 + java.lang.String EVENT_TRACKER_EVENTS_LIMIT -> Y0 + java.lang.String ATTR_CHECK_WS_CONNECT_TIMEOUT_KEY -> Z + java.lang.String SERVER_TIMESTAMP -> U0 + java.lang.String TASK_EXECUTOR_THREADTTL -> Q0 + java.lang.String PUSH_WS_READ_TIMEOUT_KEY -> A + java.lang.String START_WS_URLSORTER_PATTERN_KEY -> b + java.lang.String INSTALL_TIMESTAMP_KEY -> M0 + java.lang.String START_WS_READ_CRYPTORTYPE_KEY -> f + java.lang.String DEFAULT_RETRY_NUMBER_KEY -> G0 + java.lang.String USER_DATA_TRANSACTION_ID -> h1 + java.lang.String ATTR_SEND_WS_CRYPTORMODE_KEY -> M + java.lang.String LOCAL_CAMPAIGNS_JIT_WS_READ_TIMEOUT_KEY -> C0 + java.lang.String PUSH_APP_VERSION_KEY -> d1 + java.lang.String TRACKER_WS_POST_CRYPTORTYPE_KEY -> n + java.lang.String ATTR_CHECK_WS_CRYPTORTYPE_KEY -> U + java.lang.String PUSH_WS_CRYPTORMODE_KEY -> v + java.lang.String MESSAGE_PACK_WS_READ_TIMEOUT_KEY -> x0 + java.lang.String MESSAGE_PACK_WS_CRYPTORTYPE_KEY -> t0 + java.lang.String INBOX_WS_READ_TIMEOUT_KEY -> p0 + java.lang.String START_WS_POST_CRYPTORTYPE_KEY -> e + java.lang.String INBOX_WS_READ_CRYPTORTYPE_KEY -> l0 + java.lang.String IMAGE_WS_CRYPTORMODE_KEY -> D + java.lang.String ATTR_LOCAL_CAMPAIGNS_WS_RETRYCOUNT_KEY -> h0 + java.lang.String TRACKER_WS_CRYPTORMODE_KEY -> m + java.lang.String ATTR_LOCAL_CAMPAIGNS_WS_CRYPTORTYPE_KEY -> d0 + java.lang.String ATTR_SEND_WS_CRYPTORTYPE_KEY -> L + java.lang.String PUSH_WS_CRYPTORTYPE_KEY -> u + java.lang.String ATTR_CHECK_WS_URLSORTER_PATTERN_KEY -> T + java.lang.String EVENT_TRACKER_BATCH_QUANTITY -> X0 + java.lang.String USER_DATA_VERSION -> T0 + java.lang.String TASK_EXECUTOR_MAX_POOL -> P0 + java.lang.String IMAGE_WS_CRYPTORTYPE_KEY -> C + java.lang.String INSTALL_ID_KEY -> L0 + java.lang.String SHARED_PREFS_STORAGE_VERSION -> m1 + java.lang.String START_WS_CRYPTORMODE_KEY -> d + java.lang.String IMAGE_WS_RETRYCOUNT_KEY -> G + java.lang.String WEBSERVICE_IDS_PARAMETERS -> J0 + java.lang.String LIB_CURRENTVERSION_KEY -> k1 + java.lang.String START_WS_CONNECT_TIMEOUT_KEY -> h + java.lang.String WS_CIPHERV2_LAST_FAILURE_KEY -> F0 + java.lang.String USER_DATA_CHANGESET -> g1 + java.lang.String ATTR_SEND_WS_READ_CRYPTORTYPE_KEY -> O + java.lang.String LOCAL_CAMPAIGNS_JIT_WS_RETRYCOUNT_KEY -> B0 + java.lang.String PUSH_REGISTRATION_SENDERID_KEY -> c1 + java.lang.String TRACKER_WS_RETRYCOUNT_KEY -> p + java.lang.String ATTR_CHECK_WS_POST_CRYPTORTYPE_KEY -> W + java.lang.String PUSH_WS_READ_CRYPTORTYPE_KEY -> x + java.lang.String MESSAGE_PACK_WS_CONNECT_TIMEOUT_KEY -> w0 + java.lang.String MESSAGE_PACK_WS_URLSORTER_PATTERN_KEY -> s0 + java.lang.String INBOX_WS_CONNECT_TIMEOUT_KEY -> o0 + java.lang.String INBOX_WS_URLSORTER_PATTERN_KEY -> k0 + java.lang.String START_WS_RETRYCOUNT_KEY -> g + java.lang.String IMAGE_WS_READ_CRYPTORTYPE_KEY -> F + java.lang.String ATTR_LOCAL_CAMPAIGNS_WS_READ_CRYPTORTYPE_KEY -> g0 + java.lang.String ATTR_LOCAL_CAMPAIGNS_WS_URLSORTER_PATTERN_KEY -> c0 + java.lang.String TRACKER_WS_READ_CRYPTORTYPE_KEY -> o + java.lang.String ATTR_SEND_WS_POST_CRYPTORTYPE_KEY -> N + java.lang.String PUSH_WS_POST_CRYPTORTYPE_KEY -> w + java.lang.String ATTR_CHECK_WS_CRYPTORMODE_KEY -> V + java.lang.String EVENT_TRACKER_MAX_DELAY -> W0 + java.lang.String CUSTOM_ID -> S0 + java.lang.String TASK_EXECUTOR_MIN_POOL -> O0 + java.lang.String IMAGE_WS_POST_CRYPTORTYPE_KEY -> E + java.lang.String WEBSERVICE_IDS_ADVANCED_PARAMETERS -> K0 + java.lang.String LIB_PREVIOUSVERSION_KEY -> l1 + 1:1:void ():9:9 -> +com.batch.android.core.Parameters -> com.batch.android.f.a0: +# {"id":"sourceFile","fileName":"Parameters.java"} + android.content.Context applicationContext -> a + java.lang.String COMMON_EXTERNAL_CRYPT_BASE_KEY_V2 -> f + int API_LEVEL -> j + java.lang.String LIBRARY_BUNDLE -> l + java.lang.String PLUGIN_VERSION_ENVIRONEMENT_VAR -> n + java.lang.String BASE_WS_URL -> p + java.lang.String TRACKER_WS_URL -> r + java.lang.String ATTR_SEND_WS_URL -> t + java.lang.String LOCAL_CAMPAIGNS_WS_URL -> v + java.util.Map appParameters -> B + java.lang.String INBOX_SYNC_WS_URL -> x + java.lang.String METRIC_WS_URL -> z + boolean ENABLE_WS_INTERCEPTOR -> h + java.lang.String COMMON_INTERNAL_CRYPT_BASE_KEY -> c + java.lang.String COMMON_EXTERNAL_CRYPT_BASE_KEY -> e + java.lang.String SDK_VERSION -> i + int MESSAGING_API_LEVEL -> k + java.lang.String DOMAIN_URL -> m + java.lang.String BRIDGE_VERSION_ENVIRONEMENT_VAR -> o + java.lang.String START_WS_URL -> q + java.lang.String PUSH_WS_URL -> s + java.lang.String ATTR_CHECK_WS_URL -> u + java.lang.String INBOX_FETCH_WS_URL -> w + java.util.Map cacheParameters -> b + java.lang.String DISPLAY_RECEIPT_WS_URL -> y + boolean ENABLE_DEV_LOGS -> g + java.lang.String LOCAL_CAMPAIGNS_JIT_WS_URL -> A + java.lang.String PARAMETERS_KEY_PREFIX -> C + java.lang.String COMMON_EXTERNAL_CRYPT_SIGNATURE_KEY -> d + 1:129:void ():60:188 -> + 1:10:void (android.content.Context):217:226 -> + 11:11:void (android.content.Context):219:219 -> + 1:13:java.lang.String get(java.lang.String):242:254 -> a + 14:14:java.lang.String get(java.lang.String):247:247 -> a + 15:15:java.lang.String get(java.lang.String):239:239 -> a + 16:17:java.lang.String get(java.lang.String,java.lang.String):270:271 -> a + 18:23:void set(java.lang.String,java.lang.String,boolean):294:299 -> a + 24:24:void set(java.lang.String,java.lang.String,boolean):296:296 -> a + 25:25:void set(java.lang.String,java.lang.String,boolean):291:291 -> a + 26:26:void set(java.lang.String,java.lang.String,boolean):287:287 -> a + 1:5:void remove(java.lang.String):313:317 -> b + 6:6:void remove(java.lang.String):315:315 -> b + 7:7:void remove(java.lang.String):310:310 -> b +com.batch.android.core.PatternURLSorter -> com.batch.android.f.b0: +# {"id":"sourceFile","fileName":"PatternURLSorter.java"} + java.util.List pattern -> a + 1:1:void ():27:27 -> + 2:2:void ():20:20 -> + 3:3:void (java.util.List):34:34 -> + 4:20:void (java.util.List):20:36 -> + 21:21:void (java.lang.String):45:45 -> + 22:49:void (java.lang.String):20:47 -> + 1:1:java.util.List getKeysOrdered(java.util.List):60:60 -> a + 2:2:java.util.List getKeysOrdered(java.util.Set):70:70 -> a + 3:3:java.util.List getKeysOrdered(java.util.Map):80:80 -> a + 4:27:java.util.List order(java.util.Collection):92:115 -> a + 28:28:java.util.List order(java.util.Collection):93:93 -> a +com.batch.android.core.Promise -> com.batch.android.f.c0: +# {"id":"sourceFile","fileName":"Promise.java"} + java.lang.Object resolvedValue -> b + java.util.ArrayDeque thenQueue -> d + java.util.ArrayDeque catchQueue -> e + java.lang.Exception rejectException -> c + com.batch.android.core.Promise$Status status -> a + 1:1:void ():21:21 -> + 2:7:void ():14:19 -> + 8:8:void (com.batch.android.core.Promise$ExecutorRunnable):23:23 -> + 9:28:void (com.batch.android.core.Promise$ExecutorRunnable):14:33 -> + 29:29:void (com.batch.android.core.Promise$ExecutorRunnable):28:28 -> + 30:30:void (com.batch.android.core.Promise$DeferredResultExecutorRunnable):36:36 -> + 31:57:void (com.batch.android.core.Promise$DeferredResultExecutorRunnable):14:40 -> + 1:11:void resolve(java.lang.Object):57:67 -> a + 12:22:void reject(java.lang.Exception):72:82 -> a + 23:28:com.batch.android.core.Promise then(com.batch.android.core.Promise$ThenRunnable):87:92 -> a + 29:29:com.batch.android.core.Promise then(com.batch.android.core.Promise$ThenRunnable):89:89 -> a + 30:35:com.batch.android.core.Promise catchException(com.batch.android.core.Promise$CatchRunnable):100:105 -> a + 36:36:com.batch.android.core.Promise catchException(com.batch.android.core.Promise$CatchRunnable):102:102 -> a + 37:37:com.batch.android.core.Promise$Status getStatus():113:113 -> a + 1:2:com.batch.android.core.Promise resolved(java.lang.Object):45:46 -> b + 3:4:com.batch.android.core.Promise rejected(java.lang.Exception):51:52 -> b +com.batch.android.core.Promise$1 -> com.batch.android.f.c0$a: +# {"id":"sourceFile","fileName":"Promise.java"} + int[] $SwitchMap$com$batch$android$core$Promise$Status -> a + 1:1:void ():87:87 -> +com.batch.android.core.Promise$CatchRunnable -> com.batch.android.f.c0$b: +# {"id":"sourceFile","fileName":"Promise.java"} + void run(java.lang.Exception) -> a +com.batch.android.core.Promise$DeferredResultExecutorRunnable -> com.batch.android.f.c0$c: +# {"id":"sourceFile","fileName":"Promise.java"} + void run(com.batch.android.core.Promise) -> a +com.batch.android.core.Promise$ExecutorRunnable -> com.batch.android.f.c0$d: +# {"id":"sourceFile","fileName":"Promise.java"} +com.batch.android.core.Promise$Status -> com.batch.android.f.c0$e: +# {"id":"sourceFile","fileName":"Promise.java"} + com.batch.android.core.Promise$Status REJECTED -> c + com.batch.android.core.Promise$Status[] $VALUES -> d + com.batch.android.core.Promise$Status RESOLVED -> b + com.batch.android.core.Promise$Status PENDING -> a + 1:3:void ():140:142 -> + 4:4:void ():139:139 -> + 1:1:void (java.lang.String,int):139:139 -> + 1:1:com.batch.android.core.Promise$Status[] $values():139:139 -> a + 1:1:com.batch.android.core.Promise$Status valueOf(java.lang.String):139:139 -> valueOf + 1:1:com.batch.android.core.Promise$Status[] values():139:139 -> values +com.batch.android.core.Promise$ThenRunnable -> com.batch.android.f.c0$f: +# {"id":"sourceFile","fileName":"Promise.java"} + void run(java.lang.Object) -> a +com.batch.android.core.PushImageCache -> com.batch.android.f.d0: +# {"id":"sourceFile","fileName":"PushImageCache.java"} + java.lang.String TAG -> a + int MAX_IMAGES_STORED -> b + java.lang.String IMAGES_CACHE_FOLDER -> c + 1:1:void ():14:14 -> + 1:1:java.lang.String getFilePathForIdentifier(android.content.Context,java.lang.String):46:46 -> a + 2:12:void storeImageInCache(android.content.Context,java.lang.String,android.graphics.Bitmap):60:70 -> a + 13:16:void storeImageInCache(android.content.Context,java.lang.String,android.graphics.Bitmap):68:71 -> a + 17:19:java.lang.String buildIdentifierForURL(java.lang.String):95:97 -> a + 20:39:void clearImagesIfNeeded(android.content.Context):111:130 -> a + 40:44:void clearImagesIfNeeded(android.content.Context):128:132 -> a + 45:45:int lambda$clearImagesIfNeeded$0(java.io.File,java.io.File):121:121 -> a + 1:1:java.lang.String getPushImageCacheFolder(android.content.Context):35:35 -> b + 2:3:android.graphics.Bitmap getImageFromCache(android.content.Context,java.lang.String):83:84 -> b +com.batch.android.core.ReflectionHelper -> com.batch.android.f.e0: +# {"id":"sourceFile","fileName":"ReflectionHelper.java"} + 1:1:void ():19:19 -> + 1:1:boolean isAndroidXAppCompatActivityPresent():34:34 -> a + 2:3:boolean isInstanceOfCoordinatorLayout(java.lang.Object):46:47 -> a + 4:5:boolean optOutOfSmartReply(androidx.core.app.NotificationCompat$Builder):55:56 -> a + 6:7:void optOutOfDarkMode(android.view.View):64:65 -> a + 1:1:boolean isAndroidXFragmentPresent():25:25 -> b + 2:16:void optOutOfDarkModeRecursively(android.view.View):70:84 -> b + 1:1:boolean isGMSGoogleCloudMessagingPresent():95:95 -> c + 1:1:boolean isGMSInstanceIDPresent():104:104 -> d +com.batch.android.core.ResponseHelper -> com.batch.android.f.f0: +# {"id":"sourceFile","fileName":"ResponseHelper.java"} + java.lang.String TAG -> a + 1:1:void ():9:9 -> + 1:3:com.batch.android.json.JSONObject asJson(byte[]):25:27 -> a + 4:4:com.batch.android.json.JSONObject asJson(byte[]):21:21 -> a + 1:3:java.lang.String asString(byte[]):44:46 -> b + 4:4:java.lang.String asString(byte[]):40:40 -> b +com.batch.android.core.SecureDateProvider -> com.batch.android.f.g0: +# {"id":"sourceFile","fileName":"SecureDateProvider.java"} + java.util.Date mServerDate -> b + long mElapsedRealtime -> c + boolean mSecureDateEnabled -> a + 1:2:void ():38:39 -> + 1:5:void initServerDate(java.util.Date):76:80 -> a + 6:6:com.batch.android.date.BatchDate getCurrentDate():101:101 -> a + 1:1:boolean canEnableSecureDate():92:92 -> b + 1:6:java.util.Date getDate():49:54 -> c + 7:7:java.util.Date getDate():52:52 -> c + 1:1:boolean isSecureDateAvailable():67:67 -> d +com.batch.android.core.SystemDateProvider -> com.batch.android.f.h0: +# {"id":"sourceFile","fileName":"SystemDateProvider.java"} + 1:1:void ():6:6 -> + 1:1:com.batch.android.date.BatchDate getCurrentDate():10:10 -> a +com.batch.android.core.SystemParameterHelper -> com.batch.android.f.i0: +# {"id":"sourceFile","fileName":"SystemParameterHelper.java"} + java.lang.String TAG -> a + 1:1:void ():24:24 -> + 1:3:java.lang.String getAppVersion(android.content.Context):168:170 -> a + 4:4:java.lang.String getBridgeVersion():367:367 -> a + 5:100:java.lang.String getValue(java.lang.String,android.content.Context):498:593 -> a + 101:107:java.lang.String getValue(java.lang.String,android.content.Context):578:584 -> a + 108:108:java.lang.String getValue(java.lang.String,android.content.Context):574:574 -> a + 109:109:java.lang.String getValue(java.lang.String,android.content.Context):571:571 -> a + 110:110:java.lang.String getValue(java.lang.String,android.content.Context):568:568 -> a + 111:111:java.lang.String getValue(java.lang.String,android.content.Context):565:565 -> a + 112:112:java.lang.String getValue(java.lang.String,android.content.Context):562:562 -> a + 113:113:java.lang.String getValue(java.lang.String,android.content.Context):559:559 -> a + 114:114:java.lang.String getValue(java.lang.String,android.content.Context):556:556 -> a + 115:115:java.lang.String getValue(java.lang.String,android.content.Context):553:553 -> a + 116:116:java.lang.String getValue(java.lang.String,android.content.Context):550:550 -> a + 117:117:java.lang.String getValue(java.lang.String,android.content.Context):547:547 -> a + 118:118:java.lang.String getValue(java.lang.String,android.content.Context):544:544 -> a + 119:119:java.lang.String getValue(java.lang.String,android.content.Context):541:541 -> a + 120:120:java.lang.String getValue(java.lang.String,android.content.Context):538:538 -> a + 121:121:java.lang.String getValue(java.lang.String,android.content.Context):535:535 -> a + 122:122:java.lang.String getValue(java.lang.String,android.content.Context):532:532 -> a + 123:123:java.lang.String getValue(java.lang.String,android.content.Context):529:529 -> a + 124:124:java.lang.String getValue(java.lang.String,android.content.Context):526:526 -> a + 125:125:java.lang.String getValue(java.lang.String,android.content.Context):523:523 -> a + 126:126:java.lang.String getValue(java.lang.String,android.content.Context):520:520 -> a + 127:127:java.lang.String getValue(java.lang.String,android.content.Context):517:517 -> a + 128:128:java.lang.String getValue(java.lang.String,android.content.Context):514:514 -> a + 129:129:java.lang.String getValue(java.lang.String,android.content.Context):511:511 -> a + 130:130:java.lang.String getValue(java.lang.String,android.content.Context):508:508 -> a + 131:131:java.lang.String getValue(java.lang.String,android.content.Context):500:500 -> a + 1:1:java.lang.String getDeviceBrand():140:140 -> b + 2:4:java.lang.Integer getAppVersionCode(android.content.Context):184:186 -> b + 5:10:java.lang.Integer getAppVersionCode(android.content.Context):185:190 -> b + 1:1:java.lang.String getBundleName(android.content.Context):35:35 -> c + 2:2:java.lang.String getDeviceCountry():86:86 -> c + 1:1:java.lang.String getDeviceDate():95:95 -> d + 2:6:android.net.ConnectivityManager getConnectivityManager(android.content.Context):206:210 -> d + 1:19:java.lang.String getDeviceLanguage():57:75 -> e + 20:23:java.lang.Long getFirstInstallDate(android.content.Context):106:109 -> e + 1:4:java.lang.Long getLastUpdateDate(android.content.Context):124:127 -> f + 5:5:java.lang.String getDeviceModel():153:153 -> f + 1:1:java.lang.String getDeviceTimezone():45:45 -> g + 2:7:java.lang.String getNetworkCountryIso(android.content.Context):308:313 -> g + 1:1:java.lang.String getOSVersion():202:202 -> h + 2:11:android.net.NetworkInfo getNetworkInfos(android.content.Context):325:334 -> h + 1:1:java.lang.String getPluginVersion():376:376 -> i + 2:24:java.lang.Integer getNetworkKind(android.content.Context):458:480 -> i + 25:25:java.lang.Integer getNetworkKind(android.content.Context):477:477 -> i + 1:6:java.lang.String getNetworkOperatorName(android.content.Context):287:292 -> j + 1:1:int getScreenHeight(android.content.Context):390:390 -> k + 1:1:int getScreenOrientation(android.content.Context):444:444 -> l + 1:12:android.graphics.Point getScreenSize(android.content.Context):419:430 -> m + 1:1:int getScreenWidth(android.content.Context):404:404 -> n + 1:6:java.lang.String getSimCountryIso(android.content.Context):266:271 -> o + 1:1:java.lang.String getSimOperator(android.content.Context):250:250 -> p + 1:6:java.lang.String getSimOperatorName(android.content.Context):231:236 -> q + 1:1:android.telephony.TelephonyManager getTelephonyManager(android.content.Context):214:214 -> r + 1:6:java.lang.Boolean isNetRoaming(android.content.Context):350:355 -> s +com.batch.android.core.SystemParameterHelper$1 -> com.batch.android.f.i0$a: +# {"id":"sourceFile","fileName":"SystemParameterHelper.java"} + int[] $SwitchMap$com$batch$android$core$SystemParameterShortName -> a + 1:1:void ():506:506 -> +com.batch.android.core.SystemParameterShortName -> com.batch.android.f.j0: +# {"id":"sourceFile","fileName":"SystemParameterShortName.java"} + com.batch.android.core.SystemParameterShortName SCREEN_HEIGHT -> G + com.batch.android.core.SystemParameterShortName DEVICE_TYPE -> h + com.batch.android.core.SystemParameterShortName NETWORK_KIND -> I + com.batch.android.core.SystemParameterShortName DEVICE_REGION -> j + com.batch.android.core.SystemParameterShortName INSTALL_ID -> l + com.batch.android.core.SystemParameterShortName SERVER_ID -> n + com.batch.android.core.SystemParameterShortName API_LEVEL -> A + com.batch.android.core.SystemParameterShortName BUNDLE_NAME -> b + com.batch.android.core.SystemParameterShortName CUSTOM_USER_ID -> C + com.batch.android.core.SystemParameterShortName FIRST_INSTALL_DATE -> d + com.batch.android.core.SystemParameterShortName PLUGIN_VERSION -> E + com.batch.android.core.SystemParameterShortName BRAND -> f + com.batch.android.core.SystemParameterShortName SIM_COUNTRY -> w + com.batch.android.core.SystemParameterShortName NETWORK_COUNTRY -> y + com.batch.android.core.SystemParameterShortName ADVERTISING_ID -> o + java.lang.String shortName -> a + com.batch.android.core.SystemParameterShortName ADVERTISING_ID_OPTIN -> q + com.batch.android.core.SystemParameterShortName[] $VALUES -> J + com.batch.android.core.SystemParameterShortName APPLICATION_CODE -> s + com.batch.android.core.SystemParameterShortName SIM_OPERATOR_NAME -> u + com.batch.android.core.SystemParameterShortName SDK_LEVEL -> g + com.batch.android.core.SystemParameterShortName SCREEN_ORIENTATION -> H + com.batch.android.core.SystemParameterShortName DEVICE_LANGUAGE -> i + com.batch.android.core.SystemParameterShortName DEVICE_DATE -> k + com.batch.android.core.SystemParameterShortName DEVICE_INSTALL_DATE -> m + com.batch.android.core.SystemParameterShortName MESSAGING_API_LEVEL -> B + com.batch.android.core.SystemParameterShortName DEVICE_TIMEZONE -> c + com.batch.android.core.SystemParameterShortName BRIDGE_VERSION -> D + com.batch.android.core.SystemParameterShortName LAST_UPDATE_DATE -> e + com.batch.android.core.SystemParameterShortName SCREEN_WIDTH -> F + com.batch.android.core.SystemParameterShortName NETWORK_NAME -> x + com.batch.android.core.SystemParameterShortName ROAMING -> z + com.batch.android.core.SystemParameterShortName SESSION_ID -> p + com.batch.android.core.SystemParameterShortName APPLICATION_VERSION -> r + com.batch.android.core.SystemParameterShortName OS_VERSION -> t + com.batch.android.core.SystemParameterShortName SIM_OPERATOR -> v + 1:84:void ():8:91 -> + 85:85:void ():7:7 -> + 1:2:void (java.lang.String,int,java.lang.String):103:104 -> + 1:1:com.batch.android.core.SystemParameterShortName[] $values():7:7 -> a + 2:8:com.batch.android.core.SystemParameterShortName fromShortValue(java.lang.String):119:125 -> a + 9:9:com.batch.android.core.SystemParameterShortName fromShortValue(java.lang.String):116:116 -> a + 1:1:com.batch.android.core.SystemParameterShortName valueOf(java.lang.String):7:7 -> valueOf + 1:1:com.batch.android.core.SystemParameterShortName[] values():7:7 -> values +com.batch.android.core.TLSSocketFactory -> com.batch.android.f.k0: +# {"id":"sourceFile","fileName":"TLSSocketFactory.java"} + java.util.List enabledProtocols -> c + javax.net.ssl.SSLSocketFactory internalSSLSocketFactory -> a + java.lang.String[] protocols -> b + 1:10:void ():25:34 -> + 1:9:void ():38:46 -> + 1:2:java.net.Socket enableTLSOnSocket(java.net.Socket):92:93 -> a + 1:1:java.net.Socket createSocket():61:61 -> createSocket + 2:2:java.net.Socket createSocket(java.net.Socket,java.lang.String,int,boolean):66:66 -> createSocket + 3:3:java.net.Socket createSocket(java.lang.String,int):71:71 -> createSocket + 4:4:java.net.Socket createSocket(java.lang.String,int,java.net.InetAddress,int):77:77 -> createSocket + 5:5:java.net.Socket createSocket(java.net.InetAddress,int):82:82 -> createSocket + 6:6:java.net.Socket createSocket(java.net.InetAddress,int,java.net.InetAddress,int):88:88 -> createSocket + 1:1:java.lang.String[] getDefaultCipherSuites():51:51 -> getDefaultCipherSuites + 1:1:java.lang.String[] getSupportedCipherSuites():56:56 -> getSupportedCipherSuites +com.batch.android.core.TaskExecutor -> com.batch.android.f.l0: +# {"id":"sourceFile","fileName":"TaskExecutor.java"} + java.util.Map futures -> a + android.content.Context context -> b + java.lang.String INTENT_WORK_FINISHED -> c + 1:1:void (android.content.Context,int,int,long,java.util.concurrent.TimeUnit,java.util.concurrent.BlockingQueue):63:63 -> + 2:32:void (android.content.Context,int,int,long,java.util.concurrent.TimeUnit,java.util.concurrent.BlockingQueue):38:68 -> + 33:33:void (android.content.Context,int,int,long,java.util.concurrent.TimeUnit,java.util.concurrent.BlockingQueue):65:65 -> + 1:6:com.batch.android.core.TaskExecutor provide(android.content.Context):73:78 -> a + 7:48:java.util.concurrent.Future submit(com.batch.android.core.TaskRunnable):94:135 -> a + 49:49:java.util.concurrent.Future submit(com.batch.android.core.TaskRunnable):91:91 -> a + 50:52:boolean isBusy():144:146 -> a + 1:15:void afterExecute(java.lang.Runnable,java.lang.Throwable):159:173 -> afterExecute + 16:23:void afterExecute(java.lang.Runnable,java.lang.Throwable):166:173 -> afterExecute + 24:27:void afterExecute(java.lang.Runnable,java.lang.Throwable):171:174 -> afterExecute + 1:1:void execute(java.lang.Runnable):151:151 -> execute +com.batch.android.core.TaskRunnable -> com.batch.android.f.m0: +# {"id":"sourceFile","fileName":"TaskRunnable.java"} + java.lang.String getTaskIdentifier() -> a +com.batch.android.core.TypedID -> com.batch.android.f.n0: +# {"id":"sourceFile","fileName":"TypedID.java"} + java.nio.charset.Charset UTF_8_CHARSET -> c + com.batch.android.core.Ulid ulid -> b + int MAX_TYPE_LENGTH -> f + int BASE32_PART_LENGTH -> g + com.batch.android.core.Base32Encoding base32Encoding -> h + java.lang.String type -> a + java.lang.String CUSTOM_ENCODING -> d + char SEPARATOR -> e + 1:9:void ():15:23 -> + 1:8:void (java.lang.String,com.batch.android.core.Ulid):28:35 -> + 1:1:boolean isNotAlnum(byte):0:0 -> a + 2:10:byte[] toBytes():61:69 -> a + 11:49:com.batch.android.core.TypedID fromBytes(byte[]):83:121 -> a + 50:50:com.batch.android.core.TypedID fromBytes(byte[]):118:118 -> a + 51:52:com.batch.android.core.TypedID fromBytes(byte[]):107:108 -> a + 53:53:com.batch.android.core.TypedID fromBytes(byte[]):97:97 -> a + 54:54:com.batch.android.core.TypedID fromBytes(byte[]):94:94 -> a + 55:64:com.batch.android.core.TypedID newWithULID(java.lang.String,com.batch.android.core.Ulid):168:177 -> a + 65:65:com.batch.android.core.TypedID newWithULID(java.lang.String,com.batch.android.core.Ulid):173:173 -> a + 66:66:com.batch.android.core.TypedID newWithULID(java.lang.String,com.batch.android.core.Ulid):170:170 -> a + 67:85:com.batch.android.core.TypedID newWithUUID(java.lang.String,java.util.UUID):190:208 -> a + 86:86:com.batch.android.core.TypedID newWithUUID(java.lang.String,java.util.UUID):205:205 -> a + 87:87:com.batch.android.core.TypedID newWithUUID(java.lang.String,java.util.UUID):195:195 -> a + 88:88:com.batch.android.core.TypedID newWithUUID(java.lang.String,java.util.UUID):192:192 -> a + 89:96:void encodeMainPart(com.batch.android.core.Ulid,int,java.io.ByteArrayOutputStream):270:277 -> a + 97:100:void checkTypeIsAlnum(java.lang.String):354:357 -> a + 1:29:com.batch.android.core.TypedID$DecodedMainPart decodeMainPart(java.lang.String):302:330 -> b + 30:30:com.batch.android.core.TypedID$DecodedMainPart decodeMainPart(java.lang.String):324:324 -> b + 31:32:com.batch.android.core.TypedID$DecodedMainPart decodeMainPart(java.lang.String):313:314 -> b + 33:34:com.batch.android.core.TypedID$DecodedMainPart decodeMainPart(java.lang.String):303:304 -> b + 35:39:int getChecksum(byte[]):340:344 -> b + 1:2:com.batch.android.core.TypedID newWithRandomULID(java.lang.String):154:155 -> c + 1:36:com.batch.android.core.TypedID parse(java.lang.String):224:259 -> d + 37:38:com.batch.android.core.TypedID parse(java.lang.String):254:255 -> d + 39:39:com.batch.android.core.TypedID parse(java.lang.String):234:234 -> d + 40:40:com.batch.android.core.TypedID parse(java.lang.String):228:228 -> d + 1:5:boolean equals(java.lang.Object):43:47 -> equals + 1:1:int hashCode():52:52 -> hashCode + 1:12:java.lang.String toString():132:143 -> toString +com.batch.android.core.TypedID$DecodedMainPart -> com.batch.android.f.n0$a: +# {"id":"sourceFile","fileName":"TypedID.java"} + com.batch.android.core.Ulid ulid -> a + int checksum -> b + 1:3:void (com.batch.android.core.Ulid,int):287:289 -> + 1:1:com.batch.android.core.Ulid access$000(com.batch.android.core.TypedID$DecodedMainPart):281:281 -> a +com.batch.android.core.TypedIDExceptions -> com.batch.android.f.o0: +# {"id":"sourceFile","fileName":"TypedIDExceptions.java"} + 1:1:void ():3:3 -> +com.batch.android.core.TypedIDExceptions$InvalidChecksumException -> com.batch.android.f.o0$a: +# {"id":"sourceFile","fileName":"TypedIDExceptions.java"} + 1:1:void (java.lang.String):31:31 -> +com.batch.android.core.TypedIDExceptions$InvalidIDException -> com.batch.android.f.o0$b: +# {"id":"sourceFile","fileName":"TypedIDExceptions.java"} + 1:1:void (java.lang.String):8:8 -> +com.batch.android.core.TypedIDExceptions$InvalidSeparatorException -> com.batch.android.f.o0$c: +# {"id":"sourceFile","fileName":"TypedIDExceptions.java"} + 1:1:void ():12:12 -> +com.batch.android.core.TypedIDExceptions$InvalidSizeException -> com.batch.android.f.o0$d: +# {"id":"sourceFile","fileName":"TypedIDExceptions.java"} + 1:1:void (java.lang.String):17:17 -> +com.batch.android.core.TypedIDExceptions$InvalidTypeException -> com.batch.android.f.o0$e: +# {"id":"sourceFile","fileName":"TypedIDExceptions.java"} + 1:1:void (java.lang.String):24:24 -> +com.batch.android.core.URLBuilder -> com.batch.android.f.p0: +# {"id":"sourceFile","fileName":"URLBuilder.java"} + java.util.Map getParameters -> b + com.batch.android.core.URLBuilder$CryptorMode cryptorMode -> c + java.lang.String baseURL -> a + java.lang.String TAG -> d + 1:8:void (java.lang.String,com.batch.android.core.URLBuilder$CryptorMode,java.lang.String[]):44:51 -> + 9:9:void (java.lang.String,com.batch.android.core.URLBuilder$CryptorMode,java.lang.String[]):46:46 -> + 1:34:void parseURL(java.lang.String,java.lang.String[]):71:104 -> a + 35:36:void parseURL(java.lang.String,java.lang.String[]):91:92 -> a + 37:46:java.util.Map parseQuery(java.lang.String):115:124 -> a + 47:55:void addGETParameter(java.lang.String,java.lang.String):140:148 -> a + 56:56:void addGETParameter(java.lang.String,java.lang.String):145:145 -> a + 57:57:void addGETParameter(java.lang.String,java.lang.String):141:141 -> a + 58:58:java.net.URL build():172:172 -> a + 59:71:java.net.URL build(com.batch.android.core.PatternURLSorter,com.batch.android.core.Cryptor):183:195 -> a + 72:76:void buildRawQuery(com.batch.android.core.PatternURLSorter,java.lang.StringBuilder):270:274 -> a + 77:77:void addParameter(java.lang.StringBuilder,java.lang.String,java.lang.String):285:285 -> a + 78:78:void cleanURL(java.lang.StringBuilder):294:294 -> a + 1:1:void removeGETParameter(java.lang.String):161:161 -> b + 2:2:void removeGETParameter(java.lang.String):158:158 -> b + 3:48:java.lang.String buildQuery(com.batch.android.core.PatternURLSorter,com.batch.android.core.Cryptor):211:256 -> b + 49:55:java.lang.String buildQuery(com.batch.android.core.PatternURLSorter,com.batch.android.core.Cryptor):245:251 -> b + 56:62:java.lang.String buildQuery(com.batch.android.core.PatternURLSorter,com.batch.android.core.Cryptor):234:240 -> b + 63:65:java.lang.String buildQuery(com.batch.android.core.PatternURLSorter,com.batch.android.core.Cryptor):227:229 -> b + 66:66:java.lang.String buildQuery(com.batch.android.core.PatternURLSorter,com.batch.android.core.Cryptor):208:208 -> b +com.batch.android.core.URLBuilder$1 -> com.batch.android.f.p0$a: +# {"id":"sourceFile","fileName":"URLBuilder.java"} + int[] $SwitchMap$com$batch$android$core$URLBuilder$CryptorMode -> a + 1:1:void ():223:223 -> +com.batch.android.core.URLBuilder$CryptorMode -> com.batch.android.f.p0$b: +# {"id":"sourceFile","fileName":"URLBuilder.java"} + com.batch.android.core.URLBuilder$CryptorMode EACH -> d + com.batch.android.core.URLBuilder$CryptorMode VALUE -> c + com.batch.android.core.URLBuilder$CryptorMode ALL -> b + com.batch.android.core.URLBuilder$CryptorMode[] $VALUES -> e + int value -> a + 1:11:void ():307:317 -> + 12:12:void ():303:303 -> + 1:2:void (java.lang.String,int,int):329:330 -> + 1:1:com.batch.android.core.URLBuilder$CryptorMode[] $values():303:303 -> a + 2:3:com.batch.android.core.URLBuilder$CryptorMode fromValue(int):349:350 -> a + 1:1:int getValue():339:339 -> b + 1:1:com.batch.android.core.URLBuilder$CryptorMode valueOf(java.lang.String):303:303 -> valueOf + 1:1:com.batch.android.core.URLBuilder$CryptorMode[] values():303:303 -> values +com.batch.android.core.Ulid -> com.batch.android.f.q0: +# {"id":"sourceFile","fileName":"Ulid.java"} + java.nio.charset.Charset UTF_8_CHARSET -> b + byte[] buffer -> a + java.security.SecureRandom SECURE_RANDOM -> c + int ULID_BYTES -> d + 1:11:void ():15:25 -> + 1:2:void (byte[]):75:76 -> + 1:4:com.batch.android.core.Ulid from(byte[]):39:42 -> a + 5:5:com.batch.android.core.Ulid from(byte[]):40:40 -> a + 6:10:com.batch.android.core.Ulid from(java.lang.String):53:57 -> a + 11:19:byte[] generateUlidBuffer():108:116 -> a + 1:2:com.batch.android.core.Ulid randomUlid():66:67 -> b + 1:1:byte[] toBytes():85:85 -> c + 1:4:java.lang.String toULIDString():95:98 -> d + 1:5:boolean equals(java.lang.Object):124:128 -> equals + 1:1:int hashCode():133:133 -> hashCode +com.batch.android.core.Ulid$InvalidBufferSizeException -> com.batch.android.f.q0$a: +# {"id":"sourceFile","fileName":"Ulid.java"} + 1:1:void (java.lang.String):139:139 -> +com.batch.android.core.Webservice -> com.batch.android.f.r0: +# {"id":"sourceFile","fileName":"Webservice.java"} + com.batch.android.core.URLBuilder builder -> b + com.batch.android.core.Webservice$RequestType type -> e + java.util.Map headers -> c + java.lang.String TAG -> h + int DEFAULT_RETRY_AFTER -> j + int WEBSERVICE_ERROR_INVALID_CIPHER -> i + com.batch.android.core.Webservice$Interceptor wsInterceptor -> k + boolean isDowngradedCipher -> f + java.lang.String id -> a + com.batch.android.module.OptOutModule optOutModule -> g + android.content.Context applicationContext -> d + 1:1:void (android.content.Context,com.batch.android.core.Webservice$RequestType,java.lang.String,java.lang.String[]):113:113 -> + 2:31:void (android.content.Context,com.batch.android.core.Webservice$RequestType,java.lang.String,java.lang.String[]):103:132 -> + 32:32:void (android.content.Context,com.batch.android.core.Webservice$RequestType,java.lang.String,java.lang.String[]):123:123 -> + 33:33:void (android.content.Context,com.batch.android.core.Webservice$RequestType,java.lang.String,java.lang.String[]):119:119 -> + 34:34:void (android.content.Context,com.batch.android.core.Webservice$RequestType,java.lang.String,java.lang.String[]):115:115 -> + java.lang.String getSpecificConnectTimeoutKey() -> A + java.lang.String getSpecificReadTimeoutKey() -> B + java.lang.String getSpecificRetryCountKey() -> C + 1:35:com.batch.android.json.JSONObject getStandardResponseBodyIfValid():619:653 -> D + 36:67:com.batch.android.json.JSONObject getStandardResponseBodyIfValid():649:680 -> D + 68:68:com.batch.android.json.JSONObject getStandardResponseBodyIfValid():639:639 -> D + 69:69:com.batch.android.json.JSONObject getStandardResponseBodyIfValid():631:631 -> D + 70:70:com.batch.android.json.JSONObject getStandardResponseBodyIfValid():627:627 -> D + 71:71:com.batch.android.json.JSONObject getStandardResponseBodyIfValid():623:623 -> D + 1:11:com.batch.android.core.PatternURLSorter getURLSorter():268:278 -> E + java.lang.String getURLSorterPatternParameterKey() -> F + 1:1:void setWsInterceptor(com.batch.android.core.Webservice$Interceptor):0:0 -> a + 2:9:void addGetParameter(java.lang.String,java.lang.String):166:173 -> a + 10:12:java.lang.String[] addBatchApiKey(java.lang.String[]):183:185 -> a + 13:32:void sendRetrySignal(com.batch.android.core.Webservice$WebserviceError):564:583 -> a + 33:33:void sendRetrySignal(com.batch.android.core.Webservice$WebserviceError):580:580 -> a + 34:58:void sendRetrySignal(com.batch.android.core.Webservice$WebserviceError):570:594 -> a + 59:59:void onRetry(com.batch.android.core.WebserviceErrorCause):604:604 -> a + 60:76:com.batch.android.core.Webservice$WebserviceError$Reason getResponseErrorCause(int):722:738 -> a + 77:79:java.lang.String encode(java.lang.String):749:751 -> a + 80:87:byte[] buildPostParameters(com.batch.android.post.PostDataProvider):875:882 -> a + 88:115:void addRequestSignatures(java.net.HttpURLConnection,byte[]):895:922 -> a + 116:149:java.lang.String getSignatureBody(java.net.HttpURLConnection,java.util.List):926:959 -> a + 150:153:java.lang.String formatDate(java.util.Date):1199:1202 -> a + 1:1:boolean isResponseValid(int):0:0 -> b + 2:15:void addDefaultHeaders():214:227 -> b + 1:1:void addDefaultParameters():0:0 -> c + 2:2:boolean shouldRetry(int):0:0 -> c + 1:3:void addHeaders():235:237 -> d + 1:7:void addParameters():147:153 -> e + 1:72:java.net.HttpURLConnection buildConnection():781:852 -> f + 73:73:java.net.HttpURLConnection buildConnection():850:850 -> f + 1:5:void buildParameters():861:865 -> g + 1:3:java.net.URL buildURL():761:763 -> h + boolean canBypassOptOut() -> i + 1:2:void enabledDowngradedMode():889:890 -> j + 1:110:byte[] executeRequest():417:526 -> k + 111:136:byte[] executeRequest():501:526 -> k + 137:210:byte[] executeRequest():453:526 -> k + 211:211:byte[] executeRequest():447:447 -> k + 212:296:byte[] executeRequest():442:526 -> k + 297:323:byte[] executeRequest():511:537 -> k + 324:337:byte[] executeRequest():515:528 -> k + 1:5:com.batch.android.json.JSONObject getBasicJsonResponseBody():691:695 -> l + 1:10:int getConnectTimeout():971:980 -> m + 11:11:int getConnectTimeout():979:979 -> m + 1:14:com.batch.android.core.Cryptor getCryptor():296:309 -> n + java.lang.String getCryptorModeParameterKey() -> o + java.lang.String getCryptorTypeParameterKey() -> p + 1:16:com.batch.android.core.URLBuilder$CryptorMode getGetCryptorMode():325:340 -> q + java.util.Map getHeaders() -> r + 1:9:int getMaxRetryCount():1023:1031 -> s + java.util.Map getParameters() -> t + 1:14:com.batch.android.core.WebserviceCryptor getPostCryptor():356:369 -> u + java.lang.String getPostCryptorTypeParameterKey() -> v + com.batch.android.post.PostDataProvider getPostDataProvider() -> w + 1:14:com.batch.android.core.WebserviceCryptor getReadCryptor():385:398 -> x + java.lang.String getReadCryptorTypeParameterKey() -> y + 1:9:int getReadTimeout():998:1006 -> z +com.batch.android.core.Webservice$1 -> com.batch.android.f.r0$a: +# {"id":"sourceFile","fileName":"Webservice.java"} + int[] $SwitchMap$com$batch$android$core$Webservice$WebserviceError$Reason -> a + 1:1:void ():567:567 -> +com.batch.android.core.Webservice$Interceptor -> com.batch.android.f.r0$b: +# {"id":"sourceFile","fileName":"Webservice.java"} + java.net.HttpURLConnection onBuildHttpConnection(java.net.HttpURLConnection) -> a + java.net.URL onBuildURL(java.net.URL) -> a + void onError(java.lang.String,java.net.HttpURLConnection,com.batch.android.core.Webservice$WebserviceError) -> a + void onPreConnect(java.lang.String,java.net.HttpURLConnection,byte[],long) -> a + void onSuccess(java.lang.String,java.net.HttpURLConnection,byte[],long) -> b +com.batch.android.core.Webservice$RequestType -> com.batch.android.f.r0$c: +# {"id":"sourceFile","fileName":"Webservice.java"} + com.batch.android.core.Webservice$RequestType POST -> b + com.batch.android.core.Webservice$RequestType[] $VALUES -> c + com.batch.android.core.Webservice$RequestType GET -> a + 1:6:void ():1051:1056 -> + 7:7:void ():1047:1047 -> + 1:1:void (java.lang.String,int):1047:1047 -> + 1:1:com.batch.android.core.Webservice$RequestType[] $values():1047:1047 -> a + 1:1:com.batch.android.core.Webservice$RequestType valueOf(java.lang.String):1047:1047 -> valueOf + 1:1:com.batch.android.core.Webservice$RequestType[] values():1047:1047 -> values +com.batch.android.core.Webservice$WebserviceError -> com.batch.android.f.r0$d: +# {"id":"sourceFile","fileName":"Webservice.java"} + com.batch.android.core.Webservice$WebserviceError$Reason reason -> a + int retryAfter -> b + 1:1:void (com.batch.android.core.Webservice$WebserviceError$Reason,java.lang.Throwable):1090:1090 -> + 2:16:void (com.batch.android.core.Webservice$WebserviceError$Reason,java.lang.Throwable):1081:1095 -> + 17:17:void (com.batch.android.core.Webservice$WebserviceError$Reason,java.lang.Throwable):1092:1092 -> + 18:18:void (com.batch.android.core.Webservice$WebserviceError$Reason):1102:1102 -> + 19:45:void (com.batch.android.core.Webservice$WebserviceError$Reason):1081:1107 -> + 46:46:void (com.batch.android.core.Webservice$WebserviceError$Reason):1104:1104 -> + 1:1:com.batch.android.core.Webservice$WebserviceError$Reason access$000(com.batch.android.core.Webservice$WebserviceError):1063:1063 -> a + 2:2:com.batch.android.core.Webservice$WebserviceError$Reason getReason():1118:1118 -> a + 3:3:void setRetryAfter(int):1186:1186 -> a + 1:1:int getRetryAfterInMillis():1179:1179 -> b +com.batch.android.core.Webservice$WebserviceError$Reason -> com.batch.android.f.r0$d$a: +# {"id":"sourceFile","fileName":"Webservice.java"} + com.batch.android.core.Webservice$WebserviceError$Reason NETWORK_ERROR -> a + com.batch.android.core.Webservice$WebserviceError$Reason TOO_MANY_REQUESTS -> c + com.batch.android.core.Webservice$WebserviceError$Reason SERVER_ERROR -> b + com.batch.android.core.Webservice$WebserviceError$Reason[] $VALUES -> j + com.batch.android.core.Webservice$WebserviceError$Reason INVALID_API_KEY -> e + com.batch.android.core.Webservice$WebserviceError$Reason NOT_FOUND_ERROR -> d + com.batch.android.core.Webservice$WebserviceError$Reason UNEXPECTED_ERROR -> g + com.batch.android.core.Webservice$WebserviceError$Reason DEACTIVATED_API_KEY -> f + com.batch.android.core.Webservice$WebserviceError$Reason SDK_OPTED_OUT -> i + com.batch.android.core.Webservice$WebserviceError$Reason FORBIDDEN -> h + 1:41:void ():1131:1171 -> + 42:42:void ():1127:1127 -> + 1:1:void (java.lang.String,int):1127:1127 -> + 1:1:com.batch.android.core.Webservice$WebserviceError$Reason[] $values():1127:1127 -> a + 1:1:com.batch.android.core.Webservice$WebserviceError$Reason valueOf(java.lang.String):1127:1127 -> valueOf + 1:1:com.batch.android.core.Webservice$WebserviceError$Reason[] values():1127:1127 -> values +com.batch.android.core.WebserviceCryptor -> com.batch.android.f.s0: +# {"id":"sourceFile","fileName":"WebserviceCryptor.java"} + com.batch.android.core.CryptorFactory$CryptorType cryptorType -> a + java.lang.String PRIVATE_KEY_PART_V2 -> c + java.lang.String PRIVATE_KEY_PART -> b + java.lang.String VERSION -> d + 1:1:void (int):40:40 -> + 2:7:void (com.batch.android.core.CryptorFactory$CryptorType):46:51 -> + 8:8:void (com.batch.android.core.CryptorFactory$CryptorType):48:48 -> + 1:10:byte[] decryptData(byte[],com.batch.android.core.Webservice,java.net.HttpURLConnection):69:78 -> a + 11:11:byte[] decryptData(byte[],com.batch.android.core.Webservice,java.net.HttpURLConnection):75:75 -> a + 12:12:byte[] decryptData(byte[],com.batch.android.core.Webservice,java.net.HttpURLConnection):71:71 -> a + 13:13:byte[] decryptData(byte[],com.batch.android.core.Webservice,java.net.HttpURLConnection):66:66 -> a + 14:19:byte[] decryptDataForVersion(java.lang.String,java.lang.String,java.lang.String,com.batch.android.core.Webservice):93:98 -> a + 20:29:byte[] encryptData(byte[],com.batch.android.core.Webservice):113:122 -> a + 30:33:byte[] buildPrivateKey(com.batch.android.core.Webservice):137:140 -> a + 34:34:java.lang.String buildKey(java.lang.String,com.batch.android.core.Webservice):167:167 -> a + 35:43:java.lang.String randomChars(int):197:205 -> a + 1:4:byte[] buildPrivateKeyV2(com.batch.android.core.Webservice):153:156 -> b + 5:5:java.lang.String buildKeyV2(java.lang.String,com.batch.android.core.Webservice):178:178 -> b + 1:1:java.lang.String generatePublicKey(java.lang.String,com.batch.android.core.Webservice):187:187 -> c +com.batch.android.core.WebserviceErrorCause -> com.batch.android.f.t0: +# {"id":"sourceFile","fileName":"WebserviceErrorCause.java"} + com.batch.android.core.WebserviceErrorCause[] $VALUES -> f + com.batch.android.core.WebserviceErrorCause PARSING_ERROR -> a + com.batch.android.core.WebserviceErrorCause SERVER_ERROR -> b + com.batch.android.core.WebserviceErrorCause NETWORK_TIMEOUT -> c + com.batch.android.core.WebserviceErrorCause SSL_HANDSHAKE_FAILURE -> d + com.batch.android.core.WebserviceErrorCause OTHER -> e + 1:21:void ():11:31 -> + 22:22:void ():7:7 -> + 1:1:void (java.lang.String,int):7:7 -> + 1:1:com.batch.android.core.WebserviceErrorCause[] $values():7:7 -> a + 1:1:com.batch.android.core.WebserviceErrorCause valueOf(java.lang.String):7:7 -> valueOf + 1:1:com.batch.android.core.WebserviceErrorCause[] values():7:7 -> values +com.batch.android.core.WebserviceSignature -> com.batch.android.f.u0: +# {"id":"sourceFile","fileName":"WebserviceSignature.java"} + java.lang.String TAG -> a + java.lang.String PRIVATE_SIGNATURE_KEY_PART -> b + 1:1:void ():9:9 -> + 1:3:java.lang.String encryptSignatureData(java.lang.String):20:22 -> a + 4:11:java.lang.String encryptSignatureData(java.lang.String):21:28 -> a + 12:17:byte[] buildPrivateSignatureKey():42:47 -> a + 18:20:byte[] encryptHMAC(java.security.Key,byte[]):58:60 -> a +com.batch.android.core.stores.GooglePlayStoreApplication -> com.batch.android.g.a: +# {"id":"sourceFile","fileName":"GooglePlayStoreApplication.java"} + 1:1:void ():10:10 -> + 1:7:void open(android.content.Context):15:21 -> a +com.batch.android.core.stores.HuaweiAppGalleryApplication -> com.batch.android.g.b: +# {"id":"sourceFile","fileName":"HuaweiAppGalleryApplication.java"} + 1:1:void ():10:10 -> + 1:7:void open(android.content.Context):15:21 -> a +com.batch.android.core.stores.StoreApplication -> com.batch.android.g.c: +# {"id":"sourceFile","fileName":"StoreApplication.java"} + void open(android.content.Context) -> a +com.batch.android.core.stores.StoreApplicationFactory -> com.batch.android.g.d: +# {"id":"sourceFile","fileName":"StoreApplicationFactory.java"} + 1:1:void ():10:10 -> + 1:5:com.batch.android.core.stores.StoreApplication getMainStore(android.content.Context):16:20 -> a + 1:1:boolean isHuaweiAppGalleryInstalled(android.content.Context):30:30 -> b + 1:1:boolean isPlayStoreInstalled(android.content.Context):26:26 -> c +com.batch.android.date.BatchDate -> com.batch.android.h.a: +# {"id":"sourceFile","fileName":"BatchDate.java"} + long timestamp -> a + 1:2:void (long):9:10 -> + 1:1:void setTime(long):14:14 -> a + 2:2:long getTime():18:18 -> a + 3:4:int compareTo(com.batch.android.date.BatchDate):42:43 -> a + 1:1:int compareTo(java.lang.Object):5:5 -> compareTo + 1:7:boolean equals(java.lang.Object):26:32 -> equals + 1:1:int hashCode():37:37 -> hashCode +com.batch.android.date.TimezoneAwareDate -> com.batch.android.h.b: +# {"id":"sourceFile","fileName":"TimezoneAwareDate.java"} + 1:1:void ():8:8 -> + 2:2:void (long):12:12 -> + 1:1:long getTime():17:17 -> a +com.batch.android.date.UTCDate -> com.batch.android.h.c: +# {"id":"sourceFile","fileName":"UTCDate.java"} + 1:1:void ():6:6 -> + 2:2:void (long):10:10 -> +com.batch.android.debug.BatchDebugActivity -> com.batch.android.debug.BatchDebugActivity: +# {"id":"sourceFile","fileName":"BatchDebugActivity.java"} + int LOCAL_CAMPAIGN_DEBUG_FRAGMENT -> f + int USER_DATA_DEBUG_FRAGMENT -> d + int LOCAL_CAMPAIGNS_DEBUG_FRAGMENT -> e + int MAIN_DEBUG_FRAGMENT -> b + int IDENTIFIER_DEBUG_FRAGMENT -> c + androidx.fragment.app.Fragment[] fragments -> a + 1:9:void ():21:29 -> + 1:18:void switchFragment(int,boolean,java.lang.String):32:49 -> a + 19:19:void switchFragment(int,boolean,java.lang.String):45:45 -> a + 20:20:void switchFragment(int,boolean,java.lang.String):42:42 -> a + 21:21:void switchFragment(int,boolean,java.lang.String):39:39 -> a + 22:50:void switchFragment(int,boolean,java.lang.String):36:64 -> a + 51:51:void switchFragment(int,boolean):70:70 -> a + 52:52:void onMenuSelected(int):75:75 -> a + 53:53:void onCampaignMenuSelected(java.lang.String):80:80 -> a + 1:7:void onCreate(android.os.Bundle):85:91 -> onCreate + 1:2:void onDestroy():108:109 -> onDestroy + 1:2:void onStart():96:97 -> onStart + 1:2:void onStop():102:103 -> onStop +com.batch.android.debug.FindMyInstallationHelper -> com.batch.android.i.a: +# {"id":"sourceFile","fileName":"FindMyInstallationHelper.java"} + java.util.List timestamps -> a + boolean isEnabled -> e + int MAX_DELAY_BETWEEN_FOREGROUNDS -> d + java.lang.String TAG -> b + int MIN_FOREGROUND -> c + 1:24:void ():20:43 -> + 1:9:void notifyForeground():49:57 -> a + 10:27:void copyInstallationIDToClipboard(android.content.Context):87:104 -> a + 28:32:void copyInstallationIDToClipboard(android.content.Context):102:106 -> a + 1:5:boolean shouldCopyInstallationID():69:73 -> b +com.batch.android.debug.OnMenuSelectedListener -> com.batch.android.i.b: +# {"id":"sourceFile","fileName":"OnMenuSelectedListener.java"} + void onCampaignMenuSelected(java.lang.String) -> a + void onMenuSelected(int) -> a +com.batch.android.debug.adapter.CollectionAdapter -> com.batch.android.j.a: +# {"id":"sourceFile","fileName":"CollectionAdapter.java"} + android.content.Context context -> b + android.view.LayoutInflater inflater -> a + java.util.List tagCollections -> c + 1:4:void (android.content.Context):26:29 -> + 1:1:com.batch.android.debug.adapter.CollectionAdapter$TagCollection getItem(int):39:39 -> a + 2:14:void add(java.lang.String,java.util.Set):69:81 -> a + 15:16:void clear():85:86 -> a + 1:1:int getCount():34:34 -> getCount + 1:1:java.lang.Object getItem(int):18:18 -> getItem + 1:11:android.view.View getView(int,android.view.View,android.view.ViewGroup):54:64 -> getView +com.batch.android.debug.adapter.CollectionAdapter$TagCollection -> com.batch.android.j.a$a: +# {"id":"sourceFile","fileName":"CollectionAdapter.java"} + com.batch.android.debug.adapter.CollectionAdapter this$0 -> c + java.lang.String name -> a + android.widget.ArrayAdapter tagAdapter -> b + 1:4:void (com.batch.android.debug.adapter.CollectionAdapter,java.lang.String,android.widget.ArrayAdapter):94:97 -> + 1:1:java.lang.String getName():101:101 -> a + 1:1:android.widget.ArrayAdapter getTagAdapter():105:105 -> b +com.batch.android.debug.fragment.IdentifierDebugFragment -> com.batch.android.k.a: +# {"id":"sourceFile","fileName":"IdentifierDebugFragment.java"} + android.widget.TextView sdkVersion -> a + android.widget.TextView advertisingId -> c + android.widget.TextView installId -> b + android.widget.TextView pushToken -> d + 1:1:void ():18:18 -> + 1:7:java.lang.String getShareString():31:37 -> a + 8:8:java.lang.String getShareString():34:34 -> a + 9:24:java.lang.String getShareString():33:48 -> a + 25:25:java.lang.String getShareString():45:45 -> a + 26:39:java.lang.String getShareString():44:57 -> a + 40:40:java.lang.String getShareString():54:54 -> a + 41:56:java.lang.String getShareString():53:68 -> a + 57:57:java.lang.String getShareString():66:66 -> a + 58:71:java.lang.String getShareString():65:78 -> a + 72:72:java.lang.String getShareString():75:75 -> a + 73:73:java.lang.String getShareString():74:74 -> a + 1:1:com.batch.android.debug.fragment.IdentifierDebugFragment newInstance():26:26 -> b + 1:17:void onActivityCreated(android.os.Bundle):106:122 -> onActivityCreated + 1:6:void onClick(android.view.View):128:133 -> onClick + 1:8:android.view.View onCreateView(android.view.LayoutInflater,android.view.ViewGroup,android.os.Bundle):93:100 -> onCreateView +com.batch.android.debug.fragment.LocalCampaignDebugFragment -> com.batch.android.k.b: +# {"id":"sourceFile","fileName":"LocalCampaignDebugFragment.java"} + android.widget.TextView token -> a + java.lang.String CAMPAIGN_TOKEN_KEY -> h + android.widget.TextView endDate -> c + android.widget.TextView startDate -> b + android.widget.TextView gracePeriod -> e + com.batch.android.localcampaigns.CampaignManager campaignManager -> g + android.widget.TextView capping -> d + android.widget.TextView trigger -> f + 1:1:void ():21:21 -> + 1:6:com.batch.android.debug.fragment.LocalCampaignDebugFragment newInstance(java.lang.String,com.batch.android.localcampaigns.CampaignManager):35:40 -> a + 7:7:void setCampaignManager(com.batch.android.localcampaigns.CampaignManager):45:45 -> a + 8:11:com.batch.android.localcampaigns.model.LocalCampaign getCurrentCampaign():49:52 -> a + 12:13:java.lang.String formatDate(com.batch.android.date.BatchDate):61:62 -> a + 14:46:void displayCampaign(com.batch.android.localcampaigns.model.LocalCampaign):187:219 -> a + 1:8:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):66:73 -> b + 9:9:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):71:71 -> b + 10:23:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):70:83 -> b + 24:24:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):80:80 -> b + 25:40:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):79:94 -> b + 41:41:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):91:91 -> b + 42:55:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):90:103 -> b + 56:56:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):100:100 -> b + 57:72:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):99:114 -> b + 73:73:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):111:111 -> b + 74:87:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):110:123 -> b + 88:88:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):120:120 -> b + 89:104:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):119:134 -> b + 105:105:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):131:131 -> b + 106:120:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):130:144 -> b + 121:121:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):141:141 -> b + 122:137:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):140:155 -> b + 138:138:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):151:151 -> b + 139:159:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):150:170 -> b + 160:160:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):167:167 -> b + 161:174:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):166:179 -> b + 175:175:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):176:176 -> b + 176:176:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):175:175 -> b + 1:5:void onActivityCreated(android.os.Bundle):244:248 -> onActivityCreated + 1:8:void onClick(android.view.View):254:261 -> onClick + 1:9:android.view.View onCreateView(android.view.LayoutInflater,android.view.ViewGroup,android.os.Bundle):230:238 -> onCreateView +com.batch.android.debug.fragment.LocalCampaignsDebugFragment -> com.batch.android.k.c: +# {"id":"sourceFile","fileName":"LocalCampaignsDebugFragment.java"} + java.lang.String TAG -> g + com.batch.android.debug.OnMenuSelectedListener listener -> d + android.widget.TextView title -> a + com.batch.android.localcampaigns.CampaignManager campaignManager -> e + android.widget.ListView campaignList -> b + com.batch.android.webservice.listener.LocalCampaignsWebserviceListener webserviceListener -> f + android.widget.ArrayAdapter campaignAdapter -> c + 1:13:void ():32:44 -> + 1:1:void access$000(com.batch.android.debug.fragment.LocalCampaignsDebugFragment):32:32 -> a + 2:3:com.batch.android.debug.fragment.LocalCampaignsDebugFragment newInstance(com.batch.android.localcampaigns.CampaignManager):67:68 -> a + 4:24:void loadLocalCampaigns():91:111 -> a + 25:25:void lambda$onCreateView$0(android.widget.AdapterView,android.view.View,int,long):135:135 -> a + 26:26:void lambda$onCreateView$1(android.view.View):140:140 -> a + 1:1:void setCampaignManager(com.batch.android.localcampaigns.CampaignManager):73:73 -> b + 2:10:void refreshLocalCampaigns():78:86 -> b + 1:2:void onActivityCreated(android.os.Bundle):147:148 -> onActivityCreated + 1:5:void onAttach(android.content.Context):116:120 -> onAttach + 1:9:android.view.View onCreateView(android.view.LayoutInflater,android.view.ViewGroup,android.os.Bundle):131:139 -> onCreateView +com.batch.android.debug.fragment.LocalCampaignsDebugFragment$1 -> com.batch.android.k.c$a: +# {"id":"sourceFile","fileName":"LocalCampaignsDebugFragment.java"} + com.batch.android.webservice.listener.LocalCampaignsWebserviceListener sdkImpl -> a + com.batch.android.debug.fragment.LocalCampaignsDebugFragment this$0 -> b + 1:2:void (com.batch.android.debug.fragment.LocalCampaignsDebugFragment):44:45 -> + 1:4:void onSuccess(java.util.List):49:52 -> a + 5:8:void onError(com.batch.android.FailReason):58:61 -> a + 9:9:void lambda$onError$1():61:61 -> a + 1:1:void lambda$onSuccess$0():52:52 -> b +com.batch.android.debug.fragment.MainDebugFragment -> com.batch.android.k.d: +# {"id":"sourceFile","fileName":"MainDebugFragment.java"} + com.batch.android.debug.OnMenuSelectedListener listener -> a + 1:1:void ():15:15 -> + 1:1:com.batch.android.debug.fragment.MainDebugFragment newInstance():20:20 -> a + 2:2:void lambda$onCreateView$0(android.view.View):43:43 -> a + 1:1:void lambda$onCreateView$1(android.view.View):48:48 -> b + 1:1:void lambda$onCreateView$2(android.view.View):53:53 -> c + 1:5:void onAttach(android.content.Context):25:29 -> onAttach + 1:13:android.view.View onCreateView(android.view.LayoutInflater,android.view.ViewGroup,android.os.Bundle):40:52 -> onCreateView +com.batch.android.debug.fragment.UserDataDebugFragment -> com.batch.android.k.e: +# {"id":"sourceFile","fileName":"UserDataDebugFragment.java"} + com.batch.android.debug.adapter.CollectionAdapter collectionAdapter -> e + android.widget.TextView customUserId -> a + android.widget.ListView attributeList -> b + android.widget.ArrayAdapter attributeAdapter -> d + android.widget.ListView collectionList -> c + 1:1:void ():25:25 -> + 1:1:android.widget.ArrayAdapter access$000(com.batch.android.debug.fragment.UserDataDebugFragment):25:25 -> a + 2:2:java.lang.String access$100(com.batch.android.debug.fragment.UserDataDebugFragment,com.batch.android.BatchUserAttribute):25:25 -> a + 3:7:java.lang.String formatAttribute(com.batch.android.BatchUserAttribute):39:43 -> a + 8:18:void loadAttributes():47:57 -> a + 19:19:void loadAttributes():56:56 -> a + 1:1:com.batch.android.debug.adapter.CollectionAdapter access$200(com.batch.android.debug.fragment.UserDataDebugFragment):25:25 -> b + 2:11:void loadCollections():78:87 -> b + 12:12:void loadCollections():86:86 -> b + 1:1:com.batch.android.debug.fragment.UserDataDebugFragment newInstance():35:35 -> c + 1:11:void onActivityCreated(android.os.Bundle):122:132 -> onActivityCreated + 1:4:android.view.View onCreateView(android.view.LayoutInflater,android.view.ViewGroup,android.os.Bundle):113:116 -> onCreateView +com.batch.android.debug.fragment.UserDataDebugFragment$1 -> com.batch.android.k.e$a: +# {"id":"sourceFile","fileName":"UserDataDebugFragment.java"} + com.batch.android.debug.fragment.UserDataDebugFragment this$0 -> a + 1:1:void (com.batch.android.debug.fragment.UserDataDebugFragment):58:58 -> + 1:2:void onError():70:71 -> onError + 1:5:void onSuccess(java.util.Map):61:65 -> onSuccess +com.batch.android.debug.fragment.UserDataDebugFragment$2 -> com.batch.android.k.e$b: +# {"id":"sourceFile","fileName":"UserDataDebugFragment.java"} + com.batch.android.debug.fragment.UserDataDebugFragment this$0 -> a + 1:1:void (com.batch.android.debug.fragment.UserDataDebugFragment):88:88 -> + 1:2:void onError():99:100 -> onError + 1:4:void onSuccess(java.util.Map):91:94 -> onSuccess +com.batch.android.debug.view.NestedListView -> com.batch.android.debug.view.NestedListView: +# {"id":"sourceFile","fileName":"NestedListView.java"} + android.view.ViewGroup$LayoutParams layoutParams -> b + int MAXIMUM_LIST_ITEMS_VIEWABLE -> c + int listViewTouchAction -> a + 1:5:void (android.content.Context,android.util.AttributeSet):19:23 -> + 1:32:void onMeasure(int,int):40:71 -> onMeasure + 1:3:void onScroll(android.widget.AbsListView,int,int,int):28:30 -> onScroll + 1:3:boolean onTouch(android.view.View,android.view.MotionEvent):76:78 -> onTouch +com.batch.android.di.DI -> com.batch.android.l.a: +# {"id":"sourceFile","fileName":"DI.java"} + java.util.Map singletonInstances -> a + com.batch.android.di.DI instance -> c + java.lang.String TAG -> b + 1:2:void ():29:30 -> + 1:1:void clear():34:34 -> a + 2:3:java.lang.Object getSingletonInstance(java.lang.Class):46:47 -> a + 4:4:void addSingletonInstance(java.lang.Class,java.lang.Object):61:61 -> a + 1:4:com.batch.android.di.DI getInstance():15:18 -> b + 1:2:void reset():22:23 -> c +com.batch.android.di.providers.ActionModuleProvider -> com.batch.android.m.a: +# {"id":"sourceFile","fileName":"ActionModuleProvider.java"} + 1:1:void ():11:11 -> + 1:6:com.batch.android.module.ActionModule get():14:19 -> a + 1:1:com.batch.android.module.ActionModule getSingleton():25:25 -> b +com.batch.android.di.providers.ActionOutputProvider -> com.batch.android.m.b: +# {"id":"sourceFile","fileName":"ActionOutputProvider.java"} + 1:1:void ():10:10 -> + 1:1:com.batch.android.localcampaigns.output.ActionOutput get(com.batch.android.json.JSONObject):13:13 -> a +com.batch.android.di.providers.AdvertisingIDProvider -> com.batch.android.m.c: +# {"id":"sourceFile","fileName":"AdvertisingIDProvider.java"} + 1:1:void ():11:11 -> + 1:6:com.batch.android.AdvertisingID get():14:19 -> a + 1:1:com.batch.android.AdvertisingID getSingleton():25:25 -> b +com.batch.android.di.providers.BatchModuleMasterProvider -> com.batch.android.m.d: +# {"id":"sourceFile","fileName":"BatchModuleMasterProvider.java"} + 1:1:void ():11:11 -> + 1:6:com.batch.android.module.BatchModuleMaster get():14:19 -> a + 1:1:com.batch.android.module.BatchModuleMaster getSingleton():25:25 -> b +com.batch.android.di.providers.BatchNotificationChannelsManagerProvider -> com.batch.android.m.e: +# {"id":"sourceFile","fileName":"BatchNotificationChannelsManagerProvider.java"} + 1:1:void ():11:11 -> + 1:6:com.batch.android.BatchNotificationChannelsManager get():14:19 -> a + 1:1:com.batch.android.BatchNotificationChannelsManager getSingleton():25:25 -> b +com.batch.android.di.providers.CampaignManagerProvider -> com.batch.android.m.f: +# {"id":"sourceFile","fileName":"CampaignManagerProvider.java"} + 1:1:void ():11:11 -> + 1:6:com.batch.android.localcampaigns.CampaignManager get():14:19 -> a + 1:1:com.batch.android.localcampaigns.CampaignManager getSingleton():25:25 -> b +com.batch.android.di.providers.DisplayReceiptModuleProvider -> com.batch.android.m.g: +# {"id":"sourceFile","fileName":"DisplayReceiptModuleProvider.java"} + 1:1:void ():11:11 -> + 1:6:com.batch.android.module.DisplayReceiptModule get():14:19 -> a + 1:1:com.batch.android.module.DisplayReceiptModule getSingleton():25:25 -> b +com.batch.android.di.providers.EmbeddedBannerContainerProvider -> com.batch.android.m.h: +# {"id":"sourceFile","fileName":"EmbeddedBannerContainerProvider.java"} + 1:1:void ():13:13 -> + 1:1:com.batch.android.messaging.view.formats.EmbeddedBannerContainer get(android.view.View,com.batch.android.BatchMessage,com.batch.android.messaging.model.BannerMessage,com.batch.android.MessagingAnalyticsDelegate,boolean):18:18 -> a +com.batch.android.di.providers.EventDispatcherModuleProvider -> com.batch.android.m.i: +# {"id":"sourceFile","fileName":"EventDispatcherModuleProvider.java"} + 1:1:void ():11:11 -> + 1:6:com.batch.android.module.EventDispatcherModule get():14:19 -> a + 1:1:com.batch.android.module.EventDispatcherModule getSingleton():25:25 -> b +com.batch.android.di.providers.InboxDatasourceProvider -> com.batch.android.m.j: +# {"id":"sourceFile","fileName":"InboxDatasourceProvider.java"} + 1:1:void ():12:12 -> + 1:6:com.batch.android.inbox.InboxDatasource get(android.content.Context):15:20 -> a + 7:7:com.batch.android.inbox.InboxDatasource getSingleton():26:26 -> a +com.batch.android.di.providers.InboxFetcherInternalProvider -> com.batch.android.m.k: +# {"id":"sourceFile","fileName":"InboxFetcherInternalProvider.java"} + 1:1:void ():11:11 -> + 1:1:com.batch.android.inbox.InboxFetcherInternal get(android.content.Context,java.lang.String):14:14 -> a + 2:2:com.batch.android.inbox.InboxFetcherInternal get(android.content.Context,java.lang.String,boolean):20:20 -> a + 3:3:com.batch.android.inbox.InboxFetcherInternal get(android.content.Context,java.lang.String,java.lang.String):26:26 -> a + 4:4:com.batch.android.inbox.InboxFetcherInternal get(android.content.Context,java.lang.String,java.lang.String,boolean):32:32 -> a +com.batch.android.di.providers.KVUserPreferencesStorageProvider -> com.batch.android.m.l: +# {"id":"sourceFile","fileName":"KVUserPreferencesStorageProvider.java"} + 1:1:void ():12:12 -> + 1:6:com.batch.android.core.KVUserPreferencesStorage get(android.content.Context):15:20 -> a + 7:7:com.batch.android.core.KVUserPreferencesStorage getSingleton():26:26 -> a +com.batch.android.di.providers.LandingOutputProvider -> com.batch.android.m.m: +# {"id":"sourceFile","fileName":"LandingOutputProvider.java"} + 1:1:void ():10:10 -> + 1:1:com.batch.android.localcampaigns.output.LandingOutput get(com.batch.android.json.JSONObject):13:13 -> a +com.batch.android.di.providers.LocalBroadcastManagerProvider -> com.batch.android.m.n: +# {"id":"sourceFile","fileName":"LocalBroadcastManagerProvider.java"} + 1:1:void ():12:12 -> + 1:6:com.batch.android.compat.LocalBroadcastManager get(android.content.Context):15:20 -> a + 7:7:com.batch.android.compat.LocalBroadcastManager getSingleton():26:26 -> a +com.batch.android.di.providers.LocalCampaignsModuleProvider -> com.batch.android.m.o: +# {"id":"sourceFile","fileName":"LocalCampaignsModuleProvider.java"} + 1:1:void ():11:11 -> + 1:6:com.batch.android.module.LocalCampaignsModule get():14:19 -> a + 1:1:com.batch.android.module.LocalCampaignsModule getSingleton():25:25 -> b +com.batch.android.di.providers.LocalCampaignsWebserviceListenerImplProvider -> com.batch.android.m.p: +# {"id":"sourceFile","fileName":"LocalCampaignsWebserviceListenerImplProvider.java"} + 1:1:void ():9:9 -> + 1:1:com.batch.android.webservice.listener.impl.LocalCampaignsWebserviceListenerImpl get():12:12 -> a +com.batch.android.di.providers.MessagingAnalyticsDelegateProvider -> com.batch.android.m.q: +# {"id":"sourceFile","fileName":"MessagingAnalyticsDelegateProvider.java"} + 1:1:void ():11:11 -> + 1:1:com.batch.android.MessagingAnalyticsDelegate get(com.batch.android.messaging.model.Message,com.batch.android.BatchMessage):14:14 -> a +com.batch.android.di.providers.MessagingModuleProvider -> com.batch.android.m.r: +# {"id":"sourceFile","fileName":"MessagingModuleProvider.java"} + 1:1:void ():11:11 -> + 1:6:com.batch.android.module.MessagingModule get():14:19 -> a + 1:1:com.batch.android.module.MessagingModule getSingleton():25:25 -> b +com.batch.android.di.providers.MetricManagerProvider -> com.batch.android.m.s: +# {"id":"sourceFile","fileName":"MetricManagerProvider.java"} + 1:1:void ():11:11 -> + 1:6:com.batch.android.metrics.MetricManager get():14:19 -> a + 1:1:com.batch.android.metrics.MetricManager getSingleton():25:25 -> b +com.batch.android.di.providers.ObjectUserPreferencesStorageProvider -> com.batch.android.m.t: +# {"id":"sourceFile","fileName":"ObjectUserPreferencesStorageProvider.java"} + 1:1:void ():12:12 -> + 1:6:com.batch.android.core.ObjectUserPreferencesStorage get(android.content.Context):15:20 -> a + 7:7:com.batch.android.core.ObjectUserPreferencesStorage getSingleton():26:26 -> a +com.batch.android.di.providers.OptOutModuleProvider -> com.batch.android.m.u: +# {"id":"sourceFile","fileName":"OptOutModuleProvider.java"} + 1:1:void ():11:11 -> + 1:6:com.batch.android.module.OptOutModule get():14:19 -> a + 1:1:com.batch.android.module.OptOutModule getSingleton():25:25 -> b +com.batch.android.di.providers.ParametersProvider -> com.batch.android.m.v: +# {"id":"sourceFile","fileName":"ParametersProvider.java"} + 1:1:void ():12:12 -> + 1:6:com.batch.android.core.Parameters get(android.content.Context):15:20 -> a + 7:7:com.batch.android.core.Parameters getSingleton():26:26 -> a +com.batch.android.di.providers.PushModuleProvider -> com.batch.android.m.w: +# {"id":"sourceFile","fileName":"PushModuleProvider.java"} + 1:1:void ():11:11 -> + 1:6:com.batch.android.module.PushModule get():14:19 -> a + 1:1:com.batch.android.module.PushModule getSingleton():25:25 -> b +com.batch.android.di.providers.RuntimeManagerProvider -> com.batch.android.m.x: +# {"id":"sourceFile","fileName":"RuntimeManagerProvider.java"} + 1:1:void ():11:11 -> + 1:6:com.batch.android.runtime.RuntimeManager get():14:19 -> a + 1:1:com.batch.android.runtime.RuntimeManager getSingleton():25:25 -> b +com.batch.android.di.providers.SQLUserDatasourceProvider -> com.batch.android.m.y: +# {"id":"sourceFile","fileName":"SQLUserDatasourceProvider.java"} + 1:1:void ():12:12 -> + 1:6:com.batch.android.user.SQLUserDatasource get(android.content.Context):15:20 -> a + 7:7:com.batch.android.user.SQLUserDatasource getSingleton():26:26 -> a +com.batch.android.di.providers.SecureDateProviderProvider -> com.batch.android.m.z: +# {"id":"sourceFile","fileName":"SecureDateProviderProvider.java"} + 1:1:void ():11:11 -> + 1:6:com.batch.android.core.SecureDateProvider get():14:19 -> a + 1:1:com.batch.android.core.SecureDateProvider getSingleton():25:25 -> b +com.batch.android.di.providers.TaskExecutorProvider -> com.batch.android.m.a0: +# {"id":"sourceFile","fileName":"TaskExecutorProvider.java"} + 1:1:void ():12:12 -> + 1:6:com.batch.android.core.TaskExecutor get(android.content.Context):15:20 -> a + 7:7:com.batch.android.core.TaskExecutor getSingleton():26:26 -> a +com.batch.android.di.providers.TrackerModuleProvider -> com.batch.android.m.b0: +# {"id":"sourceFile","fileName":"TrackerModuleProvider.java"} + 1:1:void ():11:11 -> + 1:6:com.batch.android.module.TrackerModule get():14:19 -> a + 1:1:com.batch.android.module.TrackerModule getSingleton():25:25 -> b +com.batch.android.di.providers.UserModuleProvider -> com.batch.android.m.c0: +# {"id":"sourceFile","fileName":"UserModuleProvider.java"} + 1:1:void ():11:11 -> + 1:6:com.batch.android.module.UserModule get():14:19 -> a + 1:1:com.batch.android.module.UserModule getSingleton():25:25 -> b +com.batch.android.di.providers.WebserviceMetricsProvider -> com.batch.android.m.d0: +# {"id":"sourceFile","fileName":"WebserviceMetricsProvider.java"} + 1:1:void ():11:11 -> + 1:6:com.batch.android.WebserviceMetrics get():14:19 -> a + 1:1:com.batch.android.WebserviceMetrics getSingleton():25:25 -> b +com.batch.android.displayreceipt.CacheHelper -> com.batch.android.n.a: +# {"id":"sourceFile","fileName":"CacheHelper.java"} + long MAX_AGE_FROM_CACHE -> e + java.lang.String TAG -> a + int MAX_READ_RECEIPT_FROM_CACHE -> d + java.lang.String CACHE_FILE_FORMAT -> c + java.lang.String CACHE_DIR -> b + 1:1:void ():21:21 -> + 1:2:java.lang.String generateNewFilename(long):48:49 -> a + 3:7:java.lang.Long getTimestampFromFilename(java.lang.String):54:58 -> a + 8:14:java.io.File write(android.content.Context,long,byte[]):82:88 -> a + 15:22:boolean write(java.io.File,byte[]):96:103 -> a + 23:26:boolean write(java.io.File,byte[]):96:99 -> a + 27:39:boolean deleteDirectory(java.io.File):114:126 -> a + 40:41:boolean deleteAll(android.content.Context):136:137 -> a + 42:55:java.util.List getCachedFiles(android.content.Context,boolean):150:163 -> a + 56:78:java.util.List filterCachedFiles(java.io.File[]):171:193 -> a + 79:79:int lambda$filterCachedFiles$0(java.util.Map$Entry,java.util.Map$Entry):189:189 -> a + 1:3:java.io.File getCacheDir(android.content.Context):38:40 -> b + 4:9:byte[] read(java.io.File):68:73 -> b + 10:13:byte[] read(java.io.File):71:74 -> b +com.batch.android.displayreceipt.DisplayReceipt -> com.batch.android.n.b: +# {"id":"sourceFile","fileName":"DisplayReceipt.java"} + java.lang.String TAG -> f + java.util.Map od -> d + long timestamp -> a + java.util.Map ed -> e + boolean replay -> b + int sendAttempt -> c + 1:6:void (long,boolean,int,java.util.Map,java.util.Map):28:33 -> + 1:1:void setReplay(boolean):37:37 -> a + 2:2:java.util.Map getEd():49:49 -> a + 3:4:byte[] packAndWrite(java.io.File):65:66 -> a + 5:5:void writeTo(com.batch.android.msgpack.core.MessageBufferPacker):73:73 -> a + 6:20:void pack(com.batch.android.msgpack.core.MessageBufferPacker,long,boolean,int,java.util.Map,java.util.Map):84:98 -> a + 21:25:byte[] pack(long,boolean,int,java.util.Map,java.util.Map):108:112 -> a + 26:31:byte[] pack(long,boolean,int,java.util.Map,java.util.Map):108:113 -> a + 32:62:com.batch.android.displayreceipt.DisplayReceipt unpack(byte[]):120:150 -> a + 63:94:com.batch.android.displayreceipt.DisplayReceipt unpack(byte[]):120:151 -> a + 1:1:java.util.Map getOd():45:45 -> b + 1:1:int getSendAttempt():61:61 -> c + 1:1:long getTimestamp():53:53 -> d + 1:1:void incrementSendAttempt():41:41 -> e + 1:1:boolean isReplay():57:57 -> f +com.batch.android.event.CollapsibleEvent -> com.batch.android.o.a: +# {"id":"sourceFile","fileName":"CollapsibleEvent.java"} + 1:1:void (android.content.Context,long,java.lang.String,com.batch.android.json.JSONObject):15:15 -> + 2:2:void (java.lang.String,java.lang.String,java.util.Date,java.util.TimeZone,java.lang.String,com.batch.android.event.Event$State,java.lang.Long,java.util.Date,java.lang.String):29:29 -> +com.batch.android.event.Event -> com.batch.android.o.b: +# {"id":"sourceFile","fileName":"Event.java"} + java.util.Date secureDate -> f + java.lang.String parameters -> g + java.lang.String session -> i + java.util.Date date -> c + com.batch.android.event.Event$State state -> h + long servertime -> e + java.lang.String id -> a + java.util.TimeZone timezone -> d + java.lang.String name -> b + 1:35:void (android.content.Context,long,java.lang.String,com.batch.android.json.JSONObject):72:106 -> + 36:41:void (android.content.Context,long,java.lang.String,com.batch.android.json.JSONObject):104:109 -> + 42:42:void (android.content.Context,long,java.lang.String,com.batch.android.json.JSONObject):74:74 -> + 43:52:void (java.lang.String,java.lang.String,java.util.Date,java.util.TimeZone,java.lang.String,com.batch.android.event.Event$State,java.lang.Long,java.util.Date,java.lang.String):133:142 -> + 1:1:java.util.Date getDate():156:156 -> a + 1:1:java.lang.String getId():148:148 -> b + 1:1:java.lang.String getName():152:152 -> c + 1:1:java.lang.String getParameters():168:168 -> d + 1:1:java.util.Date getSecureDate():160:160 -> e + 1:1:long getServerTimestamp():176:176 -> f + 1:1:java.lang.String getSessionID():184:184 -> g + 1:1:com.batch.android.event.Event$State getState():172:172 -> h + 1:1:java.util.TimeZone getTimezone():164:164 -> i + 1:1:boolean isOld():180:180 -> j +com.batch.android.event.Event$State -> com.batch.android.o.b$a: +# {"id":"sourceFile","fileName":"Event.java"} + com.batch.android.event.Event$State NEW -> b + com.batch.android.event.Event$State SENDING -> c + com.batch.android.event.Event$State OLD -> d + com.batch.android.event.Event$State[] $VALUES -> e + int value -> a + 1:11:void ():197:207 -> + 12:12:void ():193:193 -> + 1:2:void (java.lang.String,int,int):213:214 -> + 1:1:com.batch.android.event.Event$State[] $values():193:193 -> a + 2:3:com.batch.android.event.Event$State fromValue(int):224:225 -> a + 1:1:int getValue():218:218 -> b + 1:1:com.batch.android.event.Event$State valueOf(java.lang.String):193:193 -> valueOf + 1:1:com.batch.android.event.Event$State[] values():193:193 -> values +com.batch.android.event.EventSender -> com.batch.android.o.c: +# {"id":"sourceFile","fileName":"EventSender.java"} + java.lang.String TAG -> g + java.util.concurrent.ExecutorService sendExecutor -> e + java.util.concurrent.atomic.AtomicBoolean hasNewEvents -> d + java.util.concurrent.atomic.AtomicBoolean isSending -> c + com.batch.android.event.RetryTimer retryTimer -> f + com.batch.android.runtime.RuntimeManager runtimeManager -> a + com.batch.android.event.EventSender$EventSenderListener listener -> b + 1:1:void (com.batch.android.runtime.RuntimeManager,com.batch.android.event.EventSender$EventSenderListener):54:54 -> + 2:32:void (com.batch.android.runtime.RuntimeManager,com.batch.android.event.EventSender$EventSenderListener):35:65 -> + 33:33:void (com.batch.android.runtime.RuntimeManager,com.batch.android.event.EventSender$EventSenderListener):60:60 -> + 34:34:void (com.batch.android.runtime.RuntimeManager,com.batch.android.event.EventSender$EventSenderListener):56:56 -> + 1:1:com.batch.android.event.RetryTimer access$000(com.batch.android.event.EventSender):20:20 -> a + 2:11:void send(boolean):81:90 -> a + 12:12:void retry():163:163 -> a + 13:13:com.batch.android.core.TaskRunnable getWebserviceTask(java.util.List,com.batch.android.webservice.listener.TrackerWebserviceListener):174:174 -> a + 1:1:java.util.concurrent.atomic.AtomicBoolean access$100(com.batch.android.event.EventSender):20:20 -> b + 2:3:void hasNewEvents():154:155 -> b + 1:1:com.batch.android.event.EventSender$EventSenderListener access$200(com.batch.android.event.EventSender):20:20 -> c + 2:49:void lambda$send$0():97:144 -> c + 1:2:void lambda$send$1():92:93 -> d + 1:1:void send():72:72 -> e +com.batch.android.event.EventSender$1 -> com.batch.android.o.c$a: +# {"id":"sourceFile","fileName":"EventSender.java"} + com.batch.android.event.EventSender this$0 -> a + 1:1:void (com.batch.android.event.EventSender):110:110 -> + 1:4:void onSuccess(java.util.List):114:117 -> a + 5:8:void onFailure(com.batch.android.FailReason,java.util.List):127:130 -> a + 9:10:void lambda$onFailure$1(java.util.List,com.batch.android.runtime.State):131:132 -> a + 11:11:void onFinish():140:140 -> a + 1:2:void lambda$onSuccess$0(java.util.List,com.batch.android.runtime.State):118:119 -> b +com.batch.android.event.EventSender$EventSenderListener -> com.batch.android.o.c$b: +# {"id":"sourceFile","fileName":"EventSender.java"} + java.util.List getEventsToSend() -> a + void onEventsSendFailure(java.util.List) -> a + void onEventsSendSuccess(java.util.List) -> b +com.batch.android.event.InternalEvents -> com.batch.android.o.d: +# {"id":"sourceFile","fileName":"InternalEvents.java"} + java.lang.String INSTALL_DATA_CHANGED -> g + java.lang.String PROFILE_CHANGED -> f + java.lang.String EMAIL_CHANGED -> i + java.lang.String INSTALL_DATA_CHANGED_TRACK_FAILURE -> h + java.lang.String NOTIFICATION_STATUS_CHANGE -> k + java.lang.String LOCATION_CHANGED -> j + java.lang.String INBOX_MARK_AS_DELETED -> m + java.lang.String INBOX_MARK_AS_READ -> l + java.lang.String OPT_IN -> o + java.lang.String INBOX_MARK_ALL_AS_READ -> n + java.lang.String OPT_OUT_AND_WIPE_DATA -> q + java.lang.String OPT_OUT -> p + java.lang.String FIND_MY_INSTALLATION -> r + java.lang.String START -> a + java.lang.String OPEN_FROM_PUSH -> c + java.lang.String STOP -> b + java.lang.String LOCAL_CAMPAIGN_VIEWED -> e + java.lang.String MESSAGING -> d + 1:1:void ():8:8 -> +com.batch.android.event.RetryTimer -> com.batch.android.o.e: +# {"id":"sourceFile","fileName":"RetryTimer.java"} + java.util.TimerTask retryTask -> f + java.lang.String TAG -> h + com.batch.android.event.RetryTimer$RetryTimerListener listener -> g + int MAX_RETRIES -> i + int nextRetryDelay -> d + int initialRetryDelay -> b + int maxRetryDelay -> c + int retries -> a + java.util.Timer retryTimer -> e + 1:1:void (android.content.Context,com.batch.android.event.RetryTimer$RetryTimerListener):56:56 -> + 2:48:void (android.content.Context,com.batch.android.event.RetryTimer$RetryTimerListener):24:70 -> + 49:49:void (android.content.Context,com.batch.android.event.RetryTimer$RetryTimerListener):62:62 -> + 50:50:void (android.content.Context,com.batch.android.event.RetryTimer$RetryTimerListener):58:58 -> + 1:1:int access$008(com.batch.android.event.RetryTimer):13:13 -> a + 2:9:void incrementDelay():126:133 -> a + 1:1:com.batch.android.event.RetryTimer$RetryTimerListener access$100(com.batch.android.event.RetryTimer):13:13 -> b + 2:2:boolean isWaiting():79:79 -> b + 1:18:void reschedule():87:104 -> c + 1:7:void reset():113:119 -> d +com.batch.android.event.RetryTimer$1 -> com.batch.android.o.e$a: +# {"id":"sourceFile","fileName":"RetryTimer.java"} + com.batch.android.event.RetryTimer this$0 -> a + 1:1:void (com.batch.android.event.RetryTimer):92:92 -> + 1:2:void run():95:96 -> run +com.batch.android.event.RetryTimer$RetryTimerListener -> com.batch.android.o.e$b: +# {"id":"sourceFile","fileName":"RetryTimer.java"} + void retry() -> a +com.batch.android.eventdispatcher.DispatcherDiscoveryService -> com.batch.android.eventdispatcher.DispatcherDiscoveryService: +# {"id":"sourceFile","fileName":"DispatcherDiscoveryService.java"} + 1:1:void ():11:11 -> +com.batch.android.eventdispatcher.DispatcherRegistrar -> com.batch.android.eventdispatcher.DispatcherRegistrar: +# {"id":"sourceFile","fileName":"DispatcherRegistrar.java"} +com.batch.android.eventdispatcher.DispatcherSerializer -> com.batch.android.p.a: +# {"id":"sourceFile","fileName":"DispatcherSerializer.java"} + java.lang.String CUSTOM_DISPATCHER_NAME -> g + java.lang.String BATCH_PIANO_NAME -> f + java.lang.String FIREBASE_DISPATCHER_NAME -> a + java.util.List knownDispatchers -> h + java.lang.String MIXPANEL_DISPATCHER_NAME -> c + java.lang.String AT_INTERNET_DISPATCHER_NAME -> b + java.lang.String BATCH_PLUGINS_DISPATCHER_NAME -> e + java.lang.String GOOGLE_ANALYTICS_DISPATCHER_NAME -> d + 1:1:void ():28:28 -> + 1:1:void ():14:14 -> + 1:10:com.batch.android.json.JSONObject serialize(java.util.Set):45:54 -> a +com.batch.android.eventdispatcher.MessagingEventPayload -> com.batch.android.p.b: +# {"id":"sourceFile","fileName":"MessagingEventPayload.java"} + com.batch.android.json.JSONObject payload -> b + com.batch.android.json.JSONObject customPayload -> c + com.batch.android.messaging.model.Action action -> d + java.lang.String buttonAnalyticsId -> e + com.batch.android.BatchMessage message -> a + 1:1:void (com.batch.android.BatchMessage,com.batch.android.json.JSONObject,com.batch.android.json.JSONObject):26:26 -> + 2:7:void (com.batch.android.BatchMessage,com.batch.android.json.JSONObject,com.batch.android.json.JSONObject,com.batch.android.messaging.model.Action,java.lang.String):35:40 -> + 8:8:void (com.batch.android.BatchMessage,com.batch.android.json.JSONObject,com.batch.android.json.JSONObject,com.batch.android.messaging.model.Action):44:44 -> + 1:6:java.lang.String getCustomValue(java.lang.String):82:87 -> getCustomValue + 1:2:java.lang.String getDeeplink():65:66 -> getDeeplink + 1:1:com.batch.android.BatchMessage getMessagingPayload():93:93 -> getMessagingPayload + 1:2:java.lang.String getTrackingId():50:51 -> getTrackingId + 1:1:java.lang.String getWebViewAnalyticsID():59:59 -> getWebViewAnalyticsID + 1:1:boolean isPositiveAction():73:73 -> isPositiveAction +com.batch.android.eventdispatcher.PushEventPayload -> com.batch.android.p.c: +# {"id":"sourceFile","fileName":"PushEventPayload.java"} + com.batch.android.BatchPushPayload payload -> a + boolean isOpening -> b + 1:1:void (com.batch.android.BatchPushPayload):20:20 -> + 2:4:void (com.batch.android.BatchPushPayload,boolean):23:25 -> + 1:5:java.lang.String getCustomValue(java.lang.String):55:59 -> getCustomValue + 1:1:java.lang.String getDeeplink():44:44 -> getDeeplink + 1:1:com.batch.android.BatchPushPayload getPushPayload():71:71 -> getPushPayload + 1:1:boolean isPositiveAction():49:49 -> isPositiveAction +com.batch.android.inbox.FetcherType -> com.batch.android.q.a: +# {"id":"sourceFile","fileName":"FetcherType.java"} + com.batch.android.inbox.FetcherType[] $VALUES -> d + com.batch.android.inbox.FetcherType USER_IDENTIFIER -> c + com.batch.android.inbox.FetcherType INSTALLATION -> b + int value -> a + 1:2:void ():4:5 -> + 3:3:void () -> + 1:2:void (java.lang.String,int,int):9:10 -> + 1:1:com.batch.android.inbox.FetcherType[] $values():3:3 -> a + 1:1:int getValue():14:14 -> b + 1:6:java.lang.String toWSPathElement():18:23 -> c + 1:1:com.batch.android.inbox.FetcherType valueOf(java.lang.String):3:3 -> valueOf + 1:1:com.batch.android.inbox.FetcherType[] values():3:3 -> values +com.batch.android.inbox.FetcherType$1 -> com.batch.android.q.a$a: +# {"id":"sourceFile","fileName":"FetcherType.java"} + int[] $SwitchMap$com$batch$android$inbox$FetcherType -> a + 1:1:void ():18:18 -> +com.batch.android.inbox.InboxCandidateNotificationInternal -> com.batch.android.q.b: +# {"id":"sourceFile","fileName":"InboxCandidateNotificationInternal.java"} + java.lang.String identifier -> a + boolean isUnread -> b + 1:3:void (java.lang.String,boolean):14:16 -> +com.batch.android.inbox.InboxDatabaseHelper -> com.batch.android.q.c: +# {"id":"sourceFile","fileName":"InboxDatabaseHelper.java"} + java.lang.String COLUMN_INSTALL_ID -> g + java.lang.String COLUMN_FETCHER_ID -> f + java.lang.String TABLE_NOTIFICATIONS -> i + java.lang.String COLUMN_CUSTOM_ID -> h + java.lang.String COLUMN_SEND_ID -> k + java.lang.String COLUMN_NOTIFICATION_ID -> j + java.lang.String COLUMN_BODY -> m + java.lang.String COLUMN_TITLE -> l + java.lang.String COLUMN_DELETED -> o + java.lang.String COLUMN_UNREAD -> n + java.lang.String COLUMN_PAYLOAD -> q + java.lang.String COLUMN_DATE -> p + java.lang.String DATABASE_NAME -> r + java.lang.String COLUMN_DB_ID -> a + java.lang.String COLUMN_FETCHER_TYPE -> c + java.lang.String TABLE_FETCHERS -> b + int DATABASE_VERSION -> s + java.lang.String TABLE_FETCHERS_NOTIFICATIONS -> e + java.lang.String COLUMN_FETCHER_IDENTIFIER -> d + 1:1:void (android.content.Context):41:41 -> + 1:51:void onCreate(android.database.sqlite.SQLiteDatabase):46:96 -> onCreate + 1:1:void onUpgrade(android.database.sqlite.SQLiteDatabase,int,int):135:135 -> onUpgrade +com.batch.android.inbox.InboxDatasource -> com.batch.android.q.d: +# {"id":"sourceFile","fileName":"InboxDatasource.java"} + android.content.Context context -> a + android.database.sqlite.SQLiteDatabase database -> b + com.batch.android.inbox.InboxDatabaseHelper databaseHelper -> c + java.lang.String TAG -> d + 1:8:void (android.content.Context):48:55 -> + 9:9:void (android.content.Context):50:50 -> + 1:51:java.util.List getNotifications(java.util.List,long):92:142 -> a + 52:60:java.util.List getNotifications(java.util.List,long):135:143 -> a + 61:75:long getNotificationTime(java.lang.String):151:165 -> a + 76:92:long getNotificationTime(java.lang.String):150:166 -> a + 93:124:long getFetcherID(com.batch.android.inbox.FetcherType,java.lang.String):180:211 -> a + 125:148:long getFetcherID(com.batch.android.inbox.FetcherType,java.lang.String):204:227 -> a + 149:168:long getFetcherID(com.batch.android.inbox.FetcherType,java.lang.String):203:222 -> a + 169:211:java.util.List getCandidateNotifications(java.lang.String,int,long):243:285 -> a + 212:221:java.util.List getCandidateNotifications(java.lang.String,int,long):283:292 -> a + 222:273:java.util.List getCandidateNotifications(java.lang.String,int,long):282:333 -> a + 274:280:java.util.List getCandidateNotifications(java.lang.String,int,long):328:334 -> a + 281:283:boolean insertResponse(com.batch.android.inbox.InboxWebserviceResponse,long):351:353 -> a + 284:331:boolean insert(com.batch.android.inbox.InboxNotificationContentInternal,long):367:414 -> a + 332:341:boolean insert(com.batch.android.inbox.InboxNotificationContentInternal,long):411:420 -> a + 342:342:boolean insert(com.batch.android.inbox.InboxNotificationContentInternal,long):373:373 -> a + 343:381:java.lang.String updateNotification(com.batch.android.json.JSONObject,long):436:474 -> a + 382:383:java.lang.String updateNotification(com.batch.android.json.JSONObject,long):469:470 -> a + 384:385:java.lang.String updateNotification(com.batch.android.json.JSONObject,long):465:466 -> a + 386:387:java.lang.String updateNotification(com.batch.android.json.JSONObject,long):461:462 -> a + 388:391:java.lang.String updateNotification(com.batch.android.json.JSONObject,long):455:458 -> a + 392:393:java.lang.String updateNotification(com.batch.android.json.JSONObject,long):451:452 -> a + 394:395:java.lang.String updateNotification(com.batch.android.json.JSONObject,long):447:448 -> a + 396:455:java.lang.String updateNotification(com.batch.android.json.JSONObject,long):443:502 -> a + 456:474:java.lang.String updateNotification(com.batch.android.json.JSONObject,long):495:513 -> a + 475:498:int markAllAsRead(long,long):526:549 -> a + 499:499:int markAllAsRead(long,long):529:529 -> a + 500:510:boolean deleteNotifications(java.util.List):592:602 -> a + 511:519:boolean deleteNotifications(java.util.List):600:608 -> a + 520:531:boolean deleteNotifications(java.util.List):606:617 -> a + 532:536:boolean deleteNotifications(java.util.List):614:618 -> a + 537:544:boolean cleanDatabase():627:634 -> a + 545:565:boolean cleanDatabase():630:650 -> a + 566:588:boolean cleanDatabase():629:651 -> a + 589:591:com.batch.android.inbox.InboxCandidateNotificationInternal parseCandidateNotification(android.database.Cursor):718:720 -> a + 592:600:java.lang.String createInClause(int):732:740 -> a + 1:3:void close():76:78 -> b + 4:6:void markNotificationAsDeleted(java.lang.String):575:577 -> b + 7:47:com.batch.android.inbox.InboxNotificationContentInternal parseNotification(android.database.Cursor):664:704 -> b + 1:1:android.database.sqlite.SQLiteDatabase getDatabase():88:88 -> c + 2:4:void markNotificationAsRead(java.lang.String):559:561 -> c + 1:8:void wipeData():62:69 -> d +com.batch.android.inbox.InboxFetchWebserviceClient -> com.batch.android.q.e: +# {"id":"sourceFile","fileName":"InboxFetchWebserviceClient.java"} + com.batch.android.webservice.listener.InboxWebserviceListener listener -> q + java.lang.String authentication -> p + java.lang.String TAG -> r + long fetcherId -> o + 1:11:void (android.content.Context,com.batch.android.inbox.FetcherType,java.lang.String,java.lang.String,java.lang.Integer,java.lang.String,long,com.batch.android.webservice.listener.InboxWebserviceListener):52:62 -> + 1:1:java.lang.String getSpecificConnectTimeoutKey():238:238 -> A + 1:1:java.lang.String getSpecificReadTimeoutKey():243:243 -> B + 1:1:java.lang.String getSpecificRetryCountKey():248:248 -> C + 1:1:java.lang.String getURLSorterPatternParameterKey():213:213 -> F + java.lang.String getPropertyParameterKey() -> H + 1:1:java.lang.String getTaskIdentifier():79:79 -> a + 1:45:com.batch.android.inbox.InboxNotificationContentInternal parseNotification(com.batch.android.json.JSONObject):153:197 -> c + 1:24:com.batch.android.inbox.InboxWebserviceResponse parseResponse(com.batch.android.json.JSONObject):116:139 -> d + 25:33:com.batch.android.inbox.InboxWebserviceResponse parseResponse(com.batch.android.json.JSONObject):136:144 -> d + java.lang.String getCryptorModeParameterKey() -> o + java.lang.String getCryptorTypeParameterKey() -> p + 1:3:java.util.Map getHeaders():68:70 -> r + 1:27:void run():85:111 -> run + 28:29:void run():107:108 -> run + 30:39:void run():95:104 -> run + java.lang.String getPostCryptorTypeParameterKey() -> v + com.batch.android.post.PostDataProvider getPostDataProvider() -> w + 1:1:java.lang.String getReadCryptorTypeParameterKey():233:233 -> y +com.batch.android.inbox.InboxFetcherInternal -> com.batch.android.q.f: +# {"id":"sourceFile","fileName":"InboxFetcherInternal.java"} + java.lang.String authKey -> g + java.lang.String identifier -> f + boolean filterSilentNotifications -> n + android.content.Context context -> b + boolean isDatabaseCleaned -> p + int fetchLimit -> j + int maxPageSize -> i + boolean endReached -> l + java.lang.String TAG -> o + long fetcherId -> d + java.util.concurrent.Executor fetchExecutor -> k + com.batch.android.inbox.InboxDatasource datasource -> m + com.batch.android.module.TrackerModule trackerModule -> a + com.batch.android.inbox.FetcherType fetcherType -> e + java.util.List fetchedNotifications -> h + java.lang.String cursor -> c + 1:1:void (com.batch.android.module.TrackerModule,com.batch.android.inbox.InboxDatasource,android.content.Context,java.lang.String):74:74 -> + 2:40:void (com.batch.android.module.TrackerModule,com.batch.android.inbox.InboxDatasource,android.content.Context,java.lang.String):45:83 -> + 41:41:void (com.batch.android.module.TrackerModule,com.batch.android.inbox.InboxDatasource,android.content.Context,java.lang.String,java.lang.String):116:116 -> + 42:123:void (com.batch.android.module.TrackerModule,com.batch.android.inbox.InboxDatasource,android.content.Context,java.lang.String,java.lang.String):45:126 -> + 1:1:java.util.List access$000(com.batch.android.inbox.InboxFetcherInternal,com.batch.android.inbox.InboxWebserviceResponse,boolean):35:35 -> a + 2:2:java.util.List access$100(com.batch.android.inbox.InboxFetcherInternal,java.util.List):35:35 -> a + 3:3:java.lang.String access$200(com.batch.android.inbox.InboxFetcherInternal):35:35 -> a + 4:6:com.batch.android.inbox.InboxFetcherInternal provide(android.content.Context,java.lang.String):89:91 -> a + 7:10:com.batch.android.inbox.InboxFetcherInternal provide(android.content.Context,java.lang.String,boolean):104:107 -> a + 11:13:com.batch.android.inbox.InboxFetcherInternal provide(android.content.Context,java.lang.String,java.lang.String):136:138 -> a + 14:17:com.batch.android.inbox.InboxFetcherInternal provide(android.content.Context,java.lang.String,java.lang.String,boolean):153:156 -> a + 18:18:void setFetchLimit(int):164:164 -> a + 19:19:void setFilterSilentNotifications(boolean):168:168 -> a + 20:48:void markAsDeleted(com.batch.android.BatchInboxNotificationContent):221:249 -> a + 49:58:java.util.List convertInternalModelsToPublic(java.util.List):256:265 -> a + 59:98:void fetchNewNotifications(com.batch.android.BatchInboxFetcher$OnNewNotificationsFetchedListener):272:311 -> a + 99:147:void fetchNextPage(com.batch.android.BatchInboxFetcher$OnNextPageFetchedListener):315:363 -> a + 148:164:void fetch(java.lang.String,com.batch.android.webservice.listener.InboxWebserviceListener):367:383 -> a + 165:188:void lambda$fetch$0(com.batch.android.webservice.listener.InboxWebserviceListener,java.lang.String):384:407 -> a + 189:203:void lambda$fetch$0(com.batch.android.webservice.listener.InboxWebserviceListener,java.lang.String):401:415 -> a + 204:204:void runFetchWSClient(com.batch.android.inbox.InboxFetchWebserviceClient):422:422 -> a + 205:236:void lambda$sync$1(com.batch.android.webservice.listener.InboxWebserviceListener,java.lang.String,java.util.List):435:466 -> a + 237:273:java.util.List getEventDatas(com.batch.android.inbox.InboxNotificationContentInternal):478:514 -> a + 274:276:java.util.List getPublicFetchedNotifications():523:525 -> a + 277:284:java.util.List handleFetchSuccess(com.batch.android.inbox.InboxWebserviceResponse,boolean):532:539 -> a + 285:362:java.util.List handleFetchSuccess(com.batch.android.inbox.InboxWebserviceResponse,boolean):534:611 -> a + 1:1:void setMaxPageSize(int):160:160 -> b + 2:2:boolean isEndReached():172:172 -> b + 3:30:void markAsRead(com.batch.android.BatchInboxNotificationContent):176:203 -> b + 31:39:boolean sync(java.lang.String,com.batch.android.webservice.listener.InboxWebserviceListener):426:434 -> b + 1:11:void markAllAsRead():207:217 -> c +com.batch.android.inbox.InboxFetcherInternal$1 -> com.batch.android.q.f$a: +# {"id":"sourceFile","fileName":"InboxFetcherInternal.java"} + com.batch.android.inbox.InboxFetcherInternal this$0 -> a + 1:1:void (com.batch.android.inbox.InboxFetcherInternal):273:273 -> +com.batch.android.inbox.InboxFetcherInternal$2 -> com.batch.android.q.f$b: +# {"id":"sourceFile","fileName":"InboxFetcherInternal.java"} + com.batch.android.BatchInboxFetcher$OnNewNotificationsFetchedListener val$userListener -> a + com.batch.android.inbox.InboxFetcherInternal this$0 -> b + 1:1:void (com.batch.android.inbox.InboxFetcherInternal,com.batch.android.BatchInboxFetcher$OnNewNotificationsFetchedListener):288:288 -> + 1:6:void onSuccess(com.batch.android.inbox.InboxWebserviceResponse):291:296 -> a + 7:14:void onSuccess(com.batch.android.inbox.InboxWebserviceResponse):294:301 -> a + 15:15:void onFailure(java.lang.String):308:308 -> a +com.batch.android.inbox.InboxFetcherInternal$3 -> com.batch.android.q.f$c: +# {"id":"sourceFile","fileName":"InboxFetcherInternal.java"} + com.batch.android.inbox.InboxFetcherInternal this$0 -> a + 1:1:void (com.batch.android.inbox.InboxFetcherInternal):326:326 -> +com.batch.android.inbox.InboxFetcherInternal$4 -> com.batch.android.q.f$d: +# {"id":"sourceFile","fileName":"InboxFetcherInternal.java"} + com.batch.android.BatchInboxFetcher$OnNextPageFetchedListener val$finalListener -> a + com.batch.android.inbox.InboxFetcherInternal this$0 -> b + 1:1:void (com.batch.android.inbox.InboxFetcherInternal,com.batch.android.BatchInboxFetcher$OnNextPageFetchedListener):339:339 -> + 1:7:void onSuccess(com.batch.android.inbox.InboxWebserviceResponse):342:348 -> a + 8:15:void onSuccess(com.batch.android.inbox.InboxWebserviceResponse):346:353 -> a + 16:16:void onFailure(java.lang.String):360:360 -> a +com.batch.android.inbox.InboxFetcherInternal$ResultHandlingError -> com.batch.android.q.f$e: +# {"id":"sourceFile","fileName":"InboxFetcherInternal.java"} + java.lang.String publicMesssage -> a + com.batch.android.inbox.InboxFetcherInternal this$0 -> b + 1:3:void (com.batch.android.inbox.InboxFetcherInternal,java.lang.String,java.lang.String):618:620 -> + 1:1:java.lang.String getPublicMessage():624:624 -> a +com.batch.android.inbox.InboxNotificationContentInternal -> com.batch.android.q.g: +# {"id":"sourceFile","fileName":"InboxNotificationContentInternal.java"} + java.util.Date date -> f + boolean isDeleted -> e + java.util.List duplicateIdentifiers -> i + java.lang.String title -> a + com.batch.android.BatchNotificationSource source -> c + java.lang.String body -> b + com.batch.android.inbox.NotificationIdentifiers identifiers -> h + java.util.Map payload -> g + boolean isUnread -> d + 1:5:void (com.batch.android.BatchNotificationSource,java.util.Date,java.util.Map,com.batch.android.inbox.NotificationIdentifiers):47:51 -> + 1:3:android.os.Bundle getReceiverLikePayload():56:58 -> a + 4:7:void addDuplicateIdentifiers(com.batch.android.inbox.NotificationIdentifiers):64:67 -> a + 1:7:boolean isValid():71:77 -> b +com.batch.android.inbox.InboxSyncWebserviceClient -> com.batch.android.q.h: +# {"id":"sourceFile","fileName":"InboxSyncWebserviceClient.java"} + java.util.List candidates -> q + com.batch.android.post.InboxSyncPostDataProvider dataProvider -> r + com.batch.android.webservice.listener.InboxWebserviceListener listener -> s + java.lang.String authentication -> p + long fetcherId -> o + java.lang.String TAG -> t + 1:13:void (android.content.Context,com.batch.android.inbox.FetcherType,java.lang.String,java.lang.String,java.lang.Integer,java.lang.String,long,java.util.List,com.batch.android.webservice.listener.InboxWebserviceListener):59:71 -> + 1:1:java.lang.String getSpecificConnectTimeoutKey():250:250 -> A + 1:1:java.lang.String getSpecificReadTimeoutKey():255:255 -> B + 1:1:java.lang.String getSpecificRetryCountKey():260:260 -> C + 1:1:java.lang.String getURLSorterPatternParameterKey():225:225 -> F + java.lang.String getPropertyParameterKey() -> H + 1:1:java.lang.String getTaskIdentifier():88:88 -> a + 1:2:boolean isCandidates(java.lang.String):205:206 -> b + 1:66:com.batch.android.inbox.InboxWebserviceResponse computeResponse(com.batch.android.json.JSONObject):120:185 -> c + 67:77:com.batch.android.inbox.InboxWebserviceResponse computeResponse(com.batch.android.json.JSONObject):182:192 -> c + 78:89:com.batch.android.inbox.InboxWebserviceResponse computeResponse(com.batch.android.json.JSONObject):189:200 -> c + java.lang.String getCryptorModeParameterKey() -> o + java.lang.String getCryptorTypeParameterKey() -> p + 1:3:java.util.Map getHeaders():77:79 -> r + 1:21:void run():94:114 -> run + 22:23:void run():110:111 -> run + 24:33:void run():98:107 -> run + 1:1:java.lang.String getPostCryptorTypeParameterKey():240:240 -> v + 1:1:com.batch.android.post.PostDataProvider getPostDataProvider():215:215 -> w + 1:1:java.lang.String getReadCryptorTypeParameterKey():245:245 -> y +com.batch.android.inbox.InboxWebserviceResponse -> com.batch.android.q.i: +# {"id":"sourceFile","fileName":"InboxWebserviceResponse.java"} + java.util.List notifications -> d + boolean hasMore -> a + java.lang.String cursor -> c + boolean didTimeout -> b + 1:10:void ():11:20 -> +com.batch.android.inbox.NotificationIdentifiers -> com.batch.android.q.j: +# {"id":"sourceFile","fileName":"NotificationIdentifiers.java"} + java.lang.String identifier -> a + java.lang.String installID -> c + java.util.Map additionalData -> e + java.lang.String sendID -> b + java.lang.String customID -> d + 1:3:void (java.lang.String,java.lang.String):30:32 -> + 1:1:boolean isValid():36:36 -> a +com.batch.android.inbox.ResponseParsingException -> com.batch.android.q.k: +# {"id":"sourceFile","fileName":"ResponseParsingException.java"} + 1:1:void ():5:5 -> + 2:2:void (java.lang.String):8:8 -> + 3:3:void (java.lang.String,java.lang.Throwable):12:12 -> + 4:4:void (java.lang.Throwable):16:16 -> +com.batch.android.json.JSON -> com.batch.android.json.JSON: +# {"id":"sourceFile","fileName":"JSON.java"} + 1:1:void ():22:22 -> + 1:2:double checkDouble(double):28:29 -> checkDouble + 1:8:java.lang.Boolean toBoolean(java.lang.Object):35:42 -> toBoolean + 1:7:java.lang.Double toDouble(java.lang.Object):49:55 -> toDouble + 1:7:java.lang.Integer toInteger(java.lang.Object):62:68 -> toInteger + 1:7:java.lang.Long toLong(java.lang.Object):75:81 -> toLong + 1:4:java.lang.String toString(java.lang.Object):88:91 -> toString + 1:9:com.batch.android.json.JSONException typeMismatch(java.lang.Object,java.lang.Object,java.lang.String):99:107 -> typeMismatch + 10:16:com.batch.android.json.JSONException typeMismatch(java.lang.Object,java.lang.String):116:122 -> typeMismatch +com.batch.android.json.JSONArray -> com.batch.android.json.JSONArray: +# {"id":"sourceFile","fileName":"JSONArray.java"} + 1:2:void ():58:59 -> + 3:6:void (java.util.Collection):72:75 -> + 7:16:void (com.batch.android.json.JSONTokener):89:98 -> + 17:17:void (java.lang.String):110:110 -> + 18:25:void (java.lang.Object):116:123 -> + 26:26:void (java.lang.Object):118:118 -> + 1:5:void checkedPut(java.lang.Object):195:199 -> checkedPut + 1:1:boolean equals(java.lang.Object):623:623 -> equals + 1:7:java.lang.Object get(int):289:295 -> get + 1:6:boolean getBoolean(int):329:334 -> getBoolean + 7:7:boolean getBoolean(int):332:332 -> getBoolean + 1:6:double getDouble(int):363:368 -> getDouble + 7:7:double getDouble(int):366:366 -> getDouble + 1:6:int getInt(int):397:402 -> getInt + 7:7:int getInt(int):400:400 -> getInt + 1:5:com.batch.android.json.JSONArray getJSONArray(int):498:502 -> getJSONArray + 1:5:com.batch.android.json.JSONObject getJSONObject(int):523:527 -> getJSONObject + 1:6:long getLong(int):431:436 -> getLong + 7:7:long getLong(int):434:434 -> getLong + 1:4:java.lang.String getString(int):464:467 -> getString + 1:1:int hashCode():629:629 -> hashCode + 1:2:boolean isNull(int):276:277 -> isNull + 1:10:java.lang.String join(java.lang.String):568:577 -> join + 1:1:int length():131:131 -> length + 1:4:java.lang.Object opt(int):304:307 -> opt + 1:1:boolean optBoolean(int):342:342 -> optBoolean + 2:4:boolean optBoolean(int,boolean):350:352 -> optBoolean + 1:1:double optDouble(int):376:376 -> optDouble + 2:4:double optDouble(int,double):384:386 -> optDouble + 1:1:int optInt(int):410:410 -> optInt + 2:4:int optInt(int,int):418:420 -> optInt + 1:2:com.batch.android.json.JSONArray optJSONArray(int):511:512 -> optJSONArray + 1:2:com.batch.android.json.JSONObject optJSONObject(int):536:537 -> optJSONObject + 1:1:long optLong(int):444:444 -> optLong + 2:4:long optLong(int,long):452:454 -> optLong + 1:1:java.lang.String optString(int):477:477 -> optString + 2:3:java.lang.String optString(int,java.lang.String):485:486 -> optString + 1:1:com.batch.android.json.JSONArray put(boolean):140:140 -> put + 2:2:com.batch.android.json.JSONArray put(double):152:152 -> put + 3:3:com.batch.android.json.JSONArray put(int):162:162 -> put + 4:4:com.batch.android.json.JSONArray put(long):172:172 -> put + 5:5:com.batch.android.json.JSONArray put(java.lang.Object):187:187 -> put + 6:6:com.batch.android.json.JSONArray put(int,boolean):210:210 -> put + 7:7:com.batch.android.json.JSONArray put(int,double):223:223 -> put + 8:8:com.batch.android.json.JSONArray put(int,int):234:234 -> put + 9:9:com.batch.android.json.JSONArray put(int,long):245:245 -> put + 10:17:com.batch.android.json.JSONArray put(int,java.lang.Object):260:267 -> put + 1:4:java.lang.Object remove(int):315:318 -> remove + 1:8:com.batch.android.json.JSONObject toJSONObject(com.batch.android.json.JSONArray):548:555 -> toJSONObject + 1:3:java.lang.String toString():587:589 -> toString + 4:6:java.lang.String toString(int):608:610 -> toString + 1:5:void writeTo(com.batch.android.json.JSONStringer):614:618 -> writeTo +com.batch.android.json.JSONException -> com.batch.android.json.JSONException: +# {"id":"sourceFile","fileName":"JSONException.java"} + 1:1:void (java.lang.String):50:50 -> +com.batch.android.json.JSONHelper -> com.batch.android.json.JSONHelper: +# {"id":"sourceFile","fileName":"JSONHelper.java"} + 1:1:void ():16:16 -> + 1:3:java.util.List jsonArrayToArray(com.batch.android.json.JSONArray):47:49 -> jsonArrayToArray + 1:5:java.util.Map jsonObjectToMap(com.batch.android.json.JSONObject):37:41 -> jsonObjectToMap + 1:4:java.lang.Object jsonObjectToObject(java.lang.Object):27:30 -> jsonObjectToObject +com.batch.android.json.JSONObject -> com.batch.android.json.JSONObject: +# {"id":"sourceFile","fileName":"JSONObject.java"} + 1:18:void ():87:104 -> + 1:2:void ():121:122 -> + 3:14:void (java.util.Map):135:146 -> + 15:15:void (java.util.Map):144:144 -> + 16:17:void (com.batch.android.json.JSONTokener):159:160 -> + 18:18:void (java.lang.String):172:172 -> + 19:23:void (com.batch.android.json.JSONObject,java.lang.String[]):181:185 -> + 24:28:void (com.batch.android.json.JSONObject):194:198 -> + 1:13:com.batch.android.json.JSONObject accumulate(java.lang.String,java.lang.Object):334:346 -> accumulate + 1:14:com.batch.android.json.JSONObject append(java.lang.String,java.lang.Object):362:375 -> append + 15:15:com.batch.android.json.JSONObject append(java.lang.String,java.lang.Object):372:372 -> append + 1:1:java.lang.String checkName(java.lang.String):382:382 -> checkName + 1:3:java.lang.Object get(java.lang.String):428:430 -> get + 1:6:boolean getBoolean(java.lang.String):451:456 -> getBoolean + 7:7:boolean getBoolean(java.lang.String):454:454 -> getBoolean + 1:6:double getDouble(java.lang.String):496:501 -> getDouble + 7:7:double getDouble(java.lang.String):499:499 -> getDouble + 1:6:int getInt(java.lang.String):541:546 -> getInt + 7:7:int getInt(java.lang.String):544:544 -> getInt + 1:5:com.batch.android.json.JSONArray getJSONArray(java.lang.String):680:684 -> getJSONArray + 1:5:com.batch.android.json.JSONObject getJSONObject(java.lang.String):705:709 -> getJSONObject + 1:6:long getLong(java.lang.String):588:593 -> getLong + 7:7:long getLong(java.lang.String):591:591 -> getLong + 1:4:java.lang.String getString(java.lang.String):635:638 -> getString + 1:1:boolean has(java.lang.String):411:411 -> has + 1:1:boolean hasNonNull(java.lang.String):419:419 -> hasNonNull + 1:2:boolean isNull(java.lang.String):402:403 -> isNull + 1:1:java.util.Set keySet():765:765 -> keySet + 1:1:java.util.Iterator keys():751:751 -> keys + 1:1:int length():231:231 -> length + 1:1:com.batch.android.json.JSONArray names():773:773 -> names + 1:14:java.lang.String numberToString(java.lang.Number):831:844 -> numberToString + 15:15:java.lang.String numberToString(java.lang.Number):828:828 -> numberToString + 1:1:java.lang.Object opt(java.lang.String):440:440 -> opt + 1:1:boolean optBoolean(java.lang.String):464:464 -> optBoolean + 2:4:boolean optBoolean(java.lang.String,boolean):472:474 -> optBoolean + 1:1:double optDouble(java.lang.String):509:509 -> optDouble + 2:4:double optDouble(java.lang.String,double):517:519 -> optDouble + 1:1:int optInt(java.lang.String):554:554 -> optInt + 2:4:int optInt(java.lang.String,int):562:564 -> optInt + 1:2:com.batch.android.json.JSONArray optJSONArray(java.lang.String):693:694 -> optJSONArray + 1:2:com.batch.android.json.JSONObject optJSONObject(java.lang.String):718:719 -> optJSONObject + 1:1:long optLong(java.lang.String):613:613 -> optLong + 2:4:long optLong(java.lang.String,long):623:625 -> optLong + 1:1:java.lang.String optString(java.lang.String):648:648 -> optString + 2:3:java.lang.String optString(java.lang.String,java.lang.String):656:657 -> optString + 1:1:com.batch.android.json.JSONObject put(java.lang.String,boolean):241:241 -> put + 2:2:com.batch.android.json.JSONObject put(java.lang.String,double):254:254 -> put + 3:3:com.batch.android.json.JSONObject put(java.lang.String,int):265:265 -> put + 4:4:com.batch.android.json.JSONObject put(java.lang.String,long):276:276 -> put + 5:12:com.batch.android.json.JSONObject put(java.lang.String,java.lang.Object):293:300 -> put + 1:1:com.batch.android.json.JSONObject putOpt(java.lang.String,java.lang.Object):312:312 -> putOpt + 1:10:java.lang.String quote(java.lang.String):856:865 -> quote + 1:5:void readFromTokener(com.batch.android.json.JSONTokener):219:223 -> readFromTokener + 1:9:void readObject(java.io.ObjectInputStream):932:940 -> readObject + 1:3:java.lang.Boolean reallyOptBoolean(java.lang.String,java.lang.Boolean):482:484 -> reallyOptBoolean + 1:3:java.lang.Double reallyOptDouble(java.lang.String,java.lang.Double):527:529 -> reallyOptDouble + 1:3:java.lang.Integer reallyOptInteger(java.lang.String,java.lang.Integer):572:574 -> reallyOptInteger + 1:3:java.lang.Long reallyOptLong(java.lang.String,java.lang.Long):601:603 -> reallyOptLong + 1:3:java.lang.String reallyOptString(java.lang.String,java.lang.String):666:668 -> reallyOptString + 1:1:java.lang.Object remove(java.lang.String):394:394 -> remove + 1:11:com.batch.android.json.JSONArray toJSONArray(com.batch.android.json.JSONArray):728:738 -> toJSONArray + 1:3:java.lang.String toString():783:785 -> toString + 4:6:java.lang.String toString(int):807:809 -> toString + 1:32:java.lang.Object wrap(java.lang.Object):883:914 -> wrap + 1:6:void writeObject(java.io.ObjectOutputStream):923:928 -> writeObject + 7:7:void writeObject(java.io.ObjectOutputStream):925:925 -> writeObject + 1:5:void writeTo(com.batch.android.json.JSONStringer):813:817 -> writeTo +com.batch.android.json.JSONObject$1 -> com.batch.android.json.JSONObject$a: +# {"id":"sourceFile","fileName":"JSONObject.java"} + 1:1:void ():104:104 -> + 1:1:java.lang.String toString():112:112 -> toString +com.batch.android.json.JSONStringer -> com.batch.android.json.JSONStringer: +# {"id":"sourceFile","fileName":"JSONStringer.java"} + 1:1:void ():125:125 -> + 2:60:void ():68:126 -> + 61:61:void (int):129:129 -> + 62:126:void (int):68:132 -> + 1:1:com.batch.android.json.JSONStringer array():142:142 -> array + 1:8:void beforeKey():375:382 -> beforeKey + 9:9:void beforeKey():379:379 -> beforeKey + 1:16:void beforeValue():391:406 -> beforeValue + 1:10:com.batch.android.json.JSONStringer close(com.batch.android.json.JSONStringer$Scope,com.batch.android.json.JSONStringer$Scope,java.lang.String):192:201 -> close + 1:1:com.batch.android.json.JSONStringer endArray():151:151 -> endArray + 1:1:com.batch.android.json.JSONStringer endObject():170:170 -> endObject + 1:2:com.batch.android.json.JSONStringer key(java.lang.String):365:366 -> key + 3:3:com.batch.android.json.JSONStringer key(java.lang.String):363:363 -> key + 1:7:void newline():345:351 -> newline + 1:1:com.batch.android.json.JSONStringer object():161:161 -> object + 1:6:com.batch.android.json.JSONStringer open(com.batch.android.json.JSONStringer$Scope,java.lang.String):178:183 -> open + 1:4:com.batch.android.json.JSONStringer$Scope peek():209:212 -> peek + 5:5:com.batch.android.json.JSONStringer$Scope peek():210:210 -> peek + 1:1:void replaceTop(com.batch.android.json.JSONStringer$Scope):219:219 -> replaceTop + 1:34:void string(java.lang.String):301:334 -> string + 35:50:void string(java.lang.String):315:330 -> string + 51:51:void string(java.lang.String):324:324 -> string + 52:75:void string(java.lang.String):318:341 -> string + 1:1:java.lang.String toString():422:422 -> toString + 1:20:com.batch.android.json.JSONStringer value(java.lang.Object):231:250 -> value + 21:21:com.batch.android.json.JSONStringer value(java.lang.Object):246:246 -> value + 22:22:com.batch.android.json.JSONStringer value(java.lang.Object):232:232 -> value + 23:27:com.batch.android.json.JSONStringer value(boolean):262:266 -> value + 28:28:com.batch.android.json.JSONStringer value(boolean):263:263 -> value + 29:33:com.batch.android.json.JSONStringer value(double):278:282 -> value + 34:34:com.batch.android.json.JSONStringer value(double):279:279 -> value + 35:39:com.batch.android.json.JSONStringer value(long):292:296 -> value + 40:40:com.batch.android.json.JSONStringer value(long):293:293 -> value +com.batch.android.json.JSONStringer$Scope -> com.batch.android.json.JSONStringer$a: +# {"id":"sourceFile","fileName":"JSONStringer.java"} + com.batch.android.json.JSONStringer$Scope EMPTY_ARRAY -> a + com.batch.android.json.JSONStringer$Scope NONEMPTY_ARRAY -> b + com.batch.android.json.JSONStringer$Scope EMPTY_OBJECT -> c + com.batch.android.json.JSONStringer$Scope DANGLING_KEY -> d + com.batch.android.json.JSONStringer$Scope NONEMPTY_OBJECT -> e + com.batch.android.json.JSONStringer$Scope NULL -> f + com.batch.android.json.JSONStringer$Scope[] $VALUES -> g + 1:31:void ():80:110 -> + 32:32:void ():75:75 -> + 1:1:void (java.lang.String,int):75:75 -> + 1:1:com.batch.android.json.JSONStringer$Scope[] $values():75:75 -> a + 1:1:com.batch.android.json.JSONStringer$Scope valueOf(java.lang.String):75:75 -> valueOf + 1:1:com.batch.android.json.JSONStringer$Scope[] values():75:75 -> values +com.batch.android.json.JSONTokener -> com.batch.android.json.JSONTokener: +# {"id":"sourceFile","fileName":"JSONTokener.java"} + 1:6:void (java.lang.String):83:88 -> + 1:2:void back():580:581 -> back + 1:1:boolean more():465:465 -> more + 1:1:char next():474:474 -> next + 2:4:char next(char):482:484 -> next + 5:9:java.lang.String next(int):512:516 -> next + 10:10:java.lang.String next(int):513:513 -> next + 1:1:char nextClean():496:496 -> nextClean + 1:28:int nextCleanInternal():117:144 -> nextCleanInternal + 29:34:int nextCleanInternal():134:139 -> nextCleanInternal + 35:53:int nextCleanInternal():137:155 -> nextCleanInternal + 1:25:java.lang.String nextString(char):197:221 -> nextString + 26:37:java.lang.String nextString(char):214:225 -> nextString + 1:1:java.lang.String nextTo(java.lang.String):540:540 -> nextTo + 2:2:java.lang.String nextTo(java.lang.String):538:538 -> nextTo + 3:3:java.lang.String nextTo(char):547:547 -> nextTo + 1:4:java.lang.String nextToInternal(java.lang.String):326:329 -> nextToInternal + 5:11:java.lang.String nextToInternal(java.lang.String):327:333 -> nextToInternal + 1:14:java.lang.Object nextValue():99:112 -> nextValue + 15:20:java.lang.Object nextValue():104:109 -> nextValue + 21:21:java.lang.Object nextValue():102:102 -> nextValue + 1:35:com.batch.android.json.JSONArray readArray():397:431 -> readArray + 36:42:com.batch.android.json.JSONArray readArray():408:414 -> readArray + 43:43:com.batch.android.json.JSONArray readArray():405:405 -> readArray + 1:12:char readEscapeCharacter():235:246 -> readEscapeCharacter + 13:13:char readEscapeCharacter():239:239 -> readEscapeCharacter + 1:21:java.lang.Object readLiteral():272:292 -> readLiteral + 22:51:java.lang.Object readLiteral():289:318 -> readLiteral + 52:52:java.lang.Object readLiteral():275:275 -> readLiteral + 1:18:com.batch.android.json.JSONObject readObject():341:358 -> readObject + 19:47:com.batch.android.json.JSONObject readObject():357:385 -> readObject + 1:2:void skipPast(java.lang.String):556:557 -> skipPast + 1:3:char skipTo(char):566:568 -> skipTo + 1:2:void skipToEndOfLine():171:172 -> skipToEndOfLine + 3:6:void skipToEndOfLine():171:174 -> skipToEndOfLine + 1:1:com.batch.android.json.JSONException syntaxError(java.lang.String):441:441 -> syntaxError + 1:1:java.lang.String toString():450:450 -> toString +com.batch.android.localcampaigns.CampaignManager -> com.batch.android.r.a: +# {"id":"sourceFile","fileName":"CampaignManager.java"} + int MAX_CAMPAIGNS_JIT_THRESHOLD -> o + int DEFAULT_RETRY_AFTER -> m + java.lang.Object campaignListLock -> f + java.lang.String TAG -> k + com.batch.android.query.response.LocalCampaignsResponse$GlobalCappings cappings -> e + long nextAvailableJITTimestamp -> g + java.lang.String PERSISTENCE_LOCAL_CAMPAIGNS_FILE_NAME -> l + com.batch.android.localcampaigns.LocalCampaignsTracker viewTracker -> b + com.batch.android.localcampaigns.persistence.LocalCampaignsPersistence persistor -> c + java.util.concurrent.atomic.AtomicBoolean campaignsLoaded -> h + java.util.Set watchedEventNames -> i + com.batch.android.core.DateProvider dateProvider -> a + java.util.List campaignList -> d + java.util.Map syncedJITCampaigns -> j + long CACHE_EXPIRATION_DELAY -> n + int MIN_DELAY_BETWEEN_JIT_SYNC -> p + int JIT_CAMPAIGN_CACHE_PERIOD -> q + 1:1:void ():71:71 -> + 1:1:void (com.batch.android.localcampaigns.LocalCampaignsTracker):125:125 -> + 2:37:void (com.batch.android.localcampaigns.LocalCampaignsTracker):91:126 -> + 1:1:long access$002(com.batch.android.localcampaigns.CampaignManager,long):57:57 -> a + 2:2:com.batch.android.core.DateProvider access$100(com.batch.android.localcampaigns.CampaignManager):57:57 -> a + 3:11:void deleteAllCampaigns(android.content.Context,boolean):176:184 -> a + 12:39:java.util.List getEligibleCampaignsSortedByPriority(com.batch.android.localcampaigns.signal.Signal):198:225 -> a + 40:51:java.util.List getEligibleCampaignsSortedByPriority(com.batch.android.localcampaigns.signal.Signal):223:234 -> a + 52:53:int lambda$getEligibleCampaignsSortedByPriority$0(com.batch.android.localcampaigns.model.LocalCampaign,com.batch.android.localcampaigns.model.LocalCampaign):226:227 -> a + 54:65:void verifyCampaignsEligibilityFromServer(java.util.List,com.batch.android.localcampaigns.CampaignManager$JITElectionCampaignListener):285:296 -> a + 66:66:void verifyCampaignsEligibilityFromServer(java.util.List,com.batch.android.localcampaigns.CampaignManager$JITElectionCampaignListener):295:295 -> a + 67:84:com.batch.android.localcampaigns.model.LocalCampaign$SyncedJITResult$State getSyncedJITCampaignState(com.batch.android.localcampaigns.model.LocalCampaign):358:375 -> a + 85:85:boolean isEventWatched(java.lang.String):383:383 -> a + 86:86:void setCappings(com.batch.android.query.response.LocalCampaignsResponse$GlobalCappings):406:406 -> a + 87:117:java.util.List cleanCampaignList(java.util.List):417:447 -> a + 118:132:boolean isCampaignOverCapping(com.batch.android.localcampaigns.model.LocalCampaign,boolean):459:473 -> a + 133:133:void lambda$saveCampaignsAsync$1(android.content.Context,com.batch.android.query.response.LocalCampaignsResponse):603:603 -> a + 134:136:void deleteSavedCampaigns(android.content.Context):608:610 -> a + 137:137:boolean areCampaignsLoaded():666:666 -> a + 1:1:java.util.Map access$200(com.batch.android.localcampaigns.CampaignManager):57:57 -> b + 2:3:com.batch.android.localcampaigns.model.LocalCampaign getFirstCampaignNotRequiringJITSync(java.util.List):267:268 -> b + 4:40:boolean isCampaignDisplayable(com.batch.android.localcampaigns.model.LocalCampaign):489:525 -> b + 41:41:boolean isCampaignDisplayable(com.batch.android.localcampaigns.model.LocalCampaign):510:510 -> b + 42:52:void saveCampaigns(android.content.Context,com.batch.android.query.response.LocalCampaignsResponse):588:598 -> b + 53:53:void saveCampaigns(android.content.Context,com.batch.android.query.response.LocalCampaignsResponse):595:595 -> b + 54:54:void deleteSavedCampaignsAsync(android.content.Context):615:615 -> b + 55:59:void closeViewTracker():682:686 -> b + 1:8:java.util.List getFirstEligibleCampaignsRequiringSync(java.util.List):244:251 -> c + 9:9:java.util.List getCampaignList():390:390 -> c + 10:10:void saveCampaignsAsync(android.content.Context,com.batch.android.query.response.LocalCampaignsResponse):603:603 -> c + 11:13:boolean hasSavedCampaigns(android.content.Context):620:622 -> c + 1:29:void updateCampaignList(java.util.List):141:169 -> d + 30:30:com.batch.android.query.response.LocalCampaignsResponse$GlobalCappings getCappings():398:398 -> d + 31:31:void lambda$deleteSavedCampaignsAsync$2(android.content.Context):615:615 -> d + 1:30:boolean loadSavedCampaignResponse(android.content.Context):630:659 -> e + 31:31:boolean loadSavedCampaignResponse(android.content.Context):632:632 -> e + 32:32:com.batch.android.localcampaigns.ViewTracker getViewTracker():691:691 -> e + 1:1:boolean isJITServiceAvailable():349:349 -> f + 1:22:boolean isOverGlobalCappings():537:558 -> g + 1:4:void openViewTracker():670:673 -> h + 1:1:com.batch.android.localcampaigns.CampaignManager provide():131:131 -> i + 1:9:void updateWatchedEventNames():575:583 -> j +com.batch.android.localcampaigns.CampaignManager$1 -> com.batch.android.r.a$a: +# {"id":"sourceFile","fileName":"CampaignManager.java"} + java.util.List val$eligibleCampaignsRequiringSync -> b + com.batch.android.localcampaigns.CampaignManager$JITElectionCampaignListener val$listener -> a + com.batch.android.localcampaigns.CampaignManager this$0 -> c + 1:1:void (com.batch.android.localcampaigns.CampaignManager,com.batch.android.localcampaigns.CampaignManager$JITElectionCampaignListener,java.util.List):298:298 -> + 1:23:void onSuccess(java.util.List):302:324 -> a + 24:28:void onFailure(com.batch.android.core.Webservice$WebserviceError):332:336 -> a +com.batch.android.localcampaigns.CampaignManager$JITElectionCampaignListener -> com.batch.android.r.a$b: +# {"id":"sourceFile","fileName":"CampaignManager.java"} + void onCampaignElected(com.batch.android.localcampaigns.model.LocalCampaign) -> a +com.batch.android.localcampaigns.LocalCampaignTrackDbHelper -> com.batch.android.r.b: +# {"id":"sourceFile","fileName":"LocalCampaignTrackDbHelper.java"} + java.lang.String SQL_CREATE_TRIGGER_VIEW_EVENT_DELETE_ROWS -> f + java.lang.String SQL_CREATE_ENTRIES -> c + java.lang.String DATABASE_NAME -> b + java.lang.String SQL_CREATE_VIEW_EVENTS_TABLE -> e + int DATABASE_VERSION -> a + java.lang.String SQL_DELETE_ENTRIES -> d + 1:1:void (android.content.Context):101:101 -> + 1:8:java.lang.String getTableAsString(android.database.sqlite.SQLiteDatabase):129:136 -> a + 9:20:java.lang.String getTableAsString(android.database.sqlite.SQLiteDatabase):135:146 -> a + 1:3:void onCreate(android.database.sqlite.SQLiteDatabase):106:108 -> onCreate + 1:2:void onUpgrade(android.database.sqlite.SQLiteDatabase,int,int):114:115 -> onUpgrade +com.batch.android.localcampaigns.LocalCampaignTrackDbHelper$LocalCampaignEntry -> com.batch.android.r.b$a: +# {"id":"sourceFile","fileName":"LocalCampaignTrackDbHelper.java"} + java.lang.String COLUMN_NAME_VE_CAMPAIGN_ID -> g + java.lang.String TABLE_VIEW_EVENTS_NAME -> f + java.lang.String TRIGGER_VIEW_EVENTS_NAME -> i + java.lang.String COLUMN_NAME_VE_TIMESTAMP -> h + java.lang.String TABLE_NAME -> a + java.lang.String COLUMN_NAME_CAMPAIGN_KIND -> c + java.lang.String COLUMN_NAME_CAMPAIGN_ID -> b + java.lang.String COLUMN_NAME_CAMPAIGN_COUNT -> e + java.lang.String COLUMN_NAME_CAMPAIGN_LAST_OCCURRENCE -> d + 1:1:void ():14:14 -> +com.batch.android.localcampaigns.LocalCampaignsSQLTracker -> com.batch.android.r.c: +# {"id":"sourceFile","fileName":"LocalCampaignsSQLTracker.java"} + com.batch.android.core.DateProvider dateProvider -> d + java.lang.String TAG -> f + android.database.sqlite.SQLiteDatabase database -> c + boolean open -> e + com.batch.android.localcampaigns.LocalCampaignTrackDbHelper dbHelper -> b + 1:1:void ():25:25 -> + 2:5:void ():23:26 -> + 6:6:void (com.batch.android.core.DateProvider):30:30 -> + 7:15:void (com.batch.android.core.DateProvider):23:31 -> + 1:2:void open(android.content.Context):35:36 -> a + 3:7:void close():40:44 -> a + 8:8:void setDateProvider(com.batch.android.core.DateProvider):56:56 -> a + 9:36:java.util.Map getViewCounts(java.util.List):139:166 -> a + 37:58:java.util.Map getViewCounts(java.util.List):154:175 -> a + 59:75:long campaignLastOccurrence(java.lang.String):183:199 -> a + 76:85:int getNumberOfViewEventsSince(long):206:215 -> a + 86:98:int getNumberOfViewEventsSince(long):208:220 -> a + 1:21:com.batch.android.localcampaigns.ViewTracker$CountedViewEvent trackViewEvent(java.lang.String):68:88 -> b + 22:47:com.batch.android.localcampaigns.ViewTracker$CountedViewEvent trackViewEvent(java.lang.String):74:99 -> b + 48:48:com.batch.android.localcampaigns.ViewTracker$CountedViewEvent trackViewEvent(java.lang.String):91:91 -> b + 49:50:void deleteViewEvents():225:226 -> b + 1:23:com.batch.android.localcampaigns.ViewTracker$CountedViewEvent getViewEvent(java.lang.String):108:130 -> c + 24:32:void ensureWritableDatabase():230:238 -> c + 33:33:void ensureWritableDatabase():232:232 -> c + 1:1:com.batch.android.core.DateProvider getDateProvider():52:52 -> d + 1:1:boolean isOpen():48:48 -> e +com.batch.android.localcampaigns.LocalCampaignsTracker -> com.batch.android.r.d: +# {"id":"sourceFile","fileName":"LocalCampaignsTracker.java"} + int sessionViewsCount -> g + 1:7:void ():5:11 -> + 1:2:com.batch.android.localcampaigns.ViewTracker$CountedViewEvent trackViewEvent(java.lang.String):36:37 -> b + 1:1:int getSessionViewsCount():25:25 -> f + 1:1:void resetSessionViewsCount():17:17 -> g +com.batch.android.localcampaigns.ViewTracker -> com.batch.android.r.e: +# {"id":"sourceFile","fileName":"ViewTracker.java"} + int KIND_VIEW -> a + long campaignLastOccurrence(java.lang.String) -> a + int getNumberOfViewEventsSince(long) -> a + java.util.Map getViewCounts(java.util.List) -> a + com.batch.android.localcampaigns.ViewTracker$CountedViewEvent trackViewEvent(java.lang.String) -> b + com.batch.android.localcampaigns.ViewTracker$CountedViewEvent getViewEvent(java.lang.String) -> c +com.batch.android.localcampaigns.ViewTracker$CountedViewEvent -> com.batch.android.r.e$a: +# {"id":"sourceFile","fileName":"ViewTracker.java"} + java.lang.String campaignID -> a + long lastOccurrence -> c + int count -> b + 1:1:void (java.lang.String):61:61 -> + 2:7:void (java.lang.String):57:62 -> +com.batch.android.localcampaigns.ViewTrackerUnavailableException -> com.batch.android.r.f: +# {"id":"sourceFile","fileName":"ViewTrackerUnavailableException.java"} + 1:1:void ():5:5 -> +com.batch.android.localcampaigns.model.LocalCampaign -> com.batch.android.s.a: +# {"id":"sourceFile","fileName":"LocalCampaign.java"} + java.lang.Integer maximumAPILevel -> c + boolean requiresJustInTimeSync -> o + java.lang.Integer capping -> h + java.lang.String publicToken -> m + com.batch.android.json.JSONObject customPayload -> n + boolean persist -> l + int minimumDisplayInterval -> g + int priority -> d + java.lang.String TAG -> p + java.lang.Integer minimumAPILevel -> b + com.batch.android.localcampaigns.model.LocalCampaign$Output output -> i + java.lang.String id -> a + com.batch.android.json.JSONObject eventData -> j + com.batch.android.date.BatchDate endDate -> f + com.batch.android.date.BatchDate startDate -> e + java.util.List triggers -> k + 1:107:void ():15:121 -> + 1:1:void displayMessage():160:160 -> a + 1:3:void generateOccurrenceID():136:138 -> b +com.batch.android.localcampaigns.model.LocalCampaign$Output -> com.batch.android.s.a$a: +# {"id":"sourceFile","fileName":"LocalCampaign.java"} + com.batch.android.json.JSONObject payload -> a + 1:2:void (com.batch.android.json.JSONObject):171:172 -> + boolean displayMessage(com.batch.android.localcampaigns.model.LocalCampaign) -> a +com.batch.android.localcampaigns.model.LocalCampaign$SyncedJITResult -> com.batch.android.s.a$b: +# {"id":"sourceFile","fileName":"LocalCampaign.java"} + long timestamp -> a + boolean eligible -> b + 1:2:void (long):209:210 -> +com.batch.android.localcampaigns.model.LocalCampaign$SyncedJITResult$State -> com.batch.android.s.a$b$a: +# {"id":"sourceFile","fileName":"LocalCampaign.java"} + com.batch.android.localcampaigns.model.LocalCampaign$SyncedJITResult$State ELIGIBLE -> a + com.batch.android.localcampaigns.model.LocalCampaign$SyncedJITResult$State[] $VALUES -> d + com.batch.android.localcampaigns.model.LocalCampaign$SyncedJITResult$State REQUIRES_SYNC -> c + com.batch.android.localcampaigns.model.LocalCampaign$SyncedJITResult$State NOT_ELIGIBLE -> b + 1:3:void ():194:196 -> + 4:4:void ():193:193 -> + 1:1:void (java.lang.String,int):193:193 -> + 1:1:com.batch.android.localcampaigns.model.LocalCampaign$SyncedJITResult$State[] $values():193:193 -> a + 1:1:com.batch.android.localcampaigns.model.LocalCampaign$SyncedJITResult$State valueOf(java.lang.String):193:193 -> valueOf + 1:1:com.batch.android.localcampaigns.model.LocalCampaign$SyncedJITResult$State[] values():193:193 -> values +com.batch.android.localcampaigns.model.LocalCampaign$Trigger -> com.batch.android.s.a$c: +# {"id":"sourceFile","fileName":"LocalCampaign.java"} + java.lang.String getType() -> k +com.batch.android.localcampaigns.output.ActionOutput -> com.batch.android.t.a: +# {"id":"sourceFile","fileName":"ActionOutput.java"} + 1:1:void (com.batch.android.json.JSONObject):20:20 -> + 1:1:com.batch.android.localcampaigns.output.ActionOutput provide(com.batch.android.json.JSONObject):25:25 -> a + 2:34:boolean displayMessage(com.batch.android.localcampaigns.model.LocalCampaign):30:62 -> a +com.batch.android.localcampaigns.output.LandingOutput -> com.batch.android.t.b: +# {"id":"sourceFile","fileName":"LandingOutput.java"} + com.batch.android.module.MessagingModule messagingModule -> b + 1:2:void (com.batch.android.module.MessagingModule,com.batch.android.json.JSONObject):21:22 -> + 1:1:com.batch.android.localcampaigns.output.LandingOutput provide(com.batch.android.json.JSONObject):27:27 -> a + 2:19:boolean displayMessage(com.batch.android.localcampaigns.model.LocalCampaign):34:51 -> a +com.batch.android.localcampaigns.persistence.LocalCampaignsFilePersistence -> com.batch.android.u.a: +# {"id":"sourceFile","fileName":"LocalCampaignsFilePersistence.java"} + java.lang.String TAG -> a + int PERSISTENCE_CURRENT_FILE_VERSION -> d + java.lang.String PERSISTENCE_SAVE_VERSION_KEY -> c + java.lang.String PERSISTENCE_TMP_FILE_PREFIX -> b + 1:1:void ():19:19 -> + 1:82:void persistData(android.content.Context,com.batch.android.json.JSONObject,java.lang.String):38:119 -> a + 83:122:com.batch.android.json.JSONObject loadData(android.content.Context,java.lang.String):130:169 -> a + 123:134:com.batch.android.json.JSONObject loadData(android.content.Context,java.lang.String):144:155 -> a + 1:1:boolean hasSavedData(android.content.Context,java.lang.String):32:32 -> b + 1:6:void deleteData(android.content.Context,java.lang.String):177:182 -> c +com.batch.android.localcampaigns.persistence.LocalCampaignsPersistence -> com.batch.android.u.b: +# {"id":"sourceFile","fileName":"LocalCampaignsPersistence.java"} + com.batch.android.json.JSONObject loadData(android.content.Context,java.lang.String) -> a + void persistData(android.content.Context,com.batch.android.json.JSONObject,java.lang.String) -> a + boolean hasSavedData(android.content.Context,java.lang.String) -> b + void deleteData(android.content.Context,java.lang.String) -> c +com.batch.android.localcampaigns.persistence.PersistenceException -> com.batch.android.u.c: +# {"id":"sourceFile","fileName":"PersistenceException.java"} + 1:1:void ():5:5 -> + 2:2:void (java.lang.String):8:8 -> + 3:3:void (java.lang.String,java.lang.Throwable):12:12 -> + 4:4:void (java.lang.Throwable):16:16 -> +com.batch.android.localcampaigns.serialization.LocalCampaignDeserializer -> com.batch.android.v.a: +# {"id":"sourceFile","fileName":"LocalCampaignDeserializer.java"} + java.lang.String TAG -> a + 1:1:void ():20:20 -> + 1:77:com.batch.android.localcampaigns.model.LocalCampaign deserialize(com.batch.android.json.JSONObject):36:112 -> a + 78:78:com.batch.android.localcampaigns.model.LocalCampaign deserialize(com.batch.android.json.JSONObject):67:67 -> a + 79:79:com.batch.android.localcampaigns.model.LocalCampaign deserialize(com.batch.android.json.JSONObject):62:62 -> a + 80:80:com.batch.android.localcampaigns.model.LocalCampaign deserialize(com.batch.android.json.JSONObject):47:47 -> a + 81:81:com.batch.android.localcampaigns.model.LocalCampaign deserialize(com.batch.android.json.JSONObject):40:40 -> a + 82:82:com.batch.android.localcampaigns.model.LocalCampaign deserialize(com.batch.android.json.JSONObject):33:33 -> a + 83:91:java.util.List deserializeList(com.batch.android.json.JSONArray):124:132 -> a + 1:16:com.batch.android.localcampaigns.model.LocalCampaign$Output parseOutput(com.batch.android.json.JSONObject):147:162 -> b + 17:17:com.batch.android.localcampaigns.model.LocalCampaign$Output parseOutput(com.batch.android.json.JSONObject):150:150 -> b + 18:29:java.util.List parseTriggers(com.batch.android.json.JSONArray):175:186 -> b + 1:21:com.batch.android.localcampaigns.model.LocalCampaign$Trigger parseTrigger(com.batch.android.json.JSONObject):199:219 -> c + 22:26:com.batch.android.localcampaigns.model.LocalCampaign$Trigger parseTrigger(com.batch.android.json.JSONObject):213:217 -> c + 27:27:com.batch.android.localcampaigns.model.LocalCampaign$Trigger parseTrigger(com.batch.android.json.JSONObject):215:215 -> c + 28:28:com.batch.android.localcampaigns.model.LocalCampaign$Trigger parseTrigger(com.batch.android.json.JSONObject):211:211 -> c + 29:29:com.batch.android.localcampaigns.model.LocalCampaign$Trigger parseTrigger(com.batch.android.json.JSONObject):202:202 -> c +com.batch.android.localcampaigns.serialization.LocalCampaignSerializer -> com.batch.android.v.b: +# {"id":"sourceFile","fileName":"LocalCampaignSerializer.java"} + 1:1:void ():12:12 -> + 1:44:com.batch.android.json.JSONObject serialize(com.batch.android.localcampaigns.model.LocalCampaign):22:65 -> a + 45:48:com.batch.android.json.JSONObject parseOutput(com.batch.android.localcampaigns.model.LocalCampaign$Output):92:95 -> a + 49:52:com.batch.android.json.JSONArray parseTriggers(java.util.List):108:111 -> a + 53:58:com.batch.android.json.JSONObject parseTrigger(com.batch.android.localcampaigns.model.LocalCampaign$Trigger):124:129 -> a + 1:4:com.batch.android.json.JSONArray serializeList(java.util.List):76:79 -> b +com.batch.android.localcampaigns.signal.EventTrackedSignal -> com.batch.android.w.a: +# {"id":"sourceFile","fileName":"EventTrackedSignal.java"} + com.batch.android.json.JSONObject parameters -> b + java.lang.String name -> a + 1:3:void (java.lang.String,com.batch.android.json.JSONObject):20:22 -> + 1:3:boolean satisfiesTrigger(com.batch.android.localcampaigns.model.LocalCampaign$Trigger):26:28 -> a +com.batch.android.localcampaigns.signal.NewSessionSignal -> com.batch.android.w.b: +# {"id":"sourceFile","fileName":"NewSessionSignal.java"} + 1:1:void ():11:11 -> + 1:1:boolean satisfiesTrigger(com.batch.android.localcampaigns.model.LocalCampaign$Trigger):15:15 -> a +com.batch.android.localcampaigns.signal.PublicEventTrackedSignal -> com.batch.android.w.c: +# {"id":"sourceFile","fileName":"PublicEventTrackedSignal.java"} + java.lang.String label -> c + 1:11:void (com.batch.android.localcampaigns.signal.EventTrackedSignal):20:30 -> + 12:12:void (com.batch.android.localcampaigns.signal.EventTrackedSignal):28:28 -> + 1:3:boolean satisfiesTrigger(com.batch.android.localcampaigns.model.LocalCampaign$Trigger):38:40 -> a + 4:4:boolean isPublic(com.batch.android.localcampaigns.signal.EventTrackedSignal):45:45 -> a +com.batch.android.localcampaigns.signal.Signal -> com.batch.android.w.d: +# {"id":"sourceFile","fileName":"Signal.java"} + boolean satisfiesTrigger(com.batch.android.localcampaigns.model.LocalCampaign$Trigger) -> a +com.batch.android.localcampaigns.trigger.EventLocalCampaignTrigger -> com.batch.android.x.a: +# {"id":"sourceFile","fileName":"EventLocalCampaignTrigger.java"} + java.lang.String name -> a + java.lang.String label -> b + 1:3:void (java.lang.String,java.lang.String):27:29 -> + 1:5:boolean isSatisfied(java.lang.String,java.lang.String):36:40 -> a + 1:1:java.lang.String getType():49:49 -> k +com.batch.android.localcampaigns.trigger.NextSessionTrigger -> com.batch.android.x.b: +# {"id":"sourceFile","fileName":"NextSessionTrigger.java"} + 1:1:void ():8:8 -> + 1:1:java.lang.String getType():12:12 -> k +com.batch.android.messaging.AsyncImageDownloadTask -> com.batch.android.y.a: +# {"id":"sourceFile","fileName":"AsyncImageDownloadTask.java"} + com.batch.android.messaging.model.MessagingError lastError -> a + java.lang.ref.WeakReference weakListener -> b + java.lang.String TAG -> c + 1:1:void (com.batch.android.messaging.AsyncImageDownloadTask$ImageDownloadListener):82:82 -> + 2:50:void (com.batch.android.messaging.AsyncImageDownloadTask$ImageDownloadListener):35:83 -> + 1:76:com.batch.android.messaging.AsyncImageDownloadTask$Result doInBackground(java.lang.String[]):96:171 -> a + 77:109:com.batch.android.messaging.AsyncImageDownloadTask$Result doInBackground(java.lang.String[]):139:171 -> a + 110:140:com.batch.android.messaging.AsyncImageDownloadTask$Result doInBackground(java.lang.String[]):141:171 -> a + 141:160:com.batch.android.messaging.AsyncImageDownloadTask$Result doInBackground(java.lang.String[]):146:165 -> a + 161:172:com.batch.android.messaging.AsyncImageDownloadTask$Result doInBackground(java.lang.String[]):160:171 -> a + 173:181:com.batch.android.messaging.AsyncImageDownloadTask$Result doInBackground(java.lang.String[]):157:165 -> a + 182:202:com.batch.android.messaging.AsyncImageDownloadTask$Result doInBackground(java.lang.String[]):154:174 -> a + 203:203:com.batch.android.messaging.AsyncImageDownloadTask$Result doInBackground(java.lang.String[]):106:106 -> a + 204:209:void onPostExecute(com.batch.android.messaging.AsyncImageDownloadTask$Result):181:186 -> a + 1:1:java.lang.Object doInBackground(java.lang.Object[]):30:30 -> doInBackground + 1:1:void onPostExecute(java.lang.Object):30:30 -> onPostExecute + 1:3:void onPreExecute():88:90 -> onPreExecute +com.batch.android.messaging.AsyncImageDownloadTask$BitmapResult -> com.batch.android.y.a$a: +# {"id":"sourceFile","fileName":"AsyncImageDownloadTask.java"} + 1:1:void (java.lang.String,android.graphics.Bitmap):59:59 -> +com.batch.android.messaging.AsyncImageDownloadTask$GIFResult -> com.batch.android.y.a$b: +# {"id":"sourceFile","fileName":"AsyncImageDownloadTask.java"} + 1:1:void (java.lang.String,byte[]):66:66 -> +com.batch.android.messaging.AsyncImageDownloadTask$ImageDownloadListener -> com.batch.android.y.a$c: +# {"id":"sourceFile","fileName":"AsyncImageDownloadTask.java"} + void onImageDownloadError(com.batch.android.messaging.model.MessagingError) -> a + void onImageDownloadSuccess(com.batch.android.messaging.AsyncImageDownloadTask$Result) -> a + void onImageDownloadStart() -> c +com.batch.android.messaging.AsyncImageDownloadTask$Result -> com.batch.android.y.a$d: +# {"id":"sourceFile","fileName":"AsyncImageDownloadTask.java"} + java.lang.Object value -> b + java.lang.String key -> a + 1:3:void (java.lang.String,java.lang.Object):42:44 -> + 1:1:java.lang.Object get():52:52 -> a + 1:1:java.lang.String getKey():48:48 -> b +com.batch.android.messaging.ModalContentPanGestureDetector -> com.batch.android.y.b: +# {"id":"sourceFile","fileName":"ModalContentPanGestureDetector.java"} + boolean shouldDismissOnTouchUp -> m + boolean allowHorizontalPanning -> n + int touchSlop -> l + float initialInterceptYOffset -> i + float initialInterceptXOffset -> h + float initialSwipeYOffset -> g + float initialSwipeXOffset -> f + boolean isPanning -> k + android.view.GestureDetector detector -> b + float SPRING_STIFFNESS -> w + float SCALE_RATIO_DISMISS_THRESHOLD -> v + float SMALLEST_SCALE_RATIO -> u + android.os.Vibrator vibrator -> d + boolean supportsAndroidXAnimation -> e + float DISMISS_THRESHOLD_MINIMUM_VELOCITY -> t + float DISMISSABLE_TARGET_ALPHA -> s + android.view.View targetView -> c + java.lang.Object[] cancellationAnimations -> j + float SCALE_PAN_MULTIPLIER -> r + float TRANSLATION_PAN_MULTIPLIER -> q + com.batch.android.messaging.ModalContentPanGestureDetector$OnDismissListener dismissListener -> a + long ANIMATION_DURATION_FAST -> p + long ANIMATION_DURATION -> o + 1:1:void (android.content.Context,boolean):100:100 -> + 2:63:void (android.content.Context,boolean):52:113 -> + 1:2:void attach(com.batch.android.messaging.view.DelegatedTouchEventViewGroup,android.view.View):124:125 -> a + 3:3:void setDismissListener(com.batch.android.messaging.ModalContentPanGestureDetector$OnDismissListener):129:129 -> a + 4:7:void beginPan(float,float):143:146 -> a + 8:19:void cancelCancellationAnimation():193:204 -> a + 20:46:boolean onInterceptTouchEvent(android.view.MotionEvent,com.batch.android.messaging.view.DelegatedTouchEventViewGroup):211:237 -> a + 47:47:boolean onInterceptTouchEvent(android.view.MotionEvent,com.batch.android.messaging.view.DelegatedTouchEventViewGroup):215:215 -> a + 48:149:boolean onTouchEvent(android.view.MotionEvent,com.batch.android.messaging.view.DelegatedTouchEventViewGroup,boolean):254:355 -> a + 150:202:boolean onTouchEvent(android.view.MotionEvent,com.batch.android.messaging.view.DelegatedTouchEventViewGroup,boolean):264:316 -> a + 203:238:boolean onTouchEvent(android.view.MotionEvent,com.batch.android.messaging.view.DelegatedTouchEventViewGroup,boolean):314:349 -> a + 239:338:boolean onTouchEvent(android.view.MotionEvent,com.batch.android.messaging.view.DelegatedTouchEventViewGroup,boolean):260:359 -> a + 1:2:void dismiss():133:134 -> b + 3:3:boolean hasPassedTouchSlop(float,float):139:139 -> b + 1:6:void shouldDismissChanged():365:370 -> c + 1:24:void startCancelAnimation():150:173 -> d + 1:12:void startFallbackCancelAnimation():178:189 -> e + 1:4:void vibrate():374:377 -> f + 1:11:boolean onFling(android.view.MotionEvent,android.view.MotionEvent,float,float):404:414 -> onFling +com.batch.android.messaging.ModalContentPanGestureDetector$OnDismissListener -> com.batch.android.y.b$a: +# {"id":"sourceFile","fileName":"ModalContentPanGestureDetector.java"} + void onPanDismiss() -> e +com.batch.android.messaging.PayloadParser -> com.batch.android.y.c: +# {"id":"sourceFile","fileName":"PayloadParser.java"} + java.lang.String TAG -> a + 1:1:void ():35:35 -> + 1:13:com.batch.android.messaging.model.AlertMessage parseAlertPayload(com.batch.android.json.JSONObject,com.batch.android.messaging.model.AlertMessage):145:157 -> a + 14:53:com.batch.android.messaging.model.UniversalMessage parseUniversalPayload(com.batch.android.json.JSONObject,com.batch.android.messaging.model.UniversalMessage):166:205 -> a + 54:54:com.batch.android.messaging.model.BannerMessage parseBannerPayload(com.batch.android.json.JSONObject,com.batch.android.messaging.model.BannerMessage):213:213 -> a + 55:55:com.batch.android.messaging.model.ModalMessage parseModalPayload(com.batch.android.json.JSONObject,com.batch.android.messaging.model.ModalMessage):219:219 -> a + 56:92:void parseBaseBannerPayload(com.batch.android.json.JSONObject,com.batch.android.messaging.model.BaseBannerMessage):225:261 -> a + 93:93:void parseBaseBannerPayload(com.batch.android.json.JSONObject,com.batch.android.messaging.model.BaseBannerMessage):258:258 -> a + 94:114:void parseBaseBannerPayload(com.batch.android.json.JSONObject,com.batch.android.messaging.model.BaseBannerMessage):255:275 -> a + 115:130:com.batch.android.messaging.model.ImageMessage parseImagePayload(com.batch.android.json.JSONObject,com.batch.android.messaging.model.ImageMessage):281:296 -> a + 131:149:com.batch.android.messaging.model.ImageMessage parseImagePayload(com.batch.android.json.JSONObject,com.batch.android.messaging.model.ImageMessage):294:312 -> a + 150:154:com.batch.android.messaging.model.ImageMessage parseImagePayload(com.batch.android.json.JSONObject,com.batch.android.messaging.model.ImageMessage):303:307 -> a + 155:155:com.batch.android.messaging.model.ImageMessage parseImagePayload(com.batch.android.json.JSONObject,com.batch.android.messaging.model.ImageMessage):289:289 -> a + 156:180:com.batch.android.messaging.model.WebViewMessage parseWebViewPayload(com.batch.android.json.JSONObject,com.batch.android.messaging.model.WebViewMessage):319:343 -> a + 181:182:com.batch.android.messaging.model.WebViewMessage parseWebViewPayload(com.batch.android.json.JSONObject,com.batch.android.messaging.model.WebViewMessage):327:328 -> a + 183:190:com.batch.android.messaging.model.Action parseAction(com.batch.android.json.JSONObject):350:357 -> a + 191:197:android.text.Spanned parseHtmlString(java.lang.String):378:384 -> a + 1:45:com.batch.android.messaging.model.Message parseBasePayload(com.batch.android.json.JSONObject):94:138 -> b + 46:46:com.batch.android.messaging.model.Message parseBasePayload(com.batch.android.json.JSONObject):111:111 -> b + 1:9:com.batch.android.messaging.model.CTA parseCTA(com.batch.android.json.JSONObject):361:369 -> c + 1:40:com.batch.android.messaging.model.Message parsePayload(com.batch.android.json.JSONObject):47:86 -> d + 41:41:com.batch.android.messaging.model.Message parsePayload(com.batch.android.json.JSONObject):49:49 -> d + 42:42:com.batch.android.messaging.model.Message parsePayload(com.batch.android.json.JSONObject):41:41 -> d +com.batch.android.messaging.PayloadParsingException -> com.batch.android.y.d: +# {"id":"sourceFile","fileName":"PayloadParsingException.java"} + 1:1:void ():9:9 -> + 2:2:void (java.lang.String):12:12 -> + 3:3:void (java.lang.String,java.lang.Throwable):16:16 -> + 4:4:void (java.lang.Throwable):20:20 -> +com.batch.android.messaging.Size2D -> com.batch.android.messaging.Size2D: +# {"id":"sourceFile","fileName":"Size2D.java"} + int height -> b + int width -> a + 1:1:void ():53:53 -> + 1:3:void (int,int):15:17 -> + 4:6:void (android.os.Parcel):20:22 -> + 1:5:boolean equals(java.lang.Object):30:34 -> equals + 1:1:int hashCode():39:39 -> hashCode + 1:2:void writeToParcel(android.os.Parcel,int):44:45 -> writeToParcel +com.batch.android.messaging.Size2D$1 -> com.batch.android.messaging.Size2D$a: +# {"id":"sourceFile","fileName":"Size2D.java"} + 1:1:void ():53:53 -> + 1:1:com.batch.android.messaging.Size2D createFromParcel(android.os.Parcel):56:56 -> a + 2:2:com.batch.android.messaging.Size2D[] newArray(int):61:61 -> a + 1:1:java.lang.Object createFromParcel(android.os.Parcel):53:53 -> createFromParcel + 1:1:java.lang.Object[] newArray(int):53:53 -> newArray +com.batch.android.messaging.WebViewActionListener -> com.batch.android.y.e: +# {"id":"sourceFile","fileName":"WebViewActionListener.java"} + void onCloseAction() -> a + void onDismissAction(java.lang.String) -> a + void onErrorAction(com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause,com.batch.android.messaging.model.MessagingError,java.lang.String) -> a + void onOpenDeeplinkAction(java.lang.String,java.lang.Boolean,java.lang.String) -> a + void onPerformAction(java.lang.String,com.batch.android.json.JSONObject,java.lang.String) -> a +com.batch.android.messaging.WebViewHelper -> com.batch.android.y.f: +# {"id":"sourceFile","fileName":"WebViewHelper.java"} + 1:1:void ():7:7 -> + 1:2:java.lang.String getAnalyticsIDFromURL(java.lang.String):12:13 -> a +com.batch.android.messaging.css.CSSParsingException -> com.batch.android.z.a: +# {"id":"sourceFile","fileName":"CSSParsingException.java"} + 1:1:void ():5:5 -> + 2:2:void (java.lang.String):8:8 -> + 3:3:void (java.lang.String,java.lang.Throwable):12:12 -> + 4:4:void (java.lang.Throwable):16:16 -> +com.batch.android.messaging.css.DOMNode -> com.batch.android.z.b: +# {"id":"sourceFile","fileName":"DOMNode.java"} + java.util.List classes -> c + java.lang.String type -> a + java.lang.String identifier -> b + 1:2:void ():17:18 -> + 3:7:void (java.lang.String,java.lang.String[]):21:25 -> + 1:23:boolean matchesSelector(java.lang.String):30:52 -> a +com.batch.android.messaging.css.Declaration -> com.batch.android.z.c: +# {"id":"sourceFile","fileName":"Declaration.java"} + java.lang.String name -> a + java.lang.String value -> b + 1:1:void ():3:3 -> +com.batch.android.messaging.css.Document -> com.batch.android.z.d: +# {"id":"sourceFile","fileName":"Document.java"} + java.util.List mediaQueries -> b + java.util.List rulesets -> a + java.util.regex.Pattern MEDIA_QUERY_PATTERN -> d + java.lang.String TAG -> c + 1:1:void ():21:21 -> + 1:3:void ():29:31 -> + 1:1:java.util.Map getFlatRules(com.batch.android.messaging.css.DOMNode,android.graphics.Point):36:36 -> a + 2:101:java.util.Map getFlatRules(java.util.List):42:141 -> a + 102:122:java.util.List getRules(com.batch.android.messaging.css.DOMNode,java.util.List):160:180 -> a + 123:151:boolean matchesMediaQuery(java.lang.String,android.graphics.Point):188:216 -> a + 152:167:boolean matchesSizeMediaQuery(android.graphics.Point,java.lang.String,java.lang.String,java.lang.String,int):239:254 -> a + 1:5:java.util.List getRules(com.batch.android.messaging.css.DOMNode,android.graphics.Point):147:151 -> b +com.batch.android.messaging.css.ImportFileProvider -> com.batch.android.z.e: +# {"id":"sourceFile","fileName":"ImportFileProvider.java"} + java.lang.String getContent(java.lang.String) -> a +com.batch.android.messaging.css.MediaQuery -> com.batch.android.z.f: +# {"id":"sourceFile","fileName":"MediaQuery.java"} + java.util.List rulesets -> b + java.lang.String rule -> a + 1:2:void ():12:13 -> +com.batch.android.messaging.css.Parser -> com.batch.android.z.g: +# {"id":"sourceFile","fileName":"Parser.java"} + com.batch.android.messaging.css.Declaration currentDeclaration -> g + com.batch.android.messaging.css.Document currentDocument -> h + java.lang.String currentToken -> i + com.batch.android.messaging.css.MediaQuery currentMediaQuery -> e + boolean shouldMergePreviousToken -> j + com.batch.android.messaging.css.Ruleset currentRuleset -> f + com.batch.android.messaging.css.ImportFileProvider importFileProvider -> a + com.batch.android.messaging.css.Parser$State state -> c + com.batch.android.messaging.css.Parser$Substate substate -> d + java.util.regex.Pattern IMPORT_PATTERN -> k + java.lang.String rawStylesheet -> b + 1:1:void ():12:12 -> + 1:1:void (com.batch.android.messaging.css.ImportFileProvider,java.lang.String):30:30 -> + 2:7:void (com.batch.android.messaging.css.ImportFileProvider,java.lang.String):28:33 -> + 1:11:void fillImports():55:65 -> a + 12:18:void fillImports():63:69 -> a + 19:20:void consumeToken(java.lang.String):95:96 -> a + 21:40:void consumeSpecialToken(char):100:119 -> a + 41:41:void consumeSpecialToken(char):116:116 -> a + 42:42:void consumeSpecialToken(char):113:113 -> a + 43:43:void consumeSpecialToken(char):110:110 -> a + 44:44:void consumeSpecialToken(char):107:107 -> a + 1:4:com.batch.android.messaging.css.Document parse():37:40 -> b + 1:2:void recoverLineEndingIfPossible():239:240 -> c + 1:7:void reset():45:51 -> d + 1:18:void scan():73:90 -> e + 1:25:void switchOutOfPropertyNameState():194:218 -> f + 1:14:void switchOutOfPropertyValueState():222:235 -> g + 1:33:void switchOutOfRulesetState():157:189 -> h + 1:26:void switchToRulesetState():127:152 -> i + 1:1:void throwGenericParsingException():245:245 -> j +com.batch.android.messaging.css.Parser$1 -> com.batch.android.z.g$a: +# {"id":"sourceFile","fileName":"Parser.java"} + int[] $SwitchMap$com$batch$android$messaging$css$Parser$SpecialToken -> a + 1:1:void ():102:102 -> +com.batch.android.messaging.css.Parser$SpecialToken -> com.batch.android.z.g$b: +# {"id":"sourceFile","fileName":"Parser.java"} + com.batch.android.messaging.css.Parser$SpecialToken UNKNOWN -> a + com.batch.android.messaging.css.Parser$SpecialToken BLOCK_END -> c + com.batch.android.messaging.css.Parser$SpecialToken BLOCK_START -> b + com.batch.android.messaging.css.Parser$SpecialToken PROPERTY_END -> e + com.batch.android.messaging.css.Parser$SpecialToken PROPERTY_SEPARATOR -> d + com.batch.android.messaging.css.Parser$SpecialToken[] $VALUES -> g + com.batch.android.messaging.css.Parser$SpecialToken NEW_LINE -> f + 1:6:void ():265:270 -> + 7:7:void ():264:264 -> + 1:1:void (java.lang.String,int):264:264 -> + 1:1:com.batch.android.messaging.css.Parser$SpecialToken[] $values():264:264 -> a + 2:2:com.batch.android.messaging.css.Parser$SpecialToken fromCharacter(char):285:285 -> a + 3:5:com.batch.android.messaging.css.Parser$SpecialToken fromCharacter(char):279:281 -> a + 6:6:com.batch.android.messaging.css.Parser$SpecialToken fromCharacter(char):277:277 -> a + 7:15:com.batch.android.messaging.css.Parser$SpecialToken fromCharacter(char):275:283 -> a + 1:1:com.batch.android.messaging.css.Parser$SpecialToken valueOf(java.lang.String):264:264 -> valueOf + 1:1:com.batch.android.messaging.css.Parser$SpecialToken[] values():264:264 -> values +com.batch.android.messaging.css.Parser$State -> com.batch.android.z.g$c: +# {"id":"sourceFile","fileName":"Parser.java"} + com.batch.android.messaging.css.Parser$State[] $VALUES -> c + com.batch.android.messaging.css.Parser$State MEDIA_QUERY -> b + com.batch.android.messaging.css.Parser$State ROOT -> a + 1:2:void ():253:254 -> + 3:3:void ():252:252 -> + 1:1:void (java.lang.String,int):252:252 -> + 1:1:com.batch.android.messaging.css.Parser$State[] $values():252:252 -> a + 1:1:com.batch.android.messaging.css.Parser$State valueOf(java.lang.String):252:252 -> valueOf + 1:1:com.batch.android.messaging.css.Parser$State[] values():252:252 -> values +com.batch.android.messaging.css.Parser$Substate -> com.batch.android.z.g$d: +# {"id":"sourceFile","fileName":"Parser.java"} + com.batch.android.messaging.css.Parser$Substate[] $VALUES -> e + com.batch.android.messaging.css.Parser$Substate SELECTOR -> a + com.batch.android.messaging.css.Parser$Substate PROPERTY_NAME -> c + com.batch.android.messaging.css.Parser$Substate RULESET -> b + com.batch.android.messaging.css.Parser$Substate PROPERTY_VALUE -> d + 1:4:void ():258:261 -> + 5:5:void ():257:257 -> + 1:1:void (java.lang.String,int):257:257 -> + 1:1:com.batch.android.messaging.css.Parser$Substate[] $values():257:257 -> a + 1:1:com.batch.android.messaging.css.Parser$Substate valueOf(java.lang.String):257:257 -> valueOf + 1:1:com.batch.android.messaging.css.Parser$Substate[] values():257:257 -> values +com.batch.android.messaging.css.Ruleset -> com.batch.android.z.h: +# {"id":"sourceFile","fileName":"Ruleset.java"} + java.util.List declarations -> b + java.lang.String selector -> a + 1:2:void ():12:13 -> +com.batch.android.messaging.css.Variable -> com.batch.android.z.i: +# {"id":"sourceFile","fileName":"Variable.java"} + 1:1:void ():3:3 -> +com.batch.android.messaging.css.builtin.BuiltinStyleProvider -> com.batch.android.a0.a: +# {"id":"sourceFile","fileName":"BuiltinStyleProvider.java"} + java.util.Map metaStyles -> a + 1:1:void ():15:15 -> + 1:1:void ():13:13 -> + 1:36:java.lang.String getContent(java.lang.String):20:55 -> a + 37:50:java.lang.String getContent(java.lang.String):46:59 -> a + 51:55:java.lang.String getContent(java.lang.String):44:48 -> a + 56:56:java.lang.String getContent(java.lang.String):42:42 -> a + 57:68:java.lang.String getContent(java.lang.String):40:51 -> a + 69:73:java.util.Map generateMetaStyles():66:70 -> a +com.batch.android.messaging.css.builtin.BuiltinStyles -> com.batch.android.a0.b: +# {"id":"sourceFile","fileName":"BuiltinStyles.java"} + java.lang.String IMAGE1_BASE -> g + java.lang.String BANNER_ICON_ADDON -> f + java.lang.String IMAGE1_FULLSCREEN -> i + java.lang.String IMAGE1_DETACHED -> h + java.lang.String WEBVIEW1 -> j + java.lang.String GENERIC1_H_CTA -> a + java.lang.String GENERIC1_BASE -> c + java.lang.String GENERIC1_V_CTA -> b + java.lang.String MODAL1 -> e + java.lang.String BANNER1 -> d + 1:1:void ():8:8 -> +com.batch.android.messaging.fragment.AlertTemplateFragment -> com.batch.android.b0.a: +# {"id":"sourceFile","fileName":"AlertTemplateFragment.java"} + java.lang.String TAG -> l + 1:1:void ():29:29 -> + 1:2:com.batch.android.messaging.fragment.AlertTemplateFragment newInstance(com.batch.android.BatchMessage,com.batch.android.messaging.model.AlertMessage):23:24 -> a + 3:3:void lambda$onCreateDialog$0(android.content.DialogInterface,int):63:63 -> a + 4:5:void lambda$onCreateDialog$1(com.batch.android.messaging.model.AlertMessage,android.content.DialogInterface,int):69:70 -> a + boolean canAutoClose() -> g + int getAutoCloseDelayMillis() -> i + void onAutoCloseCountdownStarted() -> l + void performAutoClose() -> m + 1:44:android.app.Dialog onCreateDialog(android.os.Bundle):35:78 -> onCreateDialog +com.batch.android.messaging.fragment.BaseDialogFragment -> com.batch.android.b0.b: +# {"id":"sourceFile","fileName":"BaseDialogFragment.java"} + android.util.LruCache imageCache -> h + com.batch.android.messaging.model.Message messageModel -> a + android.os.Handler autoCloseHandler -> e + java.lang.String TAG -> i + java.lang.String STATE_AUTOCLOSE_TARGET_UPTIME_KEY -> k + java.lang.String BUNDLE_KEY_MESSAGE_MODEL -> j + java.lang.ref.WeakReference eventListener -> b + long autoCloseAtUptime -> d + com.batch.android.module.MessagingModule messagingModule -> f + boolean automaticallyBeginAutoClose -> c + com.batch.android.MessagingAnalyticsDelegate analyticsDelegate -> g + 1:1:void ():52:52 -> + 2:20:void ():37:55 -> + 1:4:void setMessageArguments(com.batch.android.BatchMessage,com.batch.android.messaging.model.Message):59:62 -> a + 5:5:void setDialogEventListener(com.batch.android.messaging.fragment.DialogEventListener):121:121 -> a + 1:1:void put(com.batch.android.messaging.AsyncImageDownloadTask$Result):128:128 -> b + 2:2:com.batch.android.messaging.AsyncImageDownloadTask$Result get(java.lang.String):134:134 -> b + 1:10:void beginAutoCloseCountdown():200:209 -> f + boolean canAutoClose() -> g + 1:2:void dismissSafely():188:189 -> h + int getAutoCloseDelayMillis() -> i + 1:6:com.batch.android.messaging.model.Message getMessageModel():111:116 -> j + 1:3:com.batch.android.BatchMessage getPayloadMessage():101:103 -> k + void onAutoCloseCountdownStarted() -> l + void performAutoClose() -> m + 1:4:void scheduleAutoCloseTask():213:216 -> n + 1:3:void unscheduleAutoCloseTask():221:223 -> o + 1:3:void onCancel(android.content.DialogInterface):179:181 -> onCancel + 1:19:void onCreate(android.os.Bundle):67:85 -> onCreate + 1:15:void onDismiss(android.content.DialogInterface):159:173 -> onDismiss + 1:6:void onSaveInstanceState(android.os.Bundle):91:96 -> onSaveInstanceState + 1:7:void onStart():141:147 -> onStart + 1:2:void onStop():153:154 -> onStop +com.batch.android.messaging.fragment.DialogEventListener -> com.batch.android.b0.c: +# {"id":"sourceFile","fileName":"DialogEventListener.java"} +com.batch.android.messaging.fragment.ImageTemplateFragment -> com.batch.android.b0.d: +# {"id":"sourceFile","fileName":"ImageTemplateFragment.java"} + boolean darkStatusbar -> n + com.batch.android.messaging.AsyncImageDownloadTask heroDownloadTask -> s + boolean showStatusbar -> o + boolean statusbarBackgroundTranslucent -> p + com.batch.android.messaging.view.formats.ImageFormatView imageFormatView -> l + android.graphics.Bitmap heroBitmap -> r + com.batch.android.messaging.css.Document style -> m + java.lang.Integer statusbarBackgroundColor -> q + java.lang.String TAG -> u + boolean dismissed -> t + 1:1:void ():61:61 -> + 2:22:void ():42:62 -> + 1:2:com.batch.android.messaging.fragment.ImageTemplateFragment newInstance(com.batch.android.BatchMessage,com.batch.android.messaging.model.ImageMessage):56:57 -> a + 3:22:android.view.View getImageFormatView(android.content.Context):149:168 -> a + 23:28:android.view.View getImageFormatView(android.content.Context):166:171 -> a + 29:31:void onCloseAction():223:225 -> a + 1:8:void onGlobalAction():231:238 -> b + 9:11:void onErrorAction(com.batch.android.messaging.model.MessagingError):245:247 -> b + 1:1:void onImageDisplayedAction():253:253 -> d + 1:2:void dismiss():125:126 -> dismiss + 1:2:void dismissAllowingStateLoss():137:138 -> dismissAllowingStateLoss + 1:3:void onPanDismiss():258:260 -> e + 1:1:boolean canAutoClose():201:201 -> g + 1:2:void dismissSafely():143:144 -> h + 1:1:int getAutoCloseDelayMillis():206:206 -> i + 1:2:void onAutoCloseCountdownStarted():194:195 -> l + 1:4:void performAutoClose():211:214 -> m + 1:11:void onCreate(android.os.Bundle):67:77 -> onCreate + 1:3:android.view.View onCreateView(android.view.LayoutInflater,android.view.ViewGroup,android.os.Bundle):87:89 -> onCreateView + 1:6:void onDestroyView():104:109 -> onDestroyView + 1:1:void onDismiss(android.content.DialogInterface):114:114 -> onDismiss + 1:3:void onStart():96:98 -> onStart + 1:9:com.batch.android.messaging.css.Document getStyle():176:184 -> p + 10:17:com.batch.android.messaging.css.Document getStyle():180:187 -> p +com.batch.android.messaging.fragment.ListenableDialog -> com.batch.android.b0.e: +# {"id":"sourceFile","fileName":"ListenableDialog.java"} + void setDialogEventListener(com.batch.android.messaging.fragment.DialogEventListener) -> a +com.batch.android.messaging.fragment.ModalTemplateFragment -> com.batch.android.b0.f: +# {"id":"sourceFile","fileName":"ModalTemplateFragment.java"} + boolean darkStatusbar -> n + com.batch.android.messaging.AsyncImageDownloadTask heroDownloadTask -> s + boolean showStatusbar -> o + boolean statusbarBackgroundTranslucent -> p + android.graphics.Bitmap heroBitmap -> r + com.batch.android.messaging.view.formats.BannerView bannerView -> l + com.batch.android.messaging.css.Document style -> m + java.lang.Integer statusbarBackgroundColor -> q + java.lang.String TAG -> u + boolean dismissed -> t + 1:1:void ():67:67 -> + 2:13:void ():48:59 -> + 1:2:com.batch.android.messaging.fragment.ModalTemplateFragment newInstance(com.batch.android.BatchMessage,com.batch.android.messaging.model.ModalMessage):62:63 -> a + 3:20:android.view.View getBannerView(android.content.Context):170:187 -> a + 21:26:android.view.View getBannerView(android.content.Context):185:190 -> a + 27:29:void onCloseAction():273:275 -> a + 30:33:void onCTAAction(int,com.batch.android.messaging.model.CTA):281:284 -> a + 1:8:void onGlobalAction():290:297 -> b + 1:2:void dismiss():146:147 -> dismiss + 1:2:void dismissAllowingStateLoss():158:159 -> dismissAllowingStateLoss + 1:2:void onPanDismiss():304:305 -> e + 1:1:boolean canAutoClose():251:251 -> g + 1:2:void dismissSafely():164:165 -> h + 1:1:int getAutoCloseDelayMillis():256:256 -> i + 1:2:void onAutoCloseCountdownStarted():244:245 -> l + 1:4:void performAutoClose():261:264 -> m + 1:5:void onCreate(android.os.Bundle):71:75 -> onCreate + 6:12:void onCreate(android.os.Bundle):73:79 -> onCreate + 1:12:android.app.Dialog onCreateDialog(android.os.Bundle):84:95 -> onCreateDialog + 1:3:android.view.View onCreateView(android.view.LayoutInflater,android.view.ViewGroup,android.os.Bundle):108:110 -> onCreateView + 1:6:void onDestroyView():125:130 -> onDestroyView + 1:1:void onDismiss(android.content.DialogInterface):135:135 -> onDismiss + 1:3:void onStart():117:119 -> onStart + 1:9:com.batch.android.messaging.css.Document getStyle():195:203 -> p + 10:17:com.batch.android.messaging.css.Document getStyle():199:206 -> p + 1:25:void refreshStatusbarStyle():210:234 -> q +com.batch.android.messaging.fragment.UniversalTemplateFragment -> com.batch.android.b0.g: +# {"id":"sourceFile","fileName":"UniversalTemplateFragment.java"} + boolean darkStatusbar -> n + boolean showStatusbar -> o + boolean statusbarBackgroundTranslucent -> p + boolean mediaPlayerPrepared -> u + boolean dismissed -> w + com.batch.android.messaging.css.Document style -> m + android.view.Surface videoSurface -> v + com.batch.android.messaging.AsyncImageDownloadTask$Result heroDownloadResult -> r + com.batch.android.messaging.AsyncImageDownloadTask heroDownloadTask -> s + java.lang.String BUNDLE_KEY_MESSAGE_MODEL -> y + com.batch.android.messaging.view.formats.UniversalRootView view -> l + java.lang.String TAG -> x + java.lang.Integer statusbarBackgroundColor -> q + android.media.MediaPlayer mediaPlayer -> t + 1:1:void ():82:82 -> + 2:17:void ():59:74 -> + 1:2:com.batch.android.messaging.fragment.UniversalTemplateFragment newInstance(com.batch.android.BatchMessage,com.batch.android.messaging.model.UniversalMessage):77:78 -> a + 3:14:android.view.View getUniversalView(android.content.Context):234:245 -> a + 15:18:void onCloseAction():340:343 -> a + 19:24:void onCTAAction(int,com.batch.android.messaging.model.CTA):350:355 -> a + 25:26:void onImageDownloadSuccess(com.batch.android.messaging.AsyncImageDownloadTask$Result):367:368 -> a + 27:28:void onImageDownloadError(com.batch.android.messaging.model.MessagingError):373:374 -> a + 1:1:void onImageDownloadStart():361:361 -> c + 2:3:void displayImage(com.batch.android.messaging.AsyncImageDownloadTask$Result):378:379 -> c + 1:2:void dismiss():210:211 -> dismiss + 1:2:void dismissAllowingStateLoss():222:223 -> dismissAllowingStateLoss + 1:1:boolean canAutoClose():318:318 -> g + 1:2:void dismissSafely():228:229 -> h + 1:1:int getAutoCloseDelayMillis():323:323 -> i + 1:2:void onAutoCloseCountdownStarted():311:312 -> l + 1:4:void performAutoClose():328:331 -> m + 1:7:void onCreate(android.os.Bundle):86:92 -> onCreate + 8:19:void onCreate(android.os.Bundle):88:99 -> onCreate + 1:12:android.app.Dialog onCreateDialog(android.os.Bundle):104:115 -> onCreateDialog + 1:47:android.view.View onCreateView(android.view.LayoutInflater,android.view.ViewGroup,android.os.Bundle):128:174 -> onCreateView + 1:6:void onDestroyView():182:187 -> onDestroyView + 1:7:void onDismiss(android.content.DialogInterface):192:198 -> onDismiss + 1:2:void onPrepared(android.media.MediaPlayer):386:387 -> onPrepared + 1:6:void onSurfaceTextureAvailable(android.graphics.SurfaceTexture,int,int):401:406 -> onSurfaceTextureAvailable + 1:7:boolean onSurfaceTextureDestroyed(android.graphics.SurfaceTexture):414:420 -> onSurfaceTextureDestroyed + 1:9:com.batch.android.messaging.css.Document getStyle():249:257 -> p + 10:17:com.batch.android.messaging.css.Document getStyle():253:260 -> p + 1:25:void refreshStatusbarStyle():264:288 -> q + 1:5:boolean shouldWaitForHeroImage():295:299 -> r + 1:3:void startPlayingVideo():393:395 -> s +com.batch.android.messaging.fragment.WebViewTemplateFragment -> com.batch.android.b0.h: +# {"id":"sourceFile","fileName":"WebViewTemplateFragment.java"} + boolean darkStatusbar -> n + com.batch.android.messaging.view.formats.WebFormatView webView -> l + boolean showStatusbar -> o + boolean statusbarBackgroundTranslucent -> p + com.batch.android.messaging.css.Document style -> m + boolean dismissed -> r + int developmentMenuReloadItemID -> s + java.lang.Integer statusbarBackgroundColor -> q + java.lang.String TAG -> t + 1:1:void ():75:75 -> + 2:21:void ():57:76 -> + 1:1:void lambda$showDevelopmentError$0(android.content.DialogInterface,int):0:0 -> a + 2:3:com.batch.android.messaging.fragment.WebViewTemplateFragment newInstance(com.batch.android.BatchMessage,com.batch.android.messaging.model.WebViewMessage):70:71 -> a + 4:21:android.view.View getWebFormatView(android.content.Context):202:219 -> a + 22:27:android.view.View getWebFormatView(android.content.Context):217:222 -> a + 28:28:void lambda$showDevelopmentError$1(com.batch.android.messaging.model.MessagingError,android.content.DialogInterface):330:330 -> a + 29:31:void onCloseAction():339:341 -> a + 32:32:void onDismissAction(java.lang.String):347:347 -> a + 33:36:void onErrorAction(com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause,com.batch.android.messaging.model.MessagingError,java.lang.String):356:359 -> a + 37:49:void onOpenDeeplinkAction(java.lang.String,java.lang.Boolean,java.lang.String):369:381 -> a + 50:56:void onPerformAction(java.lang.String,com.batch.android.json.JSONObject,java.lang.String):389:395 -> a + 1:17:boolean showDevelopmentError(com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause,com.batch.android.messaging.model.MessagingError,java.lang.String):287:303 -> b + 18:18:boolean showDevelopmentError(com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause,com.batch.android.messaging.model.MessagingError,java.lang.String):295:295 -> b + 19:19:boolean showDevelopmentError(com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause,com.batch.android.messaging.model.MessagingError,java.lang.String):292:292 -> b + 20:63:boolean showDevelopmentError(com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause,com.batch.android.messaging.model.MessagingError,java.lang.String):289:332 -> b + 1:3:void dismissForError(com.batch.android.messaging.model.MessagingError):273:275 -> c + 1:2:void dismiss():178:179 -> dismiss + 1:2:void dismissAllowingStateLoss():190:191 -> dismissAllowingStateLoss + boolean canAutoClose() -> g + 1:2:void dismissSafely():196:197 -> h + int getAutoCloseDelayMillis() -> i + void onAutoCloseCountdownStarted() -> l + void performAutoClose() -> m + 1:3:void onCreate(android.os.Bundle):81:83 -> onCreate + 1:7:void onCreateContextMenu(android.view.ContextMenu,android.view.View,android.view.ContextMenu$ContextMenuInfo):150:156 -> onCreateContextMenu + 1:12:android.app.Dialog onCreateDialog(android.os.Bundle):121:132 -> onCreateDialog + 1:14:android.view.View onCreateView(android.view.LayoutInflater,android.view.ViewGroup,android.os.Bundle):94:107 -> onCreateView + 1:6:void onDestroyView():140:145 -> onDestroyView + 1:2:boolean onMenuItemClick(android.view.MenuItem):163:164 -> onMenuItemClick + 1:2:void onSaveInstanceState(android.os.Bundle):115:116 -> onSaveInstanceState + 1:9:com.batch.android.messaging.css.Document getStyle():258:266 -> p + 10:17:com.batch.android.messaging.css.Document getStyle():262:269 -> p + 1:25:void refreshStatusbarStyle():227:251 -> q +com.batch.android.messaging.fragment.WebViewTemplateFragment$1 -> com.batch.android.b0.h$a: +# {"id":"sourceFile","fileName":"WebViewTemplateFragment.java"} + int[] $SwitchMap$com$batch$android$BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause -> a + 1:1:void ():287:287 -> +com.batch.android.messaging.gif.BasicBitmapProvider -> com.batch.android.c0.a: +# {"id":"sourceFile","fileName":"BasicBitmapProvider.java"} + 1:1:void ():9:9 -> + 1:1:void release(byte[]):0:0 -> a + 2:2:void release(int[]):0:0 -> a + 3:3:android.graphics.Bitmap obtain(int,int,android.graphics.Bitmap$Config):14:14 -> a + 4:4:void release(android.graphics.Bitmap):19:19 -> a + 5:5:byte[] obtainByteArray(int):25:25 -> a + 1:1:int[] obtainIntArray(int):36:36 -> b +com.batch.android.messaging.gif.GifDecoder -> com.batch.android.c0.b: +# {"id":"sourceFile","fileName":"GifDecoder.java"} + int STATUS_PARTIAL_DECODE -> d + int TOTAL_ITERATION_COUNT_FOREVER -> e + int STATUS_FORMAT_ERROR -> b + int STATUS_OPEN_ERROR -> c + int STATUS_OK -> a + int getDelay(int) -> a + int read(java.io.InputStream,int) -> a + int read(byte[]) -> a + void setData(com.batch.android.messaging.gif.GifHeader,java.nio.ByteBuffer) -> a + void setData(com.batch.android.messaging.gif.GifHeader,java.nio.ByteBuffer,int) -> a + void setData(com.batch.android.messaging.gif.GifHeader,byte[]) -> a + void setDefaultBitmapConfig(android.graphics.Bitmap$Config) -> a + java.nio.ByteBuffer getData() -> e + int getCurrentFrameIndex() -> f + int getFrameCount() -> g + int getByteSize() -> h + int getNextDelay() -> i + int getLoopCount() -> j + android.graphics.Bitmap getNextFrame() -> k + int getWidth() -> l + void advance() -> m + int getNetscapeLoopCount() -> n + int getTotalIterationCount() -> o + int getHeight() -> p + void resetFrameIndex() -> q + int getStatus() -> r +com.batch.android.messaging.gif.GifDecoder$BitmapProvider -> com.batch.android.c0.b$a: +# {"id":"sourceFile","fileName":"GifDecoder.java"} + android.graphics.Bitmap obtain(int,int,android.graphics.Bitmap$Config) -> a + byte[] obtainByteArray(int) -> a + void release(android.graphics.Bitmap) -> a + void release(byte[]) -> a + void release(int[]) -> a + int[] obtainIntArray(int) -> b +com.batch.android.messaging.gif.GifDecoder$GifDecodeStatus -> com.batch.android.c0.b$b: +# {"id":"sourceFile","fileName":"GifDecoder.java"} +com.batch.android.messaging.gif.GifDrawable -> com.batch.android.c0.c: +# {"id":"sourceFile","fileName":"GifDrawable.java"} + java.util.Queue nextFrames -> g + int MESSAGE_RAN_OUT_OF_MEMORY -> n + int BUFFER_SIZE -> l + int MESSAGE_FRAME_PRODUCED -> m + long nextFrameDeadline -> h + int dpi -> b + java.util.concurrent.Executor frameProducerExecutor -> k + android.graphics.Paint paint -> a + com.batch.android.messaging.gif.GifDecoder gifDecoder -> e + com.batch.android.messaging.gif.GifDrawable$FrameInfo currentFrame -> f + java.lang.Runnable produceNextFrameRunnable -> j + boolean animating -> c + android.os.Handler mainThreadHandler -> i + boolean ranOutOfMemory -> d + 1:1:void (android.content.Context,com.batch.android.messaging.gif.GifDecoder):58:58 -> + 2:28:void (android.content.Context,com.batch.android.messaging.gif.GifDecoder):38:64 -> + 1:1:void access$000(com.batch.android.messaging.gif.GifDrawable,com.batch.android.messaging.gif.GifDrawable$FrameInfo):25:25 -> a + 2:2:void access$100(com.batch.android.messaging.gif.GifDrawable):25:25 -> a + 3:14:void produceNextFrame():72:83 -> a + 15:15:void onFrameProduced(com.batch.android.messaging.gif.GifDrawable$FrameInfo):89:89 -> a + 1:9:void ranOutOfMemory():130:138 -> b + 1:28:void requestNewFrameIfNeeded():94:121 -> c + 1:4:void draw(android.graphics.Canvas):149:152 -> draw + 1:4:int getIntrinsicHeight():175:178 -> getIntrinsicHeight + 1:4:int getIntrinsicWidth():184:187 -> getIntrinsicWidth + 1:1:int getOpacity():166:166 -> getOpacity + 1:1:boolean isRunning():210:210 -> isRunning + 1:1:void setAlpha(int):158:158 -> setAlpha + 1:5:void start():196:200 -> start + 1:1:void stop():205:205 -> stop +com.batch.android.messaging.gif.GifDrawable$1 -> com.batch.android.c0.c$a: +# {"id":"sourceFile","fileName":"GifDrawable.java"} + com.batch.android.messaging.gif.GifDrawable this$0 -> a + 1:1:void (com.batch.android.messaging.gif.GifDrawable,android.os.Looper):43:43 -> + 1:4:void handleMessage(android.os.Message):46:49 -> handleMessage +com.batch.android.messaging.gif.GifDrawable$FrameInfo -> com.batch.android.c0.c$b: +# {"id":"sourceFile","fileName":"GifDrawable.java"} + android.graphics.Bitmap bitmap -> a + int delay -> b + 1:3:void (android.graphics.Bitmap,int):218:220 -> +com.batch.android.messaging.gif.GifFrame -> com.batch.android.c0.d: +# {"id":"sourceFile","fileName":"GifFrame.java"} + int DISPOSAL_BACKGROUND -> n + int DISPOSAL_PREVIOUS -> o + int DISPOSAL_UNSPECIFIED -> l + int DISPOSAL_NONE -> m + int bufferFrameStart -> j + int transIndex -> h + int delay -> i + int dispose -> g + int ih -> d + int iy -> b + int iw -> c + int ix -> a + boolean interlace -> e + boolean transparency -> f + int[] lct -> k + 1:1:void ():13:13 -> +com.batch.android.messaging.gif.GifFrame$GifDisposalMethod -> com.batch.android.c0.d$a: +# {"id":"sourceFile","fileName":"GifFrame.java"} +com.batch.android.messaging.gif.GifHeader -> com.batch.android.c0.e: +# {"id":"sourceFile","fileName":"GifHeader.java"} + int NETSCAPE_LOOP_COUNT_FOREVER -> n + int NETSCAPE_LOOP_COUNT_DOES_NOT_EXIST -> o + int bgColor -> l + int loopCount -> m + int bgIndex -> j + int pixelAspect -> k + int gctSize -> i + int width -> f + int height -> g + int[] gct -> a + int status -> b + int frameCount -> c + java.util.List frames -> e + com.batch.android.messaging.gif.GifFrame currentFrame -> d + boolean gctFlag -> h + 1:51:void ():15:65 -> + 1:1:int getHeight():68:68 -> a + 1:1:int getNumFrames():76:76 -> b + 1:1:int getStatus():84:84 -> c + 1:1:int getWidth():72:72 -> d +com.batch.android.messaging.gif.GifHeaderParser -> com.batch.android.c0.f: +# {"id":"sourceFile","fileName":"GifHeaderParser.java"} + int GCE_MASK_DISPOSAL_METHOD -> n + int GCE_DISPOSAL_METHOD_SHIFT -> o + int LABEL_COMMENT_EXTENSION -> l + int LABEL_PLAIN_TEXT_EXTENSION -> m + int LABEL_GRAPHIC_CONTROL_EXTENSION -> j + int LABEL_APPLICATION_EXTENSION -> k + int EXTENSION_INTRODUCER -> h + com.batch.android.messaging.gif.GifHeader header -> c + int TRAILER -> i + int MASK_INT_LOWEST_BYTE -> f + int IMAGE_SEPARATOR -> g + int blockSize -> d + java.nio.ByteBuffer rawData -> b + byte[] block -> a + int MAX_BLOCK_SIZE -> x + int MIN_FRAME_DELAY -> v + int DEFAULT_FRAME_DELAY -> w + int LSD_MASK_GCT_FLAG -> t + int LSD_MASK_GCT_SIZE -> u + int DESCRIPTOR_MASK_INTERLACE_FLAG -> r + int DESCRIPTOR_MASK_LCT_SIZE -> s + java.lang.String TAG -> e + int GCE_MASK_TRANSPARENT_COLOR_FLAG -> p + int DESCRIPTOR_MASK_LCT_FLAG -> q + 1:114:void ():21:134 -> + 1:3:com.batch.android.messaging.gif.GifHeader parse(java.nio.ByteBuffer):137:139 -> a + 4:7:com.batch.android.messaging.gif.GifHeaderParser setData(byte[]):152:155 -> a + 8:9:void clear():161:162 -> a + 10:30:int[] readColorTable(int):432:452 -> a + 1:4:com.batch.android.messaging.gif.GifHeaderParser setData(java.nio.ByteBuffer):143:146 -> b + 5:57:void readContents(int):217:269 -> b + 58:92:void readContents(int):225:259 -> b + 93:106:void readContents(int):239:252 -> b + 107:127:void readContents(int):235:255 -> b + 128:128:boolean err():526:526 -> b + 1:5:boolean isAnimated():197:201 -> c + 1:16:com.batch.android.messaging.gif.GifHeader parseHeader():174:189 -> d + 17:17:com.batch.android.messaging.gif.GifHeader parseHeader():175:175 -> d + 1:3:int read():510:512 -> e + 1:41:void readBitmap():318:358 -> f + 1:16:void readBlock():484:499 -> g + 1:1:void readContents():208:208 -> h + 1:32:void readGraphicControlExt():279:310 -> i + 1:12:void readHeader():380:391 -> j + 1:20:void readLSD():400:419 -> k + 1:8:void readNetscapeExt():366:373 -> l + 1:1:int readShort():522:522 -> m + 1:4:void reset():166:169 -> n + 1:3:void skip():474:476 -> o + 1:3:void skipImageData():463:465 -> p +com.batch.android.messaging.gif.GifHelper -> com.batch.android.c0.g: +# {"id":"sourceFile","fileName":"GifHelper.java"} + int NEEDED_BYTES_FOR_TYPE_CHECK -> a + 1:1:void ():8:8 -> + 1:8:boolean isPotentiallyAGif(int[]):19:26 -> a + 9:14:boolean dataStartsWith(int[],byte[]):34:39 -> a + 15:19:com.batch.android.messaging.gif.GifDrawable getDrawableForBytes(android.content.Context,byte[],boolean):53:57 -> a +com.batch.android.messaging.gif.StandardGifDecoder -> com.batch.android.c0.h: +# {"id":"sourceFile","fileName":"StandardGifDecoder.java"} + byte[] mainPixels -> o + short[] prefix -> l + java.nio.ByteBuffer rawData -> i + byte[] suffix -> m + android.graphics.Bitmap$Config bitmapConfig -> z + int COLOR_TRANSPARENT_BLACK -> G + int BYTES_PER_INTEGER -> E + int NULL_CODE -> C + int[] act -> f + com.batch.android.messaging.gif.GifHeader header -> r + com.batch.android.messaging.gif.GifDecoder$BitmapProvider bitmapProvider -> h + int downsampledHeight -> w + byte[] block -> j + int[] mainScratch -> p + int status -> u + int framePointer -> q + android.graphics.Bitmap previousImage -> s + byte[] pixelStack -> n + int MASK_INT_LOWEST_BYTE -> F + int INITIAL_FRAME_POINTER -> D + int MAX_STACK_SIZE -> B + boolean savePrevious -> t + int[] pct -> g + int downsampledWidth -> x + java.lang.Boolean isFirstFrameTransparent -> y + int sampleSize -> v + java.lang.String TAG -> A + com.batch.android.messaging.gif.GifHeaderParser parser -> k + 1:1:void (com.batch.android.messaging.gif.GifDecoder$BitmapProvider,java.nio.ByteBuffer):139:139 -> + 2:2:void (com.batch.android.messaging.gif.GifDecoder$BitmapProvider,com.batch.android.messaging.gif.GifHeader,java.nio.ByteBuffer):144:144 -> + 3:4:void (com.batch.android.messaging.gif.GifDecoder$BitmapProvider,com.batch.android.messaging.gif.GifHeader,java.nio.ByteBuffer,int):153:154 -> + 5:5:void (com.batch.android.messaging.gif.GifDecoder$BitmapProvider):157:157 -> + 6:72:void (com.batch.android.messaging.gif.GifDecoder$BitmapProvider):93:159 -> + 1:2:int getDelay(int):191:192 -> a + 3:27:int read(java.io.InputStream,int):312:336 -> a + 28:28:void setData(com.batch.android.messaging.gif.GifHeader,byte[]):361:361 -> a + 29:29:void setData(com.batch.android.messaging.gif.GifHeader,java.nio.ByteBuffer):366:366 -> a + 30:54:void setData(com.batch.android.messaging.gif.GifHeader,java.nio.ByteBuffer,int):375:399 -> a + 55:55:void setData(com.batch.android.messaging.gif.GifHeader,java.nio.ByteBuffer,int):372:372 -> a + 56:59:com.batch.android.messaging.gif.GifHeaderParser getHeaderParser():404:407 -> a + 60:65:int read(byte[]):413:418 -> a + 66:72:void setDefaultBitmapConfig(android.graphics.Bitmap$Config):424:430 -> a + 73:120:android.graphics.Bitmap setPixels(com.batch.android.messaging.gif.GifFrame,com.batch.android.messaging.gif.GifFrame):439:486 -> a + 121:139:android.graphics.Bitmap setPixels(com.batch.android.messaging.gif.GifFrame,com.batch.android.messaging.gif.GifFrame):483:501 -> a + 140:155:android.graphics.Bitmap setPixels(com.batch.android.messaging.gif.GifFrame,com.batch.android.messaging.gif.GifFrame):499:514 -> a + 156:245:void copyCopyIntoScratchRobust(com.batch.android.messaging.gif.GifFrame):564:653 -> a + 246:280:int averageColorsNear(int,int,int):668:702 -> a + 1:42:void copyIntoScratchFast(com.batch.android.messaging.gif.GifFrame):519:560 -> b + 43:45:android.graphics.Bitmap getNextBitmap():864:866 -> b + 1:123:void decodeBitmapData(com.batch.android.messaging.gif.GifFrame):717:839 -> c + 124:128:int readBlock():855:859 -> c + 1:15:void clear():341:355 -> clear + 1:1:int readByte():846:846 -> d + 1:1:java.nio.ByteBuffer getData():175:175 -> e + 1:1:int getCurrentFrameIndex():213:213 -> f + 1:1:int getFrameCount():208:208 -> g + 1:1:int getByteSize():248:248 -> h + 1:5:int getNextDelay():199:203 -> i + 1:1:int getLoopCount():224:224 -> j + 1:51:android.graphics.Bitmap getNextFrame():254:304 -> k + 52:53:android.graphics.Bitmap getNextFrame():264:265 -> k + 1:1:int getWidth():164:164 -> l + 1:1:void advance():185:185 -> m + 1:1:int getNetscapeLoopCount():232:232 -> n + 1:1:int getTotalIterationCount():237:237 -> o + 1:1:int getHeight():169:169 -> p + 1:1:void resetFrameIndex():218:218 -> q + 1:1:int getStatus():180:180 -> r +com.batch.android.messaging.model.Action -> com.batch.android.d0.a: +# {"id":"sourceFile","fileName":"Action.java"} + com.batch.android.json.JSONObject args -> b + java.lang.String action -> a + 1:3:void (java.lang.String,com.batch.android.json.JSONObject):13:15 -> + 1:1:boolean isDismissAction():19:19 -> a +com.batch.android.messaging.model.AlertMessage -> com.batch.android.d0.b: +# {"id":"sourceFile","fileName":"AlertMessage.java"} + java.lang.String titleText -> g + java.lang.String cancelButtonText -> h + com.batch.android.messaging.model.CTA acceptCTA -> i + 1:1:void ():5:5 -> +com.batch.android.messaging.model.BannerMessage -> com.batch.android.d0.c: +# {"id":"sourceFile","fileName":"BannerMessage.java"} + 1:1:void ():5:5 -> +com.batch.android.messaging.model.BaseBannerMessage -> com.batch.android.d0.d: +# {"id":"sourceFile","fileName":"BaseBannerMessage.java"} + java.lang.String css -> g + com.batch.android.messaging.model.Action globalTapAction -> i + long globalTapDelay -> j + boolean showCloseButton -> o + java.lang.String titleText -> h + boolean allowSwipeToDismiss -> k + java.lang.String imageDescription -> m + java.lang.String imageURL -> l + com.batch.android.messaging.model.BaseBannerMessage$CTADirection ctaDirection -> q + java.util.List ctas -> n + int autoCloseDelay -> p + 1:15:void ():7:21 -> +com.batch.android.messaging.model.BaseBannerMessage$CTADirection -> com.batch.android.d0.d$a: +# {"id":"sourceFile","fileName":"BaseBannerMessage.java"} + com.batch.android.messaging.model.BaseBannerMessage$CTADirection VERTICAL -> b + com.batch.android.messaging.model.BaseBannerMessage$CTADirection[] $VALUES -> c + com.batch.android.messaging.model.BaseBannerMessage$CTADirection HORIZONTAL -> a + 1:2:void ():24:25 -> + 3:3:void ():23:23 -> + 1:1:void (java.lang.String,int):23:23 -> + 1:1:com.batch.android.messaging.model.BaseBannerMessage$CTADirection[] $values():23:23 -> a + 1:1:com.batch.android.messaging.model.BaseBannerMessage$CTADirection valueOf(java.lang.String):23:23 -> valueOf + 1:1:com.batch.android.messaging.model.BaseBannerMessage$CTADirection[] values():23:23 -> values +com.batch.android.messaging.model.CTA -> com.batch.android.d0.e: +# {"id":"sourceFile","fileName":"CTA.java"} + java.lang.String label -> c + 1:2:void (java.lang.String,java.lang.String,com.batch.android.json.JSONObject):13:14 -> +com.batch.android.messaging.model.ImageMessage -> com.batch.android.d0.f: +# {"id":"sourceFile","fileName":"ImageMessage.java"} + java.lang.String css -> g + int autoCloseDelay -> n + com.batch.android.messaging.model.Action globalTapAction -> h + long globalTapDelay -> i + boolean isFullscreen -> o + java.lang.String imageURL -> k + boolean allowSwipeToDismiss -> j + java.lang.String imageDescription -> l + com.batch.android.messaging.Size2D imageSize -> m + 1:1:void ():6:6 -> +com.batch.android.messaging.model.Message -> com.batch.android.d0.g: +# {"id":"sourceFile","fileName":"Message.java"} + com.batch.android.json.JSONObject eventData -> e + com.batch.android.messaging.model.Message$Source source -> f + java.lang.String messageIdentifier -> a + java.lang.String bodyText -> c + java.lang.String devTrackingIdentifier -> b + java.lang.String bodyRawHtml -> d + 1:12:void ():10:21 -> + 1:5:java.lang.CharSequence getBody():28:32 -> a + 1:12:android.text.Spanned getSpannedBody():37:48 -> b +com.batch.android.messaging.model.Message$Source -> com.batch.android.d0.g$a: +# {"id":"sourceFile","fileName":"Message.java"} + com.batch.android.messaging.model.Message$Source[] $VALUES -> e + com.batch.android.messaging.model.Message$Source UNKNOWN -> a + com.batch.android.messaging.model.Message$Source LANDING -> b + com.batch.android.messaging.model.Message$Source LOCAL -> c + com.batch.android.messaging.model.Message$Source INBOX_LANDING -> d + 1:4:void ():56:59 -> + 5:5:void ():55:55 -> + 1:1:void (java.lang.String,int):55:55 -> + 1:1:com.batch.android.messaging.model.Message$Source[] $values():55:55 -> a + 1:1:com.batch.android.messaging.model.Message$Source valueOf(java.lang.String):55:55 -> valueOf + 1:1:com.batch.android.messaging.model.Message$Source[] values():55:55 -> values +com.batch.android.messaging.model.MessagingError -> com.batch.android.d0.h: +# {"id":"sourceFile","fileName":"MessagingError.java"} + com.batch.android.messaging.model.MessagingError UNKNOWN -> b + com.batch.android.messaging.model.MessagingError INVALID_RESPONSE -> d + com.batch.android.messaging.model.MessagingError SERVER_FAILURE -> c + com.batch.android.messaging.model.MessagingError CLIENT_NETWORK -> e + com.batch.android.messaging.model.MessagingError[] $VALUES -> f + int code -> a + 1:16:void ():10:25 -> + 17:17:void ():6:6 -> + 1:2:void (java.lang.String,int,int):29:30 -> + 1:1:com.batch.android.messaging.model.MessagingError[] $values():6:6 -> a + 1:1:com.batch.android.messaging.model.MessagingError valueOf(java.lang.String):6:6 -> valueOf + 1:1:com.batch.android.messaging.model.MessagingError[] values():6:6 -> values +com.batch.android.messaging.model.ModalMessage -> com.batch.android.d0.i: +# {"id":"sourceFile","fileName":"ModalMessage.java"} + 1:1:void ():5:5 -> +com.batch.android.messaging.model.UniversalMessage -> com.batch.android.d0.j: +# {"id":"sourceFile","fileName":"UniversalMessage.java"} + java.lang.String css -> g + java.lang.String titleText -> i + java.lang.String headingText -> h + java.lang.String subtitleText -> j + java.lang.String videoURL -> m + java.lang.String heroImageURL -> l + java.lang.Boolean showCloseButton -> o + java.lang.String heroDescription -> n + java.lang.Boolean attachCTAsBottom -> p + java.lang.Boolean flipHeroVertical -> s + java.lang.Boolean flipHeroHorizontal -> t + java.lang.Boolean stackCTAsHorizontally -> q + java.lang.Boolean stretchCTAsHorizontally -> r + java.lang.Double heroSplitRatio -> u + int autoCloseDelay -> v + java.util.List ctas -> k + 1:9:void ():9:17 -> + 1:6:java.lang.String getVoiceString():32:37 -> c +com.batch.android.messaging.model.WebViewMessage -> com.batch.android.d0.k: +# {"id":"sourceFile","fileName":"WebViewMessage.java"} + java.lang.String css -> g + java.lang.String url -> h + boolean openDeeplinksInApp -> j + boolean devMode -> k + int timeout -> i + 1:1:void ():5:5 -> +com.batch.android.messaging.view.AnimatedCloseButton -> com.batch.android.messaging.view.a: +# {"id":"sourceFile","fileName":"AnimatedCloseButton.java"} + long duration -> v + long animationEndDate -> u + boolean animating -> t + 1:1:void (android.content.Context):21:21 -> + 2:4:void (android.content.Context):16:18 -> + 5:5:void (android.content.Context,android.util.AttributeSet):25:25 -> + 6:8:void (android.content.Context,android.util.AttributeSet):16:18 -> + 9:9:void (android.content.Context,android.util.AttributeSet,int):29:29 -> + 10:12:void (android.content.Context,android.util.AttributeSet,int):16:18 -> + 13:13:void (android.content.Context,android.util.AttributeSet,int,int):34:34 -> + 14:16:void (android.content.Context,android.util.AttributeSet,int,int):16:18 -> + 1:5:void animateForDuration(long):38:42 -> a + 1:1:boolean isAnimating():46:46 -> d + 1:12:void onAnimationFrame():52:63 -> e + 1:3:void onDraw(android.graphics.Canvas):69:71 -> onDraw + 1:11:void onRestoreInstanceState(android.os.Parcelable):89:99 -> onRestoreInstanceState + 1:4:android.os.Parcelable onSaveInstanceState():80:83 -> onSaveInstanceState +com.batch.android.messaging.view.AnimatedCountdownSavedState -> com.batch.android.messaging.view.AnimatedCountdownSavedState: +# {"id":"sourceFile","fileName":"AnimatedCountdownSavedState.java"} + long animationEndDate -> b + long duration -> c + boolean animating -> a + 1:1:void ():64:64 -> + 1:1:void (android.os.Parcel):20:20 -> + 2:8:void (android.os.Parcel):15:21 -> + 9:9:void (android.os.Parcel,java.lang.ClassLoader):27:27 -> + 10:23:void (android.os.Parcel,java.lang.ClassLoader):15:28 -> + 24:24:void (android.os.Parcelable):33:33 -> + 25:27:void (android.os.Parcelable):15:17 -> + 1:3:void readParcel(android.os.Parcel,java.lang.ClassLoader):37:39 -> a + 1:1:java.lang.String toString():53:53 -> toString + 1:4:void writeToParcel(android.os.Parcel,int):44:47 -> writeToParcel +com.batch.android.messaging.view.AnimatedCountdownSavedState$1 -> com.batch.android.messaging.view.AnimatedCountdownSavedState$a: +# {"id":"sourceFile","fileName":"AnimatedCountdownSavedState.java"} + 1:1:void ():64:64 -> + 1:1:com.batch.android.messaging.view.AnimatedCountdownSavedState createFromParcel(android.os.Parcel):67:67 -> a + 2:2:com.batch.android.messaging.view.AnimatedCountdownSavedState[] newArray(int):71:71 -> a + 1:1:java.lang.Object createFromParcel(android.os.Parcel):64:64 -> createFromParcel + 1:1:java.lang.Object[] newArray(int):64:64 -> newArray +com.batch.android.messaging.view.CloseButton -> com.batch.android.messaging.view.CloseButton: +# {"id":"sourceFile","fileName":"CloseButton.java"} + boolean showBorder -> n + float countdownProgress -> f + java.lang.String TAG -> o + int computedGlyphPadding -> g + int glyphPadding -> d + int glyphWidth -> e + int backgroundColor -> b + android.graphics.RectF countdownOval -> l + int glyphColor -> c + int padding -> a + android.graphics.RectF borderOval -> m + android.graphics.Paint borderPaint -> j + android.graphics.Paint glyphPaint -> i + android.graphics.Paint backgroundPaint -> h + android.graphics.drawable.Drawable foregoundDrawable -> k + int UNSCALED_GLYPH_PADDING_PX -> r + int UNSCALED_GLYPH_WIDTH_PX -> s + int DEFAULT_SIZE_DP -> p + int DEFAULT_PADDING_DP -> q + 1:1:void (android.content.Context):66:66 -> + 2:32:void (android.content.Context):37:67 -> + 33:33:void (android.content.Context,android.util.AttributeSet):71:71 -> + 34:69:void (android.content.Context,android.util.AttributeSet):37:72 -> + 70:70:void (android.content.Context,android.util.AttributeSet,int):76:76 -> + 71:111:void (android.content.Context,android.util.AttributeSet,int):37:77 -> + 112:112:void (android.content.Context,android.util.AttributeSet,int,int):82:82 -> + 113:159:void (android.content.Context,android.util.AttributeSet,int,int):37:83 -> + 1:33:void init():87:119 -> a + 34:71:void applyStyleRules(java.util.Map):322:359 -> a + 1:9:void recomputeMetrics():144:152 -> b + 10:17:void recomputeMetrics():151:158 -> b + 18:18:void recomputeMetrics():156:156 -> b + 19:32:void recomputeMetrics():155:168 -> b + 1:18:void refreshPaint():123:140 -> c + 1:5:void draw(android.graphics.Canvas):292:296 -> draw + 1:3:void drawableHotspotChanged(float,float):395:397 -> drawableHotspotChanged + 1:7:void drawableStateChanged():370:376 -> drawableStateChanged + 1:1:android.view.ViewOutlineProvider getOutlineProvider():249:249 -> getOutlineProvider + 1:1:int getPadding():212:212 -> getPadding + 1:3:void jumpDrawablesToCurrentState():386:388 -> jumpDrawablesToCurrentState + 1:7:void onDraw(android.graphics.Canvas):264:270 -> onDraw + 8:19:void onDraw(android.graphics.Canvas):266:277 -> onDraw + 20:33:void onDraw(android.graphics.Canvas):273:286 -> onDraw + 1:16:void onMeasure(int,int):302:317 -> onMeasure + 1:5:void onSizeChanged(int,int,int,int):254:258 -> onSizeChanged + 1:2:void setBackgroundColor(int):173:174 -> setBackgroundColor + 1:2:void setCountdownProgress(float):221:222 -> setCountdownProgress + 1:2:void setForegoundDrawable(android.graphics.drawable.Drawable):183:184 -> setForegoundDrawable + 1:2:void setGlyphColor(int):178:179 -> setGlyphColor + 1:3:void setGlyphPadding(int):231:233 -> setGlyphPadding + 1:3:void setGlyphWidth(int):242:244 -> setGlyphWidth + 1:1:void setPadding(int,int,int,int):202:202 -> setPadding + 2:3:void setPadding(int):207:208 -> setPadding + 1:2:void setShowBorder(boolean):191:192 -> setShowBorder + 1:1:boolean verifyDrawable(android.graphics.drawable.Drawable):381:381 -> verifyDrawable +com.batch.android.messaging.view.CloseButton$1 -> com.batch.android.messaging.view.CloseButton$a: +# {"id":"sourceFile","fileName":"CloseButton.java"} + com.batch.android.messaging.view.CloseButton this$0 -> a + 1:1:void (com.batch.android.messaging.view.CloseButton):89:89 -> + 1:5:void getOutline(android.view.View,android.graphics.Outline):92:96 -> getOutline + 6:6:void getOutline(android.view.View,android.graphics.Outline):92:92 -> getOutline +com.batch.android.messaging.view.CountdownView -> com.batch.android.e0.a: +# {"id":"sourceFile","fileName":"CountdownView.java"} + long animationEndDate -> b + long duration -> c + int MAX_PROGRESS -> e + boolean animating -> a + java.lang.String TAG -> d + 1:1:void (android.content.Context):35:35 -> + 2:10:void (android.content.Context):30:38 -> + 1:8:void applyStyleRules(java.util.Map):43:50 -> a + 9:13:void animateForDuration(long):57:61 -> a + 14:25:void onAnimationFrame():71:82 -> a + 1:1:boolean isAnimating():65:65 -> isAnimating + 1:3:void onDraw(android.graphics.Canvas):88:90 -> onDraw + 1:11:void onRestoreInstanceState(android.os.Parcelable):119:129 -> onRestoreInstanceState + 1:4:android.os.Parcelable onSaveInstanceState():110:113 -> onSaveInstanceState + 1:4:void setColor(int):99:102 -> setColor +com.batch.android.messaging.view.DelegatedTouchEventViewGroup -> com.batch.android.e0.b: +# {"id":"sourceFile","fileName":"DelegatedTouchEventViewGroup.java"} + boolean superOnTouchEvent(android.view.MotionEvent) -> a + boolean superOnInterceptTouchEvent(android.view.MotionEvent) -> b +com.batch.android.messaging.view.DelegatedTouchEventViewGroup$Delegate -> com.batch.android.e0.b$a: +# {"id":"sourceFile","fileName":"DelegatedTouchEventViewGroup.java"} + boolean onInterceptTouchEvent(android.view.MotionEvent,com.batch.android.messaging.view.DelegatedTouchEventViewGroup) -> a + boolean onTouchEvent(android.view.MotionEvent,com.batch.android.messaging.view.DelegatedTouchEventViewGroup,boolean) -> a +com.batch.android.messaging.view.FixedRatioFrameLayout -> com.batch.android.e0.c: +# {"id":"sourceFile","fileName":"FixedRatioFrameLayout.java"} + com.batch.android.messaging.Size2D targetSize -> a + 1:2:void (android.content.Context,com.batch.android.messaging.Size2D):21:22 -> + 3:3:void (android.content.Context,android.util.AttributeSet):26:26 -> + 4:4:void (android.content.Context,android.util.AttributeSet,int):30:30 -> + 5:5:void (android.content.Context,android.util.AttributeSet,int,int):40:40 -> + 1:1:void init(com.batch.android.messaging.Size2D):44:44 -> a + 1:30:void onMeasure(int,int):57:86 -> onMeasure + 31:31:void onMeasure(int,int):84:84 -> onMeasure + 1:5:void setTargetSize(com.batch.android.messaging.Size2D):48:52 -> setTargetSize +com.batch.android.messaging.view.FlexboxLayout -> com.batch.android.e0.d: +# {"id":"sourceFile","fileName":"FlexboxLayout.java"} + int FLEX_WRAP_NOWRAP -> n + int FLEX_DIRECTION_COLUMN -> l + android.util.SparseIntArray mOrderCache -> g + int FLEX_DIRECTION_ROW -> j + int mAlignItems -> d + int ALIGN_CONTENT_SPACE_AROUND -> E + int mFlexWrap -> b + int ALIGN_CONTENT_CENTER -> C + int ALIGN_CONTENT_FLEX_START -> A + int[] mReorderedIndices -> f + int ALIGN_ITEMS_BASELINE -> y + int ALIGN_ITEMS_FLEX_END -> w + java.util.List mFlexLines -> h + int JUSTIFY_CONTENT_SPACE_AROUND -> u + int JUSTIFY_CONTENT_CENTER -> s + int JUSTIFY_CONTENT_FLEX_START -> q + int FLEX_WRAP_WRAP -> o + int FLEX_DIRECTION_COLUMN_REVERSE -> m + int FLEX_DIRECTION_ROW_REVERSE -> k + int ALIGN_CONTENT_STRETCH -> F + int ALIGN_CONTENT_SPACE_BETWEEN -> D + int mAlignContent -> e + int ALIGN_CONTENT_FLEX_END -> B + int mJustifyContent -> c + int mFlexDirection -> a + boolean[] mChildrenFrozen -> i + int ALIGN_ITEMS_STRETCH -> z + int ALIGN_ITEMS_CENTER -> x + int ALIGN_ITEMS_FLEX_START -> v + int JUSTIFY_CONTENT_SPACE_BETWEEN -> t + int JUSTIFY_CONTENT_FLEX_END -> r + int FLEX_WRAP_WRAP_REVERSE -> p + 1:1:void (android.content.Context):240:240 -> + 2:2:void (android.content.Context,android.util.AttributeSet):244:244 -> + 3:3:void (android.content.Context,android.util.AttributeSet,int):248:248 -> + 4:4:void (android.content.Context,android.util.AttributeSet,int):230:230 -> + 1:20:int[] createReorderedIndices(android.view.View,int,android.view.ViewGroup$LayoutParams):323:342 -> a + 21:34:int[] createReorderedIndices(android.view.View,int,android.view.ViewGroup$LayoutParams):333:346 -> a + 35:37:int[] createReorderedIndices():356:358 -> a + 38:47:int[] sortOrdersIntoReorderedIndices(int,java.util.List):362:371 -> a + 48:55:java.util.List createOrders(int):379:386 -> a + 56:102:void measureHorizontal(int,int):431:477 -> a + 103:110:void measureHorizontal(int,int):475:482 -> a + 111:136:void measureHorizontal(int,int):480:505 -> a + 137:172:void measureHorizontal(int,int):500:535 -> a + 173:214:void measureHorizontal(int,int):533:574 -> a + 215:237:void checkSizeConstraints(android.view.View):702:724 -> a + 238:238:void checkSizeConstraints(android.view.View):722:722 -> a + 239:241:void addFlexLineIfLastFlexItem(int,int,com.batch.android.messaging.view.FlexboxLayout$FlexLine):730:732 -> a + 242:242:void determineMainSize(int,int,int):774:774 -> a + 243:250:void determineMainSize(int,int,int):764:771 -> a + 251:280:void determineMainSize(int,int,int):753:782 -> a + 281:366:int expandFlexItems(com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int):811:896 -> a + 367:372:int expandFlexItems(com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int):894:899 -> a + 373:402:int expandFlexItems(com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int):831:860 -> a + 403:452:int expandFlexItems(com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int):858:907 -> a + 453:453:int expandFlexItems(com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int):812:812 -> a + 454:454:void determineCrossSize(int,int,int,int):1068:1068 -> a + 455:456:void determineCrossSize(int,int,int,int):1064:1065 -> a + 457:580:void determineCrossSize(int,int,int,int):1059:1182 -> a + 581:586:void stretchViewHorizontally(android.view.View,int):1272:1277 -> a + 587:587:void stretchViewHorizontally(android.view.View,int):1275:1275 -> a + 588:588:boolean isWrapRequired(int,int,int,int,int,com.batch.android.messaging.view.FlexboxLayout$LayoutParams):1409:1409 -> a + 589:636:void layoutHorizontal(boolean,int,int,int,int):1493:1540 -> a + 637:646:void layoutHorizontal(boolean,int,int,int,int):1527:1536 -> a + 647:647:void layoutHorizontal(boolean,int,int,int,int):1523:1523 -> a + 648:693:void layoutHorizontal(boolean,int,int,int,int):1519:1564 -> a + 694:712:void layoutHorizontal(boolean,int,int,int,int):1557:1575 -> a + 713:734:void layoutHorizontal(boolean,int,int,int,int):1568:1589 -> a + 735:754:void layoutHorizontal(boolean,int,int,int,int):1581:1600 -> a + 755:771:void layoutHorizontal(boolean,int,int,int,int):1592:1608 -> a + 772:825:void layoutSingleChildHorizontal(android.view.View,com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int,int,int):1645:1698 -> a + 826:837:void layoutSingleChildHorizontal(android.view.View,com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int,int,int):1694:1705 -> a + 838:838:void layoutSingleChildHorizontal(android.view.View,com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int,int,int):1701:1701 -> a + 839:839:void layoutSingleChildHorizontal(android.view.View,com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int,int,int):1676:1676 -> a + 840:853:void layoutSingleChildHorizontal(android.view.View,com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int,int,int):1674:1687 -> a + 854:854:void layoutSingleChildHorizontal(android.view.View,com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int,int,int):1683:1683 -> a + 855:857:void layoutSingleChildHorizontal(android.view.View,com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int,int,int):1656:1658 -> a + 858:906:void layoutVertical(boolean,boolean,int,int,int,int):1735:1783 -> a + 907:916:void layoutVertical(boolean,boolean,int,int,int,int):1770:1779 -> a + 917:917:void layoutVertical(boolean,boolean,int,int,int,int):1766:1766 -> a + 918:964:void layoutVertical(boolean,boolean,int,int,int,int):1762:1808 -> a + 965:984:void layoutVertical(boolean,boolean,int,int,int,int):1800:1819 -> a + 985:1006:void layoutVertical(boolean,boolean,int,int,int,int):1811:1832 -> a + 1007:1026:void layoutVertical(boolean,boolean,int,int,int,int):1824:1843 -> a + 1027:1043:void layoutVertical(boolean,boolean,int,int,int,int):1835:1851 -> a + 1044:1090:void layoutSingleChildVertical(android.view.View,com.batch.android.messaging.view.FlexboxLayout$FlexLine,boolean,int,int,int,int,int):1889:1935 -> a + 1091:1093:void layoutSingleChildVertical(android.view.View,com.batch.android.messaging.view.FlexboxLayout$FlexLine,boolean,int,int,int,int,int):1909:1911 -> a + 1094:1106:void layoutSingleChildVertical(android.view.View,com.batch.android.messaging.view.FlexboxLayout$FlexLine,boolean,int,int,int,int,int):1908:1920 -> a + 1107:1107:void layoutSingleChildVertical(android.view.View,com.batch.android.messaging.view.FlexboxLayout$FlexLine,boolean,int,int,int,int,int):1917:1917 -> a + 1108:1110:void layoutSingleChildVertical(android.view.View,com.batch.android.messaging.view.FlexboxLayout$FlexLine,boolean,int,int,int,int,int):1901:1903 -> a + 1111:1111:com.batch.android.messaging.view.FlexboxLayout$LayoutParams generateLayoutParams(android.util.AttributeSet):1953:1953 -> a + 1:2:void addView(android.view.View,int,android.view.ViewGroup$LayoutParams):301:302 -> addView + 1:4:android.view.View getReorderedChildAt(int):289:292 -> b + 5:18:boolean isOrderChangedFromLastMeasurement():398:411 -> b + 19:62:void measureVertical(int,int):590:633 -> b + 63:70:void measureVertical(int,int):631:638 -> b + 71:96:void measureVertical(int,int):636:661 -> b + 97:131:void measureVertical(int,int):656:690 -> b + 132:212:int shrinkFlexItems(com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int):936:1016 -> b + 213:218:int shrinkFlexItems(com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int):1014:1019 -> b + 219:248:int shrinkFlexItems(com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int):956:985 -> b + 249:293:int shrinkFlexItems(com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int):983:1027 -> b + 294:294:int shrinkFlexItems(com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int):938:938 -> b + 295:300:void stretchViewVertically(android.view.View,int):1256:1261 -> b + 301:301:void stretchViewVertically(android.view.View,int):1259:1259 -> b + 302:320:void setMeasuredDimensionForFlex(int,int,int,int):1298:1316 -> b + 321:322:void setMeasuredDimensionForFlex(int,int,int,int):1312:1313 -> b + 323:360:void setMeasuredDimensionForFlex(int,int,int,int):1307:1344 -> b + 361:361:void setMeasuredDimensionForFlex(int,int,int,int):1340:1340 -> b + 362:411:void setMeasuredDimensionForFlex(int,int,int,int):1330:1379 -> b + 412:412:void setMeasuredDimensionForFlex(int,int,int,int):1375:1375 -> b + 413:432:void setMeasuredDimensionForFlex(int,int,int,int):1362:1381 -> b + 1:20:void stretchViews(int,int):1205:1224 -> c + 21:21:void stretchViews(int,int):1221:1221 -> c + 22:47:void stretchViews(int,int):1217:1242 -> c + 48:48:void stretchViews(int,int):1239:1239 -> c + 49:49:void stretchViews(int,int):1235:1235 -> c + 1:1:boolean checkLayoutParams(android.view.ViewGroup$LayoutParams):1948:1948 -> checkLayoutParams + 1:1:android.view.ViewGroup$LayoutParams generateLayoutParams(android.util.AttributeSet):66:66 -> generateLayoutParams + 2:2:android.view.ViewGroup$LayoutParams generateLayoutParams(android.view.ViewGroup$LayoutParams):1958:1958 -> generateLayoutParams + 1:1:int getAlignContent():2011:2011 -> getAlignContent + 1:1:int getAlignItems():1999:1999 -> getAlignItems + 1:1:int getFlexDirection():1963:1963 -> getFlexDirection + 1:1:int getFlexWrap():1975:1975 -> getFlexWrap + 1:1:int getJustifyContent():1987:1987 -> getJustifyContent + 1:2:int getLargestMainSize():1422:1423 -> getLargestMainSize + 1:2:int getSumOfCrossSize():1435:1436 -> getSumOfCrossSize + 1:27:void onLayout(boolean,int,int,int,int):1443:1469 -> onLayout + 28:31:void onLayout(boolean,int,int,int,int):1463:1466 -> onLayout + 32:35:void onLayout(boolean,int,int,int,int):1456:1459 -> onLayout + 36:36:void onLayout(boolean,int,int,int,int):1452:1452 -> onLayout + 37:37:void onLayout(boolean,int,int,int,int):1448:1448 -> onLayout + 1:21:void onMeasure(int,int):253:273 -> onMeasure + 22:22:void onMeasure(int,int):270:270 -> onMeasure + 23:33:void onMeasure(int,int):266:276 -> onMeasure + 1:3:void setAlignContent(int):2015:2017 -> setAlignContent + 1:3:void setAlignItems(int):2003:2005 -> setAlignItems + 1:3:void setFlexDirection(int):1967:1969 -> setFlexDirection + 1:3:void setFlexWrap(int):1979:1981 -> setFlexWrap + 1:3:void setJustifyContent(int):1991:1993 -> setJustifyContent +com.batch.android.messaging.view.FlexboxLayout$1 -> com.batch.android.e0.d$a: +# {"id":"sourceFile","fileName":"FlexboxLayout.java"} +com.batch.android.messaging.view.FlexboxLayout$AlignContent -> com.batch.android.e0.d$b: +# {"id":"sourceFile","fileName":"FlexboxLayout.java"} +com.batch.android.messaging.view.FlexboxLayout$AlignItems -> com.batch.android.e0.d$c: +# {"id":"sourceFile","fileName":"FlexboxLayout.java"} +com.batch.android.messaging.view.FlexboxLayout$FlexDirection -> com.batch.android.e0.d$d: +# {"id":"sourceFile","fileName":"FlexboxLayout.java"} +com.batch.android.messaging.view.FlexboxLayout$FlexLine -> com.batch.android.e0.d$e: +# {"id":"sourceFile","fileName":"FlexboxLayout.java"} + float totalFlexShrink -> e + float totalFlexGrow -> d + int maxBaseline -> f + java.util.List indicesAlignSelfStretch -> g + int crossSize -> b + int itemCount -> c + int mainSize -> a + 1:35:void ():2185:2219 -> + 36:36:void (com.batch.android.messaging.view.FlexboxLayout$1):2185:2185 -> +com.batch.android.messaging.view.FlexboxLayout$FlexWrap -> com.batch.android.e0.d$f: +# {"id":"sourceFile","fileName":"FlexboxLayout.java"} +com.batch.android.messaging.view.FlexboxLayout$JustifyContent -> com.batch.android.e0.d$g: +# {"id":"sourceFile","fileName":"FlexboxLayout.java"} +com.batch.android.messaging.view.FlexboxLayout$LayoutParams -> com.batch.android.e0.d$h: +# {"id":"sourceFile","fileName":"FlexboxLayout.java"} + float FLEX_GROW_DEFAULT -> l + int ALIGN_SELF_AUTO -> o + boolean wrapBefore -> j + int ORDER_DEFAULT -> k + int maxWidth -> h + float flexBasisPercent -> e + int maxHeight -> i + int minWidth -> f + float flexShrink -> c + int minHeight -> g + float flexGrow -> b + int alignSelf -> d + int order -> a + int ALIGN_SELF_STRETCH -> t + int MAX_SIZE -> u + int ALIGN_SELF_CENTER -> r + int ALIGN_SELF_BASELINE -> s + float FLEX_BASIS_PERCENT_DEFAULT -> n + int ALIGN_SELF_FLEX_START -> p + float FLEX_SHRINK_DEFAULT -> m + int ALIGN_SELF_FLEX_END -> q + 1:1:void (android.content.Context,android.util.AttributeSet):2126:2126 -> + 2:60:void (android.content.Context,android.util.AttributeSet):2053:2111 -> + 61:61:void (com.batch.android.messaging.view.FlexboxLayout$LayoutParams):2130:2130 -> + 62:149:void (com.batch.android.messaging.view.FlexboxLayout$LayoutParams):2053:2140 -> + 150:150:void (android.view.ViewGroup$LayoutParams):2144:2144 -> + 151:209:void (android.view.ViewGroup$LayoutParams):2053:2111 -> + 210:210:void (int,int):2148:2148 -> + 211:269:void (int,int):2053:2111 -> +com.batch.android.messaging.view.FlexboxLayout$Order -> com.batch.android.e0.d$i: +# {"id":"sourceFile","fileName":"FlexboxLayout.java"} + int order -> b + int index -> a + 1:1:void ():2156:2156 -> + 2:2:void (com.batch.android.messaging.view.FlexboxLayout$1):2156:2156 -> + 1:4:int compareTo(com.batch.android.messaging.view.FlexboxLayout$Order):2170:2173 -> a + 1:1:int compareTo(java.lang.Object):2156:2156 -> compareTo + 1:1:java.lang.String toString():2178:2178 -> toString +com.batch.android.messaging.view.MaximumHeightScrollView -> com.batch.android.e0.e: +# {"id":"sourceFile","fileName":"MaximumHeightScrollView.java"} + int maxHeightPx -> a + 1:1:void (android.content.Context):17:17 -> + 2:2:void (android.content.Context):14:14 -> + 3:3:void (android.content.Context,android.util.AttributeSet):21:21 -> + 4:4:void (android.content.Context,android.util.AttributeSet):14:14 -> + 5:5:void (android.content.Context,android.util.AttributeSet,int):25:25 -> + 6:6:void (android.content.Context,android.util.AttributeSet,int):14:14 -> + 7:7:void (android.content.Context,android.util.AttributeSet,int,int):31:31 -> + 8:8:void (android.content.Context,android.util.AttributeSet,int,int):14:14 -> + 1:7:void onMeasure(int,int):41:47 -> onMeasure + 1:1:void setMaxHeight(int):35:35 -> setMaxHeight +com.batch.android.messaging.view.PannableBannerFrameLayout -> com.batch.android.e0.f: +# {"id":"sourceFile","fileName":"PannableBannerFrameLayout.java"} + java.lang.Object cancellationAnimation -> h + int touchSlop -> l + int FLING_VELOCITY_DISMISS_THRESHOLD -> m + boolean isPanning -> i + int cancellationAnimationDuration -> j + float initialInterceptYOffset -> g + int dismissAnimationDuration -> k + float initialSwipeYOffset -> f + android.view.GestureDetector detector -> b + com.batch.android.messaging.view.PannableBannerFrameLayout$DismissDirection dismissDirection -> c + com.batch.android.messaging.view.PannableBannerFrameLayout$OnDismissListener dismissListener -> d + boolean isPannable -> e + boolean supportsAndroidXAnimation -> a + float PAN_HEIGHT_DISMISS_RATIO_THRESHOLD -> n + 1:1:void (android.content.Context):86:86 -> + 2:37:void (android.content.Context):52:87 -> + 38:38:void (android.content.Context,android.util.AttributeSet):91:91 -> + 39:79:void (android.content.Context,android.util.AttributeSet):52:92 -> + 80:80:void (android.content.Context,android.util.AttributeSet,int):96:96 -> + 81:126:void (android.content.Context,android.util.AttributeSet,int):52:97 -> + 1:1:com.batch.android.messaging.view.PannableBannerFrameLayout$OnDismissListener access$000(com.batch.android.messaging.view.PannableBannerFrameLayout):28:28 -> a + 2:2:boolean hasYPassedTouchSlop(float,float):296:296 -> a + 3:4:void beginPan(float):300:301 -> a + 5:10:void cancelCancellationAnimation():330:335 -> a + 1:40:void dismiss():340:379 -> b + 1:15:void setup():101:115 -> c + 1:10:void startCancelAnimation():305:314 -> d + 1:8:void startFallbackCancelAnimation():319:326 -> e + 1:15:boolean onFling(android.view.MotionEvent,android.view.MotionEvent,float,float):275:289 -> onFling + 1:26:boolean onInterceptTouchEvent(android.view.MotionEvent):133:158 -> onInterceptTouchEvent + 27:27:boolean onInterceptTouchEvent(android.view.MotionEvent):142:142 -> onInterceptTouchEvent + 1:67:boolean onTouchEvent(android.view.MotionEvent):172:238 -> onTouchEvent + 68:115:boolean onTouchEvent(android.view.MotionEvent):185:232 -> onTouchEvent + 116:177:boolean onTouchEvent(android.view.MotionEvent):181:242 -> onTouchEvent + 1:1:void setDismissDirection(com.batch.android.messaging.view.PannableBannerFrameLayout$DismissDirection):120:120 -> setDismissDirection + 1:1:void setDismissListener(com.batch.android.messaging.view.PannableBannerFrameLayout$OnDismissListener):124:124 -> setDismissListener + 1:1:void setPannable(boolean):128:128 -> setPannable +com.batch.android.messaging.view.PannableBannerFrameLayout$1 -> com.batch.android.e0.f$a: +# {"id":"sourceFile","fileName":"PannableBannerFrameLayout.java"} + com.batch.android.messaging.view.PannableBannerFrameLayout this$0 -> a + 1:1:void (com.batch.android.messaging.view.PannableBannerFrameLayout):352:352 -> + 1:2:void onAnimationEnd(android.animation.Animator):358:359 -> onAnimationEnd +com.batch.android.messaging.view.PannableBannerFrameLayout$DismissDirection -> com.batch.android.e0.f$b: +# {"id":"sourceFile","fileName":"PannableBannerFrameLayout.java"} + com.batch.android.messaging.view.PannableBannerFrameLayout$DismissDirection[] $VALUES -> c + com.batch.android.messaging.view.PannableBannerFrameLayout$DismissDirection BOTTOM -> b + com.batch.android.messaging.view.PannableBannerFrameLayout$DismissDirection TOP -> a + 1:2:void ():386:387 -> + 3:3:void ():385:385 -> + 1:1:void (java.lang.String,int):385:385 -> + 1:1:com.batch.android.messaging.view.PannableBannerFrameLayout$DismissDirection[] $values():385:385 -> a + 1:1:com.batch.android.messaging.view.PannableBannerFrameLayout$DismissDirection valueOf(java.lang.String):385:385 -> valueOf + 1:1:com.batch.android.messaging.view.PannableBannerFrameLayout$DismissDirection[] values():385:385 -> values +com.batch.android.messaging.view.PannableBannerFrameLayout$OnDismissListener -> com.batch.android.e0.f$c: +# {"id":"sourceFile","fileName":"PannableBannerFrameLayout.java"} + void onDismiss(com.batch.android.messaging.view.PannableBannerFrameLayout) -> a +com.batch.android.messaging.view.PositionableGradientDrawable -> com.batch.android.e0.g: +# {"id":"sourceFile","fileName":"PositionableGradientDrawable.java"} + boolean mGradientIsDirty -> k + android.graphics.Rect mPadding -> c + android.graphics.Paint mLayerPaint -> j + android.graphics.PorterDuffColorFilter mTintFilter -> f + android.graphics.Paint mStrokePaint -> d + int RADIUS_TYPE_FRACTION_PARENT -> y + android.graphics.Paint mFillPaint -> b + int RADIUS_TYPE_PIXELS -> w + int RADIAL_GRADIENT -> u + float mGradientRadius -> o + int RING -> s + int OVAL -> q + boolean mPathIsDirty -> n + android.graphics.ColorFilter mColorFilter -> e + boolean mMutated -> l + int mAlpha -> g + android.graphics.Path mPath -> h + com.batch.android.messaging.view.PositionableGradientDrawable$GradientState mGradientState -> a + android.graphics.RectF mRect -> i + float DEFAULT_THICKNESS_RATIO -> A + float DEFAULT_INNER_RADIUS_RATIO -> z + android.graphics.Path mRingPath -> m + int RADIUS_TYPE_FRACTION -> x + int SWEEP_GRADIENT -> v + int LINEAR_GRADIENT -> t + int LINE -> r + int RECTANGLE -> p + 1:1:void (com.batch.android.messaging.view.PositionableGradientDrawable$GradientState,android.content.res.Resources,com.batch.android.messaging.view.PositionableGradientDrawable$1):48:48 -> + 2:2:void ():165:165 -> + 3:3:void (com.batch.android.messaging.view.PositionableGradientDrawable$Orientation,int[],float[]):173:173 -> + 4:4:void (com.batch.android.messaging.view.PositionableGradientDrawable$GradientState,android.content.res.Resources):1350:1350 -> + 5:1253:void (com.batch.android.messaging.view.PositionableGradientDrawable$GradientState,android.content.res.Resources):105:1353 -> + 1:1:boolean isOpaque(int):0:0 -> a + 2:4:void setCornerRadii(float[]):202:204 -> a + 5:7:void setCornerRadius(float):221:223 -> a + 8:8:void setStroke(int,android.content.res.ColorStateList):255:255 -> a + 9:10:void setStroke(int,int,float,float):273:274 -> a + 11:19:void setStroke(int,android.content.res.ColorStateList,float,float):293:301 -> a + 20:22:void setSize(int,int):332:334 -> a + 23:25:void setGradientCenter(float,float):383:385 -> a + 26:28:void setUseLevel(boolean):433:435 -> a + 29:31:void setOrientation(com.batch.android.messaging.view.PositionableGradientDrawable$Orientation):460:462 -> a + 32:37:void setColors(int[],float[]):480:485 -> a + 38:43:void buildPathIfDirty():634:639 -> a + 44:89:android.graphics.Path buildRing(com.batch.android.messaging.view.PositionableGradientDrawable$GradientState):644:689 -> a + 90:99:void setColor(android.content.res.ColorStateList):725:734 -> a + 100:142:void updateLocalState(android.content.res.Resources):1357:1399 -> a + 1:1:void setStroke(int,int):239:239 -> b + 2:14:void setStrokeInternal(int,int,float,float):305:317 -> b + 15:17:void setGradientRadius(float):400:402 -> b + 18:18:int modulateAlpha(int):439:439 -> b + 19:19:void clearMutated():1104:1104 -> b + 1:3:void setColor(int):706:708 -> c + 4:72:boolean ensureValidRect():874:942 -> c + 73:75:boolean ensureValidRect():933:935 -> c + 76:79:boolean ensureValidRect():927:930 -> c + 80:83:boolean ensureValidRect():921:924 -> c + 84:87:boolean ensureValidRect():915:918 -> c + 88:90:boolean ensureValidRect():909:911 -> c + 91:94:boolean ensureValidRect():903:906 -> c + 95:215:boolean ensureValidRect():897:1017 -> c + 1:3:void setGradientType(int):365:367 -> d + 4:9:float getGradientRadius():412:417 -> d + 1:129:void draw(android.graphics.Canvas):490:618 -> draw + 130:133:void draw(android.graphics.Canvas):607:610 -> draw + 134:136:void draw(android.graphics.Canvas):600:602 -> draw + 137:192:void draw(android.graphics.Canvas):573:628 -> draw + 1:4:void setShape(int):348:351 -> e + 5:5:com.batch.android.messaging.view.PositionableGradientDrawable$Orientation getOrientation():447:447 -> e + 1:5:boolean isOpaqueForState():1037:1041 -> f + 1:1:int getAlpha():804:804 -> getAlpha + 1:1:int getChangingConfigurations():791:791 -> getChangingConfigurations + 1:1:android.graphics.ColorFilter getColorFilter():817:817 -> getColorFilter + 1:2:android.graphics.drawable.Drawable$ConstantState getConstantState():1032:1033 -> getConstantState + 1:1:int getIntrinsicHeight():1027:1027 -> getIntrinsicHeight + 1:1:int getIntrinsicWidth():1022:1022 -> getIntrinsicWidth + 1:1:int getOpacity():844:844 -> getOpacity + 1:35:void getOutline(android.graphics.Outline):1050:1084 -> getOutline + 36:36:void getOutline(android.graphics.Outline):1074:1074 -> getOutline + 37:48:void getOutline(android.graphics.Outline):1060:1071 -> getOutline + 1:5:boolean getPadding(android.graphics.Rect):178:182 -> getPadding + 1:6:boolean isStateful():780:785 -> isStateful + 1:4:android.graphics.drawable.Drawable mutate():1091:1094 -> mutate + 1:4:void onBoundsChange(android.graphics.Rect):851:854 -> onBoundsChange + 1:4:boolean onLevelChange(int):859:862 -> onLevelChange + 1:31:boolean onStateChange(int[]):741:771 -> onStateChange + 1:3:void setAlpha(int):796:798 -> setAlpha + 1:3:void setColorFilter(android.graphics.ColorFilter):822:824 -> setColorFilter + 1:3:void setDither(boolean):809:811 -> setDither + 1:3:void setTintList(android.content.res.ColorStateList):830:832 -> setTintList + 1:3:void setTintMode(android.graphics.PorterDuff$Mode):837:839 -> setTintMode +com.batch.android.messaging.view.PositionableGradientDrawable$1 -> com.batch.android.e0.g$a: +# {"id":"sourceFile","fileName":"PositionableGradientDrawable.java"} + int[] $SwitchMap$com$batch$android$messaging$view$PositionableGradientDrawable$Orientation -> a + 1:1:void ():895:895 -> +com.batch.android.messaging.view.PositionableGradientDrawable$GradientState -> com.batch.android.e0.g$b: +# {"id":"sourceFile","fileName":"PositionableGradientDrawable.java"} + int mStrokeWidth -> l + float[] mTempPositions -> j + int mAngle -> d + int mShape -> b + int[] mGradientColors -> h + float mCenterX -> y + int[] mThemeAttrs -> I + com.batch.android.messaging.view.PositionableGradientDrawable$Orientation mOrientation -> e + android.graphics.PorterDuff$Mode mTintMode -> H + float mThicknessRatio -> u + boolean mOpaqueOverBounds -> E + android.content.res.ColorStateList mStrokeColors -> g + int mThickness -> w + int[] mAttrPadding -> O + float mRadius -> o + int mHeight -> s + int[] mAttrGradient -> K + boolean mUseLevel -> C + float mStrokeDashWidth -> m + float[] mRadiusArray -> p + int[] mAttrStroke -> M + float[] mPositions -> k + boolean mDither -> x + float mGradientRadius -> A + int mGradientRadiusType -> B + int mGradient -> c + int mChangingConfigurations -> a + float mCenterY -> z + int[] mTempColors -> i + android.content.res.ColorStateList mSolidColors -> f + float mInnerRadiusRatio -> t + int mInnerRadius -> v + int[] mAttrCorners -> N + boolean mOpaqueOverShape -> F + android.content.res.ColorStateList mTint -> G + int mWidth -> r + int[] mAttrSize -> J + float mStrokeDashGap -> n + android.graphics.Rect mPadding -> q + int[] mAttrSolid -> L + boolean mUseLevelForShape -> D + 1:1:void (com.batch.android.messaging.view.PositionableGradientDrawable$Orientation,int[],float[]):1156:1156 -> + 2:51:void (com.batch.android.messaging.view.PositionableGradientDrawable$Orientation,int[],float[]):1110:1159 -> + 52:52:void (com.batch.android.messaging.view.PositionableGradientDrawable$GradientState):1162:1162 -> + 53:152:void (com.batch.android.messaging.view.PositionableGradientDrawable$GradientState):1110:1209 -> + 1:1:void access$100(com.batch.android.messaging.view.PositionableGradientDrawable$GradientState):1107:1107 -> a + 2:2:void setGradientType(int):1256:1256 -> a + 3:4:void setGradientCenter(float,float):1260:1261 -> a + 5:7:void setGradientColors(int[]):1265:1267 -> a + 8:10:void setSolidColors(android.content.res.ColorStateList):1276:1278 -> a + 11:30:void computeOpacity():1282:1301 -> a + 31:35:void setStroke(int,android.content.res.ColorStateList,float,float):1305:1309 -> a + 36:37:void setCornerRadius(float):1316:1317 -> a + 38:40:void setCornerRadii(float[]):1321:1323 -> a + 41:42:void setSize(int,int):1328:1329 -> a + 43:44:void setGradientRadius(float,int):1333:1334 -> a + 1:2:void setShape(int):1251:1252 -> b + 3:4:void setGradientPositions(float[]):1271:1272 -> b + 1:9:boolean canApplyTheme():1214:1222 -> canApplyTheme + 1:9:int getChangingConfigurations():1238:1246 -> getChangingConfigurations + 1:1:android.graphics.drawable.Drawable newDrawable():1228:1228 -> newDrawable + 2:2:android.graphics.drawable.Drawable newDrawable(android.content.res.Resources):1233:1233 -> newDrawable +com.batch.android.messaging.view.PositionableGradientDrawable$Orientation -> com.batch.android.e0.g$c: +# {"id":"sourceFile","fileName":"PositionableGradientDrawable.java"} + com.batch.android.messaging.view.PositionableGradientDrawable$Orientation TL_BR -> h + com.batch.android.messaging.view.PositionableGradientDrawable$Orientation[] $VALUES -> i + com.batch.android.messaging.view.PositionableGradientDrawable$Orientation BOTTOM_TOP -> e + com.batch.android.messaging.view.PositionableGradientDrawable$Orientation BR_TL -> d + com.batch.android.messaging.view.PositionableGradientDrawable$Orientation LEFT_RIGHT -> g + com.batch.android.messaging.view.PositionableGradientDrawable$Orientation BL_TR -> f + com.batch.android.messaging.view.PositionableGradientDrawable$Orientation TOP_BOTTOM -> a + com.batch.android.messaging.view.PositionableGradientDrawable$Orientation RIGHT_LEFT -> c + com.batch.android.messaging.view.PositionableGradientDrawable$Orientation TR_BL -> b + 1:29:void ():133:161 -> + 30:30:void ():129:129 -> + 1:1:void (java.lang.String,int):129:129 -> + 1:1:com.batch.android.messaging.view.PositionableGradientDrawable$Orientation[] $values():129:129 -> a + 1:1:com.batch.android.messaging.view.PositionableGradientDrawable$Orientation valueOf(java.lang.String):129:129 -> valueOf + 1:1:com.batch.android.messaging.view.PositionableGradientDrawable$Orientation[] values():129:129 -> values +com.batch.android.messaging.view.formats.BannerView -> com.batch.android.f0.a: +# {"id":"sourceFile","fileName":"BannerView.java"} + android.content.Context context -> a + android.graphics.Point screenSizeDP -> e + int BODY_MAX_HEIGHT_DP -> n + com.batch.android.messaging.view.helper.ImageHelper$Cache imageCache -> c + int IMAGE_FADE_IN_ANIMATION_DURATION -> l + long uptimeWhenShown -> k + int BODY_MIN_HEIGHT_DP -> m + com.batch.android.messaging.css.Document style -> d + com.batch.android.messaging.model.BaseBannerMessage message -> b + com.batch.android.messaging.view.formats.BannerView$VerticalEdge pinnedVerticalEdge -> f + com.batch.android.messaging.view.formats.BannerView$OnActionListener actionListener -> j + com.batch.android.messaging.view.CountdownView countdownView -> h + com.batch.android.messaging.view.roundimage.RoundedImageView imageView -> i + com.batch.android.messaging.view.styled.SeparatedFlexboxLayout contentLayout -> g + 1:15:void (android.content.Context,com.batch.android.messaging.model.BaseBannerMessage,com.batch.android.messaging.css.Document,com.batch.android.messaging.css.DOMNode,com.batch.android.messaging.view.helper.ImageHelper$Cache):99:113 -> + 16:54:void (android.content.Context,com.batch.android.messaging.model.BaseBannerMessage,com.batch.android.messaging.css.Document,com.batch.android.messaging.css.DOMNode,com.batch.android.messaging.view.helper.ImageHelper$Cache):112:150 -> + 1:1:void onImageDownloadError(com.batch.android.messaging.model.MessagingError):0:0 -> a + 2:3:void lambda$makeCTALayout$2(int,com.batch.android.messaging.model.CTA,android.view.View):303:304 -> a + 4:17:android.view.View getStyledFlexboxSubview(android.util.Pair):328:341 -> a + 18:24:void addCloseButton():378:384 -> a + 25:42:void addCloseButton():383:400 -> a + 43:44:void lambda$addCloseButton$3(android.view.View):396:397 -> a + 45:51:com.batch.android.messaging.view.formats.BannerView$VerticalEdge getPinnedVerticalEdge(java.util.Map):427:433 -> a + 52:52:java.util.Map getRulesForView(com.batch.android.messaging.css.DOMNode):446:446 -> a + 53:54:java.util.Map getRulesForSeparator(com.batch.android.messaging.view.styled.SeparatedFlexboxLayout,java.lang.String):451:452 -> a + 55:55:java.util.Map getRulesForSeparator(com.batch.android.messaging.view.styled.SeparatedFlexboxLayout,java.lang.String):451:451 -> a + 56:59:void onImageDownloadSuccess(com.batch.android.messaging.AsyncImageDownloadTask$Result):491:494 -> a + 1:1:void lambda$makeContentLayout$1(android.view.View):232:232 -> b + 2:54:com.batch.android.messaging.view.styled.SeparatedFlexboxLayout makeCTALayout(java.util.Map):269:321 -> b + 55:72:void addCountdownView():405:422 -> b + 73:79:void displayImage(com.batch.android.messaging.AsyncImageDownloadTask$Result):501:507 -> b + 1:1:void onImageDownloadStart():0:0 -> c + 2:2:void lambda$new$0(android.view.View):142:142 -> c + 3:89:com.batch.android.messaging.view.styled.SeparatedFlexboxLayout makeContentLayout(java.util.Map):176:262 -> c + 1:26:void addImage():346:371 -> d + 1:1:boolean canAutoClose():166:166 -> e + 1:1:boolean mustWaitTapDelay():457:457 -> f + 1:9:void onGlobalTap():461:469 -> g + 1:1:com.batch.android.messaging.view.styled.SeparatedFlexboxLayout getContentView():158:158 -> getContentView + 1:1:com.batch.android.messaging.view.formats.BannerView$VerticalEdge getPinnedVerticalEdge():442:442 -> getPinnedVerticalEdge + 1:1:void onShown():162:162 -> h + 1:2:void startAutoCloseCountdown():170:171 -> i + 1:6:void onAttachedToWindow():475:480 -> onAttachedToWindow + 1:1:void setActionListener(com.batch.android.messaging.view.formats.BannerView$OnActionListener):154:154 -> setActionListener +com.batch.android.messaging.view.formats.BannerView$OnActionListener -> com.batch.android.f0.a$a: +# {"id":"sourceFile","fileName":"BannerView.java"} + void onCTAAction(int,com.batch.android.messaging.model.CTA) -> a + void onCloseAction() -> a + void onGlobalAction() -> b +com.batch.android.messaging.view.formats.BannerView$VerticalEdge -> com.batch.android.f0.a$b: +# {"id":"sourceFile","fileName":"BannerView.java"} + com.batch.android.messaging.view.formats.BannerView$VerticalEdge TOP -> a + com.batch.android.messaging.view.formats.BannerView$VerticalEdge BOTTOM -> b + com.batch.android.messaging.view.formats.BannerView$VerticalEdge[] $VALUES -> c + 1:2:void ():512:513 -> + 3:3:void ():511:511 -> + 1:1:void (java.lang.String,int):511:511 -> + 1:1:com.batch.android.messaging.view.formats.BannerView$VerticalEdge[] $values():511:511 -> a + 1:1:com.batch.android.messaging.view.formats.BannerView$VerticalEdge valueOf(java.lang.String):511:511 -> valueOf + 1:1:com.batch.android.messaging.view.formats.BannerView$VerticalEdge[] values():511:511 -> values +com.batch.android.messaging.view.formats.EmbeddedBannerContainer -> com.batch.android.f0.b: +# {"id":"sourceFile","fileName":"EmbeddedBannerContainer.java"} + android.content.Context context -> a + boolean alreadyDismissed -> i + com.batch.android.messaging.view.formats.EmbeddedBannerContainer$BaseView rootView -> e + com.batch.android.messaging.view.formats.BannerView$VerticalEdge pinnedVerticalEdge -> g + java.lang.Object autoCloseHandlerToken -> o + android.view.ViewGroup parentView -> b + com.batch.android.messaging.view.formats.BannerView bannerView -> f + com.batch.android.MessagingAnalyticsDelegate analyticsDelegate -> k + com.batch.android.module.MessagingModule messagingModule -> j + com.batch.android.BatchMessage payloadMessage -> c + android.os.Handler mainThreadHandler -> n + com.batch.android.messaging.model.BannerMessage message -> d + boolean alreadyShown -> h + android.util.LruCache imageCache -> l + android.content.BroadcastReceiver dismissReceiver -> m + int IN_OUT_ANIMATION_DURATION_MS -> p + 1:1:void (com.batch.android.module.MessagingModule,android.view.View,com.batch.android.BatchMessage,com.batch.android.messaging.model.BannerMessage,com.batch.android.MessagingAnalyticsDelegate,boolean):119:119 -> + 2:58:void (com.batch.android.module.MessagingModule,android.view.View,com.batch.android.BatchMessage,com.batch.android.messaging.model.BannerMessage,com.batch.android.MessagingAnalyticsDelegate,boolean):71:127 -> + 59:96:void (com.batch.android.module.MessagingModule,android.view.View,com.batch.android.BatchMessage,com.batch.android.messaging.model.BannerMessage,com.batch.android.MessagingAnalyticsDelegate,boolean):125:162 -> + 97:113:void (com.batch.android.module.MessagingModule,android.view.View,com.batch.android.BatchMessage,com.batch.android.messaging.model.BannerMessage,com.batch.android.MessagingAnalyticsDelegate,boolean):159:175 -> + 114:114:void (com.batch.android.module.MessagingModule,android.view.View,com.batch.android.BatchMessage,com.batch.android.messaging.model.BannerMessage,com.batch.android.MessagingAnalyticsDelegate,boolean):133:133 -> + 1:1:boolean access$000(com.batch.android.messaging.view.formats.EmbeddedBannerContainer):52:52 -> a + 2:3:com.batch.android.messaging.view.formats.EmbeddedBannerContainer provide(android.view.View,com.batch.android.BatchMessage,com.batch.android.messaging.model.BannerMessage,com.batch.android.MessagingAnalyticsDelegate,boolean):101:102 -> a + 4:17:android.view.ViewGroup findBestParentView(android.view.View):185:198 -> a + 18:54:void dismiss(boolean):306:342 -> a + 55:56:void onCloseAction():359:360 -> a + 57:59:void onCTAAction(int,com.batch.android.messaging.model.CTA):365:367 -> a + 60:62:void onDismiss(com.batch.android.messaging.view.PannableBannerFrameLayout):383:385 -> a + 1:1:android.content.BroadcastReceiver access$100(com.batch.android.messaging.view.formats.EmbeddedBannerContainer):52:52 -> b + 2:2:void dismissOnMainThread(boolean):302:302 -> b + 3:8:void onGlobalAction():372:377 -> b + 9:9:void put(com.batch.android.messaging.AsyncImageDownloadTask$Result):391:391 -> b + 10:10:com.batch.android.messaging.AsyncImageDownloadTask$Result get(java.lang.String):397:397 -> b + 1:1:android.content.Context access$200(com.batch.android.messaging.view.formats.EmbeddedBannerContainer):52:52 -> c + 2:2:void lambda$dismissOnMainThread$0(boolean):302:302 -> c + 3:3:int layoutGravityForPinnedEdge():354:354 -> c + 1:1:void access$300(com.batch.android.messaging.view.formats.EmbeddedBannerContainer):52:52 -> d + 2:3:com.batch.android.messaging.view.formats.BannerView makeBannerView():206:207 -> d + 1:1:void access$400(com.batch.android.messaging.view.formats.EmbeddedBannerContainer):52:52 -> e + 2:4:void performAutoClose():295:297 -> e + 1:4:void removeFromParent():346:349 -> f + 1:5:void scheduleAutoClose():281:285 -> g + 1:66:void show():212:277 -> h + 1:1:void unscheduleAutoClose():291:291 -> i +com.batch.android.messaging.view.formats.EmbeddedBannerContainer$1 -> com.batch.android.f0.b$a: +# {"id":"sourceFile","fileName":"EmbeddedBannerContainer.java"} + com.batch.android.messaging.view.formats.EmbeddedBannerContainer this$0 -> a + 1:1:void (com.batch.android.messaging.view.formats.EmbeddedBannerContainer):80:80 -> + 1:2:void onReceive(android.content.Context,android.content.Intent):83:84 -> onReceive +com.batch.android.messaging.view.formats.EmbeddedBannerContainer$2 -> com.batch.android.f0.b$b: +# {"id":"sourceFile","fileName":"EmbeddedBannerContainer.java"} + com.batch.android.messaging.view.formats.EmbeddedBannerContainer this$0 -> a + 1:1:void (com.batch.android.messaging.view.formats.EmbeddedBannerContainer):265:265 -> + 1:2:void onViewDetachedFromWindow(android.view.View):271:272 -> onViewDetachedFromWindow +com.batch.android.messaging.view.formats.EmbeddedBannerContainer$3 -> com.batch.android.f0.b$c: +# {"id":"sourceFile","fileName":"EmbeddedBannerContainer.java"} + com.batch.android.messaging.view.formats.EmbeddedBannerContainer this$0 -> a + 1:1:void (com.batch.android.messaging.view.formats.EmbeddedBannerContainer):317:317 -> + 1:1:void onAnimationCancel(android.animation.Animator):328:328 -> onAnimationCancel + 1:1:void onAnimationEnd(android.animation.Animator):323:323 -> onAnimationEnd +com.batch.android.messaging.view.formats.EmbeddedBannerContainer$BaseView -> com.batch.android.f0.b$d: +# {"id":"sourceFile","fileName":"EmbeddedBannerContainer.java"} + 1:1:void (android.content.Context):406:406 -> + 1:2:void onAttachedToWindow():411:412 -> onAttachedToWindow +com.batch.android.messaging.view.formats.ImageFormatView -> com.batch.android.f0.c: +# {"id":"sourceFile","fileName":"ImageFormatView.java"} + android.content.Context context -> a + android.graphics.Point screenSizeDP -> e + com.batch.android.messaging.view.helper.ImageHelper$Cache imageCache -> c + android.widget.RelativeLayout rootContainerView -> g + long uptimeWhenShown -> l + com.batch.android.messaging.model.ImageMessage message -> b + com.batch.android.messaging.css.Document style -> d + com.batch.android.messaging.view.AnimatedCloseButton closeButton -> f + com.batch.android.messaging.view.formats.ImageFormatView$ImageContainerView imageContainerView -> h + android.widget.ProgressBar imageViewLoader -> i + com.batch.android.messaging.view.formats.ImageFormatView$OnActionListener actionListener -> k + com.batch.android.core.Promise viewShownPromise -> m + com.batch.android.messaging.view.roundimage.RoundedImageView imageView -> j + float MODAL_CONTAINER_MARGIN_DP -> q + float CLOSE_PADDING_DP -> p + int IMAGE_FADE_IN_ANIMATION_DURATION -> r + float FULLSCREEN_CLOSE_BUTTON_MARGIN_DP -> o + float CLOSE_SIZE_DP -> n + 1:1:void (android.content.Context,com.batch.android.messaging.model.ImageMessage,com.batch.android.messaging.css.Document,com.batch.android.messaging.view.helper.ImageHelper$Cache):97:97 -> + 2:46:void (android.content.Context,com.batch.android.messaging.model.ImageMessage,com.batch.android.messaging.css.Document,com.batch.android.messaging.view.helper.ImageHelper$Cache):82:126 -> + 1:1:java.util.Map getRulesForView(com.batch.android.messaging.css.DOMNode):157:157 -> a + 2:9:void addBackgroundView():163:170 -> a + 10:40:com.batch.android.messaging.view.formats.ImageFormatView$ImageContainerView addImageContainer(android.widget.RelativeLayout):193:223 -> a + 41:55:android.widget.ProgressBar addImageLoader(android.widget.FrameLayout):245:259 -> a + 56:90:com.batch.android.messaging.view.AnimatedCloseButton addCloseButton(android.widget.RelativeLayout,android.view.View):264:298 -> a + 91:92:void lambda$addCloseButton$1(android.view.View):294:295 -> a + 93:94:void onImageDownloadSuccess(com.batch.android.messaging.AsyncImageDownloadTask$Result):343:344 -> a + 95:98:void onImageDownloadError(com.batch.android.messaging.model.MessagingError):349:352 -> a + 99:103:void lambda$displayImage$2(java.lang.Void):383:387 -> a + 1:14:android.widget.RelativeLayout addRootContainerView():174:187 -> b + 15:15:void lambda$addImageContainer$0(android.view.View):221:221 -> b + 16:28:com.batch.android.messaging.view.roundimage.RoundedImageView addImageView(android.widget.FrameLayout):228:240 -> b + 29:54:void displayImage(com.batch.android.messaging.AsyncImageDownloadTask$Result):357:382 -> b + void onImageDownloadStart() -> c + 1:1:boolean canAutoClose():146:146 -> d + 1:1:boolean mustWaitTapDelay():307:307 -> e + 1:9:void onGlobalTap():311:319 -> f + 1:1:void onShown():142:142 -> g + 1:1:android.view.View getPanEffectsView():138:138 -> getPanEffectsView + 1:1:com.batch.android.messaging.view.formats.ImageFormatView$ImageContainerView getPannableView():134:134 -> getPannableView + 1:3:void startAutoCloseCountdown():150:152 -> h + 1:7:android.view.WindowInsets onApplyWindowInsets(android.view.WindowInsets):401:407 -> onApplyWindowInsets + 8:17:android.view.WindowInsets onApplyWindowInsets(android.view.WindowInsets):403:412 -> onApplyWindowInsets + 1:5:void onAttachedToWindow():329:333 -> onAttachedToWindow + 1:1:void setActionListener(com.batch.android.messaging.view.formats.ImageFormatView$OnActionListener):130:130 -> setActionListener +com.batch.android.messaging.view.formats.ImageFormatView$ImageContainerView -> com.batch.android.f0.c$a: +# {"id":"sourceFile","fileName":"ImageFormatView.java"} + com.batch.android.messaging.view.DelegatedTouchEventViewGroup$Delegate delegate -> b + 1:1:void (android.content.Context,com.batch.android.messaging.Size2D):440:440 -> + 1:1:boolean superOnTouchEvent(android.view.MotionEvent):474:474 -> a + 1:1:boolean superOnInterceptTouchEvent(android.view.MotionEvent):469:469 -> b + 1:4:boolean onInterceptTouchEvent(android.view.MotionEvent):445:448 -> onInterceptTouchEvent + 1:4:boolean onTouchEvent(android.view.MotionEvent):455:458 -> onTouchEvent + 1:1:void setTouchEventDelegate(com.batch.android.messaging.view.DelegatedTouchEventViewGroup$Delegate):464:464 -> setTouchEventDelegate +com.batch.android.messaging.view.formats.ImageFormatView$OnActionListener -> com.batch.android.f0.c$b: +# {"id":"sourceFile","fileName":"ImageFormatView.java"} + void onCloseAction() -> a + void onErrorAction(com.batch.android.messaging.model.MessagingError) -> b + void onGlobalAction() -> b + void onImageDisplayedAction() -> d +com.batch.android.messaging.view.formats.UniversalRootView -> com.batch.android.f0.d: +# {"id":"sourceFile","fileName":"UniversalRootView.java"} + android.widget.FrameLayout heroLayout -> e + com.batch.android.messaging.view.AnimatedCloseButton closeButton -> j + long TAP_DELAY_MILLIS -> B + boolean waitForHeroImage -> q + int HERO_LAYOUT_ID -> A + android.graphics.Point screenSizeDP -> u + long drawTimeMillis -> y + android.view.View heroPlaceholder -> m + com.batch.android.messaging.view.formats.UniversalRootView$OnActionListener actionListener -> s + java.util.Map ctasStyleRules -> i + com.batch.android.messaging.view.roundimage.RoundedImageView heroImageView -> l + int originalContentPaddingTop -> w + com.batch.android.messaging.view.styled.SeparatedFlexboxLayout ctasLayout -> g + boolean landscape -> b + com.batch.android.messaging.model.UniversalMessage message -> o + double DEFAULT_HERO_SPLIT_RATIO -> z + android.view.TextureView$SurfaceTextureListener surfaceHolderCallback -> t + com.batch.android.messaging.css.Document style -> p + android.content.Context context -> d + com.batch.android.messaging.AsyncImageDownloadTask$Result heroDownloadResult -> r + android.view.TextureView videoView -> k + android.widget.ProgressBar heroLoader -> n + int originalCloseMarginTop -> x + int topInset -> v + com.batch.android.messaging.view.styled.SeparatedFlexboxLayout contentLayout -> f + boolean childRelayoutingNeeded -> c + java.util.Map contentStyleRules -> h + 1:1:void (android.content.Context,com.batch.android.messaging.model.UniversalMessage,com.batch.android.messaging.css.Document,com.batch.android.messaging.AsyncImageDownloadTask$Result,boolean):109:109 -> + 2:60:void (android.content.Context,com.batch.android.messaging.model.UniversalMessage,com.batch.android.messaging.css.Document,com.batch.android.messaging.AsyncImageDownloadTask$Result,boolean):68:126 -> + 1:2:void lambda$createViews$0(android.view.View):187:188 -> a + 3:4:void lambda$setupContentLayout$1(int,com.batch.android.messaging.model.CTA,android.view.View):281:282 -> a + 5:20:android.view.View getConfiguredView(android.util.Pair):317:332 -> a + 21:21:boolean canAutoClose():554:554 -> a + 22:29:void onHeroDownloaded(com.batch.android.messaging.AsyncImageDownloadTask$Result):581:588 -> a + 30:30:java.util.Map getRulesForView(com.batch.android.messaging.css.DOMNode):640:640 -> a + 31:32:java.util.Map getRulesForSeparator(com.batch.android.messaging.view.styled.SeparatedFlexboxLayout,java.lang.String):645:646 -> a + 33:33:java.util.Map getRulesForSeparator(com.batch.android.messaging.view.styled.SeparatedFlexboxLayout,java.lang.String):645:645 -> a + 1:40:void createViews():158:197 -> b + 1:4:void displayHero():546:549 -> c + 1:1:boolean mustWaitTapDelay():636:636 -> d + 1:5:void dispatchDraw(android.graphics.Canvas):149:153 -> dispatchDraw + 1:1:void onHeroBitmapStartsDownloading():577:577 -> e + 1:109:void setupContentLayout():203:311 -> f + 1:16:void setupCtaLayoutIfNeeded():421:436 -> g + 1:79:void setupHeroLayout():338:416 -> h + 1:99:void setupVariableLayoutParameters():444:542 -> i + 1:1:boolean shouldApplyWindowInsetToContent():629:629 -> j + 1:3:void startAutoCloseCountdown():558:560 -> k + 1:6:void updateLayoutInsets():611:616 -> l + 7:18:void updateLayoutInsets():612:623 -> l + 1:8:android.view.WindowInsets onApplyWindowInsets(android.view.WindowInsets):595:602 -> onApplyWindowInsets + 9:15:android.view.WindowInsets onApplyWindowInsets(android.view.WindowInsets):598:604 -> onApplyWindowInsets + 1:3:void onDraw(android.graphics.Canvas):142:144 -> onDraw + 1:6:void onSizeChanged(int,int,int,int):131:136 -> onSizeChanged + 1:1:void setActionListener(com.batch.android.messaging.view.formats.UniversalRootView$OnActionListener):565:565 -> setActionListener + 1:5:void setSurfaceHolderCallback(android.view.TextureView$SurfaceTextureListener):569:573 -> setSurfaceHolderCallback +com.batch.android.messaging.view.formats.UniversalRootView$OnActionListener -> com.batch.android.f0.d$a: +# {"id":"sourceFile","fileName":"UniversalRootView.java"} + void onCTAAction(int,com.batch.android.messaging.model.CTA) -> a + void onCloseAction() -> a +com.batch.android.messaging.view.formats.WebFormatView -> com.batch.android.f0.e: +# {"id":"sourceFile","fileName":"WebFormatView.java"} + android.content.Context context -> a + com.batch.android.messaging.model.WebViewMessage message -> b + android.widget.RelativeLayout rootContainerView -> f + com.batch.android.messaging.css.Document style -> c + boolean timeoutDone -> j + com.batch.android.messaging.view.AnimatedCloseButton closeButton -> e + java.lang.String STATE_TIMEOUT_DONE_KEY -> l + android.widget.ProgressBar webViewLoader -> g + com.batch.android.messaging.WebViewActionListener actionListener -> k + android.graphics.Point screenSizeDP -> d + com.batch.android.messaging.view.styled.WebView webView -> i + float FULLSCREEN_CLOSE_BUTTON_MARGIN_DP -> o + float CLOSE_PADDING_DP -> n + android.os.Handler timeoutHandler -> h + float CLOSE_SIZE_DP -> m + 1:1:void (android.content.Context,com.batch.android.messaging.model.WebViewMessage,com.batch.android.messaging.css.Document,com.batch.android.BatchMessagingWebViewJavascriptBridge):100:100 -> + 2:264:void (android.content.Context,com.batch.android.messaging.model.WebViewMessage,com.batch.android.messaging.css.Document,com.batch.android.BatchMessagingWebViewJavascriptBridge):84:346 -> + 1:1:com.batch.android.messaging.WebViewActionListener access$000(com.batch.android.messaging.view.formats.WebFormatView):63:63 -> a + 2:2:boolean access$402(com.batch.android.messaging.view.formats.WebFormatView,boolean):63:63 -> a + 3:3:void access$500(com.batch.android.messaging.view.formats.WebFormatView,java.lang.String,int):63:63 -> a + 4:4:void access$600(com.batch.android.messaging.view.formats.WebFormatView,com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause,com.batch.android.messaging.model.MessagingError,java.lang.String):63:63 -> a + 5:23:void handleWebViewError(java.lang.String,int):373:391 -> a + 24:25:void closeMessageWithError(com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause,com.batch.android.messaging.model.MessagingError,java.lang.String):411:412 -> a + 26:29:void restoreState(android.os.Bundle):443:446 -> a + 30:30:java.util.Map getRulesForView(com.batch.android.messaging.css.DOMNode):459:459 -> a + 31:37:android.widget.RelativeLayout addRootContainerView():465:471 -> a + 38:61:com.batch.android.messaging.view.AnimatedCloseButton addCloseButton(android.widget.RelativeLayout):534:557 -> a + 62:62:void lambda$addCloseButton$0(android.view.View):554:554 -> a + 1:1:boolean canAutoClose():0:0 -> b + 2:2:void access$100(com.batch.android.messaging.view.formats.WebFormatView):63:63 -> b + 3:7:void saveState(android.os.Bundle):434:438 -> b + 8:18:com.batch.android.messaging.view.styled.WebView addWebView(android.widget.RelativeLayout):476:486 -> b + 1:1:void access$200(com.batch.android.messaging.view.formats.WebFormatView):63:63 -> c + 2:3:void closeMessage():395:396 -> c + 4:36:android.widget.ProgressBar addWebViewLoader(android.widget.RelativeLayout):491:523 -> c + 1:1:androidx.appcompat.app.AlertDialog$Builder access$300(com.batch.android.messaging.view.formats.WebFormatView):63:63 -> d + 2:3:void dismissMessage():401:402 -> d + 1:1:androidx.appcompat.app.AlertDialog$Builder makeAlertBuilder():455:455 -> e + 1:2:void performTimeout():424:425 -> f + 1:2:void removeWebViewLoader():528:529 -> g + 1:1:android.view.View getCloseButton():350:350 -> getCloseButton + 1:3:void scheduleTimeout():417:419 -> h + 1:15:void startLoading():354:368 -> i + 1:7:android.view.WindowInsets onApplyWindowInsets(android.view.WindowInsets):570:576 -> onApplyWindowInsets + 8:17:android.view.WindowInsets onApplyWindowInsets(android.view.WindowInsets):572:581 -> onApplyWindowInsets + 1:1:void setActionListener(com.batch.android.messaging.WebViewActionListener):430:430 -> setActionListener +com.batch.android.messaging.view.formats.WebFormatView$1 -> com.batch.android.f0.e$a: +# {"id":"sourceFile","fileName":"WebFormatView.java"} + android.content.Context val$context -> a + com.batch.android.messaging.view.formats.WebFormatView this$0 -> b + 1:1:void (com.batch.android.messaging.view.formats.WebFormatView,android.content.Context):130:130 -> + 1:1:void lambda$onJsAlert$0(android.webkit.JsResult,android.content.DialogInterface,int):185:185 -> a + 2:2:void lambda$onJsAlert$1(android.webkit.JsResult,android.content.DialogInterface):189:189 -> a + 3:4:void lambda$onJsPrompt$4(android.widget.EditText,android.webkit.JsPromptResult,android.content.DialogInterface,int):233:234 -> a + 5:5:void lambda$onJsPrompt$5(android.webkit.JsPromptResult,android.content.DialogInterface,int):240:240 -> a + 6:6:void lambda$onJsPrompt$6(android.webkit.JsPromptResult,android.content.DialogInterface):244:244 -> a + 1:1:void lambda$onJsConfirm$2(android.webkit.JsResult,android.content.DialogInterface,int):204:204 -> b + 2:2:void lambda$onJsConfirm$3(android.webkit.JsResult,android.content.DialogInterface):208:208 -> b + 1:3:void onCloseWindow(android.webkit.WebView):163:165 -> onCloseWindow + 1:21:boolean onCreateWindow(android.webkit.WebView,boolean,boolean,android.os.Message):138:158 -> onCreateWindow + 1:14:boolean onJsAlert(android.webkit.WebView,java.lang.String,java.lang.String,android.webkit.JsResult):179:192 -> onJsAlert + 1:14:boolean onJsConfirm(android.webkit.WebView,java.lang.String,java.lang.String,android.webkit.JsResult):198:211 -> onJsConfirm + 1:25:boolean onJsPrompt(android.webkit.WebView,java.lang.String,java.lang.String,java.lang.String,android.webkit.JsPromptResult):223:247 -> onJsPrompt + 1:3:void onProgressChanged(android.webkit.WebView,int):171:173 -> onProgressChanged +com.batch.android.messaging.view.formats.WebFormatView$2 -> com.batch.android.f0.e$b: +# {"id":"sourceFile","fileName":"WebFormatView.java"} + com.batch.android.messaging.view.formats.WebFormatView this$0 -> b + boolean mainFrameFinished -> a + 1:2:void (com.batch.android.messaging.view.formats.WebFormatView):254:255 -> + 1:5:void onBatchPageStartedDrawing():263:267 -> a + 1:2:void onPageCommitVisible(android.webkit.WebView,java.lang.String):273:274 -> onPageCommitVisible + 1:4:void onPageFinished(android.webkit.WebView,java.lang.String):280:283 -> onPageFinished + 1:8:void onReceivedError(android.webkit.WebView,int,java.lang.String,java.lang.String):294:301 -> onReceivedError + 9:11:void onReceivedError(android.webkit.WebView,android.webkit.WebResourceRequest,android.webkit.WebResourceError):337:339 -> onReceivedError + 1:6:void onReceivedHttpError(android.webkit.WebView,android.webkit.WebResourceRequest,android.webkit.WebResourceResponse):320:325 -> onReceivedHttpError + 7:7:void onReceivedHttpError(android.webkit.WebView,android.webkit.WebResourceRequest,android.webkit.WebResourceResponse):322:322 -> onReceivedHttpError + 1:3:void onReceivedSslError(android.webkit.WebView,android.webkit.SslErrorHandler,android.net.http.SslError):307:309 -> onReceivedSslError +com.batch.android.messaging.view.helper.ImageHelper -> com.batch.android.g0.a: +# {"id":"sourceFile","fileName":"ImageHelper.java"} + 1:1:void ():11:11 -> + 1:11:void setDownloadResultInImage(android.widget.ImageView,com.batch.android.messaging.AsyncImageDownloadTask$Result):24:34 -> a +com.batch.android.messaging.view.helper.ImageHelper$Cache -> com.batch.android.g0.a$a: +# {"id":"sourceFile","fileName":"ImageHelper.java"} + com.batch.android.messaging.AsyncImageDownloadTask$Result get(java.lang.String) -> b + void put(com.batch.android.messaging.AsyncImageDownloadTask$Result) -> b +com.batch.android.messaging.view.helper.StyleHelper -> com.batch.android.g0.b: +# {"id":"sourceFile","fileName":"StyleHelper.java"} + java.lang.String TAG -> a + int RIPPLE_COLOR -> b + 1:1:void ():50:50 -> + 1:1:void ():55:55 -> + 1:43:void applyCommonRules(android.view.View,java.util.Map):94:136 -> a + 44:202:void applyCommonRules(android.view.View,java.util.Map):133:291 -> a + 203:268:void applyCommonRules(android.view.View,java.util.Map):245:310 -> a + 269:269:void applyCommonRules(android.view.View,java.util.Map):306:306 -> a + 270:352:com.batch.android.messaging.view.FlexboxLayout$LayoutParams getFlexLayoutParams(android.content.Context,com.batch.android.messaging.view.FlexboxLayout$LayoutParams,java.util.Map):329:411 -> a + 353:353:com.batch.android.messaging.view.FlexboxLayout$LayoutParams getFlexLayoutParams(android.content.Context,com.batch.android.messaging.view.FlexboxLayout$LayoutParams,java.util.Map):407:407 -> a + 354:441:com.batch.android.messaging.view.percent.PercentRelativeLayout$LayoutParams getRelativeLayoutParams(android.content.Context,com.batch.android.messaging.view.percent.PercentRelativeLayout$LayoutParams,java.util.Map,int,android.view.View):436:523 -> a + 442:517:com.batch.android.messaging.view.percent.PercentRelativeLayout$LayoutParams getRelativeLayoutParams(android.content.Context,com.batch.android.messaging.view.percent.PercentRelativeLayout$LayoutParams,java.util.Map,int,android.view.View):461:536 -> a + 518:518:com.batch.android.messaging.view.percent.PercentRelativeLayout$LayoutParams getRelativeLayoutParams(android.content.Context,com.batch.android.messaging.view.percent.PercentRelativeLayout$LayoutParams,java.util.Map,int,android.view.View):532:532 -> a + 519:576:android.widget.FrameLayout$LayoutParams getFrameLayoutParams(android.content.Context,android.widget.FrameLayout$LayoutParams,java.util.Map):559:616 -> a + 577:621:android.widget.FrameLayout$LayoutParams getFrameLayoutParams(android.content.Context,android.widget.FrameLayout$LayoutParams,java.util.Map):581:625 -> a + 622:622:android.widget.FrameLayout$LayoutParams getFrameLayoutParams(android.content.Context,android.widget.FrameLayout$LayoutParams,java.util.Map):621:621 -> a + 623:623:int dpToPixels(android.content.res.Resources,java.lang.Float):642:642 -> a + 624:624:java.lang.Float optFloat(java.lang.String):691:691 -> a + 625:628:int darkenColor(int):722:725 -> a + 629:652:android.graphics.drawable.Drawable getPressableGradientDrawable(com.batch.android.messaging.view.PositionableGradientDrawable):736:759 -> a + 1:1:float pixelsToDp(android.content.res.Resources,java.lang.Float):656:656 -> b + 2:2:java.lang.Integer optInt(java.lang.String):672:672 -> b + 1:5:int parseColor(java.lang.String):705:709 -> c + 1:3:com.batch.android.messaging.css.Document parseStyle(java.lang.String):67:69 -> d + 4:12:com.batch.android.messaging.css.Document parseStyle(java.lang.String):65:73 -> d +com.batch.android.messaging.view.helper.ThemeHelper -> com.batch.android.g0.c: +# {"id":"sourceFile","fileName":"ThemeHelper.java"} + 1:1:void ():12:12 -> + 1:9:int getDefaultLightTheme(android.content.Context):53:61 -> a + 10:10:int getThemeByName(java.lang.String,android.content.res.Resources,java.lang.String):75:75 -> a + 1:18:int getDefaultTheme(android.content.Context):22:39 -> b +com.batch.android.messaging.view.helper.ViewCompat -> com.batch.android.g0.d: +# {"id":"sourceFile","fileName":"ViewCompat.java"} + java.util.concurrent.atomic.AtomicInteger sNextGeneratedId -> a + 1:2:void ():38:39 -> + 1:1:void ():33:33 -> + 1:11:int generateViewId():50:60 -> a + 12:28:android.graphics.Point getScreenSize(android.content.Context):68:84 -> a + 1:5:boolean isTouchExplorationEnabled(android.content.Context):98:102 -> b +com.batch.android.messaging.view.percent.PercentFrameLayout -> com.batch.android.h0.a: +# {"id":"sourceFile","fileName":"PercentFrameLayout.java"} + com.batch.android.messaging.view.percent.PercentLayoutHelper mHelper -> a + 1:1:void (android.content.Context):70:70 -> + 2:2:void (android.content.Context):67:67 -> + 3:3:void (android.content.Context,android.util.AttributeSet):74:74 -> + 4:4:void (android.content.Context,android.util.AttributeSet):67:67 -> + 5:5:void (android.content.Context,android.util.AttributeSet,int):78:78 -> + 6:6:void (android.content.Context,android.util.AttributeSet,int):67:67 -> + 1:2:void onLayout(boolean,int,int,int,int):92:93 -> onLayout + 1:4:void onMeasure(int,int):83:86 -> onMeasure +com.batch.android.messaging.view.percent.PercentFrameLayout$LayoutParams -> com.batch.android.h0.a$a: +# {"id":"sourceFile","fileName":"PercentFrameLayout.java"} + com.batch.android.messaging.view.percent.PercentLayoutHelper$PercentLayoutInfo mPercentLayoutInfo -> a + 1:1:void (int,int):103:103 -> + 2:2:void (int,int,int):107:107 -> + 3:3:void (android.view.ViewGroup$LayoutParams):111:111 -> + 4:4:void (android.view.ViewGroup$MarginLayoutParams):115:115 -> + 5:6:void (android.widget.FrameLayout$LayoutParams):119:120 -> + 7:8:void (com.batch.android.messaging.view.percent.PercentFrameLayout$LayoutParams):124:125 -> + 1:5:com.batch.android.messaging.view.percent.PercentLayoutHelper$PercentLayoutInfo getPercentLayoutInfo():130:134 -> a + 1:1:void setBaseAttributes(android.content.res.TypedArray,int,int):139:139 -> setBaseAttributes +com.batch.android.messaging.view.percent.PercentLayoutHelper -> com.batch.android.h0.b: +# {"id":"sourceFile","fileName":"PercentLayoutHelper.java"} + android.view.ViewGroup mHost -> a + java.lang.String TAG -> b + 1:2:void (android.view.ViewGroup):75:76 -> + 1:2:void fetchWidthAndHeight(android.view.ViewGroup$LayoutParams,android.content.res.TypedArray,int,int):90:91 -> a + 3:11:void adjustChildren(int,int):102:110 -> a + 12:39:void adjustChildren(int,int):103:130 -> a + 40:61:boolean handleMeasuredStateTooSmall():181:202 -> a + 62:63:boolean shouldHandleMeasuredHeightTooSmall(android.view.View,com.batch.android.messaging.view.percent.PercentLayoutHelper$PercentLayoutInfo):217:218 -> a + 1:16:void restoreOriginalParams():143:158 -> b + 17:18:boolean shouldHandleMeasuredWidthTooSmall(android.view.View,com.batch.android.messaging.view.percent.PercentLayoutHelper$PercentLayoutInfo):208:209 -> b +com.batch.android.messaging.view.percent.PercentLayoutHelper$PercentLayoutInfo -> com.batch.android.h0.b$a: +# {"id":"sourceFile","fileName":"PercentLayoutHelper.java"} + float endMarginPercent -> h + float startMarginPercent -> g + float bottomMarginPercent -> f + float rightMarginPercent -> e + float topMarginPercent -> d + float leftMarginPercent -> c + float heightPercent -> b + float widthPercent -> a + android.view.ViewGroup$MarginLayoutParams mPreservedParams -> i + 1:10:void ():249:258 -> + 1:11:void fillLayoutParams(android.view.ViewGroup$LayoutParams,int,int):266:276 -> a + 12:41:void fillMarginLayoutParams(android.view.ViewGroup$MarginLayoutParams,int,int):285:314 -> a + 42:48:void restoreMarginLayoutParams(android.view.ViewGroup$MarginLayoutParams):340:346 -> a + 49:50:void restoreLayoutParams(android.view.ViewGroup$LayoutParams):355:356 -> a + 1:11:java.lang.String toString():320:330 -> toString + 12:12:java.lang.String toString():320:320 -> toString +com.batch.android.messaging.view.percent.PercentLayoutHelper$PercentLayoutParams -> com.batch.android.h0.b$b: +# {"id":"sourceFile","fileName":"PercentLayoutHelper.java"} + com.batch.android.messaging.view.percent.PercentLayoutHelper$PercentLayoutInfo getPercentLayoutInfo() -> a +com.batch.android.messaging.view.percent.PercentRelativeLayout -> com.batch.android.h0.c: +# {"id":"sourceFile","fileName":"PercentRelativeLayout.java"} + com.batch.android.messaging.view.percent.PercentLayoutHelper mHelper -> a + 1:1:void (android.content.Context):70:70 -> + 2:2:void (android.content.Context):67:67 -> + 3:3:void (android.content.Context,android.util.AttributeSet):74:74 -> + 4:4:void (android.content.Context,android.util.AttributeSet):67:67 -> + 5:5:void (android.content.Context,android.util.AttributeSet,int):78:78 -> + 6:6:void (android.content.Context,android.util.AttributeSet,int):67:67 -> + 1:2:void onLayout(boolean,int,int,int,int):92:93 -> onLayout + 1:4:void onMeasure(int,int):83:86 -> onMeasure +com.batch.android.messaging.view.percent.PercentRelativeLayout$LayoutParams -> com.batch.android.h0.c$a: +# {"id":"sourceFile","fileName":"PercentRelativeLayout.java"} + com.batch.android.messaging.view.percent.PercentLayoutHelper$PercentLayoutInfo mPercentLayoutInfo -> a + 1:1:void (int,int):103:103 -> + 2:2:void (android.view.ViewGroup$LayoutParams):107:107 -> + 3:3:void (android.view.ViewGroup$MarginLayoutParams):111:111 -> + 1:5:com.batch.android.messaging.view.percent.PercentLayoutHelper$PercentLayoutInfo getPercentLayoutInfo():116:120 -> a + 1:1:void setBaseAttributes(android.content.res.TypedArray,int,int):125:125 -> setBaseAttributes +com.batch.android.messaging.view.roundimage.Corner -> com.batch.android.i0.a: +# {"id":"sourceFile","fileName":"Corner.java"} + int BOTTOM_LEFT -> d + int TOP_RIGHT -> b + int BOTTOM_RIGHT -> c + int TOP_LEFT -> a +com.batch.android.messaging.view.roundimage.RoundedDrawable -> com.batch.android.i0.b: +# {"id":"sourceFile","fileName":"RoundedDrawable.java"} + boolean mRebuildShader -> n + android.graphics.RectF mDrawableRect -> b + android.graphics.Matrix mShaderMatrix -> j + android.graphics.RectF mBounds -> a + android.graphics.RectF mBitmapRect -> c + android.content.res.ColorStateList mBorderColor -> s + int mBitmapWidth -> f + android.graphics.RectF mBorderRect -> h + int mBitmapHeight -> g + android.graphics.Bitmap mBitmap -> d + boolean[] mCornersRounded -> p + boolean mOval -> q + android.graphics.RectF mSquareCornersRect -> k + android.graphics.Shader$TileMode mTileModeX -> l + java.lang.String TAG -> u + android.graphics.Paint mBorderPaint -> i + android.graphics.Shader$TileMode mTileModeY -> m + android.widget.ImageView$ScaleType mScaleType -> t + android.graphics.Paint mBitmapPaint -> e + int DEFAULT_BORDER_COLOR -> v + float mBorderWidth -> r + float mCornerRadius -> o + 1:1:void (android.graphics.Bitmap):74:74 -> + 2:42:void (android.graphics.Bitmap):49:89 -> + 1:1:com.batch.android.messaging.view.roundimage.RoundedDrawable fromBitmap(android.graphics.Bitmap):94:94 -> a + 2:16:android.graphics.Bitmap drawableToBitmap(android.graphics.drawable.Drawable):130:144 -> a + 17:49:void redrawBitmapForSquareCorners(android.graphics.Canvas):309:341 -> a + 50:50:float getCornerRadius(int):444:444 -> a + 51:64:com.batch.android.messaging.view.roundimage.RoundedDrawable setCornerRadius(int,float):466:479 -> a + 65:82:com.batch.android.messaging.view.roundimage.RoundedDrawable setCornerRadius(float,float,float,float):495:512 -> a + 83:93:com.batch.android.messaging.view.roundimage.RoundedDrawable setCornerRadius(float,float,float,float):510:520 -> a + 94:94:com.batch.android.messaging.view.roundimage.RoundedDrawable setCornerRadius(float,float,float,float):504:504 -> a + 95:96:com.batch.android.messaging.view.roundimage.RoundedDrawable setBorderWidth(float):529:530 -> a + 97:97:int getBorderColor():535:535 -> a + 98:99:com.batch.android.messaging.view.roundimage.RoundedDrawable setBorderColor(android.content.res.ColorStateList):547:548 -> a + 100:100:com.batch.android.messaging.view.roundimage.RoundedDrawable setOval(boolean):557:557 -> a + 101:105:com.batch.android.messaging.view.roundimage.RoundedDrawable setScaleType(android.widget.ImageView$ScaleType):567:571 -> a + 106:109:com.batch.android.messaging.view.roundimage.RoundedDrawable setTileModeX(android.graphics.Shader$TileMode):581:584 -> a + 110:111:boolean only(int,boolean[]):603:604 -> a + 112:112:boolean all(boolean[]):621:621 -> a + 1:22:android.graphics.drawable.Drawable fromDrawable(android.graphics.drawable.Drawable):102:123 -> b + 23:56:void redrawBorderForSquareCorners(android.graphics.Canvas):346:379 -> b + 57:57:com.batch.android.messaging.view.roundimage.RoundedDrawable setCornerRadius(float):454:454 -> b + 58:58:com.batch.android.messaging.view.roundimage.RoundedDrawable setBorderColor(int):539:539 -> b + 59:59:android.content.res.ColorStateList getBorderColors():543:543 -> b + 60:63:com.batch.android.messaging.view.roundimage.RoundedDrawable setTileModeY(android.graphics.Shader$TileMode):594:597 -> b + 64:64:boolean any(boolean[]):612:612 -> b + 1:1:float getBorderWidth():525:525 -> c + 1:1:float getCornerRadius():436:436 -> d + 1:32:void draw(android.graphics.Canvas):271:302 -> draw + 1:1:android.widget.ImageView$ScaleType getScaleType():562:562 -> e + 1:1:android.graphics.Bitmap getSourceBitmap():152:152 -> f + 1:1:android.graphics.Shader$TileMode getTileModeX():577:577 -> g + 1:1:int getAlpha():390:390 -> getAlpha + 1:1:android.graphics.ColorFilter getColorFilter():401:401 -> getColorFilter + 1:1:int getIntrinsicHeight():429:429 -> getIntrinsicHeight + 1:1:int getIntrinsicWidth():424:424 -> getIntrinsicWidth + 1:1:android.graphics.Shader$TileMode getTileModeY():590:590 -> h + 1:1:boolean isOval():553:553 -> i + 1:1:boolean isStateful():157:157 -> isStateful + 1:1:android.graphics.Bitmap toBitmap():630:630 -> j + 1:78:void updateShaderMatrix():176:253 -> k + 79:83:void updateShaderMatrix():243:247 -> k + 84:88:void updateShaderMatrix():236:240 -> k + 89:106:void updateShaderMatrix():208:225 -> k + 107:124:void updateShaderMatrix():188:205 -> k + 125:131:void updateShaderMatrix():178:184 -> k + 132:207:void updateShaderMatrix():182:257 -> k + 1:5:void onBoundsChange(android.graphics.Rect):262:266 -> onBoundsChange + 1:6:boolean onStateChange(int[]):162:167 -> onStateChange + 1:2:void setAlpha(int):395:396 -> setAlpha + 1:2:void setColorFilter(android.graphics.ColorFilter):406:407 -> setColorFilter + 1:2:void setDither(boolean):412:413 -> setDither + 1:2:void setFilterBitmap(boolean):418:419 -> setFilterBitmap +com.batch.android.messaging.view.roundimage.RoundedDrawable$1 -> com.batch.android.i0.b$a: +# {"id":"sourceFile","fileName":"RoundedDrawable.java"} + int[] $SwitchMap$android$widget$ImageView$ScaleType -> a + 1:1:void ():176:176 -> +com.batch.android.messaging.view.roundimage.RoundedImageView -> com.batch.android.i0.c: +# {"id":"sourceFile","fileName":"RoundedImageView.java"} + int mBackgroundResource -> l + android.graphics.drawable.Drawable mDrawable -> g + boolean mIsOval -> i + boolean[] roundedCorners -> q + java.lang.String TAG -> v + android.graphics.Shader$TileMode mTileModeX -> n + android.content.res.ColorStateList mBorderColor -> c + float DEFAULT_RADIUS -> w + boolean mColorMod -> f + boolean mHasColorFilter -> h + int TILE_MODE_MIRROR -> u + boolean $assertionsDisabled -> A + int TILE_MODE_CLAMP -> s + android.graphics.ColorFilter mColorFilter -> e + boolean mMutateBackground -> j + int mResource -> k + float mBorderWidth -> d + float[] mCornerRadii -> a + android.widget.ImageView$ScaleType[] SCALE_TYPES -> z + android.graphics.drawable.Drawable mBackgroundDrawable -> b + android.graphics.Shader$TileMode mTileModeY -> o + float DEFAULT_BORDER_WIDTH -> x + android.widget.ImageView$ScaleType mScaleType -> m + int TILE_MODE_REPEAT -> t + float cornerRadius -> p + int TILE_MODE_UNDEFINED -> r + android.graphics.Shader$TileMode DEFAULT_TILE_MODE -> y + 1:15:void ():48:62 -> + 1:1:void (android.content.Context):96:96 -> + 2:22:void (android.content.Context):73:93 -> + 23:23:void (android.content.Context,android.util.AttributeSet):100:100 -> + 24:24:void (android.content.Context,android.util.AttributeSet,int):104:104 -> + 25:45:void (android.content.Context,android.util.AttributeSet,int):73:93 -> + 1:4:void applyColorMod():266:269 -> a + 5:27:void updateAttrs(android.graphics.drawable.Drawable,android.widget.ImageView$ScaleType):281:303 -> a + 28:28:float getCornerRadius(int):342:342 -> a + 29:29:void setCornerRadiusDimen(int,int):362:362 -> a + 30:37:void setCornerRadius(int,float):387:394 -> a + 38:54:void setCornerRadius(float,float,float,float):407:423 -> a + 55:61:void mutateBackground(boolean):517:523 -> a + 62:143:void applyStyleRules(java.util.Map):535:616 -> a + 144:144:void applyStyleRules(java.util.Map):612:612 -> a + 1:1:android.graphics.Shader$TileMode parseTileMode(int):114:114 -> b + 2:2:android.graphics.Shader$TileMode parseTileMode(int):112:112 -> b + 3:3:android.graphics.Shader$TileMode parseTileMode(int):110:110 -> b + 4:8:void updateBackgroundDrawableAttrs(boolean):243:247 -> b + 9:9:boolean isOval():472:472 -> b + 1:1:boolean mutatesBackground():513:513 -> c + 1:17:android.graphics.drawable.Drawable resolveBackgroundResource():219:235 -> d + 1:2:void drawableStateChanged():122:123 -> drawableStateChanged + 1:17:android.graphics.drawable.Drawable resolveResource():179:195 -> e + 1:1:void updateDrawableAttrs():239:239 -> f + 1:1:int getBorderColor():447:447 -> getBorderColor + 1:1:android.content.res.ColorStateList getBorderColors():455:455 -> getBorderColors + 1:1:float getBorderWidth():427:427 -> getBorderWidth + 1:1:float getCornerRadius():321:321 -> getCornerRadius + 1:2:float getMaxCornerRadius():329:330 -> getMaxCornerRadius + 1:1:android.widget.ImageView$ScaleType getScaleType():128:128 -> getScaleType + 1:1:android.graphics.Shader$TileMode getTileModeX():483:483 -> getTileModeX + 1:1:android.graphics.Shader$TileMode getTileModeY():498:498 -> getTileModeY + 1:1:void setBackground(android.graphics.drawable.Drawable):200:200 -> setBackground + 1:2:void setBackgroundColor(int):214:215 -> setBackgroundColor + 1:4:void setBackgroundDrawable(android.graphics.drawable.Drawable):311:314 -> setBackgroundDrawable + 1:4:void setBackgroundResource(int):205:208 -> setBackgroundResource + 1:1:void setBorderColor(int):451:451 -> setBorderColor + 2:10:void setBorderColor(android.content.res.ColorStateList):459:467 -> setBorderColor + 1:1:void setBorderWidth(int):431:431 -> setBorderWidth + 2:9:void setBorderWidth(float):435:442 -> setBorderWidth + 1:6:void setColorFilter(android.graphics.ColorFilter):253:258 -> setColorFilter + 1:6:void setCornerRadius(float):371:376 -> setCornerRadius + 7:7:void setCornerRadius(float):372:372 -> setCornerRadius + 1:2:void setCornerRadiusDimen(int):351:352 -> setCornerRadiusDimen + 1:5:void setImageBitmap(android.graphics.Bitmap):155:159 -> setImageBitmap + 1:4:void setImageDrawable(android.graphics.drawable.Drawable):147:150 -> setImageDrawable + 1:5:void setImageResource(int):164:168 -> setImageResource + 1:2:void setImageURI(android.net.Uri):174:175 -> setImageURI + 1:4:void setOval(boolean):476:479 -> setOval + 1:9:void setScaleType(android.widget.ImageView$ScaleType):133:141 -> setScaleType + 1:8:void setTileModeX(android.graphics.Shader$TileMode):487:494 -> setTileModeX + 1:8:void setTileModeY(android.graphics.Shader$TileMode):502:509 -> setTileModeY +com.batch.android.messaging.view.roundimage.RoundedTransformationBuilder -> com.batch.android.i0.d: +# {"id":"sourceFile","fileName":"RoundedTransformationBuilder.java"} + android.content.res.ColorStateList mBorderColor -> e + float mBorderWidth -> d + android.util.DisplayMetrics mDisplayMetrics -> a + float[] mCornerRadii -> b + android.widget.ImageView$ScaleType mScaleType -> f + boolean mOval -> c + 1:1:void ():37:37 -> + 2:10:void ():30:38 -> + 1:1:com.batch.android.messaging.view.roundimage.RoundedTransformationBuilder scaleType(android.widget.ImageView$ScaleType):42:42 -> a + 2:2:com.batch.android.messaging.view.roundimage.RoundedTransformationBuilder cornerRadius(int,float):68:68 -> a + 3:3:com.batch.android.messaging.view.roundimage.RoundedTransformationBuilder borderWidth(float):100:100 -> a + 4:4:com.batch.android.messaging.view.roundimage.RoundedTransformationBuilder borderColor(int):122:122 -> a + 5:5:com.batch.android.messaging.view.roundimage.RoundedTransformationBuilder borderColor(android.content.res.ColorStateList):133:133 -> a + 6:6:com.batch.android.messaging.view.roundimage.RoundedTransformationBuilder oval(boolean):144:144 -> a + 1:1:com.batch.android.messaging.view.roundimage.RoundedTransformationBuilder cornerRadiusDp(int,float):90:90 -> b + 2:2:com.batch.android.messaging.view.roundimage.RoundedTransformationBuilder borderWidthDp(float):111:111 -> b + 1:4:com.batch.android.messaging.view.roundimage.RoundedTransformationBuilder cornerRadius(float):53:56 -> c + 1:1:com.batch.android.messaging.view.roundimage.RoundedTransformationBuilder cornerRadiusDp(float):79:79 -> d +com.batch.android.messaging.view.styled.Button -> com.batch.android.messaging.view.styled.a: +# {"id":"sourceFile","fileName":"Button.java"} + 1:1:void (android.content.Context):17:17 -> + 2:2:void (android.content.Context,android.util.AttributeSet):21:21 -> + 3:3:void (android.content.Context,android.util.AttributeSet,int):25:25 -> + 1:13:void applyStyleRules(java.util.Map):30:42 -> a +com.batch.android.messaging.view.styled.SeparatedFlexboxLayout -> com.batch.android.j0.a: +# {"id":"sourceFile","fileName":"SeparatedFlexboxLayout.java"} + java.lang.String separatorPrefix -> H + int separatorCount -> J + com.batch.android.messaging.view.DelegatedTouchEventViewGroup$Delegate delegate -> G + com.batch.android.messaging.view.styled.SeparatedFlexboxLayout$SeparatorStyleProvider styleProvider -> I + 1:1:void (android.content.Context,java.lang.String,com.batch.android.messaging.view.styled.SeparatedFlexboxLayout$SeparatorStyleProvider):29:29 -> + 2:14:void (android.content.Context,java.lang.String,com.batch.android.messaging.view.styled.SeparatedFlexboxLayout$SeparatorStyleProvider):26:38 -> + 15:15:void (android.content.Context,java.lang.String,com.batch.android.messaging.view.styled.SeparatedFlexboxLayout$SeparatorStyleProvider):34:34 -> + 1:50:void applyStyleRules(java.util.Map):92:141 -> a + 51:51:boolean superOnTouchEvent(android.view.MotionEvent):182:182 -> a + 1:5:void addView(android.view.View):45:49 -> addView + 1:1:void internalAddView(android.view.View):53:53 -> b + 2:2:boolean superOnInterceptTouchEvent(android.view.MotionEvent):177:177 -> b + 1:9:void addSeparator():72:80 -> c + 10:10:void addSeparator():78:78 -> c + 11:21:void addSeparator():77:87 -> c + 1:1:boolean isHorizontal():57:57 -> d + 1:1:java.lang.String getSeparatorPrefix():65:65 -> getSeparatorPrefix + 1:4:boolean onInterceptTouchEvent(android.view.MotionEvent):153:156 -> onInterceptTouchEvent + 1:4:boolean onTouchEvent(android.view.MotionEvent):163:166 -> onTouchEvent + 1:1:void setTouchEventDelegate(com.batch.android.messaging.view.DelegatedTouchEventViewGroup$Delegate):172:172 -> setTouchEventDelegate +com.batch.android.messaging.view.styled.SeparatedFlexboxLayout$SeparatorStyleProvider -> com.batch.android.j0.a$a: +# {"id":"sourceFile","fileName":"SeparatedFlexboxLayout.java"} + java.util.Map getRulesForSeparator(com.batch.android.messaging.view.styled.SeparatedFlexboxLayout,java.lang.String) -> a +com.batch.android.messaging.view.styled.SeparatorView -> com.batch.android.j0.b: +# {"id":"sourceFile","fileName":"SeparatorView.java"} + 1:1:void (android.content.Context):14:14 -> + 1:1:void applyStyleRules(java.util.Map):19:19 -> a +com.batch.android.messaging.view.styled.Styleable -> com.batch.android.j0.c: +# {"id":"sourceFile","fileName":"Styleable.java"} + void applyStyleRules(java.util.Map) -> a +com.batch.android.messaging.view.styled.TextView -> com.batch.android.messaging.view.styled.TextView: +# {"id":"sourceFile","fileName":"TextView.java"} + android.graphics.Typeface typefaceOverride -> b + android.graphics.Typeface boldTypefaceOverride -> c + java.lang.String TAG -> a + 1:1:void (android.content.Context):36:36 -> + 2:2:void (android.content.Context,android.util.AttributeSet):40:40 -> + 3:3:void (android.content.Context,android.util.AttributeSet,int):44:44 -> + 4:4:void (android.content.Context,android.util.AttributeSet,int,int):49:49 -> + 1:1:void applyStyleRules(java.util.Map):54:54 -> a + 2:50:void applyStyleRules(android.widget.TextView,java.util.Map):64:112 -> a + 51:78:void applyStyleRules(android.widget.TextView,java.util.Map):110:137 -> a + 79:125:void applyStyleRules(android.widget.TextView,java.util.Map):136:182 -> a + 126:131:void applyStyleRules(android.widget.TextView,java.util.Map):180:185 -> a + 132:138:void makeScrollable():192:198 -> a +com.batch.android.messaging.view.styled.TextView$1 -> com.batch.android.messaging.view.styled.TextView$a: +# {"id":"sourceFile","fileName":"TextView.java"} + android.widget.Scroller val$scroller -> b + com.batch.android.messaging.view.styled.TextView this$0 -> c + android.view.GestureDetector gesture -> a + 1:3:void (com.batch.android.messaging.view.styled.TextView,android.widget.Scroller):199:201 -> + 1:5:boolean onTouch(android.view.View,android.view.MotionEvent):218:222 -> onTouch +com.batch.android.messaging.view.styled.TextView$1$1 -> com.batch.android.messaging.view.styled.TextView$a$a: +# {"id":"sourceFile","fileName":"TextView.java"} + com.batch.android.messaging.view.styled.TextView$1 this$1 -> a + 1:1:void (com.batch.android.messaging.view.styled.TextView$1):202:202 -> + 1:5:boolean onFling(android.view.MotionEvent,android.view.MotionEvent,float,float):205:209 -> onFling +com.batch.android.messaging.view.styled.WebView -> com.batch.android.j0.d: +# {"id":"sourceFile","fileName":"WebView.java"} + 1:1:void (android.content.Context):11:11 -> + 1:1:void applyStyleRules(java.util.Map):16:16 -> a +com.batch.android.metrics.MetricManager -> com.batch.android.k0.a: +# {"id":"sourceFile","fileName":"MetricManager.java"} + com.batch.android.core.DateProvider dateProvider -> e + java.util.List metrics -> a + java.lang.String TAG -> f + int DELAY_BEFORE_SENDING -> h + java.util.concurrent.atomic.AtomicBoolean isSending -> b + int DEFAULT_RETRY_AFTER -> g + long nextMetricServiceAvailableTimestamp -> d + java.util.concurrent.ScheduledExecutorService sendExecutor -> c + 1:38:void ():28:65 -> + 1:1:java.util.concurrent.atomic.AtomicBoolean access$000(com.batch.android.metrics.MetricManager):28:28 -> a + 2:2:long access$102(com.batch.android.metrics.MetricManager,long):28:28 -> a + 3:5:void addMetric(com.batch.android.metrics.model.Metric):73:75 -> a + 6:37:java.util.List getMetricsToSend():84:115 -> a + 38:65:void lambda$sendMetrics$0(android.content.Context):146:173 -> a + 1:1:com.batch.android.core.DateProvider access$200(com.batch.android.metrics.MetricManager):28:28 -> b + 2:2:boolean isMetricServiceAvailable():124:124 -> b + 1:1:com.batch.android.metrics.MetricManager provide():69:69 -> c + 1:14:void sendMetrics():131:144 -> d +com.batch.android.metrics.MetricManager$1 -> com.batch.android.k0.a$a: +# {"id":"sourceFile","fileName":"MetricManager.java"} + com.batch.android.metrics.MetricManager this$0 -> a + 1:1:void (com.batch.android.metrics.MetricManager):154:154 -> + 1:6:void onFailure(com.batch.android.core.Webservice$WebserviceError):163:168 -> a + 1:2:void onSuccess():157:158 -> onSuccess +com.batch.android.metrics.MetricRegistry -> com.batch.android.k0.b: +# {"id":"sourceFile","fileName":"MetricRegistry.java"} + com.batch.android.metrics.model.Observation localCampaignsJITResponseTime -> a + com.batch.android.metrics.model.Observation localCampaignsSyncResponseTime -> c + com.batch.android.metrics.model.Counter localCampaignsJITCount -> b + 1:15:void ():12:26 -> + 1:1:void ():9:9 -> +com.batch.android.metrics.model.Counter -> com.batch.android.l0.a: +# {"id":"sourceFile","fileName":"Counter.java"} + float value -> g + 1:7:void (com.batch.android.metrics.model.Counter):12:18 -> + 8:10:void (java.lang.String):22:24 -> + 1:1:java.lang.Object newChild(java.util.List):7:7 -> a + 1:2:com.batch.android.metrics.model.Counter newChild(java.util.List):29:30 -> b + 1:3:void reset():36:38 -> j + 1:4:void inc():42:45 -> l +com.batch.android.metrics.model.Metric -> com.batch.android.l0.b: +# {"id":"sourceFile","fileName":"Metric.java"} + java.util.List labelValues -> e + java.util.List labelNames -> d + java.util.List values -> c + java.util.concurrent.ConcurrentMap children -> f + java.lang.String name -> a + java.lang.String type -> b + 1:1:void (java.lang.String):32:32 -> + 2:5:void (java.lang.String):30:33 -> + java.lang.Object newChild(java.util.List) -> a + 1:1:java.lang.Object labelNames(java.lang.String[]):42:42 -> a + 2:13:void pack(com.batch.android.msgpack.core.MessageBufferPacker):61:72 -> a + 14:14:java.util.concurrent.ConcurrentMap getChildren():108:108 -> a + 1:5:java.lang.Object labels(java.lang.String[]):47:51 -> b + 6:6:java.util.List getLabelNames():100:100 -> b + 1:1:java.util.List getLabelValues():104:104 -> c + 1:1:java.lang.String getName():88:88 -> d + 1:1:java.lang.String getType():92:92 -> e + 1:1:java.util.List getValues():96:96 -> f + 1:1:boolean hasChanged():80:80 -> g + 1:1:boolean hasChildren():84:84 -> h + 1:1:java.lang.Object register():37:37 -> i + void reset() -> j + 1:1:void update():76:76 -> k +com.batch.android.metrics.model.Metric$Type -> com.batch.android.l0.b$a: +# {"id":"sourceFile","fileName":"Metric.java"} + java.lang.String COUNTER -> a + java.lang.String OBSERVATION -> b +com.batch.android.metrics.model.Observation -> com.batch.android.l0.c: +# {"id":"sourceFile","fileName":"Observation.java"} + java.util.concurrent.atomic.AtomicBoolean observing -> h + long startTime -> g + 1:1:void (java.lang.String):17:17 -> + 2:7:void (java.lang.String):14:19 -> + 8:8:void (com.batch.android.metrics.model.Observation):23:23 -> + 9:26:void (com.batch.android.metrics.model.Observation):14:31 -> + 1:1:java.lang.Object newChild(java.util.List):10:10 -> a + 1:2:com.batch.android.metrics.model.Observation newChild(java.util.List):36:37 -> b + 1:2:void reset():43:44 -> j + 1:1:boolean isObserving():60:60 -> l + 1:4:void observeDuration():53:56 -> m + 1:2:void startTimer():48:49 -> n +com.batch.android.module.ActionModule -> com.batch.android.m0.a: +# {"id":"sourceFile","fileName":"ActionModule.java"} + java.util.HashMap drawableAliases -> b + com.batch.android.BatchDeeplinkInterceptor deeplinkInterceptor -> c + java.util.HashMap registeredActions -> a + java.lang.String RESERVED_ACTION_IDENTIFIER_PREFIX -> e + java.lang.String TAG -> d + 1:1:void ():50:50 -> + 2:9:void ():48:55 -> + 1:13:void registerAction(com.batch.android.UserAction):67:79 -> a + 14:14:void registerAction(com.batch.android.UserAction):69:69 -> a + 15:15:void registerAction(com.batch.android.UserAction):64:64 -> a + 16:24:void addDrawableAlias(java.lang.String,int):118:126 -> a + 25:25:void addDrawableAlias(java.lang.String,int):123:123 -> a + 26:26:void addDrawableAlias(java.lang.String,int):119:119 -> a + 27:27:void addDrawableAlias(java.lang.String,int):115:115 -> a + 28:34:int getAliasedDrawableID(java.lang.String):136:142 -> a + 35:49:boolean performUserAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject):156:170 -> a + 50:50:boolean performUserAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject):159:159 -> a + 51:58:boolean performAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject,com.batch.android.UserActionSource):189:196 -> a + 59:59:void setDeeplinkInterceptor(com.batch.android.BatchDeeplinkInterceptor):210:210 -> a + 60:68:int getDrawableIdForNameOrAlias(android.content.Context,java.lang.String):274:282 -> a + 1:15:void unregisterAction(java.lang.String):92:106 -> b + 16:16:void unregisterAction(java.lang.String):97:97 -> b + 17:17:void unregisterAction(java.lang.String):93:93 -> b + 18:18:void unregisterAction(java.lang.String):89:89 -> b + 1:1:java.lang.String getId():292:292 -> g + int getState() -> h + 1:1:com.batch.android.BatchDeeplinkInterceptor getDeeplinkInterceptor():218:218 -> i + 1:46:void registerBuiltinActions():222:267 -> j +com.batch.android.module.BatchModule -> com.batch.android.m0.b: +# {"id":"sourceFile","fileName":"BatchModule.java"} + 1:1:void ():11:11 -> + void batchContextBecameAvailable(android.content.Context) -> a + void batchDidStart() -> b + void batchDidStop() -> c + void batchIsFinishing() -> d + void batchWillStart() -> e + void batchWillStop() -> f + java.lang.String getId() -> g + int getState() -> h +com.batch.android.module.BatchModuleMaster -> com.batch.android.m0.c: +# {"id":"sourceFile","fileName":"BatchModuleMaster.java"} + java.util.List modules -> a + 1:2:void (java.util.List):32:33 -> + 1:2:void batchContextBecameAvailable(android.content.Context):65:66 -> a + 1:2:void batchDidStart():79:80 -> b + 1:2:void batchDidStop():100:101 -> c + 1:2:void batchIsFinishing():86:87 -> d + 1:2:void batchWillStart():72:73 -> e + 1:2:void batchWillStop():93:94 -> f + 1:1:java.lang.String getId():55:55 -> g + int getState() -> h + 1:11:com.batch.android.module.BatchModuleMaster provide():38:48 -> i +com.batch.android.module.DisplayReceiptModule -> com.batch.android.m0.d: +# {"id":"sourceFile","fileName":"DisplayReceiptModule.java"} + com.batch.android.module.OptOutModule optOutModule -> a + java.lang.String TAG -> b + 1:2:void (com.batch.android.module.OptOutModule):37:38 -> + 1:7:java.io.File savePushReceipt(android.content.Context,com.batch.android.core.InternalPushData):80:86 -> a + 8:34:void sendReceipt(android.content.Context,boolean):160:186 -> a + 1:11:void batchDidStart():58:68 -> b + 12:62:void scheduleDisplayReceipt(android.content.Context,com.batch.android.core.InternalPushData):96:146 -> b + 63:63:void wipeData(android.content.Context):214:214 -> b + 1:1:java.lang.String getId():48:48 -> g + int getState() -> h + 1:1:com.batch.android.module.DisplayReceiptModule provide():43:43 -> i +com.batch.android.module.DisplayReceiptModule$1 -> com.batch.android.m0.d$a: +# {"id":"sourceFile","fileName":"DisplayReceiptModule.java"} + java.util.Map val$payloads -> a + 1:1:void (java.util.Map):189:189 -> + 1:1:void onFailure(com.batch.android.core.Webservice$WebserviceError):201:201 -> a + 1:4:void onSuccess():192:195 -> onSuccess +com.batch.android.module.EventDispatcherModule -> com.batch.android.m0.e: +# {"id":"sourceFile","fileName":"EventDispatcherModule.java"} + com.batch.android.module.OptOutModule optOutModule -> b + java.lang.String COMPONENT_KEY_PREFIX -> f + java.util.Set eventDispatchers -> a + boolean isContextLoaded -> c + java.lang.String COMPONENT_SENTINEL_VALUE -> e + java.lang.String TAG -> d + 1:1:void (com.batch.android.module.OptOutModule):35:35 -> + 2:8:void (com.batch.android.module.OptOutModule):30:36 -> + 1:1:void printDeprecatedDispatcher(java.lang.String):59:59 -> a + 2:4:void addEventDispatcher(com.batch.android.BatchEventDispatcher):63:65 -> a + 5:14:void dispatchEvent(com.batch.android.Batch$EventDispatcher$Type,com.batch.android.Batch$EventDispatcher$Payload):75:84 -> a + 1:1:void printLoadedDispatcher(java.lang.String):55:55 -> b + 2:4:boolean removeEventDispatcher(com.batch.android.BatchEventDispatcher):69:71 -> b + 5:30:void loadDispatcherFromContext(android.content.Context):88:113 -> b + 31:57:void loadDispatcherFromContext(android.content.Context):111:137 -> b + 58:58:void loadDispatcherFromContext(android.content.Context):99:99 -> b + 1:1:java.lang.String getId():46:46 -> g + int getState() -> h + 1:4:com.batch.android.json.JSONObject getDispatchersAnalyticRepresentation():149:152 -> i + 1:1:com.batch.android.module.EventDispatcherModule provide():41:41 -> j +com.batch.android.module.LocalCampaignsModule -> com.batch.android.m0.f: +# {"id":"sourceFile","fileName":"LocalCampaignsModule.java"} + java.util.concurrent.ExecutorService triggerExecutor -> f + java.lang.String TAG -> i + java.util.concurrent.atomic.AtomicBoolean isWaitingJITSync -> e + java.util.concurrent.atomic.AtomicBoolean isReady -> d + android.content.BroadcastReceiver newSessionBroadcastReceiver -> h + boolean isNewSessionBroadcastReceiverRegistered -> g + com.batch.android.localcampaigns.CampaignManager campaignManager -> a + boolean triedToReadSavedCampaign -> b + java.util.LinkedList signalQueue -> c + 1:1:void (com.batch.android.localcampaigns.CampaignManager):85:85 -> + 2:273:void (com.batch.android.localcampaigns.CampaignManager):53:324 -> + 274:274:void (com.batch.android.localcampaigns.CampaignManager):86:86 -> + 1:1:java.util.concurrent.atomic.AtomicBoolean access$000(com.batch.android.module.LocalCampaignsModule):41:41 -> a + 2:65:void electCampaignForSignal(com.batch.android.localcampaigns.signal.Signal):200:263 -> a + 66:78:void lambda$electCampaignForSignal$1(com.batch.android.localcampaigns.model.LocalCampaign,com.batch.android.localcampaigns.model.LocalCampaign):229:241 -> a + 79:80:void displayMessage(com.batch.android.localcampaigns.model.LocalCampaign):272:273 -> a + 81:82:void batchContextBecameAvailable(android.content.Context):369:370 -> a + 1:8:void enqueueSignal(com.batch.android.localcampaigns.signal.Signal):126:133 -> b + 9:15:void enqueueSignal(com.batch.android.localcampaigns.signal.Signal):131:137 -> b + 16:17:void lambda$loadSavedCampaigns$2(android.content.Context):359:360 -> b + 1:5:void lambda$processSignal$0(com.batch.android.localcampaigns.signal.Signal):170:174 -> c + 6:15:void loadSavedCampaigns(android.content.Context):354:363 -> c + 16:16:void batchDidStop():375:375 -> c + 1:25:void processSignal(com.batch.android.localcampaigns.signal.Signal):145:169 -> d + 26:31:void registerBroadcastReceiverIfNeeded(android.content.Context):340:345 -> d + 1:4:void sendSignal(com.batch.android.localcampaigns.signal.Signal):114:117 -> e + 5:7:void wipeData(android.content.Context):315:317 -> e + 1:1:java.lang.String getId():98:98 -> g + int getState() -> h + 1:12:void dequeueSignals():288:299 -> i + 1:2:void makeReady():280:281 -> j + 1:1:void onLocalCampaignsWebserviceFinished():306:306 -> k + 1:1:com.batch.android.module.LocalCampaignsModule provide():91:91 -> l +com.batch.android.module.LocalCampaignsModule$1 -> com.batch.android.m0.f$a: +# {"id":"sourceFile","fileName":"LocalCampaignsModule.java"} + com.batch.android.module.LocalCampaignsModule this$0 -> a + 1:1:void (com.batch.android.module.LocalCampaignsModule):324:324 -> + 1:4:void onReceive(android.content.Context,android.content.Intent):327:330 -> onReceive +com.batch.android.module.MessagingModule -> com.batch.android.m0.g: +# {"id":"sourceFile","fileName":"MessagingModule.java"} + java.lang.String ACTION_DISMISS_INTERSTITIAL -> i + java.lang.String TAG -> h + java.lang.String ACTION_DISMISS_BANNER -> j + java.lang.String MESSAGING_EVENT_NAME_DISMISS -> m + java.lang.String MESSAGING_EVENT_NAME_SHOW -> l + java.lang.String MESSAGING_EVENT_NAME_CLOSE_ERROR -> o + java.lang.String MESSAGING_EVENT_NAME_CLOSE -> n + java.lang.String MESSAGING_EVENT_NAME_GLOBAL_TAP -> q + java.lang.String MESSAGING_EVENT_NAME_AUTO_CLOSE -> p + java.lang.String MESSAGING_EVENT_NAME_WEBVIEW_CLICK -> s + java.lang.String MESSAGING_EVENT_NAME_CTA -> r + double DEFAULT_IMAGE_DOWNLOAD_TIMEOUT -> k + com.batch.android.module.TrackerModule trackerModule -> g + com.batch.android.module.ActionModule actionModule -> f + com.batch.android.BatchMessage pendingMessage -> e + boolean showForegroundLandings -> a + boolean automaticMode -> b + com.batch.android.Batch$Messaging$LifecycleListener listener -> c + boolean doNotDisturbMode -> d + 1:1:void (com.batch.android.module.ActionModule,com.batch.android.module.TrackerModule):110:110 -> + 2:18:void (com.batch.android.module.ActionModule,com.batch.android.module.TrackerModule):96:112 -> + 1:2:void setTypefaceOverride(android.graphics.Typeface,android.graphics.Typeface):167:168 -> a + 3:3:void setLifecycleListener(com.batch.android.Batch$Messaging$LifecycleListener):172:172 -> a + 4:16:boolean doesAppHaveRequiredLibraries(boolean):194:206 -> a + 17:46:com.batch.android.BatchBannerView loadBanner(android.content.Context,com.batch.android.BatchMessage,com.batch.android.json.JSONObject):291:320 -> a + 47:53:com.batch.android.BatchBannerView loadBanner(android.content.Context,com.batch.android.BatchMessage,com.batch.android.json.JSONObject):317:323 -> a + 54:55:com.batch.android.BatchBannerView loadBanner(android.content.Context,com.batch.android.BatchMessage,com.batch.android.json.JSONObject):312:313 -> a + 56:56:com.batch.android.BatchBannerView loadBanner(android.content.Context,com.batch.android.BatchMessage,com.batch.android.json.JSONObject):292:292 -> a + 57:57:com.batch.android.BatchBannerView loadBanner(android.content.Context,com.batch.android.BatchMessage,com.batch.android.json.JSONObject):288:288 -> a + 58:58:com.batch.android.BatchBannerView loadBanner(android.content.Context,com.batch.android.BatchMessage,com.batch.android.json.JSONObject):283:283 -> a + 59:60:void performAction(android.content.Context,com.batch.android.BatchMessage,com.batch.android.messaging.model.Action):328:329 -> a + 61:84:void displayMessage(android.content.Context,com.batch.android.BatchMessage,boolean):334:357 -> a + 85:102:void displayInAppMessage(com.batch.android.BatchInAppMessage):361:378 -> a + 103:117:com.batch.android.json.JSONObject generateBaseEventParameters(com.batch.android.messaging.model.Message,java.lang.String):391:405 -> a + 118:118:com.batch.android.json.JSONObject generateBaseEventParameters(com.batch.android.messaging.model.Message,java.lang.String):402:402 -> a + 119:119:com.batch.android.json.JSONObject generateBaseEventParameters(com.batch.android.messaging.model.Message,java.lang.String):399:399 -> a + 120:138:com.batch.android.json.JSONObject generateBaseEventParameters(com.batch.android.messaging.model.Message,java.lang.String):396:414 -> a + 139:150:void trackCTAClickEvent(com.batch.android.messaging.model.Message,int,java.lang.String):440:451 -> a + 151:158:void trackWebViewClickEvent(com.batch.android.messaging.model.Message,java.lang.String,java.lang.String):461:468 -> a + 159:161:void onMessageCTAClicked(com.batch.android.messaging.model.Message,int,com.batch.android.messaging.model.CTA):499:501 -> a + 162:165:void onWebViewMessageClickTracked(com.batch.android.messaging.model.Message,com.batch.android.messaging.model.Action,java.lang.String):511:514 -> a + 166:180:void onMessageGlobalTap(com.batch.android.messaging.model.Message,com.batch.android.messaging.model.Action):523:537 -> a + 181:183:void onMessageAutoClosed(com.batch.android.messaging.model.Message):546:548 -> a + 184:186:void onMessageClosedError(com.batch.android.messaging.model.Message,com.batch.android.messaging.model.MessagingError):554:556 -> a + 1:1:void setAutomaticMode(boolean):163:163 -> b + 2:42:androidx.fragment.app.DialogFragment loadFragment(android.content.Context,com.batch.android.BatchMessage,com.batch.android.json.JSONObject):232:272 -> b + 43:44:androidx.fragment.app.DialogFragment loadFragment(android.content.Context,com.batch.android.BatchMessage,com.batch.android.json.JSONObject):253:254 -> b + 45:45:androidx.fragment.app.DialogFragment loadFragment(android.content.Context,com.batch.android.BatchMessage,com.batch.android.json.JSONObject):233:233 -> b + 46:46:androidx.fragment.app.DialogFragment loadFragment(android.content.Context,com.batch.android.BatchMessage,com.batch.android.json.JSONObject):229:229 -> b + 47:47:androidx.fragment.app.DialogFragment loadFragment(android.content.Context,com.batch.android.BatchMessage,com.batch.android.json.JSONObject):224:224 -> b + 48:50:void trackGenericEvent(com.batch.android.messaging.model.Message,java.lang.String):421:423 -> b + 51:57:void trackCloseErrorEvent(com.batch.android.messaging.model.Message,com.batch.android.messaging.model.MessagingError):429:435 -> b + 58:60:void onMessageClosed(com.batch.android.messaging.model.Message):492:494 -> b + 1:1:void setDoNotDisturbEnabled(boolean):176:176 -> c + 2:4:void onMessageDismissed(com.batch.android.messaging.model.Message):484:486 -> c + 1:1:void setShowForegroundLandings(boolean):159:159 -> d + 2:4:void onMessageShown(com.batch.android.messaging.model.Message):477:479 -> d + 1:1:java.lang.String getId():126:126 -> g + int getState() -> h + 1:1:com.batch.android.Batch$Messaging$LifecycleListener getListener():147:147 -> i + 1:1:boolean hasPendingMessage():180:180 -> j + 1:1:boolean isDoNotDisturbEnabled():151:151 -> k + 1:1:boolean isInAutomaticMode():143:143 -> l + 1:2:com.batch.android.BatchMessage popPendingMessage():185:186 -> m + 1:1:com.batch.android.module.MessagingModule provide():117:117 -> n + 1:1:boolean shouldShowForegroundLandings():139:139 -> o +com.batch.android.module.MessagingModule$1 -> com.batch.android.m0.g$a: +# {"id":"sourceFile","fileName":"MessagingModule.java"} + int[] $SwitchMap$com$batch$android$messaging$model$Message$Source -> a + 1:1:void ():394:394 -> +com.batch.android.module.OptOutModule -> com.batch.android.m0.h: +# {"id":"sourceFile","fileName":"OptOutModule.java"} + java.lang.String OPT_OUT_PREFERENCES_NAME -> g + java.lang.String INTENT_OPTED_OUT_WIPE_DATA_EXTRA -> f + java.lang.String SHOULD_SEND_OPTIN_EVENT_KEY -> i + java.lang.String OPTED_OUT_FROM_BATCHSDK_KEY -> h + java.lang.String MANIFEST_OPT_OUT_BY_DEFAULT_KEY -> j + android.content.SharedPreferences preferences -> b + java.lang.String TAG -> c + java.lang.Boolean isOptedOut -> a + java.lang.String INTENT_OPTED_IN -> e + java.lang.String INTENT_OPTED_OUT -> d + 1:1:void ():56:56 -> + 2:2:void ():52:52 -> + 1:7:void trackOptinEventIfNeeded(android.content.Context,com.batch.android.AdvertisingID):90:96 -> a + 8:54:com.batch.android.core.Promise optOut(android.content.Context,com.batch.android.AdvertisingID,boolean,com.batch.android.BatchOptOutResultListener):124:170 -> a + 55:56:void lambda$optOut$1(android.content.Context,com.batch.android.BatchOptOutResultListener,boolean,com.batch.android.core.Promise,java.lang.Void):146:147 -> a + 57:60:void lambda$optOut$0(com.batch.android.BatchOptOutResultListener,android.content.Context,boolean,com.batch.android.core.Promise):149:152 -> a + 61:62:void lambda$optOut$3(android.content.Context,com.batch.android.BatchOptOutResultListener,com.batch.android.core.Promise,boolean,java.lang.Exception):157:158 -> a + 63:69:void lambda$optOut$2(com.batch.android.BatchOptOutResultListener,com.batch.android.core.Promise,android.content.Context,boolean):160:166 -> a + 70:77:void doOptOut(android.content.Context,boolean):178:185 -> a + 78:86:boolean getManifestBoolean(android.content.Context,java.lang.String,boolean):212:220 -> a + 1:5:android.content.SharedPreferences getPreferences(android.content.Context):59:63 -> b + 1:16:boolean isOptedOutSync(android.content.Context):71:86 -> c + 1:10:void optIn(android.content.Context):102:111 -> d + 1:17:void wipeData(android.content.Context):190:206 -> e + 1:1:java.lang.String getId():230:230 -> g + int getState() -> h + 1:1:java.lang.Boolean isOptedOut():67:67 -> i +com.batch.android.module.PushModule -> com.batch.android.m0.i: +# {"id":"sourceFile","fileName":"PushModule.java"} + int NO_COLOR -> o + android.net.Uri notificationSoundUri -> f + com.batch.android.BatchNotificationInterceptor notificationInterceptor -> j + java.util.EnumSet tempNotifType -> h + java.lang.Integer customOpenIntentFlags -> i + com.batch.android.module.DisplayReceiptModule displayReceiptModule -> m + boolean didSetupRegistrationProvider -> l + java.lang.String TAG -> n + int notificationColor -> e + int smallIconResourceId -> b + com.batch.android.PushRegistrationProvider registrationProvider -> k + android.graphics.Bitmap largeIcon -> c + boolean manualDisplay -> g + boolean shouldRefreshToken -> a + java.lang.String gcmSenderId -> d + 1:1:void (com.batch.android.module.DisplayReceiptModule):127:127 -> + 2:52:void (com.batch.android.module.DisplayReceiptModule):78:128 -> + 1:1:void access$000(com.batch.android.module.PushModule,android.content.Context,com.batch.android.push.Registration):64:64 -> a + 2:2:void setCustomSmallIconResourceId(int):153:153 -> a + 3:3:void setAdditionalIntentFlags(java.lang.Integer):171:171 -> a + 4:4:void setCustomLargeIcon(android.graphics.Bitmap):189:189 -> a + 5:7:void setGCMSenderId(java.lang.String):198:200 -> a + 8:8:void setNotificationInterceptor(com.batch.android.BatchNotificationInterceptor):207:207 -> a + 9:13:boolean isBatchPush(android.content.Intent):258:262 -> a + 14:20:boolean isBatchPush(com.google.firebase.messaging.RemoteMessage):273:279 -> a + 21:24:void lambda$getRegistrationID$1(java.lang.StringBuilder,com.batch.android.runtime.State):293:296 -> a + 25:50:void setNotificationsType(java.util.EnumSet):379:404 -> a + 51:55:void lambda$setNotificationsType$2(int,java.util.concurrent.atomic.AtomicBoolean,com.batch.android.runtime.State):391:395 -> a + 56:56:void setSound(android.net.Uri):434:434 -> a + 57:57:void setManualDisplay(boolean):453:453 -> a + 58:61:void appendBatchData(android.content.Intent,android.content.Intent):474:477 -> a + 62:74:void appendBatchData(android.os.Bundle,android.content.Intent):490:502 -> a + 75:80:void appendBatchData(com.google.firebase.messaging.RemoteMessage,android.content.Intent):510:515 -> a + 81:90:android.app.PendingIntent makePendingIntent(android.content.Context,android.content.Intent,android.os.Bundle):535:544 -> a + 91:96:android.app.PendingIntent makePendingIntent(android.content.Context,android.content.Intent,com.google.firebase.messaging.RemoteMessage):556:561 -> a + 97:106:android.app.PendingIntent makePendingIntentForDeeplink(android.content.Context,java.lang.String,android.os.Bundle):579:588 -> a + 107:112:android.app.PendingIntent makePendingIntentForDeeplink(android.content.Context,java.lang.String,com.google.firebase.messaging.RemoteMessage):600:605 -> a + 113:124:void displayNotification(android.content.Context,android.content.Intent,com.batch.android.BatchNotificationInterceptor,boolean):649:660 -> a + 125:133:void displayNotification(android.content.Context,android.content.Intent,com.batch.android.BatchNotificationInterceptor,boolean):657:665 -> a + 134:150:void displayNotification(android.content.Context,com.google.firebase.messaging.RemoteMessage,com.batch.android.BatchNotificationInterceptor):674:690 -> a + 151:159:void displayNotification(android.content.Context,com.google.firebase.messaging.RemoteMessage,com.batch.android.BatchNotificationInterceptor):687:695 -> a + 160:168:void onNotificationDisplayed(android.content.Context,android.content.Intent):707:715 -> a + 169:177:void onNotificationDisplayed(android.content.Context,com.google.firebase.messaging.RemoteMessage):724:732 -> a + 178:181:void requestRegistration(com.batch.android.PushRegistrationProvider):787:790 -> a + 182:194:void emitRegistration(android.content.Context,com.batch.android.push.Registration):843:855 -> a + 195:228:void lambda$emitRegistration$3(com.batch.android.push.Registration,android.content.Context,com.batch.android.runtime.State):856:889 -> a + 229:229:void printRegistration(com.batch.android.push.Registration):936:936 -> a + 230:236:void lambda$batchWillStart$4(com.batch.android.runtime.State):975:981 -> a + 1:17:void lambda$dismissNotifications$0(com.batch.android.runtime.State):224:240 -> b + 18:33:java.util.EnumSet getNotificationsType(android.content.Context):351:366 -> b + 34:34:void setNotificationsColor(int):415:415 -> b + 35:37:boolean shouldDisplayPush(android.content.Context,android.content.Intent):617:619 -> b + 38:40:boolean shouldDisplayPush(android.content.Context,com.google.firebase.messaging.RemoteMessage):629:631 -> b + 1:21:com.batch.android.push.Registration getRegistration(android.content.Context):313:333 -> c + 1:4:boolean isBackgroundRestricted(android.content.Context):926:929 -> d + 1:2:void requestNotificationPermission(android.content.Context):949:950 -> e + 3:3:void requestNotificationPermission(android.content.Context):947:947 -> e + 4:25:void batchWillStart():970:991 -> e + 1:1:java.lang.String getId():957:957 -> g + 1:1:int getState():962:962 -> h + 1:2:void dismissNotifications():222:223 -> i + 1:1:java.lang.Integer getAdditionalIntentFlags():161:161 -> j + 1:3:com.batch.android.AdsIdentifierProvider getAdsIdentifierProvider():756:758 -> k + 1:8:java.lang.String getAppVersion():772:779 -> l + 1:1:android.graphics.Bitmap getCustomLargeIcon():180:180 -> m + 1:1:int getCustomSmallIconResourceId():144:144 -> n + 1:1:int getNotificationColor():424:424 -> o + 1:1:com.batch.android.BatchNotificationInterceptor getNotificationInterceptor():214:214 -> p + 1:15:java.lang.String getRegistrationID():288:302 -> q + 1:16:com.batch.android.PushRegistrationProvider getRegistrationProvider():997:1012 -> r + 1:1:android.net.Uri getSound():443:443 -> s + 1:11:boolean isBatchPushServiceAvailable():903:913 -> t + 1:1:boolean isManualDisplayModeActivated():462:462 -> u + 1:1:com.batch.android.module.PushModule provide():133:133 -> v + 1:3:void refreshRegistration():744:746 -> w +com.batch.android.module.PushModule$1 -> com.batch.android.m0.i$a: +# {"id":"sourceFile","fileName":"PushModule.java"} + com.batch.android.module.PushModule this$0 -> c + android.content.Context val$context -> b + com.batch.android.PushRegistrationProvider val$provider -> a + 1:1:void (com.batch.android.module.PushModule,com.batch.android.PushRegistrationProvider,android.content.Context):791:791 -> + 1:1:java.lang.String getTaskIdentifier():833:833 -> a + 1:23:void run():795:817 -> run + 24:38:void run():814:828 -> run + 39:39:void run():809:809 -> run + 40:45:void run():797:802 -> run + 46:46:void run():797:797 -> run +com.batch.android.module.TrackerModule -> com.batch.android.m0.j: +# {"id":"sourceFile","fileName":"TrackerModule.java"} + com.batch.android.localcampaigns.CampaignManager campaignManager -> i + java.lang.String TAG -> k + java.util.Queue memoryStorage -> b + java.util.concurrent.atomic.AtomicBoolean isFlushing -> d + com.batch.android.tracker.TrackerDatasource datasource -> a + com.batch.android.event.EventSender sender -> e + int batchSendQuantity -> f + com.batch.android.module.LocalCampaignsModule localCampaignsModule -> h + com.batch.android.module.OptOutModule optOutModule -> g + java.util.concurrent.ExecutorService flushExecutor -> c + com.batch.android.module.PushModule pushModule -> j + 1:1:void (com.batch.android.module.OptOutModule,com.batch.android.module.LocalCampaignsModule,com.batch.android.localcampaigns.CampaignManager,com.batch.android.module.PushModule):103:103 -> + 2:43:void (com.batch.android.module.OptOutModule,com.batch.android.module.LocalCampaignsModule,com.batch.android.localcampaigns.CampaignManager,com.batch.android.module.PushModule):66:107 -> + 1:1:void track(java.lang.String):191:191 -> a + 2:2:void track(java.lang.String,com.batch.android.json.JSONObject):201:201 -> a + 3:16:void track(java.lang.String,long,com.batch.android.json.JSONObject):212:225 -> a + 17:17:void track(java.lang.String,long):256:256 -> a + 18:49:com.batch.android.core.Promise trackOptOutEvent(android.content.Context,com.batch.android.AdvertisingID,java.lang.String):313:344 -> a + 50:52:void lambda$trackOptOutEvent$0(android.content.Context,java.util.List,com.batch.android.core.Promise):319:321 -> a + 53:73:void lambda$trackOptOutEvent$0(android.content.Context,java.util.List,com.batch.android.core.Promise):320:340 -> a + 74:102:com.batch.android.json.JSONObject makeOptBaseEventData(android.content.Context,com.batch.android.AdvertisingID):349:377 -> a + 103:107:void lambda$flush$2(com.batch.android.runtime.State):418:422 -> a + 108:112:void onEventsSendFailure(java.util.List):502:506 -> a + 113:130:void lambda$onEventsSendFailure$4(java.util.List,com.batch.android.runtime.State):507:524 -> a + 131:133:java.util.List getEventsToSend():532:534 -> a + 1:2:void batchDidStart():169:170 -> b + 3:12:void trackCollapsible(java.lang.String,long,com.batch.android.json.JSONObject):237:246 -> b + 13:34:void trackCampaignView(java.lang.String,com.batch.android.json.JSONObject):266:287 -> b + 35:35:void trackCampaignView(java.lang.String,com.batch.android.json.JSONObject):274:274 -> b + 36:36:void trackOptInEvent(android.content.Context,com.batch.android.AdvertisingID):299:299 -> b + 37:41:void onEventsSendSuccess(java.util.List):479:483 -> b + 42:52:void lambda$onEventsSendSuccess$3(java.util.List,com.batch.android.runtime.State):484:494 -> b + 53:62:void lambda$wipeData$6(android.content.Context):546:555 -> b + 1:3:void batchDidStop():177:179 -> c + 4:4:void lambda$getEventsToSend$5(java.util.List):534:534 -> c + 5:7:void wipeData(android.content.Context):542:544 -> c + 1:9:void batchWillStart():132:140 -> e + 10:22:void batchWillStart():137:149 -> e + 23:23:void batchWillStart():146:146 -> e + 24:40:void batchWillStart():145:161 -> e + 1:1:java.lang.String getId():122:122 -> g + 1:1:int getState():127:127 -> h + 1:8:void closeDatasource():388:395 -> i + 1:13:void flush():405:417 -> j + 1:2:com.batch.android.tracker.TrackerMode getMode():464:465 -> k + 3:3:com.batch.android.tracker.TrackerMode getMode():462:462 -> k + 4:15:com.batch.android.tracker.TrackerMode getMode():461:472 -> k + 1:18:void lambda$flush$1():424:441 -> l + 19:32:void lambda$flush$1():428:441 -> l + 33:36:void lambda$flush$1():439:442 -> l + 1:5:com.batch.android.module.TrackerModule provide():112:116 -> m +com.batch.android.module.TrackerModule$1 -> com.batch.android.m0.j$a: +# {"id":"sourceFile","fileName":"TrackerModule.java"} + com.batch.android.core.Promise val$promise -> a + com.batch.android.module.TrackerModule this$0 -> b + 1:1:void (com.batch.android.module.TrackerModule,com.batch.android.core.Promise):324:324 -> + 1:1:void onFinish():0:0 -> a + 2:2:void onSuccess(java.util.List):327:327 -> a + 3:3:void onFailure(com.batch.android.FailReason,java.util.List):332:332 -> a +com.batch.android.module.UserModule -> com.batch.android.m0.k: +# {"id":"sourceFile","fileName":"UserModule.java"} + java.lang.String PARAMETER_KEY_LABEL -> g + java.lang.String TAG -> f + java.lang.String PARAMETER_KEY_AMOUNT -> i + long CIPHER_FALLBACK_RESET_TIME_MS -> l + java.lang.String PARAMETER_KEY_DATA -> h + long LOCATION_UPDATE_MINIMUM_TIME_MS -> k + long lastLocationTrackTimestamp -> d + android.content.BroadcastReceiver localBroadcastReceiver -> b + java.util.concurrent.ScheduledExecutorService applyQueue -> m + java.util.regex.Pattern EVENT_NAME_PATTERN -> j + com.batch.android.module.TrackerModule trackerModule -> e + java.util.List operationQueues -> a + java.util.concurrent.atomic.AtomicBoolean checkScheduled -> c + 1:6:void ():60:65 -> + 1:1:void (com.batch.android.module.TrackerModule):81:81 -> + 2:13:void (com.batch.android.module.TrackerModule):71:82 -> + 1:5:void storeTransactionID(java.lang.String,long):249:253 -> a + 6:23:void lambda$storeTransactionID$2(long,java.lang.String):260:277 -> a + 24:24:void lambda$storeTransactionID$2(long,java.lang.String):263:263 -> a + 25:25:void bumpVersion(long):284:284 -> a + 26:46:void trackPublicEvent(java.lang.String,java.lang.String,com.batch.android.json.JSONObject):334:354 -> a + 47:54:boolean _trackEvent(java.lang.String,com.batch.android.json.JSONObject):359:366 -> a + 55:87:void trackLocation(android.location.Location):377:409 -> a + 88:98:void trackTransaction(double,com.batch.android.json.JSONObject):415:425 -> a + 99:102:void submitOnApplyQueue(long,java.lang.Runnable):434:437 -> a + 103:111:void addOperationQueueAndSubmit(long,com.batch.android.user.UserOperationQueue):449:457 -> a + 112:112:void addOperationQueueAndSubmit(long,com.batch.android.user.UserOperationQueue):451:451 -> a + 1:36:void batchDidStart():104:139 -> b + 37:58:void lambda$bumpVersion$3(long):291:312 -> b + 59:59:void lambda$bumpVersion$3(long):294:294 -> b + 60:69:void lambda$wipeData$6(android.content.Context):643:652 -> b + 1:3:void startCheckWS(long):190:192 -> c + 4:93:void applyUserOperationsSync(java.util.List):491:580 -> c + 94:94:void applyUserOperationsSync(java.util.List):512:512 -> c + 95:95:void applyUserOperationsSync(java.util.List):503:503 -> c + 96:96:void applyUserOperationsSync(java.util.List):494:494 -> c + 97:98:void userOptedIn(android.content.Context):658:659 -> c + 1:1:void startSendWS(long):147:147 -> d + 2:4:void wipeData(android.content.Context):638:640 -> d + 1:27:void submitOperationQueues(long):461:487 -> e + 1:1:java.lang.String getId():94:94 -> g + int getState() -> h + 1:5:void lambda$printDebugInfo$5():620:624 -> i + 1:44:void lambda$startCheckWS$1():197:240 -> j + 45:45:void lambda$startCheckWS$1():239:239 -> j + 46:46:void lambda$startCheckWS$1():213:213 -> j + 1:34:void lambda$startSendWS$0():150:183 -> k + 35:35:void lambda$startSendWS$0():179:179 -> k + 36:36:void lambda$startSendWS$0():162:162 -> k + 1:18:void lambda$submitOperationQueues$4():466:483 -> l + 1:1:java.util.concurrent.ScheduledExecutorService makeApplyQueue():68:68 -> m + 1:1:void printDebugInfo():617:617 -> n + 1:1:com.batch.android.module.UserModule provide():87:87 -> o +com.batch.android.module.UserModule$1 -> com.batch.android.m0.k$a: +# {"id":"sourceFile","fileName":"UserModule.java"} + com.batch.android.module.UserModule this$0 -> a + 1:1:void (com.batch.android.module.UserModule):126:126 -> + 1:2:void onReceive(android.content.Context,android.content.Intent):129:130 -> onReceive +com.batch.android.module.UserModule$SaveException -> com.batch.android.m0.k$b: +# {"id":"sourceFile","fileName":"UserModule.java"} + java.lang.String internalErrorMessage -> a + 1:1:void (java.lang.String):593:593 -> + 2:3:void (java.lang.String,java.lang.String):597:598 -> + 4:5:void (java.lang.String,java.lang.String,java.lang.Throwable):602:603 -> + 1:2:void log():607:608 -> a +com.batch.android.msgpack.MessagePackHelper -> com.batch.android.n0.a: +# {"id":"sourceFile","fileName":"MessagePackHelper.java"} + 1:1:void ():10:10 -> + 1:29:void packObject(com.batch.android.msgpack.core.MessageBufferPacker,java.lang.Object):15:43 -> a + 30:33:void packMap(com.batch.android.msgpack.core.MessageBufferPacker,java.util.Map):48:51 -> a + 34:36:void packList(com.batch.android.msgpack.core.MessageBufferPacker,java.util.List):56:58 -> a +com.batch.android.msgpack.core.ExtensionTypeHeader -> com.batch.android.o0.a: +# {"id":"sourceFile","fileName":"ExtensionTypeHeader.java"} + byte type -> a + int length -> b + 1:4:void (byte,int):46:49 -> + 1:1:byte checkedCastToByte(int):53:53 -> a + 2:2:int getLength():65:65 -> a + 1:1:byte getType():61:61 -> b + 1:3:boolean equals(java.lang.Object):75:77 -> equals + 1:1:int hashCode():70:70 -> hashCode + 1:1:java.lang.String toString():84:84 -> toString +com.batch.android.msgpack.core.MessageBufferPacker -> com.batch.android.o0.b: +# {"id":"sourceFile","fileName":"MessageBufferPacker.java"} + 1:1:void (com.batch.android.msgpack.core.MessagePack$PackerConfig):34:34 -> + 2:2:void (com.batch.android.msgpack.core.buffer.ArrayBufferOutput,com.batch.android.msgpack.core.MessagePack$PackerConfig):38:38 -> + 1:4:com.batch.android.msgpack.core.buffer.MessageBufferOutput reset(com.batch.android.msgpack.core.buffer.MessageBufferOutput):42:45 -> a + 5:5:com.batch.android.msgpack.core.buffer.MessageBufferOutput reset(com.batch.android.msgpack.core.buffer.MessageBufferOutput):43:43 -> a + 6:7:void clear():54:55 -> a + 1:1:com.batch.android.msgpack.core.buffer.ArrayBufferOutput getArrayBufferOut():49:49 -> f + 1:1:int getBufferSize():116:116 -> g + 1:6:java.util.List toBufferList():104:109 -> h + 7:7:java.util.List toBufferList():107:107 -> h + 1:6:byte[] toByteArray():68:73 -> i + 7:7:byte[] toByteArray():71:71 -> i + 1:6:com.batch.android.msgpack.core.buffer.MessageBuffer toMessageBuffer():86:91 -> j + 7:7:com.batch.android.msgpack.core.buffer.MessageBuffer toMessageBuffer():89:89 -> j +com.batch.android.msgpack.core.MessageFormat -> com.batch.android.o0.c: +# {"id":"sourceFile","fileName":"MessageFormat.java"} + com.batch.android.msgpack.core.MessageFormat NEGFIXINT -> K + com.batch.android.msgpack.core.MessageFormat EXT8 -> l + com.batch.android.msgpack.core.MessageFormat EXT32 -> n + com.batch.android.msgpack.core.MessageFormat ARRAY16 -> G + com.batch.android.msgpack.core.MessageFormat BOOLEAN -> h + com.batch.android.msgpack.value.ValueType valueType -> a + com.batch.android.msgpack.core.MessageFormat MAP16 -> I + com.batch.android.msgpack.core.MessageFormat BIN16 -> j + com.batch.android.msgpack.core.MessageFormat UINT64 -> t + com.batch.android.msgpack.core.MessageFormat INT16 -> v + com.batch.android.msgpack.core.MessageFormat FLOAT64 -> p + com.batch.android.msgpack.core.MessageFormat UINT16 -> r + com.batch.android.msgpack.core.MessageFormat[] $VALUES -> M + com.batch.android.msgpack.core.MessageFormat INT32 -> w + com.batch.android.msgpack.core.MessageFormat FIXEXT1 -> y + com.batch.android.msgpack.core.MessageFormat FIXEXT16 -> C + com.batch.android.msgpack.core.MessageFormat FIXARRAY -> d + com.batch.android.msgpack.core.MessageFormat STR16 -> E + com.batch.android.msgpack.core.MessageFormat NIL -> f + com.batch.android.msgpack.core.MessageFormat FIXEXT4 -> A + com.batch.android.msgpack.core.MessageFormat POSFIXINT -> b + com.batch.android.msgpack.core.MessageFormat BIN32 -> k + com.batch.android.msgpack.core.MessageFormat EXT16 -> m + com.batch.android.msgpack.core.MessageFormat NEVER_USED -> g + com.batch.android.msgpack.core.MessageFormat ARRAY32 -> H + com.batch.android.msgpack.core.MessageFormat BIN8 -> i + com.batch.android.msgpack.core.MessageFormat MAP32 -> J + com.batch.android.msgpack.core.MessageFormat UINT32 -> s + com.batch.android.msgpack.core.MessageFormat INT8 -> u + com.batch.android.msgpack.core.MessageFormat FLOAT32 -> o + com.batch.android.msgpack.core.MessageFormat UINT8 -> q + com.batch.android.msgpack.core.MessageFormat INT64 -> x + com.batch.android.msgpack.core.MessageFormat[] formatTable -> L + com.batch.android.msgpack.core.MessageFormat FIXEXT2 -> z + com.batch.android.msgpack.core.MessageFormat FIXMAP -> c + com.batch.android.msgpack.core.MessageFormat STR8 -> D + com.batch.android.msgpack.core.MessageFormat FIXSTR -> e + com.batch.android.msgpack.core.MessageFormat STR32 -> F + com.batch.android.msgpack.core.MessageFormat FIXEXT8 -> B + 1:40:void ():27:66 -> + 41:108:void ():25:92 -> + 1:2:void (java.lang.String,int,com.batch.android.msgpack.value.ValueType):71:72 -> + 1:1:com.batch.android.msgpack.core.MessageFormat[] $values():25:25 -> a + 2:80:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):114:192 -> a + 81:81:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):190:190 -> a + 82:82:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):188:188 -> a + 83:83:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):186:186 -> a + 84:84:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):184:184 -> a + 85:85:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):182:182 -> a + 86:86:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):180:180 -> a + 87:87:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):178:178 -> a + 88:88:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):176:176 -> a + 89:89:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):174:174 -> a + 90:90:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):172:172 -> a + 91:91:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):170:170 -> a + 92:92:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):168:168 -> a + 93:93:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):166:166 -> a + 94:94:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):164:164 -> a + 95:95:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):162:162 -> a + 96:96:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):160:160 -> a + 97:97:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):158:158 -> a + 98:98:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):156:156 -> a + 99:99:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):154:154 -> a + 100:100:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):152:152 -> a + 101:101:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):150:150 -> a + 102:102:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):148:148 -> a + 103:103:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):146:146 -> a + 104:104:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):144:144 -> a + 105:105:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):142:142 -> a + 106:106:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):140:140 -> a + 107:107:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):138:138 -> a + 108:108:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):136:136 -> a + 109:109:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):134:134 -> a + 110:110:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):131:131 -> a + 1:4:com.batch.android.msgpack.value.ValueType getValueType():82:85 -> b + 5:5:com.batch.android.msgpack.value.ValueType getValueType():83:83 -> b + 6:6:com.batch.android.msgpack.core.MessageFormat valueOf(byte):103:103 -> b + 1:1:com.batch.android.msgpack.core.MessageFormat valueOf(java.lang.String):25:25 -> valueOf + 1:1:com.batch.android.msgpack.core.MessageFormat[] values():25:25 -> values +com.batch.android.msgpack.core.MessageFormatException -> com.batch.android.o0.d: +# {"id":"sourceFile","fileName":"MessageFormatException.java"} + 1:1:void (java.lang.Throwable):24:24 -> + 2:2:void (java.lang.String):28:28 -> + 3:3:void (java.lang.String,java.lang.Throwable):32:32 -> +com.batch.android.msgpack.core.MessageInsufficientBufferException -> com.batch.android.o0.e: +# {"id":"sourceFile","fileName":"MessageInsufficientBufferException.java"} + 1:1:void ():24:24 -> + 2:2:void (java.lang.String):28:28 -> + 3:3:void (java.lang.Throwable):32:32 -> + 4:4:void (java.lang.String,java.lang.Throwable):36:36 -> +com.batch.android.msgpack.core.MessageIntegerOverflowException -> com.batch.android.o0.f: +# {"id":"sourceFile","fileName":"MessageIntegerOverflowException.java"} + java.math.BigInteger bigInteger -> b + 1:2:void (java.math.BigInteger):30:31 -> + 3:3:void (long):35:35 -> + 4:5:void (java.lang.String,java.math.BigInteger):39:40 -> + 1:1:java.math.BigInteger getBigInteger():44:44 -> a + 1:1:java.lang.String getMessage():49:49 -> getMessage +com.batch.android.msgpack.core.MessageNeverUsedFormatException -> com.batch.android.o0.g: +# {"id":"sourceFile","fileName":"MessageNeverUsedFormatException.java"} + 1:1:void (java.lang.Throwable):24:24 -> + 2:2:void (java.lang.String):28:28 -> + 3:3:void (java.lang.String,java.lang.Throwable):32:32 -> +com.batch.android.msgpack.core.MessagePack -> com.batch.android.o0.h: +# {"id":"sourceFile","fileName":"MessagePack.java"} + java.nio.charset.Charset UTF8 -> a + com.batch.android.msgpack.core.MessagePack$PackerConfig DEFAULT_PACKER_CONFIG -> b + com.batch.android.msgpack.core.MessagePack$UnpackerConfig DEFAULT_UNPACKER_CONFIG -> c + 1:11:void ():67:77 -> + 1:1:void ():160:160 -> + 1:1:com.batch.android.msgpack.core.MessagePacker newDefaultPacker(com.batch.android.msgpack.core.buffer.MessageBufferOutput):177:177 -> a + 2:2:com.batch.android.msgpack.core.MessagePacker newDefaultPacker(java.io.OutputStream):192:192 -> a + 3:3:com.batch.android.msgpack.core.MessagePacker newDefaultPacker(java.nio.channels.WritableByteChannel):204:204 -> a + 4:4:com.batch.android.msgpack.core.MessageBufferPacker newDefaultBufferPacker():217:217 -> a + 5:5:com.batch.android.msgpack.core.MessageUnpacker newDefaultUnpacker(com.batch.android.msgpack.core.buffer.MessageBufferInput):234:234 -> a + 6:6:com.batch.android.msgpack.core.MessageUnpacker newDefaultUnpacker(java.io.InputStream):249:249 -> a + 7:7:com.batch.android.msgpack.core.MessageUnpacker newDefaultUnpacker(java.nio.channels.ReadableByteChannel):261:261 -> a + 8:8:com.batch.android.msgpack.core.MessageUnpacker newDefaultUnpacker(byte[]):275:275 -> a + 9:9:com.batch.android.msgpack.core.MessageUnpacker newDefaultUnpacker(byte[],int,int):291:291 -> a + 10:10:com.batch.android.msgpack.core.MessageUnpacker newDefaultUnpacker(java.nio.ByteBuffer):307:307 -> a +com.batch.android.msgpack.core.MessagePack$Code -> com.batch.android.o0.h$a: +# {"id":"sourceFile","fileName":"MessagePack.java"} + byte FIXEXT1 -> y + byte FIXMAP_PREFIX -> b + byte FIXEXT4 -> A + byte FIXSTR_PREFIX -> d + byte FIXEXT16 -> C + byte NEVER_USED -> f + byte STR16 -> E + byte TRUE -> h + byte ARRAY16 -> G + byte MAP32 -> J + byte BIN8 -> i + byte BIN32 -> k + byte EXT16 -> m + byte FLOAT32 -> o + byte UINT8 -> q + byte UINT32 -> s + byte INT8 -> u + byte INT32 -> w + byte FIXEXT2 -> z + byte FIXEXT8 -> B + byte POSFIXINT_MASK -> a + byte STR8 -> D + byte FIXARRAY_PREFIX -> c + byte STR32 -> F + byte NIL -> e + byte ARRAY32 -> H + byte FALSE -> g + byte BIN16 -> j + byte MAP16 -> I + byte EXT8 -> l + byte NEGFIXINT_PREFIX -> K + byte EXT32 -> n + byte FLOAT64 -> p + byte UINT16 -> r + byte UINT64 -> t + byte INT16 -> v + byte INT64 -> x + 1:1:void ():82:82 -> + boolean isFixInt(byte) -> a + boolean isFixStr(byte) -> b + boolean isFixedArray(byte) -> c + boolean isFixedMap(byte) -> d + boolean isFixedRaw(byte) -> e + boolean isNegFixInt(byte) -> f + boolean isPosFixInt(byte) -> g +com.batch.android.msgpack.core.MessagePack$PackerConfig -> com.batch.android.o0.h$b: +# {"id":"sourceFile","fileName":"MessagePack.java"} + int bufferFlushThreshold -> b + int bufferSize -> c + int smallStringOptimizationThreshold -> a + boolean str8FormatSupport -> d + 1:1:void ():323:323 -> + 2:8:void ():315:321 -> + 9:9:void (com.batch.android.msgpack.core.MessagePack$PackerConfig):325:325 -> + 10:24:void (com.batch.android.msgpack.core.MessagePack$PackerConfig):315:329 -> + 1:1:com.batch.android.msgpack.core.MessagePack$PackerConfig clone():334:334 -> a + 2:2:com.batch.android.msgpack.core.MessagePacker newPacker(com.batch.android.msgpack.core.buffer.MessageBufferOutput):370:370 -> a + 3:3:com.batch.android.msgpack.core.MessagePacker newPacker(java.io.OutputStream):383:383 -> a + 4:4:com.batch.android.msgpack.core.MessagePacker newPacker(java.nio.channels.WritableByteChannel):393:393 -> a + 5:6:com.batch.android.msgpack.core.MessagePack$PackerConfig withBufferFlushThreshold(int):426:427 -> a + 7:8:com.batch.android.msgpack.core.MessagePack$PackerConfig withStr8FormatSupport(boolean):455:456 -> a + 1:1:int getBufferFlushThreshold():432:432 -> b + 2:3:com.batch.android.msgpack.core.MessagePack$PackerConfig withBufferSize(int):440:441 -> b + 1:2:com.batch.android.msgpack.core.MessagePack$PackerConfig withSmallStringOptimizationThreshold(int):412:413 -> c + 3:3:int getBufferSize():446:446 -> c + 1:1:java.lang.Object clone():313:313 -> clone + 1:1:int getSmallStringOptimizationThreshold():418:418 -> d + 1:1:boolean isStr8FormatSupport():461:461 -> e + 1:5:boolean equals(java.lang.Object):348:352 -> equals + 1:1:com.batch.android.msgpack.core.MessageBufferPacker newBufferPacker():404:404 -> f + 1:4:int hashCode():339:342 -> hashCode +com.batch.android.msgpack.core.MessagePack$UnpackerConfig -> com.batch.android.o0.h$c: +# {"id":"sourceFile","fileName":"MessagePack.java"} + java.nio.charset.CodingErrorAction actionOnUnmappableString -> d + java.nio.charset.CodingErrorAction actionOnMalformedString -> c + int bufferSize -> f + int stringDecoderBufferSize -> g + int stringSizeLimit -> e + boolean allowReadingStringAsBinary -> a + boolean allowReadingBinaryAsString -> b + 1:1:void ():484:484 -> + 2:14:void ():470:482 -> + 15:15:void (com.batch.android.msgpack.core.MessagePack$UnpackerConfig):486:486 -> + 16:38:void (com.batch.android.msgpack.core.MessagePack$UnpackerConfig):470:492 -> + 1:1:com.batch.android.msgpack.core.MessagePack$UnpackerConfig clone():497:497 -> a + 2:2:com.batch.android.msgpack.core.MessageUnpacker newUnpacker(com.batch.android.msgpack.core.buffer.MessageBufferInput):539:539 -> a + 3:3:com.batch.android.msgpack.core.MessageUnpacker newUnpacker(java.io.InputStream):552:552 -> a + 4:4:com.batch.android.msgpack.core.MessageUnpacker newUnpacker(java.nio.channels.ReadableByteChannel):562:562 -> a + 5:5:com.batch.android.msgpack.core.MessageUnpacker newUnpacker(byte[]):574:574 -> a + 6:6:com.batch.android.msgpack.core.MessageUnpacker newUnpacker(byte[],int,int):588:588 -> a + 7:7:com.batch.android.msgpack.core.MessageUnpacker newUnpacker(java.nio.ByteBuffer):602:602 -> a + 8:9:com.batch.android.msgpack.core.MessagePack$UnpackerConfig withAllowReadingBinaryAsString(boolean):622:623 -> a + 10:11:com.batch.android.msgpack.core.MessagePack$UnpackerConfig withActionOnMalformedString(java.nio.charset.CodingErrorAction):635:636 -> a + 12:13:com.batch.android.msgpack.core.MessagePack$UnpackerConfig withBufferSize(int):688:689 -> a + 1:2:com.batch.android.msgpack.core.MessagePack$UnpackerConfig withAllowReadingStringAsBinary(boolean):609:610 -> b + 3:3:java.nio.charset.CodingErrorAction getActionOnMalformedString():641:641 -> b + 4:5:com.batch.android.msgpack.core.MessagePack$UnpackerConfig withActionOnUnmappableString(java.nio.charset.CodingErrorAction):648:649 -> b + 6:7:com.batch.android.msgpack.core.MessagePack$UnpackerConfig withStringDecoderBufferSize(int):674:675 -> b + 1:1:java.nio.charset.CodingErrorAction getActionOnUnmappableString():654:654 -> c + 2:3:com.batch.android.msgpack.core.MessagePack$UnpackerConfig withStringSizeLimit(int):661:662 -> c + 1:1:java.lang.Object clone():468:468 -> clone + 1:1:boolean getAllowReadingBinaryAsString():628:628 -> d + 1:1:boolean getAllowReadingStringAsBinary():615:615 -> e + 1:5:boolean equals(java.lang.Object):514:518 -> equals + 1:1:int getBufferSize():694:694 -> f + 1:1:int getStringDecoderBufferSize():680:680 -> g + 1:1:int getStringSizeLimit():667:667 -> h + 1:7:int hashCode():502:508 -> hashCode +com.batch.android.msgpack.core.MessagePackException -> com.batch.android.o0.i: +# {"id":"sourceFile","fileName":"MessagePackException.java"} + java.lang.IllegalStateException UNREACHABLE -> a + 1:1:void ():43:43 -> + 1:1:void ():24:24 -> + 2:2:void (java.lang.String):28:28 -> + 3:3:void (java.lang.String,java.lang.Throwable):32:32 -> + 4:4:void (java.lang.Throwable):36:36 -> + 1:1:java.lang.UnsupportedOperationException UNSUPPORTED(java.lang.String):40:40 -> a +com.batch.android.msgpack.core.MessagePacker -> com.batch.android.o0.j: +# {"id":"sourceFile","fileName":"MessagePacker.java"} + boolean CORRUPTED_CHARSET_ENCODER -> i + int UTF_8_MAX_CHAR_SIZE -> j + com.batch.android.msgpack.core.buffer.MessageBuffer buffer -> e + long totalFlushBytes -> g + int position -> f + com.batch.android.msgpack.core.buffer.MessageBufferOutput out -> d + int bufferFlushThreshold -> b + java.nio.charset.CharsetEncoder encoder -> h + boolean str8FormatSupport -> c + int smallStringOptimizationThreshold -> a + 1:25:void ():139:163 -> + 26:26:void ():161:161 -> + 27:27:void ():159:159 -> + 28:28:void ():157:157 -> + 29:39:void ():155:165 -> + 1:7:void (com.batch.android.msgpack.core.buffer.MessageBufferOutput,com.batch.android.msgpack.core.MessagePack$PackerConfig):200:206 -> + 1:9:com.batch.android.msgpack.core.buffer.MessageBufferOutput reset(com.batch.android.msgpack.core.buffer.MessageBufferOutput):225:233 -> a + 10:10:void clear():255:255 -> a + 11:13:void writeByteAndByte(byte,byte):307:309 -> a + 14:17:void writeByteAndShort(byte,short):313:316 -> a + 18:21:void writeByteAndFloat(byte,float):327:330 -> a + 22:25:void writeByteAndDouble(byte,double):334:337 -> a + 26:29:void writeByteAndLong(byte,long):341:344 -> a + 30:30:com.batch.android.msgpack.core.MessagePacker packBoolean(boolean):387:387 -> a + 31:33:com.batch.android.msgpack.core.MessagePacker packByte(byte):403:405 -> a + 34:44:com.batch.android.msgpack.core.MessagePacker packShort(short):423:433 -> a + 45:70:com.batch.android.msgpack.core.MessagePacker packLong(long):487:512 -> a + 71:76:com.batch.android.msgpack.core.MessagePacker packBigInteger(java.math.BigInteger):530:535 -> a + 77:77:com.batch.android.msgpack.core.MessagePacker packFloat(float):551:551 -> a + 78:78:com.batch.android.msgpack.core.MessagePacker packDouble(double):566:566 -> a + 79:100:int encodeStringToBufferAt(int,java.lang.String):601:622 -> a + 101:130:com.batch.android.msgpack.core.MessagePacker packString(java.lang.String):638:667 -> a + 131:165:com.batch.android.msgpack.core.MessagePacker packString(java.lang.String):659:693 -> a + 166:186:com.batch.android.msgpack.core.MessagePacker packString(java.lang.String):685:705 -> a + 187:187:com.batch.android.msgpack.core.MessagePacker packString(java.lang.String):644:644 -> a + 188:188:com.batch.android.msgpack.core.MessagePacker packValue(com.batch.android.msgpack.value.Value):770:770 -> a + 189:211:com.batch.android.msgpack.core.MessagePacker packExtensionTypeHeader(byte,int):788:810 -> a + 212:212:com.batch.android.msgpack.core.MessagePacker addPayload(byte[]):914:914 -> a + 1:4:void flushBuffer():286:289 -> b + 5:6:void writeByte(byte):302:303 -> b + 7:10:void writeByteAndInt(byte,int):320:323 -> b + 11:13:void writeShort(short):348:350 -> b + 14:16:void writeLong(long):360:362 -> b + 17:20:void packStringWithGetBytes(java.lang.String):572:575 -> b + 21:21:com.batch.android.msgpack.core.MessagePacker writePayload(byte[]):871:871 -> b + 1:1:long getTotalWrittenBytes():248:248 -> c + 2:6:void ensureCapacity(int):293:297 -> c + 7:14:com.batch.android.msgpack.core.MessagePacker addPayload(byte[],int,int):935:942 -> c + 15:18:com.batch.android.msgpack.core.MessagePacker addPayload(byte[],int,int):936:939 -> c + 1:4:void close():279:282 -> close + 1:1:com.batch.android.msgpack.core.MessagePacker packNil():374:374 -> d + 2:6:com.batch.android.msgpack.core.MessagePacker packArrayHeader(int):726:730 -> d + 7:7:com.batch.android.msgpack.core.MessagePacker packArrayHeader(int):722:722 -> d + 8:15:com.batch.android.msgpack.core.MessagePacker writePayload(byte[],int,int):886:893 -> d + 16:19:com.batch.android.msgpack.core.MessagePacker writePayload(byte[],int,int):887:890 -> d + 1:19:void prepareEncoder():579:597 -> e + 20:24:com.batch.android.msgpack.core.MessagePacker packBinaryHeader(int):827:831 -> e + 1:16:com.batch.android.msgpack.core.MessagePacker packInt(int):452:467 -> f + 1:4:void flush():265:268 -> flush + 1:5:com.batch.android.msgpack.core.MessagePacker packMapHeader(int):753:757 -> g + 6:6:com.batch.android.msgpack.core.MessagePacker packMapHeader(int):749:749 -> g + 1:7:com.batch.android.msgpack.core.MessagePacker packRawStringHeader(int):850:856 -> h + 1:3:void writeInt(int):354:356 -> i +com.batch.android.msgpack.core.MessageSizeException -> com.batch.android.o0.k: +# {"id":"sourceFile","fileName":"MessageSizeException.java"} + long size -> b + 1:2:void (long):26:27 -> + 3:4:void (java.lang.String,long):31:32 -> + 1:1:long getSize():36:36 -> a +com.batch.android.msgpack.core.MessageStringCodingException -> com.batch.android.o0.l: +# {"id":"sourceFile","fileName":"MessageStringCodingException.java"} + 1:1:void (java.lang.String,java.nio.charset.CharacterCodingException):26:26 -> + 2:2:void (java.nio.charset.CharacterCodingException):30:30 -> + 1:1:java.nio.charset.CharacterCodingException getCause():35:35 -> a + 1:1:java.lang.Throwable getCause():23:23 -> getCause +com.batch.android.msgpack.core.MessageTypeCastException -> com.batch.android.o0.m: +# {"id":"sourceFile","fileName":"MessageTypeCastException.java"} + 1:1:void ():21:21 -> + 2:2:void (java.lang.String):25:25 -> + 3:3:void (java.lang.String,java.lang.Throwable):29:29 -> + 4:4:void (java.lang.Throwable):33:33 -> +com.batch.android.msgpack.core.MessageTypeException -> com.batch.android.o0.n: +# {"id":"sourceFile","fileName":"MessageTypeException.java"} + 1:1:void ():24:24 -> + 2:2:void (java.lang.String):28:28 -> + 3:3:void (java.lang.String,java.lang.Throwable):32:32 -> + 4:4:void (java.lang.Throwable):36:36 -> +com.batch.android.msgpack.core.MessageUnpacker -> com.batch.android.o0.o: +# {"id":"sourceFile","fileName":"MessageUnpacker.java"} + long totalReadBytes -> j + com.batch.android.msgpack.core.buffer.MessageBuffer numberBuffer -> k + int nextReadPosition -> l + com.batch.android.msgpack.core.buffer.MessageBuffer buffer -> h + java.lang.StringBuilder decodeStringBuffer -> m + int position -> i + int stringDecoderBufferSize -> f + java.lang.String EMPTY_STRING -> q + int stringSizeLimit -> e + com.batch.android.msgpack.core.buffer.MessageBuffer EMPTY_BUFFER -> p + boolean $assertionsDisabled -> r + java.nio.charset.CodingErrorAction actionOnUnmappableString -> d + java.nio.charset.CodingErrorAction actionOnMalformedString -> c + java.nio.CharBuffer decodeBuffer -> o + java.nio.charset.CharsetDecoder decoder -> n + boolean allowReadingStringAsBinary -> a + boolean allowReadingBinaryAsString -> b + com.batch.android.msgpack.core.buffer.MessageBufferInput in -> g + 1:3:void ():149:151 -> + 1:1:void (com.batch.android.msgpack.core.buffer.MessageBufferInput,com.batch.android.msgpack.core.MessagePack$UnpackerConfig):209:209 -> + 2:53:void (com.batch.android.msgpack.core.buffer.MessageBufferInput,com.batch.android.msgpack.core.MessagePack$UnpackerConfig):165:216 -> + 1:40:int unpackInt():879:918 -> A + 41:43:int unpackInt():912:914 -> A + 44:44:int unpackInt():909:909 -> A + 45:45:int unpackInt():906:906 -> A + 46:46:int unpackInt():903:903 -> A + 47:49:int unpackInt():897:899 -> A + 50:52:int unpackInt():891:893 -> A + 53:53:int unpackInt():888:888 -> A + 54:54:int unpackInt():885:885 -> A + 1:38:long unpackLong():932:969 -> B + 39:39:long unpackLong():966:966 -> B + 40:40:long unpackLong():963:963 -> B + 41:41:long unpackLong():960:960 -> B + 42:42:long unpackLong():957:957 -> B + 43:45:long unpackLong():951:953 -> B + 46:46:long unpackLong():944:944 -> B + 47:47:long unpackLong():941:941 -> B + 48:48:long unpackLong():938:938 -> B + 1:17:int unpackMapHeader():1251:1267 -> C + 18:18:int unpackMapHeader():1258:1258 -> C + 1:5:void unpackNil():697:701 -> D + 1:16:int unpackRawStringHeader():1357:1372 -> E + 1:46:short unpackShort():820:865 -> F + 47:49:short unpackShort():859:861 -> F + 50:52:short unpackShort():853:855 -> F + 53:53:short unpackShort():850:850 -> F + 54:54:short unpackShort():847:847 -> F + 55:57:short unpackShort():841:843 -> F + 58:60:short unpackShort():835:837 -> F + 61:63:short unpackShort():829:831 -> F + 64:64:short unpackShort():826:826 -> F + 1:80:java.lang.String unpackString():1085:1164 -> G + 81:84:java.lang.String unpackString():1157:1160 -> G + 85:114:java.lang.String unpackString():1141:1170 -> G + 115:116:java.lang.String unpackString():1090:1091 -> G + 1:53:com.batch.android.msgpack.value.ImmutableValue unpackValue():567:619 -> H + 54:55:com.batch.android.msgpack.value.ImmutableValue unpackValue():615:616 -> H + 56:64:com.batch.android.msgpack.value.ImmutableValue unpackValue():603:611 -> H + 65:70:com.batch.android.msgpack.value.ImmutableValue unpackValue():594:599 -> H + 71:72:com.batch.android.msgpack.value.ImmutableValue unpackValue():589:590 -> H + 73:74:com.batch.android.msgpack.value.ImmutableValue unpackValue():584:585 -> H + 75:75:com.batch.android.msgpack.value.ImmutableValue unpackValue():581:581 -> H + 76:79:com.batch.android.msgpack.value.ImmutableValue unpackValue():575:578 -> H + 80:80:com.batch.android.msgpack.value.ImmutableValue unpackValue():573:573 -> H + 81:82:com.batch.android.msgpack.value.ImmutableValue unpackValue():570:571 -> H + 1:8:com.batch.android.msgpack.core.buffer.MessageBufferInput reset(com.batch.android.msgpack.core.buffer.MessageBufferInput):234:241 -> a + 9:16:boolean ensureBuffer():343:350 -> a + 17:26:com.batch.android.msgpack.core.MessagePackException unexpected(java.lang.String,byte):552:561 -> a + 27:89:com.batch.android.msgpack.value.Variable unpackValue(com.batch.android.msgpack.value.Variable):624:686 -> a + 90:91:com.batch.android.msgpack.value.Variable unpackValue(com.batch.android.msgpack.value.Variable):681:682 -> a + 92:99:com.batch.android.msgpack.value.Variable unpackValue(com.batch.android.msgpack.value.Variable):669:676 -> a + 100:105:com.batch.android.msgpack.value.Variable unpackValue(com.batch.android.msgpack.value.Variable):659:664 -> a + 106:107:com.batch.android.msgpack.value.Variable unpackValue(com.batch.android.msgpack.value.Variable):653:654 -> a + 108:109:com.batch.android.msgpack.value.Variable unpackValue(com.batch.android.msgpack.value.Variable):647:648 -> a + 110:110:com.batch.android.msgpack.value.Variable unpackValue(com.batch.android.msgpack.value.Variable):643:643 -> a + 111:116:com.batch.android.msgpack.value.Variable unpackValue(com.batch.android.msgpack.value.Variable):634:639 -> a + 117:117:com.batch.android.msgpack.value.Variable unpackValue(com.batch.android.msgpack.value.Variable):636:636 -> a + 118:118:com.batch.android.msgpack.value.Variable unpackValue(com.batch.android.msgpack.value.Variable):631:631 -> a + 119:120:com.batch.android.msgpack.value.Variable unpackValue(com.batch.android.msgpack.value.Variable):627:628 -> a + 121:124:void handleCoderError(java.nio.charset.CoderResult):1176:1179 -> a + 125:135:void readPayload(java.nio.ByteBuffer):1443:1453 -> a + 136:147:void readPayload(com.batch.android.msgpack.core.buffer.MessageBuffer,int,int):1471:1482 -> a + 148:148:void readPayload(byte[]):1498:1498 -> a + 149:150:com.batch.android.msgpack.core.MessageIntegerOverflowException overflowU8(byte):1600:1601 -> a + 151:152:com.batch.android.msgpack.core.MessageIntegerOverflowException overflowI16(short):1620:1621 -> a + 153:154:com.batch.android.msgpack.core.MessageIntegerOverflowException overflowI64(long):1630:1631 -> a + 1:6:com.batch.android.msgpack.core.buffer.MessageBuffer getNextBuffer():267:272 -> b + 7:7:com.batch.android.msgpack.core.buffer.MessageBuffer getNextBuffer():269:269 -> b + 8:8:int tryReadBinaryHeader(byte):1350:1350 -> b + 9:9:int tryReadBinaryHeader(byte):1348:1348 -> b + 10:10:int tryReadBinaryHeader(byte):1346:1346 -> b + 11:12:com.batch.android.msgpack.core.MessageIntegerOverflowException overflowU16(short):1605:1606 -> b + 13:14:com.batch.android.msgpack.core.MessageIntegerOverflowException overflowU64(long):1615:1616 -> b + 1:5:com.batch.android.msgpack.core.MessageFormat getNextFormat():372:376 -> c + 6:6:com.batch.android.msgpack.core.MessageFormat getNextFormat():373:373 -> c + 7:24:java.lang.String decodeStringFastPath(int):1184:1201 -> c + 25:25:java.lang.String decodeStringFastPath(int):1198:1198 -> c + 26:26:int tryReadStringHeader(byte):1337:1337 -> c + 27:27:int tryReadStringHeader(byte):1335:1335 -> c + 28:28:int tryReadStringHeader(byte):1333:1333 -> c + 29:40:void readPayload(byte[],int,int):1531:1542 -> c + 1:3:void close():1594:1596 -> close + 1:1:long getTotalReadBytes():257:257 -> d + 2:2:int utf8MultibyteCharacterSize(byte):328:328 -> d + 3:4:com.batch.android.msgpack.core.MessageIntegerOverflowException overflowI32(int):1625:1626 -> d + 1:1:boolean hasNext():339:339 -> e + 2:3:com.batch.android.msgpack.core.MessageIntegerOverflowException overflowU32(int):1610:1611 -> e + 1:2:void nextBuffer():277:278 -> f + 3:3:com.batch.android.msgpack.core.MessageSizeException overflowU32Size(int):1636:1636 -> f + 1:34:com.batch.android.msgpack.core.buffer.MessageBuffer prepareNumberBuffer(int):290:323 -> g + 35:35:com.batch.android.msgpack.core.buffer.MessageBuffer prepareNumberBuffer(int):316:316 -> g + 36:47:byte readByte():386:397 -> g + 1:2:double readDouble():422:423 -> h + 3:4:byte[] readPayload(int):1514:1515 -> h + 1:2:float readFloat():417:418 -> i + 3:10:com.batch.android.msgpack.core.buffer.MessageBuffer readPayloadAsReference(int):1558:1565 -> i + 1:2:int readInt():407:408 -> j + 3:11:void skipPayload(int):1419:1427 -> j + 1:2:long readLong():412:413 -> k + 3:96:void skipValue(int):443:536 -> k + 97:97:void skipValue(int):533:533 -> k + 98:98:void skipValue(int):530:530 -> k + 99:99:void skipValue(int):527:527 -> k + 100:100:void skipValue(int):524:524 -> k + 101:101:void skipValue(int):521:521 -> k + 102:102:void skipValue(int):518:518 -> k + 103:103:void skipValue(int):515:515 -> k + 104:104:void skipValue(int):512:512 -> k + 105:105:void skipValue(int):509:509 -> k + 106:106:void skipValue(int):506:506 -> k + 107:107:void skipValue(int):503:503 -> k + 108:108:void skipValue(int):500:500 -> k + 109:109:void skipValue(int):497:497 -> k + 110:110:void skipValue(int):493:493 -> k + 111:111:void skipValue(int):489:489 -> k + 112:112:void skipValue(int):485:485 -> k + 113:113:void skipValue(int):480:480 -> k + 114:114:void skipValue(int):475:475 -> k + 115:115:void skipValue(int):471:471 -> k + 116:116:void skipValue(int):466:466 -> k + 1:1:int readNextLength16():1575:1575 -> l + 1:3:int readNextLength32():1580:1582 -> m + 1:1:int readNextLength8():1570:1570 -> n + 1:2:short readShort():402:403 -> o + 1:14:void resetDecoder():1067:1080 -> p + 1:1:void skipValue():432:432 -> q + 1:6:boolean tryUnpackNil():716:721 -> r + 7:7:boolean tryUnpackNil():717:717 -> r + 1:17:int unpackArrayHeader():1218:1234 -> s + 18:18:int unpackArrayHeader():1225:1225 -> s + 1:40:java.math.BigInteger unpackBigInteger():980:1019 -> t + 41:42:java.math.BigInteger unpackBigInteger():1016:1017 -> t + 43:44:java.math.BigInteger unpackBigInteger():1013:1014 -> t + 45:46:java.math.BigInteger unpackBigInteger():1010:1011 -> t + 47:48:java.math.BigInteger unpackBigInteger():1007:1008 -> t + 49:54:java.math.BigInteger unpackBigInteger():999:1004 -> t + 55:59:java.math.BigInteger unpackBigInteger():992:996 -> t + 60:61:java.math.BigInteger unpackBigInteger():989:990 -> t + 62:63:java.math.BigInteger unpackBigInteger():986:987 -> t + 1:16:int unpackBinaryHeader():1392:1407 -> u + 1:7:boolean unpackBoolean():735:741 -> v + 1:52:byte unpackByte():755:806 -> w + 53:55:byte unpackByte():800:802 -> w + 56:58:byte unpackByte():794:796 -> w + 59:61:byte unpackByte():788:790 -> w + 62:62:byte unpackByte():785:785 -> w + 63:65:byte unpackByte():779:781 -> w + 66:68:byte unpackByte():773:775 -> w + 69:71:byte unpackByte():767:769 -> w + 72:74:byte unpackByte():761:763 -> w + 1:10:double unpackDouble():1052:1061 -> x + 11:11:double unpackDouble():1055:1055 -> x + 1:57:com.batch.android.msgpack.core.ExtensionTypeHeader unpackExtensionTypeHeader():1271:1327 -> y + 58:59:com.batch.android.msgpack.core.ExtensionTypeHeader unpackExtensionTypeHeader():1295:1296 -> y + 60:61:com.batch.android.msgpack.core.ExtensionTypeHeader unpackExtensionTypeHeader():1290:1291 -> y + 62:63:com.batch.android.msgpack.core.ExtensionTypeHeader unpackExtensionTypeHeader():1285:1286 -> y + 64:65:com.batch.android.msgpack.core.ExtensionTypeHeader unpackExtensionTypeHeader():1280:1281 -> y + 66:114:com.batch.android.msgpack.core.ExtensionTypeHeader unpackExtensionTypeHeader():1275:1323 -> y + 115:115:com.batch.android.msgpack.core.ExtensionTypeHeader unpackExtensionTypeHeader():1319:1319 -> y + 116:120:com.batch.android.msgpack.core.ExtensionTypeHeader unpackExtensionTypeHeader():1308:1312 -> y + 121:125:com.batch.android.msgpack.core.ExtensionTypeHeader unpackExtensionTypeHeader():1300:1304 -> y + 1:10:float unpackFloat():1032:1041 -> z + 11:11:float unpackFloat():1035:1035 -> z +com.batch.android.msgpack.core.MessageUnpacker$1 -> com.batch.android.o0.o$a: +# {"id":"sourceFile","fileName":"MessageUnpacker.java"} + int[] $SwitchMap$com$batch$android$msgpack$value$ValueType -> b + int[] $SwitchMap$com$batch$android$msgpack$core$MessageFormat -> a + 1:1:void ():568:568 -> + 2:2:void ():445:445 -> +com.batch.android.msgpack.core.Preconditions -> com.batch.android.o0.p: +# {"id":"sourceFile","fileName":"Preconditions.java"} + 1:1:void ():75:75 -> + 1:1:void checkArgument(boolean):86:86 -> a + 2:2:void checkArgument(boolean,java.lang.Object):101:101 -> a + 3:3:void checkArgument(boolean,java.lang.String,java.lang.Object[]):130:130 -> a + 4:4:java.lang.Object checkNotNull(java.lang.Object):201:201 -> a + 5:5:java.lang.Object checkNotNull(java.lang.Object,java.lang.Object):218:218 -> a + 6:6:java.lang.Object checkNotNull(java.lang.Object,java.lang.String,java.lang.Object[]):247:247 -> a + 7:7:int checkElementIndex(int,int):295:295 -> a + 8:12:java.lang.String badElementIndex(int,int,java.lang.String):322:326 -> a + 13:13:java.lang.String badElementIndex(int,int,java.lang.String):324:324 -> a + 14:14:java.lang.String badPositionIndexes(int,int,int):408:408 -> a + 15:15:java.lang.String badPositionIndexes(int,int,int):405:405 -> a + 16:16:java.lang.String badPositionIndexes(int,int,int):402:402 -> a + 17:45:java.lang.String format(java.lang.String,java.lang.Object[]):425:453 -> a + 1:1:void checkState(boolean):143:143 -> b + 2:2:void checkState(boolean,java.lang.Object):158:158 -> b + 3:3:void checkState(boolean,java.lang.String,java.lang.Object[]):187:187 -> b + 4:4:int checkPositionIndex(int,int):344:344 -> b + 5:9:java.lang.String badPositionIndex(int,int,java.lang.String):371:375 -> b + 10:10:java.lang.String badPositionIndex(int,int,java.lang.String):373:373 -> b + 11:11:void checkPositionIndexes(int,int,int):396:396 -> b + 1:1:int checkElementIndex(int,int,java.lang.String):315:315 -> c + 1:1:int checkPositionIndex(int,int,java.lang.String):364:364 -> d +com.batch.android.msgpack.core.buffer.ArrayBufferInput -> com.batch.android.p0.a: +# {"id":"sourceFile","fileName":"ArrayBufferInput.java"} + com.batch.android.msgpack.core.buffer.MessageBuffer buffer -> a + boolean isEmpty -> b + 1:6:void (com.batch.android.msgpack.core.buffer.MessageBuffer):28:33 -> + 7:7:void (byte[]):38:38 -> + 8:8:void (byte[],int,int):42:42 -> + 1:6:com.batch.android.msgpack.core.buffer.MessageBuffer reset(com.batch.android.msgpack.core.buffer.MessageBuffer):52:57 -> a + 7:7:void reset(byte[]):63:63 -> a + 1:1:void reset(byte[],int,int):67:67 -> c + 1:2:void close():81:82 -> close + 1:5:com.batch.android.msgpack.core.buffer.MessageBuffer next():72:76 -> next +com.batch.android.msgpack.core.buffer.ArrayBufferOutput -> com.batch.android.p0.b: +# {"id":"sourceFile","fileName":"ArrayBufferOutput.java"} + java.util.List list -> a + com.batch.android.msgpack.core.buffer.MessageBuffer lastBuffer -> c + int bufferSize -> b + 1:1:void ():35:35 -> + 2:4:void (int):38:40 -> + 1:1:void clear():108:108 -> a + 2:6:void writeBuffer(int):125:129 -> a + 7:9:void write(byte[],int,int):135:137 -> a + 1:2:int getSize():50:51 -> b + 3:8:com.batch.android.msgpack.core.buffer.MessageBuffer next(int):113:118 -> b + 9:10:void add(byte[],int,int):142:143 -> b + 1:1:java.util.List toBufferList():101:101 -> c + 1:5:byte[] toByteArray():65:69 -> d + 1:6:com.batch.android.msgpack.core.buffer.MessageBuffer toMessageBuffer():83:88 -> e +com.batch.android.msgpack.core.buffer.ByteBufferInput -> com.batch.android.p0.c: +# {"id":"sourceFile","fileName":"ByteBufferInput.java"} + java.nio.ByteBuffer input -> a + boolean isRead -> b + 1:1:void (java.nio.ByteBuffer):30:30 -> + 2:5:void (java.nio.ByteBuffer):28:31 -> + 1:3:java.nio.ByteBuffer reset(java.nio.ByteBuffer):41:43 -> a + 1:6:com.batch.android.msgpack.core.buffer.MessageBuffer next():49:54 -> next +com.batch.android.msgpack.core.buffer.ChannelBufferInput -> com.batch.android.p0.d: +# {"id":"sourceFile","fileName":"ChannelBufferInput.java"} + java.nio.channels.ReadableByteChannel channel -> a + com.batch.android.msgpack.core.buffer.MessageBuffer buffer -> b + 1:1:void (java.nio.channels.ReadableByteChannel):34:34 -> + 2:5:void (java.nio.channels.ReadableByteChannel,int):37:40 -> + 1:2:java.nio.channels.ReadableByteChannel reset(java.nio.channels.ReadableByteChannel):50:51 -> a + 1:1:void close():68:68 -> close + 1:7:com.batch.android.msgpack.core.buffer.MessageBuffer next():57:63 -> next +com.batch.android.msgpack.core.buffer.ChannelBufferOutput -> com.batch.android.p0.e: +# {"id":"sourceFile","fileName":"ChannelBufferOutput.java"} + java.nio.channels.WritableByteChannel channel -> a + com.batch.android.msgpack.core.buffer.MessageBuffer buffer -> b + 1:1:void (java.nio.channels.WritableByteChannel):33:33 -> + 2:4:void (java.nio.channels.WritableByteChannel,int):36:38 -> + 1:2:java.nio.channels.WritableByteChannel reset(java.nio.channels.WritableByteChannel):48:49 -> a + 3:5:void writeBuffer(int):63:65 -> a + 6:8:void write(byte[],int,int):71:73 -> a + 1:4:com.batch.android.msgpack.core.buffer.MessageBuffer next(int):55:58 -> b + 5:5:void add(byte[],int,int):79:79 -> b + 1:1:void close():84:84 -> close +com.batch.android.msgpack.core.buffer.DirectBufferAccess -> com.batch.android.msgpack.core.buffer.a: +# {"id":"sourceFile","fileName":"DirectBufferAccess.java"} + java.lang.Class directByteBufferClass -> f + java.lang.reflect.Method memoryBlockWrapFromJni -> h + java.lang.reflect.Method mClean -> c + java.lang.reflect.Constructor byteBufferConstructor -> e + java.lang.reflect.Method mInvokeCleaner -> d + com.batch.android.msgpack.core.buffer.DirectBufferAccess$DirectBufferConstructorType directBufferConstructorType -> g + java.lang.reflect.Method mGetAddress -> a + java.lang.reflect.Method mCleaner -> b + 1:49:void ():54:102 -> + 50:63:void ():92:105 -> + 1:1:void ():30:30 -> + 1:1:java.lang.Object access$000(java.nio.ByteBuffer):28:28 -> a + 2:2:java.lang.Object access$100(java.nio.ByteBuffer,java.lang.reflect.Method):28:28 -> a + 3:10:void clean(java.lang.Object):232:239 -> a + 11:25:java.nio.ByteBuffer newByteBuffer(long,int,int,java.nio.ByteBuffer):249:263 -> a + 26:29:java.nio.ByteBuffer newByteBuffer(long,int,int,java.nio.ByteBuffer):257:260 -> a + 30:30:java.nio.ByteBuffer newByteBuffer(long,int,int,java.nio.ByteBuffer):257:257 -> a + 31:31:java.nio.ByteBuffer newByteBuffer(long,int,int,java.nio.ByteBuffer):255:255 -> a + 32:32:java.nio.ByteBuffer newByteBuffer(long,int,int,java.nio.ByteBuffer):253:253 -> a + 33:49:java.nio.ByteBuffer newByteBuffer(long,int,int,java.nio.ByteBuffer):251:267 -> a + 1:1:java.lang.Object access$200(java.nio.ByteBuffer):28:28 -> b + 2:5:java.lang.Object getCleanMethod(java.nio.ByteBuffer,java.lang.reflect.Method):185:188 -> b + 6:10:long getAddress(java.lang.Object):222:226 -> b + 11:11:long getAddress(java.lang.Object):224:224 -> b + 1:3:java.lang.Object getCleanerMethod(java.nio.ByteBuffer):163:165 -> c + 4:4:boolean isDirectByteBufferInstance(java.lang.Object):244:244 -> c + 1:2:java.lang.Object getInvokeCleanerMethod(java.nio.ByteBuffer):208:209 -> d + 1:27:void setupCleanerJava6(java.nio.ByteBuffer):111:137 -> e + 28:28:void setupCleanerJava6(java.nio.ByteBuffer):135:135 -> e + 29:29:void setupCleanerJava6(java.nio.ByteBuffer):121:121 -> e + 1:12:void setupCleanerJava9(java.nio.ByteBuffer):141:152 -> f + 13:13:void setupCleanerJava9(java.nio.ByteBuffer):150:150 -> f +com.batch.android.msgpack.core.buffer.DirectBufferAccess$1 -> com.batch.android.msgpack.core.buffer.a$a: +# {"id":"sourceFile","fileName":"DirectBufferAccess.java"} + java.nio.ByteBuffer val$direct -> a + 1:1:void (java.nio.ByteBuffer):113:113 -> + 1:1:java.lang.Object run():116:116 -> run +com.batch.android.msgpack.core.buffer.DirectBufferAccess$2 -> com.batch.android.msgpack.core.buffer.a$b: +# {"id":"sourceFile","fileName":"DirectBufferAccess.java"} + java.nio.ByteBuffer val$direct -> a + 1:1:void (java.nio.ByteBuffer):127:127 -> + 1:1:java.lang.Object run():130:130 -> run +com.batch.android.msgpack.core.buffer.DirectBufferAccess$3 -> com.batch.android.msgpack.core.buffer.a$c: +# {"id":"sourceFile","fileName":"DirectBufferAccess.java"} + java.nio.ByteBuffer val$direct -> a + 1:1:void (java.nio.ByteBuffer):142:142 -> + 1:1:java.lang.Object run():145:145 -> run +com.batch.android.msgpack.core.buffer.DirectBufferAccess$4 -> com.batch.android.msgpack.core.buffer.a$d: +# {"id":"sourceFile","fileName":"DirectBufferAccess.java"} + int[] $SwitchMap$com$batch$android$msgpack$core$buffer$DirectBufferAccess$DirectBufferConstructorType -> a + 1:1:void ():249:249 -> +com.batch.android.msgpack.core.buffer.DirectBufferAccess$DirectBufferConstructorType -> com.batch.android.msgpack.core.buffer.a$e: +# {"id":"sourceFile","fileName":"DirectBufferAccess.java"} + com.batch.android.msgpack.core.buffer.DirectBufferAccess$DirectBufferConstructorType[] $VALUES -> e + com.batch.android.msgpack.core.buffer.DirectBufferAccess$DirectBufferConstructorType ARGS_MB_INT_INT -> d + com.batch.android.msgpack.core.buffer.DirectBufferAccess$DirectBufferConstructorType ARGS_LONG_INT_REF -> a + com.batch.android.msgpack.core.buffer.DirectBufferAccess$DirectBufferConstructorType ARGS_INT_INT -> c + com.batch.android.msgpack.core.buffer.DirectBufferAccess$DirectBufferConstructorType ARGS_LONG_INT -> b + 1:4:void ():33:36 -> + 5:5:void ():32:32 -> + 1:1:void (java.lang.String,int):32:32 -> + 1:1:com.batch.android.msgpack.core.buffer.DirectBufferAccess$DirectBufferConstructorType[] $values():32:32 -> a + 1:1:com.batch.android.msgpack.core.buffer.DirectBufferAccess$DirectBufferConstructorType valueOf(java.lang.String):32:32 -> valueOf + 1:1:com.batch.android.msgpack.core.buffer.DirectBufferAccess$DirectBufferConstructorType[] values():32:32 -> values +com.batch.android.msgpack.core.buffer.InputStreamBufferInput -> com.batch.android.p0.f: +# {"id":"sourceFile","fileName":"InputStreamBufferInput.java"} + byte[] buffer -> b + java.io.InputStream in -> a + 1:1:void (java.io.InputStream):45:45 -> + 2:4:void (java.io.InputStream,int):48:50 -> + 1:8:com.batch.android.msgpack.core.buffer.MessageBufferInput newBufferInput(java.io.InputStream):34:41 -> a + 1:2:java.io.InputStream reset(java.io.InputStream):60:61 -> b + 1:1:void close():76:76 -> close + 1:5:com.batch.android.msgpack.core.buffer.MessageBuffer next():67:71 -> next +com.batch.android.msgpack.core.buffer.MessageBuffer -> com.batch.android.msgpack.core.buffer.MessageBuffer: +# {"id":"sourceFile","fileName":"MessageBuffer.java"} + 1:56:void ():50:105 -> + 57:110:void ():98:151 -> + 111:153:void ():109:151 -> + 154:194:void ():114:154 -> + 195:196:void ():150:151 -> + 1:5:void (byte[],int,int):334:338 -> + 6:27:void (java.nio.ByteBuffer):346:367 -> + 28:32:void (java.lang.Object,long,int):371:375 -> + 1:15:int getJavaVersion():158:172 -> a + 16:20:com.batch.android.msgpack.core.buffer.MessageBuffer newMessageBuffer(byte[],int,int):266:270 -> a + 21:25:com.batch.android.msgpack.core.buffer.MessageBuffer newMessageBuffer(java.nio.ByteBuffer):280:284 -> a + 26:41:com.batch.android.msgpack.core.buffer.MessageBuffer newInstance(java.lang.reflect.Constructor,java.lang.Object[]):297:312 -> a + 42:42:com.batch.android.msgpack.core.buffer.MessageBuffer newInstance(java.lang.reflect.Constructor,java.lang.Object[]):307:307 -> a + 43:43:com.batch.android.msgpack.core.buffer.MessageBuffer newInstance(java.lang.reflect.Constructor,java.lang.Object[]):303:303 -> a + 44:44:com.batch.android.msgpack.core.buffer.MessageBuffer newInstance(java.lang.reflect.Constructor,java.lang.Object[]):300:300 -> a + 1:1:com.batch.android.msgpack.core.buffer.MessageBuffer allocate(int):210:210 -> allocate + 2:2:com.batch.android.msgpack.core.buffer.MessageBuffer allocate(int):208:208 -> allocate + 1:1:byte[] array():568:568 -> array + 1:1:int arrayOffset():572:572 -> arrayOffset + 1:1:void copyTo(int,com.batch.android.msgpack.core.buffer.MessageBuffer,int,int):584:584 -> copyTo + 1:1:boolean getBoolean(int):405:405 -> getBoolean + 1:1:byte getByte(int):401:401 -> getByte + 1:1:void getBytes(int,byte[],int,int):440:440 -> getBytes + 2:6:void getBytes(int,int,java.nio.ByteBuffer):444:448 -> getBytes + 7:7:void getBytes(int,int,java.nio.ByteBuffer):445:445 -> getBytes + 1:1:double getDouble(int):436:436 -> getDouble + 1:1:float getFloat(int):427:427 -> getFloat + 1:3:int getInt(int):421:423 -> getInt + 1:2:long getLong(int):431:432 -> getLong + 1:2:short getShort(int):409:410 -> getShort + 1:1:boolean hasArray():553:553 -> hasArray + 1:1:void putBoolean(int,boolean):456:456 -> putBoolean + 1:1:void putByte(int,byte):452:452 -> putByte + 1:21:void putByteBuffer(int,java.nio.ByteBuffer,int):495:515 -> putByteBuffer + 22:22:void putByteBuffer(int,java.nio.ByteBuffer,int):500:500 -> putByteBuffer + 23:23:void putByteBuffer(int,java.nio.ByteBuffer,int):496:496 -> putByteBuffer + 1:1:void putBytes(int,byte[],int,int):491:491 -> putBytes + 1:1:void putDouble(int,double):487:487 -> putDouble + 1:1:void putFloat(int,float):477:477 -> putFloat + 1:2:void putInt(int,int):472:473 -> putInt + 1:2:void putLong(int,long):482:483 -> putLong + 1:1:void putMessageBuffer(int,com.batch.android.msgpack.core.buffer.MessageBuffer,int,int):522:522 -> putMessageBuffer + 1:2:void putShort(int,short):460:461 -> putShort + 1:7:void releaseBuffer(com.batch.android.msgpack.core.buffer.MessageBuffer):317:323 -> releaseBuffer + 1:1:int size():387:387 -> size + 1:5:com.batch.android.msgpack.core.buffer.MessageBuffer slice(int,int):392:396 -> slice + 1:7:java.nio.ByteBuffer sliceAsByteBuffer(int,int):533:539 -> sliceAsByteBuffer + 8:8:java.nio.ByteBuffer sliceAsByteBuffer(int,int):537:537 -> sliceAsByteBuffer + 9:9:java.nio.ByteBuffer sliceAsByteBuffer():549:549 -> sliceAsByteBuffer + 1:2:byte[] toByteArray():562:563 -> toByteArray + 1:8:java.lang.String toHexString(int,int):588:595 -> toHexString + 1:1:com.batch.android.msgpack.core.buffer.MessageBuffer wrap(byte[]):224:224 -> wrap + 2:2:com.batch.android.msgpack.core.buffer.MessageBuffer wrap(byte[],int,int):240:240 -> wrap + 3:3:com.batch.android.msgpack.core.buffer.MessageBuffer wrap(java.nio.ByteBuffer):256:256 -> wrap +com.batch.android.msgpack.core.buffer.MessageBufferBE -> com.batch.android.msgpack.core.buffer.MessageBufferBE: +# {"id":"sourceFile","fileName":"MessageBufferBE.java"} + 1:1:void (byte[],int,int):30:30 -> + 2:2:void (java.nio.ByteBuffer):34:34 -> + 3:3:void (java.lang.Object,long,int):38:38 -> + 1:5:com.batch.android.msgpack.core.buffer.MessageBufferBE slice(int,int):43:47 -> a + 1:1:double getDouble(int):73:73 -> getDouble + 1:1:float getFloat(int):68:68 -> getFloat + 1:1:int getInt(int):59:59 -> getInt + 1:1:long getLong(int):63:63 -> getLong + 1:1:short getShort(int):53:53 -> getShort + 1:1:void putDouble(int,double):93:93 -> putDouble + 1:1:void putInt(int,int):83:83 -> putInt + 1:1:void putLong(int,long):88:88 -> putLong + 1:1:void putShort(int,short):78:78 -> putShort + 1:1:com.batch.android.msgpack.core.buffer.MessageBuffer slice(int,int):27:27 -> slice +com.batch.android.msgpack.core.buffer.MessageBufferInput -> com.batch.android.p0.g: +# {"id":"sourceFile","fileName":"MessageBufferInput.java"} +com.batch.android.msgpack.core.buffer.MessageBufferOutput -> com.batch.android.p0.h: +# {"id":"sourceFile","fileName":"MessageBufferOutput.java"} + void write(byte[],int,int) -> a + void writeBuffer(int) -> a + void add(byte[],int,int) -> b + com.batch.android.msgpack.core.buffer.MessageBuffer next(int) -> b +com.batch.android.msgpack.core.buffer.MessageBufferU -> com.batch.android.msgpack.core.buffer.MessageBufferU: +# {"id":"sourceFile","fileName":"MessageBufferU.java"} + 1:2:void (byte[],int,int):31:32 -> + 3:4:void (java.nio.ByteBuffer):36:37 -> + 5:6:void (java.lang.Object,long,int,java.nio.ByteBuffer):41:42 -> + 1:1:byte[] array():233:233 -> array + 1:5:void copyTo(int,com.batch.android.msgpack.core.buffer.MessageBuffer,int,int):207:211 -> copyTo + 1:1:boolean getBoolean(int):73:73 -> getBoolean + 1:1:byte getByte(int):68:68 -> getByte + 1:6:void getBytes(int,int,java.nio.ByteBuffer):104:109 -> getBytes + 7:11:void getBytes(int,byte[],int,int):166:170 -> getBytes + 1:1:double getDouble(int):98:98 -> getDouble + 1:1:float getFloat(int):88:88 -> getFloat + 1:1:int getInt(int):83:83 -> getInt + 1:1:long getLong(int):93:93 -> getLong + 1:1:short getShort(int):78:78 -> getShort + 1:1:boolean hasArray():228:228 -> hasArray + 1:1:void putBoolean(int,boolean):119:119 -> putBoolean + 1:1:void putByte(int,byte):114:114 -> putByte + 1:16:void putByteBuffer(int,java.nio.ByteBuffer,int):175:190 -> putByteBuffer + 17:17:void putByteBuffer(int,java.nio.ByteBuffer,int):176:176 -> putByteBuffer + 1:5:void putBytes(int,byte[],int,int):197:201 -> putBytes + 1:1:void putDouble(int,double):144:144 -> putDouble + 1:1:void putFloat(int,float):134:134 -> putFloat + 1:1:void putInt(int,int):129:129 -> putInt + 1:1:void putLong(int,long):139:139 -> putLong + 1:1:void putMessageBuffer(int,com.batch.android.msgpack.core.buffer.MessageBuffer,int,int):216:216 -> putMessageBuffer + 1:1:void putShort(int,short):124:124 -> putShort + 1:2:void resetBufferPosition():62:63 -> resetBufferPosition + 1:1:com.batch.android.msgpack.core.buffer.MessageBuffer slice(int,int):26:26 -> slice + 2:12:com.batch.android.msgpack.core.buffer.MessageBufferU slice(int,int):47:57 -> slice + 1:6:java.nio.ByteBuffer sliceAsByteBuffer(int,int):150:155 -> sliceAsByteBuffer + 7:7:java.nio.ByteBuffer sliceAsByteBuffer():160:160 -> sliceAsByteBuffer + 1:2:byte[] toByteArray():221:222 -> toByteArray +com.batch.android.msgpack.core.buffer.OutputStreamBufferOutput -> com.batch.android.p0.i: +# {"id":"sourceFile","fileName":"OutputStreamBufferOutput.java"} + java.io.OutputStream out -> a + com.batch.android.msgpack.core.buffer.MessageBuffer buffer -> b + 1:1:void (java.io.OutputStream):32:32 -> + 2:4:void (java.io.OutputStream,int):35:37 -> + 1:2:java.io.OutputStream reset(java.io.OutputStream):47:48 -> a + 3:3:void writeBuffer(int):62:62 -> a + 4:4:void write(byte[],int,int):67:67 -> a + 1:4:com.batch.android.msgpack.core.buffer.MessageBuffer next(int):54:57 -> b + 5:5:void add(byte[],int,int):72:72 -> b + 1:1:void close():77:77 -> close + 1:1:void flush():82:82 -> flush +com.batch.android.msgpack.value.ArrayValue -> com.batch.android.q0.a: +# {"id":"sourceFile","fileName":"ArrayValue.java"} + com.batch.android.msgpack.value.Value getOrNilValue(int) -> a + java.util.List list() -> l +com.batch.android.msgpack.value.BinaryValue -> com.batch.android.q0.b: +# {"id":"sourceFile","fileName":"BinaryValue.java"} +com.batch.android.msgpack.value.BooleanValue -> com.batch.android.q0.c: +# {"id":"sourceFile","fileName":"BooleanValue.java"} + boolean getBoolean() -> M +com.batch.android.msgpack.value.ExtensionValue -> com.batch.android.q0.d: +# {"id":"sourceFile","fileName":"ExtensionValue.java"} + byte[] getData() -> e + byte getType() -> k +com.batch.android.msgpack.value.FloatValue -> com.batch.android.q0.e: +# {"id":"sourceFile","fileName":"FloatValue.java"} +com.batch.android.msgpack.value.ImmutableArrayValue -> com.batch.android.q0.f: +# {"id":"sourceFile","fileName":"ImmutableArrayValue.java"} + java.util.List list() -> l +com.batch.android.msgpack.value.ImmutableBinaryValue -> com.batch.android.q0.g: +# {"id":"sourceFile","fileName":"ImmutableBinaryValue.java"} +com.batch.android.msgpack.value.ImmutableBooleanValue -> com.batch.android.q0.h: +# {"id":"sourceFile","fileName":"ImmutableBooleanValue.java"} +com.batch.android.msgpack.value.ImmutableExtensionValue -> com.batch.android.q0.i: +# {"id":"sourceFile","fileName":"ImmutableExtensionValue.java"} +com.batch.android.msgpack.value.ImmutableFloatValue -> com.batch.android.q0.j: +# {"id":"sourceFile","fileName":"ImmutableFloatValue.java"} +com.batch.android.msgpack.value.ImmutableIntegerValue -> com.batch.android.q0.k: +# {"id":"sourceFile","fileName":"ImmutableIntegerValue.java"} +com.batch.android.msgpack.value.ImmutableMapValue -> com.batch.android.q0.l: +# {"id":"sourceFile","fileName":"ImmutableMapValue.java"} +com.batch.android.msgpack.value.ImmutableNilValue -> com.batch.android.q0.m: +# {"id":"sourceFile","fileName":"ImmutableNilValue.java"} +com.batch.android.msgpack.value.ImmutableNumberValue -> com.batch.android.q0.n: +# {"id":"sourceFile","fileName":"ImmutableNumberValue.java"} +com.batch.android.msgpack.value.ImmutableRawValue -> com.batch.android.q0.o: +# {"id":"sourceFile","fileName":"ImmutableRawValue.java"} +com.batch.android.msgpack.value.ImmutableStringValue -> com.batch.android.q0.p: +# {"id":"sourceFile","fileName":"ImmutableStringValue.java"} +com.batch.android.msgpack.value.ImmutableValue -> com.batch.android.q0.q: +# {"id":"sourceFile","fileName":"ImmutableValue.java"} + com.batch.android.msgpack.value.ImmutableArrayValue asArrayValue() -> a + 1:1:com.batch.android.msgpack.value.ArrayValue asArrayValue():21:21 -> a + com.batch.android.msgpack.value.ImmutableNilValue asNilValue() -> b + 1:1:com.batch.android.msgpack.value.NilValue asNilValue():21:21 -> b + com.batch.android.msgpack.value.ImmutableIntegerValue asIntegerValue() -> c + 1:1:com.batch.android.msgpack.value.IntegerValue asIntegerValue():21:21 -> c + com.batch.android.msgpack.value.ImmutableMapValue asMapValue() -> d + 1:1:com.batch.android.msgpack.value.MapValue asMapValue():21:21 -> d + com.batch.android.msgpack.value.ImmutableBinaryValue asBinaryValue() -> f + 1:1:com.batch.android.msgpack.value.BinaryValue asBinaryValue():21:21 -> f + com.batch.android.msgpack.value.ImmutableStringValue asStringValue() -> g + 1:1:com.batch.android.msgpack.value.StringValue asStringValue():21:21 -> g + com.batch.android.msgpack.value.ImmutableRawValue asRawValue() -> h + 1:1:com.batch.android.msgpack.value.RawValue asRawValue():21:21 -> h + com.batch.android.msgpack.value.ImmutableBooleanValue asBooleanValue() -> i + 1:1:com.batch.android.msgpack.value.BooleanValue asBooleanValue():21:21 -> i + com.batch.android.msgpack.value.ImmutableFloatValue asFloatValue() -> j + 1:1:com.batch.android.msgpack.value.FloatValue asFloatValue():21:21 -> j +com.batch.android.msgpack.value.IntegerValue -> com.batch.android.q0.r: +# {"id":"sourceFile","fileName":"IntegerValue.java"} + java.math.BigInteger asBigInteger() -> B + long asLong() -> I + byte asByte() -> J + boolean isInLongRange() -> K + boolean isInByteRange() -> U + int asInt() -> V + boolean isInIntRange() -> p + short asShort() -> t + com.batch.android.msgpack.core.MessageFormat mostSuccinctMessageFormat() -> u + boolean isInShortRange() -> y +com.batch.android.msgpack.value.MapValue -> com.batch.android.q0.s: +# {"id":"sourceFile","fileName":"MapValue.java"} + java.util.Map map() -> H + com.batch.android.msgpack.value.Value[] getKeyValueArray() -> x +com.batch.android.msgpack.value.NilValue -> com.batch.android.q0.t: +# {"id":"sourceFile","fileName":"NilValue.java"} +com.batch.android.msgpack.value.NumberValue -> com.batch.android.q0.u: +# {"id":"sourceFile","fileName":"NumberValue.java"} + java.math.BigInteger toBigInteger() -> F + int toInt() -> G + long toLong() -> Y + float toFloat() -> n + double toDouble() -> o + byte toByte() -> r + short toShort() -> z +com.batch.android.msgpack.value.RawValue -> com.batch.android.q0.v: +# {"id":"sourceFile","fileName":"RawValue.java"} + java.lang.String asString() -> A + java.nio.ByteBuffer asByteBuffer() -> D + byte[] asByteArray() -> P +com.batch.android.msgpack.value.StringValue -> com.batch.android.q0.w: +# {"id":"sourceFile","fileName":"StringValue.java"} +com.batch.android.msgpack.value.Value -> com.batch.android.q0.x: +# {"id":"sourceFile","fileName":"Value.java"} + boolean isBinaryValue() -> C + boolean isNilValue() -> E + boolean isNumberValue() -> L + boolean isArrayValue() -> N + boolean isRawValue() -> O + boolean isExtensionValue() -> Q + com.batch.android.msgpack.value.NumberValue asNumberValue() -> R + boolean isMapValue() -> S + boolean isFloatValue() -> T + boolean isBooleanValue() -> W + java.lang.String toJson() -> X + com.batch.android.msgpack.value.ArrayValue asArrayValue() -> a + void writeTo(com.batch.android.msgpack.core.MessagePacker) -> a + com.batch.android.msgpack.value.NilValue asNilValue() -> b + com.batch.android.msgpack.value.IntegerValue asIntegerValue() -> c + com.batch.android.msgpack.value.MapValue asMapValue() -> d + com.batch.android.msgpack.value.BinaryValue asBinaryValue() -> f + com.batch.android.msgpack.value.StringValue asStringValue() -> g + com.batch.android.msgpack.value.RawValue asRawValue() -> h + com.batch.android.msgpack.value.BooleanValue asBooleanValue() -> i + com.batch.android.msgpack.value.FloatValue asFloatValue() -> j + com.batch.android.msgpack.value.ValueType getValueType() -> m + com.batch.android.msgpack.value.ExtensionValue asExtensionValue() -> q + com.batch.android.msgpack.value.ImmutableValue immutableValue() -> s + boolean isStringValue() -> v + boolean isIntegerValue() -> w +com.batch.android.msgpack.value.ValueFactory -> com.batch.android.q0.y: +# {"id":"sourceFile","fileName":"ValueFactory.java"} + 1:1:void ():37:37 -> + 1:1:com.batch.android.msgpack.value.ImmutableBooleanValue newBoolean(boolean):44:44 -> a + 2:2:com.batch.android.msgpack.value.ImmutableIntegerValue newInteger(byte):48:48 -> a + 3:3:com.batch.android.msgpack.value.ImmutableIntegerValue newInteger(short):52:52 -> a + 4:4:com.batch.android.msgpack.value.ImmutableIntegerValue newInteger(int):56:56 -> a + 5:5:com.batch.android.msgpack.value.ImmutableIntegerValue newInteger(long):60:60 -> a + 6:6:com.batch.android.msgpack.value.ImmutableIntegerValue newInteger(java.math.BigInteger):64:64 -> a + 7:7:com.batch.android.msgpack.value.ImmutableFloatValue newFloat(float):68:68 -> a + 8:8:com.batch.android.msgpack.value.ImmutableFloatValue newFloat(double):72:72 -> a + 9:9:com.batch.android.msgpack.value.ImmutableBinaryValue newBinary(byte[]):76:76 -> a + 10:12:com.batch.android.msgpack.value.ImmutableBinaryValue newBinary(byte[],boolean):81:83 -> a + 13:13:com.batch.android.msgpack.value.ImmutableBinaryValue newBinary(byte[],int,int):88:88 -> a + 14:17:com.batch.android.msgpack.value.ImmutableBinaryValue newBinary(byte[],int,int,boolean):92:95 -> a + 18:18:com.batch.android.msgpack.value.ImmutableStringValue newString(java.lang.String):100:100 -> a + 19:23:com.batch.android.msgpack.value.ImmutableArrayValue newArray(java.util.List):128:132 -> a + 24:27:com.batch.android.msgpack.value.ImmutableArrayValue newArray(com.batch.android.msgpack.value.Value[]):136:139 -> a + 28:33:com.batch.android.msgpack.value.ImmutableArrayValue newArray(com.batch.android.msgpack.value.Value[],boolean):144:149 -> a + 34:34:com.batch.android.msgpack.value.ImmutableArrayValue emptyArray():154:154 -> a + 35:43:com.batch.android.msgpack.value.ImmutableMapValue newMap(java.util.Map):158:166 -> a + 44:49:com.batch.android.msgpack.value.MapValue newMap(java.util.Map$Entry[]):193:198 -> a + 50:50:java.util.Map$Entry newMapEntry(com.batch.android.msgpack.value.Value,com.batch.android.msgpack.value.Value):206:206 -> a + 51:51:com.batch.android.msgpack.value.ImmutableExtensionValue newExtension(byte,byte[]):245:245 -> a + 1:1:com.batch.android.msgpack.value.ImmutableStringValue newString(byte[]):104:104 -> b + 2:4:com.batch.android.msgpack.value.ImmutableStringValue newString(byte[],boolean):109:111 -> b + 5:5:com.batch.android.msgpack.value.ImmutableStringValue newString(byte[],int,int):116:116 -> b + 6:9:com.batch.android.msgpack.value.ImmutableStringValue newString(byte[],int,int,boolean):120:123 -> b + 10:13:com.batch.android.msgpack.value.ImmutableMapValue newMap(com.batch.android.msgpack.value.Value[]):170:173 -> b + 14:19:com.batch.android.msgpack.value.ImmutableMapValue newMap(com.batch.android.msgpack.value.Value[],boolean):178:183 -> b + 20:20:com.batch.android.msgpack.value.ImmutableMapValue emptyMap():188:188 -> b + 1:1:com.batch.android.msgpack.value.ValueFactory$MapBuilder newMapBuilder():202:202 -> c + 1:1:com.batch.android.msgpack.value.ImmutableNilValue newNil():40:40 -> d +com.batch.android.msgpack.value.ValueFactory$MapBuilder -> com.batch.android.q0.y$a: +# {"id":"sourceFile","fileName":"ValueFactory.java"} + java.util.Map map -> a + 1:1:void ():213:213 -> + 2:2:void ():211:211 -> + 1:1:com.batch.android.msgpack.value.MapValue build():216:216 -> a + 2:2:com.batch.android.msgpack.value.ValueFactory$MapBuilder put(java.util.Map$Entry):220:220 -> a + 3:3:com.batch.android.msgpack.value.ValueFactory$MapBuilder put(com.batch.android.msgpack.value.Value,com.batch.android.msgpack.value.Value):225:225 -> a + 4:5:com.batch.android.msgpack.value.ValueFactory$MapBuilder putAll(java.lang.Iterable):230:231 -> a + 6:7:com.batch.android.msgpack.value.ValueFactory$MapBuilder putAll(java.util.Map):237:238 -> a +com.batch.android.msgpack.value.ValueType -> com.batch.android.q0.z: +# {"id":"sourceFile","fileName":"ValueType.java"} + com.batch.android.msgpack.value.ValueType NIL -> c + com.batch.android.msgpack.value.ValueType[] $VALUES -> l + com.batch.android.msgpack.value.ValueType STRING -> g + com.batch.android.msgpack.value.ValueType FLOAT -> f + com.batch.android.msgpack.value.ValueType INTEGER -> e + com.batch.android.msgpack.value.ValueType BOOLEAN -> d + boolean numberType -> a + com.batch.android.msgpack.value.ValueType EXTENSION -> k + boolean rawType -> b + com.batch.android.msgpack.value.ValueType MAP -> j + com.batch.android.msgpack.value.ValueType ARRAY -> i + com.batch.android.msgpack.value.ValueType BINARY -> h + 1:9:void ():28:36 -> + 10:10:void ():27:27 -> + 1:3:void (java.lang.String,int,boolean,boolean):41:43 -> + 1:1:com.batch.android.msgpack.value.ValueType[] $values():27:27 -> a + 1:1:boolean isArrayType():79:79 -> b + 1:1:boolean isBinaryType():75:75 -> c + 1:1:boolean isBooleanType():51:51 -> d + 1:1:boolean isExtensionType():87:87 -> e + 1:1:boolean isFloatType():63:63 -> f + 1:1:boolean isIntegerType():59:59 -> g + 1:1:boolean isMapType():83:83 -> h + 1:1:boolean isNilType():47:47 -> i + 1:1:boolean isNumberType():55:55 -> j + 1:1:boolean isRawType():67:67 -> k + 1:1:boolean isStringType():71:71 -> l + 1:1:com.batch.android.msgpack.value.ValueType valueOf(java.lang.String):27:27 -> valueOf + 1:1:com.batch.android.msgpack.value.ValueType[] values():27:27 -> values +com.batch.android.msgpack.value.Variable -> com.batch.android.q0.a0: +# {"id":"sourceFile","fileName":"Variable.java"} + long longValue -> k + com.batch.android.msgpack.value.Variable$IntegerValueAccessor integerAccessor -> c + com.batch.android.msgpack.value.Variable$StringValueAccessor stringAccessor -> f + java.math.BigInteger LONG_MAX -> p + java.math.BigInteger LONG_MIN -> o + com.batch.android.msgpack.value.Variable$NilValueAccessor nilAccessor -> a + java.lang.Object objectValue -> m + com.batch.android.msgpack.value.Variable$ExtensionValueAccessor extensionAccessor -> i + com.batch.android.msgpack.value.Variable$ArrayValueAccessor arrayAccessor -> g + com.batch.android.msgpack.value.Variable$BinaryValueAccessor binaryAccessor -> e + double doubleValue -> l + com.batch.android.msgpack.value.Variable$MapValueAccessor mapAccessor -> h + long INT_MAX -> v + long INT_MIN -> u + com.batch.android.msgpack.value.Variable$BooleanValueAccessor booleanAccessor -> b + com.batch.android.msgpack.value.Variable$FloatValueAccessor floatAccessor -> d + com.batch.android.msgpack.value.Variable$Type type -> j + long BYTE_MAX -> r + com.batch.android.msgpack.value.Variable$AbstractValueAccessor accessor -> n + long BYTE_MIN -> q + long SHORT_MAX -> t + long SHORT_MIN -> s + 1:2:void ():296:297 -> + 1:1:void ():214:214 -> + 2:21:void ():196:215 -> + 1:1:boolean isBinaryValue():940:940 -> C + 1:1:boolean isNilValue():910:910 -> E + 1:1:boolean isNumberValue():920:920 -> L + 1:1:boolean isArrayValue():950:950 -> N + 1:1:boolean isRawValue():935:935 -> O + 1:1:boolean isExtensionValue():960:960 -> Q + 1:4:com.batch.android.msgpack.value.NumberValue asNumberValue():981:984 -> R + 5:5:com.batch.android.msgpack.value.NumberValue asNumberValue():982:982 -> R + 1:1:boolean isMapValue():955:955 -> S + 1:1:boolean isFloatValue():930:930 -> T + 1:1:boolean isBooleanValue():915:915 -> W + 1:1:java.lang.String toJson():895:895 -> X + 1:2:com.batch.android.msgpack.value.Variable setNilValue():223:224 -> Z + 1:1:long access$1000(com.batch.android.msgpack.value.Variable):38:38 -> a + 2:4:com.batch.android.msgpack.value.Variable setBooleanValue(boolean):256:258 -> a + 5:7:com.batch.android.msgpack.value.Variable setIntegerValue(long):380:382 -> a + 8:15:com.batch.android.msgpack.value.Variable setIntegerValue(java.math.BigInteger):387:394 -> a + 16:19:com.batch.android.msgpack.value.Variable setFloatValue(double):512:515 -> a + 20:22:com.batch.android.msgpack.value.Variable setFloatValue(float):520:522 -> a + 23:25:com.batch.android.msgpack.value.Variable setBinaryValue(byte[]):607:609 -> a + 26:26:com.batch.android.msgpack.value.Variable setStringValue(java.lang.String):643:643 -> a + 27:29:com.batch.android.msgpack.value.Variable setArrayValue(java.util.List):683:685 -> a + 30:32:com.batch.android.msgpack.value.Variable setMapValue(java.util.Map):751:753 -> a + 33:35:com.batch.android.msgpack.value.Variable setExtensionValue(byte,byte[]):830:832 -> a + 36:36:void writeTo(com.batch.android.msgpack.core.MessagePacker):880:880 -> a + 37:40:com.batch.android.msgpack.value.ArrayValue asArrayValue():1029:1032 -> a + 41:41:com.batch.android.msgpack.value.ArrayValue asArrayValue():1030:1030 -> a + 1:1:com.batch.android.msgpack.value.Variable$Type access$1100(com.batch.android.msgpack.value.Variable):38:38 -> b + 2:4:com.batch.android.msgpack.value.Variable setStringValue(byte[]):647:649 -> b + 5:8:com.batch.android.msgpack.value.NilValue asNilValue():965:968 -> b + 9:9:com.batch.android.msgpack.value.NilValue asNilValue():966:966 -> b + 1:1:java.lang.Object access$1200(com.batch.android.msgpack.value.Variable):38:38 -> c + 2:5:com.batch.android.msgpack.value.IntegerValue asIntegerValue():989:992 -> c + 6:6:com.batch.android.msgpack.value.IntegerValue asIntegerValue():990:990 -> c + 1:1:double access$1300(com.batch.android.msgpack.value.Variable):38:38 -> d + 2:5:com.batch.android.msgpack.value.MapValue asMapValue():1037:1040 -> d + 6:6:com.batch.android.msgpack.value.MapValue asMapValue():1038:1038 -> d + 1:1:boolean equals(java.lang.Object):890:890 -> equals + 1:4:com.batch.android.msgpack.value.BinaryValue asBinaryValue():1013:1016 -> f + 5:5:com.batch.android.msgpack.value.BinaryValue asBinaryValue():1014:1014 -> f + 1:4:com.batch.android.msgpack.value.StringValue asStringValue():1021:1024 -> g + 5:5:com.batch.android.msgpack.value.StringValue asStringValue():1022:1022 -> g + 1:4:com.batch.android.msgpack.value.RawValue asRawValue():1005:1008 -> h + 5:5:com.batch.android.msgpack.value.RawValue asRawValue():1006:1006 -> h + 1:1:int hashCode():885:885 -> hashCode + 1:4:com.batch.android.msgpack.value.BooleanValue asBooleanValue():973:976 -> i + 5:5:com.batch.android.msgpack.value.BooleanValue asBooleanValue():974:974 -> i + 1:4:com.batch.android.msgpack.value.FloatValue asFloatValue():997:1000 -> j + 5:5:com.batch.android.msgpack.value.FloatValue asFloatValue():998:998 -> j + 1:1:com.batch.android.msgpack.value.ValueType getValueType():905:905 -> m + 1:4:com.batch.android.msgpack.value.ExtensionValue asExtensionValue():1045:1048 -> q + 5:5:com.batch.android.msgpack.value.ExtensionValue asExtensionValue():1046:1046 -> q + 1:1:com.batch.android.msgpack.value.ImmutableValue immutableValue():875:875 -> s + 1:1:java.lang.String toString():900:900 -> toString + 1:1:boolean isStringValue():945:945 -> v + 1:1:boolean isIntegerValue():925:925 -> w +com.batch.android.msgpack.value.Variable$1 -> com.batch.android.q0.a0$a: +# {"id":"sourceFile","fileName":"Variable.java"} +com.batch.android.msgpack.value.Variable$AbstractNumberValueAccessor -> com.batch.android.q0.a0$b: +# {"id":"sourceFile","fileName":"Variable.java"} + com.batch.android.msgpack.value.Variable this$0 -> b + 1:1:void (com.batch.android.msgpack.value.Variable):305:305 -> + 2:2:void (com.batch.android.msgpack.value.Variable,com.batch.android.msgpack.value.Variable$1):305:305 -> + 1:6:java.math.BigInteger toBigInteger():346:351 -> F + 1:4:int toInt():330:333 -> G + com.batch.android.msgpack.value.NumberValue asNumberValue() -> R + 1:4:long toLong():338:341 -> Y + 1:6:float toFloat():356:361 -> n + 1:6:double toDouble():366:371 -> o + 1:4:byte toByte():314:317 -> r + 1:4:short toShort():322:325 -> z +com.batch.android.msgpack.value.Variable$AbstractRawValueAccessor -> com.batch.android.q0.a0$c: +# {"id":"sourceFile","fileName":"Variable.java"} + com.batch.android.msgpack.value.Variable this$0 -> b + 1:1:void (com.batch.android.msgpack.value.Variable):555:555 -> + 2:2:void (com.batch.android.msgpack.value.Variable,com.batch.android.msgpack.value.Variable$1):555:555 -> + 1:9:java.lang.String asString():574:582 -> A + 1:1:java.nio.ByteBuffer asByteBuffer():569:569 -> D + 1:1:byte[] asByteArray():564:564 -> P + com.batch.android.msgpack.value.RawValue asRawValue() -> h + 1:9:java.lang.String toString():589:597 -> toString +com.batch.android.msgpack.value.Variable$AbstractValueAccessor -> com.batch.android.q0.a0$d: +# {"id":"sourceFile","fileName":"Variable.java"} + com.batch.android.msgpack.value.Variable this$0 -> a + 1:1:void (com.batch.android.msgpack.value.Variable):40:40 -> + 2:2:void (com.batch.android.msgpack.value.Variable,com.batch.android.msgpack.value.Variable$1):40:40 -> + 1:1:boolean isBinaryValue():74:74 -> C + 1:1:boolean isNilValue():44:44 -> E + 1:1:boolean isNumberValue():54:54 -> L + 1:1:boolean isArrayValue():84:84 -> N + 1:1:boolean isRawValue():69:69 -> O + 1:1:boolean isExtensionValue():94:94 -> Q + 1:1:com.batch.android.msgpack.value.NumberValue asNumberValue():109:109 -> R + 1:1:boolean isMapValue():89:89 -> S + 1:1:boolean isFloatValue():64:64 -> T + 1:1:boolean isBooleanValue():49:49 -> W + 1:1:java.lang.String toJson():164:164 -> X + 1:1:com.batch.android.msgpack.value.ArrayValue asArrayValue():139:139 -> a + 1:1:com.batch.android.msgpack.value.NilValue asNilValue():99:99 -> b + 1:1:com.batch.android.msgpack.value.IntegerValue asIntegerValue():114:114 -> c + 1:1:com.batch.android.msgpack.value.MapValue asMapValue():144:144 -> d + 1:1:boolean equals(java.lang.Object):154:154 -> equals + 1:1:com.batch.android.msgpack.value.BinaryValue asBinaryValue():129:129 -> f + 1:1:com.batch.android.msgpack.value.StringValue asStringValue():134:134 -> g + 1:1:com.batch.android.msgpack.value.RawValue asRawValue():124:124 -> h + 1:1:int hashCode():159:159 -> hashCode + 1:1:com.batch.android.msgpack.value.BooleanValue asBooleanValue():104:104 -> i + 1:1:com.batch.android.msgpack.value.FloatValue asFloatValue():119:119 -> j + 1:1:com.batch.android.msgpack.value.ExtensionValue asExtensionValue():149:149 -> q + 1:1:java.lang.String toString():169:169 -> toString + 1:1:boolean isStringValue():79:79 -> v + 1:1:boolean isIntegerValue():59:59 -> w +com.batch.android.msgpack.value.Variable$ArrayValueAccessor -> com.batch.android.q0.a0$e: +# {"id":"sourceFile","fileName":"Variable.java"} + com.batch.android.msgpack.value.Variable this$0 -> b + 1:1:void (com.batch.android.msgpack.value.Variable):689:689 -> + 2:2:void (com.batch.android.msgpack.value.Variable,com.batch.android.msgpack.value.Variable$1):689:689 -> + 1:1:com.batch.android.msgpack.value.ImmutableArrayValue immutableValue():703:703 -> Z + 1:1:com.batch.android.msgpack.value.ArrayValue asArrayValue():0:0 -> a + 2:6:com.batch.android.msgpack.value.Value getOrNilValue(int):718:722 -> a + 7:10:void writeTo(com.batch.android.msgpack.core.MessagePacker):738:741 -> a + 1:1:com.batch.android.msgpack.value.Value get(int):713:713 -> get + 1:1:java.util.Iterator iterator():727:727 -> iterator + 1:1:java.util.List list():733:733 -> l + 1:1:com.batch.android.msgpack.value.ValueType getValueType():693:693 -> m + 1:1:com.batch.android.msgpack.value.ImmutableValue immutableValue():689:689 -> s + 1:1:int size():708:708 -> size +com.batch.android.msgpack.value.Variable$BinaryValueAccessor -> com.batch.android.q0.a0$f: +# {"id":"sourceFile","fileName":"Variable.java"} + com.batch.android.msgpack.value.Variable this$0 -> c + 1:1:void (com.batch.android.msgpack.value.Variable):613:613 -> + 2:2:void (com.batch.android.msgpack.value.Variable,com.batch.android.msgpack.value.Variable$1):613:613 -> + 1:1:com.batch.android.msgpack.value.ImmutableBinaryValue immutableValue():627:627 -> Z + 1:3:void writeTo(com.batch.android.msgpack.core.MessagePacker):632:634 -> a + com.batch.android.msgpack.value.BinaryValue asBinaryValue() -> f + 1:1:com.batch.android.msgpack.value.ValueType getValueType():617:617 -> m + 1:1:com.batch.android.msgpack.value.ImmutableValue immutableValue():613:613 -> s +com.batch.android.msgpack.value.Variable$BooleanValueAccessor -> com.batch.android.q0.a0$g: +# {"id":"sourceFile","fileName":"Variable.java"} + com.batch.android.msgpack.value.Variable this$0 -> b + 1:1:void (com.batch.android.msgpack.value.Variable):262:262 -> + 2:2:void (com.batch.android.msgpack.value.Variable,com.batch.android.msgpack.value.Variable$1):262:262 -> + 1:1:boolean getBoolean():281:281 -> M + 1:1:com.batch.android.msgpack.value.ImmutableBooleanValue immutableValue():276:276 -> Z + 1:1:void writeTo(com.batch.android.msgpack.core.MessagePacker):286:286 -> a + com.batch.android.msgpack.value.BooleanValue asBooleanValue() -> i + 1:1:com.batch.android.msgpack.value.ValueType getValueType():266:266 -> m + 1:1:com.batch.android.msgpack.value.ImmutableValue immutableValue():262:262 -> s +com.batch.android.msgpack.value.Variable$ExtensionValueAccessor -> com.batch.android.q0.a0$h: +# {"id":"sourceFile","fileName":"Variable.java"} + com.batch.android.msgpack.value.Variable this$0 -> b + 1:1:void (com.batch.android.msgpack.value.Variable):836:836 -> + 2:2:void (com.batch.android.msgpack.value.Variable,com.batch.android.msgpack.value.Variable$1):836:836 -> + 1:1:com.batch.android.msgpack.value.ImmutableExtensionValue immutableValue():850:850 -> Z + 1:1:void writeTo(com.batch.android.msgpack.core.MessagePacker):865:865 -> a + 1:1:byte[] getData():860:860 -> e + 1:1:byte getType():855:855 -> k + 1:1:com.batch.android.msgpack.value.ValueType getValueType():840:840 -> m + com.batch.android.msgpack.value.ExtensionValue asExtensionValue() -> q + 1:1:com.batch.android.msgpack.value.ImmutableValue immutableValue():836:836 -> s +com.batch.android.msgpack.value.Variable$FloatValueAccessor -> com.batch.android.q0.a0$i: +# {"id":"sourceFile","fileName":"Variable.java"} + com.batch.android.msgpack.value.Variable this$0 -> c + 1:1:void (com.batch.android.msgpack.value.Variable):526:526 -> + 2:2:void (com.batch.android.msgpack.value.Variable,com.batch.android.msgpack.value.Variable$1):526:526 -> + 1:1:com.batch.android.msgpack.value.ImmutableFloatValue immutableValue():535:535 -> Z + 1:1:void writeTo(com.batch.android.msgpack.core.MessagePacker):545:545 -> a + com.batch.android.msgpack.value.FloatValue asFloatValue() -> j + 1:1:com.batch.android.msgpack.value.ValueType getValueType():540:540 -> m + 1:1:com.batch.android.msgpack.value.ImmutableValue immutableValue():526:526 -> s +com.batch.android.msgpack.value.Variable$IntegerValueAccessor -> com.batch.android.q0.a0$j: +# {"id":"sourceFile","fileName":"Variable.java"} + com.batch.android.msgpack.value.Variable this$0 -> c + 1:1:void (com.batch.android.msgpack.value.Variable):399:399 -> + 2:2:void (com.batch.android.msgpack.value.Variable,com.batch.android.msgpack.value.Variable$1):399:399 -> + 1:4:java.math.BigInteger asBigInteger():490:493 -> B + 1:4:long asLong():482:485 -> I + 5:5:long asLong():483:483 -> I + 1:4:byte asByte():458:461 -> J + 5:5:byte asByte():459:459 -> J + 1:1:boolean isInLongRange():445:445 -> K + 1:4:boolean isInByteRange():421:424 -> U + 1:4:int asInt():474:477 -> V + 5:5:int asInt():475:475 -> V + 1:4:com.batch.android.msgpack.value.ImmutableIntegerValue immutableValue():413:416 -> Z + 1:4:void writeTo(com.batch.android.msgpack.core.MessagePacker):499:502 -> a + com.batch.android.msgpack.value.IntegerValue asIntegerValue() -> c + 1:1:com.batch.android.msgpack.value.ValueType getValueType():403:403 -> m + 1:4:boolean isInIntRange():437:440 -> p + 1:1:com.batch.android.msgpack.value.ImmutableValue immutableValue():399:399 -> s + 1:4:short asShort():466:469 -> t + 5:5:short asShort():467:467 -> t + 1:1:com.batch.android.msgpack.core.MessageFormat mostSuccinctMessageFormat():453:453 -> u + 1:4:boolean isInShortRange():429:432 -> y +com.batch.android.msgpack.value.Variable$MapValueAccessor -> com.batch.android.q0.a0$k: +# {"id":"sourceFile","fileName":"Variable.java"} + com.batch.android.msgpack.value.Variable this$0 -> b + 1:1:void (com.batch.android.msgpack.value.Variable):757:757 -> + 2:2:void (com.batch.android.msgpack.value.Variable,com.batch.android.msgpack.value.Variable$1):757:757 -> + 1:1:java.util.Map map():812:812 -> H + 1:1:com.batch.android.msgpack.value.ImmutableMapValue immutableValue():771:771 -> Z + 1:5:void writeTo(com.batch.android.msgpack.core.MessagePacker):817:821 -> a + com.batch.android.msgpack.value.MapValue asMapValue() -> d + 1:1:java.util.Set entrySet():786:786 -> entrySet + 1:1:java.util.Set keySet():781:781 -> keySet + 1:1:com.batch.android.msgpack.value.ValueType getValueType():761:761 -> m + 1:1:com.batch.android.msgpack.value.ImmutableValue immutableValue():757:757 -> s + 1:1:int size():776:776 -> size + 1:1:java.util.Collection values():791:791 -> values + 1:9:com.batch.android.msgpack.value.Value[] getKeyValueArray():796:804 -> x +com.batch.android.msgpack.value.Variable$NilValueAccessor -> com.batch.android.q0.a0$l: +# {"id":"sourceFile","fileName":"Variable.java"} + com.batch.android.msgpack.value.Variable this$0 -> b + 1:1:void (com.batch.android.msgpack.value.Variable):228:228 -> + 2:2:void (com.batch.android.msgpack.value.Variable,com.batch.android.msgpack.value.Variable$1):228:228 -> + 1:1:com.batch.android.msgpack.value.ImmutableNilValue immutableValue():242:242 -> Z + 1:1:void writeTo(com.batch.android.msgpack.core.MessagePacker):247:247 -> a + com.batch.android.msgpack.value.NilValue asNilValue() -> b + 1:1:com.batch.android.msgpack.value.ValueType getValueType():232:232 -> m + 1:1:com.batch.android.msgpack.value.ImmutableValue immutableValue():228:228 -> s +com.batch.android.msgpack.value.Variable$StringValueAccessor -> com.batch.android.q0.a0$m: +# {"id":"sourceFile","fileName":"Variable.java"} + com.batch.android.msgpack.value.Variable this$0 -> c + 1:1:void (com.batch.android.msgpack.value.Variable):653:653 -> + 2:2:void (com.batch.android.msgpack.value.Variable,com.batch.android.msgpack.value.Variable$1):653:653 -> + 1:1:com.batch.android.msgpack.value.ImmutableStringValue immutableValue():667:667 -> Z + 1:3:void writeTo(com.batch.android.msgpack.core.MessagePacker):672:674 -> a + com.batch.android.msgpack.value.StringValue asStringValue() -> g + 1:1:com.batch.android.msgpack.value.ValueType getValueType():657:657 -> m + 1:1:com.batch.android.msgpack.value.ImmutableValue immutableValue():653:653 -> s +com.batch.android.msgpack.value.Variable$Type -> com.batch.android.q0.a0$n: +# {"id":"sourceFile","fileName":"Variable.java"} + com.batch.android.msgpack.value.Variable$Type EXTENSION -> k + com.batch.android.msgpack.value.Variable$Type[] $VALUES -> l + com.batch.android.msgpack.value.ValueType valueType -> a + com.batch.android.msgpack.value.Variable$Type LIST -> i + com.batch.android.msgpack.value.Variable$Type MAP -> j + com.batch.android.msgpack.value.Variable$Type BYTE_ARRAY -> g + com.batch.android.msgpack.value.Variable$Type RAW_STRING -> h + com.batch.android.msgpack.value.Variable$Type BIG_INTEGER -> e + com.batch.android.msgpack.value.Variable$Type DOUBLE -> f + com.batch.android.msgpack.value.Variable$Type BOOLEAN -> c + com.batch.android.msgpack.value.Variable$Type LONG -> d + com.batch.android.msgpack.value.Variable$Type NULL -> b + 1:10:void ():174:183 -> + 11:11:void ():173:173 -> + 1:2:void (java.lang.String,int,com.batch.android.msgpack.value.ValueType):187:188 -> + 1:1:com.batch.android.msgpack.value.Variable$Type[] $values():173:173 -> a + 1:1:com.batch.android.msgpack.value.ValueType getValueType():192:192 -> b + 1:1:com.batch.android.msgpack.value.Variable$Type valueOf(java.lang.String):173:173 -> valueOf + 1:1:com.batch.android.msgpack.value.Variable$Type[] values():173:173 -> values +com.batch.android.msgpack.value.impl.AbstractImmutableRawValue -> com.batch.android.r0.a: +# {"id":"sourceFile","fileName":"AbstractImmutableRawValue.java"} + byte[] data -> a + char[] HEX_TABLE -> d + java.nio.charset.CharacterCodingException codingException -> c + java.lang.String decodedStringCache -> b + 1:1:void ():158:158 -> + 1:2:void (byte[]):33:34 -> + 3:5:void (java.lang.String):37:39 -> + 1:7:java.lang.String asString():59:65 -> A + 8:8:java.lang.String asString():63:63 -> A + 1:1:boolean isBinaryValue():27:27 -> C + 1:1:java.nio.ByteBuffer asByteBuffer():54:54 -> D + 1:1:boolean isNilValue():27:27 -> E + 1:1:boolean isNumberValue():27:27 -> L + 1:1:boolean isArrayValue():27:27 -> N + 1:1:boolean isRawValue():27:27 -> O + 1:1:byte[] asByteArray():49:49 -> P + 1:1:boolean isExtensionValue():27:27 -> Q + 1:1:boolean isMapValue():27:27 -> S + 1:1:boolean isFloatValue():27:27 -> T + 1:1:boolean isBooleanValue():27:27 -> W + 1:3:java.lang.String toJson():71:73 -> X + 1:1:com.batch.android.msgpack.value.ImmutableExtensionValue asExtensionValue():27:27 -> Z + 1:1:com.batch.android.msgpack.value.ImmutableArrayValue asArrayValue():27:27 -> a + 2:24:void appendJsonString(java.lang.StringBuilder,java.lang.String):111:133 -> a + 25:31:void appendJsonString(java.lang.StringBuilder,java.lang.String):120:126 -> a + 32:60:void appendJsonString(java.lang.StringBuilder,java.lang.String):117:145 -> a + 61:77:void appendJsonString(java.lang.StringBuilder,java.lang.String):139:155 -> a + 78:82:void escapeChar(java.lang.StringBuilder,int):161:165 -> a + 1:1:com.batch.android.msgpack.value.ImmutableNumberValue asNumberValue():27:27 -> a0 + 1:1:com.batch.android.msgpack.value.ImmutableNilValue asNilValue():27:27 -> b + 1:23:void decodeString():77:99 -> b0 + 24:28:void decodeString():95:99 -> b0 + 1:1:com.batch.android.msgpack.value.ImmutableIntegerValue asIntegerValue():27:27 -> c + 1:1:com.batch.android.msgpack.value.ImmutableMapValue asMapValue():27:27 -> d + 1:1:com.batch.android.msgpack.value.ImmutableBinaryValue asBinaryValue():27:27 -> f + 1:1:com.batch.android.msgpack.value.ImmutableStringValue asStringValue():27:27 -> g + 1:1:com.batch.android.msgpack.value.ImmutableRawValue asRawValue():0:0 -> h + 2:2:com.batch.android.msgpack.value.RawValue asRawValue():27:27 -> h + 1:1:com.batch.android.msgpack.value.ImmutableBooleanValue asBooleanValue():27:27 -> i + 1:1:com.batch.android.msgpack.value.ImmutableFloatValue asFloatValue():27:27 -> j + 1:4:java.lang.String toString():104:107 -> toString + 1:1:boolean isStringValue():27:27 -> v + 1:1:boolean isIntegerValue():27:27 -> w +com.batch.android.msgpack.value.impl.AbstractImmutableValue -> com.batch.android.r0.b: +# {"id":"sourceFile","fileName":"AbstractImmutableValue.java"} + 1:1:void ():32:32 -> + 1:1:boolean isBinaryValue():66:66 -> C + 1:1:boolean isNilValue():36:36 -> E + 1:1:boolean isNumberValue():46:46 -> L + 1:1:boolean isArrayValue():76:76 -> N + 1:1:boolean isRawValue():61:61 -> O + 1:1:boolean isExtensionValue():86:86 -> Q + 1:1:com.batch.android.msgpack.value.NumberValue asNumberValue():32:32 -> R + 1:1:boolean isMapValue():81:81 -> S + 1:1:boolean isFloatValue():56:56 -> T + 1:1:boolean isBooleanValue():41:41 -> W + 1:1:com.batch.android.msgpack.value.ImmutableExtensionValue asExtensionValue():141:141 -> Z + 1:1:com.batch.android.msgpack.value.ArrayValue asArrayValue():32:32 -> a + 2:2:com.batch.android.msgpack.value.ImmutableArrayValue asArrayValue():131:131 -> a + 1:1:com.batch.android.msgpack.value.ImmutableNumberValue asNumberValue():101:101 -> a0 + 1:1:com.batch.android.msgpack.value.NilValue asNilValue():32:32 -> b + 2:2:com.batch.android.msgpack.value.ImmutableNilValue asNilValue():91:91 -> b + 1:1:com.batch.android.msgpack.value.IntegerValue asIntegerValue():32:32 -> c + 2:2:com.batch.android.msgpack.value.ImmutableIntegerValue asIntegerValue():106:106 -> c + 1:1:com.batch.android.msgpack.value.MapValue asMapValue():32:32 -> d + 2:2:com.batch.android.msgpack.value.ImmutableMapValue asMapValue():136:136 -> d + 1:1:com.batch.android.msgpack.value.BinaryValue asBinaryValue():32:32 -> f + 2:2:com.batch.android.msgpack.value.ImmutableBinaryValue asBinaryValue():121:121 -> f + 1:1:com.batch.android.msgpack.value.StringValue asStringValue():32:32 -> g + 2:2:com.batch.android.msgpack.value.ImmutableStringValue asStringValue():126:126 -> g + 1:1:com.batch.android.msgpack.value.RawValue asRawValue():32:32 -> h + 2:2:com.batch.android.msgpack.value.ImmutableRawValue asRawValue():116:116 -> h + 1:1:com.batch.android.msgpack.value.BooleanValue asBooleanValue():32:32 -> i + 2:2:com.batch.android.msgpack.value.ImmutableBooleanValue asBooleanValue():96:96 -> i + 1:1:com.batch.android.msgpack.value.FloatValue asFloatValue():32:32 -> j + 2:2:com.batch.android.msgpack.value.ImmutableFloatValue asFloatValue():111:111 -> j + 1:1:com.batch.android.msgpack.value.ExtensionValue asExtensionValue():32:32 -> q + 1:1:boolean isStringValue():71:71 -> v + 1:1:boolean isIntegerValue():51:51 -> w +com.batch.android.msgpack.value.impl.ImmutableArrayValueImpl -> com.batch.android.r0.c: +# {"id":"sourceFile","fileName":"ImmutableArrayValueImpl.java"} + com.batch.android.msgpack.value.impl.ImmutableArrayValueImpl EMPTY -> b + com.batch.android.msgpack.value.Value[] array -> a + 1:1:void ():37:37 -> + 1:2:void (com.batch.android.msgpack.value.Value[]):45:46 -> + 1:1:boolean isBinaryValue():35:35 -> C + 1:1:boolean isNilValue():35:35 -> E + 1:1:boolean isNumberValue():35:35 -> L + 1:1:boolean isArrayValue():35:35 -> N + 1:1:boolean isRawValue():35:35 -> O + 1:1:boolean isExtensionValue():35:35 -> Q + 1:1:boolean isMapValue():35:35 -> S + 1:1:boolean isFloatValue():35:35 -> T + 1:1:boolean isBooleanValue():35:35 -> W + 1:12:java.lang.String toJson():145:156 -> X + 1:1:com.batch.android.msgpack.value.ImmutableExtensionValue asExtensionValue():35:35 -> Z + 1:1:com.batch.android.msgpack.value.ImmutableArrayValue asArrayValue():0:0 -> a + 2:2:com.batch.android.msgpack.value.ArrayValue asArrayValue():35:35 -> a + 3:6:com.batch.android.msgpack.value.Value getOrNilValue(int):76:79 -> a + 7:9:void writeTo(com.batch.android.msgpack.core.MessagePacker):94:96 -> a + 10:13:void appendString(java.lang.StringBuilder,com.batch.android.msgpack.value.Value):176:179 -> a + 1:1:com.batch.android.msgpack.value.ImmutableNumberValue asNumberValue():35:35 -> a0 + 1:1:com.batch.android.msgpack.value.ImmutableNilValue asNilValue():35:35 -> b + 1:1:com.batch.android.msgpack.value.ImmutableArrayValue empty():40:40 -> b0 + 1:1:com.batch.android.msgpack.value.ImmutableIntegerValue asIntegerValue():35:35 -> c + com.batch.android.msgpack.value.ImmutableArrayValue immutableValue() -> c0 + 1:1:com.batch.android.msgpack.value.ImmutableMapValue asMapValue():35:35 -> d + 1:20:boolean equals(java.lang.Object):105:124 -> equals + 1:1:com.batch.android.msgpack.value.ImmutableBinaryValue asBinaryValue():35:35 -> f + 1:1:com.batch.android.msgpack.value.ImmutableStringValue asStringValue():35:35 -> g + 1:1:com.batch.android.msgpack.value.Value get(int):71:71 -> get + 1:1:com.batch.android.msgpack.value.ImmutableRawValue asRawValue():35:35 -> h + 1:3:int hashCode():136:138 -> hashCode + 1:1:com.batch.android.msgpack.value.ImmutableBooleanValue asBooleanValue():35:35 -> i + 1:1:java.util.Iterator iterator():84:84 -> iterator + 1:1:com.batch.android.msgpack.value.ImmutableFloatValue asFloatValue():35:35 -> j + 1:1:java.util.List list():89:89 -> l + 1:1:com.batch.android.msgpack.value.ValueType getValueType():51:51 -> m + 1:1:com.batch.android.msgpack.value.ImmutableValue immutableValue():35:35 -> s + 1:1:int size():66:66 -> size + 1:12:java.lang.String toString():161:172 -> toString + 1:1:boolean isStringValue():35:35 -> v + 1:1:boolean isIntegerValue():35:35 -> w +com.batch.android.msgpack.value.impl.ImmutableArrayValueImpl$ImmutableArrayValueList -> com.batch.android.r0.c$a: +# {"id":"sourceFile","fileName":"ImmutableArrayValueImpl.java"} + com.batch.android.msgpack.value.Value[] array -> a + 1:2:void (com.batch.android.msgpack.value.Value[]):187:188 -> + 1:1:java.lang.Object get(int):183:183 -> get + 2:2:com.batch.android.msgpack.value.Value get(int):193:193 -> get + 1:1:int size():198:198 -> size +com.batch.android.msgpack.value.impl.ImmutableArrayValueImpl$Ite -> com.batch.android.r0.c$b: +# {"id":"sourceFile","fileName":"ImmutableArrayValueImpl.java"} + int index -> b + com.batch.android.msgpack.value.Value[] array -> a + 1:3:void (com.batch.android.msgpack.value.Value[]):207:209 -> + 1:6:com.batch.android.msgpack.value.Value next():219:224 -> a + 7:7:com.batch.android.msgpack.value.Value next():221:221 -> a + 1:1:boolean hasNext():214:214 -> hasNext + 1:1:java.lang.Object next():202:202 -> next + 1:1:void remove():229:229 -> remove +com.batch.android.msgpack.value.impl.ImmutableBigIntegerValueImpl -> com.batch.android.r0.d: +# {"id":"sourceFile","fileName":"ImmutableBigIntegerValueImpl.java"} + java.math.BigInteger INT_MIN -> f + java.math.BigInteger SHORT_MAX -> e + java.math.BigInteger LONG_MIN -> h + java.math.BigInteger INT_MAX -> g + java.math.BigInteger BYTE_MIN -> b + java.math.BigInteger value -> a + java.math.BigInteger SHORT_MIN -> d + java.math.BigInteger BYTE_MAX -> c + java.math.BigInteger LONG_MAX -> i + 1:8:void ():56:63 -> + 1:2:void (java.math.BigInteger):52:53 -> + 1:1:java.math.BigInteger asBigInteger():179:179 -> B + 1:1:boolean isBinaryValue():34:34 -> C + 1:1:boolean isNilValue():34:34 -> E + 1:1:java.math.BigInteger toBigInteger():107:107 -> F + 1:1:int toInt():97:97 -> G + 1:4:long asLong():171:174 -> I + 5:5:long asLong():172:172 -> I + 1:4:byte asByte():147:150 -> J + 5:5:byte asByte():148:148 -> J + 1:1:boolean isInLongRange():137:137 -> K + 1:1:boolean isNumberValue():34:34 -> L + 1:1:boolean isArrayValue():34:34 -> N + 1:1:boolean isRawValue():34:34 -> O + 1:1:boolean isExtensionValue():34:34 -> Q + 1:1:com.batch.android.msgpack.value.NumberValue asNumberValue():34:34 -> R + 1:1:boolean isMapValue():34:34 -> S + 1:1:boolean isFloatValue():34:34 -> T + 1:1:boolean isInByteRange():122:122 -> U + 1:4:int asInt():163:166 -> V + 5:5:int asInt():164:164 -> V + 1:1:boolean isBooleanValue():34:34 -> W + 1:1:java.lang.String toJson():217:217 -> X + 1:1:long toLong():102:102 -> Y + 1:1:com.batch.android.msgpack.value.ImmutableExtensionValue asExtensionValue():34:34 -> Z + 1:1:com.batch.android.msgpack.value.ImmutableArrayValue asArrayValue():34:34 -> a + 2:11:com.batch.android.msgpack.core.MessageFormat mostSuccinctMessageFormat(com.batch.android.msgpack.value.IntegerValue):37:46 -> a + 12:12:void writeTo(com.batch.android.msgpack.core.MessagePacker):184:184 -> a + com.batch.android.msgpack.value.ImmutableNumberValue asNumberValue() -> a0 + 1:1:com.batch.android.msgpack.value.ImmutableNilValue asNilValue():34:34 -> b + com.batch.android.msgpack.value.ImmutableIntegerValue immutableValue() -> b0 + 1:1:com.batch.android.msgpack.value.ImmutableIntegerValue asIntegerValue():0:0 -> c + 2:2:com.batch.android.msgpack.value.IntegerValue asIntegerValue():34:34 -> c + 1:1:com.batch.android.msgpack.value.ImmutableMapValue asMapValue():34:34 -> d + 1:10:boolean equals(java.lang.Object):192:201 -> equals + 1:1:com.batch.android.msgpack.value.ImmutableBinaryValue asBinaryValue():34:34 -> f + 1:1:com.batch.android.msgpack.value.ImmutableStringValue asStringValue():34:34 -> g + 1:1:com.batch.android.msgpack.value.ImmutableRawValue asRawValue():34:34 -> h + 1:7:int hashCode():206:212 -> hashCode + 1:1:com.batch.android.msgpack.value.ImmutableBooleanValue asBooleanValue():34:34 -> i + 1:1:com.batch.android.msgpack.value.ImmutableFloatValue asFloatValue():34:34 -> j + 1:1:com.batch.android.msgpack.value.ValueType getValueType():67:67 -> m + 1:1:float toFloat():112:112 -> n + 1:1:double toDouble():117:117 -> o + 1:1:boolean isInIntRange():132:132 -> p + 1:1:byte toByte():87:87 -> r + 1:1:com.batch.android.msgpack.value.ImmutableValue immutableValue():34:34 -> s + 1:4:short asShort():155:158 -> t + 5:5:short asShort():156:156 -> t + 1:1:java.lang.String toString():222:222 -> toString + 1:1:com.batch.android.msgpack.core.MessageFormat mostSuccinctMessageFormat():142:142 -> u + 1:1:boolean isStringValue():34:34 -> v + 1:1:boolean isIntegerValue():34:34 -> w + 1:1:boolean isInShortRange():127:127 -> y + 1:1:short toShort():92:92 -> z +com.batch.android.msgpack.value.impl.ImmutableBinaryValueImpl -> com.batch.android.r0.e: +# {"id":"sourceFile","fileName":"ImmutableBinaryValueImpl.java"} + 1:1:void (byte[]):34:34 -> + 1:2:void writeTo(com.batch.android.msgpack.core.MessagePacker):54:55 -> a + com.batch.android.msgpack.value.ImmutableBinaryValue immutableValue() -> c0 + 1:13:boolean equals(java.lang.Object):63:75 -> equals + 1:1:com.batch.android.msgpack.value.ImmutableBinaryValue asBinaryValue():0:0 -> f + 2:2:com.batch.android.msgpack.value.BinaryValue asBinaryValue():31:31 -> f + 1:1:int hashCode():81:81 -> hashCode + 1:1:com.batch.android.msgpack.value.ValueType getValueType():39:39 -> m + 1:1:com.batch.android.msgpack.value.ImmutableValue immutableValue():31:31 -> s +com.batch.android.msgpack.value.impl.ImmutableBooleanValueImpl -> com.batch.android.r0.f: +# {"id":"sourceFile","fileName":"ImmutableBooleanValueImpl.java"} + com.batch.android.msgpack.value.ImmutableBooleanValue FALSE -> c + com.batch.android.msgpack.value.ImmutableBooleanValue TRUE -> b + boolean value -> a + 1:2:void ():33:34 -> + 1:2:void (boolean):38:39 -> + 1:1:boolean isBinaryValue():31:31 -> C + 1:1:boolean isNilValue():31:31 -> E + 1:1:boolean isNumberValue():31:31 -> L + 1:1:boolean getBoolean():59:59 -> M + 1:1:boolean isArrayValue():31:31 -> N + 1:1:boolean isRawValue():31:31 -> O + 1:1:boolean isExtensionValue():31:31 -> Q + 1:1:boolean isMapValue():31:31 -> S + 1:1:boolean isFloatValue():31:31 -> T + 1:1:boolean isBooleanValue():31:31 -> W + 1:1:java.lang.String toJson():94:94 -> X + 1:1:com.batch.android.msgpack.value.ImmutableExtensionValue asExtensionValue():31:31 -> Z + 1:1:com.batch.android.msgpack.value.ImmutableArrayValue asArrayValue():31:31 -> a + 2:2:void writeTo(com.batch.android.msgpack.core.MessagePacker):64:64 -> a + 1:1:com.batch.android.msgpack.value.ImmutableNumberValue asNumberValue():31:31 -> a0 + 1:1:com.batch.android.msgpack.value.ImmutableNilValue asNilValue():31:31 -> b + com.batch.android.msgpack.value.ImmutableBooleanValue immutableValue() -> b0 + 1:1:com.batch.android.msgpack.value.ImmutableIntegerValue asIntegerValue():31:31 -> c + 1:1:com.batch.android.msgpack.value.ImmutableMapValue asMapValue():31:31 -> d + 1:9:boolean equals(java.lang.Object):72:80 -> equals + 1:1:com.batch.android.msgpack.value.ImmutableBinaryValue asBinaryValue():31:31 -> f + 1:1:com.batch.android.msgpack.value.ImmutableStringValue asStringValue():31:31 -> g + 1:1:com.batch.android.msgpack.value.ImmutableRawValue asRawValue():31:31 -> h + 1:1:int hashCode():85:85 -> hashCode + 1:1:com.batch.android.msgpack.value.ImmutableBooleanValue asBooleanValue():0:0 -> i + 2:2:com.batch.android.msgpack.value.BooleanValue asBooleanValue():31:31 -> i + 1:1:com.batch.android.msgpack.value.ImmutableFloatValue asFloatValue():31:31 -> j + 1:1:com.batch.android.msgpack.value.ValueType getValueType():44:44 -> m + 1:1:com.batch.android.msgpack.value.ImmutableValue immutableValue():31:31 -> s + 1:1:java.lang.String toString():99:99 -> toString + 1:1:boolean isStringValue():31:31 -> v + 1:1:boolean isIntegerValue():31:31 -> w +com.batch.android.msgpack.value.impl.ImmutableDoubleValueImpl -> com.batch.android.r0.g: +# {"id":"sourceFile","fileName":"ImmutableDoubleValueImpl.java"} + double value -> a + 1:2:void (double):36:37 -> + 1:1:boolean isBinaryValue():32:32 -> C + 1:1:boolean isNilValue():32:32 -> E + 1:1:java.math.BigInteger toBigInteger():82:82 -> F + 1:1:int toInt():72:72 -> G + 1:1:boolean isNumberValue():32:32 -> L + 1:1:boolean isArrayValue():32:32 -> N + 1:1:boolean isRawValue():32:32 -> O + 1:1:boolean isExtensionValue():32:32 -> Q + 1:1:com.batch.android.msgpack.value.NumberValue asNumberValue():32:32 -> R + 1:1:boolean isMapValue():32:32 -> S + 1:1:boolean isFloatValue():32:32 -> T + 1:1:boolean isBooleanValue():32:32 -> W + 1:4:java.lang.String toJson():124:127 -> X + 5:5:java.lang.String toJson():125:125 -> X + 1:1:long toLong():77:77 -> Y + 1:1:com.batch.android.msgpack.value.ImmutableExtensionValue asExtensionValue():32:32 -> Z + 1:1:com.batch.android.msgpack.value.ImmutableArrayValue asArrayValue():32:32 -> a + 2:2:void writeTo(com.batch.android.msgpack.core.MessagePacker):97:97 -> a + com.batch.android.msgpack.value.ImmutableNumberValue asNumberValue() -> a0 + 1:1:com.batch.android.msgpack.value.ImmutableNilValue asNilValue():32:32 -> b + com.batch.android.msgpack.value.impl.ImmutableDoubleValueImpl immutableValue() -> b0 + 1:1:com.batch.android.msgpack.value.ImmutableIntegerValue asIntegerValue():32:32 -> c + 1:1:com.batch.android.msgpack.value.ImmutableMapValue asMapValue():32:32 -> d + 1:9:boolean equals(java.lang.Object):105:113 -> equals + 1:1:com.batch.android.msgpack.value.ImmutableBinaryValue asBinaryValue():32:32 -> f + 1:1:com.batch.android.msgpack.value.ImmutableStringValue asStringValue():32:32 -> g + 1:1:com.batch.android.msgpack.value.ImmutableRawValue asRawValue():32:32 -> h + 1:1:int hashCode():118:118 -> hashCode + 1:1:com.batch.android.msgpack.value.ImmutableBooleanValue asBooleanValue():32:32 -> i + 1:1:com.batch.android.msgpack.value.ImmutableFloatValue asFloatValue():0:0 -> j + 2:2:com.batch.android.msgpack.value.FloatValue asFloatValue():32:32 -> j + 1:1:com.batch.android.msgpack.value.ValueType getValueType():42:42 -> m + 1:1:float toFloat():87:87 -> n + 1:1:double toDouble():92:92 -> o + 1:1:byte toByte():62:62 -> r + 1:1:com.batch.android.msgpack.value.ImmutableValue immutableValue():32:32 -> s + 1:1:java.lang.String toString():133:133 -> toString + 1:1:boolean isStringValue():32:32 -> v + 1:1:boolean isIntegerValue():32:32 -> w + 1:1:short toShort():67:67 -> z +com.batch.android.msgpack.value.impl.ImmutableExtensionValueImpl -> com.batch.android.r0.h: +# {"id":"sourceFile","fileName":"ImmutableExtensionValueImpl.java"} + byte[] data -> b + byte type -> a + 1:3:void (byte,byte[]):36:38 -> + 1:1:boolean isBinaryValue():31:31 -> C + 1:1:boolean isNilValue():31:31 -> E + 1:1:boolean isNumberValue():31:31 -> L + 1:1:boolean isArrayValue():31:31 -> N + 1:1:boolean isRawValue():31:31 -> O + 1:1:boolean isExtensionValue():31:31 -> Q + 1:1:boolean isMapValue():31:31 -> S + 1:1:boolean isFloatValue():31:31 -> T + 1:1:boolean isBooleanValue():31:31 -> W + 1:9:java.lang.String toJson():100:108 -> X + com.batch.android.msgpack.value.ImmutableExtensionValue asExtensionValue() -> Z + 1:1:com.batch.android.msgpack.value.ImmutableArrayValue asArrayValue():31:31 -> a + 2:3:void writeTo(com.batch.android.msgpack.core.MessagePacker):68:69 -> a + 1:1:com.batch.android.msgpack.value.ImmutableNumberValue asNumberValue():31:31 -> a0 + 1:1:com.batch.android.msgpack.value.ImmutableNilValue asNilValue():31:31 -> b + com.batch.android.msgpack.value.ImmutableExtensionValue immutableValue() -> b0 + 1:1:com.batch.android.msgpack.value.ImmutableIntegerValue asIntegerValue():31:31 -> c + 1:1:com.batch.android.msgpack.value.ImmutableMapValue asMapValue():31:31 -> d + 1:1:byte[] getData():63:63 -> e + 1:10:boolean equals(java.lang.Object):77:86 -> equals + 1:1:com.batch.android.msgpack.value.ImmutableBinaryValue asBinaryValue():31:31 -> f + 1:1:com.batch.android.msgpack.value.ImmutableStringValue asStringValue():31:31 -> g + 1:1:com.batch.android.msgpack.value.ImmutableRawValue asRawValue():31:31 -> h + 1:2:int hashCode():91:92 -> hashCode + 1:1:com.batch.android.msgpack.value.ImmutableBooleanValue asBooleanValue():31:31 -> i + 1:1:com.batch.android.msgpack.value.ImmutableFloatValue asFloatValue():31:31 -> j + 1:1:byte getType():58:58 -> k + 1:1:com.batch.android.msgpack.value.ValueType getValueType():43:43 -> m + 1:1:com.batch.android.msgpack.value.ExtensionValue asExtensionValue():31:31 -> q + 1:1:com.batch.android.msgpack.value.ImmutableValue immutableValue():31:31 -> s + 1:9:java.lang.String toString():113:121 -> toString + 1:1:boolean isStringValue():31:31 -> v + 1:1:boolean isIntegerValue():31:31 -> w +com.batch.android.msgpack.value.impl.ImmutableLongValueImpl -> com.batch.android.r0.i: +# {"id":"sourceFile","fileName":"ImmutableLongValueImpl.java"} + long INT_MIN -> f + long SHORT_MAX -> e + long INT_MAX -> g + long BYTE_MIN -> b + long value -> a + long SHORT_MIN -> d + long BYTE_MAX -> c + 1:2:void (long):38:39 -> + 1:1:java.math.BigInteger asBigInteger():160:160 -> B + 1:1:boolean isBinaryValue():34:34 -> C + 1:1:boolean isNilValue():34:34 -> E + 1:1:java.math.BigInteger toBigInteger():91:91 -> F + 1:1:int toInt():81:81 -> G + 1:1:long asLong():155:155 -> I + 1:4:byte asByte():131:134 -> J + 5:5:byte asByte():132:132 -> J + boolean isInLongRange() -> K + 1:1:boolean isNumberValue():34:34 -> L + 1:1:boolean isArrayValue():34:34 -> N + 1:1:boolean isRawValue():34:34 -> O + 1:1:boolean isExtensionValue():34:34 -> Q + 1:1:com.batch.android.msgpack.value.NumberValue asNumberValue():34:34 -> R + 1:1:boolean isMapValue():34:34 -> S + 1:1:boolean isFloatValue():34:34 -> T + 1:1:boolean isInByteRange():106:106 -> U + 1:4:int asInt():147:150 -> V + 5:5:int asInt():148:148 -> V + 1:1:boolean isBooleanValue():34:34 -> W + 1:1:java.lang.String toJson():199:199 -> X + 1:1:long toLong():86:86 -> Y + 1:1:com.batch.android.msgpack.value.ImmutableExtensionValue asExtensionValue():34:34 -> Z + 1:1:com.batch.android.msgpack.value.ImmutableArrayValue asArrayValue():34:34 -> a + 2:2:void writeTo(com.batch.android.msgpack.core.MessagePacker):165:165 -> a + com.batch.android.msgpack.value.ImmutableNumberValue asNumberValue() -> a0 + 1:1:com.batch.android.msgpack.value.ImmutableNilValue asNilValue():34:34 -> b + com.batch.android.msgpack.value.ImmutableIntegerValue immutableValue() -> b0 + 1:1:com.batch.android.msgpack.value.ImmutableIntegerValue asIntegerValue():0:0 -> c + 2:2:com.batch.android.msgpack.value.IntegerValue asIntegerValue():34:34 -> c + 1:1:com.batch.android.msgpack.value.ImmutableMapValue asMapValue():34:34 -> d + 1:13:boolean equals(java.lang.Object):173:185 -> equals + 1:1:com.batch.android.msgpack.value.ImmutableBinaryValue asBinaryValue():34:34 -> f + 1:1:com.batch.android.msgpack.value.ImmutableStringValue asStringValue():34:34 -> g + 1:1:com.batch.android.msgpack.value.ImmutableRawValue asRawValue():34:34 -> h + 1:1:int hashCode():190:190 -> hashCode + 1:1:com.batch.android.msgpack.value.ImmutableBooleanValue asBooleanValue():34:34 -> i + 1:1:com.batch.android.msgpack.value.ImmutableFloatValue asFloatValue():34:34 -> j + 1:1:com.batch.android.msgpack.value.ValueType getValueType():51:51 -> m + 1:1:float toFloat():96:96 -> n + 1:1:double toDouble():101:101 -> o + 1:1:boolean isInIntRange():116:116 -> p + 1:1:byte toByte():71:71 -> r + 1:1:com.batch.android.msgpack.value.ImmutableValue immutableValue():34:34 -> s + 1:4:short asShort():139:142 -> t + 5:5:short asShort():140:140 -> t + 1:1:java.lang.String toString():204:204 -> toString + 1:1:com.batch.android.msgpack.core.MessageFormat mostSuccinctMessageFormat():126:126 -> u + 1:1:boolean isStringValue():34:34 -> v + 1:1:boolean isIntegerValue():34:34 -> w + 1:1:boolean isInShortRange():111:111 -> y + 1:1:short toShort():76:76 -> z +com.batch.android.msgpack.value.impl.ImmutableMapValueImpl -> com.batch.android.r0.j: +# {"id":"sourceFile","fileName":"ImmutableMapValueImpl.java"} + com.batch.android.msgpack.value.impl.ImmutableMapValueImpl EMPTY -> b + com.batch.android.msgpack.value.Value[] kvs -> a + 1:1:void ():41:41 -> + 1:2:void (com.batch.android.msgpack.value.Value[]):49:50 -> + 1:1:boolean isBinaryValue():39:39 -> C + 1:1:boolean isNilValue():39:39 -> E + 1:1:java.util.Map map():95:95 -> H + 1:1:boolean isNumberValue():39:39 -> L + 1:1:boolean isArrayValue():39:39 -> N + 1:1:boolean isRawValue():39:39 -> O + 1:1:boolean isExtensionValue():39:39 -> Q + 1:1:boolean isMapValue():39:39 -> S + 1:1:boolean isFloatValue():39:39 -> T + 1:1:boolean isBooleanValue():39:39 -> W + 1:16:java.lang.String toJson():134:149 -> X + 1:1:com.batch.android.msgpack.value.ImmutableExtensionValue asExtensionValue():39:39 -> Z + 1:1:com.batch.android.msgpack.value.ImmutableArrayValue asArrayValue():39:39 -> a + 2:4:void writeTo(com.batch.android.msgpack.core.MessagePacker):100:102 -> a + 5:8:void appendJsonKey(java.lang.StringBuilder,com.batch.android.msgpack.value.Value):153:156 -> a + 1:1:com.batch.android.msgpack.value.ImmutableNumberValue asNumberValue():39:39 -> a0 + 1:1:com.batch.android.msgpack.value.ImmutableNilValue asNilValue():39:39 -> b + 2:5:void appendString(java.lang.StringBuilder,com.batch.android.msgpack.value.Value):181:184 -> b + 1:1:com.batch.android.msgpack.value.ImmutableMapValue empty():44:44 -> b0 + 1:1:com.batch.android.msgpack.value.ImmutableIntegerValue asIntegerValue():39:39 -> c + com.batch.android.msgpack.value.ImmutableMapValue immutableValue() -> c0 + 1:1:com.batch.android.msgpack.value.ImmutableMapValue asMapValue():0:0 -> d + 2:2:com.batch.android.msgpack.value.MapValue asMapValue():39:39 -> d + 1:1:java.util.Set entrySet():85:85 -> entrySet + 1:10:boolean equals(java.lang.Object):111:120 -> equals + 1:1:com.batch.android.msgpack.value.ImmutableBinaryValue asBinaryValue():39:39 -> f + 1:1:com.batch.android.msgpack.value.ImmutableStringValue asStringValue():39:39 -> g + 1:1:com.batch.android.msgpack.value.ImmutableRawValue asRawValue():39:39 -> h + 1:2:int hashCode():126:127 -> hashCode + 1:1:com.batch.android.msgpack.value.ImmutableBooleanValue asBooleanValue():39:39 -> i + 1:1:com.batch.android.msgpack.value.ImmutableFloatValue asFloatValue():39:39 -> j + 1:1:java.util.Set keySet():80:80 -> keySet + 1:1:com.batch.android.msgpack.value.ValueType getValueType():55:55 -> m + 1:1:com.batch.android.msgpack.value.ImmutableValue immutableValue():39:39 -> s + 1:1:int size():75:75 -> size + 1:16:java.lang.String toString():162:177 -> toString + 1:1:boolean isStringValue():39:39 -> v + 1:1:java.util.Collection values():90:90 -> values + 1:1:boolean isIntegerValue():39:39 -> w + 1:1:com.batch.android.msgpack.value.Value[] getKeyValueArray():70:70 -> x +com.batch.android.msgpack.value.impl.ImmutableMapValueImpl$EntryIterator -> com.batch.android.r0.j$a: +# {"id":"sourceFile","fileName":"ImmutableMapValueImpl.java"} + int index -> b + com.batch.android.msgpack.value.Value[] kvs -> a + 1:3:void (com.batch.android.msgpack.value.Value[],int):299:301 -> + 1:6:com.batch.android.msgpack.value.Value next():311:316 -> a + 7:7:com.batch.android.msgpack.value.Value next():313:313 -> a + 1:1:boolean hasNext():306:306 -> hasNext + 1:1:java.lang.Object next():294:294 -> next + 1:1:void remove():321:321 -> remove +com.batch.android.msgpack.value.impl.ImmutableMapValueImpl$EntrySet -> com.batch.android.r0.j$b: +# {"id":"sourceFile","fileName":"ImmutableMapValueImpl.java"} + com.batch.android.msgpack.value.Value[] kvs -> a + 1:2:void (com.batch.android.msgpack.value.Value[]):206:207 -> + 1:1:java.util.Iterator iterator():217:217 -> iterator + 1:1:int size():212:212 -> size +com.batch.android.msgpack.value.impl.ImmutableMapValueImpl$EntrySetIterator -> com.batch.android.r0.j$c: +# {"id":"sourceFile","fileName":"ImmutableMapValueImpl.java"} + int index -> b + com.batch.android.msgpack.value.Value[] kvs -> a + 1:3:void (com.batch.android.msgpack.value.Value[]):226:228 -> + 1:9:java.util.Map$Entry next():238:246 -> a + 10:10:java.util.Map$Entry next():239:239 -> a + 1:1:boolean hasNext():233:233 -> hasNext + 1:1:java.lang.Object next():221:221 -> next + 1:1:void remove():252:252 -> remove +com.batch.android.msgpack.value.impl.ImmutableMapValueImpl$ImmutableMapValueMap -> com.batch.android.r0.j$d: +# {"id":"sourceFile","fileName":"ImmutableMapValueImpl.java"} + com.batch.android.msgpack.value.Value[] kvs -> a + 1:2:void (com.batch.android.msgpack.value.Value[]):192:193 -> + 1:1:java.util.Set entrySet():198:198 -> entrySet +com.batch.android.msgpack.value.impl.ImmutableMapValueImpl$KeySet -> com.batch.android.r0.j$e: +# {"id":"sourceFile","fileName":"ImmutableMapValueImpl.java"} + com.batch.android.msgpack.value.Value[] kvs -> a + 1:2:void (com.batch.android.msgpack.value.Value[]):260:261 -> + 1:1:java.util.Iterator iterator():271:271 -> iterator + 1:1:int size():266:266 -> size +com.batch.android.msgpack.value.impl.ImmutableMapValueImpl$ValueCollection -> com.batch.android.r0.j$f: +# {"id":"sourceFile","fileName":"ImmutableMapValueImpl.java"} + com.batch.android.msgpack.value.Value[] kvs -> a + 1:2:void (com.batch.android.msgpack.value.Value[]):279:280 -> + 1:1:java.util.Iterator iterator():290:290 -> iterator + 1:1:int size():285:285 -> size +com.batch.android.msgpack.value.impl.ImmutableNilValueImpl -> com.batch.android.r0.k: +# {"id":"sourceFile","fileName":"ImmutableNilValueImpl.java"} + com.batch.android.msgpack.value.ImmutableNilValue instance -> a + 1:1:void ():33:33 -> + 1:1:void ():39:39 -> + 1:1:boolean isBinaryValue():31:31 -> C + 1:1:boolean isNilValue():31:31 -> E + 1:1:boolean isNumberValue():31:31 -> L + 1:1:boolean isArrayValue():31:31 -> N + 1:1:boolean isRawValue():31:31 -> O + 1:1:boolean isExtensionValue():31:31 -> Q + 1:1:boolean isMapValue():31:31 -> S + 1:1:boolean isFloatValue():31:31 -> T + 1:1:boolean isBooleanValue():31:31 -> W + 1:1:java.lang.String toJson():84:84 -> X + 1:1:com.batch.android.msgpack.value.ImmutableExtensionValue asExtensionValue():31:31 -> Z + 1:1:com.batch.android.msgpack.value.ImmutableArrayValue asArrayValue():31:31 -> a + 2:2:void writeTo(com.batch.android.msgpack.core.MessagePacker):58:58 -> a + 1:1:com.batch.android.msgpack.value.ImmutableNumberValue asNumberValue():31:31 -> a0 + 1:1:com.batch.android.msgpack.value.ImmutableNilValue asNilValue():0:0 -> b + 2:2:com.batch.android.msgpack.value.NilValue asNilValue():31:31 -> b + 1:1:com.batch.android.msgpack.value.ImmutableNilValue get():36:36 -> b0 + 1:1:com.batch.android.msgpack.value.ImmutableIntegerValue asIntegerValue():31:31 -> c + com.batch.android.msgpack.value.ImmutableNilValue immutableValue() -> c0 + 1:1:com.batch.android.msgpack.value.ImmutableMapValue asMapValue():31:31 -> d + 1:4:boolean equals(java.lang.Object):66:69 -> equals + 1:1:com.batch.android.msgpack.value.ImmutableBinaryValue asBinaryValue():31:31 -> f + 1:1:com.batch.android.msgpack.value.ImmutableStringValue asStringValue():31:31 -> g + 1:1:com.batch.android.msgpack.value.ImmutableRawValue asRawValue():31:31 -> h + 1:1:com.batch.android.msgpack.value.ImmutableBooleanValue asBooleanValue():31:31 -> i + 1:1:com.batch.android.msgpack.value.ImmutableFloatValue asFloatValue():31:31 -> j + 1:1:com.batch.android.msgpack.value.ValueType getValueType():43:43 -> m + 1:1:com.batch.android.msgpack.value.ImmutableValue immutableValue():31:31 -> s + 1:1:java.lang.String toString():79:79 -> toString + 1:1:boolean isStringValue():31:31 -> v + 1:1:boolean isIntegerValue():31:31 -> w +com.batch.android.msgpack.value.impl.ImmutableStringValueImpl -> com.batch.android.r0.l: +# {"id":"sourceFile","fileName":"ImmutableStringValueImpl.java"} + 1:1:void (byte[]):34:34 -> + 2:2:void (java.lang.String):38:38 -> + 1:2:void writeTo(com.batch.android.msgpack.core.MessagePacker):58:59 -> a + com.batch.android.msgpack.value.ImmutableStringValue immutableValue() -> c0 + 1:13:boolean equals(java.lang.Object):67:79 -> equals + 1:1:com.batch.android.msgpack.value.ImmutableStringValue asStringValue():0:0 -> g + 2:2:com.batch.android.msgpack.value.StringValue asStringValue():31:31 -> g + 1:1:int hashCode():85:85 -> hashCode + 1:1:com.batch.android.msgpack.value.ValueType getValueType():43:43 -> m + 1:1:com.batch.android.msgpack.value.ImmutableValue immutableValue():31:31 -> s +com.batch.android.post.DisplayReceiptPostDataProvider -> com.batch.android.s0.a: +# {"id":"sourceFile","fileName":"DisplayReceiptPostDataProvider.java"} + java.util.Collection receipts -> b + 1:2:void (java.util.Collection):13:14 -> + 1:1:java.lang.Object getRawData():9:9 -> b + 1:12:byte[] pack():24:35 -> c + 13:16:byte[] pack():31:34 -> c + 1:1:java.util.Collection getRawData():19:19 -> d + 1:1:boolean isEmpty():40:40 -> isEmpty +com.batch.android.post.InboxSyncPostDataProvider -> com.batch.android.s0.b: +# {"id":"sourceFile","fileName":"InboxSyncPostDataProvider.java"} + com.batch.android.json.JSONObject body -> a + java.lang.String TAG -> b + 1:15:void (java.util.Collection):16:30 -> + 1:1:java.lang.String getContentType():50:50 -> a + 1:1:java.lang.Object getRawData():11:11 -> b + 1:1:com.batch.android.json.JSONObject getRawData():36:36 -> c + 1:1:byte[] getData():41:41 -> e + 1:1:boolean isEmpty():45:45 -> isEmpty +com.batch.android.post.JSONPostDataProvider -> com.batch.android.s0.c: +# {"id":"sourceFile","fileName":"JSONPostDataProvider.java"} + com.batch.android.json.JSONObject data -> a + 1:1:void ():23:23 -> + 2:7:void (com.batch.android.json.JSONObject):31:36 -> + 8:8:void (com.batch.android.json.JSONObject):33:33 -> + 1:1:java.lang.String getContentType():48:48 -> a + 1:1:java.lang.Object getRawData():10:10 -> b + 1:1:com.batch.android.json.JSONObject getRawData():58:58 -> c + 1:1:byte[] getData():43:43 -> e + 1:1:boolean isEmpty():53:53 -> isEmpty +com.batch.android.post.LocalCampaignsJITPostDataProvider -> com.batch.android.s0.d: +# {"id":"sourceFile","fileName":"LocalCampaignsJITPostDataProvider.java"} + java.lang.String VIEWS_KEY -> g + java.lang.String ATTRIBUTES_KEY -> f + java.lang.String ELIGIBLE_CAMPAIGNS_KEY -> i + java.lang.String COUNT_KEY -> h + java.util.Collection campaigns -> b + java.lang.String TAG -> c + java.lang.String CAMPAIGNS_KEY -> e + java.lang.String IDS_KEY -> d + 1:2:void (java.util.Collection):39:40 -> + 1:19:java.util.List unpack(byte[]):102:120 -> a + 1:1:java.lang.Object getRawData():26:26 -> b + 1:48:byte[] pack():50:97 -> c + 49:52:byte[] pack():93:96 -> c + 1:1:java.util.Collection getRawData():45:45 -> d + 1:1:boolean isEmpty():127:127 -> isEmpty +com.batch.android.post.MessagePackPostDataProvider -> com.batch.android.s0.e: +# {"id":"sourceFile","fileName":"MessagePackPostDataProvider.java"} + java.lang.String TAG -> a + 1:1:void ():6:6 -> + 1:1:java.lang.String getContentType():24:24 -> a + byte[] pack() -> c + 1:4:byte[] getData():15:18 -> e +com.batch.android.post.MetricPostDataProvider -> com.batch.android.s0.f: +# {"id":"sourceFile","fileName":"MetricPostDataProvider.java"} + java.util.Collection metrics -> b + 1:2:void (java.util.Collection):13:14 -> + 1:1:java.lang.Object getRawData():9:9 -> b + 1:12:byte[] pack():24:35 -> c + 13:16:byte[] pack():31:34 -> c + 1:1:java.util.Collection getRawData():19:19 -> d + 1:1:boolean isEmpty():40:40 -> isEmpty +com.batch.android.post.ParametersPostDataProvider -> com.batch.android.s0.g: +# {"id":"sourceFile","fileName":"ParametersPostDataProvider.java"} + java.util.Map params -> a + 1:1:void ():25:25 -> + 2:2:void (java.util.Map):33:33 -> + 3:24:void (java.util.Map):17:38 -> + 25:25:void (java.util.Map):35:35 -> + 1:1:java.lang.String getContentType():76:76 -> a + 1:1:java.lang.Object getRawData():12:12 -> b + 1:1:java.util.Map getRawData():45:45 -> c + 1:19:byte[] getData():53:71 -> e + 1:1:boolean isEmpty():81:81 -> isEmpty +com.batch.android.post.PostDataProvider -> com.batch.android.s0.h: +# {"id":"sourceFile","fileName":"PostDataProvider.java"} + java.lang.String getContentType() -> a + java.lang.Object getRawData() -> b + byte[] getData() -> e +com.batch.android.push.FCMAbstractRegistrationProvider -> com.batch.android.t0.a: +# {"id":"sourceFile","fileName":"FCMAbstractRegistrationProvider.java"} + com.batch.android.adsidentifier.GCMAdsIdentifierProvider adsIdentifierProvider -> a + java.lang.String senderID -> b + 1:3:void (android.content.Context):18:20 -> + 1:24:java.lang.String fetchSenderID(android.content.Context):25:48 -> a + 25:25:boolean isFirebaseCorePresent():91:91 -> a + 1:1:boolean isFirebaseMessagingPresent():100:100 -> b + 1:16:void checkLibraryAvailability():63:78 -> checkLibraryAvailability + 17:17:void checkLibraryAvailability():72:72 -> checkLibraryAvailability + 18:18:void checkLibraryAvailability():66:66 -> checkLibraryAvailability + 1:1:com.batch.android.AdsIdentifierProvider getAdsIdentifierProvider():86:86 -> getAdsIdentifierProvider + 1:1:java.lang.String getSenderID():53:53 -> getSenderID +com.batch.android.push.FCMInstanceIdRegistrationProvider -> com.batch.android.t0.b: +# {"id":"sourceFile","fileName":"FCMInstanceIdRegistrationProvider.java"} + 1:1:void (android.content.Context):16:16 -> + 1:10:java.lang.String fetchSenderID(android.content.Context):26:35 -> a + 1:15:java.lang.String getRegistration():43:57 -> getRegistration + 1:1:java.lang.String getShortname():21:21 -> getShortname +com.batch.android.push.FCMTokenRegistrationProvider -> com.batch.android.t0.c: +# {"id":"sourceFile","fileName":"FCMTokenRegistrationProvider.java"} + 1:1:void (android.content.Context):16:16 -> + 1:22:java.lang.String getRegistration():29:50 -> getRegistration + 1:1:java.lang.String getShortname():21:21 -> getShortname +com.batch.android.push.GCMAbstractRegistrationProvider -> com.batch.android.t0.d: +# {"id":"sourceFile","fileName":"GCMAbstractRegistrationProvider.java"} + android.content.Context context -> b + java.lang.String senderID -> c + com.batch.android.adsidentifier.GCMAdsIdentifierProvider adsIdentifierProvider -> a + java.lang.String TAG -> d + 1:4:void (android.content.Context,java.lang.String):23:26 -> + java.lang.Integer getGMSAvailability() -> a + 1:3:boolean isC2DMessagePermissionAvailable():97:99 -> b + 1:3:boolean isReceivePermissionAvailable():88:90 -> c + 1:35:void checkLibraryAvailability():41:75 -> checkLibraryAvailability + 36:36:void checkLibraryAvailability():71:71 -> checkLibraryAvailability + 37:37:void checkLibraryAvailability():65:65 -> checkLibraryAvailability + 38:40:void checkLibraryAvailability():56:58 -> checkLibraryAvailability + 41:41:void checkLibraryAvailability():50:50 -> checkLibraryAvailability + 42:42:void checkLibraryAvailability() -> checkLibraryAvailability + 1:1:com.batch.android.AdsIdentifierProvider getAdsIdentifierProvider():81:81 -> getAdsIdentifierProvider + 1:1:java.lang.String getSenderID():31:31 -> getSenderID +com.batch.android.push.GCMIidRegistrationProvider -> com.batch.android.t0.e: +# {"id":"sourceFile","fileName":"GCMIidRegistrationProvider.java"} + 1:1:void (android.content.Context,java.lang.String):15:15 -> + 1:1:java.lang.Integer getGMSAvailability():25:25 -> a + 1:11:void checkLibraryAvailability():32:42 -> checkLibraryAvailability + 12:13:void checkLibraryAvailability():35:36 -> checkLibraryAvailability + 1:1:java.lang.String getRegistration():48:48 -> getRegistration + 1:1:java.lang.String getShortname():20:20 -> getShortname +com.batch.android.push.GCMLegacyRegistrationProvider -> com.batch.android.t0.f: +# {"id":"sourceFile","fileName":"GCMLegacyRegistrationProvider.java"} + 1:1:void (android.content.Context,java.lang.String):14:14 -> + 1:1:java.lang.Integer getGMSAvailability():23:23 -> a + 1:6:java.lang.String getRegistration():29:34 -> getRegistration + 1:1:java.lang.String getShortname():19:19 -> getShortname +com.batch.android.push.PushRegistrationDiscoveryService -> com.batch.android.push.PushRegistrationDiscoveryService: +# {"id":"sourceFile","fileName":"PushRegistrationDiscoveryService.java"} + 1:1:void ():11:11 -> +com.batch.android.push.PushRegistrationProviderFactory -> com.batch.android.t0.g: +# {"id":"sourceFile","fileName":"PushRegistrationProviderFactory.java"} + android.content.Context context -> a + java.lang.String COMPONENT_KEY_PREFIX -> f + java.lang.String gcmSenderID -> c + boolean shouldUseGoogleInstanceID -> b + java.lang.String COMPONENT_SENTINEL_VALUE -> e + java.lang.String TAG -> d + 1:4:void (android.content.Context,boolean,java.lang.String):43:46 -> + 1:13:com.batch.android.PushRegistrationProvider getExternalPushRegistrationProvider():311:323 -> a + 14:34:com.batch.android.PushRegistrationProvider getExternalPushRegistrationProvider():321:341 -> a + 35:51:com.batch.android.PushRegistrationProvider getExternalPushRegistrationProvider():336:352 -> a + 52:63:com.batch.android.PushRegistrationProvider getExternalPushRegistrationProvider():349:360 -> a + 64:72:com.batch.android.PushRegistrationProvider getExternalPushRegistrationProvider():357:365 -> a + 73:73:boolean isExternalProviderAllowed(java.lang.String):373:373 -> a + 1:113:com.batch.android.PushRegistrationProvider getRegistrationProvider():85:197 -> b + 1:14:boolean isBatchGCMIidServiceAvailable():270:283 -> c + 1:1:boolean isFCMFirebaseInstanceIdAvailable():247:247 -> d + 1:5:boolean isFCMTokenApiAvailable():229:233 -> e + 1:1:boolean isGCMInstanceIdAvailable():261:261 -> f + 1:16:boolean isLegacyPushReceiverInManifest():202:217 -> g + 1:1:boolean isSenderIdOverridden():307:307 -> h + 1:1:boolean shouldForceFirebaseIIDProvider():298:298 -> i +com.batch.android.push.PushRegistrationRegistrar -> com.batch.android.push.PushRegistrationRegistrar: +# {"id":"sourceFile","fileName":"PushRegistrationRegistrar.java"} +com.batch.android.push.Registration -> com.batch.android.t0.h: +# {"id":"sourceFile","fileName":"Registration.java"} + java.lang.String provider -> a + java.lang.String senderID -> c + java.lang.String registrationID -> b + 1:4:void (java.lang.String,java.lang.String,java.lang.String):17:20 -> +com.batch.android.push.formats.APENFormat -> com.batch.android.u0.a: +# {"id":"sourceFile","fileName":"APENFormat.java"} + com.batch.android.push.formats.APENFormat$LayoutType layoutType -> e + java.lang.String LAYOUT_TYPE_KEY -> f + 1:1:void (java.lang.String,java.lang.String,android.graphics.Bitmap,android.graphics.Bitmap):89:89 -> + 2:2:void (java.lang.String,java.lang.String,android.graphics.Bitmap,android.graphics.Bitmap):81:81 -> + 1:1:void applyExtraBuilderConfiguration(androidx.core.app.NotificationCompat$Builder):0:0 -> a + 2:10:android.widget.RemoteViews generateCollapsedView(java.lang.String):93:101 -> a + 11:11:androidx.core.app.NotificationCompat$Style getSupportNotificationStyle():134:134 -> a + 12:24:void applyArguments(com.batch.android.json.JSONObject):140:152 -> a + 25:25:void applyArguments(com.batch.android.json.JSONObject):148:148 -> a + 26:26:void applyArguments(com.batch.android.json.JSONObject):145:145 -> a + 27:27:void applyArguments(com.batch.android.json.JSONObject):142:142 -> a + 1:21:android.widget.RemoteViews generateExpandedView(java.lang.String):108:128 -> b + 22:22:com.batch.android.push.formats.APENFormat$LayoutType getLayoutType():167:167 -> b + 1:1:boolean isSupported():162:162 -> c +com.batch.android.push.formats.APENFormat$LayoutType -> com.batch.android.u0.a$a: +# {"id":"sourceFile","fileName":"APENFormat.java"} + com.batch.android.push.formats.APENFormat$LayoutType CENTER_CROP_200 -> d + com.batch.android.push.formats.APENFormat$LayoutType FIT_CENTER_MP -> e + com.batch.android.push.formats.APENFormat$LayoutType FIT_CENTER_200 -> f + com.batch.android.push.formats.APENFormat$LayoutType[] $VALUES -> g + boolean forceLayoutHeight -> b + int imageScaleType -> a + com.batch.android.push.formats.APENFormat$LayoutType CENTER_CROP_MP -> c + 1:15:void ():30:44 -> + 16:16:void ():26:26 -> + 1:3:void (java.lang.String,int,int,boolean):56:58 -> + 1:1:com.batch.android.push.formats.APENFormat$LayoutType[] $values():26:26 -> a + 1:1:boolean shouldFitCenter():74:74 -> b + 1:1:boolean shouldForceLayoutHeight():66:66 -> c + 1:1:com.batch.android.push.formats.APENFormat$LayoutType valueOf(java.lang.String):26:26 -> valueOf + 1:1:com.batch.android.push.formats.APENFormat$LayoutType[] values():26:26 -> values +com.batch.android.push.formats.BaseFormat -> com.batch.android.u0.b: +# {"id":"sourceFile","fileName":"BaseFormat.java"} + android.graphics.Bitmap icon -> c + java.lang.String title -> a + android.graphics.Bitmap picture -> d + java.lang.String body -> b + 1:5:void (java.lang.String,java.lang.String,android.graphics.Bitmap,android.graphics.Bitmap):23:27 -> +com.batch.android.push.formats.NotificationFormat -> com.batch.android.u0.c: +# {"id":"sourceFile","fileName":"NotificationFormat.java"} + void applyArguments(com.batch.android.json.JSONObject) -> a + void applyExtraBuilderConfiguration(androidx.core.app.NotificationCompat$Builder) -> a + android.widget.RemoteViews generateCollapsedView(java.lang.String) -> a + androidx.core.app.NotificationCompat$Style getSupportNotificationStyle() -> a + android.widget.RemoteViews generateExpandedView(java.lang.String) -> b +com.batch.android.push.formats.SystemFormat -> com.batch.android.u0.d: +# {"id":"sourceFile","fileName":"SystemFormat.java"} + boolean useLegacyBigPictureIconBehaviour -> e + 1:2:void (java.lang.String,java.lang.String,android.graphics.Bitmap,android.graphics.Bitmap,boolean):24:25 -> + 1:1:void applyArguments(com.batch.android.json.JSONObject):0:0 -> a + 2:2:android.widget.RemoteViews generateCollapsedView(java.lang.String):0:0 -> a + 3:17:androidx.core.app.NotificationCompat$Style getSupportNotificationStyle():45:59 -> a + 18:23:void applyExtraBuilderConfiguration(androidx.core.app.NotificationCompat$Builder):72:77 -> a + android.widget.RemoteViews generateExpandedView(java.lang.String) -> b +com.batch.android.query.AttributesCheckQuery -> com.batch.android.v0.a: +# {"id":"sourceFile","fileName":"AttributesCheckQuery.java"} + long version -> d + java.lang.String transactionID -> e + 1:11:void (android.content.Context,long,java.lang.String):26:36 -> + 12:12:void (android.content.Context,long,java.lang.String):32:32 -> + 13:13:void (android.content.Context,long,java.lang.String):28:28 -> + 1:4:com.batch.android.json.JSONObject toJSON():43:46 -> e +com.batch.android.query.AttributesSendQuery -> com.batch.android.v0.b: +# {"id":"sourceFile","fileName":"AttributesSendQuery.java"} + long version -> d + java.util.Map attributes -> e + java.util.Map tags -> f + 1:16:void (android.content.Context,long,java.util.Map,java.util.Map):38:53 -> + 17:17:void (android.content.Context,long,java.util.Map,java.util.Map):48:48 -> + 18:18:void (android.content.Context,long,java.util.Map,java.util.Map):44:44 -> + 19:19:void (android.content.Context,long,java.util.Map,java.util.Map):40:40 -> + 1:5:com.batch.android.json.JSONObject toJSON():60:64 -> e +com.batch.android.query.LocalCampaignsQuery -> com.batch.android.v0.c: +# {"id":"sourceFile","fileName":"LocalCampaignsQuery.java"} + java.util.Map capping -> d + java.lang.String TAG -> e + 1:1:void (com.batch.android.localcampaigns.CampaignManager,android.content.Context):30:30 -> + 2:18:void (com.batch.android.localcampaigns.CampaignManager,android.content.Context):27:43 -> + 1:8:com.batch.android.json.JSONObject toJSON():49:56 -> e +com.batch.android.query.PushQuery -> com.batch.android.v0.d: +# {"id":"sourceFile","fileName":"PushQuery.java"} + com.batch.android.push.Registration registration -> d + 1:6:void (android.content.Context,com.batch.android.push.Registration):24:29 -> + 7:7:void (android.content.Context,com.batch.android.push.Registration):26:26 -> + 1:6:com.batch.android.json.JSONObject toJSON():36:41 -> e + 1:2:int getNotificationType():54:55 -> f + 3:3:int getNotificationType():53:53 -> f +com.batch.android.query.Query -> com.batch.android.v0.e: +# {"id":"sourceFile","fileName":"Query.java"} + android.content.Context context -> a + com.batch.android.query.QueryType type -> c + java.lang.String id -> b + 1:12:void (android.content.Context,com.batch.android.query.QueryType):33:44 -> + 13:13:void (android.content.Context,com.batch.android.query.QueryType):39:39 -> + 14:14:void (android.content.Context,com.batch.android.query.QueryType):35:35 -> + 1:1:java.lang.String generateID():102:102 -> a + 1:1:android.content.Context getContext():73:73 -> b + 1:1:java.lang.String getID():55:55 -> c + 1:1:com.batch.android.query.QueryType getType():64:64 -> d + 1:4:com.batch.android.json.JSONObject toJSON():86:89 -> e +com.batch.android.query.QueryType -> com.batch.android.v0.f: +# {"id":"sourceFile","fileName":"QueryType.java"} + com.batch.android.query.QueryType ATTRIBUTES -> d + com.batch.android.query.QueryType PUSH -> c + com.batch.android.query.QueryType[] $VALUES -> g + com.batch.android.query.QueryType LOCAL_CAMPAIGNS -> f + com.batch.android.query.QueryType ATTRIBUTES_CHECK -> e + com.batch.android.query.QueryType TRACKING -> b + com.batch.android.query.QueryType START -> a + 1:21:void ():11:31 -> + 22:22:void ():7:7 -> + 1:1:void (java.lang.String,int):7:7 -> + 1:1:com.batch.android.query.QueryType[] $values():7:7 -> a + 1:1:com.batch.android.query.QueryType valueOf(java.lang.String):7:7 -> valueOf + 1:1:com.batch.android.query.QueryType[] values():7:7 -> values +com.batch.android.query.StartQuery -> com.batch.android.v0.g: +# {"id":"sourceFile","fileName":"StartQuery.java"} + java.lang.String pushId -> f + boolean fromPush -> e + boolean userActivity -> d + 1:4:void (android.content.Context,boolean,java.lang.String,boolean):33:36 -> + 1:7:com.batch.android.json.JSONObject toJSON():43:49 -> e +com.batch.android.query.TrackingQuery -> com.batch.android.v0.h: +# {"id":"sourceFile","fileName":"TrackingQuery.java"} + java.util.List events -> d + 1:6:void (android.content.Context,java.util.List):31:36 -> + 7:7:void (android.content.Context,java.util.List):33:33 -> + 1:46:com.batch.android.json.JSONObject toJSON():43:88 -> e +com.batch.android.query.response.AttributesCheckResponse -> com.batch.android.w0.a: +# {"id":"sourceFile","fileName":"AttributesCheckResponse.java"} + long version -> d + java.lang.String actionString -> c + java.lang.Long time -> e + 1:1:void (java.lang.String):18:18 -> + 2:4:void (java.lang.String):13:15 -> + 1:1:void setActionString(java.lang.String):48:48 -> a + 2:2:void setVersion(long):56:56 -> a + 3:3:void setTime(java.lang.Long):64:64 -> a + 1:15:com.batch.android.query.response.AttributesCheckResponse$Action getAction():22:36 -> c + 1:1:java.lang.Long getTime():60:60 -> d + 1:1:long getVersion():52:52 -> e +com.batch.android.query.response.AttributesCheckResponse$Action -> com.batch.android.w0.a$a: +# {"id":"sourceFile","fileName":"AttributesCheckResponse.java"} + com.batch.android.query.response.AttributesCheckResponse$Action RESEND -> d + com.batch.android.query.response.AttributesCheckResponse$Action UNKNOWN -> e + com.batch.android.query.response.AttributesCheckResponse$Action[] $VALUES -> f + com.batch.android.query.response.AttributesCheckResponse$Action BUMP -> b + com.batch.android.query.response.AttributesCheckResponse$Action RECHECK -> c + com.batch.android.query.response.AttributesCheckResponse$Action OK -> a + 1:5:void ():40:44 -> + 6:6:void ():39:39 -> + 1:1:void (java.lang.String,int):39:39 -> + 1:1:com.batch.android.query.response.AttributesCheckResponse$Action[] $values():39:39 -> a + 1:1:com.batch.android.query.response.AttributesCheckResponse$Action valueOf(java.lang.String):39:39 -> valueOf + 1:1:com.batch.android.query.response.AttributesCheckResponse$Action[] values():39:39 -> values +com.batch.android.query.response.AttributesSendResponse -> com.batch.android.w0.b: +# {"id":"sourceFile","fileName":"AttributesSendResponse.java"} + long version -> d + java.lang.String transactionID -> c + 1:1:void (java.lang.String):16:16 -> + 2:2:void (java.lang.String):13:13 -> + 1:1:void setTransactionID(java.lang.String):20:20 -> a + 2:2:void setVersion(long):24:24 -> a +com.batch.android.query.response.LocalCampaignsResponse -> com.batch.android.w0.c: +# {"id":"sourceFile","fileName":"LocalCampaignsResponse.java"} + java.lang.String TAG -> g + java.util.List campaigns -> d + com.batch.android.query.response.LocalCampaignsResponse$GlobalCappings cappings -> f + com.batch.android.query.response.LocalCampaignsResponse$Error error -> c + java.lang.Long minDisplayInterval -> e + 1:1:void (java.lang.String):40:40 -> + 1:1:void setCampaigns(java.util.List):72:72 -> a + 2:2:void setMinDisplayInterval(java.lang.Long):76:76 -> a + 3:3:void setError(com.batch.android.query.response.LocalCampaignsResponse$Error):84:84 -> a + 4:4:void setCappings(com.batch.android.query.response.LocalCampaignsResponse$GlobalCappings):97:97 -> a + 1:1:java.util.List getCampaigns():49:49 -> c + 1:7:java.util.List getCampaignsToSave():54:60 -> d + 1:1:com.batch.android.query.response.LocalCampaignsResponse$GlobalCappings getCappings():93:93 -> e + 1:1:com.batch.android.query.response.LocalCampaignsResponse$Error getError():80:80 -> f + 1:1:java.lang.Long getMinDisplayInterval():68:68 -> g + 1:1:boolean hasCampaigns():44:44 -> h + 1:1:boolean hasCappings():101:101 -> i + 1:1:boolean hasError():88:88 -> j +com.batch.android.query.response.LocalCampaignsResponse$Error -> com.batch.android.w0.c$a: +# {"id":"sourceFile","fileName":"LocalCampaignsResponse.java"} + java.lang.String message -> b + int code -> a + 1:1:void ():167:167 -> + 1:1:int getCode():180:180 -> a + 2:2:void setCode(int):184:184 -> a + 3:3:void setMessage(java.lang.String):192:192 -> a + 1:1:java.lang.String getMessage():188:188 -> b + 1:1:java.lang.String toString():198:198 -> toString +com.batch.android.query.response.LocalCampaignsResponse$GlobalCappings -> com.batch.android.w0.c$b: +# {"id":"sourceFile","fileName":"LocalCampaignsResponse.java"} + java.util.List timeBasedCappings -> b + java.lang.Integer session -> a + 1:3:void (java.lang.Integer,java.util.List):151:153 -> + 1:1:java.lang.Integer getSession():158:158 -> a + 1:1:java.util.List getTimeBasedCappings():163:163 -> b +com.batch.android.query.response.LocalCampaignsResponse$GlobalCappings$TimeBasedCapping -> com.batch.android.w0.c$b$a: +# {"id":"sourceFile","fileName":"LocalCampaignsResponse.java"} + java.lang.Integer views -> a + java.lang.Integer duration -> b + 1:3:void (java.lang.Integer,java.lang.Integer):125:127 -> + 1:1:java.lang.Integer getDuration():137:137 -> a + 1:1:java.lang.Integer getViews():132:132 -> b +com.batch.android.query.response.PushResponse -> com.batch.android.w0.d: +# {"id":"sourceFile","fileName":"PushResponse.java"} + 1:1:void (java.lang.String):15:15 -> +com.batch.android.query.response.Response -> com.batch.android.w0.e: +# {"id":"sourceFile","fileName":"Response.java"} + java.lang.String queryID -> a + com.batch.android.query.QueryType queryType -> b + 1:11:void (com.batch.android.query.QueryType,java.lang.String):23:33 -> + 12:12:void (com.batch.android.query.QueryType,java.lang.String):29:29 -> + 13:13:void (com.batch.android.query.QueryType,java.lang.String):25:25 -> + 1:1:java.lang.String getQueryID():42:42 -> a + 1:1:com.batch.android.query.QueryType getQueryType():51:51 -> b +com.batch.android.query.response.StartResponse -> com.batch.android.w0.f: +# {"id":"sourceFile","fileName":"StartResponse.java"} + 1:1:void (java.lang.String):15:15 -> +com.batch.android.query.response.TrackingResponse -> com.batch.android.w0.g: +# {"id":"sourceFile","fileName":"TrackingResponse.java"} + 1:1:void (java.lang.String):15:15 -> +com.batch.android.query.serialization.deserializers.AttributesCheckResponseDeserializer -> com.batch.android.x0.a: +# {"id":"sourceFile","fileName":"AttributesCheckResponseDeserializer.java"} + 1:1:void (com.batch.android.json.JSONObject):18:18 -> + 1:1:com.batch.android.query.response.Response deserialize():10:10 -> a + 1:9:com.batch.android.query.response.AttributesCheckResponse deserialize():29:37 -> c +com.batch.android.query.serialization.deserializers.AttributesSendResponseDeserializer -> com.batch.android.x0.b: +# {"id":"sourceFile","fileName":"AttributesSendResponseDeserializer.java"} + 1:1:void (com.batch.android.json.JSONObject):18:18 -> + 1:1:com.batch.android.query.response.Response deserialize():10:10 -> a + 1:6:com.batch.android.query.response.AttributesSendResponse deserialize():29:34 -> c +com.batch.android.query.serialization.deserializers.LocalCampaignsResponseDeserializer -> com.batch.android.x0.c: +# {"id":"sourceFile","fileName":"LocalCampaignsResponseDeserializer.java"} + java.lang.String TAG -> c + com.batch.android.localcampaigns.serialization.LocalCampaignDeserializer localCampaignDeserializer -> b + 1:1:void (com.batch.android.json.JSONObject):33:33 -> + 2:2:void (com.batch.android.json.JSONObject):25:25 -> + 1:1:com.batch.android.query.response.Response deserialize():18:18 -> a + 2:19:java.util.List parseTimeBasedCappings(com.batch.android.json.JSONArray):109:126 -> a + 1:19:com.batch.android.query.response.LocalCampaignsResponse deserialize():44:62 -> c + 20:20:com.batch.android.query.response.LocalCampaignsResponse deserialize():45:45 -> c + 1:2:java.util.List deserializeCampaigns():73:74 -> d + 1:11:com.batch.android.query.response.LocalCampaignsResponse$GlobalCappings deserializeCappings():86:96 -> e + 1:8:com.batch.android.query.response.LocalCampaignsResponse$Error parseError():138:145 -> f +com.batch.android.query.serialization.deserializers.PushResponseDeserializer -> com.batch.android.x0.d: +# {"id":"sourceFile","fileName":"PushResponseDeserializer.java"} + 1:1:void (com.batch.android.json.JSONObject):18:18 -> + 1:1:com.batch.android.query.response.Response deserialize():10:10 -> a + 1:1:com.batch.android.query.response.PushResponse deserialize():29:29 -> c +com.batch.android.query.serialization.deserializers.ResponseDeserializer -> com.batch.android.x0.e: +# {"id":"sourceFile","fileName":"ResponseDeserializer.java"} + com.batch.android.json.JSONObject json -> a + 1:2:void (com.batch.android.json.JSONObject):22:23 -> + com.batch.android.query.response.Response deserialize() -> a + 1:1:java.lang.String getId():33:33 -> b +com.batch.android.query.serialization.deserializers.StartResponseDeserializer -> com.batch.android.x0.f: +# {"id":"sourceFile","fileName":"StartResponseDeserializer.java"} + 1:1:void (com.batch.android.json.JSONObject):18:18 -> + 1:1:com.batch.android.query.response.Response deserialize():10:10 -> a + 1:1:com.batch.android.query.response.StartResponse deserialize():29:29 -> c +com.batch.android.query.serialization.deserializers.TrackingResponseDeserializer -> com.batch.android.x0.g: +# {"id":"sourceFile","fileName":"TrackingResponseDeserializer.java"} + 1:1:void (com.batch.android.json.JSONObject):18:18 -> + 1:1:com.batch.android.query.response.Response deserialize():10:10 -> a + 1:1:com.batch.android.query.response.TrackingResponse deserialize():29:29 -> c +com.batch.android.query.serialization.serializers.LocalCampaignsResponseSerializer -> com.batch.android.y0.a: +# {"id":"sourceFile","fileName":"LocalCampaignsResponseSerializer.java"} + com.batch.android.localcampaigns.serialization.LocalCampaignSerializer localCampaignSerializer -> a + 1:6:void ():16:21 -> + 1:11:com.batch.android.json.JSONObject serialize(com.batch.android.query.response.LocalCampaignsResponse):34:44 -> a + 12:12:com.batch.android.json.JSONObject serialize(com.batch.android.query.response.LocalCampaignsResponse):38:38 -> a + 13:13:com.batch.android.json.JSONObject serialize(com.batch.android.query.response.LocalCampaignsResponse):32:32 -> a + 14:14:com.batch.android.json.JSONArray serializeCampaigns(java.util.List):56:56 -> a + 15:25:com.batch.android.json.JSONObject serializeCappings(com.batch.android.query.response.LocalCampaignsResponse$GlobalCappings):68:78 -> a +com.batch.android.runtime.ChangeStateAction -> com.batch.android.z0.a: +# {"id":"sourceFile","fileName":"ChangeStateAction.java"} + com.batch.android.runtime.State run(com.batch.android.runtime.State) -> a +com.batch.android.runtime.ForegroundActivityLifecycleListener -> com.batch.android.z0.b: +# {"id":"sourceFile","fileName":"ForegroundActivityLifecycleListener.java"} + java.lang.Runnable delayedPauseRunnable -> e + java.lang.String TAG -> f + com.batch.android.runtime.ForegroundActivityLifecycleListener$AppLifecycleListener listener -> d + java.util.concurrent.atomic.AtomicInteger resumeCount -> a + android.os.Handler handler -> c + java.util.concurrent.atomic.AtomicBoolean isPaused -> b + int TIMEOUT_MS -> g + 1:42:void ():16:57 -> + 1:2:void registerAppLifecycleListener(com.batch.android.runtime.ForegroundActivityLifecycleListener$AppLifecycleListener):71:72 -> a + 3:17:boolean isApplicationInForeground():113:127 -> a + 1:4:void lambda$new$0():58:61 -> b + 1:2:void onActivityPaused(android.app.Activity):94:95 -> onActivityPaused + 1:5:void onActivityResumed(android.app.Activity):83:87 -> onActivityResumed +com.batch.android.runtime.ForegroundActivityLifecycleListener$AppLifecycleListener -> com.batch.android.z0.b$a: +# {"id":"sourceFile","fileName":"ForegroundActivityLifecycleListener.java"} + void onEnterBackground() -> a + void onEnterForeground() -> b +com.batch.android.runtime.RuntimeManager -> com.batch.android.z0.c: +# {"id":"sourceFile","fileName":"RuntimeManager.java"} + android.content.Context context -> a + java.util.Date lastUserStartDate -> d + java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock r -> k + com.batch.android.debug.FindMyInstallationHelper installationIdHelper -> m + java.lang.String TAG -> n + java.util.Date stopDate -> h + android.app.Activity activity -> e + com.batch.android.runtime.ForegroundActivityLifecycleListener foregroundActivityLifecycleListener -> f + com.batch.android.runtime.State state -> i + android.os.Handler handler -> b + com.batch.android.runtime.SessionManager sessionManager -> g + java.util.concurrent.locks.ReentrantReadWriteLock lock -> j + java.util.concurrent.atomic.AtomicInteger serviceRefCount -> c + java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock w -> l + 1:1:void ():100:100 -> + 2:61:void ():37:96 -> + 1:1:com.batch.android.debug.FindMyInstallationHelper access$000(com.batch.android.runtime.RuntimeManager):26:26 -> a + 2:13:boolean changeState(com.batch.android.runtime.ChangeStateAction):111:122 -> a + 14:28:boolean changeStateIf(com.batch.android.runtime.State,com.batch.android.runtime.ChangeStateAction):133:147 -> a + 29:38:boolean changeStateIf(com.batch.android.runtime.State,com.batch.android.runtime.ChangeStateAction):139:148 -> a + 39:44:void run(com.batch.android.runtime.StateAction):159:164 -> a + 45:54:boolean runIf(com.batch.android.runtime.State,com.batch.android.runtime.StateAction):175:184 -> a + 55:59:boolean runIf(com.batch.android.runtime.State,com.batch.android.runtime.StateAction):181:185 -> a + 60:60:boolean runIfReady(java.lang.Runnable):197:197 -> a + 61:71:boolean runIf(com.batch.android.runtime.State,java.lang.Runnable):208:218 -> a + 72:77:boolean runIf(com.batch.android.runtime.State,java.lang.Runnable):214:219 -> a + 78:78:void setActivity(android.app.Activity):260:260 -> a + 79:82:void setContext(android.content.Context):358:361 -> a + 83:96:void registerActivityListenerIfNeeded(android.app.Application):377:390 -> a + 97:110:void registerSessionManagerIfNeeded(android.app.Application,boolean):405:418 -> a + 111:111:void clearSessionManager():442:442 -> a + 1:1:void decrementServiceRefCount():283:283 -> b + 1:1:android.app.Activity getActivity():269:269 -> c + 1:1:android.content.Context getContext():371:371 -> d + 1:1:java.util.Date getLastUserStartDate():347:347 -> e + 1:5:java.lang.String getSessionIdentifier():429:433 -> f + 1:1:com.batch.android.runtime.SessionManager getSessionManager():437:437 -> g + 1:1:void incrementServiceRefCount():276:276 -> h + 1:5:boolean isApplicationInForeground():395:399 -> i + 1:1:boolean isReady():298:298 -> j + 1:15:boolean isRetainedByService():305:319 -> k + 1:4:java.lang.Long onStart():232:235 -> l + 1:5:void onStopWithoutFinishing():244:248 -> m + 1:1:void resetServiceRefCount():291:291 -> n + 1:1:void updateLastUserStartDate():338:338 -> o +com.batch.android.runtime.RuntimeManager$1 -> com.batch.android.z0.c$a: +# {"id":"sourceFile","fileName":"RuntimeManager.java"} + com.batch.android.runtime.RuntimeManager this$0 -> a + 1:1:void (com.batch.android.runtime.RuntimeManager):380:380 -> + void onEnterBackground() -> a + 1:1:void onEnterForeground():383:383 -> b +com.batch.android.runtime.SessionManager -> com.batch.android.z0.d: +# {"id":"sourceFile","fileName":"SessionManager.java"} + java.lang.String TAG -> f + java.util.concurrent.atomic.AtomicInteger createCount -> a + int BACKGROUNDED_SESSION_EXPIRATION_SEC -> g + java.lang.Long backgroundSessionExpirationUptime -> b + boolean sessionActive -> c + java.lang.String INTENT_NEW_SESSION -> e + java.lang.String sessionIdentifier -> d + 1:22:void ():32:53 -> + 1:12:void startNewSessionIfNeeded(android.content.Context):76:87 -> a + 13:27:boolean areAllActivitiesDestroyed():96:110 -> a + 1:1:java.lang.String getSessionIdentifier():61:61 -> b + 1:1:long getUptime():125:125 -> c + 1:7:void invalidateSessionIfNeeded():65:71 -> d + 1:4:void onActivityCreated(android.app.Activity,android.os.Bundle):145:148 -> onActivityCreated + 1:8:void onActivityDestroyed(android.app.Activity):174:181 -> onActivityDestroyed + 1:5:void onActivityResumed(android.app.Activity):156:160 -> onActivityResumed + 1:1:void onLowMemory():140:140 -> onLowMemory + 1:1:void onTrimMemory(int):131:131 -> onTrimMemory +com.batch.android.runtime.State -> com.batch.android.z0.e: +# {"id":"sourceFile","fileName":"State.java"} + com.batch.android.runtime.State FINISHING -> c + com.batch.android.runtime.State READY -> b + com.batch.android.runtime.State[] $VALUES -> d + com.batch.android.runtime.State OFF -> a + 1:11:void ():11:21 -> + 12:12:void ():7:7 -> + 1:1:void (java.lang.String,int):7:7 -> + 1:1:com.batch.android.runtime.State[] $values():7:7 -> a + 1:1:com.batch.android.runtime.State valueOf(java.lang.String):7:7 -> valueOf + 1:1:com.batch.android.runtime.State[] values():7:7 -> values +com.batch.android.runtime.StateAction -> com.batch.android.z0.f: +# {"id":"sourceFile","fileName":"StateAction.java"} + void run(com.batch.android.runtime.State) -> a +com.batch.android.tracker.TrackerDatabaseHelper -> com.batch.android.a1.a: +# {"id":"sourceFile","fileName":"TrackerDatabaseHelper.java"} + java.lang.String COLUMN_PARAMETERS -> g + java.lang.String COLUMN_TIMEZONE -> f + java.lang.String COLUMN_SERVER_TIME -> i + java.lang.String COLUMN_STATE -> h + int DATABASE_VERSION -> m + java.lang.String COLUMN_SESSION_ID -> k + java.lang.String COLUMN_SECURE_DATE -> j + java.lang.String DATABASE_NAME -> l + java.lang.String TABLE_EVENTS -> a + java.lang.String COLUMN_ID -> c + java.lang.String COLUMN_DB_ID -> b + java.lang.String COLUMN_DATE -> e + java.lang.String COLUMN_NAME -> d + 1:1:void (android.content.Context):33:33 -> + 1:1:void onCreate(android.database.sqlite.SQLiteDatabase):38:38 -> onCreate + 1:4:void onUpgrade(android.database.sqlite.SQLiteDatabase,int,int):68:71 -> onUpgrade +com.batch.android.tracker.TrackerDatasource -> com.batch.android.a1.b: +# {"id":"sourceFile","fileName":"TrackerDatasource.java"} + android.content.Context context -> a + com.batch.android.tracker.TrackerDatabaseHelper databaseHelper -> c + android.database.sqlite.SQLiteDatabase database -> b + java.lang.String TAG -> d + 1:8:void (android.content.Context):42:49 -> + 9:9:void (android.content.Context):44:44 -> + 1:1:void clearDB():81:81 -> a + 2:3:boolean addEvent(com.batch.android.event.Event):93:94 -> a + 4:35:com.batch.android.event.Event parseEvent(android.database.Cursor):176:207 -> a + 36:51:int updateEventsToNewState(java.lang.String[],com.batch.android.event.Event$State):242:257 -> a + 52:69:int deleteEvents(java.lang.String[]):269:286 -> a + 70:70:int deleteOverflowEvents(int):298:298 -> a + 1:23:java.util.List extractEventsToSend(int):104:126 -> b + 24:67:java.util.List extractEventsToSend(int):119:162 -> b + 68:68:boolean updateEventsToNew(java.lang.String[]):220:220 -> b + 69:71:void close():318:320 -> b + 72:87:boolean insert(com.batch.android.event.Event):331:346 -> b + 88:133:boolean insert(com.batch.android.event.Event):343:388 -> b + 134:134:boolean insert(com.batch.android.event.Event):337:337 -> b + 1:13:java.util.List getAllEvents():60:72 -> c + 14:14:java.util.List getAllEvents():62:62 -> c + 15:15:boolean updateEventsToOld(java.lang.String[]):230:230 -> c + 1:11:boolean resetEventStatus():401:411 -> d + 12:25:boolean resetEventStatus():404:417 -> d +com.batch.android.tracker.TrackerMode -> com.batch.android.a1.c: +# {"id":"sourceFile","fileName":"TrackerMode.java"} + com.batch.android.tracker.TrackerMode ON -> d + com.batch.android.tracker.TrackerMode OFF -> b + com.batch.android.tracker.TrackerMode DB_ONLY -> c + com.batch.android.tracker.TrackerMode[] $VALUES -> e + int value -> a + 1:11:void ():11:21 -> + 12:12:void ():7:7 -> + 1:2:void (java.lang.String,int,int):27:28 -> + 1:1:com.batch.android.tracker.TrackerMode[] $values():7:7 -> a + 2:3:com.batch.android.tracker.TrackerMode fromValue(int):44:45 -> a + 1:1:int getValue():32:32 -> b + 1:1:com.batch.android.tracker.TrackerMode valueOf(java.lang.String):7:7 -> valueOf + 1:1:com.batch.android.tracker.TrackerMode[] values():7:7 -> values +com.batch.android.user.AttributeType -> com.batch.android.b1.a: +# {"id":"sourceFile","fileName":"AttributeType.java"} + com.batch.android.user.AttributeType[] $VALUES -> j + com.batch.android.user.AttributeType LONG -> e + com.batch.android.user.AttributeType DOUBLE -> f + char typeChar -> b + com.batch.android.user.AttributeType DELETED -> c + com.batch.android.user.AttributeType STRING -> d + com.batch.android.user.AttributeType URL -> i + com.batch.android.user.AttributeType BOOL -> g + int value -> a + com.batch.android.user.AttributeType DATE -> h + 1:13:void ():7:19 -> + 14:14:void ():6:6 -> + 1:3:void (java.lang.String,int,int,char):27:29 -> + 1:1:com.batch.android.user.AttributeType[] $values():6:6 -> a + 2:3:com.batch.android.user.AttributeType fromValue(int):49:50 -> a + 1:1:char getTypeChar():37:37 -> b + 1:1:int getValue():33:33 -> c + 1:1:com.batch.android.user.AttributeType valueOf(java.lang.String):6:6 -> valueOf + 1:1:com.batch.android.user.AttributeType[] values():6:6 -> values +com.batch.android.user.EmailSubscription -> com.batch.android.b1.b: +# {"id":"sourceFile","fileName":"EmailSubscription.java"} + java.lang.String SUBSCRIPTION_KEY -> g + java.lang.String CUSTOM_ID_KEY -> f + java.util.Map subscriptions -> c + java.lang.String email -> a + boolean deleteEmail -> b + java.lang.String EMAIL_KEY -> e + java.lang.String TAG -> d + 1:1:void ():38:38 -> + 2:4:void ():34:36 -> + 5:5:void (java.lang.String):40:40 -> + 6:16:void (java.lang.String):34:44 -> + 1:3:void setEmail(java.lang.String):49:51 -> a + 4:4:void addSubscription(com.batch.android.user.EmailSubscription$Kind,com.batch.android.BatchEmailSubscriptionState):55:55 -> a + 5:32:void sendEmailSubscriptionEvent():59:86 -> a + 33:42:void sendEmailSubscriptionEvent():84:93 -> a +com.batch.android.user.EmailSubscription$Kind -> com.batch.android.b1.b$a: +# {"id":"sourceFile","fileName":"EmailSubscription.java"} + com.batch.android.user.EmailSubscription$Kind MARKETING -> a + com.batch.android.user.EmailSubscription$Kind[] $VALUES -> b + 1:1:void ():23:23 -> + 2:2:void ():22:22 -> + 1:1:void (java.lang.String,int):22:22 -> + 1:1:com.batch.android.user.EmailSubscription$Kind[] $values():22:22 -> a + 1:1:com.batch.android.user.EmailSubscription$Kind valueOf(java.lang.String):22:22 -> valueOf + 1:1:com.batch.android.user.EmailSubscription$Kind[] values():22:22 -> values +com.batch.android.user.SQLUserDatasource -> com.batch.android.b1.c: +# {"id":"sourceFile","fileName":"SQLUserDatasource.java"} + android.content.Context context -> a + com.batch.android.user.UserDatabaseHelper databaseHelper -> c + java.lang.String TAG -> f + long currentChangeset -> e + android.database.sqlite.SQLiteDatabase database -> b + boolean transactionOccurring -> d + 1:1:void (android.content.Context):59:59 -> + 2:16:void (android.content.Context):52:66 -> + 17:17:void (android.content.Context):61:61 -> + 1:10:void acquireTransactionLock(long):97:106 -> a + 11:13:void setAttribute(java.lang.String,long):151:153 -> a + 14:16:void setAttribute(java.lang.String,double):158:160 -> a + 17:19:void setAttribute(java.lang.String,boolean):165:167 -> a + 20:22:void setAttribute(java.lang.String,java.lang.String):172:174 -> a + 23:25:void setAttribute(java.lang.String,java.util.Date):179:181 -> a + 26:28:void setAttribute(java.lang.String,java.net.URI):186:188 -> a + 29:33:void clearTags(java.lang.String):238:242 -> a + 34:50:void setAttribute(java.lang.String,android.content.ContentValues,com.batch.android.user.AttributeType,boolean):266:282 -> a + 51:51:void setAttribute(java.lang.String,android.content.ContentValues,com.batch.android.user.AttributeType,boolean):267:267 -> a + 52:77:java.lang.String printDebugDump():506:531 -> a + 78:79:void logAndThrow(java.lang.String,java.lang.Throwable):540:541 -> a + 1:10:void commitTransaction():117:126 -> b + 11:11:void removeAttribute(java.lang.String):193:193 -> b + 12:12:void addTag(java.lang.String,java.lang.String):202:202 -> b + 13:22:void deleteAttribute(java.lang.String,boolean):287:296 -> b + 23:29:void deleteAttribute(java.lang.String,boolean):293:299 -> b + 30:30:void deleteAttribute(java.lang.String,boolean):288:288 -> b + 1:1:void removeTag(java.lang.String,java.lang.String):207:207 -> c + 2:6:void clearTags():229:233 -> c + 1:6:void clear():219:224 -> clear + 1:9:void close():73:81 -> close + 1:5:void clearAttributes():251:255 -> d + 6:18:void deleteTag(java.lang.String,java.lang.String):329:341 -> d + 19:19:void deleteTag(java.lang.String,java.lang.String):330:330 -> d + 1:17:void writeTag(java.lang.String,java.lang.String):308:324 -> e + 18:18:void writeTag(java.lang.String,java.lang.String):309:309 -> e + 19:41:java.util.HashMap getAttributes():417:439 -> e + 42:77:java.util.HashMap getAttributes():438:473 -> e + 78:78:java.util.HashMap getAttributes():470:470 -> e + 79:79:java.util.HashMap getAttributes():467:467 -> e + 80:81:java.util.HashMap getAttributes():462:463 -> e + 82:82:java.util.HashMap getAttributes():458:458 -> e + 83:112:java.util.HashMap getAttributes():455:484 -> e + 113:119:java.util.HashMap getAttributes():483:489 -> e + 120:195:java.util.HashMap getAttributes():419:494 -> e + 1:58:java.util.Map getTagCollections():351:408 -> f + 59:62:java.util.Map getTagCollections():374:377 -> f + 63:95:java.util.Map getTagCollections():376:408 -> f + 96:150:java.util.Map getTagCollections():355:409 -> f + 1:10:void rollbackTransaction():132:141 -> g + 1:1:void throwInvalidStateException():545:545 -> h +com.batch.android.user.SQLUserDatasource$1 -> com.batch.android.b1.c$a: +# {"id":"sourceFile","fileName":"SQLUserDatasource.java"} + int[] $SwitchMap$com$batch$android$user$AttributeType -> a + 1:1:void ():453:453 -> +com.batch.android.user.UserAttribute -> com.batch.android.b1.d: +# {"id":"sourceFile","fileName":"UserAttribute.java"} + com.batch.android.user.AttributeType type -> b + java.lang.Object value -> a + 1:3:void (java.lang.Object,com.batch.android.user.AttributeType):14:16 -> + 1:13:java.util.Map getServerMapRepresentation(java.util.Map):20:32 -> a + 1:7:boolean equals(java.lang.Object):44:50 -> equals + 1:1:java.lang.String toString():55:55 -> toString +com.batch.android.user.UserDataDiff -> com.batch.android.b1.e: +# {"id":"sourceFile","fileName":"UserDataDiff.java"} + com.batch.android.user.UserDataDiff$Result result -> a + 1:14:void (java.util.Map,java.util.Map,java.util.Map,java.util.Map):26:39 -> + 1:15:void computeAttributes(java.util.Map,java.util.Map):52:66 -> a + 16:48:void computeTagSetDiff(java.util.Set,java.util.Set,java.util.Set[]):104:136 -> a + 49:49:void computeTagSetDiff(java.util.Set,java.util.Set,java.util.Set[]):116:116 -> a + 50:53:void computeTagSetDiff(java.util.Set,java.util.Set,java.util.Set[]):109:112 -> a + 1:24:void computeTags(java.util.Map,java.util.Map):73:96 -> b +com.batch.android.user.UserDataDiff$1 -> com.batch.android.b1.e$a: +# {"id":"sourceFile","fileName":"UserDataDiff.java"} +com.batch.android.user.UserDataDiff$Result -> com.batch.android.b1.e$b: +# {"id":"sourceFile","fileName":"UserDataDiff.java"} + java.util.Map addedAttributes -> a + java.util.Map removedAttributes -> b + java.util.Map addedTags -> c + java.util.Map removedTags -> d + 1:1:void (com.batch.android.user.UserDataDiff$1):143:143 -> + 2:2:void ():151:151 -> + 1:5:boolean hasChanges():154:158 -> a + 6:10:com.batch.android.json.JSONObject toEventParameters(long):166:170 -> a + 11:23:com.batch.android.json.JSONObject convertToJson(java.util.Map,java.util.Map):179:191 -> a +com.batch.android.user.UserDatabaseException -> com.batch.android.b1.f: +# {"id":"sourceFile","fileName":"UserDatabaseException.java"} + 1:1:void (java.lang.String):6:6 -> +com.batch.android.user.UserDatabaseHelper -> com.batch.android.b1.g: +# {"id":"sourceFile","fileName":"UserDatabaseHelper.java"} + java.lang.String COLUMN_TAG_COLLECTION -> g + java.lang.String TABLE_TAGS -> f + java.lang.String COLUMN_TAG_CHANGESET -> i + java.lang.String COLUMN_TAG_VALUE -> h + java.lang.String DATABASE_NAME -> j + int DATABASE_VERSION -> k + java.lang.String TABLE_ATTRIBUTES -> a + java.lang.String COLUMN_ATTR_TYPE -> c + java.lang.String COLUMN_ATTR_NAME -> b + java.lang.String COLUMN_ATTR_CHANGESET -> e + java.lang.String COLUMN_ATTR_VALUE -> d + 1:1:void (android.content.Context):34:34 -> + 1:25:void onCreate(android.database.sqlite.SQLiteDatabase):39:63 -> onCreate +com.batch.android.user.UserDatasource -> com.batch.android.b1.h: +# {"id":"sourceFile","fileName":"UserDatasource.java"} + void acquireTransactionLock(long) -> a + void clearTags(java.lang.String) -> a + java.lang.String printDebugDump() -> a + void setAttribute(java.lang.String,double) -> a + void setAttribute(java.lang.String,long) -> a + void setAttribute(java.lang.String,java.lang.String) -> a + void setAttribute(java.lang.String,java.net.URI) -> a + void setAttribute(java.lang.String,java.util.Date) -> a + void setAttribute(java.lang.String,boolean) -> a + void addTag(java.lang.String,java.lang.String) -> b + void commitTransaction() -> b + void removeAttribute(java.lang.String) -> b + void clearTags() -> c + void removeTag(java.lang.String,java.lang.String) -> c + void clearAttributes() -> d + java.util.HashMap getAttributes() -> e + java.util.Map getTagCollections() -> f + void rollbackTransaction() -> g +com.batch.android.user.UserOperation -> com.batch.android.b1.i: +# {"id":"sourceFile","fileName":"UserOperation.java"} + void execute(com.batch.android.user.SQLUserDatasource) -> a +com.batch.android.user.UserOperationQueue -> com.batch.android.b1.j: +# {"id":"sourceFile","fileName":"UserOperationQueue.java"} + java.util.List operationQueue -> a + 1:2:void ():13:14 -> + 3:4:void (java.util.List):17:18 -> + 1:3:void addFirstOperation(com.batch.android.user.UserOperation):36:38 -> a + 4:8:java.util.List popOperations():46:50 -> a + 1:3:void addOperation(com.batch.android.user.UserOperation):26:28 -> b + 4:6:int size():58:60 -> b +com.batch.android.util.MetaDataUtils -> com.batch.android.c1.a: +# {"id":"sourceFile","fileName":"MetaDataUtils.java"} + java.lang.String MANIFEST_SENDER_ID_KEY -> a + java.lang.String MANIFEST_FORCE_FCM_IID_KEY -> b + 1:1:void ():10:10 -> + 1:2:android.os.Bundle getAppMetaData(android.content.Context):25:26 -> a + 3:8:boolean getBooleanMetaData(android.content.Context,java.lang.String):39:44 -> a + 1:6:int getIntMetaData(android.content.Context,java.lang.String):58:63 -> b +com.batch.android.webservice.listener.AttributesCheckWebserviceListener -> com.batch.android.d1.a: +# {"id":"sourceFile","fileName":"AttributesCheckWebserviceListener.java"} + void onError(com.batch.android.FailReason) -> a + void onSuccess(com.batch.android.query.response.AttributesCheckResponse) -> a +com.batch.android.webservice.listener.AttributesSendWebserviceListener -> com.batch.android.d1.b: +# {"id":"sourceFile","fileName":"AttributesSendWebserviceListener.java"} + void onError(com.batch.android.FailReason) -> a + void onSuccess(com.batch.android.query.response.AttributesSendResponse) -> a +com.batch.android.webservice.listener.DisplayReceiptWebserviceListener -> com.batch.android.d1.c: +# {"id":"sourceFile","fileName":"DisplayReceiptWebserviceListener.java"} + void onFailure(com.batch.android.core.Webservice$WebserviceError) -> a +com.batch.android.webservice.listener.InboxWebserviceListener -> com.batch.android.d1.d: +# {"id":"sourceFile","fileName":"InboxWebserviceListener.java"} + void onFailure(java.lang.String) -> a + void onSuccess(com.batch.android.inbox.InboxWebserviceResponse) -> a +com.batch.android.webservice.listener.LocalCampaignsJITWebserviceListener -> com.batch.android.d1.e: +# {"id":"sourceFile","fileName":"LocalCampaignsJITWebserviceListener.java"} + void onFailure(com.batch.android.core.Webservice$WebserviceError) -> a + void onSuccess(java.util.List) -> a +com.batch.android.webservice.listener.LocalCampaignsWebserviceListener -> com.batch.android.d1.f: +# {"id":"sourceFile","fileName":"LocalCampaignsWebserviceListener.java"} + void onError(com.batch.android.FailReason) -> a + void onSuccess(java.util.List) -> a +com.batch.android.webservice.listener.MetricWebserviceListener -> com.batch.android.d1.g: +# {"id":"sourceFile","fileName":"MetricWebserviceListener.java"} + void onFailure(com.batch.android.core.Webservice$WebserviceError) -> a +com.batch.android.webservice.listener.PushWebserviceListener -> com.batch.android.d1.h: +# {"id":"sourceFile","fileName":"PushWebserviceListener.java"} + void onError(com.batch.android.FailReason) -> a +com.batch.android.webservice.listener.StartWebserviceListener -> com.batch.android.d1.i: +# {"id":"sourceFile","fileName":"StartWebserviceListener.java"} + void onError(com.batch.android.FailReason) -> a +com.batch.android.webservice.listener.TrackerWebserviceListener -> com.batch.android.d1.j: +# {"id":"sourceFile","fileName":"TrackerWebserviceListener.java"} + void onFailure(com.batch.android.FailReason,java.util.List) -> a + void onFinish() -> a + void onSuccess(java.util.List) -> a +com.batch.android.webservice.listener.impl.AttributesCheckWebserviceListenerImpl -> com.batch.android.e1.a: +# {"id":"sourceFile","fileName":"AttributesCheckWebserviceListenerImpl.java"} + long DEFAULT_RECHECK_TIME -> a + 1:1:void ():12:12 -> + 1:38:void onSuccess(com.batch.android.query.response.AttributesCheckResponse):20:57 -> a + 39:48:void onSuccess(com.batch.android.query.response.AttributesCheckResponse):38:47 -> a + 49:87:void onSuccess(com.batch.android.query.response.AttributesCheckResponse):27:65 -> a + 88:88:void onError(com.batch.android.FailReason):71:71 -> a +com.batch.android.webservice.listener.impl.AttributesCheckWebserviceListenerImpl$1 -> com.batch.android.e1.a$a: +# {"id":"sourceFile","fileName":"AttributesCheckWebserviceListenerImpl.java"} + int[] $SwitchMap$com$batch$android$query$response$AttributesCheckResponse$Action -> a + 1:1:void ():20:20 -> +com.batch.android.webservice.listener.impl.AttributesSendWebserviceListenerImpl -> com.batch.android.e1.b: +# {"id":"sourceFile","fileName":"AttributesSendWebserviceListenerImpl.java"} + 1:1:void ():12:12 -> + 1:1:void onSuccess(com.batch.android.query.response.AttributesSendResponse):16:16 -> a + 2:2:void onError(com.batch.android.FailReason):21:21 -> a +com.batch.android.webservice.listener.impl.LocalCampaignsWebserviceListenerImpl -> com.batch.android.e1.c: +# {"id":"sourceFile","fileName":"LocalCampaignsWebserviceListenerImpl.java"} + com.batch.android.module.LocalCampaignsModule localCampaignsModule -> a + com.batch.android.localcampaigns.CampaignManager campaignManager -> b + 1:3:void (com.batch.android.module.LocalCampaignsModule,com.batch.android.localcampaigns.CampaignManager):28:30 -> + 1:3:com.batch.android.webservice.listener.impl.LocalCampaignsWebserviceListenerImpl provide():35:37 -> a + 4:5:void onSuccess(java.util.List):43:44 -> a + 6:7:void onError(com.batch.android.FailReason):50:51 -> a + 8:10:void handleInAppResponse(com.batch.android.query.response.LocalCampaignsResponse):55:57 -> a +com.batch.android.webservice.listener.impl.PushWebserviceListenerImpl -> com.batch.android.e1.d: +# {"id":"sourceFile","fileName":"PushWebserviceListenerImpl.java"} + 1:1:void ():10:10 -> + void onError(com.batch.android.FailReason) -> a +com.batch.android.webservice.listener.impl.StartWebserviceListenerImpl -> com.batch.android.e1.e: +# {"id":"sourceFile","fileName":"StartWebserviceListenerImpl.java"} + 1:1:void ():10:10 -> + void onError(com.batch.android.FailReason) -> a diff --git a/proguard-mappings/2.0.0/checksum.sha b/proguard-mappings/2.0.0/checksum.sha new file mode 100644 index 0000000..9e0c90f --- /dev/null +++ b/proguard-mappings/2.0.0/checksum.sha @@ -0,0 +1 @@ +d0288b616079044029f7cac7e3802faf4bd3fc04 public-sdk/Batch.aar diff --git a/proguard-mappings/2.0.0/mapping.txt b/proguard-mappings/2.0.0/mapping.txt new file mode 100644 index 0000000..7a4dae4 --- /dev/null +++ b/proguard-mappings/2.0.0/mapping.txt @@ -0,0 +1,11880 @@ +# compiler: R8 +# compiler_version: 8.3.36 +# common_typos_disable +# {"id":"com.android.tools.r8.mapping","version":"2.2"} +# pg_map_id: 600c0ca +# pg_map_hash: SHA-256 600c0cad02b4e564b1aec694d09717805e61e00d8db50360d04beb612f6f1181 +com.batch.android.AttributesCheckWebservice -> com.batch.android.a.a: +# {"id":"sourceFile","fileName":"AttributesCheckWebservice.java"} + long version -> r + java.lang.String transactionID -> s + com.batch.android.webservice.listener.AttributesCheckWebserviceListener listener -> t + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e1/a;"} + java.lang.String TAG -> u + 1:67:void (android.content.Context,long,java.lang.String,com.batch.android.webservice.listener.AttributesCheckWebserviceListener):0:66 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;JLjava/lang/String;Lcom/batch/android/e1/a;)V"} + 68:68:void (android.content.Context,long,java.lang.String,com.batch.android.webservice.listener.AttributesCheckWebserviceListener):61:61 -> + 69:69:void (android.content.Context,long,java.lang.String,com.batch.android.webservice.listener.AttributesCheckWebserviceListener):57:57 -> + 70:70:void (android.content.Context,long,java.lang.String,com.batch.android.webservice.listener.AttributesCheckWebserviceListener):53:53 -> + 1:1:java.lang.String getSpecificConnectTimeoutKey():177:177 -> A + 1:1:java.lang.String getSpecificReadTimeoutKey():182:182 -> B + 1:1:java.lang.String getSpecificRetryCountKey():187:187 -> C + 1:1:java.lang.String getURLSorterPatternParameterKey():152:152 -> F + 1:1:java.lang.String getPropertyParameterKey():147:147 -> H + 1:3:java.util.List getQueries():73:75 -> I + 1:1:java.lang.String getTaskIdentifier():140:140 -> a + 1:1:java.lang.String getCryptorModeParameterKey():162:162 -> o + 1:1:java.lang.String getCryptorTypeParameterKey():157:157 -> p + 1:132:void run():0:131 -> run + 133:133:void run():125:125 -> run + 134:147:void run():92:105 -> run + 148:148:void run():102:102 -> run + 149:149:void run():99:99 -> run + 150:188:void run():96:134 -> run + 1:1:java.lang.String getPostCryptorTypeParameterKey():167:167 -> v + 1:1:java.lang.String getReadCryptorTypeParameterKey():172:172 -> y +com.batch.android.AttributesCheckWebservice$1 -> com.batch.android.a.a$a: +# {"id":"sourceFile","fileName":"AttributesCheckWebservice.java"} + int[] $SwitchMap$com$batch$android$core$Webservice$WebserviceError$Reason -> a + 1:1:void ():94:94 -> +com.batch.android.AttributesSendWebservice -> com.batch.android.a.b: +# {"id":"sourceFile","fileName":"AttributesSendWebservice.java"} + long version -> r + java.util.Map attributes -> s + java.util.Map tags -> t + com.batch.android.webservice.listener.AttributesSendWebserviceListener listener -> u + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e1/b;"} + java.lang.String TAG -> v + 1:79:void (android.content.Context,long,java.util.Map,java.util.Map,com.batch.android.webservice.listener.AttributesSendWebserviceListener):0:78 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;JLjava/util/Map;Ljava/util/Map;Lcom/batch/android/e1/b;)V"} + 80:80:void (android.content.Context,long,java.util.Map,java.util.Map,com.batch.android.webservice.listener.AttributesSendWebserviceListener):72:72 -> + 81:81:void (android.content.Context,long,java.util.Map,java.util.Map,com.batch.android.webservice.listener.AttributesSendWebserviceListener):68:68 -> + 82:82:void (android.content.Context,long,java.util.Map,java.util.Map,com.batch.android.webservice.listener.AttributesSendWebserviceListener):64:64 -> + 83:83:void (android.content.Context,long,java.util.Map,java.util.Map,com.batch.android.webservice.listener.AttributesSendWebserviceListener):60:60 -> + 1:1:java.lang.String getSpecificConnectTimeoutKey():185:185 -> A + 1:1:java.lang.String getSpecificReadTimeoutKey():190:190 -> B + 1:1:java.lang.String getSpecificRetryCountKey():195:195 -> C + 1:1:java.lang.String getURLSorterPatternParameterKey():160:160 -> F + 1:1:java.lang.String getPropertyParameterKey():155:155 -> H + 1:3:java.util.List getQueries():85:87 -> I + 1:1:java.lang.String getTaskIdentifier():148:148 -> a + 1:1:java.lang.String getCryptorModeParameterKey():170:170 -> o + 1:1:java.lang.String getCryptorTypeParameterKey():165:165 -> p + 1:140:void run():0:139 -> run + 141:141:void run():133:133 -> run + 142:155:void run():103:116 -> run + 156:156:void run():113:113 -> run + 157:157:void run():110:110 -> run + 158:193:void run():107:142 -> run + 1:1:java.lang.String getPostCryptorTypeParameterKey():175:175 -> v + 1:1:java.lang.String getReadCryptorTypeParameterKey():180:180 -> y +com.batch.android.AttributesSendWebservice$1 -> com.batch.android.a.b$a: +# {"id":"sourceFile","fileName":"AttributesSendWebservice.java"} + int[] $SwitchMap$com$batch$android$core$Webservice$WebserviceError$Reason -> a + 1:1:void ():105:105 -> +com.batch.android.Batch -> com.batch.android.Batch: +# {"id":"sourceFile","fileName":"Batch.java"} + com.batch.android.Install install -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/f;"} + android.content.BroadcastReceiver receiver -> b + android.content.Intent newIntent -> c + com.batch.android.core.ExcludedActivityHelper excludedActivityHelper -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/k;"} + java.lang.String sessionID -> e + boolean didLogOptOutWarning -> f + com.batch.android.module.BatchModule moduleMaster -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/m0/b;"} + 1:65:void ():98:162 -> + 1:1:void ():165:165 -> + 1:191:void lambda$disableMigration$1(java.util.EnumSet,com.batch.android.runtime.Config):0:190 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/util/EnumSet;Lcom/batch/android/a1/b;)V"} + 192:192:com.batch.android.runtime.State lambda$doBatchStart$7(com.batch.android.runtime.RuntimeManager,boolean,android.content.Context,boolean,java.util.concurrent.atomic.AtomicBoolean,java.lang.StringBuilder,com.batch.android.runtime.State,com.batch.android.runtime.Config):0:0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/a1/e;ZLandroid/content/Context;ZLjava/util/concurrent/atomic/AtomicBoolean;Ljava/lang/StringBuilder;Lcom/batch/android/a1/g;Lcom/batch/android/a1/b;)Lcom/batch/android/a1/g;"} + 2028:2298:com.batch.android.runtime.State lambda$doBatchStart$7(com.batch.android.runtime.RuntimeManager,boolean,android.content.Context,boolean,java.util.concurrent.atomic.AtomicBoolean,java.lang.StringBuilder,com.batch.android.runtime.State,com.batch.android.runtime.Config):1836:2106 -> a + 2299:2348:com.batch.android.runtime.State lambda$doBatchStart$7(com.batch.android.runtime.RuntimeManager,boolean,android.content.Context,boolean,java.util.concurrent.atomic.AtomicBoolean,java.lang.StringBuilder,com.batch.android.runtime.State,com.batch.android.runtime.Config):2104:2153 -> a + 2349:2349:void lambda$doBatchStart$8(com.batch.android.runtime.RuntimeManager,java.util.concurrent.atomic.AtomicBoolean,java.lang.StringBuilder,boolean,com.batch.android.runtime.State):0:0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/a1/e;Ljava/util/concurrent/atomic/AtomicBoolean;Ljava/lang/StringBuilder;ZLcom/batch/android/a1/g;)V"} + 4522:4523:void lambda$doBatchStart$8(com.batch.android.runtime.RuntimeManager,java.util.concurrent.atomic.AtomicBoolean,java.lang.StringBuilder,boolean,com.batch.android.runtime.State):2173:2174 -> a + 4524:4524:void lambda$doBatchStart$8(com.batch.android.runtime.RuntimeManager,java.util.concurrent.atomic.AtomicBoolean,java.lang.StringBuilder,boolean,com.batch.android.runtime.State):2171:2171 -> a + 4525:4525:void lambda$doBatchStart$9(com.batch.android.runtime.Config):0:0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/a1/b;)V"} + 6707:6708:void lambda$doBatchStart$9(com.batch.android.runtime.Config):2182:2183 -> a + 6709:6709:com.batch.android.runtime.State lambda$onStop$10(boolean,android.content.Context,boolean,com.batch.android.runtime.State,com.batch.android.runtime.Config):0:0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(ZLandroid/content/Context;ZLcom/batch/android/a1/g;Lcom/batch/android/a1/b;)Lcom/batch/android/a1/g;"} + 8923:8987:com.batch.android.runtime.State lambda$onStop$10(boolean,android.content.Context,boolean,com.batch.android.runtime.State,com.batch.android.runtime.Config):2214:2278 -> a + 8988:8988:com.batch.android.runtime.State lambda$onStop$10(boolean,android.content.Context,boolean,com.batch.android.runtime.State,com.batch.android.runtime.Config):2266:2266 -> a + 8989:8989:void lambda$onWebserviceExecutorWorkFinished$11(java.util.concurrent.atomic.AtomicBoolean,com.batch.android.runtime.State):0:0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/util/concurrent/atomic/AtomicBoolean;Lcom/batch/android/a1/g;)V"} + 11290:11290:void lambda$onWebserviceExecutorWorkFinished$11(java.util.concurrent.atomic.AtomicBoolean,com.batch.android.runtime.State):2301:2301 -> a + 11291:11493:void lambda$setLoggerDelegate$2(com.batch.android.LoggerDelegate,com.batch.android.runtime.Config):0:202 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/LoggerDelegate;Lcom/batch/android/a1/b;)V"} + 11494:11710:void lambda$setLoggerLevel$3(com.batch.android.LoggerLevel,com.batch.android.runtime.Config):0:216 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/LoggerLevel;Lcom/batch/android/a1/b;)V"} + 11711:11887:void lambda$start$0(java.lang.String,com.batch.android.runtime.Config):0:176 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Lcom/batch/android/a1/b;)V"} + 11888:11888:com.batch.android.Install access$000():77:77 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/f;"} + 11889:11890:void lambda$getSessionID$4(java.lang.StringBuilder,com.batch.android.runtime.State):241:242 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/StringBuilder;Lcom/batch/android/a1/g;)V"} + 11891:11899:void _optOut(android.content.Context,boolean,com.batch.android.BatchOptOutResultListener):375:383 -> a + 11900:11900:void _optOut(android.content.Context,boolean,com.batch.android.BatchOptOutResultListener):371:371 -> a + 11901:11904:void lambda$_optOut$5(android.content.Context,java.lang.Void):378:381 -> a + 11905:11905:void lambda$_optOut$6(com.batch.android.BatchOptOutResultListener,java.lang.Exception):385:385 -> a + 11906:12273:void doBatchStart(android.content.Context,boolean,boolean):1828:2195 -> a + 12274:12285:com.batch.android.runtime.State lambda$doStop$12(com.batch.android.runtime.State,com.batch.android.runtime.Config):2323:2334 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/a1/g;Lcom/batch/android/a1/b;)Lcom/batch/android/a1/g;"} + 1:1:void access$100():77:77 -> b + 2:80:void onStop(android.content.Context,boolean,boolean):2210:2288 -> b + 1:1:void access$200():77:77 -> c + 1:1:void copyBatchExtras(android.content.Intent,android.content.Intent):263:263 -> copyBatchExtras + 2:2:void copyBatchExtras(android.os.Bundle,android.os.Bundle):276:276 -> copyBatchExtras + 1:2:void clearCachedInstallData():2357:2358 -> d + 1:4:void disableMigration(java.util.EnumSet):187:190 -> disableMigration + 1:22:void doStop():2319:2340 -> e + 1:1:com.batch.android.Install getInstall():2370:2370 -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/f;"} + 1:10:void onWebserviceExecutorWorkFinished():2298:2307 -> g + 1:1:java.lang.String getBroadcastPermissionName(android.content.Context):286:286 -> getBroadcastPermissionName + 1:12:java.lang.String getSessionID():236:247 -> getSessionID + 1:18:void updateVersionManagement():2380:2397 -> h + 1:1:boolean isOptedOut(android.content.Context):418:418 -> isOptedOut + 2:2:boolean isOptedOut(android.content.Context):416:416 -> isOptedOut + 1:3:void onCreate(android.app.Activity):1739:1741 -> onCreate + 1:1:void onDestroy(android.app.Activity):1821:1821 -> onDestroy + 1:2:void onNewIntent(android.app.Activity,android.content.Intent):1800:1801 -> onNewIntent + 1:1:void onServiceCreate(android.content.Context,boolean):1779:1779 -> onServiceCreate + 1:1:void onServiceDestroy(android.content.Context):1790:1790 -> onServiceDestroy + 1:1:void onStart(android.app.Activity):1758:1758 -> onStart + 1:1:void onStop(android.app.Activity):1811:1811 -> onStop + 1:1:void optIn(android.content.Context):405:405 -> optIn + 2:2:void optIn(android.content.Context):403:403 -> optIn + 1:1:void optOut(android.content.Context):312:312 -> optOut + 2:2:void optOut(android.content.Context,com.batch.android.BatchOptOutResultListener):328:328 -> optOut + 1:1:void optOutAndWipeData(android.content.Context):342:342 -> optOutAndWipeData + 2:2:void optOutAndWipeData(android.content.Context,com.batch.android.BatchOptOutResultListener):361:361 -> optOutAndWipeData + 1:1:void setFindMyInstallationEnabled(boolean):430:430 -> setFindMyInstallationEnabled + 1:1:void setLoggerDelegate(com.batch.android.LoggerDelegate):202:202 -> setLoggerDelegate + 1:4:void setLoggerLevel(com.batch.android.LoggerLevel):213:216 -> setLoggerLevel + 1:1:void start(java.lang.String):176:176 -> start + 1:1:void updateAutomaticDataCollection(com.batch.android.BatchDataCollectionConfig$Editor):226:226 -> updateAutomaticDataCollection +com.batch.android.Batch$1 -> com.batch.android.Batch$a: +# {"id":"sourceFile","fileName":"Batch.java"} +com.batch.android.Batch$Actions -> com.batch.android.Batch$Actions: +# {"id":"sourceFile","fileName":"Batch.java"} + 1:1:void ():1658:1658 -> + 1:1:void addDrawableAlias(java.lang.String,int):1698:1698 -> addDrawableAlias + 1:1:boolean performAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject):1715:1715 -> performAction + 1:1:void register(com.batch.android.UserAction):1670:1670 -> register + 1:1:void setDeeplinkInterceptor(com.batch.android.BatchDeeplinkInterceptor):1724:1724 -> setDeeplinkInterceptor + 1:1:void unregister(java.lang.String):1682:1682 -> unregister +com.batch.android.Batch$Debug -> com.batch.android.Batch$Debug: +# {"id":"sourceFile","fileName":"Batch.java"} + 1:1:void ():441:441 -> + 1:2:void startDebugActivity(android.content.Context):452:453 -> startDebugActivity +com.batch.android.Batch$EventDispatcher -> com.batch.android.Batch$EventDispatcher: +# {"id":"sourceFile","fileName":"Batch.java"} + 1:1:void ():1033:1033 -> + 1:1:void addDispatcher(com.batch.android.BatchEventDispatcher):1042:1042 -> addDispatcher + 1:1:boolean removeDispatcher(com.batch.android.BatchEventDispatcher):1051:1051 -> removeDispatcher +com.batch.android.Batch$EventDispatcher$Payload -> com.batch.android.Batch$EventDispatcher$Payload: +# {"id":"sourceFile","fileName":"Batch.java"} +com.batch.android.Batch$EventDispatcher$Type -> com.batch.android.Batch$EventDispatcher$Type: +# {"id":"sourceFile","fileName":"Batch.java"} + com.batch.android.Batch$EventDispatcher$Type[] $VALUES -> a + 1:9:void ():1060:1068 -> + 10:10:void ():1058:1058 -> + 1:1:void (java.lang.String,int):1059:1059 -> + 1:1:com.batch.android.Batch$EventDispatcher$Type[] $values():1058:1058 -> a + 1:1:boolean isMessagingEvent():1075:1075 -> isMessagingEvent + 1:1:boolean isNotificationEvent():1071:1071 -> isNotificationEvent + 1:1:com.batch.android.Batch$EventDispatcher$Type valueOf(java.lang.String):1058:1058 -> valueOf + 1:1:com.batch.android.Batch$EventDispatcher$Type[] values():1058:1058 -> values +com.batch.android.Batch$Inbox -> com.batch.android.Batch$Inbox: +# {"id":"sourceFile","fileName":"Batch.java"} + 1:1:void ():465:465 -> + 1:2:com.batch.android.BatchInboxFetcher getFetcher(android.content.Context):480:481 -> getFetcher + 3:3:com.batch.android.BatchInboxFetcher getFetcher(android.content.Context):478:478 -> getFetcher + 4:4:com.batch.android.BatchInboxFetcher getFetcher(android.content.Context,java.lang.String,java.lang.String):503:503 -> getFetcher + 5:5:com.batch.android.BatchInboxFetcher getFetcher(android.content.Context,java.lang.String,java.lang.String):501:501 -> getFetcher +com.batch.android.Batch$InternalBroadcastReceiver -> com.batch.android.Batch$b: +# {"id":"sourceFile","fileName":"Batch.java"} + 1:1:void ():2401:2401 -> + 2:2:void (com.batch.android.Batch$1):2401:2401 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/Batch$a;)V"} + 1:12:void onReceive(android.content.Context,android.content.Intent):2409:2420 -> onReceive + 13:13:void onReceive(android.content.Context,android.content.Intent):2417:2417 -> onReceive +com.batch.android.Batch$Messaging -> com.batch.android.Batch$Messaging: +# {"id":"sourceFile","fileName":"Batch.java"} + 1:1:void ():1332:1332 -> + 1:1:boolean hasPendingMessage():1634:1634 -> hasPendingMessage + 1:1:boolean isDoNotDisturbEnabled():1625:1625 -> isDoNotDisturbEnabled + 1:1:com.batch.android.BatchBannerView loadBanner(android.content.Context,com.batch.android.BatchMessage):1575:1575 -> loadBanner + 1:1:androidx.fragment.app.DialogFragment loadFragment(android.content.Context,com.batch.android.BatchMessage):1556:1556 -> loadFragment + 1:1:com.batch.android.BatchMessage popPendingMessage():1647:1647 -> popPendingMessage + 1:1:void setAutomaticMode(boolean):1510:1510 -> setAutomaticMode + 1:1:void setDoNotDisturbEnabled(boolean):1618:1618 -> setDoNotDisturbEnabled + 1:1:void setLifecycleListener(com.batch.android.Batch$Messaging$LifecycleListener):1532:1532 -> setLifecycleListener + 1:1:void setShowForegroundLandings(boolean):1499:1499 -> setShowForegroundLandings + 1:1:void setTypefaceOverride(android.graphics.Typeface,android.graphics.Typeface):1523:1523 -> setTypefaceOverride + 1:1:void show(android.content.Context,com.batch.android.BatchMessage):1598:1598 -> show + 2:2:void show(android.content.Context,com.batch.android.BatchMessage):1596:1596 -> show + 3:3:void show(android.content.Context,com.batch.android.BatchMessage):1593:1593 -> show +com.batch.android.Batch$Messaging$DisplayHint -> com.batch.android.Batch$Messaging$DisplayHint: +# {"id":"sourceFile","fileName":"Batch.java"} + com.batch.android.Batch$Messaging$DisplayHintStrategy strategy -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/Batch$Messaging$a;"} + android.view.View view -> b + 1:3:void (android.view.View,com.batch.android.Batch$Messaging$DisplayHintStrategy):1454:1456 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/view/View;Lcom/batch/android/Batch$Messaging$a;)V"} + 1:1:com.batch.android.Batch$Messaging$DisplayHint embed(android.widget.FrameLayout):1482:1482 -> embed + 2:2:com.batch.android.Batch$Messaging$DisplayHint embed(android.widget.FrameLayout):1479:1479 -> embed + 1:1:com.batch.android.Batch$Messaging$DisplayHint findUsingView(android.view.View):1469:1469 -> findUsingView + 2:2:com.batch.android.Batch$Messaging$DisplayHint findUsingView(android.view.View):1466:1466 -> findUsingView +com.batch.android.Batch$Messaging$DisplayHintProvider -> com.batch.android.Batch$Messaging$DisplayHintProvider: +# {"id":"sourceFile","fileName":"Batch.java"} +com.batch.android.Batch$Messaging$DisplayHintStrategy -> com.batch.android.Batch$Messaging$a: +# {"id":"sourceFile","fileName":"Batch.java"} + com.batch.android.Batch$Messaging$DisplayHintStrategy TRANSVERSE_HIERARCHY -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/Batch$Messaging$a;"} + com.batch.android.Batch$Messaging$DisplayHintStrategy EMBED -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/Batch$Messaging$a;"} + com.batch.android.Batch$Messaging$DisplayHintStrategy[] $VALUES -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/Batch$Messaging$a;"} + 1:2:void ():1439:1440 -> + 3:3:void ():1438:1438 -> + 1:1:void (java.lang.String,int):1438:1438 -> + 1:1:com.batch.android.Batch$Messaging$DisplayHintStrategy[] $values():1438:1438 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/Batch$Messaging$a;"} + 1:1:com.batch.android.Batch$Messaging$DisplayHintStrategy valueOf(java.lang.String):1438:1438 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/Batch$Messaging$a;"} + 1:1:com.batch.android.Batch$Messaging$DisplayHintStrategy[] values():1438:1438 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/Batch$Messaging$a;"} +com.batch.android.Batch$Messaging$LifecycleListener -> com.batch.android.Batch$Messaging$LifecycleListener: +# {"id":"sourceFile","fileName":"Batch.java"} +com.batch.android.Batch$Messaging$LifecycleListener2 -> com.batch.android.Batch$Messaging$LifecycleListener2: +# {"id":"sourceFile","fileName":"Batch.java"} +com.batch.android.Batch$Profile -> com.batch.android.Batch$Profile: +# {"id":"sourceFile","fileName":"Batch.java"} + 1:1:void ():1261:1261 -> + 1:1:com.batch.android.BatchProfileAttributeEditor editor():1283:1283 -> editor + 1:1:void identify(java.lang.String):1269:1269 -> identify + 1:1:void trackEvent(java.lang.String):1293:1293 -> trackEvent + 2:2:void trackEvent(java.lang.String,com.batch.android.BatchEventAttributes):1304:1304 -> trackEvent + 1:1:void trackLocation(android.location.Location):1317:1317 -> trackLocation +com.batch.android.Batch$Push -> com.batch.android.Batch$Push: +# {"id":"sourceFile","fileName":"Batch.java"} + 1:1:void ():515:515 -> + 1:1:void appendBatchData(android.content.Intent,android.content.Intent):674:674 -> appendBatchData + 2:2:void appendBatchData(android.os.Bundle,android.content.Intent):685:685 -> appendBatchData + 3:3:void appendBatchData(com.google.firebase.messaging.RemoteMessage,android.content.Intent):696:696 -> appendBatchData + 1:1:void dismissNotifications():586:586 -> dismissNotifications + 1:1:void displayNotification(android.content.Context,android.content.Intent):864:864 -> displayNotification + 2:2:void displayNotification(android.content.Context,android.content.Intent,boolean):875:875 -> displayNotification + 3:3:void displayNotification(android.content.Context,android.content.Intent,com.batch.android.BatchNotificationInterceptor):890:890 -> displayNotification + 4:4:void displayNotification(android.content.Context,android.content.Intent,com.batch.android.BatchNotificationInterceptor,boolean):908:908 -> displayNotification + 5:5:void displayNotification(android.content.Context,com.google.firebase.messaging.RemoteMessage):915:915 -> displayNotification + 6:6:void displayNotification(android.content.Context,com.google.firebase.messaging.RemoteMessage,com.batch.android.BatchNotificationInterceptor):927:927 -> displayNotification + 1:1:com.batch.android.BatchNotificationChannelsManager getChannelsManager():573:573 -> getChannelsManager + 1:1:java.util.EnumSet getNotificationsType(android.content.Context):597:597 -> getNotificationsType + 1:1:com.batch.android.BatchPushRegistration getRegistration():972:972 -> getRegistration + 1:1:boolean isBatchPush(android.content.Intent):624:624 -> isBatchPush + 2:2:boolean isBatchPush(com.google.firebase.messaging.RemoteMessage):636:636 -> isBatchPush + 1:1:boolean isManualDisplayModeActivated():653:653 -> isManualDisplayModeActivated + 1:1:android.app.PendingIntent makePendingIntent(android.content.Context,android.content.Intent,android.os.Bundle):731:731 -> makePendingIntent + 2:2:android.app.PendingIntent makePendingIntent(android.content.Context,android.content.Intent,android.os.Bundle):728:728 -> makePendingIntent + 3:3:android.app.PendingIntent makePendingIntent(android.content.Context,android.content.Intent,android.os.Bundle):724:724 -> makePendingIntent + 4:4:android.app.PendingIntent makePendingIntent(android.content.Context,android.content.Intent,android.os.Bundle):720:720 -> makePendingIntent + 5:5:android.app.PendingIntent makePendingIntent(android.content.Context,android.content.Intent,com.google.firebase.messaging.RemoteMessage):766:766 -> makePendingIntent + 6:6:android.app.PendingIntent makePendingIntent(android.content.Context,android.content.Intent,com.google.firebase.messaging.RemoteMessage):763:763 -> makePendingIntent + 7:7:android.app.PendingIntent makePendingIntent(android.content.Context,android.content.Intent,com.google.firebase.messaging.RemoteMessage):759:759 -> makePendingIntent + 8:8:android.app.PendingIntent makePendingIntent(android.content.Context,android.content.Intent,com.google.firebase.messaging.RemoteMessage):755:755 -> makePendingIntent + 1:1:android.app.PendingIntent makePendingIntentForDeeplink(android.content.Context,java.lang.String,android.os.Bundle):799:799 -> makePendingIntentForDeeplink + 2:2:android.app.PendingIntent makePendingIntentForDeeplink(android.content.Context,java.lang.String,android.os.Bundle):796:796 -> makePendingIntentForDeeplink + 3:3:android.app.PendingIntent makePendingIntentForDeeplink(android.content.Context,java.lang.String,android.os.Bundle):792:792 -> makePendingIntentForDeeplink + 4:4:android.app.PendingIntent makePendingIntentForDeeplink(android.content.Context,java.lang.String,android.os.Bundle):788:788 -> makePendingIntentForDeeplink + 5:5:android.app.PendingIntent makePendingIntentForDeeplink(android.content.Context,java.lang.String,com.google.firebase.messaging.RemoteMessage):832:832 -> makePendingIntentForDeeplink + 6:6:android.app.PendingIntent makePendingIntentForDeeplink(android.content.Context,java.lang.String,com.google.firebase.messaging.RemoteMessage):829:829 -> makePendingIntentForDeeplink + 7:7:android.app.PendingIntent makePendingIntentForDeeplink(android.content.Context,java.lang.String,com.google.firebase.messaging.RemoteMessage):825:825 -> makePendingIntentForDeeplink + 8:8:android.app.PendingIntent makePendingIntentForDeeplink(android.content.Context,java.lang.String,com.google.firebase.messaging.RemoteMessage):821:821 -> makePendingIntentForDeeplink + 1:1:void onNotificationDisplayed(android.content.Context,android.content.Intent):947:947 -> onNotificationDisplayed + 2:2:void onNotificationDisplayed(android.content.Context,com.google.firebase.messaging.RemoteMessage):957:957 -> onNotificationDisplayed + 1:1:void refreshRegistration():989:989 -> refreshRegistration + 1:1:void requestNotificationPermission(android.content.Context):1003:1003 -> requestNotificationPermission + 2:2:void requestNotificationPermission(android.content.Context,com.batch.android.BatchPermissionListener):1021:1021 -> requestNotificationPermission + 1:1:void setAdditionalIntentFlags(java.lang.Integer):937:937 -> setAdditionalIntentFlags + 1:1:void setLargeIcon(android.graphics.Bitmap):564:564 -> setLargeIcon + 1:1:void setManualDisplay(boolean):663:663 -> setManualDisplay + 1:1:void setNotificationInterceptor(com.batch.android.BatchNotificationInterceptor):981:981 -> setNotificationInterceptor + 1:1:void setNotificationsColor(int):646:646 -> setNotificationsColor + 1:1:void setNotificationsType(java.util.EnumSet):612:612 -> setNotificationsType + 1:1:void setSmallIconResourceId(int):542:542 -> setSmallIconResourceId + 1:1:void setSound(android.net.Uri):555:555 -> setSound + 1:1:boolean shouldDisplayPush(android.content.Context,android.content.Intent):842:842 -> shouldDisplayPush + 2:2:boolean shouldDisplayPush(android.content.Context,com.google.firebase.messaging.RemoteMessage):854:854 -> shouldDisplayPush +com.batch.android.Batch$User -> com.batch.android.Batch$User: +# {"id":"sourceFile","fileName":"Batch.java"} + 1:1:void ():1159:1159 -> + 1:1:void clearInstallationData():1251:1251 -> clearInstallationData + 1:1:void fetchAttributes(android.content.Context,com.batch.android.BatchAttributesFetchListener):1230:1230 -> fetchAttributes + 1:1:void fetchTagCollections(android.content.Context,com.batch.android.BatchTagCollectionsFetchListener):1243:1243 -> fetchTagCollections + 1:1:java.lang.String getIdentifier(android.content.Context):1217:1217 -> getIdentifier + 2:2:java.lang.String getIdentifier(android.content.Context):1214:1214 -> getIdentifier + 1:3:java.lang.String getInstallationID():1169:1171 -> getInstallationID + 1:1:java.lang.String getLanguage(android.content.Context):1188:1188 -> getLanguage + 2:2:java.lang.String getLanguage(android.content.Context):1186:1186 -> getLanguage + 1:1:java.lang.String getRegion(android.content.Context):1202:1202 -> getRegion + 2:2:java.lang.String getRegion(android.content.Context):1200:1200 -> getRegion +com.batch.android.BatchActionActivity -> com.batch.android.BatchActionActivity: +# {"id":"sourceFile","fileName":"BatchActionActivity.java"} + java.lang.String TAG -> a + 1:1:void ():20:20 -> + 1:1:android.content.Intent addPayloadToIntent(android.content.Intent,android.os.Bundle):28:28 -> a + 2:5:androidx.core.app.TaskStackBuilder addPayloadToTaskStackBuilder(androidx.core.app.TaskStackBuilder,android.os.Bundle):38:41 -> a + 6:40:void launchDeeplink(android.content.Intent,java.lang.String):56:90 -> a + 41:46:void launchDeeplink(android.content.Intent,java.lang.String):81:86 -> a + 47:94:void launchDeeplink(android.content.Intent,java.lang.String):64:111 -> a + 95:100:void launchDeeplink(android.content.Intent,java.lang.String):102:107 -> a + 101:126:void launchDeeplink(android.content.Intent,java.lang.String):94:119 -> a + 1:2:void onDestroy():163:164 -> onDestroy + 1:19:void onStart():124:142 -> onStart + 20:20:void onStart():136:136 -> onStart + 21:39:void onStart():134:152 -> onStart + 1:2:void onStop():157:158 -> onStop +com.batch.android.BatchActionService -> com.batch.android.BatchActionService: +# {"id":"sourceFile","fileName":"BatchActionService.java"} + java.lang.String TAG -> a + java.lang.String INTENT_ACTION -> b + java.lang.String ACTION_EXTRA_IDENTIFIER -> c + java.lang.String ACTION_EXTRA_ARGS -> d + java.lang.String ACTION_EXTRA_DISMISS_NOTIFICATION_ID -> e + 1:1:void ():28:28 -> + 1:47:void onHandleIntent(android.content.Intent):33:79 -> onHandleIntent +com.batch.android.BatchActivityLifecycleHelper -> com.batch.android.BatchActivityLifecycleHelper: +# {"id":"sourceFile","fileName":"BatchActivityLifecycleHelper.java"} + 1:1:void ():18:18 -> + 1:1:void onActivityCreated(android.app.Activity,android.os.Bundle):22:22 -> onActivityCreated + 1:1:void onActivityDestroyed(android.app.Activity):46:46 -> onActivityDestroyed + 1:1:void onActivityStarted(android.app.Activity):27:27 -> onActivityStarted + 1:1:void onActivityStopped(android.app.Activity):38:38 -> onActivityStopped +com.batch.android.BatchAlertContent -> com.batch.android.BatchAlertContent: +# {"id":"sourceFile","fileName":"BatchAlertContent.java"} + java.lang.String trackingIdentifier -> a + java.lang.String title -> b + java.lang.String body -> c + java.lang.String cancelLabel -> d + com.batch.android.BatchAlertContent$CTA acceptCTA -> e + 1:34:void (com.batch.android.messaging.model.AlertMessage):0:33 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/b;)V"} + 1:1:com.batch.android.BatchAlertContent$CTA getAcceptCTA():59:59 -> getAcceptCTA + 1:1:java.lang.String getBody():49:49 -> getBody + 1:1:java.lang.String getCancelLabel():54:54 -> getCancelLabel + 1:1:java.lang.String getTitle():44:44 -> getTitle + 1:1:java.lang.String getTrackingIdentifier():39:39 -> getTrackingIdentifier +com.batch.android.BatchAlertContent$CTA -> com.batch.android.BatchAlertContent$CTA: +# {"id":"sourceFile","fileName":"BatchAlertContent.java"} + java.lang.String label -> a + java.lang.String action -> b + com.batch.android.json.JSONObject args -> c + 1:79:void (com.batch.android.messaging.model.CTA):0:78 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/e;)V"} + 1:1:java.lang.String getAction():90:90 -> getAction + 1:1:com.batch.android.json.JSONObject getArgs():95:95 -> getArgs + 1:1:java.lang.String getLabel():85:85 -> getLabel +com.batch.android.BatchAttributesFetchListener -> com.batch.android.BatchAttributesFetchListener: +# {"id":"sourceFile","fileName":"BatchAttributesFetchListener.java"} +com.batch.android.BatchBannerContent -> com.batch.android.BatchBannerContent: +# {"id":"sourceFile","fileName":"BatchBannerContent.java"} + java.lang.String trackingIdentifier -> a + java.lang.String title -> b + java.lang.String body -> c + java.util.List ctas -> d + com.batch.android.BatchBannerContent$Action globalTapAction -> e + java.lang.String mediaURL -> f + java.lang.String mediaAccessibilityDescription -> g + boolean showCloseButton -> h + java.lang.Long autoCloseTimeMillis -> i + 1:37:void (com.batch.android.messaging.model.BannerMessage):0:36 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/c;)V"} + 38:70:void (com.batch.android.messaging.model.BannerMessage):24:56 -> + 1:1:java.lang.Long getAutoCloseTimeMillis():93:93 -> getAutoCloseTimeMillis + 1:1:java.lang.String getBody():69:69 -> getBody + 1:1:java.util.List getCtas():73:73 -> getCtas + 1:1:com.batch.android.BatchBannerContent$Action getGlobalTapAction():77:77 -> getGlobalTapAction + 1:1:java.lang.String getMediaAccessibilityDescription():85:85 -> getMediaAccessibilityDescription + 1:1:java.lang.String getMediaURL():81:81 -> getMediaURL + 1:1:java.lang.String getTitle():65:65 -> getTitle + 1:1:java.lang.String getTrackingIdentifier():61:61 -> getTrackingIdentifier + 1:1:boolean isShowCloseButton():89:89 -> isShowCloseButton +com.batch.android.BatchBannerContent$Action -> com.batch.android.BatchBannerContent$Action: +# {"id":"sourceFile","fileName":"BatchBannerContent.java"} + java.lang.String action -> a + com.batch.android.json.JSONObject args -> b + 1:110:void (com.batch.android.messaging.model.Action):0:109 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/a;)V"} + 1:1:java.lang.String getAction():116:116 -> getAction + 1:1:com.batch.android.json.JSONObject getArgs():121:121 -> getArgs +com.batch.android.BatchBannerContent$CTA -> com.batch.android.BatchBannerContent$CTA: +# {"id":"sourceFile","fileName":"BatchBannerContent.java"} + java.lang.String label -> c + 1:133:void (com.batch.android.messaging.model.CTA):0:132 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/e;)V"} + 1:1:java.lang.String getLabel():137:137 -> getLabel +com.batch.android.BatchBannerView -> com.batch.android.BatchBannerView: +# {"id":"sourceFile","fileName":"BatchBannerView.java"} + com.batch.android.BatchMessage rawMessage -> a + com.batch.android.messaging.model.BannerMessage message -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/d0/c;"} + com.batch.android.messaging.view.formats.EmbeddedBannerContainer shownContainer -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/f0/b;"} + boolean shown -> d + com.batch.android.MessagingAnalyticsDelegate analyticsDelegate -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/h;"} + 1:40:void (com.batch.android.BatchMessage,com.batch.android.messaging.model.BannerMessage,com.batch.android.MessagingAnalyticsDelegate):0:39 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/BatchMessage;Lcom/batch/android/d0/c;Lcom/batch/android/h;)V"} + 41:52:void (com.batch.android.BatchMessage,com.batch.android.messaging.model.BannerMessage,com.batch.android.MessagingAnalyticsDelegate):31:42 -> + 1:8:void lambda$show$0(android.view.View):123:130 -> a + 9:16:void lambda$embed$1(android.widget.FrameLayout):163:170 -> a + 1:2:void dismiss(boolean):186:187 -> dismiss + 1:9:void embed(android.widget.FrameLayout):152:160 -> embed + 10:10:void embed(android.widget.FrameLayout):149:149 -> embed + 1:25:void show(android.app.Activity):64:88 -> show + 26:26:void show(android.app.Activity):58:58 -> show + 27:35:void show(android.view.View):112:120 -> show + 36:36:void show(android.view.View):109:109 -> show +com.batch.android.BatchBannerViewPrivateHelper -> com.batch.android.a: +# {"id":"sourceFile","fileName":"BatchBannerViewPrivateHelper.java"} + 1:1:void ():10:10 -> + 1:1:com.batch.android.BatchBannerView newInstance(com.batch.android.BatchMessage,com.batch.android.messaging.model.BannerMessage,com.batch.android.MessagingAnalyticsDelegate):17:17 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/BatchMessage;Lcom/batch/android/d0/c;Lcom/batch/android/h;)Lcom/batch/android/BatchBannerView;"} +com.batch.android.BatchDataCollectionConfig -> com.batch.android.BatchDataCollectionConfig: +# {"id":"sourceFile","fileName":"BatchDataCollectionConfig.java"} + java.lang.Boolean geoIPEnabled -> a + java.lang.Boolean deviceBrandEnabled -> b + java.lang.Boolean deviceModelEnabled -> c + 1:1:void ():11:11 -> + 1:1:java.lang.Boolean isDeviceBrandEnabled():92:92 -> isDeviceBrandEnabled + 1:1:java.lang.Boolean isDeviceModelEnabled():102:102 -> isDeviceModelEnabled + 1:1:java.lang.Boolean isGeoIpEnabled():82:82 -> isGeoIpEnabled + 1:1:com.batch.android.BatchDataCollectionConfig setDeviceBrandEnabled(boolean):60:60 -> setDeviceBrandEnabled + 1:1:com.batch.android.BatchDataCollectionConfig setDeviceModelEnabled(boolean):71:71 -> setDeviceModelEnabled + 1:1:com.batch.android.BatchDataCollectionConfig setGeoIPEnabled(boolean):49:49 -> setGeoIPEnabled + 1:1:java.lang.String toString():112:112 -> toString +com.batch.android.BatchDataCollectionConfig$Editor -> com.batch.android.BatchDataCollectionConfig$Editor: +# {"id":"sourceFile","fileName":"BatchDataCollectionConfig.java"} +com.batch.android.BatchDeeplinkInterceptor -> com.batch.android.BatchDeeplinkInterceptor: +# {"id":"sourceFile","fileName":"BatchDeeplinkInterceptor.java"} + 1:1:android.content.Intent getFallbackIntent(android.content.Context):31:31 -> getFallbackIntent +com.batch.android.BatchDisplayReceiptJobService -> com.batch.android.BatchDisplayReceiptJobService: +# {"id":"sourceFile","fileName":"BatchDisplayReceiptJobService.java"} + java.lang.String TAG -> a + 1:1:void ():17:17 -> + 1:3:boolean onStartJob(android.app.job.JobParameters):23:25 -> onStartJob +com.batch.android.BatchDisplayReceiptJobService$SendReceiptTask -> com.batch.android.BatchDisplayReceiptJobService$a: +# {"id":"sourceFile","fileName":"BatchDisplayReceiptJobService.java"} + java.lang.ref.WeakReference originService -> a + android.app.job.JobParameters originJobParameters -> b + 1:3:void (android.app.job.JobService,android.app.job.JobParameters):39:41 -> + 1:1:java.lang.Object doInBackground(java.lang.Object[]):34:34 -> doInBackground + 2:11:java.lang.Void doInBackground(java.lang.Void[]):46:55 -> doInBackground +com.batch.android.BatchEmailSubscriptionState -> com.batch.android.BatchEmailSubscriptionState: +# {"id":"sourceFile","fileName":"BatchEmailSubscriptionState.java"} + com.batch.android.BatchEmailSubscriptionState[] $VALUES -> a + 1:2:void ():10:11 -> + 3:3:void ():8:8 -> + 1:1:void (java.lang.String,int):9:9 -> + 1:1:com.batch.android.BatchEmailSubscriptionState[] $values():8:8 -> a + 1:1:com.batch.android.BatchEmailSubscriptionState valueOf(java.lang.String):8:8 -> valueOf + 1:1:com.batch.android.BatchEmailSubscriptionState[] values():8:8 -> values +com.batch.android.BatchEventAttributes -> com.batch.android.BatchEventAttributes: +# {"id":"sourceFile","fileName":"BatchEventAttributes.java"} + java.util.Map attributes -> a + java.util.Set tags -> b + java.lang.String label -> c + 1:2:void ():46:47 -> + 1:1:java.util.Map getAttributes():56:56 -> getAttributes + 1:1:java.lang.String getLabel():74:74 -> getLabel + 1:1:java.util.Set getTags():65:65 -> getTags + 1:5:com.batch.android.BatchEventAttributes put(java.lang.String,java.lang.String):85:89 -> put + 6:6:com.batch.android.BatchEventAttributes put(java.lang.String,java.net.URI):101:101 -> put + 7:7:com.batch.android.BatchEventAttributes put(java.lang.String,float):113:113 -> put + 8:8:com.batch.android.BatchEventAttributes put(java.lang.String,double):125:125 -> put + 9:9:com.batch.android.BatchEventAttributes put(java.lang.String,int):137:137 -> put + 10:10:com.batch.android.BatchEventAttributes put(java.lang.String,long):149:149 -> put + 11:11:com.batch.android.BatchEventAttributes put(java.lang.String,boolean):161:161 -> put + 12:12:com.batch.android.BatchEventAttributes put(java.lang.String,java.util.Date):173:173 -> put + 13:13:com.batch.android.BatchEventAttributes put(java.lang.String,com.batch.android.BatchEventAttributes):185:185 -> put + 1:1:com.batch.android.BatchEventAttributes putObjectList(java.lang.String,java.util.List):197:197 -> putObjectList + 1:5:com.batch.android.BatchEventAttributes putStringList(java.lang.String,java.util.List):209:213 -> putStringList + 1:1:java.util.List validateEventAttributes():223:223 -> validateEventAttributes +com.batch.android.BatchEventDispatcher -> com.batch.android.BatchEventDispatcher: +# {"id":"sourceFile","fileName":"BatchEventDispatcher.java"} +com.batch.android.BatchImageContent -> com.batch.android.BatchImageContent: +# {"id":"sourceFile","fileName":"BatchImageContent.java"} + com.batch.android.BatchImageContent$Action globalTapAction -> a + long globalTapDelay -> b + boolean allowSwipeToDismiss -> c + java.lang.String imageURL -> d + java.lang.String imageDescription -> e + com.batch.android.messaging.Size2D imageSize -> f + int autoCloseDelay -> g + boolean isFullscreen -> h + 1:38:void (com.batch.android.messaging.model.ImageMessage):0:37 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/f;)V"} + 1:1:int getAutoCloseDelay():75:75 -> getAutoCloseDelay + 1:1:com.batch.android.BatchImageContent$Action getGlobalTapAction():102:102 -> getGlobalTapAction + 1:1:long getGlobalTapDelay():98:98 -> getGlobalTapDelay + 1:1:java.lang.String getImageDescription():86:86 -> getImageDescription + 1:4:android.graphics.Point getImageSize():79:82 -> getImageSize + 1:1:java.lang.String getImageURL():90:90 -> getImageURL + 1:1:boolean isAllowSwipeToDismiss():94:94 -> isAllowSwipeToDismiss + 1:1:boolean isFullscreen():71:71 -> isFullscreen +com.batch.android.BatchImageContent$Action -> com.batch.android.BatchImageContent$Action: +# {"id":"sourceFile","fileName":"BatchImageContent.java"} + java.lang.String action -> a + com.batch.android.json.JSONObject args -> b + 1:55:void (com.batch.android.messaging.model.Action):0:54 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/a;)V"} + 1:1:java.lang.String getAction():61:61 -> getAction + 1:1:com.batch.android.json.JSONObject getArgs():66:66 -> getArgs +com.batch.android.BatchInAppMessage -> com.batch.android.BatchInAppMessage: +# {"id":"sourceFile","fileName":"BatchInAppMessage.java"} + com.batch.android.json.JSONObject landingPayload -> c + com.batch.android.json.JSONObject customPayload -> d + java.lang.String campaignToken -> e + java.lang.String campaignId -> f + com.batch.android.json.JSONObject eventData -> g + com.batch.android.BatchInAppMessage$Content cachedContent -> h + java.lang.String LANDING_PAYLOAD_KEY -> i + java.lang.String CUSTOM_PAYLOAD_KEY -> j + java.lang.String CAMPAIGN_TOKEN_KEY -> k + java.lang.String CAMPAIGN_ID_KEY -> l + java.lang.String CAMPAIGN_EVENT_DATA_KEY -> m + 1:6:void (java.lang.String,java.lang.String,com.batch.android.json.JSONObject,com.batch.android.json.JSONObject,com.batch.android.json.JSONObject):73:78 -> + 1:25:com.batch.android.BatchInAppMessage getInstanceFromBundle(android.os.Bundle):39:63 -> a + 26:26:com.batch.android.BatchInAppMessage getInstanceFromBundle(android.os.Bundle):50:50 -> a + 27:34:android.os.Bundle getBundleRepresentation():103:110 -> a + 1:1:com.batch.android.json.JSONObject getCustomPayloadInternal():91:91 -> b + 1:1:com.batch.android.json.JSONObject getJSON():83:83 -> c + 1:1:java.lang.String getKind():96:96 -> d + 1:1:java.lang.String getCampaignId():115:115 -> e + 1:1:com.batch.android.json.JSONObject getEventData():119:119 -> f + 1:1:java.lang.String getCampaignToken():178:178 -> getCampaignToken + 1:23:com.batch.android.BatchInAppMessage$Content getContent():146:168 -> getContent + 1:8:com.batch.android.json.JSONObject getCustomPayload():125:132 -> getCustomPayload +com.batch.android.BatchInAppMessage$Content -> com.batch.android.BatchInAppMessage$Content: +# {"id":"sourceFile","fileName":"BatchInAppMessage.java"} +com.batch.android.BatchInboxFetcher -> com.batch.android.BatchInboxFetcher: +# {"id":"sourceFile","fileName":"BatchInboxFetcher.java"} + com.batch.android.inbox.InboxFetcherInternal impl -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q/f;"} + android.os.Handler handler -> b + 1:39:void (com.batch.android.inbox.InboxFetcherInternal):0:38 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q/f;)V"} + 40:43:void (com.batch.android.inbox.InboxFetcherInternal):36:39 -> + 1:1:android.os.Handler access$000(com.batch.android.BatchInboxFetcher):32:32 -> a + 1:22:void fetchNewNotifications(com.batch.android.BatchInboxFetcher$OnNewNotificationsFetchedListener):123:144 -> fetchNewNotifications + 1:19:void fetchNextPage(com.batch.android.BatchInboxFetcher$OnNextPageFetchedListener):155:173 -> fetchNextPage + 1:1:java.util.List getFetchedNotifications():111:111 -> getFetchedNotifications + 1:1:boolean hasMore():76:76 -> hasMore + 1:1:void markAllAsRead():92:92 -> markAllAsRead + 1:1:void markAsDeleted(com.batch.android.BatchInboxNotificationContent):101:101 -> markAsDeleted + 1:1:void markAsRead(com.batch.android.BatchInboxNotificationContent):85:85 -> markAsRead + 1:1:void setFetchLimit(int):57:57 -> setFetchLimit + 1:1:void setFilterSilentNotifications(boolean):67:67 -> setFilterSilentNotifications + 1:1:void setHandlerOverride(android.os.Handler):184:184 -> setHandlerOverride + 1:1:void setMaxPageSize(int):47:47 -> setMaxPageSize +com.batch.android.BatchInboxFetcher$1 -> com.batch.android.BatchInboxFetcher$a: +# {"id":"sourceFile","fileName":"BatchInboxFetcher.java"} + com.batch.android.BatchInboxFetcher$OnNewNotificationsFetchedListener val$originalListener -> a + com.batch.android.BatchInboxFetcher this$0 -> b + 1:1:void (com.batch.android.BatchInboxFetcher,com.batch.android.BatchInboxFetcher$OnNewNotificationsFetchedListener):126:126 -> + 1:1:void lambda$onFetchSuccess$0(com.batch.android.BatchInboxFetcher$OnNewNotificationsFetchedListener,java.util.List,boolean,boolean):134:134 -> a + 2:2:void lambda$onFetchFailure$1(com.batch.android.BatchInboxFetcher$OnNewNotificationsFetchedListener,java.lang.String):140:140 -> a + 1:1:void onFetchFailure(java.lang.String):140:140 -> onFetchFailure + 1:1:void onFetchSuccess(java.util.List,boolean,boolean):133:133 -> onFetchSuccess +com.batch.android.BatchInboxFetcher$2 -> com.batch.android.BatchInboxFetcher$b: +# {"id":"sourceFile","fileName":"BatchInboxFetcher.java"} + com.batch.android.BatchInboxFetcher$OnNextPageFetchedListener val$originalListener -> a + com.batch.android.BatchInboxFetcher this$0 -> b + 1:1:void (com.batch.android.BatchInboxFetcher,com.batch.android.BatchInboxFetcher$OnNextPageFetchedListener):158:158 -> + 1:1:void lambda$onFetchSuccess$0(com.batch.android.BatchInboxFetcher$OnNextPageFetchedListener,java.util.List,boolean):164:164 -> a + 2:2:void lambda$onFetchFailure$1(com.batch.android.BatchInboxFetcher$OnNextPageFetchedListener,java.lang.String):169:169 -> a + 1:1:void onFetchFailure(java.lang.String):169:169 -> onFetchFailure + 1:1:void onFetchSuccess(java.util.List,boolean):164:164 -> onFetchSuccess +com.batch.android.BatchInboxFetcher$OnNewNotificationsFetchedListener -> com.batch.android.BatchInboxFetcher$OnNewNotificationsFetchedListener: +# {"id":"sourceFile","fileName":"BatchInboxFetcher.java"} +com.batch.android.BatchInboxFetcher$OnNextPageFetchedListener -> com.batch.android.BatchInboxFetcher$OnNextPageFetchedListener: +# {"id":"sourceFile","fileName":"BatchInboxFetcher.java"} +com.batch.android.BatchInboxNotificationContent -> com.batch.android.BatchInboxNotificationContent: +# {"id":"sourceFile","fileName":"BatchInboxNotificationContent.java"} + com.batch.android.inbox.InboxNotificationContentInternal internalContent -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q/g;"} + com.batch.android.BatchPushPayload batchPushPayloadCache -> b + java.lang.String TAG -> c + 1:37:void (com.batch.android.inbox.InboxNotificationContentInternal):0:36 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q/g;)V"} + 38:46:void (com.batch.android.inbox.InboxNotificationContentInternal):29:37 -> + 1:33:void displayLandingMessage(android.content.Context):137:169 -> displayLandingMessage + 1:1:java.lang.String getBody():57:57 -> getBody + 1:1:java.util.Date getDate():71:71 -> getDate + 1:1:java.lang.String getNotificationIdentifier():47:47 -> getNotificationIdentifier + 1:5:com.batch.android.BatchPushPayload getPushPayload():105:109 -> getPushPayload + 1:1:java.util.Map getRawPayload():95:95 -> getRawPayload + 1:1:com.batch.android.BatchNotificationSource getSource():62:62 -> getSource + 1:1:java.lang.String getTitle():52:52 -> getTitle + 1:2:boolean hasLandingMessage():118:119 -> hasLandingMessage + 1:1:boolean isSilent():83:83 -> isSilent + 1:1:boolean isUnread():66:66 -> isUnread +com.batch.android.BatchInterstitialContent -> com.batch.android.BatchInterstitialContent: +# {"id":"sourceFile","fileName":"BatchInterstitialContent.java"} + java.lang.String trackingIdentifier -> a + java.lang.String header -> b + java.lang.String title -> c + java.lang.String body -> d + java.util.List ctas -> e + java.lang.String mediaURL -> f + java.lang.String mediaAccessibilityDescription -> g + boolean showCloseButton -> h + 1:36:void (com.batch.android.messaging.model.UniversalMessage):0:35 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/j;)V"} + 37:65:void (com.batch.android.messaging.model.UniversalMessage):27:55 -> + 1:1:java.lang.String getBody():72:72 -> getBody + 1:1:java.util.List getCtas():76:76 -> getCtas + 1:1:java.lang.String getHeader():64:64 -> getHeader + 1:1:java.lang.String getMediaAccessibilityDescription():84:84 -> getMediaAccessibilityDescription + 1:1:java.lang.String getMediaURL():80:80 -> getMediaURL + 1:1:java.lang.String getTitle():68:68 -> getTitle + 1:1:java.lang.String getTrackingIdentifier():60:60 -> getTrackingIdentifier + 1:1:boolean shouldShowCloseButton():88:88 -> shouldShowCloseButton +com.batch.android.BatchInterstitialContent$CTA -> com.batch.android.BatchInterstitialContent$CTA: +# {"id":"sourceFile","fileName":"BatchInterstitialContent.java"} + java.lang.String label -> a + java.lang.String action -> b + com.batch.android.json.JSONObject args -> c + 1:108:void (com.batch.android.messaging.model.CTA):0:107 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/e;)V"} + 1:1:java.lang.String getAction():119:119 -> getAction + 1:1:com.batch.android.json.JSONObject getArgs():124:124 -> getArgs + 1:1:java.lang.String getLabel():114:114 -> getLabel +com.batch.android.BatchLandingMessage -> com.batch.android.BatchLandingMessage: +# {"id":"sourceFile","fileName":"BatchLandingMessage.java"} + android.os.Bundle payload -> c + com.batch.android.json.JSONObject landing -> d + boolean isDisplayedFromInbox -> e + java.lang.String GOOGLE_PREFIX -> f + 1:1:void (android.os.Bundle,com.batch.android.json.JSONObject):29:29 -> + 2:6:void (android.os.Bundle,com.batch.android.json.JSONObject):27:31 -> + 1:5:android.os.Bundle cleanBundle(android.os.Bundle):41:45 -> a + 6:7:android.os.Bundle getBundleRepresentation():85:86 -> a + 8:8:void setIsDisplayedFromInbox(boolean):105:105 -> a + 1:7:com.batch.android.json.JSONObject getCustomPayloadInternal():61:67 -> b + 1:1:com.batch.android.json.JSONObject getJSON():53:53 -> c + 1:1:java.lang.String getKind():78:78 -> d + 1:1:android.os.Bundle getPushBundle():91:91 -> getPushBundle + 1:1:boolean isDisplayedFromInbox():101:101 -> isDisplayedFromInbox +com.batch.android.BatchMessage -> com.batch.android.BatchMessage: +# {"id":"sourceFile","fileName":"BatchMessage.java"} + java.lang.String KIND_KEY -> a + java.lang.String DATA_KEY -> b + 1:1:void ():24:24 -> + android.os.Bundle getBundleRepresentation() -> a + com.batch.android.json.JSONObject getCustomPayloadInternal() -> b + com.batch.android.json.JSONObject getJSON() -> c + java.lang.String getKind() -> d + 1:19:com.batch.android.BatchMessage$Format getFormat():112:130 -> getFormat + 1:22:com.batch.android.BatchMessage getMessageForBundle(android.os.Bundle):74:95 -> getMessageForBundle + 23:23:com.batch.android.BatchMessage getMessageForBundle(android.os.Bundle):76:76 -> getMessageForBundle + 24:24:com.batch.android.BatchMessage getMessageForBundle(android.os.Bundle):71:71 -> getMessageForBundle + 1:5:void writeToBundle(android.os.Bundle):48:52 -> writeToBundle + 6:6:void writeToBundle(android.os.Bundle):45:45 -> writeToBundle + 1:5:void writeToIntent(android.content.Intent):61:65 -> writeToIntent + 6:6:void writeToIntent(android.content.Intent):58:58 -> writeToIntent +com.batch.android.BatchMessage$Format -> com.batch.android.BatchMessage$Format: +# {"id":"sourceFile","fileName":"BatchMessage.java"} + com.batch.android.BatchMessage$Format[] $VALUES -> a + 1:25:void ():148:172 -> + 26:26:void ():142:142 -> + 1:1:void (java.lang.String,int):143:143 -> + 1:1:com.batch.android.BatchMessage$Format[] $values():142:142 -> a + 1:1:com.batch.android.BatchMessage$Format valueOf(java.lang.String):142:142 -> valueOf + 1:1:com.batch.android.BatchMessage$Format[] values():142:142 -> values +com.batch.android.BatchMessageAction -> com.batch.android.BatchMessageAction: +# {"id":"sourceFile","fileName":"BatchMessageAction.java"} + java.lang.String action -> a + com.batch.android.json.JSONObject args -> b + 1:31:void (com.batch.android.messaging.model.Action):0:30 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/a;)V"} + 1:1:java.lang.String getAction():37:37 -> getAction + 1:1:com.batch.android.json.JSONObject getArgs():42:42 -> getArgs + 1:1:boolean isDismissAction():46:46 -> isDismissAction +com.batch.android.BatchMessageCTA -> com.batch.android.BatchMessageCTA: +# {"id":"sourceFile","fileName":"BatchMessageCTA.java"} + java.lang.String label -> c + 1:22:void (com.batch.android.messaging.model.CTA):0:21 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/e;)V"} + 1:1:java.lang.String getLabel():26:26 -> getLabel +com.batch.android.BatchMessagingException -> com.batch.android.BatchMessagingException: +# {"id":"sourceFile","fileName":"BatchMessagingException.java"} + 1:1:void ():12:12 -> + 2:2:void (java.lang.String):16:16 -> + 3:3:void (java.lang.String,java.lang.Throwable):20:20 -> + 4:4:void (java.lang.Throwable):24:24 -> +com.batch.android.BatchMessagingWebViewJavascriptBridge -> com.batch.android.BatchMessagingWebViewJavascriptBridge: +# {"id":"sourceFile","fileName":"BatchMessagingWebViewJavascriptBridge.java"} + android.content.Context applicationContext -> a + com.batch.android.BatchMessage message -> b + com.batch.android.messaging.WebViewActionListener actionListener -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/y/e;"} + java.lang.String TAG -> d + 1:42:void (android.content.Context,com.batch.android.BatchMessage,com.batch.android.messaging.WebViewActionListener):0:41 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/BatchMessage;Lcom/batch/android/y/e;)V"} + 1:6:java.lang.String makeSuccessResult(com.batch.android.BatchMessagingWebViewJavascriptBridge$BridgeResultProvider):83:88 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/BatchMessagingWebViewJavascriptBridge$b;)Ljava/lang/String;"} + 7:12:java.lang.String makeErrorResult(java.lang.String):94:99 -> a + 13:14:com.batch.android.BatchMessagingWebViewJavascriptBridge$BridgeResultProvider getMethodResultProvider(java.lang.String,com.batch.android.json.JSONObject):105:105 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Lcom/batch/android/json/JSONObject;)Lcom/batch/android/BatchMessagingWebViewJavascriptBridge$b;"} + 39:39:com.batch.android.BatchMessagingWebViewJavascriptBridge$BridgeResultProvider getMethodResultProvider(java.lang.String,com.batch.android.json.JSONObject):130:130 -> a + 40:41:com.batch.android.BatchMessagingWebViewJavascriptBridge$BridgeResultProvider getMethodResultProvider(java.lang.String,com.batch.android.json.JSONObject):127:128 -> a + 42:42:com.batch.android.BatchMessagingWebViewJavascriptBridge$BridgeResultProvider getMethodResultProvider(java.lang.String,com.batch.android.json.JSONObject):117:117 -> a + 43:47:com.batch.android.BatchMessagingWebViewJavascriptBridge$BridgeResultProvider getMethodResultProvider(java.lang.String,com.batch.android.json.JSONObject):107:111 -> a + 48:64:com.batch.android.BatchMessagingWebViewJavascriptBridge$BridgeResultProvider getMethodResultProvider(java.lang.String,com.batch.android.json.JSONObject):109:125 -> a + 65:68:com.batch.android.BatchMessagingWebViewJavascriptBridge$BridgeResultProvider getMethodResultProvider(java.lang.String,com.batch.android.json.JSONObject):119:122 -> a + 69:69:com.batch.android.BatchMessagingWebViewJavascriptBridge$BridgeResultProvider getMethodResultProvider(java.lang.String,com.batch.android.json.JSONObject):115:115 -> a + 70:70:com.batch.android.BatchMessagingWebViewJavascriptBridge$BridgeResultProvider getMethodResultProvider(java.lang.String,com.batch.android.json.JSONObject):113:113 -> a + 71:71:java.lang.String getAttributionID():163:163 -> a + 72:75:void dismiss(com.batch.android.json.JSONObject):187:190 -> a + 1:1:java.lang.String getCustomLanguage():145:145 -> b + 2:13:void openDeeplink(com.batch.android.json.JSONObject):213:224 -> b + 14:14:void openDeeplink(com.batch.android.json.JSONObject):215:215 -> b + 1:5:java.lang.String getCustomPayload():170:174 -> c + 6:19:void performAction(com.batch.android.json.JSONObject):195:208 -> c + 20:20:void performAction(com.batch.android.json.JSONObject):197:197 -> c + 1:1:java.lang.String getCustomRegion():151:151 -> d + 1:1:java.lang.String getCustomUserID():157:157 -> e + 1:1:com.batch.android.BatchMessagingWebViewJavascriptBridge$BridgeResultProvider getGenericSuccessResultProvider():231:231 -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/BatchMessagingWebViewJavascriptBridge$b;"} + 1:1:java.lang.String getInstallationID():139:139 -> g + 1:5:java.lang.String getTrackingID():179:183 -> h + 1:1:java.lang.String lambda$getGenericSuccessResultProvider$0():231:231 -> i + 1:30:java.lang.String postMessage(java.lang.String,java.lang.String):47:76 -> postMessage + 31:32:java.lang.String postMessage(java.lang.String,java.lang.String):72:73 -> postMessage + 33:34:java.lang.String postMessage(java.lang.String,java.lang.String):69:70 -> postMessage + 35:36:java.lang.String postMessage(java.lang.String,java.lang.String):65:66 -> postMessage + 37:38:java.lang.String postMessage(java.lang.String,java.lang.String):58:59 -> postMessage + 39:39:java.lang.String postMessage(java.lang.String,java.lang.String):48:48 -> postMessage +com.batch.android.BatchMessagingWebViewJavascriptBridge$1 -> com.batch.android.BatchMessagingWebViewJavascriptBridge$a: +# {"id":"sourceFile","fileName":"BatchMessagingWebViewJavascriptBridge.java"} +com.batch.android.BatchMessagingWebViewJavascriptBridge$BridgeResultProvider -> com.batch.android.BatchMessagingWebViewJavascriptBridge$b: +# {"id":"sourceFile","fileName":"BatchMessagingWebViewJavascriptBridge.java"} + java.lang.String getResult() -> a +com.batch.android.BatchMessagingWebViewJavascriptBridge$BridgeResultProviderException -> com.batch.android.BatchMessagingWebViewJavascriptBridge$c: +# {"id":"sourceFile","fileName":"BatchMessagingWebViewJavascriptBridge.java"} + 1:1:void (java.lang.String):247:247 -> + 1:1:java.lang.String getMessage():254:254 -> getMessage +com.batch.android.BatchMessagingWebViewJavascriptBridge$BridgeResultProviderRuntimeException -> com.batch.android.BatchMessagingWebViewJavascriptBridge$d: +# {"id":"sourceFile","fileName":"BatchMessagingWebViewJavascriptBridge.java"} + int code -> a + java.lang.String internalMessage -> b + 1:3:void (int,java.lang.String):269:271 -> + 4:6:void (int,java.lang.String,java.lang.Throwable):279:281 -> + 1:1:int getCode():285:285 -> a + 1:1:java.lang.String getMessage():291:291 -> getMessage +com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause -> com.batch.android.BatchMessagingWebViewJavascriptBridge$e: +# {"id":"sourceFile","fileName":"BatchMessagingWebViewJavascriptBridge.java"} + com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause UNKNOWN -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/BatchMessagingWebViewJavascriptBridge$e;"} + com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause SSL -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/BatchMessagingWebViewJavascriptBridge$e;"} + com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause BAD_HTTP_STATUSCODE -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/BatchMessagingWebViewJavascriptBridge$e;"} + com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause TIMEOUT -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/BatchMessagingWebViewJavascriptBridge$e;"} + com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause[] $VALUES -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/BatchMessagingWebViewJavascriptBridge$e;"} + 1:4:void ():298:301 -> + 5:5:void ():297:297 -> + 1:1:void (java.lang.String,int):297:297 -> + 1:1:com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause[] $values():297:297 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/BatchMessagingWebViewJavascriptBridge$e;"} + 1:1:com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause valueOf(java.lang.String):297:297 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/BatchMessagingWebViewJavascriptBridge$e;"} + 1:1:com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause[] values():297:297 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/BatchMessagingWebViewJavascriptBridge$e;"} +com.batch.android.BatchMessagingWebViewJavascriptBridge$UnknownMethodException -> com.batch.android.BatchMessagingWebViewJavascriptBridge$f: +# {"id":"sourceFile","fileName":"BatchMessagingWebViewJavascriptBridge.java"} + 1:1:void ():295:295 -> + 2:2:void (com.batch.android.BatchMessagingWebViewJavascriptBridge$1):295:295 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/BatchMessagingWebViewJavascriptBridge$a;)V"} +com.batch.android.BatchMigration -> com.batch.android.BatchMigration: +# {"id":"sourceFile","fileName":"BatchMigration.java"} + int value -> a + com.batch.android.BatchMigration[] $VALUES -> b + 1:13:void ():13:25 -> + 14:14:void ():8:8 -> + 1:2:void (java.lang.String,int,int):37:38 -> + 1:1:com.batch.android.BatchMigration[] $values():8:8 -> a + 1:8:java.util.EnumSet fromValue(int):49:56 -> fromValue + 1:1:boolean isCustomDataMigrationDisabled(java.lang.Integer):92:92 -> isCustomDataMigrationDisabled + 1:1:boolean isCustomIDMigrationDisabled(java.lang.Integer):82:82 -> isCustomIDMigrationDisabled + 1:2:int toValue(java.util.EnumSet):69:70 -> toValue + 1:1:com.batch.android.BatchMigration valueOf(java.lang.String):8:8 -> valueOf + 1:1:com.batch.android.BatchMigration[] values():8:8 -> values +com.batch.android.BatchModalContent -> com.batch.android.BatchModalContent: +# {"id":"sourceFile","fileName":"BatchModalContent.java"} + java.lang.String trackingIdentifier -> a + java.lang.String title -> b + java.lang.String body -> c + java.util.List ctas -> d + com.batch.android.BatchModalContent$Action globalTapAction -> e + java.lang.String mediaURL -> f + java.lang.String mediaAccessibilityDescription -> g + boolean showCloseButton -> h + java.lang.Long autoCloseTimeMillis -> i + 1:37:void (com.batch.android.messaging.model.ModalMessage):0:36 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/i;)V"} + 38:70:void (com.batch.android.messaging.model.ModalMessage):24:56 -> + 1:1:java.lang.Long getAutoCloseTimeMillis():93:93 -> getAutoCloseTimeMillis + 1:1:java.lang.String getBody():69:69 -> getBody + 1:1:java.util.List getCtas():73:73 -> getCtas + 1:1:com.batch.android.BatchModalContent$Action getGlobalTapAction():77:77 -> getGlobalTapAction + 1:1:java.lang.String getMediaAccessibilityDescription():85:85 -> getMediaAccessibilityDescription + 1:1:java.lang.String getMediaURL():81:81 -> getMediaURL + 1:1:java.lang.String getTitle():65:65 -> getTitle + 1:1:java.lang.String getTrackingIdentifier():61:61 -> getTrackingIdentifier + 1:1:boolean isShowCloseButton():89:89 -> isShowCloseButton +com.batch.android.BatchModalContent$Action -> com.batch.android.BatchModalContent$Action: +# {"id":"sourceFile","fileName":"BatchModalContent.java"} + java.lang.String action -> a + com.batch.android.json.JSONObject args -> b + 1:110:void (com.batch.android.messaging.model.Action):0:109 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/a;)V"} + 1:1:java.lang.String getAction():116:116 -> getAction + 1:1:com.batch.android.json.JSONObject getArgs():121:121 -> getArgs +com.batch.android.BatchModalContent$CTA -> com.batch.android.BatchModalContent$CTA: +# {"id":"sourceFile","fileName":"BatchModalContent.java"} + java.lang.String label -> c + 1:133:void (com.batch.android.messaging.model.CTA):0:132 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/e;)V"} + 1:1:java.lang.String getLabel():137:137 -> getLabel +com.batch.android.BatchNotificationAction -> com.batch.android.BatchNotificationAction: +# {"id":"sourceFile","fileName":"BatchNotificationAction.java"} + 1:36:void ():21:56 -> + 1:39:java.util.List getSupportActions(android.content.Context,java.util.List,com.batch.android.BatchPushPayload,java.lang.Integer):87:125 -> getSupportActions + 40:50:java.util.List getSupportActions(android.content.Context,java.util.List,com.batch.android.BatchPushPayload,java.lang.Integer):123:133 -> getSupportActions + 51:65:java.util.List getSupportActions(android.content.Context,java.util.List,com.batch.android.BatchPushPayload,java.lang.Integer):131:145 -> getSupportActions + 66:66:java.util.List getSupportActions(android.content.Context,java.util.List,com.batch.android.BatchPushPayload,java.lang.Integer):139:139 -> getSupportActions + 67:67:java.util.List getSupportActions(android.content.Context,java.util.List,com.batch.android.BatchPushPayload,java.lang.Integer):84:84 -> getSupportActions +com.batch.android.BatchNotificationChannelsManager -> com.batch.android.BatchNotificationChannelsManager: +# {"id":"sourceFile","fileName":"BatchNotificationChannelsManager.java"} + java.lang.String channelOverride -> a + com.batch.android.BatchNotificationChannelsManager$ChannelNameProvider channelNameProvider -> b + com.batch.android.BatchNotificationChannelsManager$NotificationChannelIdInterceptor channelIdInterceptor -> c + com.batch.android.module.PushModule pushModule -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/m0/k;"} + 1:53:void (com.batch.android.module.PushModule):0:52 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/m0/k;)V"} + 54:54:void (com.batch.android.module.PushModule):38:38 -> + 1:14:java.lang.String getChannelId(com.batch.android.BatchPushPayload):59:72 -> a + 15:35:void registerBatchChannelIfNeeded(android.content.Context):90:110 -> a + 36:43:void registerBatchChannelIfNeeded(android.content.Context):108:115 -> a + 44:57:java.lang.String getBatchChannelName():126:139 -> a + 1:1:boolean isChannelIdOverridden():86:86 -> b + 1:1:boolean openSystemChannelSettings(android.content.Context):215:215 -> openSystemChannelSettings + 2:8:boolean openSystemChannelSettings(android.content.Context,java.lang.String):236:242 -> openSystemChannelSettings + 9:9:boolean openSystemChannelSettings(android.content.Context,java.lang.String):234:234 -> openSystemChannelSettings + 10:10:boolean openSystemChannelSettings(android.content.Context,java.lang.String):230:230 -> openSystemChannelSettings + 1:1:com.batch.android.BatchNotificationChannelsManager provide():43:43 -> provide + 1:1:void setChannelIdInterceptor(com.batch.android.BatchNotificationChannelsManager$NotificationChannelIdInterceptor):203:203 -> setChannelIdInterceptor + 1:1:void setChannelIdOverride(java.lang.String):162:162 -> setChannelIdOverride + 1:1:void setChannelName(android.content.Context,int):191:191 -> setChannelName + 1:1:void setChannelNameProvider(com.batch.android.BatchNotificationChannelsManager$ChannelNameProvider):179:179 -> setChannelNameProvider +com.batch.android.BatchNotificationChannelsManager$ChannelNameProvider -> com.batch.android.BatchNotificationChannelsManager$ChannelNameProvider: +# {"id":"sourceFile","fileName":"BatchNotificationChannelsManager.java"} +com.batch.android.BatchNotificationChannelsManager$NotificationChannelIdInterceptor -> com.batch.android.BatchNotificationChannelsManager$NotificationChannelIdInterceptor: +# {"id":"sourceFile","fileName":"BatchNotificationChannelsManager.java"} +com.batch.android.BatchNotificationChannelsManager$StringResChannelNameProvider -> com.batch.android.BatchNotificationChannelsManager$StringResChannelNameProvider: +# {"id":"sourceFile","fileName":"BatchNotificationChannelsManager.java"} + android.content.Context context -> a + int resId -> b + 1:3:void (android.content.Context,int):280:282 -> + 1:1:java.lang.String getDefaultChannelName():287:287 -> getDefaultChannelName +com.batch.android.BatchNotificationChannelsManagerPrivateHelper -> com.batch.android.b: +# {"id":"sourceFile","fileName":"BatchNotificationChannelsManagerPrivateHelper.java"} + 1:1:void ():9:9 -> + 1:1:java.lang.String getChannelId(com.batch.android.BatchNotificationChannelsManager):13:13 -> a + 2:2:void registerBatchChannelIfNeeded(com.batch.android.BatchNotificationChannelsManager,android.content.Context):17:17 -> a +com.batch.android.BatchNotificationInterceptor -> com.batch.android.BatchNotificationInterceptor: +# {"id":"sourceFile","fileName":"BatchNotificationInterceptor.java"} + 1:1:void ():17:17 -> +com.batch.android.BatchNotificationSource -> com.batch.android.BatchNotificationSource: +# {"id":"sourceFile","fileName":"BatchNotificationSource.java"} + com.batch.android.BatchNotificationSource[] $VALUES -> a + 1:4:void ():11:14 -> + 5:5:void ():9:9 -> + 1:1:void (java.lang.String,int):10:10 -> + 1:1:com.batch.android.BatchNotificationSource[] $values():9:9 -> a + 1:1:com.batch.android.BatchNotificationSource valueOf(java.lang.String):9:9 -> valueOf + 1:1:com.batch.android.BatchNotificationSource[] values():9:9 -> values +com.batch.android.BatchOptOutResultListener -> com.batch.android.BatchOptOutResultListener: +# {"id":"sourceFile","fileName":"BatchOptOutResultListener.java"} +com.batch.android.BatchOptOutResultListener$ErrorPolicy -> com.batch.android.BatchOptOutResultListener$ErrorPolicy: +# {"id":"sourceFile","fileName":"BatchOptOutResultListener.java"} + com.batch.android.BatchOptOutResultListener$ErrorPolicy[] $VALUES -> a + 1:6:void ():19:24 -> + 7:7:void ():14:14 -> + 1:1:void (java.lang.String,int):15:15 -> + 1:1:com.batch.android.BatchOptOutResultListener$ErrorPolicy[] $values():14:14 -> a + 1:1:com.batch.android.BatchOptOutResultListener$ErrorPolicy valueOf(java.lang.String):14:14 -> valueOf + 1:1:com.batch.android.BatchOptOutResultListener$ErrorPolicy[] values():14:14 -> values +com.batch.android.BatchPermissionActivity -> com.batch.android.BatchPermissionActivity: +# {"id":"sourceFile","fileName":"BatchPermissionActivity.java"} + java.lang.String permission -> a + long requestPermissionTimestamp -> b + java.lang.String TAG -> c + int DETECT_PERMISSION_ALREADY_DENIED_THRESHOLD -> d + int BATCH_PERMISSION_REQUEST_CODE -> e + 1:27:void ():22:48 -> + 1:7:void requestPermission():74:80 -> a + 1:6:void onCreate(android.os.Bundle):52:57 -> onCreate + 1:2:void onDestroy():129:130 -> onDestroy + 1:30:void onRequestPermissionsResult(int,java.lang.String[],int[]):89:118 -> onRequestPermissionsResult + 1:6:void onStart():63:68 -> onStart + 1:2:void onStop():123:124 -> onStop +com.batch.android.BatchPermissionListener -> com.batch.android.BatchPermissionListener: +# {"id":"sourceFile","fileName":"BatchPermissionListener.java"} +com.batch.android.BatchProfileAttributeEditor -> com.batch.android.BatchProfileAttributeEditor: +# {"id":"sourceFile","fileName":"BatchProfileAttributeEditor.java"} + com.batch.android.profile.ProfileUpdateOperation profileUpdateOperation -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/t0/e;"} + java.lang.String TAG -> h + 1:1:void ():52:52 -> + 2:2:void ():46:46 -> + 1:18:com.batch.android.BatchProfileAttributeEditor addToArray(java.lang.String,java.lang.String):357:374 -> addToArray + 19:19:com.batch.android.BatchProfileAttributeEditor addToArray(java.lang.String,java.lang.String):371:371 -> addToArray + 20:36:com.batch.android.BatchProfileAttributeEditor addToArray(java.lang.String,java.util.List):387:403 -> addToArray + 37:37:com.batch.android.BatchProfileAttributeEditor addToArray(java.lang.String,java.util.List):399:399 -> addToArray + 1:36:com.batch.android.user.InstallDataEditor removeAttribute(java.lang.String):0:35 -> removeAttribute + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/c1/b;"} + 37:47:com.batch.android.BatchProfileAttributeEditor removeAttribute(java.lang.String):334:344 -> removeAttribute + 48:48:com.batch.android.BatchProfileAttributeEditor removeAttribute(java.lang.String):337:337 -> removeAttribute + 1:18:com.batch.android.BatchProfileAttributeEditor removeFromArray(java.lang.String,java.lang.String):418:435 -> removeFromArray + 19:19:com.batch.android.BatchProfileAttributeEditor removeFromArray(java.lang.String,java.lang.String):432:432 -> removeFromArray + 20:36:com.batch.android.BatchProfileAttributeEditor removeFromArray(java.lang.String,java.util.List):449:465 -> removeFromArray + 37:37:com.batch.android.BatchProfileAttributeEditor removeFromArray(java.lang.String,java.util.List):461:461 -> removeFromArray + 1:2:void save():478:479 -> save + 1:36:com.batch.android.user.InstallDataEditor setAttribute(java.lang.String,double):0:35 -> setAttribute + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;D)Lcom/batch/android/c1/b;"} + 37:72:com.batch.android.user.InstallDataEditor setAttribute(java.lang.String,long):0:35 -> setAttribute + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;J)Lcom/batch/android/c1/b;"} + 73:108:com.batch.android.user.InstallDataEditor setAttribute(java.lang.String,java.lang.String):0:35 -> setAttribute + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Ljava/lang/String;)Lcom/batch/android/c1/b;"} + 109:144:com.batch.android.user.InstallDataEditor setAttribute(java.lang.String,java.net.URI):0:35 -> setAttribute + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Ljava/net/URI;)Lcom/batch/android/c1/b;"} + 145:180:com.batch.android.user.InstallDataEditor setAttribute(java.lang.String,java.util.Date):0:35 -> setAttribute + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Ljava/util/Date;)Lcom/batch/android/c1/b;"} + 181:216:com.batch.android.user.InstallDataEditor setAttribute(java.lang.String,boolean):0:35 -> setAttribute + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Z)Lcom/batch/android/c1/b;"} + 217:223:com.batch.android.BatchProfileAttributeEditor setAttribute(java.lang.String,long):149:155 -> setAttribute + 224:224:com.batch.android.BatchProfileAttributeEditor setAttribute(java.lang.String,long):152:152 -> setAttribute + 225:231:com.batch.android.BatchProfileAttributeEditor setAttribute(java.lang.String,double):168:174 -> setAttribute + 232:232:com.batch.android.BatchProfileAttributeEditor setAttribute(java.lang.String,double):171:171 -> setAttribute + 233:239:com.batch.android.BatchProfileAttributeEditor setAttribute(java.lang.String,boolean):187:193 -> setAttribute + 240:240:com.batch.android.BatchProfileAttributeEditor setAttribute(java.lang.String,boolean):190:190 -> setAttribute + 241:248:com.batch.android.BatchProfileAttributeEditor setAttribute(java.lang.String,java.util.Date):206:213 -> setAttribute + 249:249:com.batch.android.BatchProfileAttributeEditor setAttribute(java.lang.String,java.util.Date):210:210 -> setAttribute + 250:268:com.batch.android.BatchProfileAttributeEditor setAttribute(java.lang.String,java.lang.String):226:244 -> setAttribute + 269:269:com.batch.android.BatchProfileAttributeEditor setAttribute(java.lang.String,java.lang.String):241:241 -> setAttribute + 270:294:com.batch.android.BatchProfileAttributeEditor setAttribute(java.lang.String,java.net.URI):257:281 -> setAttribute + 295:303:com.batch.android.BatchProfileAttributeEditor setAttribute(java.lang.String,java.net.URI):279:287 -> setAttribute + 304:304:com.batch.android.BatchProfileAttributeEditor setAttribute(java.lang.String,java.net.URI):284:284 -> setAttribute + 305:325:com.batch.android.BatchProfileAttributeEditor setAttribute(java.lang.String,java.util.List):300:320 -> setAttribute + 326:326:com.batch.android.BatchProfileAttributeEditor setAttribute(java.lang.String,java.util.List):315:315 -> setAttribute + 1:25:com.batch.android.BatchProfileAttributeEditor setEmailAddress(java.lang.String):99:123 -> setEmailAddress + 1:1:com.batch.android.BatchProfileAttributeEditor setEmailMarketingSubscription(com.batch.android.BatchEmailSubscriptionState):136:136 -> setEmailMarketingSubscription + 1:36:com.batch.android.user.InstallDataEditor setLanguage(java.lang.String):0:35 -> setLanguage + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/c1/b;"} + 37:42:com.batch.android.BatchProfileAttributeEditor setLanguage(java.lang.String):64:69 -> setLanguage + 1:36:com.batch.android.user.InstallDataEditor setRegion(java.lang.String):0:35 -> setRegion + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/c1/b;"} + 37:42:com.batch.android.BatchProfileAttributeEditor setRegion(java.lang.String):81:86 -> setRegion +com.batch.android.BatchPushHelper -> com.batch.android.c: +# {"id":"sourceFile","fileName":"BatchPushHelper.java"} + 1:1:void ():18:18 -> + 1:36:boolean canDisplayPush(android.content.Context,com.batch.android.core.InternalPushData):0:35 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/e/p;)Z"} + 37:37:boolean canDisplayPush(android.content.Context,com.batch.android.core.InternalPushData):32:32 -> a + 38:45:android.os.Bundle firebaseMessageToReceiverBundle(com.google.firebase.messaging.RemoteMessage):56:63 -> a + 46:47:boolean installIDMatchesCurrent(android.content.Context,java.lang.String):75:76 -> a +com.batch.android.BatchPushJobService -> com.batch.android.BatchPushJobService: +# {"id":"sourceFile","fileName":"BatchPushJobService.java"} + java.lang.String TAG -> a + 1:1:void ():20:20 -> + 1:12:boolean onStartJob(android.app.job.JobParameters):29:40 -> onStartJob + 1:1:boolean onStopJob(android.app.job.JobParameters):46:46 -> onStopJob +com.batch.android.BatchPushJobService$PresentPushTask -> com.batch.android.BatchPushJobService$a: +# {"id":"sourceFile","fileName":"BatchPushJobService.java"} + android.os.Bundle pushData -> a + java.lang.ref.WeakReference originService -> b + android.app.job.JobParameters originJobParameters -> c + 1:4:void (android.os.Bundle,android.app.job.JobService,android.app.job.JobParameters):62:65 -> + 1:1:java.lang.Object doInBackground(java.lang.Object[]):50:50 -> doInBackground + 2:30:java.lang.Void doInBackground(java.lang.Void[]):70:98 -> doInBackground + 31:33:java.lang.Void doInBackground(java.lang.Void[]):92:94 -> doInBackground + 34:44:java.lang.Void doInBackground(java.lang.Void[]):90:100 -> doInBackground +com.batch.android.BatchPushMessageDismissReceiver -> com.batch.android.BatchPushMessageDismissReceiver: +# {"id":"sourceFile","fileName":"BatchPushMessageDismissReceiver.java"} + java.lang.String TAG -> d + 1:1:void ():17:17 -> + 1:21:void onReceive(android.content.Context,android.content.Intent):24:44 -> onReceive + 22:22:void onReceive(android.content.Context,android.content.Intent):30:30 -> onReceive +com.batch.android.BatchPushMessageReceiver -> com.batch.android.BatchPushMessageReceiver: +# {"id":"sourceFile","fileName":"BatchPushMessageReceiver.java"} + java.lang.String TAG -> d + int MAX_HANDLED_MESSAGE_IDS_COUNT -> e + java.util.ArrayDeque handledMessageIDs -> f + 1:1:void ():36:36 -> + 1:1:void ():26:26 -> + 1:27:boolean presentNotification(android.content.Context,android.content.Intent):74:100 -> a + 28:28:boolean isDuplicateMessage(java.lang.String):159:159 -> a + 29:35:java.lang.String getGoogleMessageID(android.content.Intent):180:186 -> a + 36:36:int getHandledMessageIDsSize():195:195 -> a + 1:2:boolean isFCMMessage(android.content.Intent):61:62 -> b + 3:28:boolean scheduleJob(android.content.Context,android.content.Intent):110:135 -> b + 29:49:boolean scheduleJob(android.content.Context,android.content.Intent):118:138 -> b + 50:52:void markMessageAsHandled(java.lang.String):167:169 -> b + 53:53:void resetHandledMessageIDs():200:200 -> b + 1:5:void startPresentationService(android.content.Context,android.content.Intent):145:149 -> c + 1:15:void onReceive(android.content.Context,android.content.Intent):41:55 -> onReceive +com.batch.android.BatchPushNotificationPresenter -> com.batch.android.d: +# {"id":"sourceFile","fileName":"BatchPushNotificationPresenter.java"} + java.lang.String TAG -> a + java.lang.String CUSTOM_SMALL_ICON_METADATA_NAME -> b + java.lang.String CUSTOM_SMALL_ICON_FIREBASE_METADATA_NAME -> c + java.lang.String CUSTOM_COLOR_METADATA -> d + int DEFAULT_NO_NOTIFICATION -> e + java.lang.String GOOGLE_MESSAGE_ID_KEY -> f + 1:1:void ():59:59 -> + 1:734:void applyNotificationFormat(android.content.Context,com.batch.android.push.formats.NotificationFormat,androidx.core.app.NotificationCompat$Builder):0:733 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/v0/c;Landroidx/core/app/NotificationCompat$Builder;)V"} + 735:772:void displayForPush(android.content.Context,android.os.Bundle):87:124 -> a + 773:977:void presentNotification(android.content.Context,android.os.Bundle,com.batch.android.BatchPushPayload,com.batch.android.BatchNotificationInterceptor):138:342 -> a + 978:1044:void presentNotification(android.content.Context,android.os.Bundle,com.batch.android.BatchPushPayload,com.batch.android.BatchNotificationInterceptor):336:402 -> a + 1045:1108:void presentNotification(android.content.Context,android.os.Bundle,com.batch.android.BatchPushPayload,com.batch.android.BatchNotificationInterceptor):401:464 -> a + 1109:1175:void presentNotification(android.content.Context,android.os.Bundle,com.batch.android.BatchPushPayload,com.batch.android.BatchNotificationInterceptor):460:526 -> a + 1176:1176:void presentNotification(android.content.Context,android.os.Bundle,com.batch.android.BatchPushPayload,com.batch.android.BatchNotificationInterceptor):192:192 -> a + 1177:1220:boolean trySendLandingToForegroundApp(android.content.Context,android.os.Bundle,com.batch.android.core.InternalPushData):540:583 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Landroid/os/Bundle;Lcom/batch/android/e/p;)Z"} + 1221:1225:android.graphics.Bitmap resizeLargeIcon(android.content.Context,android.graphics.Bitmap):593:597 -> a + 1226:1230:int getAppPrimaryColor(android.content.Context):675:679 -> a + 1:8:int getDefaults(android.content.Context):609:616 -> b + 9:27:int getDefaults(android.content.Context):616:634 -> b + 1:10:java.lang.Integer getMetaDataPushColor(android.content.Context):693:702 -> c + 1:15:java.lang.Integer getMetaDataSmallIconResId(android.content.Context):654:668 -> d +com.batch.android.BatchPushPayload -> com.batch.android.BatchPushPayload: +# {"id":"sourceFile","fileName":"BatchPushPayload.java"} + com.batch.android.core.InternalPushData internalPushData -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/p;"} + android.os.Bundle rawData -> b + 1:8:void (android.os.Bundle):50:57 -> + 9:9:void (android.os.Bundle):54:54 -> + 10:15:void (com.google.firebase.messaging.RemoteMessage):60:65 -> + 1:341:com.batch.android.core.InternalPushData getInternalData():0:340 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/e/p;"} + 1:2:java.util.List getActions():293:294 -> getActions + 1:9:java.lang.String getBigPictureURL(android.content.Context):257:265 -> getBigPictureURL + 10:10:java.lang.String getBigPictureURL(android.content.Context):262:262 -> getBigPictureURL + 1:1:java.lang.String getChannel():322:322 -> getChannel + 1:6:java.lang.String getCustomLargeIconURL(android.content.Context):231:236 -> getCustomLargeIconURL + 1:1:java.lang.String getDeeplink():210:210 -> getDeeplink + 1:1:java.lang.String getGroup():303:303 -> getGroup + 1:5:com.batch.android.BatchMessage getLandingMessage():282:286 -> getLandingMessage + 1:1:android.os.Bundle getPushBundle():334:334 -> getPushBundle + 1:1:boolean hasBigPicture():245:245 -> hasBigPicture + 1:1:boolean hasCustomLargeIcon():219:219 -> hasCustomLargeIcon + 1:1:boolean hasDeeplink():200:200 -> hasDeeplink + 1:1:boolean hasLandingMessage():273:273 -> hasLandingMessage + 1:1:boolean isGroupSummary():312:312 -> isGroupSummary + 1:7:com.batch.android.BatchPushPayload payloadFromBundle(android.os.Bundle):86:92 -> payloadFromBundle + 8:8:com.batch.android.BatchPushPayload payloadFromBundle(android.os.Bundle):89:89 -> payloadFromBundle + 9:9:com.batch.android.BatchPushPayload payloadFromBundle(android.os.Bundle):83:83 -> payloadFromBundle + 1:1:com.batch.android.BatchPushPayload payloadFromFirebaseMessage(com.google.firebase.messaging.RemoteMessage):153:153 -> payloadFromFirebaseMessage + 2:2:com.batch.android.BatchPushPayload payloadFromFirebaseMessage(com.google.firebase.messaging.RemoteMessage):150:150 -> payloadFromFirebaseMessage + 1:1:com.batch.android.BatchPushPayload payloadFromReceiverExtras(android.os.Bundle):134:134 -> payloadFromReceiverExtras + 2:2:com.batch.android.BatchPushPayload payloadFromReceiverExtras(android.os.Bundle):131:131 -> payloadFromReceiverExtras + 1:7:com.batch.android.BatchPushPayload payloadFromReceiverIntent(android.content.Intent):110:116 -> payloadFromReceiverIntent + 8:8:com.batch.android.BatchPushPayload payloadFromReceiverIntent(android.content.Intent):113:113 -> payloadFromReceiverIntent + 9:9:com.batch.android.BatchPushPayload payloadFromReceiverIntent(android.content.Intent):107:107 -> payloadFromReceiverIntent + 1:1:void writeToBundle(android.os.Bundle):172:172 -> writeToBundle + 2:2:void writeToBundle(android.os.Bundle):169:169 -> writeToBundle + 1:1:void writeToIntentExtras(android.content.Intent):187:187 -> writeToIntentExtras + 2:2:void writeToIntentExtras(android.content.Intent):184:184 -> writeToIntentExtras +com.batch.android.BatchPushPayload$ParsingException -> com.batch.android.BatchPushPayload$ParsingException: +# {"id":"sourceFile","fileName":"BatchPushPayload.java"} + 1:1:void ():33:33 -> + 2:2:void (java.lang.String):37:37 -> + 3:3:void (java.lang.String,java.lang.Throwable):42:42 -> +com.batch.android.BatchPushRegistration -> com.batch.android.BatchPushRegistration: +# {"id":"sourceFile","fileName":"BatchPushRegistration.java"} + java.lang.String provider -> a + java.lang.String registrationID -> b + java.lang.String senderID -> c + java.lang.String gcpProjectID -> d + 1:5:void (java.lang.String,java.lang.String,java.lang.String,java.lang.String):44:48 -> + 1:1:java.lang.String getGcpProjectID():90:90 -> getGcpProjectID + 1:1:java.lang.String getProvider():58:58 -> getProvider + 1:1:java.lang.String getSenderID():79:79 -> getSenderID + 1:1:java.lang.String getToken():68:68 -> getToken +com.batch.android.BatchPushService -> com.batch.android.BatchPushService: +# {"id":"sourceFile","fileName":"BatchPushService.java"} + java.lang.String TAG -> a + 1:1:void ():21:21 -> + 1:11:void onHandleIntent(android.content.Intent):28:38 -> onHandleIntent + 12:19:void onHandleIntent(android.content.Intent):31:38 -> onHandleIntent + 20:20:void onHandleIntent(android.content.Intent):35:35 -> onHandleIntent + 21:27:void onHandleIntent(android.content.Intent):33:39 -> onHandleIntent +com.batch.android.BatchQueryWebservice -> com.batch.android.a.c: +# {"id":"sourceFile","fileName":"BatchQueryWebservice.java"} + java.util.List queries -> o + java.util.List responses -> p + java.lang.String TAG -> q + 1:54:void (android.content.Context,com.batch.android.core.Webservice$RequestType,java.lang.String,java.lang.String[]):0:53 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/e/k0$c;Ljava/lang/String;[Ljava/lang/String;)V"} + java.util.List getQueries() -> I + 1:214:com.batch.android.query.response.Response getResponseFor(java.lang.Class,com.batch.android.query.QueryType):0:213 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/Class;Lcom/batch/android/w0/f;)Lcom/batch/android/x0/e;"} + 215:215:com.batch.android.query.response.Response getResponseFor(java.lang.Class,com.batch.android.query.QueryType):210:210 -> a + 216:447:com.batch.android.query.response.Response getResponseForType(com.batch.android.query.QueryType):0:231 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/w0/f;)Lcom/batch/android/x0/e;"} + 1:248:com.batch.android.query.Query getQueryForID(java.lang.String):0:247 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/w0/e;"} + 249:439:void parseQueries(com.batch.android.json.JSONObject):0:190 -> b + 440:440:void parseQueries(com.batch.android.json.JSONObject):187:187 -> b + 441:441:void parseQueries(com.batch.android.json.JSONObject):184:184 -> b + 442:442:void parseQueries(com.batch.android.json.JSONObject):181:181 -> b + 443:443:void parseQueries(com.batch.android.json.JSONObject):178:178 -> b + 444:464:void parseQueries(com.batch.android.json.JSONObject):175:195 -> b + 465:465:void parseQueries(com.batch.android.json.JSONObject):166:166 -> b + 466:470:void parseQueries(com.batch.android.json.JSONObject):142:146 -> b + 471:471:void parseQueries(com.batch.android.json.JSONObject):137:137 -> b + 1:126:void parseResponse(com.batch.android.json.JSONObject):0:125 -> c + 1:98:com.batch.android.post.PostDataProvider getPostDataProvider():0:97 -> w + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/s0/h;"} +com.batch.android.BatchQueryWebservice$1 -> com.batch.android.a.c$a: +# {"id":"sourceFile","fileName":"BatchQueryWebservice.java"} + int[] $SwitchMap$com$batch$android$query$QueryType -> a + 1:1:void ():173:173 -> +com.batch.android.BatchTagCollectionsFetchListener -> com.batch.android.BatchTagCollectionsFetchListener: +# {"id":"sourceFile","fileName":"BatchTagCollectionsFetchListener.java"} +com.batch.android.BatchUserAttribute -> com.batch.android.BatchUserAttribute: +# {"id":"sourceFile","fileName":"BatchUserAttribute.java"} + 1:3:void (java.lang.Object,com.batch.android.BatchUserAttribute$Type):15:17 -> + 1:2:java.lang.Boolean getBooleanValue():46:47 -> getBooleanValue + 1:2:java.util.Date getDateValue():22:23 -> getDateValue + 1:2:java.lang.Number getNumberValue():38:39 -> getNumberValue + 1:2:java.lang.String getStringValue():30:31 -> getStringValue + 1:2:java.net.URI getUriValue():54:55 -> getUriValue +com.batch.android.BatchUserAttribute$Type -> com.batch.android.BatchUserAttribute$Type: +# {"id":"sourceFile","fileName":"BatchUserAttribute.java"} + com.batch.android.BatchUserAttribute$Type[] $VALUES -> a + 1:6:void ():62:67 -> + 7:7:void ():60:60 -> + 1:1:void (java.lang.String,int):61:61 -> + 1:1:com.batch.android.BatchUserAttribute$Type[] $values():60:60 -> a + 1:1:com.batch.android.BatchUserAttribute$Type valueOf(java.lang.String):60:60 -> valueOf + 1:1:com.batch.android.BatchUserAttribute$Type[] values():60:60 -> values +com.batch.android.BatchWebViewContent -> com.batch.android.BatchWebViewContent: +# {"id":"sourceFile","fileName":"BatchWebViewContent.java"} + java.lang.String url -> a + 1:18:void (com.batch.android.messaging.model.WebViewMessage):0:17 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/k;)V"} + 1:1:java.lang.String getURL():22:22 -> getURL +com.batch.android.BatchWebservice -> com.batch.android.a.d: +# {"id":"sourceFile","fileName":"BatchWebservice.java"} + int retryCount -> l + com.batch.android.core.WebserviceErrorCause lastFailureCause -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/m0;"} + java.lang.String TAG -> n + 1:55:void (android.content.Context,com.batch.android.core.Webservice$RequestType,java.lang.String,java.lang.String[]):0:54 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/e/k0$c;Ljava/lang/String;[Ljava/lang/String;)V"} + 56:73:void (android.content.Context,com.batch.android.core.Webservice$RequestType,java.lang.String,java.lang.String[]):39:56 -> + 1:205:void addPropertyParameters():0:204 -> G + 206:214:void addPropertyParameters():200:208 -> G + java.lang.String getPropertyParameterKey() -> H + 1:258:void handleParameters(com.batch.android.json.JSONObject):0:257 -> a + 259:259:void handleParameters(com.batch.android.json.JSONObject):228:228 -> a + 260:419:void onRetry(com.batch.android.core.WebserviceErrorCause):0:159 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e/m0;)V"} + 420:424:java.lang.String generateAcceptLanguage(android.content.Context):309:313 -> a + 1:87:void addDefaultHeaders():0:86 -> b + 88:384:java.lang.String generateUserAgent(android.content.Context):0:296 -> b + 1:56:com.batch.android.post.PostDataProvider getPostDataProvider():95:150 -> w + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/s0/h;"} +com.batch.android.BuildConfig -> com.batch.android.a.e: +# {"id":"sourceFile","fileName":"BuildConfig.java"} + boolean DEBUG -> a + java.lang.String LIBRARY_PACKAGE_NAME -> b + java.lang.String BUILD_TYPE -> c + java.lang.Integer API_LEVEL -> d + boolean ENABLE_DEBUG_LOGGER -> e + boolean ENABLE_WS_INTERCEPTOR -> f + java.lang.Integer MESSAGING_API_LEVEL -> g + java.lang.String SDK_VERSION -> h + java.lang.String WS_DOMAIN -> i + 1:18:void ():0:17 -> + 1:7:void ():0:6 -> +com.batch.android.DeeplinkInterceptorRuntimeException -> com.batch.android.a.f: +# {"id":"sourceFile","fileName":"DeeplinkInterceptorRuntimeException.java"} + java.lang.RuntimeException wrappedRuntimeException -> a + 1:19:void (java.lang.RuntimeException):0:18 -> + 1:23:java.lang.RuntimeException getWrappedRuntimeException():0:22 -> a +com.batch.android.DisplayReceiptWebservice -> com.batch.android.a.g: +# {"id":"sourceFile","fileName":"DisplayReceiptWebservice.java"} + com.batch.android.webservice.listener.DisplayReceiptWebserviceListener listener -> n + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e1/c;"} + java.lang.String TAG -> o + 1:37:void (android.content.Context,com.batch.android.webservice.listener.DisplayReceiptWebserviceListener,com.batch.android.post.DisplayReceiptPostDataProvider,java.lang.String[]):0:36 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/e1/c;Lcom/batch/android/s0/a;[Ljava/lang/String;)V"} + 38:38:void (android.content.Context,com.batch.android.webservice.listener.DisplayReceiptWebserviceListener,com.batch.android.post.DisplayReceiptPostDataProvider,java.lang.String[]):34:34 -> + 1:1:java.lang.String getSpecificRetryCountKey():62:62 -> C + 1:1:java.lang.String getTaskIdentifier():52:52 -> a + 1:1:java.lang.String getCryptorTypeParameterKey():57:57 -> p + 1:47:void run():0:46 -> run +com.batch.android.FailReason -> com.batch.android.FailReason: +# {"id":"sourceFile","fileName":"FailReason.java"} + com.batch.android.FailReason[] $VALUES -> a + 1:17:void ():14:30 -> + 18:18:void ():9:9 -> + 1:1:void (java.lang.String,int):10:10 -> + 1:1:com.batch.android.FailReason[] $values():9:9 -> a + 1:1:com.batch.android.FailReason valueOf(java.lang.String):9:9 -> valueOf + 1:1:com.batch.android.FailReason[] values():9:9 -> values +com.batch.android.ImageDownloadWebservice -> com.batch.android.e: +# {"id":"sourceFile","fileName":"ImageDownloadWebservice.java"} + java.lang.String url -> l + java.lang.String TAG -> m + 1:2:void (android.content.Context,java.lang.String,java.util.List):25:26 -> + 1:1:java.lang.String getSpecificConnectTimeoutKey():148:148 -> A + 1:1:java.lang.String getSpecificReadTimeoutKey():153:153 -> B + 1:1:java.lang.String getSpecificRetryCountKey():158:158 -> C + 1:1:java.lang.String getURLSorterPatternParameterKey():123:123 -> F + 1:20:android.graphics.Bitmap run():86:105 -> G + 21:28:android.graphics.Bitmap run():102:109 -> G + 1:13:java.lang.String buildImageURL(android.content.Context,java.lang.String,java.util.List):44:56 -> a + 14:20:java.lang.String appendDensityToImageURL(java.lang.String,java.lang.Double):73:79 -> a + 1:1:java.lang.String getCryptorModeParameterKey():133:133 -> o + 1:1:java.lang.String getCryptorTypeParameterKey():128:128 -> p + 1:1:java.lang.String getPostCryptorTypeParameterKey():138:138 -> v + 1:1:com.batch.android.post.PostDataProvider getPostDataProvider():0:0 -> w + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/s0/h;"} + 1:1:java.lang.String getReadCryptorTypeParameterKey():143:143 -> y +com.batch.android.InAppMessageUserActionSource -> com.batch.android.InAppMessageUserActionSource: +# {"id":"sourceFile","fileName":"InAppMessageUserActionSource.java"} +com.batch.android.Install -> com.batch.android.f: +# {"id":"sourceFile","fileName":"Install.java"} + java.lang.String installID -> a + java.util.Date installDate -> b + 1:7:void (android.content.Context):30:36 -> + 8:8:void (android.content.Context):32:32 -> + 1:1:java.util.Date getInstallDate():56:56 -> a + 2:2:java.lang.String generateInstallID(android.content.Context):84:84 -> a + 1:1:java.lang.String getInstallID():47:47 -> b + 2:11:java.util.Date getInstallDate(android.content.Context):96:105 -> b + 1:4:java.lang.String getInstallID(android.content.Context):68:71 -> c +com.batch.android.IntentParser -> com.batch.android.g: +# {"id":"sourceFile","fileName":"IntentParser.java"} + android.content.Intent intent -> a + com.batch.android.BatchPushPayload payload -> b + java.lang.String TAG -> c + java.lang.String ALREADY_SHOWN_LANDING_KEY -> d + java.lang.String ALREADY_TRACKED_OPEN_KEY -> e + java.lang.String FROM_PUSH_KEY -> f + java.lang.String FROM_PUSH_LEGACY_KEY -> g + java.lang.String PUSH_ID_KEY -> h + java.lang.String PUSH_ID_LEGACY_KEY -> i + 1:1:void (android.app.Activity):72:72 -> + 2:2:void (android.content.Intent):80:80 -> + 3:33:void (android.content.Intent):62:92 -> + 1:246:void putPushExtrasToIntent(android.os.Bundle,com.batch.android.core.InternalPushData,android.content.Intent):0:245 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/os/Bundle;Lcom/batch/android/e/p;Landroid/content/Intent;)V"} + 247:251:boolean comesFromPush():106:110 -> a + 252:254:void copyExtras(android.content.Intent,android.content.Intent):257:259 -> a + 255:281:void copyExtras(android.os.Bundle,android.os.Bundle):270:296 -> a + 1:5:com.batch.android.BatchMessage getLanding():181:185 -> b + 1:2:android.os.Bundle getPushBundle():226:227 -> c + 1:221:com.batch.android.core.InternalPushData getPushData():0:220 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/e/p;"} + 1:7:java.lang.String getPushId():195:201 -> e + 1:5:boolean hasLanding():143:147 -> f + 1:1:boolean hasPushPayload():97:97 -> g + 1:5:boolean isLandingAlreadyShown():156:160 -> h + 1:5:boolean isOpenAlreadyTracked():119:123 -> i + 1:5:void markLandingAsAlreadyShown():167:171 -> j + 1:4:void markOpenAsAlreadyTracked():130:133 -> k +com.batch.android.LocalCampaignsJITWebservice -> com.batch.android.a.h: +# {"id":"sourceFile","fileName":"LocalCampaignsJITWebservice.java"} + com.batch.android.webservice.listener.LocalCampaignsJITWebserviceListener listener -> n + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e1/e;"} + java.lang.String TAG -> o + 1:35:void (android.content.Context,com.batch.android.webservice.listener.LocalCampaignsJITWebserviceListener,com.batch.android.post.LocalCampaignsJITPostDataProvider,java.lang.String[]):0:34 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/e1/e;Lcom/batch/android/s0/d;[Ljava/lang/String;)V"} + 36:36:void (android.content.Context,com.batch.android.webservice.listener.LocalCampaignsJITWebserviceListener,com.batch.android.post.LocalCampaignsJITPostDataProvider,java.lang.String[]):32:32 -> + 1:1:java.lang.String getSpecificConnectTimeoutKey():63:63 -> A + 1:1:java.lang.String getSpecificReadTimeoutKey():68:68 -> B + 1:1:java.lang.String getSpecificRetryCountKey():73:73 -> C + 1:1:java.lang.String getTaskIdentifier():39:39 -> a + 1:58:void run():0:57 -> run +com.batch.android.LocalCampaignsWebservice -> com.batch.android.a.i: +# {"id":"sourceFile","fileName":"LocalCampaignsWebservice.java"} + com.batch.android.webservice.listener.LocalCampaignsWebserviceListener listener -> r + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e1/f;"} + java.lang.String TAG -> s + 1:40:void (android.content.Context,com.batch.android.webservice.listener.LocalCampaignsWebserviceListener):0:39 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/e1/f;)V"} + 1:1:java.lang.String getSpecificConnectTimeoutKey():170:170 -> A + 1:1:java.lang.String getSpecificReadTimeoutKey():175:175 -> B + 1:1:java.lang.String getSpecificRetryCountKey():180:180 -> C + 1:1:java.lang.String getURLSorterPatternParameterKey():145:145 -> F + 1:1:java.lang.String getPropertyParameterKey():140:140 -> H + 1:3:java.util.List getQueries():46:48 -> I + 1:1:java.lang.String getTaskIdentifier():133:133 -> a + 1:1:java.lang.String getCryptorModeParameterKey():155:155 -> o + 1:1:java.lang.String getCryptorTypeParameterKey():150:150 -> p + 1:112:void run():0:111 -> run + 113:113:void run():110:110 -> run + 114:130:void run():108:124 -> run + 131:134:void run():66:69 -> run + 135:153:void run():66:84 -> run + 154:154:void run():81:81 -> run + 155:155:void run():78:78 -> run + 156:208:void run():75:127 -> run + 1:1:java.lang.String getPostCryptorTypeParameterKey():160:160 -> v + 1:1:java.lang.String getReadCryptorTypeParameterKey():165:165 -> y +com.batch.android.LocalCampaignsWebservice$1 -> com.batch.android.a.i$a: +# {"id":"sourceFile","fileName":"LocalCampaignsWebservice.java"} + int[] $SwitchMap$com$batch$android$core$Webservice$WebserviceError$Reason -> a + 1:1:void ():73:73 -> +com.batch.android.LoggerDelegate -> com.batch.android.LoggerDelegate: +# {"id":"sourceFile","fileName":"LoggerDelegate.java"} +com.batch.android.LoggerLevel -> com.batch.android.LoggerLevel: +# {"id":"sourceFile","fileName":"LoggerLevel.java"} + int level -> a + com.batch.android.LoggerLevel[] $VALUES -> b + 1:5:void ():7:11 -> + 6:6:void ():5:5 -> + 1:2:void (java.lang.String,int,int):15:16 -> + 1:1:com.batch.android.LoggerLevel[] $values():5:5 -> a + 1:1:boolean canLog(com.batch.android.LoggerLevel):21:21 -> canLog + 1:1:com.batch.android.LoggerLevel valueOf(java.lang.String):5:5 -> valueOf + 1:1:com.batch.android.LoggerLevel[] values():5:5 -> values +com.batch.android.MessagingActivity -> com.batch.android.MessagingActivity: +# {"id":"sourceFile","fileName":"MessagingActivity.java"} + android.content.BroadcastReceiver dismissReceiver -> a + java.lang.String TAG -> b + java.lang.String ROTATED -> c + java.lang.String DIALOG_FRAGMENT_TAG -> d + 1:7:void ():23:29 -> + 1:12:boolean showMessage(com.batch.android.BatchMessage):110:121 -> a + 1:4:void finish():98:101 -> finish + 1:23:void onCreate(android.os.Bundle):40:62 -> onCreate + 24:48:void onCreate(android.os.Bundle):44:68 -> onCreate + 1:3:void onDestroy():91:93 -> onDestroy + 1:6:void onDialogDismiss(androidx.fragment.app.DialogFragment):129:134 -> onDialogDismiss + 1:2:void onSaveInstanceState(android.os.Bundle):73:74 -> onSaveInstanceState + 1:2:void onStart():79:80 -> onStart + 1:2:void onStop():85:86 -> onStop + 1:6:void startActivityForMessage(android.content.Context,com.batch.android.BatchMessage):143:148 -> startActivityForMessage +com.batch.android.MessagingActivity$1 -> com.batch.android.MessagingActivity$a: +# {"id":"sourceFile","fileName":"MessagingActivity.java"} + com.batch.android.MessagingActivity this$0 -> a + 1:1:void (com.batch.android.MessagingActivity):29:29 -> + 1:2:void onReceive(android.content.Context,android.content.Intent):32:33 -> onReceive +com.batch.android.MessagingAnalyticsDelegate -> com.batch.android.h: +# {"id":"sourceFile","fileName":"MessagingAnalyticsDelegate.java"} + com.batch.android.module.MessagingModule messagingModule -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/m0/h;"} + com.batch.android.module.TrackerModule trackerModule -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/m0/l;"} + com.batch.android.module.EventDispatcherModule eventDispatcherModule -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/m0/f;"} + com.batch.android.messaging.model.Message message -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/d0/g;"} + com.batch.android.BatchMessage sourceMessage -> e + java.util.ArrayList calledMethods -> f + java.lang.String STATE_KEY_CALLED_METHODS -> g + 1:55:void (com.batch.android.module.MessagingModule,com.batch.android.module.TrackerModule,com.batch.android.module.EventDispatcherModule,com.batch.android.messaging.model.Message,com.batch.android.BatchMessage):0:54 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/m0/h;Lcom/batch/android/m0/l;Lcom/batch/android/m0/f;Lcom/batch/android/d0/g;Lcom/batch/android/BatchMessage;)V"} + 56:69:void (com.batch.android.module.MessagingModule,com.batch.android.module.TrackerModule,com.batch.android.module.EventDispatcherModule,com.batch.android.messaging.model.Message,com.batch.android.BatchMessage):46:59 -> + 1:125:void onCTAClicked(int,com.batch.android.messaging.model.CTA):0:124 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(ILcom/batch/android/d0/e;)V"} + 126:126:void onCTAClicked(int,com.batch.android.messaging.model.CTA):119:119 -> a + 127:310:void onClosedError(com.batch.android.messaging.model.MessagingError):0:183 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/h;)V"} + 311:311:void onClosedError(com.batch.android.messaging.model.MessagingError):181:181 -> a + 312:414:void onGlobalTap(com.batch.android.messaging.model.Action):0:102 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/a;)V"} + 415:415:void onGlobalTap(com.batch.android.messaging.model.Action):97:97 -> a + 416:573:void onWebViewClickTracked(com.batch.android.messaging.model.Action,java.lang.String):0:157 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/a;Ljava/lang/String;)V"} + 574:574:void onWebViewClickTracked(com.batch.android.messaging.model.Action,java.lang.String):152:152 -> a + 575:578:com.batch.android.MessagingAnalyticsDelegate provide(com.batch.android.messaging.model.Message,com.batch.android.BatchMessage):64:67 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/g;Lcom/batch/android/BatchMessage;)Lcom/batch/android/h;"} + 579:586:boolean ensureOnce(java.lang.String):75:82 -> a + 587:593:void onAutoClosedAfterDelay():192:198 -> a + 594:594:void onAutoClosedAfterDelay():196:196 -> a + 595:595:void onSaveInstanceState(android.os.Bundle):239:239 -> a + 1:7:void onClosed():166:172 -> b + 8:8:void onClosed():170:170 -> b + 9:11:void restoreState(android.os.Bundle):231:233 -> b + 1:4:void onViewDismissed():219:222 -> c + 1:12:void onViewShown():203:214 -> d + 13:13:void onViewShown():212:212 -> d +com.batch.android.MetricWebservice -> com.batch.android.a.j: +# {"id":"sourceFile","fileName":"MetricWebservice.java"} + com.batch.android.webservice.listener.MetricWebserviceListener listener -> n + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e1/g;"} + java.lang.String TAG -> o + 1:30:void (android.content.Context,com.batch.android.webservice.listener.MetricWebserviceListener,com.batch.android.post.MetricPostDataProvider,java.lang.String[]):0:29 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/e1/g;Lcom/batch/android/s0/f;[Ljava/lang/String;)V"} + 31:31:void (android.content.Context,com.batch.android.webservice.listener.MetricWebserviceListener,com.batch.android.post.MetricPostDataProvider,java.lang.String[]):27:27 -> + 1:1:java.lang.String getSpecificRetryCountKey():50:50 -> C + 1:1:java.lang.String getTaskIdentifier():45:45 -> a + 1:40:void run():0:39 -> run +com.batch.android.NotificationInterceptorRuntimeException -> com.batch.android.i: +# {"id":"sourceFile","fileName":"NotificationInterceptorRuntimeException.java"} + java.lang.RuntimeException wrappedRuntimeException -> a + 1:2:void (java.lang.RuntimeException):17:18 -> + 1:1:java.lang.RuntimeException getWrappedRuntimeException():22:22 -> a +com.batch.android.PrivateNotificationContentHelper -> com.batch.android.j: +# {"id":"sourceFile","fileName":"PrivateNotificationContentHelper.java"} + 1:1:void ():12:12 -> + 1:16:com.batch.android.inbox.InboxNotificationContentInternal getInternalContent(com.batch.android.BatchInboxNotificationContent):0:15 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/BatchInboxNotificationContent;)Lcom/batch/android/q/g;"} + 17:17:com.batch.android.BatchInboxNotificationContent getPublicContent(com.batch.android.inbox.InboxNotificationContentInternal):19:19 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q/g;)Lcom/batch/android/BatchInboxNotificationContent;"} +com.batch.android.PushNotificationType -> com.batch.android.PushNotificationType: +# {"id":"sourceFile","fileName":"PushNotificationType.java"} + int value -> a + com.batch.android.PushNotificationType[] $VALUES -> b + 1:21:void ():15:35 -> + 22:22:void ():10:10 -> + 1:2:void (java.lang.String,int,int):47:48 -> + 1:1:com.batch.android.PushNotificationType[] $values():10:10 -> a + 1:10:java.util.EnumSet fromValue(int):54:63 -> fromValue + 1:2:int toValue(java.util.EnumSet):72:73 -> toValue + 1:1:com.batch.android.PushNotificationType valueOf(java.lang.String):10:10 -> valueOf + 1:1:com.batch.android.PushNotificationType[] values():10:10 -> values +com.batch.android.PushRegistrationProvider -> com.batch.android.PushRegistrationProvider: +# {"id":"sourceFile","fileName":"PushRegistrationProvider.java"} +com.batch.android.PushRegistrationProviderAvailabilityException -> com.batch.android.PushRegistrationProviderAvailabilityException: +# {"id":"sourceFile","fileName":"PushRegistrationProviderAvailabilityException.java"} + 1:1:void (java.lang.String):9:9 -> +com.batch.android.PushUserActionSource -> com.batch.android.PushUserActionSource: +# {"id":"sourceFile","fileName":"PushUserActionSource.java"} +com.batch.android.PushWebservice -> com.batch.android.a.k: +# {"id":"sourceFile","fileName":"PushWebservice.java"} + com.batch.android.BatchPushRegistration registration -> r + com.batch.android.webservice.listener.PushWebserviceListener listener -> s + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e1/h;"} + java.lang.String TAG -> t + 1:56:void (android.content.Context,com.batch.android.BatchPushRegistration,com.batch.android.webservice.listener.PushWebserviceListener):0:55 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/BatchPushRegistration;Lcom/batch/android/e1/h;)V"} + 57:57:void (android.content.Context,com.batch.android.BatchPushRegistration,com.batch.android.webservice.listener.PushWebserviceListener):51:51 -> + 58:58:void (android.content.Context,com.batch.android.BatchPushRegistration,com.batch.android.webservice.listener.PushWebserviceListener):47:47 -> + 1:1:java.lang.String getSpecificConnectTimeoutKey():163:163 -> A + 1:1:java.lang.String getSpecificReadTimeoutKey():168:168 -> B + 1:1:java.lang.String getSpecificRetryCountKey():173:173 -> C + 1:1:java.lang.String getURLSorterPatternParameterKey():138:138 -> F + 1:1:java.lang.String getPropertyParameterKey():133:133 -> H + 1:3:java.util.List getQueries():62:64 -> I + 1:1:java.lang.String getTaskIdentifier():126:126 -> a + 1:1:java.lang.String getCryptorModeParameterKey():148:148 -> o + 1:1:java.lang.String getCryptorTypeParameterKey():143:143 -> p + 1:118:void run():0:117 -> run + 119:119:void run():111:111 -> run + 120:133:void run():81:94 -> run + 134:134:void run():91:91 -> run + 135:135:void run():88:88 -> run + 136:171:void run():85:120 -> run + 1:1:java.lang.String getPostCryptorTypeParameterKey():153:153 -> v + 1:1:java.lang.String getReadCryptorTypeParameterKey():158:158 -> y +com.batch.android.PushWebservice$1 -> com.batch.android.a.k$a: +# {"id":"sourceFile","fileName":"PushWebservice.java"} + int[] $SwitchMap$com$batch$android$core$Webservice$WebserviceError$Reason -> a + 1:1:void ():83:83 -> +com.batch.android.StartWebservice -> com.batch.android.a.l: +# {"id":"sourceFile","fileName":"StartWebservice.java"} + com.batch.android.webservice.listener.StartWebserviceListener listener -> r + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e1/i;"} + boolean fromPush -> s + java.lang.String pushId -> t + boolean userActivity -> u + java.lang.String TAG -> v + 1:72:void (android.content.Context,boolean,java.lang.String,boolean,com.batch.android.webservice.listener.StartWebserviceListener):0:71 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;ZLjava/lang/String;ZLcom/batch/android/e1/i;)V"} + 73:73:void (android.content.Context,boolean,java.lang.String,boolean,com.batch.android.webservice.listener.StartWebserviceListener):65:65 -> + 1:1:java.lang.String getSpecificConnectTimeoutKey():185:185 -> A + 1:1:java.lang.String getSpecificReadTimeoutKey():190:190 -> B + 1:1:java.lang.String getSpecificRetryCountKey():195:195 -> C + 1:1:java.lang.String getURLSorterPatternParameterKey():160:160 -> F + 1:1:java.lang.String getPropertyParameterKey():155:155 -> H + 1:8:java.util.List getQueries():78:85 -> I + 1:1:java.lang.String getTaskIdentifier():148:148 -> a + 1:1:java.lang.String getCryptorModeParameterKey():170:170 -> o + 1:1:java.lang.String getCryptorTypeParameterKey():165:165 -> p + 1:140:void run():0:139 -> run + 141:141:void run():133:133 -> run + 142:155:void run():103:116 -> run + 156:156:void run():113:113 -> run + 157:157:void run():110:110 -> run + 158:193:void run():107:142 -> run + 1:1:java.lang.String getPostCryptorTypeParameterKey():175:175 -> v + 1:1:java.lang.String getReadCryptorTypeParameterKey():180:180 -> y +com.batch.android.StartWebservice$1 -> com.batch.android.a.l$a: +# {"id":"sourceFile","fileName":"StartWebservice.java"} + int[] $SwitchMap$com$batch$android$core$Webservice$WebserviceError$Reason -> a + 1:1:void ():105:105 -> +com.batch.android.TrackerWebservice -> com.batch.android.a.m: +# {"id":"sourceFile","fileName":"TrackerWebservice.java"} + com.batch.android.webservice.listener.TrackerWebserviceListener listener -> r + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e1/j;"} + java.util.List events -> s + boolean canBypassOptOut -> t + java.lang.String TAG -> u + 1:47:void (android.content.Context,com.batch.android.webservice.listener.TrackerWebserviceListener,java.util.List,boolean):0:46 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/e1/j;Ljava/util/List;Z)V"} + 48:48:void (android.content.Context,com.batch.android.webservice.listener.TrackerWebserviceListener,java.util.List,boolean):41:41 -> + 49:49:void (android.content.Context,com.batch.android.webservice.listener.TrackerWebserviceListener,java.util.List,boolean):37:37 -> + 1:1:java.lang.String getSpecificConnectTimeoutKey():152:152 -> A + 1:1:java.lang.String getSpecificReadTimeoutKey():157:157 -> B + 1:1:java.lang.String getSpecificRetryCountKey():162:162 -> C + 1:1:java.lang.String getURLSorterPatternParameterKey():127:127 -> F + 1:1:java.lang.String getPropertyParameterKey():122:122 -> H + 1:3:java.util.List getQueries():58:60 -> I + 1:1:java.lang.String getTaskIdentifier():115:115 -> a + 1:54:boolean canBypassOptOut():0:53 -> i + 1:1:java.lang.String getCryptorModeParameterKey():137:137 -> o + 1:1:java.lang.String getCryptorTypeParameterKey():132:132 -> p + 1:110:void run():0:109 -> run + 111:124:void run():76:89 -> run + 125:125:void run():86:86 -> run + 126:126:void run():83:83 -> run + 127:156:void run():80:109 -> run + 157:161:void run():106:110 -> run + 1:1:java.lang.String getPostCryptorTypeParameterKey():142:142 -> v + 1:1:java.lang.String getReadCryptorTypeParameterKey():147:147 -> y +com.batch.android.TrackerWebservice$1 -> com.batch.android.a.m$a: +# {"id":"sourceFile","fileName":"TrackerWebservice.java"} + int[] $SwitchMap$com$batch$android$core$Webservice$WebserviceError$Reason -> a + 1:1:void ():78:78 -> +com.batch.android.UserAction -> com.batch.android.UserAction: +# {"id":"sourceFile","fileName":"UserAction.java"} + java.lang.String identifier -> a + com.batch.android.UserActionRunnable runnable -> b + 1:17:void (java.lang.String,com.batch.android.UserActionRunnable):22:38 -> + 18:18:void (java.lang.String,com.batch.android.UserActionRunnable):34:34 -> + 19:19:void (java.lang.String,com.batch.android.UserActionRunnable):29:29 -> + 20:20:void (java.lang.String,com.batch.android.UserActionRunnable):25:25 -> + 1:1:java.lang.String getIdentifier():43:43 -> getIdentifier + 1:1:com.batch.android.UserActionRunnable getRunnable():48:48 -> getRunnable +com.batch.android.UserActionRunnable -> com.batch.android.UserActionRunnable: +# {"id":"sourceFile","fileName":"UserActionRunnable.java"} +com.batch.android.UserActionSource -> com.batch.android.UserActionSource: +# {"id":"sourceFile","fileName":"UserActionSource.java"} +com.batch.android.UserDataAccessor -> com.batch.android.k: +# {"id":"sourceFile","fileName":"UserDataAccessor.java"} + 1:1:void ():19:19 -> + 1:37:void fetchTagCollections(android.content.Context,com.batch.android.BatchTagCollectionsFetchListener,boolean):31:67 -> a + 38:38:void fetchTagCollections(android.content.Context,com.batch.android.BatchTagCollectionsFetchListener,boolean):28:28 -> a + 39:64:void lambda$fetchTagCollections$1(android.content.Context,boolean,com.batch.android.BatchTagCollectionsFetchListener):33:58 -> a + 65:67:void lambda$fetchTagCollections$0(com.batch.android.BatchTagCollectionsFetchListener,java.util.Map):47:49 -> a + 68:139:void fetchAttributes(android.content.Context,com.batch.android.BatchAttributesFetchListener,boolean):81:152 -> a + 140:140:void fetchAttributes(android.content.Context,com.batch.android.BatchAttributesFetchListener,boolean):78:78 -> a + 141:169:void lambda$fetchAttributes$3(android.content.Context,boolean,com.batch.android.BatchAttributesFetchListener):83:111 -> a + 170:170:void lambda$fetchAttributes$3(android.content.Context,boolean,com.batch.android.BatchAttributesFetchListener):108:108 -> a + 171:171:void lambda$fetchAttributes$3(android.content.Context,boolean,com.batch.android.BatchAttributesFetchListener):105:105 -> a + 172:172:void lambda$fetchAttributes$3(android.content.Context,boolean,com.batch.android.BatchAttributesFetchListener):102:102 -> a + 173:173:void lambda$fetchAttributes$3(android.content.Context,boolean,com.batch.android.BatchAttributesFetchListener):99:99 -> a + 174:221:void lambda$fetchAttributes$3(android.content.Context,boolean,com.batch.android.BatchAttributesFetchListener):96:143 -> a + 222:224:void lambda$fetchAttributes$2(com.batch.android.BatchAttributesFetchListener,java.util.HashMap):132:134 -> a +com.batch.android.UserDataAccessor$1 -> com.batch.android.k$a: +# {"id":"sourceFile","fileName":"UserDataAccessor.java"} + int[] $SwitchMap$com$batch$android$user$AttributeType -> a + 1:1:void ():94:94 -> +com.batch.android.WebserviceLauncher -> com.batch.android.a.n: +# {"id":"sourceFile","fileName":"WebserviceLauncher.java"} + java.lang.String TAG -> a + 1:33:void ():0:32 -> + 1:182:boolean launchAttributesCheckWebservice(com.batch.android.runtime.RuntimeManager,long,java.lang.String):0:181 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/a1/e;JLjava/lang/String;)Z"} + 183:193:boolean launchAttributesCheckWebservice(com.batch.android.runtime.RuntimeManager,long,java.lang.String):179:189 -> a + 194:351:boolean launchAttributesSendWebservice(com.batch.android.runtime.RuntimeManager,long,java.util.Map,java.util.Map):0:157 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/a1/e;JLjava/util/Map;Ljava/util/Map;)Z"} + 352:363:boolean launchAttributesSendWebservice(com.batch.android.runtime.RuntimeManager,long,java.util.Map,java.util.Map):155:166 -> a + 364:609:boolean launchDisplayReceiptWebservice(android.content.Context,com.batch.android.post.DisplayReceiptPostDataProvider,com.batch.android.webservice.listener.DisplayReceiptWebserviceListener):0:245 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/s0/a;Lcom/batch/android/e1/c;)Z"} + 610:833:boolean launchLocalCampaignsJITWebservice(com.batch.android.runtime.RuntimeManager,java.util.List,com.batch.android.webservice.listener.LocalCampaignsJITWebserviceListener):0:223 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/a1/e;Ljava/util/List;Lcom/batch/android/e1/e;)Z"} + 834:1035:boolean launchLocalCampaignsWebservice(com.batch.android.runtime.RuntimeManager):0:201 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/a1/e;)Z"} + 1036:1044:boolean launchLocalCampaignsWebservice(com.batch.android.runtime.RuntimeManager):198:206 -> a + 1045:1182:boolean launchPushWebservice(com.batch.android.runtime.RuntimeManager,com.batch.android.BatchPushRegistration):0:137 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/a1/e;Lcom/batch/android/BatchPushRegistration;)Z"} + 1183:1188:boolean launchPushWebservice(com.batch.android.runtime.RuntimeManager,com.batch.android.BatchPushRegistration):136:141 -> a + 1189:1239:boolean launchStartWebservice(com.batch.android.runtime.RuntimeManager,boolean,java.lang.String,boolean):0:50 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/a1/e;ZLjava/lang/String;Z)Z"} + 1240:1251:boolean launchStartWebservice(com.batch.android.runtime.RuntimeManager,boolean,java.lang.String,boolean):48:59 -> a + 1252:1254:com.batch.android.core.TaskRunnable initTrackerWebservice(com.batch.android.runtime.RuntimeManager,java.util.List,com.batch.android.webservice.listener.TrackerWebserviceListener):78:80 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/a1/e;Ljava/util/List;Lcom/batch/android/e1/j;)Lcom/batch/android/e/i0;"} + 1255:1257:com.batch.android.core.TaskRunnable initOptOutTrackerWebservice(android.content.Context,java.util.List,com.batch.android.webservice.listener.TrackerWebserviceListener):98:100 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Ljava/util/List;Lcom/batch/android/e1/j;)Lcom/batch/android/e/i0;"} + 1258:1260:com.batch.android.core.TaskRunnable initMetricWebservice(android.content.Context,com.batch.android.post.MetricPostDataProvider,com.batch.android.webservice.listener.MetricWebserviceListener):119:121 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/s0/f;Lcom/batch/android/e1/g;)Lcom/batch/android/e/i0;"} +com.batch.android.WebserviceParameterUtils -> com.batch.android.a.o: +# {"id":"sourceFile","fileName":"WebserviceParameterUtils.java"} + 1:18:void ():0:17 -> + 1:60:java.util.Map buildIds(android.content.Context):0:59 -> a + 61:65:java.util.Map buildIds(android.content.Context):58:62 -> a + 1:1:com.batch.android.json.JSONObject getWebserviceIdsAsJson(android.content.Context):34:34 -> b + 1:26:java.util.Map getWebserviceIdsAsMap(android.content.Context):0:25 -> c +com.batch.android.actions.ClipboardActionRunnable -> com.batch.android.b.a: +# {"id":"sourceFile","fileName":"ClipboardActionRunnable.java"} + java.lang.String TAG -> a + java.lang.String BASE_ERROR_MSG -> b + java.lang.String IDENTIFIER -> c + 1:19:void ():0:18 -> + 1:50:void performAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject,com.batch.android.UserActionSource):0:49 -> performAction +com.batch.android.actions.DeeplinkActionRunnable -> com.batch.android.b.b: +# {"id":"sourceFile","fileName":"DeeplinkActionRunnable.java"} + com.batch.android.module.ActionModule actionModule -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/m0/a;"} + java.lang.String TAG -> b + java.lang.String IDENTIFIER -> c + java.lang.String ARGUMENT_DEEPLINK_URL -> d + java.lang.String ARGUMENT_SHOW_LINK_INAPP -> e + 1:31:void (com.batch.android.module.ActionModule):0:30 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/m0/a;)V"} + 1:52:void launchDeeplink(android.content.Context,java.lang.String,boolean):0:51 -> a + 53:83:void launchDeeplink(android.content.Context,java.lang.String,boolean):42:72 -> a + 84:89:void launchDeeplink(android.content.Context,java.lang.String,boolean):63:68 -> a + 90:115:void launchDeeplink(android.content.Context,java.lang.String,boolean):55:80 -> a + 1:107:void performAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject,com.batch.android.UserActionSource):0:106 -> performAction + 108:125:void performAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject,com.batch.android.UserActionSource):103:120 -> performAction + 126:126:void performAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject,com.batch.android.UserActionSource):113:113 -> performAction + 127:127:void performAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject,com.batch.android.UserActionSource):111:111 -> performAction +com.batch.android.actions.GroupActionRunnable -> com.batch.android.b.c: +# {"id":"sourceFile","fileName":"GroupActionRunnable.java"} + com.batch.android.module.ActionModule actionModule -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/m0/a;"} + java.lang.String IDENTIFIER -> b + 1:25:void (com.batch.android.module.ActionModule):0:24 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/m0/a;)V"} + 1:79:void performAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject,com.batch.android.UserActionSource):0:78 -> performAction +com.batch.android.actions.LocalCampaignsRefreshActionRunnable -> com.batch.android.b.d: +# {"id":"sourceFile","fileName":"LocalCampaignsRefreshActionRunnable.java"} + java.lang.String TAG -> a + java.lang.String IDENTIFIER -> b + 1:1:void ():0:0 -> + 1:16:void ():0:15 -> + 1:5:void performAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject,com.batch.android.UserActionSource):27:31 -> performAction +com.batch.android.actions.NotificationPermissionActionRunnable -> com.batch.android.b.e: +# {"id":"sourceFile","fileName":"NotificationPermissionActionRunnable.java"} + java.lang.String TAG -> a + java.lang.String IDENTIFIER -> b + 1:14:void ():0:13 -> + 1:32:void performAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject,com.batch.android.UserActionSource):0:31 -> performAction +com.batch.android.actions.RatingActionRunnable -> com.batch.android.b.f: +# {"id":"sourceFile","fileName":"RatingActionRunnable.java"} + java.lang.String TAG -> a + java.lang.String IDENTIFIER -> b + 1:26:void ():0:25 -> + 1:48:void lambda$performAction$0(android.content.Context,java.lang.Exception):0:47 -> a + 49:55:void lambda$performAction$0(android.content.Context,java.lang.Exception):44:50 -> a + 56:138:void lambda$tryOpenPlayStoreInAppRating$1(com.batch.android.core.Promise,com.google.android.play.core.review.ReviewManager,android.app.Activity,com.google.android.gms.tasks.Task):0:82 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e/a0;Lcom/google/android/play/core/review/ReviewManager;Landroid/app/Activity;Lcom/google/android/gms/tasks/Task;)V"} + 139:211:void lambda$tryOpenPlayStoreInAppRating$2(android.content.Context,com.batch.android.core.Promise):0:72 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/e/a0;)V"} + 212:233:void lambda$tryOpenPlayStoreInAppRating$2(android.content.Context,com.batch.android.core.Promise):65:86 -> a + 234:329:void openStore(android.content.Context):0:95 -> a + 1:1:com.batch.android.core.Promise tryOpenPlayStoreInAppRating(android.content.Context):55:55 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;)Lcom/batch/android/e/a0;"} + 1:40:void performAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject,com.batch.android.UserActionSource):0:39 -> performAction +com.batch.android.actions.RatingActionRunnable$RatingActionRunnableException -> com.batch.android.b.f$a: +# {"id":"sourceFile","fileName":"RatingActionRunnable.java"} + 1:103:void (java.lang.String,java.lang.Throwable):0:102 -> +com.batch.android.actions.RedirectNotificationSettingsAction -> com.batch.android.b.g: +# {"id":"sourceFile","fileName":"RedirectNotificationSettingsAction.java"} + java.lang.String TAG -> a + java.lang.String IDENTIFIER -> b + 1:17:void ():0:16 -> + 1:46:void performAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject,com.batch.android.UserActionSource):0:45 -> performAction +com.batch.android.actions.SmartReOptInAction -> com.batch.android.b.h: +# {"id":"sourceFile","fileName":"SmartReOptInAction.java"} + java.lang.String TAG -> a + java.lang.String IDENTIFIER -> b + 1:25:void ():0:24 -> + 1:96:void redirectToNotificationSettings(android.content.Context):0:95 -> a + 1:86:void onReceive(android.content.Context,android.content.Intent):0:85 -> onReceive + 1:65:void performAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject,com.batch.android.UserActionSource):0:64 -> performAction +com.batch.android.actions.UserDataBuiltinActionRunnable -> com.batch.android.b.i: +# {"id":"sourceFile","fileName":"UserDataBuiltinActionRunnable.java"} + java.lang.String TAG -> a + java.lang.String IDENTIFIER -> b + 1:1:void ():0:0 -> + 1:18:void ():0:17 -> + 1:47:void performAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject,com.batch.android.UserActionSource):30:76 -> performAction +com.batch.android.actions.UserEventBuiltinActionRunnable -> com.batch.android.b.j: +# {"id":"sourceFile","fileName":"UserEventBuiltinActionRunnable.java"} + java.lang.String TAG -> a + java.lang.String IDENTIFIER -> b + 1:1:void ():0:0 -> + 1:24:void ():0:23 -> + 1:9:java.util.Date parseDate(java.lang.String):30:38 -> a + 1:63:void performAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject,com.batch.android.UserActionSource):52:114 -> performAction +com.batch.android.annotation.PublicSDK -> com.batch.android.c.a: +# {"id":"sourceFile","fileName":"PublicSDK.java"} +com.batch.android.compat.LocalBroadcastManager -> com.batch.android.d.a: +# {"id":"sourceFile","fileName":"LocalBroadcastManager.java"} + android.content.Context mAppContext -> a + java.util.HashMap mReceivers -> b + java.util.HashMap mActions -> c + java.util.ArrayList mPendingBroadcasts -> d + android.os.Handler mHandler -> e + java.lang.String TAG -> f + boolean DEBUG -> g + int MSG_EXEC_PENDING_BROADCASTS -> h + 1:95:void (android.content.Context):0:94 -> + 96:108:void (android.content.Context):85:97 -> + 1:50:void access$000(com.batch.android.compat.LocalBroadcastManager):0:49 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d/a;)V"} + 51:343:void executePendingBroadcasts():0:292 -> a + 344:344:void executePendingBroadcasts():288:288 -> a + 345:481:void registerReceiver(android.content.BroadcastReceiver,android.content.IntentFilter):0:136 -> a + 482:482:void registerReceiver(android.content.BroadcastReceiver,android.content.IntentFilter):136:136 -> a + 483:726:boolean sendBroadcast(android.content.Intent):0:243 -> a + 727:727:boolean sendBroadcast(android.content.Intent):240:240 -> a + 728:728:boolean sendBroadcast(android.content.Intent):237:237 -> a + 729:760:boolean sendBroadcast(android.content.Intent):231:262 -> a + 761:761:boolean sendBroadcast(android.content.Intent):262:262 -> a + 762:933:void unregisterReceiver(android.content.BroadcastReceiver):0:171 -> a + 934:934:void unregisterReceiver(android.content.BroadcastReceiver):171:171 -> a + 1:274:void sendBroadcastSync(android.content.Intent):0:273 -> b +com.batch.android.compat.LocalBroadcastManager$1 -> com.batch.android.d.a$a: +# {"id":"sourceFile","fileName":"LocalBroadcastManager.java"} + com.batch.android.compat.LocalBroadcastManager this$0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/d/a;"} + 1:98:void (com.batch.android.compat.LocalBroadcastManager,android.os.Looper):0:97 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d/a;Landroid/os/Looper;)V"} + 1:106:void handleMessage(android.os.Message):0:105 -> handleMessage + 107:107:void handleMessage(android.os.Message):102:102 -> handleMessage +com.batch.android.compat.LocalBroadcastManager$BroadcastRecord -> com.batch.android.d.a$b: +# {"id":"sourceFile","fileName":"LocalBroadcastManager.java"} + android.content.Intent intent -> a + java.util.ArrayList receivers -> b + 1:77:void (android.content.Intent,java.util.ArrayList):0:76 -> +com.batch.android.compat.LocalBroadcastManager$ReceiverRecord -> com.batch.android.d.a$c: +# {"id":"sourceFile","fileName":"LocalBroadcastManager.java"} + android.content.IntentFilter filter -> a + android.content.BroadcastReceiver receiver -> b + boolean broadcasting -> c + 1:60:void (android.content.IntentFilter,android.content.BroadcastReceiver):0:59 -> + 1:1:java.lang.String toString():64:64 -> toString +com.batch.android.compat.WakefulBroadcastReceiver -> com.batch.android.d.b: +# {"id":"sourceFile","fileName":"WakefulBroadcastReceiver.java"} + java.lang.String EXTRA_WAKE_LOCK_ID -> a + android.util.SparseArray mActiveWakeLocks -> b + int mNextId -> c + 1:2:void ():63:64 -> + 1:60:void ():0:59 -> + 1:139:boolean completeWakefulIntent(android.content.Intent):0:138 -> completeWakefulIntent + 1:17:android.content.ComponentName startWakefulService(android.content.Context,android.content.Intent):81:97 -> startWakefulService + 18:26:android.content.ComponentName startWakefulService(android.content.Context,android.content.Intent):95:103 -> startWakefulService +com.batch.android.core.ByteArrayHelper -> com.batch.android.e.a: +# {"id":"sourceFile","fileName":"ByteArrayHelper.java"} + java.lang.String UTF_8 -> a + char[] hexArray -> b + 1:1:void ():26:26 -> + 1:17:void ():0:16 -> + 1:134:java.lang.String SHA1Base64Encoded(byte[]):0:133 -> a + 135:135:java.lang.String SHA1Base64Encoded(byte[]):126:126 -> a + 136:179:byte[] concat(byte[],byte[]):0:43 -> a + 180:254:byte[] getUTF8Bytes(java.lang.String):0:74 -> a + 255:263:byte[] fromInputStream(java.io.InputStream):138:146 -> a + 264:264:byte[] fromInputStream(java.io.InputStream):138:138 -> a + 1:97:java.lang.String bytesToHex(byte[]):0:96 -> b + 98:209:byte[] hexToBytes(java.lang.String):0:111 -> b + 1:3:java.lang.String getUTF8String(byte[]):58:60 -> c +com.batch.android.core.Cryptor -> com.batch.android.e.b: +# {"id":"sourceFile","fileName":"Cryptor.java"} + java.lang.String encrypt(java.lang.String) -> a + byte[] encrypt(byte[]) -> a + java.lang.String decrypt(java.lang.String) -> b + byte[] decrypt(byte[]) -> b + byte[] decryptToByte(java.lang.String) -> c +com.batch.android.core.CryptorFactory -> com.batch.android.e.c: +# {"id":"sourceFile","fileName":"CryptorFactory.java"} + java.lang.String DEFAULT_PRIVATE_KEY_PART -> a + 1:11:void ():0:10 -> + 1:69:com.batch.android.core.Cryptor getCryptorForType(com.batch.android.core.CryptorFactory$CryptorType):0:68 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e/c$b;)Lcom/batch/android/e/b;"} + 70:165:com.batch.android.core.Cryptor getCryptorForType(com.batch.android.core.CryptorFactory$CryptorType,java.lang.String):0:95 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e/c$b;Ljava/lang/String;)Lcom/batch/android/e/b;"} + 166:166:com.batch.android.core.Cryptor getCryptorForType(com.batch.android.core.CryptorFactory$CryptorType,java.lang.String):93:93 -> a + 167:167:com.batch.android.core.Cryptor getCryptorForType(com.batch.android.core.CryptorFactory$CryptorType,java.lang.String):91:91 -> a + 168:168:com.batch.android.core.Cryptor getCryptorForType(com.batch.android.core.CryptorFactory$CryptorType,java.lang.String):89:89 -> a + 169:195:com.batch.android.core.Cryptor getCryptorForType(java.lang.String):0:26 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/e/b;"} + 196:233:com.batch.android.core.Cryptor getCryptorForType(java.lang.String,java.lang.String):0:37 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Ljava/lang/String;)Lcom/batch/android/e/b;"} + 234:281:com.batch.android.core.Cryptor getCryptorForTypeValue(int):0:47 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/e/b;"} + 282:340:com.batch.android.core.Cryptor getCryptorForTypeValue(int,java.lang.String):0:58 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(ILjava/lang/String;)Lcom/batch/android/e/b;"} + 341:344:byte[] buildDefaultKey():107:110 -> a +com.batch.android.core.CryptorFactory$1 -> com.batch.android.e.c$a: +# {"id":"sourceFile","fileName":"CryptorFactory.java"} + int[] $SwitchMap$com$batch$android$core$CryptorFactory$CryptorType -> a + 1:1:void ():87:87 -> +com.batch.android.core.CryptorFactory$CryptorType -> com.batch.android.e.c$b: +# {"id":"sourceFile","fileName":"CryptorFactory.java"} + int value -> a + com.batch.android.core.CryptorFactory$CryptorType EAS -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/c$b;"} + com.batch.android.core.CryptorFactory$CryptorType EAS_HEX -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/c$b;"} + com.batch.android.core.CryptorFactory$CryptorType EAS_BASE64 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/c$b;"} + com.batch.android.core.CryptorFactory$CryptorType EAS_BASE64_GZIP -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/c$b;"} + com.batch.android.core.CryptorFactory$CryptorType[] $VALUES -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/e/c$b;"} + 1:13:void ():123:135 -> + 14:14:void ():119:119 -> + 1:143:void (java.lang.String,int,int):0:142 -> + 1:120:com.batch.android.core.CryptorFactory$CryptorType[] $values():0:119 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/e/c$b;"} + 121:282:com.batch.android.core.CryptorFactory$CryptorType fromString(java.lang.String):0:161 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/e/c$b;"} + 283:284:com.batch.android.core.CryptorFactory$CryptorType fromValue(int):174:175 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/e/c$b;"} + 1:149:int getValue():0:148 -> b + 1:1:com.batch.android.core.CryptorFactory$CryptorType valueOf(java.lang.String):119:119 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/e/c$b;"} + 1:1:com.batch.android.core.CryptorFactory$CryptorType[] values():119:119 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/e/c$b;"} +com.batch.android.core.DateProvider -> com.batch.android.e.d: +# {"id":"sourceFile","fileName":"DateProvider.java"} + com.batch.android.date.BatchDate getCurrentDate() -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/h/a;"} +com.batch.android.core.DeeplinkHelper -> com.batch.android.e.e: +# {"id":"sourceFile","fileName":"DeeplinkHelper.java"} + 1:16:void ():0:15 -> + 1:41:boolean customTabSupportsURI(android.net.Uri):0:40 -> a + 42:123:android.content.Intent getFallbackIntent(android.content.Context):0:81 -> a + 124:189:android.content.Intent getIntent(java.lang.String,boolean,boolean):0:65 -> a + 1:7:android.content.Intent getCustomTabIntent(android.net.Uri):23:29 -> b +com.batch.android.core.DiscoveryServiceHelper -> com.batch.android.e.f: +# {"id":"sourceFile","fileName":"DiscoveryServiceHelper.java"} + java.lang.String TAG -> a + 1:14:void ():0:13 -> + 1:33:java.util.List getComponentNames(android.content.Context,java.lang.Class,java.lang.String,java.lang.String):0:32 -> a + 34:90:android.os.Bundle getMetadata(android.content.Context,java.lang.Class):0:56 -> a +com.batch.android.core.EASBase64Cryptor -> com.batch.android.e.g: +# {"id":"sourceFile","fileName":"EASBase64Cryptor.java"} + java.lang.String TAG -> d + 1:18:void (java.lang.String):0:17 -> + 1:38:java.lang.String encrypt(java.lang.String):0:37 -> a + 39:66:byte[] encrypt(byte[]):0:27 -> a + 1:58:java.lang.String decrypt(java.lang.String):0:57 -> b + 59:106:byte[] decrypt(byte[]):0:47 -> b + 1:68:byte[] decryptToByte(java.lang.String):0:67 -> c +com.batch.android.core.EASBase64GzipCryptor -> com.batch.android.e.h: +# {"id":"sourceFile","fileName":"EASBase64GzipCryptor.java"} + java.lang.String TAG -> d + 1:23:void (java.lang.String):0:22 -> + 1:71:java.lang.String encrypt(java.lang.String):0:70 -> a + 72:132:byte[] encrypt(byte[]):0:60 -> a + 1:91:java.lang.String decrypt(java.lang.String):0:90 -> b + 92:172:byte[] decrypt(byte[]):0:80 -> b + 1:101:byte[] decryptToByte(java.lang.String):0:100 -> c + 1:8:byte[] gzip(byte[]):29:36 -> e + 9:9:byte[] gzip(byte[]):28:28 -> e + 1:12:byte[] ungzip(byte[]):41:52 -> f + 13:13:byte[] ungzip(byte[]):40:40 -> f +com.batch.android.core.EASCryptor -> com.batch.android.e.i: +# {"id":"sourceFile","fileName":"EASCryptor.java"} + java.lang.String cipherAlgorithm -> a + javax.crypto.spec.SecretKeySpec privateKey -> b + java.lang.String TAG -> c + 1:56:void (java.lang.String):0:55 -> + 57:57:void (java.lang.String):37:37 -> + 58:58:void (java.lang.String):33:33 -> + 1:66:byte[] encrypt(byte[]):0:65 -> a + 67:67:java.lang.String encrypt(java.lang.String):72:72 -> a + 1:81:byte[] decrypt(byte[]):0:80 -> b + 82:82:java.lang.String decrypt(java.lang.String):87:87 -> b + 1:121:byte[] decryptAES(byte[]):0:120 -> c + 122:122:byte[] decryptToByte(java.lang.String):92:92 -> c + 1:108:byte[] encryptAES(byte[]):0:107 -> d +com.batch.android.core.EASHexCryptor -> com.batch.android.e.j: +# {"id":"sourceFile","fileName":"EASHexCryptor.java"} + java.lang.String TAG -> d + 1:16:void (java.lang.String):0:15 -> + 1:36:java.lang.String encrypt(java.lang.String):0:35 -> a + 37:62:byte[] encrypt(byte[]):0:25 -> a + 1:56:java.lang.String decrypt(java.lang.String):0:55 -> b + 57:102:byte[] decrypt(byte[]):0:45 -> b + 1:66:byte[] decryptToByte(java.lang.String):0:65 -> c +com.batch.android.core.ExcludedActivityHelper -> com.batch.android.e.k: +# {"id":"sourceFile","fileName":"ExcludedActivityHelper.java"} + android.content.Intent intent -> a + java.lang.String TAG -> b + java.lang.String EXCLUDED_ACTIVITY_META_DATA -> c + java.util.Map checkedActivities -> d + 1:1:void ():34:34 -> + 1:17:void ():0:16 -> + 1:87:boolean hasIntent():0:86 -> a + 88:106:boolean activityIsExcludedFromManifest(android.app.Activity):59:77 -> a + 1:97:android.content.Intent popIntent():0:96 -> b + 98:144:void saveIntentIfNeeded(android.app.Activity):0:46 -> b +com.batch.android.core.FixedSizeArrayList -> com.batch.android.e.l: +# {"id":"sourceFile","fileName":"FixedSizeArrayList.java"} + int maxSize -> a + 1:27:void (int):0:26 -> + 1:35:boolean add(java.lang.Object):0:34 -> add +com.batch.android.core.ForwardReadableInputStream -> com.batch.android.e.m: +# {"id":"sourceFile","fileName":"ForwardReadableInputStream.java"} + int[] firstBytes -> a + java.io.InputStream wrappedInputStream -> b + int readPosition -> c + int maxReadPosition -> d + 1:27:void (java.io.InputStream,int):0:26 -> + 28:35:void (java.io.InputStream,int):23:30 -> + 1:58:int[] getFirstBytes():0:57 -> a + 1:40:void readFirstBytes(int):0:39 -> c + 41:41:void readFirstBytes(int):37:37 -> c + 1:51:int read():0:50 -> read +com.batch.android.core.GenericHelper -> com.batch.android.e.n: +# {"id":"sourceFile","fileName":"GenericHelper.java"} + 1:19:void ():0:18 -> + 1:154:int DPtoPixel(int,android.content.Context):0:153 -> a + 155:155:int DPtoPixel(int,android.content.Context):144:144 -> a + 156:184:boolean checkPermission(java.lang.String,android.content.Context):0:28 -> a + 185:292:java.lang.Float getScreenDensity(android.content.Context):0:107 -> a + 293:305:java.lang.String readMD5(byte[]):61:73 -> a + 306:315:java.lang.String readMD5(java.lang.String):83:92 -> a + 1:49:boolean isTargetLowerThan13(android.content.Context):0:48 -> b + 50:181:float pixelToDP(int,android.content.Context):0:131 -> b + 182:182:float pixelToDP(int,android.content.Context):122:122 -> b + 1:3:boolean isWakeLockPermissionAvailable(android.content.Context):34:36 -> c +com.batch.android.core.GooglePlayServicesHelper -> com.batch.android.e.o: +# {"id":"sourceFile","fileName":"GooglePlayServicesHelper.java"} + int FCM_ID_VERSION -> a + boolean versionChecked -> b + java.lang.Integer libVersionCached -> c + 1:1:void ():0:0 -> + 1:13:void ():0:12 -> + 1:56:java.lang.String getGooglePlayServicesAvailabilityString(java.lang.Integer):0:55 -> a + 57:63:java.lang.String getGooglePlayServicesAvailabilityString(java.lang.Integer):47:53 -> a + 64:64:java.lang.String getGooglePlayServicesAvailabilityString(java.lang.Integer):45:45 -> a + 65:73:java.lang.String getGooglePlayServicesAvailabilityString(java.lang.Integer):43:51 -> a + 74:83:java.lang.Integer getGooglePlayServicesAvailabilityInteger(android.content.Context):63:72 -> a + 84:101:java.lang.Integer getGooglePlayServicesLibVersion():87:104 -> a + 102:105:java.lang.Integer getGooglePlayServicesLibVersion():101:104 -> a + 106:107:java.lang.Integer getGooglePlayServicesLibVersion():104:105 -> a + 108:108:java.lang.Integer getGooglePlayServicesLibVersion():104:104 -> a + 1:5:java.lang.Integer isFCMAvailable(android.content.Context):115:119 -> b +com.batch.android.core.InternalPushData -> com.batch.android.e.p: +# {"id":"sourceFile","fileName":"InternalPushData.java"} + java.lang.String jsonPayload -> a + com.batch.android.json.JSONObject payload -> b + java.lang.String SCHEME_KEY -> c + java.lang.String ID_KEY -> d + java.lang.String INSTALL_ID_KEY -> e + java.lang.String IS_SILENT_KEY -> f + java.lang.String IS_LOCAL_CAMPAIGNS_REFRESH_KEY -> g + java.lang.String LANDING_KEY -> h + java.lang.String CUSTOM_BIG_ICON_KEY -> i + java.lang.String CUSTOM_BIG_IMAGE_KEY -> j + java.lang.String ACTION_KEY -> k + java.lang.String PRIORITY_KEY -> l + java.lang.String GROUP_NAME_KEY -> m + java.lang.String IS_GROUP_SUMMARY_KEY -> n + java.lang.String OPEN_DATA_KEY -> o + java.lang.String TYPE_KEY -> p + java.lang.String EXPERIMENT_KEY -> q + java.lang.String VARIANT_KEY -> r + java.lang.String CHANNEL_KEY -> s + java.lang.String VISIBILITY_KEY -> t + java.lang.String FORMAT_KEY -> u + java.lang.String FORMAT_ARGS_KEY -> v + java.lang.String RECEIPT_KEY -> w + java.lang.String OLD_BIG_PICTURE_ICON_BEHAVIOUR -> x + java.lang.String BATCH_BUNDLE_KEY -> y + 1:163:void (com.batch.android.json.JSONObject):0:162 -> + 164:164:void (com.batch.android.json.JSONObject):158:158 -> + 165:317:void (java.lang.String):0:152 -> + 318:318:void (java.lang.String):145:145 -> + 1:225:boolean hasScheme():0:224 -> A + 1:488:boolean isGroupSummary():0:487 -> B + 1:218:boolean isLocalCampainsRefresh():0:217 -> C + 1:230:boolean isSchemeEmpty():0:229 -> D + 1:210:boolean isSilent():0:209 -> E + 1:585:boolean shouldUseLegacyBigPictureIconBehaviour():0:584 -> F + 1:380:java.util.List getActions():0:379 -> a + 381:575:com.batch.android.core.InternalPushData getPushDataForFirebaseMessage(com.google.firebase.messaging.RemoteMessage):0:194 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/google/firebase/messaging/RemoteMessage;)Lcom/batch/android/e/p;"} + 576:754:com.batch.android.core.InternalPushData getPushDataForReceiverBundle(android.os.Bundle):0:178 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/os/Bundle;)Lcom/batch/android/e/p;"} + 755:926:com.batch.android.core.InternalPushData getPushDataForReceiverIntent(android.content.Intent):0:171 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Intent;)Lcom/batch/android/e/p;"} + 927:927:com.batch.android.core.InternalPushData getPushDataForReceiverIntent(android.content.Intent):168:168 -> a + 928:1537:com.batch.android.json.JSONArray nullSafeGetJSONArray(java.lang.String):0:609 -> a + 1538:2131:java.lang.String nullSafeGetString(com.batch.android.json.JSONObject,java.lang.String):0:593 -> a + 1:453:java.lang.String getChannel():0:452 -> b + 454:1055:com.batch.android.json.JSONObject nullSafeGetJSONObject(java.lang.String):0:601 -> b + 1:288:java.util.List getCustomBigIconAvailableDensity():0:287 -> c + 289:877:java.lang.String nullSafeGetString(java.lang.String):0:588 -> c + 1:270:java.lang.String getCustomBigIconURL():0:269 -> d + 1:332:java.util.List getCustomBigImageAvailableDensity():0:331 -> e + 1:314:java.lang.String getCustomBigImageURL():0:313 -> f + 1:8:java.util.Map getExtraParameters():529:536 -> g + 1:476:java.lang.String getGroup():0:475 -> h + 1:242:java.lang.String getInstallId():0:241 -> i + 1:203:java.lang.String getJsonPayload():0:202 -> j + 1:250:com.batch.android.json.JSONObject getLandingMessage():0:249 -> k + 1:516:com.batch.android.core.InternalPushData$Format getNotificationFormat():0:515 -> l + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/e/p$b;"} + 1:524:com.batch.android.json.JSONObject getNotificationFormatArguments():0:523 -> m + 1:4:java.util.Map getOpenData():549:552 -> n + 1:439:com.batch.android.core.InternalPushData$Priority getPriority():0:438 -> o + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/e/p$c;"} + 440:440:com.batch.android.core.InternalPushData$Priority getPriority():436:436 -> o + 441:441:com.batch.android.core.InternalPushData$Priority getPriority():434:434 -> o + 442:455:com.batch.android.core.InternalPushData$Priority getPriority():432:445 -> o + 1:238:java.lang.String getPushId():0:237 -> p + 1:7:java.util.Map getReceiptEventData():565:571 -> q + 1:419:long getReceiptMaxDelay():0:418 -> r + 1:410:long getReceiptMinDelay():0:409 -> s + 1:400:com.batch.android.core.InternalPushData$ReceiptMode getReceiptMode():0:399 -> t + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/e/p$d;"} + 401:401:com.batch.android.core.InternalPushData$ReceiptMode getReceiptMode():396:396 -> t + 402:402:com.batch.android.core.InternalPushData$ReceiptMode getReceiptMode():394:394 -> t + 1:234:java.lang.String getScheme():0:233 -> u + 1:466:com.batch.android.BatchNotificationSource getSource():0:465 -> v + 1:500:int getVisibility():0:499 -> w + 1:261:boolean hasCustomBigIcon():0:260 -> x + 1:305:boolean hasCustomBigImage():0:304 -> y + 1:246:boolean hasLandingMessage():0:245 -> z +com.batch.android.core.InternalPushData$1 -> com.batch.android.e.p$a: +# {"id":"sourceFile","fileName":"InternalPushData.java"} + int[] $SwitchMap$com$batch$android$core$InternalPushData$Priority -> a + 1:1:void ():627:627 -> +com.batch.android.core.InternalPushData$Format -> com.batch.android.e.p$b: +# {"id":"sourceFile","fileName":"InternalPushData.java"} + com.batch.android.core.InternalPushData$Format DEFAULT -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/p$b;"} + com.batch.android.core.InternalPushData$Format APEN -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/p$b;"} + com.batch.android.core.InternalPushData$Format[] $VALUES -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/e/p$b;"} + 1:3:void ():645:647 -> + 4:4:void ():644:644 -> + 1:645:void (java.lang.String,int):0:644 -> + 1:645:com.batch.android.core.InternalPushData$Format[] $values():0:644 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/e/p$b;"} + 646:649:com.batch.android.core.InternalPushData$Format fromString(java.lang.String):650:653 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/e/p$b;"} + 1:1:com.batch.android.core.InternalPushData$Format valueOf(java.lang.String):644:644 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/e/p$b;"} + 1:1:com.batch.android.core.InternalPushData$Format[] values():644:644 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/e/p$b;"} +com.batch.android.core.InternalPushData$Priority -> com.batch.android.e.p$c: +# {"id":"sourceFile","fileName":"InternalPushData.java"} + com.batch.android.core.InternalPushData$Priority UNDEFINED -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/p$c;"} + com.batch.android.core.InternalPushData$Priority DEFAULT -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/p$c;"} + com.batch.android.core.InternalPushData$Priority MIN -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/p$c;"} + com.batch.android.core.InternalPushData$Priority LOW -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/p$c;"} + com.batch.android.core.InternalPushData$Priority HIGH -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/p$c;"} + com.batch.android.core.InternalPushData$Priority MAX -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/p$c;"} + com.batch.android.core.InternalPushData$Priority[] $VALUES -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/e/p$c;"} + 1:6:void ():619:624 -> + 7:7:void ():618:618 -> + 1:619:void (java.lang.String,int):0:618 -> + 1:619:com.batch.android.core.InternalPushData$Priority[] $values():0:618 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/e/p$c;"} + 1:1:int toSupportPriority():627:627 -> b + 1:1:com.batch.android.core.InternalPushData$Priority valueOf(java.lang.String):618:618 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/e/p$c;"} + 1:1:com.batch.android.core.InternalPushData$Priority[] values():618:618 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/e/p$c;"} +com.batch.android.core.InternalPushData$ReceiptMode -> com.batch.android.e.p$d: +# {"id":"sourceFile","fileName":"InternalPushData.java"} + com.batch.android.core.InternalPushData$ReceiptMode DEFAULT -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/p$d;"} + com.batch.android.core.InternalPushData$ReceiptMode DISPLAY -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/p$d;"} + com.batch.android.core.InternalPushData$ReceiptMode FORCE -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/p$d;"} + com.batch.android.core.InternalPushData$ReceiptMode[] $VALUES -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/e/p$d;"} + 1:3:void ():658:660 -> + 4:4:void ():657:657 -> + 1:658:void (java.lang.String,int):0:657 -> + 1:658:com.batch.android.core.InternalPushData$ReceiptMode[] $values():0:657 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/e/p$d;"} + 1:1:com.batch.android.core.InternalPushData$ReceiptMode valueOf(java.lang.String):657:657 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/e/p$d;"} + 1:1:com.batch.android.core.InternalPushData$ReceiptMode[] values():657:657 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/e/p$d;"} +com.batch.android.core.KVUserPreferencesStorage -> com.batch.android.e.q: +# {"id":"sourceFile","fileName":"KVUserPreferencesStorage.java"} + android.content.SharedPreferences preferences -> a + boolean useLegacyStorage -> b + java.util.concurrent.ExecutorService executor -> c + java.lang.String TAG -> d + java.lang.String LEGACY_SHARED_PREFERENCES_FILENAME -> e + java.lang.String SHARED_PREFERENCES_FILENAME -> f + int STORAGE_VERSION -> g + 1:60:void (android.content.Context):0:59 -> + 61:72:void (android.content.Context):53:64 -> + 1:129:boolean contains(java.lang.String):0:128 -> a + 130:243:java.lang.String get(java.lang.String,java.lang.String):0:113 -> a + 244:394:android.content.SharedPreferences getPreferences(android.content.Context,java.lang.String):0:150 -> a + 395:621:boolean migrate(android.content.Context):0:226 -> a + 1:98:java.lang.String get(java.lang.String):0:97 -> b + 99:260:java.lang.String getOnLegacyStorage(java.lang.String,java.lang.String):0:161 -> b + 261:458:void migrateIfNeeded(android.content.Context):0:197 -> b + 1:129:java.lang.Boolean lambda$contains$0(java.lang.String):0:128 -> c + 130:213:boolean persist(java.lang.String,java.lang.String):0:83 -> c + 1:172:boolean persistOnLegacyStorage(java.lang.String,java.lang.String):0:171 -> d + 173:310:void remove(java.lang.String):0:137 -> d +com.batch.android.core.Logger -> com.batch.android.e.r: +# {"id":"sourceFile","fileName":"Logger.java"} + java.lang.String PUBLIC_TAG -> a + java.lang.String INTERNAL_TAG -> b + com.batch.android.LoggerDelegate loggerDelegate -> c + com.batch.android.LoggerLevel loggerLevel -> d + boolean dev -> e + 1:6:void ():39:44 -> + 1:16:void ():0:15 -> + 1:303:void error(java.lang.String):0:302 -> a + 304:577:void error(java.lang.String,java.lang.Throwable):0:273 -> a + 578:578:boolean shouldEnableDevLogs():50:50 -> a + 579:579:boolean shouldLogForLevel(com.batch.android.LoggerLevel):56:56 -> a + 580:588:void error(java.lang.String,java.lang.String,java.lang.Throwable):253:261 -> a + 589:597:void error(java.lang.String,java.lang.String):283:291 -> a + 1:179:void info(java.lang.String):0:178 -> b + 180:329:void info(java.lang.String,java.lang.Throwable):0:149 -> b + 330:338:void info(java.lang.String,java.lang.String,java.lang.Throwable):129:137 -> b + 339:347:void info(java.lang.String,java.lang.String):159:167 -> b + 1:365:void internal(java.lang.String):0:364 -> c + 366:701:void internal(java.lang.String,java.lang.Throwable):0:335 -> c + 702:710:void internal(java.lang.String,java.lang.String,java.lang.Throwable):315:323 -> c + 711:719:void internal(java.lang.String,java.lang.String):345:353 -> c + 1:117:void verbose(java.lang.String):0:116 -> d + 118:205:void verbose(java.lang.String,java.lang.Throwable):0:87 -> d + 206:214:void verbose(java.lang.String,java.lang.String,java.lang.Throwable):67:75 -> d + 215:223:void verbose(java.lang.String,java.lang.String):97:105 -> d + 1:241:void warning(java.lang.String):0:240 -> e + 242:453:void warning(java.lang.String,java.lang.Throwable):0:211 -> e + 454:462:void warning(java.lang.String,java.lang.String,java.lang.Throwable):191:199 -> e + 463:471:void warning(java.lang.String,java.lang.String):221:229 -> e +com.batch.android.core.MessagePackWebservice -> com.batch.android.e.s: +# {"id":"sourceFile","fileName":"MessagePackWebservice.java"} + com.batch.android.post.MessagePackPostDataProvider dataProvider -> l + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/s0/e;"} + java.lang.String MSGPACK_SCHEMA_VERSION -> m + 1:26:void (android.content.Context,com.batch.android.post.MessagePackPostDataProvider,java.lang.String,java.lang.String[]):0:25 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/s0/e;Ljava/lang/String;[Ljava/lang/String;)V"} + 27:27:void (android.content.Context,com.batch.android.post.MessagePackPostDataProvider,java.lang.String,java.lang.String[]):23:23 -> + 1:1:java.lang.String getSpecificConnectTimeoutKey():82:82 -> A + 1:1:java.lang.String getSpecificReadTimeoutKey():87:87 -> B + 1:1:java.lang.String getSpecificRetryCountKey():92:92 -> C + 1:1:java.lang.String getURLSorterPatternParameterKey():67:67 -> F + 1:53:com.batch.android.post.MessagePackPostDataProvider getPostDataProvider():0:52 -> G + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/s0/e;"} + 1:39:java.lang.String[] addSchemaVersion(java.lang.String[]):0:38 -> b + 1:1:java.lang.String getCryptorModeParameterKey():77:77 -> o + 1:1:java.lang.String getCryptorTypeParameterKey():72:72 -> p + 1:3:java.util.Map getHeaders():44:46 -> r + 1:1:java.lang.String getPostCryptorTypeParameterKey():57:57 -> v + 1:10:com.batch.android.post.PostDataProvider getPostDataProvider():0:9 -> w + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/s0/h;"} + 1:1:java.lang.String getReadCryptorTypeParameterKey():62:62 -> y +com.batch.android.core.NamedThreadFactory -> com.batch.android.e.t: +# {"id":"sourceFile","fileName":"NamedThreadFactory.java"} + java.lang.String suffix -> a + java.util.concurrent.ThreadFactory defaultFactory -> b + 1:1:void ():13:13 -> + 1:18:void ():0:17 -> + 19:19:void ():15:15 -> + 20:40:void (java.lang.String):0:20 -> + 1:30:java.lang.Thread newThread(java.lang.Runnable):0:29 -> newThread +com.batch.android.core.NotificationAuthorizationStatus -> com.batch.android.e.u: +# {"id":"sourceFile","fileName":"NotificationAuthorizationStatus.java"} + java.lang.String TAG -> a + java.lang.Boolean lastNotificationAuthorizationStatus -> b + 1:1:void ():0:0 -> + 1:31:void ():0:30 -> + 1:202:boolean areBatchNotificationsEnabled(android.content.Context):0:201 -> a + 203:346:boolean canAppShowNotifications(android.content.Context,com.batch.android.BatchNotificationChannelsManager):0:143 -> a + 347:513:boolean canAppShowNotificationsForChannel(android.content.Context,java.lang.String):0:166 -> a + 514:766:boolean canChannelShowNotifications(android.app.NotificationManager,java.lang.String,boolean):0:252 -> a + 767:888:boolean shouldTrackNotificationStatusChangeEvent(android.content.Context,boolean):0:121 -> a + 889:896:void lambda$checkForNotificationAuthorizationChange$0(android.content.Context,com.batch.android.runtime.RuntimeManager):86:93 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/a1/e;)V"} + 897:900:boolean areAppNotificationsEnabled(android.content.Context,android.app.NotificationManager):176:179 -> a + 901:904:boolean isDefaultChannelEnabled(android.app.NotificationManager,com.batch.android.BatchNotificationChannelsManager):212:215 -> a + 905:905:boolean isDefaultChannelEnabled(android.app.NotificationManager,com.batch.android.BatchNotificationChannelsManager):213:213 -> a + 1:48:void checkForNotificationAuthorizationChange(android.content.Context):0:47 -> b + 49:66:void checkForNotificationAuthorizationChange(android.content.Context):45:62 -> b + 67:87:void checkForNotificationAuthorizationChange(android.content.Context):60:80 -> b + 88:106:void checkForNotificationAuthorizationChange(android.content.Context):79:97 -> b +com.batch.android.core.NotificationPermissionHelper -> com.batch.android.e.v: +# {"id":"sourceFile","fileName":"NotificationPermissionHelper.java"} + com.batch.android.BatchPermissionListener listener -> a + java.lang.String TAG -> b + java.lang.String BASE_TARGET_LOG_MESSAGE -> c + java.lang.String PERMISSION_NOTIFICATION -> d + 1:33:void (com.batch.android.BatchPermissionListener):0:32 -> + 1:42:boolean isNotificationPermissionGranted(android.content.Context):0:41 -> a + 43:88:void requestPermission(android.content.Context,boolean,android.content.BroadcastReceiver):56:101 -> a + 1:108:boolean isPermissionAlreadyAskedFromOlderSDK(android.content.Context):0:107 -> b + 1:1:void requestPermissionFromOlderSDK(android.content.Context):119:119 -> c + 2:2:void requestPermissionFromOlderSDK(android.content.Context):118:118 -> c + 1:142:void onReceive(android.content.Context,android.content.Intent):0:141 -> onReceive +com.batch.android.core.PackageUtils -> com.batch.android.e.w: +# {"id":"sourceFile","fileName":"PackageUtils.java"} + 1:10:void ():0:9 -> + 1:18:boolean isPackageInstalled(android.content.pm.PackageManager,java.lang.String):0:17 -> a +com.batch.android.core.ParameterKeys -> com.batch.android.e.x: +# {"id":"sourceFile","fileName":"ParameterKeys.java"} + java.lang.String PUSH_WS_READ_TIMEOUT_KEY -> A + java.lang.String METRIC_WS_RETRYCOUNT_KEY -> A0 + java.lang.String IMAGE_WS_URLSORTER_PATTERN_KEY -> B + java.lang.String LOCAL_CAMPAIGNS_JIT_WS_RETRYCOUNT_KEY -> B0 + java.lang.String IMAGE_WS_CRYPTORTYPE_KEY -> C + java.lang.String LOCAL_CAMPAIGNS_JIT_WS_READ_TIMEOUT_KEY -> C0 + java.lang.String IMAGE_WS_CRYPTORMODE_KEY -> D + java.lang.String LOCAL_CAMPAIGNS_JIT_WS_CONNECT_TIMEOUT_KEY -> D0 + java.lang.String IMAGE_WS_POST_CRYPTORTYPE_KEY -> E + java.lang.String LOCAL_CAMPAIGNS_WS_INITIAL_DELAY -> E0 + java.lang.String IMAGE_WS_READ_CRYPTORTYPE_KEY -> F + java.lang.String WS_CIPHERV2_LAST_FAILURE_KEY -> F0 + java.lang.String IMAGE_WS_RETRYCOUNT_KEY -> G + java.lang.String DEFAULT_RETRY_NUMBER_KEY -> G0 + java.lang.String IMAGE_WS_CONNECT_TIMEOUT_KEY -> H + java.lang.String DEFAULT_CONNECT_TIMEOUT_KEY -> H0 + java.lang.String IMAGE_WS_READ_TIMEOUT_KEY -> I + java.lang.String DEFAULT_READ_TIMEOUT_KEY -> I0 + java.lang.String ATTR_SEND_WS_PROPERTY_KEY -> J + java.lang.String INSTALL_ID_KEY -> J0 + java.lang.String ATTR_SEND_WS_URLSORTER_PATTERN_KEY -> K + java.lang.String INSTALL_TIMESTAMP_KEY -> K0 + java.lang.String ATTR_SEND_WS_CRYPTORTYPE_KEY -> L + java.lang.String TASK_EXECUTOR_MIN_POOL -> L0 + java.lang.String ATTR_SEND_WS_CRYPTORMODE_KEY -> M + java.lang.String TASK_EXECUTOR_MAX_POOL -> M0 + java.lang.String ATTR_SEND_WS_POST_CRYPTORTYPE_KEY -> N + java.lang.String TASK_EXECUTOR_THREADTTL -> N0 + java.lang.String ATTR_SEND_WS_READ_CRYPTORTYPE_KEY -> O + java.lang.String SCHEME_CODE_PATTERN -> O0 + java.lang.String ATTR_SEND_WS_RETRYCOUNT_KEY -> P + java.lang.String CUSTOM_ID -> P0 + java.lang.String ATTR_SEND_WS_CONNECT_TIMEOUT_KEY -> Q + java.lang.String USER_DATA_VERSION -> Q0 + java.lang.String ATTR_SEND_WS_READ_TIMEOUT_KEY -> R + java.lang.String PROJECT_KEY -> R0 + java.lang.String ATTR_CHECK_WS_PROPERTY_KEY -> S + java.lang.String SERVER_TIMESTAMP -> S0 + java.lang.String ATTR_CHECK_WS_URLSORTER_PATTERN_KEY -> T + java.lang.String EVENT_TRACKER_INITIAL_DELAY -> T0 + java.lang.String ATTR_CHECK_WS_CRYPTORTYPE_KEY -> U + java.lang.String EVENT_TRACKER_MAX_DELAY -> U0 + java.lang.String ATTR_CHECK_WS_CRYPTORMODE_KEY -> V + java.lang.String EVENT_TRACKER_BATCH_QUANTITY -> V0 + java.lang.String ATTR_CHECK_WS_POST_CRYPTORTYPE_KEY -> W + java.lang.String EVENT_TRACKER_EVENTS_LIMIT -> W0 + java.lang.String ATTR_CHECK_WS_READ_CRYPTORTYPE_KEY -> X + java.lang.String PUSH_REGISTRATION_ID_KEY -> X0 + java.lang.String ATTR_CHECK_WS_RETRYCOUNT_KEY -> Y + java.lang.String PUSH_REGISTRATION_PROVIDER_KEY -> Y0 + java.lang.String ATTR_CHECK_WS_CONNECT_TIMEOUT_KEY -> Z + java.lang.String PUSH_REGISTRATION_SENDERID_KEY -> Z0 + java.lang.String START_WS_PROPERTY_KEY -> a + java.lang.String ATTR_CHECK_WS_READ_TIMEOUT_KEY -> a0 + java.lang.String PUSH_REGISTRATION_GCPPROJECTID_KEY -> a1 + java.lang.String START_WS_URLSORTER_PATTERN_KEY -> b + java.lang.String ATTR_LOCAL_CAMPAIGNS_WS_PROPERTY_KEY -> b0 + java.lang.String PUSH_APP_VERSION_KEY -> b1 + java.lang.String START_WS_CRYPTORTYPE_KEY -> c + java.lang.String ATTR_LOCAL_CAMPAIGNS_WS_URLSORTER_PATTERN_KEY -> c0 + java.lang.String PUSH_NOTIF_TYPE -> c1 + java.lang.String START_WS_CRYPTORMODE_KEY -> d + java.lang.String ATTR_LOCAL_CAMPAIGNS_WS_CRYPTORTYPE_KEY -> d0 + java.lang.String PUSH_NOTIF_LAST_AUTH_STATUS_SENT -> d1 + java.lang.String START_WS_POST_CRYPTORTYPE_KEY -> e + java.lang.String ATTR_LOCAL_CAMPAIGNS_WS_CRYPTORMODE_KEY -> e0 + java.lang.String USER_DATA_CHANGESET -> e1 + java.lang.String START_WS_READ_CRYPTORTYPE_KEY -> f + java.lang.String ATTR_LOCAL_CAMPAIGNS_WS_POST_CRYPTORTYPE_KEY -> f0 + java.lang.String USER_DATA_TRANSACTION_ID -> f1 + java.lang.String START_WS_RETRYCOUNT_KEY -> g + java.lang.String ATTR_LOCAL_CAMPAIGNS_WS_READ_CRYPTORTYPE_KEY -> g0 + java.lang.String USER_PROFILE_LANGUAGE_KEY -> g1 + java.lang.String START_WS_CONNECT_TIMEOUT_KEY -> h + java.lang.String ATTR_LOCAL_CAMPAIGNS_WS_RETRYCOUNT_KEY -> h0 + java.lang.String USER_PROFILE_REGION_KEY -> h1 + java.lang.String START_WS_READ_TIMEOUT_KEY -> i + java.lang.String ATTR_LOCAL_CAMPAIGNS_WS_CONNECT_TIMEOUT_KEY -> i0 + java.lang.String LIB_CURRENTVERSION_KEY -> i1 + java.lang.String TRACKER_WS_PROPERTY_KEY -> j + java.lang.String ATTR_LOCAL_CAMPAIGNS_WS_READ_TIMEOUT_KEY -> j0 + java.lang.String LIB_PREVIOUSVERSION_KEY -> j1 + java.lang.String TRACKER_WS_URLSORTER_PATTERN_KEY -> k + java.lang.String INBOX_WS_URLSORTER_PATTERN_KEY -> k0 + java.lang.String SHARED_PREFS_STORAGE_VERSION -> k1 + java.lang.String TRACKER_WS_CRYPTORTYPE_KEY -> l + java.lang.String INBOX_WS_READ_CRYPTORTYPE_KEY -> l0 + java.lang.String DATA_COLLECTION_CONFIG_KEY -> l1 + java.lang.String TRACKER_WS_CRYPTORMODE_KEY -> m + java.lang.String INBOX_WS_POST_CRYPTORTYPE_KEY -> m0 + java.lang.String TRACKER_WS_POST_CRYPTORTYPE_KEY -> n + java.lang.String INBOX_WS_RETRYCOUNT_KEY -> n0 + java.lang.String TRACKER_WS_READ_CRYPTORTYPE_KEY -> o + java.lang.String INBOX_WS_CONNECT_TIMEOUT_KEY -> o0 + java.lang.String TRACKER_WS_RETRYCOUNT_KEY -> p + java.lang.String INBOX_WS_READ_TIMEOUT_KEY -> p0 + java.lang.String TRACKER_WS_CONNECT_TIMEOUT_KEY -> q + java.lang.String MESSAGE_PACK_WS_POST_CRYPTORTYPE_KEY -> q0 + java.lang.String TRACKER_WS_READ_TIMEOUT_KEY -> r + java.lang.String MESSAGE_PACK_WS_READ_CRYPTORTYPE_KEY -> r0 + java.lang.String PUSH_WS_PROPERTY_KEY -> s + java.lang.String MESSAGE_PACK_WS_URLSORTER_PATTERN_KEY -> s0 + java.lang.String PUSH_WS_URLSORTER_PATTERN_KEY -> t + java.lang.String MESSAGE_PACK_WS_CRYPTORTYPE_KEY -> t0 + java.lang.String PUSH_WS_CRYPTORTYPE_KEY -> u + java.lang.String MESSAGE_PACK_WS_CRYPTORMODE_KEY -> u0 + java.lang.String PUSH_WS_CRYPTORMODE_KEY -> v + java.lang.String MESSAGE_PACK_WS_RETRYCOUNT_KEY -> v0 + java.lang.String PUSH_WS_POST_CRYPTORTYPE_KEY -> w + java.lang.String MESSAGE_PACK_WS_CONNECT_TIMEOUT_KEY -> w0 + java.lang.String PUSH_WS_READ_CRYPTORTYPE_KEY -> x + java.lang.String MESSAGE_PACK_WS_READ_TIMEOUT_KEY -> x0 + java.lang.String PUSH_WS_RETRYCOUNT_KEY -> y + java.lang.String DISPLAY_RECEIPT_WS_CRYPTORTYPE_KEY -> y0 + java.lang.String PUSH_WS_CONNECT_TIMEOUT_KEY -> z + java.lang.String DISPLAY_RECEIPT_WS_RETRYCOUNT_KEY -> z0 + 1:10:void ():0:9 -> +com.batch.android.core.Parameters -> com.batch.android.e.y: +# {"id":"sourceFile","fileName":"Parameters.java"} + java.lang.String LOCAL_CAMPAIGNS_JIT_WS_URL -> A + java.util.Map appParameters -> B + java.lang.String PARAMETERS_KEY_PREFIX -> C + android.content.Context applicationContext -> a + java.util.Map cacheParameters -> b + java.lang.String COMMON_INTERNAL_CRYPT_BASE_KEY -> c + java.lang.String COMMON_EXTERNAL_CRYPT_SIGNATURE_KEY -> d + java.lang.String COMMON_EXTERNAL_CRYPT_BASE_KEY -> e + java.lang.String COMMON_EXTERNAL_CRYPT_BASE_KEY_V2 -> f + boolean ENABLE_DEV_LOGS -> g + boolean ENABLE_WS_INTERCEPTOR -> h + java.lang.String SDK_VERSION -> i + int API_LEVEL -> j + int MESSAGING_API_LEVEL -> k + java.lang.String LIBRARY_BUNDLE -> l + java.lang.String DOMAIN_URL -> m + java.lang.String PLUGIN_VERSION_ENVIRONEMENT_VAR -> n + java.lang.String BRIDGE_VERSION_ENVIRONEMENT_VAR -> o + java.lang.String BASE_WS_URL -> p + java.lang.String START_WS_URL -> q + java.lang.String TRACKER_WS_URL -> r + java.lang.String PUSH_WS_URL -> s + java.lang.String ATTR_SEND_WS_URL -> t + java.lang.String ATTR_CHECK_WS_URL -> u + java.lang.String LOCAL_CAMPAIGNS_WS_URL -> v + java.lang.String INBOX_FETCH_WS_URL -> w + java.lang.String INBOX_SYNC_WS_URL -> x + java.lang.String DISPLAY_RECEIPT_WS_URL -> y + java.lang.String METRIC_WS_URL -> z + 1:126:void ():62:187 -> + 1:226:void (android.content.Context):0:225 -> + 227:227:void (android.content.Context):218:218 -> + 1:254:java.lang.String get(java.lang.String):0:253 -> a + 255:255:java.lang.String get(java.lang.String):246:246 -> a + 256:256:java.lang.String get(java.lang.String):238:238 -> a + 257:522:java.lang.String get(java.lang.String,java.lang.String):0:265 -> a + 523:816:void set(java.lang.String,java.lang.String,boolean):0:293 -> a + 817:817:void set(java.lang.String,java.lang.String,boolean):290:290 -> a + 818:818:void set(java.lang.String,java.lang.String,boolean):285:285 -> a + 819:819:void set(java.lang.String,java.lang.String,boolean):281:281 -> a + 1:338:void remove(java.lang.String):0:337 -> b + 339:339:void remove(java.lang.String):335:335 -> b + 340:340:void remove(java.lang.String):330:330 -> b + 341:660:void setOrRemove(java.lang.String,java.lang.String,boolean):0:319 -> b + 661:661:void setOrRemove(java.lang.String,java.lang.String,boolean):316:316 -> b + 662:662:void setOrRemove(java.lang.String,java.lang.String,boolean):306:306 -> b +com.batch.android.core.PatternURLSorter -> com.batch.android.e.z: +# {"id":"sourceFile","fileName":"PatternURLSorter.java"} + java.util.List pattern -> a + 1:28:void ():0:27 -> + 29:29:void ():20:20 -> + 30:75:void (java.lang.String):0:45 -> + 76:103:void (java.lang.String):20:47 -> + 104:138:void (java.util.List):0:34 -> + 139:155:void (java.util.List):20:36 -> + 1:61:java.util.List getKeysOrdered(java.util.List):0:60 -> a + 62:142:java.util.List getKeysOrdered(java.util.Map):0:80 -> a + 143:213:java.util.List getKeysOrdered(java.util.Set):0:70 -> a + 214:329:java.util.List order(java.util.Collection):0:115 -> a + 330:330:java.util.List order(java.util.Collection):93:93 -> a +com.batch.android.core.Promise -> com.batch.android.e.a0: +# {"id":"sourceFile","fileName":"Promise.java"} + com.batch.android.core.Promise$Status status -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/a0$e;"} + java.lang.Object resolvedValue -> b + java.lang.Exception rejectException -> c + java.util.ArrayDeque thenQueue -> d + java.util.ArrayDeque catchQueue -> e + 1:22:void ():0:21 -> + 23:28:void ():14:19 -> + 29:65:void (com.batch.android.core.Promise$DeferredResultExecutorRunnable):0:36 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e/a0$c;)V"} + 66:92:void (com.batch.android.core.Promise$DeferredResultExecutorRunnable):14:40 -> + 93:116:void (com.batch.android.core.Promise$ExecutorRunnable):0:23 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e/a0$d;)V"} + 117:136:void (com.batch.android.core.Promise$ExecutorRunnable):14:33 -> + 137:137:void (com.batch.android.core.Promise$ExecutorRunnable):28:28 -> + 1:114:com.batch.android.core.Promise$Status getStatus():0:113 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/e/a0$e;"} + 115:197:void reject(java.lang.Exception):0:82 -> a + 198:265:void resolve(java.lang.Object):0:67 -> a + 266:271:com.batch.android.core.Promise then(com.batch.android.core.Promise$ThenRunnable):87:92 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e/a0$f;)Lcom/batch/android/e/a0;"} + 272:272:com.batch.android.core.Promise then(com.batch.android.core.Promise$ThenRunnable):89:89 -> a + 273:278:com.batch.android.core.Promise catchException(com.batch.android.core.Promise$CatchRunnable):100:105 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e/a0$b;)Lcom/batch/android/e/a0;"} + 279:279:com.batch.android.core.Promise catchException(com.batch.android.core.Promise$CatchRunnable):102:102 -> a + 1:2:com.batch.android.core.Promise resolved(java.lang.Object):45:46 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/Object;)Lcom/batch/android/e/a0;"} + 3:4:com.batch.android.core.Promise rejected(java.lang.Exception):51:52 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/Exception;)Lcom/batch/android/e/a0;"} +com.batch.android.core.Promise$1 -> com.batch.android.e.a0$a: +# {"id":"sourceFile","fileName":"Promise.java"} + int[] $SwitchMap$com$batch$android$core$Promise$Status -> a + 1:1:void ():87:87 -> +com.batch.android.core.Promise$CatchRunnable -> com.batch.android.e.a0$b: +# {"id":"sourceFile","fileName":"Promise.java"} + void run(java.lang.Exception) -> a +com.batch.android.core.Promise$DeferredResultExecutorRunnable -> com.batch.android.e.a0$c: +# {"id":"sourceFile","fileName":"Promise.java"} + void run(com.batch.android.core.Promise) -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e/a0;)V"} +com.batch.android.core.Promise$ExecutorRunnable -> com.batch.android.e.a0$d: +# {"id":"sourceFile","fileName":"Promise.java"} + java.lang.Object run() -> run +com.batch.android.core.Promise$Status -> com.batch.android.e.a0$e: +# {"id":"sourceFile","fileName":"Promise.java"} + com.batch.android.core.Promise$Status PENDING -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/a0$e;"} + com.batch.android.core.Promise$Status RESOLVED -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/a0$e;"} + com.batch.android.core.Promise$Status REJECTED -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/a0$e;"} + com.batch.android.core.Promise$Status[] $VALUES -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/e/a0$e;"} + 1:3:void ():140:142 -> + 4:4:void ():139:139 -> + 1:140:void (java.lang.String,int):0:139 -> + 1:140:com.batch.android.core.Promise$Status[] $values():0:139 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/e/a0$e;"} + 1:1:com.batch.android.core.Promise$Status valueOf(java.lang.String):139:139 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/e/a0$e;"} + 1:1:com.batch.android.core.Promise$Status[] values():139:139 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/e/a0$e;"} +com.batch.android.core.Promise$ThenRunnable -> com.batch.android.e.a0$f: +# {"id":"sourceFile","fileName":"Promise.java"} + void run(java.lang.Object) -> a +com.batch.android.core.PushImageCache -> com.batch.android.e.b0: +# {"id":"sourceFile","fileName":"PushImageCache.java"} + java.lang.String TAG -> a + int MAX_IMAGES_STORED -> b + java.lang.String IMAGES_CACHE_FOLDER -> c + 1:15:void ():0:14 -> + 1:98:java.lang.String buildIdentifierForURL(java.lang.String):0:97 -> a + 99:220:int lambda$clearImagesIfNeeded$0(java.io.File,java.io.File):0:121 -> a + 221:291:void storeImageInCache(android.content.Context,java.lang.String,android.graphics.Bitmap):0:70 -> a + 292:295:void storeImageInCache(android.content.Context,java.lang.String,android.graphics.Bitmap):68:71 -> a + 296:296:java.lang.String getFilePathForIdentifier(android.content.Context,java.lang.String):46:46 -> a + 297:316:void clearImagesIfNeeded(android.content.Context):111:130 -> a + 317:321:void clearImagesIfNeeded(android.content.Context):128:132 -> a + 1:85:android.graphics.Bitmap getImageFromCache(android.content.Context,java.lang.String):0:84 -> b + 86:86:java.lang.String getPushImageCacheFolder(android.content.Context):35:35 -> b +com.batch.android.core.ReflectionHelper -> com.batch.android.e.c0: +# {"id":"sourceFile","fileName":"ReflectionHelper.java"} + 1:20:void ():0:19 -> + 1:48:boolean isInstanceOfCoordinatorLayout(java.lang.Object):0:47 -> a + 49:105:boolean optOutOfSmartReply(androidx.core.app.NotificationCompat$Builder):0:56 -> a + 106:106:boolean isAndroidXAppCompatActivityPresent():34:34 -> a + 107:108:void optOutOfDarkMode(android.view.View):64:65 -> a + 1:1:boolean isAndroidXFragmentPresent():25:25 -> b + 2:16:void optOutOfDarkModeRecursively(android.view.View):70:84 -> b +com.batch.android.core.ResponseHelper -> com.batch.android.e.d0: +# {"id":"sourceFile","fileName":"ResponseHelper.java"} + java.lang.String TAG -> a + 1:10:void ():0:9 -> + 1:28:com.batch.android.json.JSONObject asJson(byte[]):0:27 -> a + 29:29:com.batch.android.json.JSONObject asJson(byte[]):21:21 -> a + 1:47:java.lang.String asString(byte[]):0:46 -> b + 48:48:java.lang.String asString(byte[]):40:40 -> b +com.batch.android.core.SecureDateProvider -> com.batch.android.e.e0: +# {"id":"sourceFile","fileName":"SecureDateProvider.java"} + boolean mSecureDateEnabled -> a + java.util.Date mServerDate -> b + long mElapsedRealtime -> c + 1:40:void ():0:39 -> + 1:81:void initServerDate(java.util.Date):0:80 -> a + 82:82:com.batch.android.date.BatchDate getCurrentDate():101:101 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/h/a;"} + 1:1:boolean canEnableSecureDate():92:92 -> b + 1:55:java.util.Date getDate():0:54 -> c + 56:56:java.util.Date getDate():52:52 -> c + 1:68:boolean isSecureDateAvailable():0:67 -> d +com.batch.android.core.SystemDateProvider -> com.batch.android.e.f0: +# {"id":"sourceFile","fileName":"SystemDateProvider.java"} + 1:7:void ():0:6 -> + 1:1:com.batch.android.date.BatchDate getCurrentDate():10:10 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/h/a;"} +com.batch.android.core.TLSSocketFactory -> com.batch.android.e.g0: +# {"id":"sourceFile","fileName":"TLSSocketFactory.java"} + javax.net.ssl.SSLSocketFactory internalSSLSocketFactory -> a + java.lang.String[] protocols -> b + java.util.List enabledProtocols -> c + 1:4:void ():24:27 -> + 1:40:void ():0:39 -> + 1:86:java.net.Socket enableTLSOnSocket(java.net.Socket):0:85 -> a + 1:55:java.net.Socket createSocket():0:54 -> createSocket + 56:120:java.net.Socket createSocket(java.lang.String,int):0:64 -> createSocket + 121:190:java.net.Socket createSocket(java.lang.String,int,java.net.InetAddress,int):0:69 -> createSocket + 191:265:java.net.Socket createSocket(java.net.InetAddress,int):0:74 -> createSocket + 266:346:java.net.Socket createSocket(java.net.InetAddress,int,java.net.InetAddress,int):0:80 -> createSocket + 347:406:java.net.Socket createSocket(java.net.Socket,java.lang.String,int,boolean):0:59 -> createSocket + 1:45:java.lang.String[] getDefaultCipherSuites():0:44 -> getDefaultCipherSuites + 1:50:java.lang.String[] getSupportedCipherSuites():0:49 -> getSupportedCipherSuites +com.batch.android.core.TaskExecutor -> com.batch.android.e.h0: +# {"id":"sourceFile","fileName":"TaskExecutor.java"} + java.util.Map futures -> a + android.content.Context context -> b + java.lang.String INTENT_WORK_FINISHED -> c + 1:64:void (android.content.Context,int,int,long,java.util.concurrent.TimeUnit,java.util.concurrent.BlockingQueue):0:63 -> + 65:95:void (android.content.Context,int,int,long,java.util.concurrent.TimeUnit,java.util.concurrent.BlockingQueue):38:68 -> + 96:96:void (android.content.Context,int,int,long,java.util.concurrent.TimeUnit,java.util.concurrent.BlockingQueue):65:65 -> + 1:147:boolean isBusy():0:146 -> a + 148:226:com.batch.android.core.TaskExecutor provide(android.content.Context):0:78 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;)Lcom/batch/android/e/h0;"} + 227:362:java.util.concurrent.Future submit(com.batch.android.core.TaskRunnable):0:135 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e/i0;)Ljava/util/concurrent/Future;"} + 363:363:java.util.concurrent.Future submit(com.batch.android.core.TaskRunnable):91:91 -> a + 1:174:void afterExecute(java.lang.Runnable,java.lang.Throwable):0:173 -> afterExecute + 175:182:void afterExecute(java.lang.Runnable,java.lang.Throwable):166:173 -> afterExecute + 183:186:void afterExecute(java.lang.Runnable,java.lang.Throwable):171:174 -> afterExecute + 1:152:void execute(java.lang.Runnable):0:151 -> execute +com.batch.android.core.TaskRunnable -> com.batch.android.e.i0: +# {"id":"sourceFile","fileName":"TaskRunnable.java"} + java.lang.String getTaskIdentifier() -> a +com.batch.android.core.URLBuilder -> com.batch.android.e.j0: +# {"id":"sourceFile","fileName":"URLBuilder.java"} + java.lang.String baseURL -> a + java.util.Map getParameters -> b + com.batch.android.core.URLBuilder$CryptorMode cryptorMode -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/j0$b;"} + java.lang.String TAG -> d + 1:52:void (java.lang.String,com.batch.android.core.URLBuilder$CryptorMode,java.lang.String[]):0:51 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Lcom/batch/android/e/j0$b;[Ljava/lang/String;)V"} + 53:53:void (java.lang.String,com.batch.android.core.URLBuilder$CryptorMode,java.lang.String[]):46:46 -> + 1:149:void addGETParameter(java.lang.String,java.lang.String):0:148 -> a + 150:150:void addGETParameter(java.lang.String,java.lang.String):145:145 -> a + 151:151:void addGETParameter(java.lang.String,java.lang.String):141:141 -> a + 152:437:void addParameter(java.lang.StringBuilder,java.lang.String,java.lang.String):0:285 -> a + 438:610:java.net.URL build():0:172 -> a + 611:806:java.net.URL build(com.batch.android.core.PatternURLSorter,com.batch.android.core.Cryptor):0:195 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e/z;Lcom/batch/android/e/b;)Ljava/net/URL;"} + 807:1081:void buildRawQuery(com.batch.android.core.PatternURLSorter,java.lang.StringBuilder):0:274 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e/z;Ljava/lang/StringBuilder;)V"} + 1082:1376:void cleanURL(java.lang.StringBuilder):0:294 -> a + 1377:1501:java.util.Map parseQuery(java.lang.String):0:124 -> a + 1502:1606:void parseURL(java.lang.String,java.lang.String[]):0:104 -> a + 1607:1608:void parseURL(java.lang.String,java.lang.String[]):91:92 -> a + 1:257:java.lang.String buildQuery(com.batch.android.core.PatternURLSorter,com.batch.android.core.Cryptor):0:256 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e/z;Lcom/batch/android/e/b;)Ljava/lang/String;"} + 258:264:java.lang.String buildQuery(com.batch.android.core.PatternURLSorter,com.batch.android.core.Cryptor):245:251 -> b + 265:271:java.lang.String buildQuery(com.batch.android.core.PatternURLSorter,com.batch.android.core.Cryptor):234:240 -> b + 272:274:java.lang.String buildQuery(com.batch.android.core.PatternURLSorter,com.batch.android.core.Cryptor):227:229 -> b + 275:275:java.lang.String buildQuery(com.batch.android.core.PatternURLSorter,com.batch.android.core.Cryptor):208:208 -> b + 276:437:void removeGETParameter(java.lang.String):0:161 -> b + 438:438:void removeGETParameter(java.lang.String):158:158 -> b +com.batch.android.core.URLBuilder$1 -> com.batch.android.e.j0$a: +# {"id":"sourceFile","fileName":"URLBuilder.java"} + int[] $SwitchMap$com$batch$android$core$URLBuilder$CryptorMode -> a + 1:1:void ():223:223 -> +com.batch.android.core.URLBuilder$CryptorMode -> com.batch.android.e.j0$b: +# {"id":"sourceFile","fileName":"URLBuilder.java"} + int value -> a + com.batch.android.core.URLBuilder$CryptorMode ALL -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/j0$b;"} + com.batch.android.core.URLBuilder$CryptorMode VALUE -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/j0$b;"} + com.batch.android.core.URLBuilder$CryptorMode EACH -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/j0$b;"} + com.batch.android.core.URLBuilder$CryptorMode[] $VALUES -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/e/j0$b;"} + 1:11:void ():307:317 -> + 12:12:void ():303:303 -> + 1:331:void (java.lang.String,int,int):0:330 -> + 1:304:com.batch.android.core.URLBuilder$CryptorMode[] $values():0:303 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/e/j0$b;"} + 305:306:com.batch.android.core.URLBuilder$CryptorMode fromValue(int):349:350 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/e/j0$b;"} + 1:340:int getValue():0:339 -> b + 1:1:com.batch.android.core.URLBuilder$CryptorMode valueOf(java.lang.String):303:303 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/e/j0$b;"} + 1:1:com.batch.android.core.URLBuilder$CryptorMode[] values():303:303 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/e/j0$b;"} +com.batch.android.core.Webservice -> com.batch.android.e.k0: +# {"id":"sourceFile","fileName":"Webservice.java"} + java.lang.String id -> a + com.batch.android.core.URLBuilder builder -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/j0;"} + java.util.Map headers -> c + android.content.Context applicationContext -> d + com.batch.android.core.Webservice$RequestType type -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/k0$c;"} + boolean isDowngradedCipher -> f + com.batch.android.module.OptOutModule optOutModule -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/m0/i;"} + java.lang.String TAG -> h + int WEBSERVICE_ERROR_INVALID_CIPHER -> i + int DEFAULT_RETRY_AFTER -> j + com.batch.android.core.Webservice$Interceptor wsInterceptor -> k + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/k0$b;"} + 1:116:void (android.content.Context,com.batch.android.core.Webservice$RequestType,java.lang.String,java.lang.String[]):0:115 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/e/k0$c;Ljava/lang/String;[Ljava/lang/String;)V"} + 117:146:void (android.content.Context,com.batch.android.core.Webservice$RequestType,java.lang.String,java.lang.String[]):105:134 -> + 147:147:void (android.content.Context,com.batch.android.core.Webservice$RequestType,java.lang.String,java.lang.String[]):125:125 -> + 148:148:void (android.content.Context,com.batch.android.core.Webservice$RequestType,java.lang.String,java.lang.String[]):121:121 -> + 149:149:void (android.content.Context,com.batch.android.core.Webservice$RequestType,java.lang.String,java.lang.String[]):117:117 -> + java.lang.String getSpecificConnectTimeoutKey() -> A + java.lang.String getSpecificReadTimeoutKey() -> B + java.lang.String getSpecificRetryCountKey() -> C + 1:659:com.batch.android.json.JSONObject getStandardResponseBodyIfValid():0:658 -> D + 660:691:com.batch.android.json.JSONObject getStandardResponseBodyIfValid():654:685 -> D + 692:692:com.batch.android.json.JSONObject getStandardResponseBodyIfValid():644:644 -> D + 693:693:com.batch.android.json.JSONObject getStandardResponseBodyIfValid():636:636 -> D + 694:694:com.batch.android.json.JSONObject getStandardResponseBodyIfValid():632:632 -> D + 695:695:com.batch.android.json.JSONObject getStandardResponseBodyIfValid():628:628 -> D + 1:283:com.batch.android.core.PatternURLSorter getURLSorter():0:282 -> E + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/e/z;"} + java.lang.String getURLSorterPatternParameterKey() -> F + 1:190:java.lang.String[] addBatchApiKey(java.lang.String[]):0:189 -> a + 191:366:void addGetParameter(java.lang.String,java.lang.String):0:175 -> a + 367:1294:void addRequestSignatures(java.net.HttpURLConnection,byte[]):0:927 -> a + 1295:2182:byte[] buildPostParameters(com.batch.android.post.PostDataProvider):0:887 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/s0/h;)[B"} + 2183:2939:java.lang.String encode(java.lang.String):0:756 -> a + 2940:3683:com.batch.android.core.Webservice$WebserviceError$Reason getResponseErrorCause(int):0:743 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/e/k0$d$a;"} + 3684:4648:java.lang.String getSignatureBody(java.net.HttpURLConnection,java.util.List):0:964 -> a + 4649:4836:void lambda$addBatchApiKey$0(java.util.concurrent.atomic.AtomicReference,com.batch.android.runtime.Config):0:187 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/util/concurrent/atomic/AtomicReference;Lcom/batch/android/a1/b;)V"} + 4837:5425:void sendRetrySignal(com.batch.android.core.Webservice$WebserviceError):0:588 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e/k0$d;)V"} + 5426:5426:void sendRetrySignal(com.batch.android.core.Webservice$WebserviceError):585:585 -> a + 5427:5451:void sendRetrySignal(com.batch.android.core.Webservice$WebserviceError):575:599 -> a + 5452:5452:void setWsInterceptor(com.batch.android.core.Webservice$Interceptor):0:0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e/k0$b;)V"} + 5453:5453:void onRetry(com.batch.android.core.WebserviceErrorCause):609:609 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e/m0;)V"} + 5454:5457:java.lang.String formatDate(java.util.Date):1204:1207 -> a + 1:232:void addDefaultHeaders():0:231 -> b + 233:233:boolean isResponseValid(int):0:0 -> b + 1:1:void addDefaultParameters():0:0 -> c + 2:2:boolean shouldRetry(int):0:0 -> c + 1:242:void addHeaders():0:241 -> d + 1:156:void addParameters():0:155 -> e + 1:858:java.net.HttpURLConnection buildConnection():0:857 -> f + 859:859:java.net.HttpURLConnection buildConnection():855:855 -> f + 1:871:void buildParameters():0:870 -> g + 1:769:java.net.URL buildURL():0:768 -> h + 1:1:boolean canBypassOptOut():0:0 -> i + 1:896:void enabledDowngradedMode():0:895 -> j + 1:532:byte[] executeRequest():0:531 -> k + 533:558:byte[] executeRequest():506:531 -> k + 559:632:byte[] executeRequest():458:531 -> k + 633:633:byte[] executeRequest():452:452 -> k + 634:718:byte[] executeRequest():447:531 -> k + 719:745:byte[] executeRequest():516:542 -> k + 746:759:byte[] executeRequest():520:533 -> k + 1:701:com.batch.android.json.JSONObject getBasicJsonResponseBody():0:700 -> l + 1:986:int getConnectTimeout():0:985 -> m + 987:987:int getConnectTimeout():984:984 -> m + 1:314:com.batch.android.core.Cryptor getCryptor():0:313 -> n + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/e/b;"} + java.lang.String getCryptorModeParameterKey() -> o + java.lang.String getCryptorTypeParameterKey() -> p + 1:345:com.batch.android.core.URLBuilder$CryptorMode getGetCryptorMode():0:344 -> q + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/e/j0$b;"} + 1:1:java.util.Map getHeaders():0:0 -> r + 1:1:int getMaxRetryCount():0:0 -> s + 1029:1037:int getMaxRetryCount():1028:1036 -> s + 1:1:java.util.Map getParameters():0:0 -> t + 1:374:com.batch.android.core.WebserviceCryptor getPostCryptor():0:373 -> u + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/e/l0;"} + java.lang.String getPostCryptorTypeParameterKey() -> v + com.batch.android.post.PostDataProvider getPostDataProvider() -> w + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/s0/h;"} + 1:403:com.batch.android.core.WebserviceCryptor getReadCryptor():0:402 -> x + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/e/l0;"} + java.lang.String getReadCryptorTypeParameterKey() -> y + 1:1:int getReadTimeout():0:0 -> z + 1004:1012:int getReadTimeout():1003:1011 -> z +com.batch.android.core.Webservice$1 -> com.batch.android.e.k0$a: +# {"id":"sourceFile","fileName":"Webservice.java"} + int[] $SwitchMap$com$batch$android$core$Webservice$WebserviceError$Reason -> a + 1:1:void ():572:572 -> +com.batch.android.core.Webservice$Interceptor -> com.batch.android.e.k0$b: +# {"id":"sourceFile","fileName":"Webservice.java"} + java.net.HttpURLConnection onBuildHttpConnection(java.net.HttpURLConnection) -> a + java.net.URL onBuildURL(java.net.URL) -> a + void onError(java.lang.String,java.net.HttpURLConnection,com.batch.android.core.Webservice$WebserviceError) -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Ljava/net/HttpURLConnection;Lcom/batch/android/e/k0$d;)V"} + void onPreConnect(java.lang.String,java.net.HttpURLConnection,byte[],long) -> a + void onSuccess(java.lang.String,java.net.HttpURLConnection,byte[],long) -> b +com.batch.android.core.Webservice$RequestType -> com.batch.android.e.k0$c: +# {"id":"sourceFile","fileName":"Webservice.java"} + com.batch.android.core.Webservice$RequestType GET -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/k0$c;"} + com.batch.android.core.Webservice$RequestType POST -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/k0$c;"} + com.batch.android.core.Webservice$RequestType[] $VALUES -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/e/k0$c;"} + 1:6:void ():1056:1061 -> + 7:7:void ():1052:1052 -> + 1:1:void (java.lang.String,int):0:0 -> + 1053:1053:void (java.lang.String,int):1052:1052 -> + 1:1:com.batch.android.core.Webservice$RequestType[] $values():0:0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/e/k0$c;"} + 1053:1053:com.batch.android.core.Webservice$RequestType[] $values():1052:1052 -> a + 1:1:com.batch.android.core.Webservice$RequestType valueOf(java.lang.String):1052:1052 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/e/k0$c;"} + 1:1:com.batch.android.core.Webservice$RequestType[] values():1052:1052 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/e/k0$c;"} +com.batch.android.core.Webservice$WebserviceError -> com.batch.android.e.k0$d: +# {"id":"sourceFile","fileName":"Webservice.java"} + com.batch.android.core.Webservice$WebserviceError$Reason reason -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/k0$d$a;"} + int retryAfter -> b + 1:1:void (com.batch.android.core.Webservice$WebserviceError$Reason):0:0 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e/k0$d$a;)V"} + 1108:1108:void (com.batch.android.core.Webservice$WebserviceError$Reason):1107:1107 -> + 1109:1135:void (com.batch.android.core.Webservice$WebserviceError$Reason):1086:1112 -> + 1136:1136:void (com.batch.android.core.Webservice$WebserviceError$Reason):1109:1109 -> + 1137:1137:void (com.batch.android.core.Webservice$WebserviceError$Reason,java.lang.Throwable):0:0 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e/k0$d$a;Ljava/lang/Throwable;)V"} + 2232:2232:void (com.batch.android.core.Webservice$WebserviceError$Reason,java.lang.Throwable):1095:1095 -> + 2233:2247:void (com.batch.android.core.Webservice$WebserviceError$Reason,java.lang.Throwable):1086:1100 -> + 2248:2248:void (com.batch.android.core.Webservice$WebserviceError$Reason,java.lang.Throwable):1097:1097 -> + 1:1:com.batch.android.core.Webservice$WebserviceError$Reason access$000(com.batch.android.core.Webservice$WebserviceError):0:0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e/k0$d;)Lcom/batch/android/e/k0$d$a;"} + 1069:1069:com.batch.android.core.Webservice$WebserviceError$Reason access$000(com.batch.android.core.Webservice$WebserviceError):1068:1068 -> a + 1070:1070:com.batch.android.core.Webservice$WebserviceError$Reason getReason():0:0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/e/k0$d$a;"} + 2193:2193:com.batch.android.core.Webservice$WebserviceError$Reason getReason():1123:1123 -> a + 2194:2194:void setRetryAfter(int):0:0 -> a + 3385:3385:void setRetryAfter(int):1191:1191 -> a + 1:1:int getRetryAfterInMillis():0:0 -> b + 1185:1185:int getRetryAfterInMillis():1184:1184 -> b +com.batch.android.core.Webservice$WebserviceError$Reason -> com.batch.android.e.k0$d$a: +# {"id":"sourceFile","fileName":"Webservice.java"} + com.batch.android.core.Webservice$WebserviceError$Reason NETWORK_ERROR -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/k0$d$a;"} + com.batch.android.core.Webservice$WebserviceError$Reason SERVER_ERROR -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/k0$d$a;"} + com.batch.android.core.Webservice$WebserviceError$Reason TOO_MANY_REQUESTS -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/k0$d$a;"} + com.batch.android.core.Webservice$WebserviceError$Reason NOT_FOUND_ERROR -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/k0$d$a;"} + com.batch.android.core.Webservice$WebserviceError$Reason INVALID_API_KEY -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/k0$d$a;"} + com.batch.android.core.Webservice$WebserviceError$Reason DEACTIVATED_API_KEY -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/k0$d$a;"} + com.batch.android.core.Webservice$WebserviceError$Reason UNEXPECTED_ERROR -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/k0$d$a;"} + com.batch.android.core.Webservice$WebserviceError$Reason FORBIDDEN -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/k0$d$a;"} + com.batch.android.core.Webservice$WebserviceError$Reason SDK_OPTED_OUT -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/k0$d$a;"} + com.batch.android.core.Webservice$WebserviceError$Reason[] $VALUES -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/e/k0$d$a;"} + 1:41:void ():1136:1176 -> + 42:42:void ():1132:1132 -> + 1:1:void (java.lang.String,int):0:0 -> + 1133:1133:void (java.lang.String,int):1132:1132 -> + 1:1:com.batch.android.core.Webservice$WebserviceError$Reason[] $values():0:0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/e/k0$d$a;"} + 1133:1133:com.batch.android.core.Webservice$WebserviceError$Reason[] $values():1132:1132 -> a + 1:1:com.batch.android.core.Webservice$WebserviceError$Reason valueOf(java.lang.String):1132:1132 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/e/k0$d$a;"} + 1:1:com.batch.android.core.Webservice$WebserviceError$Reason[] values():1132:1132 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/e/k0$d$a;"} +com.batch.android.core.WebserviceCryptor -> com.batch.android.e.l0: +# {"id":"sourceFile","fileName":"WebserviceCryptor.java"} + com.batch.android.core.CryptorFactory$CryptorType cryptorType -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/c$b;"} + java.lang.String PRIVATE_KEY_PART -> b + java.lang.String PRIVATE_KEY_PART_V2 -> c + java.lang.String VERSION -> d + 1:41:void (int):0:40 -> + 42:93:void (com.batch.android.core.CryptorFactory$CryptorType):0:51 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e/c$b;)V"} + 94:94:void (com.batch.android.core.CryptorFactory$CryptorType):48:48 -> + 1:79:byte[] decryptData(byte[],com.batch.android.core.Webservice,java.net.HttpURLConnection):0:78 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"([BLcom/batch/android/e/k0;Ljava/net/HttpURLConnection;)[B"} + 80:80:byte[] decryptData(byte[],com.batch.android.core.Webservice,java.net.HttpURLConnection):75:75 -> a + 81:81:byte[] decryptData(byte[],com.batch.android.core.Webservice,java.net.HttpURLConnection):71:71 -> a + 82:82:byte[] decryptData(byte[],com.batch.android.core.Webservice,java.net.HttpURLConnection):66:66 -> a + 83:205:byte[] encryptData(byte[],com.batch.android.core.Webservice):0:122 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"([BLcom/batch/android/e/k0;)[B"} + 206:211:byte[] decryptDataForVersion(java.lang.String,java.lang.String,java.lang.String,com.batch.android.core.Webservice):93:98 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/batch/android/e/k0;)[B"} + 212:215:byte[] buildPrivateKey(com.batch.android.core.Webservice):137:140 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e/k0;)[B"} + 216:216:java.lang.String buildKey(java.lang.String,com.batch.android.core.Webservice):167:167 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Lcom/batch/android/e/k0;)Ljava/lang/String;"} + 217:225:java.lang.String randomChars(int):197:205 -> a + 1:4:byte[] buildPrivateKeyV2(com.batch.android.core.Webservice):153:156 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e/k0;)[B"} + 5:5:java.lang.String buildKeyV2(java.lang.String,com.batch.android.core.Webservice):178:178 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Lcom/batch/android/e/k0;)Ljava/lang/String;"} + 1:1:java.lang.String generatePublicKey(java.lang.String,com.batch.android.core.Webservice):187:187 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Lcom/batch/android/e/k0;)Ljava/lang/String;"} +com.batch.android.core.WebserviceErrorCause -> com.batch.android.e.m0: +# {"id":"sourceFile","fileName":"WebserviceErrorCause.java"} + com.batch.android.core.WebserviceErrorCause PARSING_ERROR -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/m0;"} + com.batch.android.core.WebserviceErrorCause SERVER_ERROR -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/m0;"} + com.batch.android.core.WebserviceErrorCause NETWORK_TIMEOUT -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/m0;"} + com.batch.android.core.WebserviceErrorCause SSL_HANDSHAKE_FAILURE -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/m0;"} + com.batch.android.core.WebserviceErrorCause OTHER -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/m0;"} + com.batch.android.core.WebserviceErrorCause[] $VALUES -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/e/m0;"} + 1:21:void ():11:31 -> + 22:22:void ():7:7 -> + 1:8:void (java.lang.String,int):0:7 -> + 1:8:com.batch.android.core.WebserviceErrorCause[] $values():0:7 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/e/m0;"} + 1:1:com.batch.android.core.WebserviceErrorCause valueOf(java.lang.String):7:7 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/e/m0;"} + 1:1:com.batch.android.core.WebserviceErrorCause[] values():7:7 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/e/m0;"} +com.batch.android.core.WebserviceSignature -> com.batch.android.e.n0: +# {"id":"sourceFile","fileName":"WebserviceSignature.java"} + java.lang.String TAG -> a + java.lang.String PRIVATE_SIGNATURE_KEY_PART -> b + 1:10:void ():0:9 -> + 1:3:java.lang.String encryptSignatureData(java.lang.String):20:22 -> a + 4:11:java.lang.String encryptSignatureData(java.lang.String):21:28 -> a + 12:17:byte[] buildPrivateSignatureKey():42:47 -> a + 18:20:byte[] encryptHMAC(java.security.Key,byte[]):58:60 -> a +com.batch.android.core.stores.GooglePlayStoreApplication -> com.batch.android.f.a: +# {"id":"sourceFile","fileName":"GooglePlayStoreApplication.java"} + 1:11:void ():0:10 -> + 1:22:void open(android.content.Context):0:21 -> a +com.batch.android.core.stores.HuaweiAppGalleryApplication -> com.batch.android.f.b: +# {"id":"sourceFile","fileName":"HuaweiAppGalleryApplication.java"} + 1:11:void ():0:10 -> + 1:22:void open(android.content.Context):0:21 -> a +com.batch.android.core.stores.StoreApplication -> com.batch.android.f.c: +# {"id":"sourceFile","fileName":"StoreApplication.java"} + void open(android.content.Context) -> a +com.batch.android.core.stores.StoreApplicationFactory -> com.batch.android.f.d: +# {"id":"sourceFile","fileName":"StoreApplicationFactory.java"} + 1:11:void ():0:10 -> + 1:21:com.batch.android.core.stores.StoreApplication getMainStore(android.content.Context):0:20 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;)Lcom/batch/android/f/c;"} + 1:31:boolean isHuaweiAppGalleryInstalled(android.content.Context):0:30 -> b + 1:27:boolean isPlayStoreInstalled(android.content.Context):0:26 -> c +com.batch.android.core.systemparameters.SystemParameter -> com.batch.android.g.a: +# {"id":"sourceFile","fileName":"SystemParameter.java"} + com.batch.android.core.systemparameters.SystemParameterShortName shortName -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/g/d;"} + com.batch.android.core.systemparameters.SystemParameter$SystemParameterGetter getter -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/g/a$a;"} + boolean allowed -> c + 1:39:void (com.batch.android.core.systemparameters.SystemParameterShortName,com.batch.android.core.systemparameters.SystemParameter$SystemParameterGetter):0:38 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/g/d;Lcom/batch/android/g/a$a;)V"} + 40:50:void (com.batch.android.core.systemparameters.SystemParameterShortName,com.batch.android.core.systemparameters.SystemParameter$SystemParameterGetter):30:40 -> + 51:108:void (com.batch.android.core.systemparameters.SystemParameterShortName,com.batch.android.core.systemparameters.SystemParameter$SystemParameterGetter,boolean):0:57 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/g/d;Lcom/batch/android/g/a$a;Z)V"} + 1:78:com.batch.android.core.systemparameters.SystemParameterShortName getShortName():0:77 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/g/d;"} + 79:169:void setAllowed(boolean):0:90 -> a + 1:68:java.lang.String getValue():0:67 -> b + 1:87:boolean isAllowed():0:86 -> c +com.batch.android.core.systemparameters.SystemParameter$SystemParameterGetter -> com.batch.android.g.a$a: +# {"id":"sourceFile","fileName":"SystemParameter.java"} + java.lang.String get() -> get +com.batch.android.core.systemparameters.SystemParameterHelper -> com.batch.android.g.b: +# {"id":"sourceFile","fileName":"SystemParameterHelper.java"} + java.lang.String TAG -> a + 1:23:void ():0:22 -> + 1:148:java.lang.String getAppVersion(android.content.Context):0:147 -> a + 149:391:com.batch.android.json.JSONObject serializeSystemParameters(java.util.List):0:242 -> a + 392:392:com.batch.android.json.JSONObject serializeSystemParameters(java.util.List):240:240 -> a + 393:393:java.lang.String getBridgeVersion():188:188 -> a + 1:164:java.lang.Integer getAppVersionCode(android.content.Context):0:163 -> b + 165:170:java.lang.Integer getAppVersionCode(android.content.Context):162:167 -> b + 171:171:java.lang.String getDeviceBrand():117:117 -> b + 1:34:java.lang.String getBundleName(android.content.Context):0:33 -> c + 35:35:java.lang.String getDeviceCountry():64:64 -> c + 1:88:java.lang.Long getFirstInstallDate(android.content.Context):0:87 -> d + 89:89:java.lang.String getDeviceDate():73:73 -> d + 1:105:java.lang.Long getLastUpdateDate(android.content.Context):0:104 -> e + 106:106:java.lang.String getDeviceLanguage():55:55 -> e + 1:1:java.lang.String getDeviceModel():130:130 -> f + 1:1:java.lang.String getDeviceTimezone():43:43 -> g + 1:1:java.lang.String getOSSdkLevel():205:205 -> h + 1:180:java.lang.String getOSVersion():0:179 -> i + 1:1:java.lang.String getPluginVersion():197:197 -> j + 1:1:java.lang.String getSdkApiLevel():213:213 -> k + 1:1:java.lang.String getSdkMessagingApiLevel():221:221 -> l +com.batch.android.core.systemparameters.SystemParameterRegistry -> com.batch.android.g.c: +# {"id":"sourceFile","fileName":"SystemParameterRegistry.java"} + java.util.List parameters -> a + 1:41:void (android.content.Context):0:40 -> + 42:194:void (android.content.Context):29:181 -> + 1:190:java.util.List getParameters():0:189 -> a + 191:408:com.batch.android.core.systemparameters.SystemParameter getSystemParamByShortname(java.lang.String):0:217 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/g/a;"} + 409:409:java.lang.String lambda$new$0(android.content.Context):50:50 -> a + 1:203:java.util.List getWatchedParameters():0:202 -> b + 204:265:java.lang.String lambda$new$1(android.content.Context):0:61 -> b + 1:68:java.lang.String lambda$new$2(android.content.Context):0:67 -> c + 1:104:java.lang.String lambda$new$3(android.content.Context):0:103 -> d + 1:109:java.lang.String lambda$new$4(android.content.Context):0:108 -> e + 1:139:java.lang.String lambda$new$5(android.content.Context):0:138 -> f + 1:147:java.lang.String lambda$new$6(android.content.Context):0:146 -> g + 1:1:com.batch.android.core.systemparameters.SystemParameterRegistry provide(android.content.Context):33:33 -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;)Lcom/batch/android/g/c;"} +com.batch.android.core.systemparameters.SystemParameterShortName -> com.batch.android.g.d: +# {"id":"sourceFile","fileName":"SystemParameterShortName.java"} + java.lang.String shortName -> a + java.lang.String serializedName -> b + com.batch.android.core.systemparameters.SystemParameterShortName APP_BUNDLE_ID -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/g/d;"} + com.batch.android.core.systemparameters.SystemParameterShortName DEVICE_TIMEZONE -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/g/d;"} + com.batch.android.core.systemparameters.SystemParameterShortName FIRST_INSTALL_DATE -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/g/d;"} + com.batch.android.core.systemparameters.SystemParameterShortName LAST_UPDATE_DATE -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/g/d;"} + com.batch.android.core.systemparameters.SystemParameterShortName DEVICE_BRAND -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/g/d;"} + com.batch.android.core.systemparameters.SystemParameterShortName OS_SDK_LEVEL -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/g/d;"} + com.batch.android.core.systemparameters.SystemParameterShortName DEVICE_TYPE -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/g/d;"} + com.batch.android.core.systemparameters.SystemParameterShortName DEVICE_LANGUAGE -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/g/d;"} + com.batch.android.core.systemparameters.SystemParameterShortName DEVICE_REGION -> k + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/g/d;"} + com.batch.android.core.systemparameters.SystemParameterShortName DEVICE_CURRENT_DATE -> l + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/g/d;"} + com.batch.android.core.systemparameters.SystemParameterShortName INSTALL_ID -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/g/d;"} + com.batch.android.core.systemparameters.SystemParameterShortName DEVICE_INSTALL_DATE -> n + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/g/d;"} + com.batch.android.core.systemparameters.SystemParameterShortName SESSION_ID -> o + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/g/d;"} + com.batch.android.core.systemparameters.SystemParameterShortName APPLICATION_VERSION -> p + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/g/d;"} + com.batch.android.core.systemparameters.SystemParameterShortName APPLICATION_CODE -> q + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/g/d;"} + com.batch.android.core.systemparameters.SystemParameterShortName OS_VERSION -> r + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/g/d;"} + com.batch.android.core.systemparameters.SystemParameterShortName SDK_API_LEVEL -> s + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/g/d;"} + com.batch.android.core.systemparameters.SystemParameterShortName SDK_MESSAGING_API_LEVEL -> t + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/g/d;"} + com.batch.android.core.systemparameters.SystemParameterShortName CUSTOM_USER_ID -> u + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/g/d;"} + com.batch.android.core.systemparameters.SystemParameterShortName BRIDGE_VERSION -> v + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/g/d;"} + com.batch.android.core.systemparameters.SystemParameterShortName PLUGIN_VERSION -> w + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/g/d;"} + com.batch.android.core.systemparameters.SystemParameterShortName[] $VALUES -> x + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/g/d;"} + 1:52:void ():8:59 -> + 53:53:void ():7:7 -> + 1:80:void (java.lang.String,int,java.lang.String,java.lang.String):0:79 -> + 1:8:com.batch.android.core.systemparameters.SystemParameterShortName[] $values():0:7 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/g/d;"} + 9:109:com.batch.android.core.systemparameters.SystemParameterShortName fromShortValue(java.lang.String):0:100 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/g/d;"} + 110:110:com.batch.android.core.systemparameters.SystemParameterShortName fromShortValue(java.lang.String):91:91 -> a + 1:1:com.batch.android.core.systemparameters.SystemParameterShortName valueOf(java.lang.String):7:7 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/g/d;"} + 1:1:com.batch.android.core.systemparameters.SystemParameterShortName[] values():7:7 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/g/d;"} +com.batch.android.core.systemparameters.WatchedSystemParameter -> com.batch.android.g.e: +# {"id":"sourceFile","fileName":"WatchedSystemParameter.java"} + java.lang.String lastValue -> d + android.content.Context context -> e + java.lang.String SHARED_PREFERENCES_KEY_PREFIX -> f + 1:1:void ():14:14 -> + 1:42:void (android.content.Context,com.batch.android.core.systemparameters.SystemParameterShortName,com.batch.android.core.systemparameters.SystemParameter$SystemParameterGetter):0:41 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/g/d;Lcom/batch/android/g/a$a;)V"} + 43:102:void (android.content.Context,com.batch.android.core.systemparameters.SystemParameterShortName,com.batch.android.core.systemparameters.SystemParameter$SystemParameterGetter,boolean):0:59 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/g/d;Lcom/batch/android/g/a$a;Z)V"} + 1:100:java.lang.String getLastValue():0:99 -> d + 1:1:java.lang.String getSharedPreferencesKey():108:108 -> e + 1:87:boolean hasChanged():0:86 -> f +com.batch.android.date.BatchDate -> com.batch.android.h.a: +# {"id":"sourceFile","fileName":"BatchDate.java"} + long timestamp -> a + 1:11:void (long):0:10 -> + 1:44:int compareTo(com.batch.android.date.BatchDate):0:43 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/h/a;)I"} + 45:63:long getTime():0:18 -> a + 64:78:void setTime(long):0:14 -> a + 1:6:int compareTo(java.lang.Object):0:5 -> compareTo + 1:33:boolean equals(java.lang.Object):0:32 -> equals + 1:38:int hashCode():0:37 -> hashCode +com.batch.android.date.TimezoneAwareDate -> com.batch.android.h.b: +# {"id":"sourceFile","fileName":"TimezoneAwareDate.java"} + 1:9:void ():0:8 -> + 10:22:void (long):0:12 -> + 1:18:long getTime():0:17 -> a +com.batch.android.date.UTCDate -> com.batch.android.h.c: +# {"id":"sourceFile","fileName":"UTCDate.java"} + 1:7:void ():0:6 -> + 8:18:void (long):0:10 -> +com.batch.android.debug.BatchDebugActivity -> com.batch.android.debug.BatchDebugActivity: +# {"id":"sourceFile","fileName":"BatchDebugActivity.java"} + androidx.fragment.app.Fragment[] fragments -> a + int MAIN_DEBUG_FRAGMENT -> b + int IDENTIFIER_DEBUG_FRAGMENT -> c + int USER_DATA_DEBUG_FRAGMENT -> d + int LOCAL_CAMPAIGNS_DEBUG_FRAGMENT -> e + int LOCAL_CAMPAIGN_DEBUG_FRAGMENT -> f + 1:9:void ():21:29 -> + 1:18:void switchFragment(int,boolean,java.lang.String):32:49 -> a + 19:19:void switchFragment(int,boolean,java.lang.String):45:45 -> a + 20:20:void switchFragment(int,boolean,java.lang.String):42:42 -> a + 21:21:void switchFragment(int,boolean,java.lang.String):39:39 -> a + 22:50:void switchFragment(int,boolean,java.lang.String):36:64 -> a + 51:51:void switchFragment(int,boolean):70:70 -> a + 52:52:void onMenuSelected(int):75:75 -> a + 53:53:void onCampaignMenuSelected(java.lang.String):80:80 -> a + 1:7:void onCreate(android.os.Bundle):85:91 -> onCreate + 1:2:void onDestroy():108:109 -> onDestroy + 1:2:void onStart():96:97 -> onStart + 1:2:void onStop():102:103 -> onStop +com.batch.android.debug.FindMyInstallationHelper -> com.batch.android.i.a: +# {"id":"sourceFile","fileName":"FindMyInstallationHelper.java"} + java.util.List timestamps -> a + java.lang.String TAG -> b + int MIN_FOREGROUND -> c + int MAX_DELAY_BETWEEN_FOREGROUNDS -> d + boolean isEnabled -> e + 1:1:void ():0:0 -> + 1:44:void ():0:43 -> + 1:105:void copyInstallationIDToClipboard(android.content.Context):0:104 -> a + 106:110:void copyInstallationIDToClipboard(android.content.Context):102:106 -> a + 111:119:void notifyForeground():49:57 -> a + 1:5:boolean shouldCopyInstallationID():69:73 -> b +com.batch.android.debug.OnMenuSelectedListener -> com.batch.android.i.b: +# {"id":"sourceFile","fileName":"OnMenuSelectedListener.java"} + void onCampaignMenuSelected(java.lang.String) -> a + void onMenuSelected(int) -> a +com.batch.android.debug.adapter.CollectionAdapter -> com.batch.android.j.a: +# {"id":"sourceFile","fileName":"CollectionAdapter.java"} + android.view.LayoutInflater inflater -> a + android.content.Context context -> b + java.util.List tagCollections -> c + 1:30:void (android.content.Context):0:29 -> + 1:82:void add(java.lang.String,java.util.Set):0:81 -> a + 83:169:void clear():0:86 -> a + 170:209:com.batch.android.debug.adapter.CollectionAdapter$TagCollection getItem(int):0:39 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/j/a$a;"} + 1:35:int getCount():0:34 -> getCount + 1:19:java.lang.Object getItem(int):0:18 -> getItem + 1:1:long getItemId(int):0:0 -> getItemId + 1:65:android.view.View getView(int,android.view.View,android.view.ViewGroup):0:64 -> getView +com.batch.android.debug.adapter.CollectionAdapter$TagCollection -> com.batch.android.j.a$a: +# {"id":"sourceFile","fileName":"CollectionAdapter.java"} + java.lang.String name -> a + android.widget.ArrayAdapter tagAdapter -> b + com.batch.android.debug.adapter.CollectionAdapter this$0 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/j/a;"} + 1:98:void (com.batch.android.debug.adapter.CollectionAdapter,java.lang.String,android.widget.ArrayAdapter):0:97 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/j/a;Ljava/lang/String;Landroid/widget/ArrayAdapter;)V"} + 1:102:java.lang.String getName():0:101 -> a + 1:106:android.widget.ArrayAdapter getTagAdapter():0:105 -> b +com.batch.android.debug.fragment.IdentifierDebugFragment -> com.batch.android.k.a: +# {"id":"sourceFile","fileName":"IdentifierDebugFragment.java"} + android.widget.TextView sdkVersion -> a + android.widget.TextView installId -> b + android.widget.TextView pushToken -> c + 1:18:void ():0:17 -> + 1:7:java.lang.String getShareString():29:35 -> a + 8:8:java.lang.String getShareString():32:32 -> a + 9:23:java.lang.String getShareString():31:45 -> a + 24:24:java.lang.String getShareString():42:42 -> a + 25:38:java.lang.String getShareString():41:54 -> a + 39:39:java.lang.String getShareString():51:51 -> a + 40:40:java.lang.String getShareString():50:50 -> a + 1:1:com.batch.android.debug.fragment.IdentifierDebugFragment newInstance():24:24 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/k/a;"} + 1:91:void onActivityCreated(android.os.Bundle):0:90 -> onActivityCreated + 1:102:void onClick(android.view.View):0:101 -> onClick + 1:76:android.view.View onCreateView(android.view.LayoutInflater,android.view.ViewGroup,android.os.Bundle):0:75 -> onCreateView +com.batch.android.debug.fragment.LocalCampaignDebugFragment -> com.batch.android.k.b: +# {"id":"sourceFile","fileName":"LocalCampaignDebugFragment.java"} + android.widget.TextView token -> a + android.widget.TextView startDate -> b + android.widget.TextView endDate -> c + android.widget.TextView capping -> d + android.widget.TextView gracePeriod -> e + android.widget.TextView trigger -> f + com.batch.android.localcampaigns.CampaignManager campaignManager -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/r/a;"} + java.lang.String CAMPAIGN_TOKEN_KEY -> h + 1:22:void ():0:21 -> + 1:220:void displayCampaign(com.batch.android.localcampaigns.model.LocalCampaign):0:219 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/s/a;)V"} + 221:273:com.batch.android.localcampaigns.model.LocalCampaign getCurrentCampaign():0:52 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/s/a;"} + 274:319:void setCampaignManager(com.batch.android.localcampaigns.CampaignManager):0:45 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/r/a;)V"} + 320:325:com.batch.android.debug.fragment.LocalCampaignDebugFragment newInstance(java.lang.String,com.batch.android.localcampaigns.CampaignManager):35:40 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Lcom/batch/android/r/a;)Lcom/batch/android/k/b;"} + 326:327:java.lang.String formatDate(com.batch.android.date.BatchDate):61:62 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/h/a;)Ljava/lang/String;"} + 1:74:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):0:73 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/s/a;)Ljava/lang/String;"} + 75:75:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):71:71 -> b + 76:89:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):70:83 -> b + 90:90:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):80:80 -> b + 91:106:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):79:94 -> b + 107:107:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):91:91 -> b + 108:121:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):90:103 -> b + 122:122:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):100:100 -> b + 123:138:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):99:114 -> b + 139:139:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):111:111 -> b + 140:153:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):110:123 -> b + 154:154:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):120:120 -> b + 155:170:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):119:134 -> b + 171:171:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):131:131 -> b + 172:186:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):130:144 -> b + 187:187:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):141:141 -> b + 188:203:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):140:155 -> b + 204:204:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):151:151 -> b + 205:225:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):150:170 -> b + 226:226:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):167:167 -> b + 227:240:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):166:179 -> b + 241:241:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):176:176 -> b + 242:242:java.lang.String getShareString(com.batch.android.localcampaigns.model.LocalCampaign):175:175 -> b + 1:249:void onActivityCreated(android.os.Bundle):0:248 -> onActivityCreated + 1:262:void onClick(android.view.View):0:261 -> onClick + 1:239:android.view.View onCreateView(android.view.LayoutInflater,android.view.ViewGroup,android.os.Bundle):0:238 -> onCreateView +com.batch.android.debug.fragment.LocalCampaignsDebugFragment -> com.batch.android.k.c: +# {"id":"sourceFile","fileName":"LocalCampaignsDebugFragment.java"} + android.widget.TextView title -> a + android.widget.ListView campaignList -> b + android.widget.ArrayAdapter campaignAdapter -> c + com.batch.android.debug.OnMenuSelectedListener listener -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/i/b;"} + com.batch.android.localcampaigns.CampaignManager campaignManager -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/r/a;"} + com.batch.android.webservice.listener.LocalCampaignsWebserviceListener webserviceListener -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e1/f;"} + java.lang.String TAG -> g + 1:45:void ():0:44 -> + 1:33:void access$000(com.batch.android.debug.fragment.LocalCampaignsDebugFragment):0:32 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/k/c;)V"} + 34:169:void lambda$onCreateView$0(android.widget.AdapterView,android.view.View,int,long):0:135 -> a + 170:310:void lambda$onCreateView$1(android.view.View):0:140 -> a + 311:422:void loadLocalCampaigns():0:111 -> a + 423:424:com.batch.android.debug.fragment.LocalCampaignsDebugFragment newInstance(com.batch.android.localcampaigns.CampaignManager):67:68 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/r/a;)Lcom/batch/android/k/c;"} + 1:87:void refreshLocalCampaigns():0:86 -> b + 88:161:void setCampaignManager(com.batch.android.localcampaigns.CampaignManager):0:73 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/r/a;)V"} + 1:149:void onActivityCreated(android.os.Bundle):0:148 -> onActivityCreated + 1:121:void onAttach(android.content.Context):0:120 -> onAttach + 1:140:android.view.View onCreateView(android.view.LayoutInflater,android.view.ViewGroup,android.os.Bundle):0:139 -> onCreateView +com.batch.android.debug.fragment.LocalCampaignsDebugFragment$1 -> com.batch.android.k.c$a: +# {"id":"sourceFile","fileName":"LocalCampaignsDebugFragment.java"} + com.batch.android.webservice.listener.LocalCampaignsWebserviceListener sdkImpl -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e1/f;"} + com.batch.android.debug.fragment.LocalCampaignsDebugFragment this$0 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/k/c;"} + 1:46:void (com.batch.android.debug.fragment.LocalCampaignsDebugFragment):0:45 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/k/c;)V"} + 1:62:void lambda$onError$1():0:61 -> a + 63:124:void onError(com.batch.android.FailReason):0:61 -> a + 125:177:void onSuccess(java.util.List):0:52 -> a + 1:53:void lambda$onSuccess$0():0:52 -> b +com.batch.android.debug.fragment.MainDebugFragment -> com.batch.android.k.d: +# {"id":"sourceFile","fileName":"MainDebugFragment.java"} + com.batch.android.debug.OnMenuSelectedListener listener -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/i/b;"} + 1:16:void ():0:15 -> + 1:44:void lambda$onCreateView$0(android.view.View):0:43 -> a + 45:45:com.batch.android.debug.fragment.MainDebugFragment newInstance():20:20 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/k/d;"} + 1:49:void lambda$onCreateView$1(android.view.View):0:48 -> b + 1:54:void lambda$onCreateView$2(android.view.View):0:53 -> c + 1:30:void onAttach(android.content.Context):0:29 -> onAttach + 1:53:android.view.View onCreateView(android.view.LayoutInflater,android.view.ViewGroup,android.os.Bundle):0:52 -> onCreateView +com.batch.android.debug.fragment.UserDataDebugFragment -> com.batch.android.k.e: +# {"id":"sourceFile","fileName":"UserDataDebugFragment.java"} + android.widget.TextView customUserId -> a + android.widget.ListView attributeList -> b + android.widget.ListView collectionList -> c + android.widget.ArrayAdapter attributeAdapter -> d + com.batch.android.debug.adapter.CollectionAdapter collectionAdapter -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/j/a;"} + 1:27:void ():0:26 -> + 1:27:android.widget.ArrayAdapter access$000(com.batch.android.debug.fragment.UserDataDebugFragment):0:26 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/k/e;)Landroid/widget/ArrayAdapter;"} + 28:54:java.lang.String access$100(com.batch.android.debug.fragment.UserDataDebugFragment,com.batch.android.BatchUserAttribute):0:26 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/k/e;Lcom/batch/android/BatchUserAttribute;)Ljava/lang/String;"} + 55:99:java.lang.String formatAttribute(com.batch.android.BatchUserAttribute):0:44 -> a + 100:158:void loadAttributes():0:58 -> a + 159:159:void loadAttributes():57:57 -> a + 1:27:com.batch.android.debug.adapter.CollectionAdapter access$200(com.batch.android.debug.fragment.UserDataDebugFragment):0:26 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/k/e;)Lcom/batch/android/j/a;"} + 28:116:void loadCollections():0:88 -> b + 117:117:void loadCollections():87:87 -> b + 1:1:com.batch.android.debug.fragment.UserDataDebugFragment newInstance():36:36 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/k/e;"} + 1:134:void onActivityCreated(android.os.Bundle):0:133 -> onActivityCreated + 1:118:android.view.View onCreateView(android.view.LayoutInflater,android.view.ViewGroup,android.os.Bundle):0:117 -> onCreateView +com.batch.android.debug.fragment.UserDataDebugFragment$1 -> com.batch.android.k.e$a: +# {"id":"sourceFile","fileName":"UserDataDebugFragment.java"} + com.batch.android.debug.fragment.UserDataDebugFragment this$0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/k/e;"} + 1:60:void (com.batch.android.debug.fragment.UserDataDebugFragment):0:59 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/k/e;)V"} + 1:73:void onError():0:72 -> onError + 1:67:void onSuccess(java.util.Map):0:66 -> onSuccess +com.batch.android.debug.fragment.UserDataDebugFragment$2 -> com.batch.android.k.e$b: +# {"id":"sourceFile","fileName":"UserDataDebugFragment.java"} + com.batch.android.debug.fragment.UserDataDebugFragment this$0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/k/e;"} + 1:90:void (com.batch.android.debug.fragment.UserDataDebugFragment):0:89 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/k/e;)V"} + 1:102:void onError():0:101 -> onError + 1:96:void onSuccess(java.util.Map):0:95 -> onSuccess +com.batch.android.debug.view.NestedListView -> com.batch.android.debug.view.NestedListView: +# {"id":"sourceFile","fileName":"NestedListView.java"} + int listViewTouchAction -> a + android.view.ViewGroup$LayoutParams layoutParams -> b + int MAXIMUM_LIST_ITEMS_VIEWABLE -> c + 1:5:void (android.content.Context,android.util.AttributeSet):19:23 -> + 1:32:void onMeasure(int,int):40:71 -> onMeasure + 1:3:void onScroll(android.widget.AbsListView,int,int,int):28:30 -> onScroll + 1:3:boolean onTouch(android.view.View,android.view.MotionEvent):76:78 -> onTouch +com.batch.android.di.DI -> com.batch.android.l.a: +# {"id":"sourceFile","fileName":"DI.java"} + java.util.Map singletonInstances -> a + java.lang.String TAG -> b + com.batch.android.di.DI instance -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/l/a;"} + 1:31:void ():0:30 -> + 1:62:void addSingletonInstance(java.lang.Class,java.lang.Object):0:61 -> a + 63:97:void clear():0:34 -> a + 98:145:java.lang.Object getSingletonInstance(java.lang.Class):0:47 -> a + 1:4:com.batch.android.di.DI getInstance():15:18 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/l/a;"} + 1:2:void reset():22:23 -> c +com.batch.android.di.providers.ActionModuleProvider -> com.batch.android.m.a: +# {"id":"sourceFile","fileName":"ActionModuleProvider.java"} + 1:12:void ():0:11 -> + 1:6:com.batch.android.module.ActionModule get():14:19 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/a;"} + 1:1:com.batch.android.module.ActionModule getSingleton():25:25 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/a;"} +com.batch.android.di.providers.ActionOutputProvider -> com.batch.android.m.b: +# {"id":"sourceFile","fileName":"ActionOutputProvider.java"} + 1:11:void ():0:10 -> + 1:14:com.batch.android.localcampaigns.output.ActionOutput get(com.batch.android.json.JSONObject):0:13 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/json/JSONObject;)Lcom/batch/android/t/a;"} +com.batch.android.di.providers.BatchModuleMasterProvider -> com.batch.android.m.c: +# {"id":"sourceFile","fileName":"BatchModuleMasterProvider.java"} + 1:12:void ():0:11 -> + 1:6:com.batch.android.module.BatchModuleMaster get():14:19 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/c;"} + 1:1:com.batch.android.module.BatchModuleMaster getSingleton():25:25 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/c;"} +com.batch.android.di.providers.BatchNotificationChannelsManagerProvider -> com.batch.android.m.d: +# {"id":"sourceFile","fileName":"BatchNotificationChannelsManagerProvider.java"} + 1:12:void ():0:11 -> + 1:6:com.batch.android.BatchNotificationChannelsManager get():14:19 -> a + 1:1:com.batch.android.BatchNotificationChannelsManager getSingleton():25:25 -> b +com.batch.android.di.providers.CampaignManagerProvider -> com.batch.android.m.e: +# {"id":"sourceFile","fileName":"CampaignManagerProvider.java"} + 1:12:void ():0:11 -> + 1:6:com.batch.android.localcampaigns.CampaignManager get():14:19 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/r/a;"} + 1:1:com.batch.android.localcampaigns.CampaignManager getSingleton():25:25 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/r/a;"} +com.batch.android.di.providers.DataCollectionModuleProvider -> com.batch.android.m.f: +# {"id":"sourceFile","fileName":"DataCollectionModuleProvider.java"} + 1:12:void ():0:11 -> + 1:6:com.batch.android.module.DataCollectionModule get():14:19 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/d;"} + 1:1:com.batch.android.module.DataCollectionModule getSingleton():25:25 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/d;"} +com.batch.android.di.providers.DisplayReceiptModuleProvider -> com.batch.android.m.g: +# {"id":"sourceFile","fileName":"DisplayReceiptModuleProvider.java"} + 1:12:void ():0:11 -> + 1:6:com.batch.android.module.DisplayReceiptModule get():14:19 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/e;"} + 1:1:com.batch.android.module.DisplayReceiptModule getSingleton():25:25 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/e;"} +com.batch.android.di.providers.EmbeddedBannerContainerProvider -> com.batch.android.m.h: +# {"id":"sourceFile","fileName":"EmbeddedBannerContainerProvider.java"} + 1:14:void ():0:13 -> + 1:19:com.batch.android.messaging.view.formats.EmbeddedBannerContainer get(android.view.View,com.batch.android.BatchMessage,com.batch.android.messaging.model.BannerMessage,com.batch.android.MessagingAnalyticsDelegate,boolean):0:18 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/view/View;Lcom/batch/android/BatchMessage;Lcom/batch/android/d0/c;Lcom/batch/android/h;Z)Lcom/batch/android/f0/b;"} +com.batch.android.di.providers.EventDispatcherModuleProvider -> com.batch.android.m.i: +# {"id":"sourceFile","fileName":"EventDispatcherModuleProvider.java"} + 1:12:void ():0:11 -> + 1:6:com.batch.android.module.EventDispatcherModule get():14:19 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/f;"} + 1:1:com.batch.android.module.EventDispatcherModule getSingleton():25:25 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/f;"} +com.batch.android.di.providers.InboxDatasourceProvider -> com.batch.android.m.j: +# {"id":"sourceFile","fileName":"InboxDatasourceProvider.java"} + 1:13:void ():0:12 -> + 1:6:com.batch.android.inbox.InboxDatasource get(android.content.Context):15:20 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;)Lcom/batch/android/q/d;"} + 7:7:com.batch.android.inbox.InboxDatasource getSingleton():26:26 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q/d;"} +com.batch.android.di.providers.InboxFetcherInternalProvider -> com.batch.android.m.k: +# {"id":"sourceFile","fileName":"InboxFetcherInternalProvider.java"} + 1:12:void ():0:11 -> + 1:15:com.batch.android.inbox.InboxFetcherInternal get(android.content.Context,java.lang.String):0:14 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Ljava/lang/String;)Lcom/batch/android/q/f;"} + 16:42:com.batch.android.inbox.InboxFetcherInternal get(android.content.Context,java.lang.String,java.lang.String):0:26 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)Lcom/batch/android/q/f;"} + 43:75:com.batch.android.inbox.InboxFetcherInternal get(android.content.Context,java.lang.String,java.lang.String,boolean):0:32 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Z)Lcom/batch/android/q/f;"} + 76:96:com.batch.android.inbox.InboxFetcherInternal get(android.content.Context,java.lang.String,boolean):0:20 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Ljava/lang/String;Z)Lcom/batch/android/q/f;"} +com.batch.android.di.providers.KVUserPreferencesStorageProvider -> com.batch.android.m.l: +# {"id":"sourceFile","fileName":"KVUserPreferencesStorageProvider.java"} + 1:13:void ():0:12 -> + 1:6:com.batch.android.core.KVUserPreferencesStorage get(android.content.Context):15:20 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;)Lcom/batch/android/e/q;"} + 7:7:com.batch.android.core.KVUserPreferencesStorage getSingleton():26:26 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/e/q;"} +com.batch.android.di.providers.LandingOutputProvider -> com.batch.android.m.m: +# {"id":"sourceFile","fileName":"LandingOutputProvider.java"} + 1:11:void ():0:10 -> + 1:14:com.batch.android.localcampaigns.output.LandingOutput get(com.batch.android.json.JSONObject):0:13 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/json/JSONObject;)Lcom/batch/android/t/b;"} +com.batch.android.di.providers.LocalBroadcastManagerProvider -> com.batch.android.m.n: +# {"id":"sourceFile","fileName":"LocalBroadcastManagerProvider.java"} + 1:13:void ():0:12 -> + 1:6:com.batch.android.compat.LocalBroadcastManager get(android.content.Context):15:20 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;)Lcom/batch/android/d/a;"} + 7:7:com.batch.android.compat.LocalBroadcastManager getSingleton():26:26 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/d/a;"} +com.batch.android.di.providers.LocalCampaignsModuleProvider -> com.batch.android.m.o: +# {"id":"sourceFile","fileName":"LocalCampaignsModuleProvider.java"} + 1:12:void ():0:11 -> + 1:6:com.batch.android.module.LocalCampaignsModule get():14:19 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/g;"} + 1:1:com.batch.android.module.LocalCampaignsModule getSingleton():25:25 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/g;"} +com.batch.android.di.providers.LocalCampaignsWebserviceListenerImplProvider -> com.batch.android.m.p: +# {"id":"sourceFile","fileName":"LocalCampaignsWebserviceListenerImplProvider.java"} + 1:10:void ():0:9 -> + 1:1:com.batch.android.webservice.listener.impl.LocalCampaignsWebserviceListenerImpl get():12:12 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/f1/c;"} +com.batch.android.di.providers.MessagingAnalyticsDelegateProvider -> com.batch.android.m.q: +# {"id":"sourceFile","fileName":"MessagingAnalyticsDelegateProvider.java"} + 1:12:void ():0:11 -> + 1:15:com.batch.android.MessagingAnalyticsDelegate get(com.batch.android.messaging.model.Message,com.batch.android.BatchMessage):0:14 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/g;Lcom/batch/android/BatchMessage;)Lcom/batch/android/h;"} +com.batch.android.di.providers.MessagingModuleProvider -> com.batch.android.m.r: +# {"id":"sourceFile","fileName":"MessagingModuleProvider.java"} + 1:12:void ():0:11 -> + 1:6:com.batch.android.module.MessagingModule get():14:19 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/h;"} + 1:1:com.batch.android.module.MessagingModule getSingleton():25:25 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/h;"} +com.batch.android.di.providers.MetricManagerProvider -> com.batch.android.m.s: +# {"id":"sourceFile","fileName":"MetricManagerProvider.java"} + 1:12:void ():0:11 -> + 1:6:com.batch.android.metrics.MetricManager get():14:19 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/k0/a;"} + 1:1:com.batch.android.metrics.MetricManager getSingleton():25:25 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/k0/a;"} +com.batch.android.di.providers.OptOutModuleProvider -> com.batch.android.m.t: +# {"id":"sourceFile","fileName":"OptOutModuleProvider.java"} + 1:12:void ():0:11 -> + 1:6:com.batch.android.module.OptOutModule get():14:19 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/i;"} + 1:1:com.batch.android.module.OptOutModule getSingleton():25:25 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/i;"} +com.batch.android.di.providers.ParametersProvider -> com.batch.android.m.u: +# {"id":"sourceFile","fileName":"ParametersProvider.java"} + 1:13:void ():0:12 -> + 1:6:com.batch.android.core.Parameters get(android.content.Context):15:20 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;)Lcom/batch/android/e/y;"} + 7:7:com.batch.android.core.Parameters getSingleton():26:26 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/e/y;"} +com.batch.android.di.providers.ProfileModuleProvider -> com.batch.android.m.v: +# {"id":"sourceFile","fileName":"ProfileModuleProvider.java"} + 1:12:void ():0:11 -> + 1:6:com.batch.android.module.ProfileModule get():14:19 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/j;"} + 1:1:com.batch.android.module.ProfileModule getSingleton():25:25 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/j;"} +com.batch.android.di.providers.PushModuleProvider -> com.batch.android.m.w: +# {"id":"sourceFile","fileName":"PushModuleProvider.java"} + 1:12:void ():0:11 -> + 1:6:com.batch.android.module.PushModule get():14:19 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/k;"} + 1:1:com.batch.android.module.PushModule getSingleton():25:25 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/k;"} +com.batch.android.di.providers.RuntimeManagerProvider -> com.batch.android.m.x: +# {"id":"sourceFile","fileName":"RuntimeManagerProvider.java"} + 1:12:void ():0:11 -> + 1:6:com.batch.android.runtime.RuntimeManager get():14:19 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/a1/e;"} + 1:1:com.batch.android.runtime.RuntimeManager getSingleton():25:25 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/a1/e;"} +com.batch.android.di.providers.SQLUserDatasourceProvider -> com.batch.android.m.y: +# {"id":"sourceFile","fileName":"SQLUserDatasourceProvider.java"} + 1:13:void ():0:12 -> + 1:6:com.batch.android.user.SQLUserDatasource get(android.content.Context):15:20 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;)Lcom/batch/android/c1/c;"} + 7:7:com.batch.android.user.SQLUserDatasource getSingleton():26:26 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/c1/c;"} +com.batch.android.di.providers.SecureDateProviderProvider -> com.batch.android.m.z: +# {"id":"sourceFile","fileName":"SecureDateProviderProvider.java"} + 1:12:void ():0:11 -> + 1:6:com.batch.android.core.SecureDateProvider get():14:19 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/e/e0;"} + 1:1:com.batch.android.core.SecureDateProvider getSingleton():25:25 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/e/e0;"} +com.batch.android.di.providers.SystemParameterRegistryProvider -> com.batch.android.m.a0: +# {"id":"sourceFile","fileName":"SystemParameterRegistryProvider.java"} + 1:11:void ():0:10 -> + 1:14:com.batch.android.core.systemparameters.SystemParameterRegistry get(android.content.Context):0:13 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;)Lcom/batch/android/g/c;"} +com.batch.android.di.providers.TaskExecutorProvider -> com.batch.android.m.b0: +# {"id":"sourceFile","fileName":"TaskExecutorProvider.java"} + 1:13:void ():0:12 -> + 1:6:com.batch.android.core.TaskExecutor get(android.content.Context):15:20 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;)Lcom/batch/android/e/h0;"} + 7:7:com.batch.android.core.TaskExecutor getSingleton():26:26 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/e/h0;"} +com.batch.android.di.providers.TrackerModuleProvider -> com.batch.android.m.c0: +# {"id":"sourceFile","fileName":"TrackerModuleProvider.java"} + 1:12:void ():0:11 -> + 1:6:com.batch.android.module.TrackerModule get():14:19 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/l;"} + 1:1:com.batch.android.module.TrackerModule getSingleton():25:25 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/l;"} +com.batch.android.di.providers.UserModuleProvider -> com.batch.android.m.d0: +# {"id":"sourceFile","fileName":"UserModuleProvider.java"} + 1:12:void ():0:11 -> + 1:6:com.batch.android.module.UserModule get():14:19 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/m;"} + 1:1:com.batch.android.module.UserModule getSingleton():25:25 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/m;"} +com.batch.android.displayreceipt.CacheHelper -> com.batch.android.n.a: +# {"id":"sourceFile","fileName":"CacheHelper.java"} + java.lang.String TAG -> a + java.lang.String CACHE_DIR -> b + java.lang.String CACHE_FILE_FORMAT -> c + int MAX_READ_RECEIPT_FROM_CACHE -> d + long MAX_AGE_FROM_CACHE -> e + 1:22:void ():0:21 -> + 1:135:boolean deleteDirectory(java.io.File):0:134 -> a + 136:336:java.util.List filterCachedFiles(java.io.File[]):0:200 -> a + 337:507:java.util.List getCachedFiles(android.content.Context,boolean):0:170 -> a + 508:566:java.lang.Long getTimestampFromFilename(java.lang.String):0:58 -> a + 567:763:int lambda$filterCachedFiles$0(java.util.Map$Entry,java.util.Map$Entry):0:196 -> a + 764:857:java.io.File write(android.content.Context,long,byte[]):0:93 -> a + 858:959:boolean write(java.io.File,byte[]):0:101 -> a + 960:961:java.lang.String generateNewFilename(long):48:49 -> a + 962:963:boolean deleteAll(android.content.Context):144:145 -> a + 1:69:byte[] read(java.io.File):0:68 -> b + 70:72:java.io.File getCacheDir(android.content.Context):38:40 -> b + 73:79:boolean writeData(java.io.File,byte[]):105:111 -> b + 80:83:boolean writeData(java.io.File,byte[]):105:108 -> b + 1:79:byte[] readFileBytes(java.io.File):0:78 -> c + 80:83:byte[] readFileBytes(java.io.File):76:79 -> c +com.batch.android.displayreceipt.DisplayReceipt -> com.batch.android.n.b: +# {"id":"sourceFile","fileName":"DisplayReceipt.java"} + long timestamp -> a + boolean replay -> b + int sendAttempt -> c + java.util.Map od -> d + java.util.Map ed -> e + java.lang.String TAG -> f + 1:34:void (long,boolean,int,java.util.Map,java.util.Map):0:33 -> + 1:50:java.util.Map getEd():0:49 -> a + 51:149:void pack(com.batch.android.msgpack.core.MessageBufferPacker,long,boolean,int,java.util.Map,java.util.Map):0:98 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o0/b;JZILjava/util/Map;Ljava/util/Map;)V"} + 150:216:byte[] packAndWrite(java.io.File):0:66 -> a + 217:254:void setReplay(boolean):0:37 -> a + 255:405:com.batch.android.displayreceipt.DisplayReceipt unpack(byte[]):0:150 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"([B)Lcom/batch/android/n/b;"} + 406:407:com.batch.android.displayreceipt.DisplayReceipt unpack(byte[]):120:120 -> a + 438:438:com.batch.android.displayreceipt.DisplayReceipt unpack(byte[]):151:151 -> a + 439:512:void writeTo(com.batch.android.msgpack.core.MessageBufferPacker):0:73 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o0/b;)V"} + 513:517:byte[] pack(long,boolean,int,java.util.Map,java.util.Map):108:112 -> a + 518:519:byte[] pack(long,boolean,int,java.util.Map,java.util.Map):108:108 -> a + 524:524:byte[] pack(long,boolean,int,java.util.Map,java.util.Map):113:113 -> a + 1:46:java.util.Map getOd():0:45 -> b + 1:62:int getSendAttempt():0:61 -> c + 1:54:long getTimestamp():0:53 -> d + 1:42:void incrementSendAttempt():0:41 -> e + 1:58:boolean isReplay():0:57 -> f +com.batch.android.event.CollapsibleEvent -> com.batch.android.o.a: +# {"id":"sourceFile","fileName":"CollapsibleEvent.java"} + 1:16:void (android.content.Context,long,java.lang.String,com.batch.android.json.JSONObject):0:15 -> + 17:46:void (java.lang.String,java.lang.String,java.util.Date,java.util.TimeZone,java.lang.String,com.batch.android.event.Event$State,java.lang.Long,java.util.Date,java.lang.String):0:29 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Ljava/lang/String;Ljava/util/Date;Ljava/util/TimeZone;Ljava/lang/String;Lcom/batch/android/o/b$a;Ljava/lang/Long;Ljava/util/Date;Ljava/lang/String;)V"} +com.batch.android.event.Event -> com.batch.android.o.b: +# {"id":"sourceFile","fileName":"Event.java"} + java.lang.String id -> a + java.lang.String name -> b + java.util.Date date -> c + java.util.TimeZone timezone -> d + long servertime -> e + java.util.Date secureDate -> f + java.lang.String parameters -> g + com.batch.android.event.Event$State state -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o/b$a;"} + java.lang.String session -> i + 1:107:void (android.content.Context,long,java.lang.String,com.batch.android.json.JSONObject):0:106 -> + 108:113:void (android.content.Context,long,java.lang.String,com.batch.android.json.JSONObject):104:109 -> + 114:114:void (android.content.Context,long,java.lang.String,com.batch.android.json.JSONObject):74:74 -> + 115:257:void (java.lang.String,java.lang.String,java.util.Date,java.util.TimeZone,java.lang.String,com.batch.android.event.Event$State,java.lang.Long,java.util.Date,java.lang.String):0:142 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Ljava/lang/String;Ljava/util/Date;Ljava/util/TimeZone;Ljava/lang/String;Lcom/batch/android/o/b$a;Ljava/lang/Long;Ljava/util/Date;Ljava/lang/String;)V"} + 1:157:java.util.Date getDate():0:156 -> a + 1:149:java.lang.String getId():0:148 -> b + 1:153:java.lang.String getName():0:152 -> c + 1:169:java.lang.String getParameters():0:168 -> d + 1:161:java.util.Date getSecureDate():0:160 -> e + 1:177:long getServerTimestamp():0:176 -> f + 1:185:java.lang.String getSessionID():0:184 -> g + 1:173:com.batch.android.event.Event$State getState():0:172 -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/o/b$a;"} + 1:165:java.util.TimeZone getTimezone():0:164 -> i + 1:181:boolean isOld():0:180 -> j +com.batch.android.event.Event$State -> com.batch.android.o.b$a: +# {"id":"sourceFile","fileName":"Event.java"} + int value -> a + com.batch.android.event.Event$State NEW -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o/b$a;"} + com.batch.android.event.Event$State SENDING -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o/b$a;"} + com.batch.android.event.Event$State OLD -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o/b$a;"} + com.batch.android.event.Event$State[] $VALUES -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/o/b$a;"} + 1:11:void ():197:207 -> + 12:12:void ():193:193 -> + 1:215:void (java.lang.String,int,int):0:214 -> + 1:194:com.batch.android.event.Event$State[] $values():0:193 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/o/b$a;"} + 195:196:com.batch.android.event.Event$State fromValue(int):224:225 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/o/b$a;"} + 1:219:int getValue():0:218 -> b + 1:1:com.batch.android.event.Event$State valueOf(java.lang.String):193:193 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/o/b$a;"} + 1:1:com.batch.android.event.Event$State[] values():193:193 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/o/b$a;"} +com.batch.android.event.EventAttributesSerializer -> com.batch.android.o.c: +# {"id":"sourceFile","fileName":"EventAttributesSerializer.java"} + 1:13:void ():0:12 -> + 1:21:com.batch.android.json.JSONObject serialize(com.batch.android.BatchEventAttributes):0:20 -> a + 22:80:com.batch.android.json.JSONArray serializeList(java.util.List):0:58 -> a + 1:48:com.batch.android.json.JSONObject serializeObject(com.batch.android.BatchEventAttributes):0:47 -> b + 49:49:com.batch.android.json.JSONObject serializeObject(com.batch.android.BatchEventAttributes):44:44 -> b + 50:50:com.batch.android.json.JSONObject serializeObject(com.batch.android.BatchEventAttributes):41:41 -> b + 51:51:com.batch.android.json.JSONObject serializeObject(com.batch.android.BatchEventAttributes):38:38 -> b + 52:52:com.batch.android.json.JSONObject serializeObject(com.batch.android.BatchEventAttributes):35:35 -> b +com.batch.android.event.EventAttributesSerializer$1 -> com.batch.android.o.c$a: +# {"id":"sourceFile","fileName":"EventAttributesSerializer.java"} + int[] $SwitchMap$com$batch$android$user$AttributeType -> a + 1:1:void ():33:33 -> +com.batch.android.event.EventAttributesValidator -> com.batch.android.o.d: +# {"id":"sourceFile","fileName":"EventAttributesValidator.java"} + int LABEL_MAX_LENGTH -> a + int TAG_MAX_LENGTH -> b + int TAGS_MAX_COUNT -> c + int ATTRIBUTES_MAX_COUNT -> d + int URL_MAX_LENGTH -> e + int STRING_MAX_LENGTH -> f + int ARRAY_ITEMS_MAX_COUNT -> g + java.util.regex.Pattern attributeNameRegexp -> h + 1:1:void ():81:81 -> + 1:17:void ():0:16 -> + 1:92:java.util.List computeValidationErrors(com.batch.android.BatchEventAttributes):0:91 -> a + 93:456:void mergeError(com.batch.android.event.EventAttributesValidator$ValidationError,java.util.List):0:363 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o/d$c;Ljava/util/List;)V"} + 457:825:void mergeErrors(java.util.List,java.util.List):0:368 -> a + 826:1072:com.batch.android.event.EventAttributesValidator$ValidationError visitAttributeArrayValueBase(java.util.List,com.batch.android.event.EventAttributesValidator$Breadcrumbs):0:246 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/util/List;Lcom/batch/android/o/d$b;)Lcom/batch/android/o/d$c;"} + 1073:1226:com.batch.android.event.EventAttributesValidator$ValidationError visitAttributeName(java.lang.String,com.batch.android.event.EventAttributesValidator$Breadcrumbs):0:153 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Lcom/batch/android/o/d$b;)Lcom/batch/android/o/d$c;"} + 1227:1528:com.batch.android.event.EventAttributesValidator$ValidationError visitAttributeURLValue(java.net.URI,com.batch.android.event.EventAttributesValidator$Breadcrumbs):0:301 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/net/URI;Lcom/batch/android/o/d$b;)Lcom/batch/android/o/d$c;"} + 1529:1639:java.util.List visitObject(com.batch.android.BatchEventAttributes,com.batch.android.event.EventAttributesValidator$Breadcrumbs):0:110 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/BatchEventAttributes;Lcom/batch/android/o/d$b;)Ljava/util/List;"} + 1640:1673:java.util.List visitObject(com.batch.android.BatchEventAttributes,com.batch.android.event.EventAttributesValidator$Breadcrumbs):109:142 -> a + 1674:2031:void wrapAndMergeErrorMessages(java.util.List,com.batch.android.event.EventAttributesValidator$Breadcrumbs,java.util.List):0:357 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/util/List;Lcom/batch/android/o/d$b;Ljava/util/List;)V"} + 2032:2032:boolean isEventNameValid(java.lang.String):84:84 -> a + 2033:2103:java.util.List visitAttributeValue(com.batch.android.event.EventTypedAttribute,com.batch.android.event.EventAttributesValidator$Breadcrumbs):163:233 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o/f;Lcom/batch/android/o/d$b;)Ljava/util/List;"} + 2104:2129:java.util.List visitAttributeValue(com.batch.android.event.EventTypedAttribute,com.batch.android.event.EventAttributesValidator$Breadcrumbs):201:226 -> a + 2130:2131:java.util.List visitAttributeValue(com.batch.android.event.EventTypedAttribute,com.batch.android.event.EventAttributesValidator$Breadcrumbs):195:196 -> a + 2132:2133:java.util.List visitAttributeValue(com.batch.android.event.EventTypedAttribute,com.batch.android.event.EventAttributesValidator$Breadcrumbs):190:191 -> a + 2134:2135:java.util.List visitAttributeValue(com.batch.android.event.EventTypedAttribute,com.batch.android.event.EventAttributesValidator$Breadcrumbs):185:186 -> a + 2136:2139:java.util.List visitAttributeValue(com.batch.android.event.EventTypedAttribute,com.batch.android.event.EventAttributesValidator$Breadcrumbs):177:180 -> a + 2140:2143:java.util.List visitAttributeValue(com.batch.android.event.EventTypedAttribute,com.batch.android.event.EventAttributesValidator$Breadcrumbs):170:173 -> a + 1:289:com.batch.android.event.EventAttributesValidator$ValidationError visitAttributeStringValue(java.lang.String,com.batch.android.event.EventAttributesValidator$Breadcrumbs):0:288 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Lcom/batch/android/o/d$b;)Lcom/batch/android/o/d$c;"} + 290:608:java.util.List visitLabel(java.lang.String):0:318 -> b + 609:613:java.util.List visitAttributeObjectArrayValue(java.util.List,com.batch.android.event.EventAttributesValidator$Breadcrumbs):268:272 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/util/List;Lcom/batch/android/o/d$b;)Ljava/util/List;"} + 1:347:java.lang.String visitTag(java.lang.String):0:346 -> c + 348:352:java.util.List visitAttributeStringArrayValue(java.util.List,com.batch.android.event.EventAttributesValidator$Breadcrumbs):255:259 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/util/List;Lcom/batch/android/o/d$b;)Ljava/util/List;"} + 1:333:java.util.List visitTags(java.util.List,com.batch.android.event.EventAttributesValidator$Breadcrumbs):0:332 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/util/List;Lcom/batch/android/o/d$b;)Ljava/util/List;"} +com.batch.android.event.EventAttributesValidator$1 -> com.batch.android.o.d$a: +# {"id":"sourceFile","fileName":"EventAttributesValidator.java"} + int[] $SwitchMap$com$batch$android$user$AttributeType -> a + 1:1:void ():168:168 -> +com.batch.android.event.EventAttributesValidator$Breadcrumbs -> com.batch.android.o.d$b: +# {"id":"sourceFile","fileName":"EventAttributesValidator.java"} + java.util.List items -> a + 1:51:void (java.util.List):0:50 -> + 1:67:int getDepth():0:66 -> a + 68:70:com.batch.android.event.EventAttributesValidator$Breadcrumbs appending(java.lang.String):54:56 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/o/d$b;"} + 71:73:com.batch.android.event.EventAttributesValidator$Breadcrumbs appending(int):60:62 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/o/d$b;"} + 1:71:java.util.List getItems():0:70 -> b +com.batch.android.event.EventAttributesValidator$ValidationError -> com.batch.android.o.d$c: +# {"id":"sourceFile","fileName":"EventAttributesValidator.java"} + java.lang.String message -> a + com.batch.android.event.EventAttributesValidator$Breadcrumbs breadcrumbs -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o/d$b;"} + 1:29:void (java.lang.String,com.batch.android.event.EventAttributesValidator$Breadcrumbs):0:28 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Lcom/batch/android/o/d$b;)V"} + 1:37:java.lang.String render():0:36 -> a +com.batch.android.event.EventSender -> com.batch.android.o.e: +# {"id":"sourceFile","fileName":"EventSender.java"} + com.batch.android.runtime.RuntimeManager runtimeManager -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/a1/e;"} + com.batch.android.event.EventSender$EventSenderListener listener -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o/e$b;"} + java.util.concurrent.atomic.AtomicBoolean isSending -> c + java.util.concurrent.atomic.AtomicBoolean hasNewEvents -> d + java.util.concurrent.ExecutorService sendExecutor -> e + com.batch.android.event.RetryTimer retryTimer -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o/h;"} + java.lang.String TAG -> g + 1:55:void (com.batch.android.runtime.RuntimeManager,com.batch.android.event.EventSender$EventSenderListener):0:54 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/a1/e;Lcom/batch/android/o/e$b;)V"} + 56:86:void (com.batch.android.runtime.RuntimeManager,com.batch.android.event.EventSender$EventSenderListener):35:65 -> + 87:87:void (com.batch.android.runtime.RuntimeManager,com.batch.android.event.EventSender$EventSenderListener):60:60 -> + 88:88:void (com.batch.android.runtime.RuntimeManager,com.batch.android.event.EventSender$EventSenderListener):56:56 -> + 1:21:com.batch.android.event.RetryTimer access$000(com.batch.android.event.EventSender):0:20 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o/e;)Lcom/batch/android/o/h;"} + 22:196:com.batch.android.core.TaskRunnable getWebserviceTask(java.util.List,com.batch.android.webservice.listener.TrackerWebserviceListener):0:174 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/util/List;Lcom/batch/android/e1/j;)Lcom/batch/android/e/i0;"} + 197:360:void retry():0:163 -> a + 361:451:void send(boolean):0:90 -> a + 1:21:java.util.concurrent.atomic.AtomicBoolean access$100(com.batch.android.event.EventSender):0:20 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o/e;)Ljava/util/concurrent/atomic/AtomicBoolean;"} + 22:177:void hasNewEvents():0:155 -> b + 1:21:com.batch.android.event.EventSender$EventSenderListener access$200(com.batch.android.event.EventSender):0:20 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o/e;)Lcom/batch/android/o/e$b;"} + 22:166:void lambda$send$0():0:144 -> c + 1:94:void lambda$send$1():0:93 -> d + 1:73:void send():0:72 -> e +com.batch.android.event.EventSender$1 -> com.batch.android.o.e$a: +# {"id":"sourceFile","fileName":"EventSender.java"} + com.batch.android.event.EventSender this$0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o/e;"} + 1:111:void (com.batch.android.event.EventSender):0:110 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o/e;)V"} + 1:133:void lambda$onFailure$1(java.util.List,com.batch.android.runtime.State):0:132 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/util/List;Lcom/batch/android/a1/g;)V"} + 134:264:void onFailure(com.batch.android.FailReason,java.util.List):0:130 -> a + 265:405:void onFinish():0:140 -> a + 406:523:void onSuccess(java.util.List):0:117 -> a + 1:120:void lambda$onSuccess$0(java.util.List,com.batch.android.runtime.State):0:119 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/util/List;Lcom/batch/android/a1/g;)V"} +com.batch.android.event.EventSender$EventSenderListener -> com.batch.android.o.e$b: +# {"id":"sourceFile","fileName":"EventSender.java"} + java.util.List getEventsToSend() -> a + void onEventsSendFailure(java.util.List) -> a + void onEventsSendSuccess(java.util.List) -> b +com.batch.android.event.EventTypedAttribute -> com.batch.android.o.f: +# {"id":"sourceFile","fileName":"EventTypedAttribute.java"} + java.lang.Object value -> a + com.batch.android.user.AttributeType type -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/c1/a;"} + 1:13:void (java.lang.Object,com.batch.android.user.AttributeType):0:12 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/Object;Lcom/batch/android/c1/a;)V"} +com.batch.android.event.InternalEvents -> com.batch.android.o.g: +# {"id":"sourceFile","fileName":"InternalEvents.java"} + java.lang.String START -> a + java.lang.String STOP -> b + java.lang.String OPEN_FROM_PUSH -> c + java.lang.String MESSAGING -> d + java.lang.String LOCAL_CAMPAIGN_VIEWED -> e + java.lang.String NATIVE_DATA_CHANGED -> f + java.lang.String INSTALL_DATA_CHANGED -> g + java.lang.String PROFILE_DATA_CHANGED -> h + java.lang.String INSTALL_DATA_CHANGED_TRACK_FAILURE -> i + java.lang.String LOCATION_CHANGED -> j + java.lang.String NOTIFICATION_STATUS_CHANGE -> k + java.lang.String INBOX_MARK_AS_READ -> l + java.lang.String INBOX_MARK_AS_DELETED -> m + java.lang.String INBOX_MARK_ALL_AS_READ -> n + java.lang.String OPT_IN -> o + java.lang.String OPT_OUT -> p + java.lang.String OPT_OUT_AND_WIPE_DATA -> q + java.lang.String PROFILE_IDENTIFY -> r + java.lang.String FIND_MY_INSTALLATION -> s + 1:9:void ():0:8 -> +com.batch.android.event.RetryTimer -> com.batch.android.o.h: +# {"id":"sourceFile","fileName":"RetryTimer.java"} + int retries -> a + int initialRetryDelay -> b + int maxRetryDelay -> c + int nextRetryDelay -> d + java.util.Timer retryTimer -> e + java.util.TimerTask retryTask -> f + com.batch.android.event.RetryTimer$RetryTimerListener listener -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o/h$b;"} + java.lang.String TAG -> h + int MAX_RETRIES -> i + 1:57:void (android.content.Context,com.batch.android.event.RetryTimer$RetryTimerListener):0:56 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/o/h$b;)V"} + 58:104:void (android.content.Context,com.batch.android.event.RetryTimer$RetryTimerListener):24:70 -> + 105:105:void (android.content.Context,com.batch.android.event.RetryTimer$RetryTimerListener):62:62 -> + 106:106:void (android.content.Context,com.batch.android.event.RetryTimer$RetryTimerListener):58:58 -> + 1:14:int access$008(com.batch.android.event.RetryTimer):0:13 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o/h;)I"} + 15:148:void incrementDelay():0:133 -> a + 1:14:com.batch.android.event.RetryTimer$RetryTimerListener access$100(com.batch.android.event.RetryTimer):0:13 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o/h;)Lcom/batch/android/o/h$b;"} + 15:94:boolean isWaiting():0:79 -> b + 1:105:void reschedule():0:104 -> c + 1:120:void reset():0:119 -> d +com.batch.android.event.RetryTimer$1 -> com.batch.android.o.h$a: +# {"id":"sourceFile","fileName":"RetryTimer.java"} + com.batch.android.event.RetryTimer this$0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o/h;"} + 1:93:void (com.batch.android.event.RetryTimer):0:92 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o/h;)V"} + 1:97:void run():0:96 -> run +com.batch.android.event.RetryTimer$RetryTimerListener -> com.batch.android.o.h$b: +# {"id":"sourceFile","fileName":"RetryTimer.java"} + void retry() -> a +com.batch.android.eventdispatcher.DispatcherDiscoveryService -> com.batch.android.eventdispatcher.DispatcherDiscoveryService: +# {"id":"sourceFile","fileName":"DispatcherDiscoveryService.java"} + 1:1:void ():11:11 -> +com.batch.android.eventdispatcher.DispatcherRegistrar -> com.batch.android.eventdispatcher.DispatcherRegistrar: +# {"id":"sourceFile","fileName":"DispatcherRegistrar.java"} + com.batch.android.BatchEventDispatcher getDispatcher(android.content.Context) -> a +com.batch.android.eventdispatcher.DispatcherSerializer -> com.batch.android.p.a: +# {"id":"sourceFile","fileName":"DispatcherSerializer.java"} + java.lang.String FIREBASE_DISPATCHER_NAME -> a + java.lang.String AT_INTERNET_DISPATCHER_NAME -> b + java.lang.String MIXPANEL_DISPATCHER_NAME -> c + java.lang.String GOOGLE_ANALYTICS_DISPATCHER_NAME -> d + java.lang.String BATCH_PLUGINS_DISPATCHER_NAME -> e + java.lang.String BATCH_PIANO_NAME -> f + java.lang.String CUSTOM_DISPATCHER_NAME -> g + java.util.List knownDispatchers -> h + 1:29:void ():0:28 -> + 1:15:void ():0:14 -> + 1:55:com.batch.android.json.JSONObject serialize(java.util.Set):0:54 -> a +com.batch.android.eventdispatcher.MessagingEventPayload -> com.batch.android.p.b: +# {"id":"sourceFile","fileName":"MessagingEventPayload.java"} + com.batch.android.BatchMessage message -> a + com.batch.android.json.JSONObject payload -> b + com.batch.android.json.JSONObject customPayload -> c + com.batch.android.messaging.model.Action action -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/d0/a;"} + java.lang.String buttonAnalyticsId -> e + 1:27:void (com.batch.android.BatchMessage,com.batch.android.json.JSONObject,com.batch.android.json.JSONObject):0:26 -> + 28:72:void (com.batch.android.BatchMessage,com.batch.android.json.JSONObject,com.batch.android.json.JSONObject,com.batch.android.messaging.model.Action):0:44 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/BatchMessage;Lcom/batch/android/json/JSONObject;Lcom/batch/android/json/JSONObject;Lcom/batch/android/d0/a;)V"} + 73:113:void (com.batch.android.BatchMessage,com.batch.android.json.JSONObject,com.batch.android.json.JSONObject,com.batch.android.messaging.model.Action,java.lang.String):0:40 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/BatchMessage;Lcom/batch/android/json/JSONObject;Lcom/batch/android/json/JSONObject;Lcom/batch/android/d0/a;Ljava/lang/String;)V"} + 1:88:java.lang.String getCustomValue(java.lang.String):0:87 -> getCustomValue + 1:67:java.lang.String getDeeplink():0:66 -> getDeeplink + 1:94:com.batch.android.BatchMessage getMessagingPayload():0:93 -> getMessagingPayload + 1:1:com.batch.android.BatchPushPayload getPushPayload():0:0 -> getPushPayload + 1:52:java.lang.String getTrackingId():0:51 -> getTrackingId + 1:60:java.lang.String getWebViewAnalyticsID():0:59 -> getWebViewAnalyticsID + 1:74:boolean isPositiveAction():0:73 -> isPositiveAction +com.batch.android.eventdispatcher.PushEventPayload -> com.batch.android.p.c: +# {"id":"sourceFile","fileName":"PushEventPayload.java"} + com.batch.android.BatchPushPayload payload -> a + boolean isOpening -> b + 1:21:void (com.batch.android.BatchPushPayload):0:20 -> + 22:47:void (com.batch.android.BatchPushPayload,boolean):0:25 -> + 1:5:java.lang.String getCustomValue(java.lang.String):55:59 -> getCustomValue + 1:45:java.lang.String getDeeplink():0:44 -> getDeeplink + 1:1:com.batch.android.BatchMessage getMessagingPayload():0:0 -> getMessagingPayload + 1:72:com.batch.android.BatchPushPayload getPushPayload():0:71 -> getPushPayload + 1:1:java.lang.String getTrackingId():0:0 -> getTrackingId + 1:1:java.lang.String getWebViewAnalyticsID():0:0 -> getWebViewAnalyticsID + 1:50:boolean isPositiveAction():0:49 -> isPositiveAction +com.batch.android.inbox.FetcherType -> com.batch.android.q.a: +# {"id":"sourceFile","fileName":"FetcherType.java"} + int value -> a + com.batch.android.inbox.FetcherType INSTALLATION -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q/a;"} + com.batch.android.inbox.FetcherType USER_IDENTIFIER -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q/a;"} + com.batch.android.inbox.FetcherType[] $VALUES -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/q/a;"} + 1:2:void ():4:5 -> + 3:3:void () -> + 1:11:void (java.lang.String,int,int):0:10 -> + 1:4:com.batch.android.inbox.FetcherType[] $values():0:3 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/q/a;"} + 1:15:int getValue():0:14 -> b + 1:6:java.lang.String toWSPathElement():18:23 -> c + 1:1:com.batch.android.inbox.FetcherType valueOf(java.lang.String):3:3 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/q/a;"} + 1:1:com.batch.android.inbox.FetcherType[] values():3:3 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/q/a;"} +com.batch.android.inbox.FetcherType$1 -> com.batch.android.q.a$a: +# {"id":"sourceFile","fileName":"FetcherType.java"} + int[] $SwitchMap$com$batch$android$inbox$FetcherType -> a + 1:1:void ():18:18 -> +com.batch.android.inbox.InboxCandidateNotificationInternal -> com.batch.android.q.b: +# {"id":"sourceFile","fileName":"InboxCandidateNotificationInternal.java"} + java.lang.String identifier -> a + boolean isUnread -> b + 1:17:void (java.lang.String,boolean):0:16 -> +com.batch.android.inbox.InboxDatabaseHelper -> com.batch.android.q.c: +# {"id":"sourceFile","fileName":"InboxDatabaseHelper.java"} + java.lang.String COLUMN_DB_ID -> a + java.lang.String TABLE_FETCHERS -> b + java.lang.String COLUMN_FETCHER_TYPE -> c + java.lang.String COLUMN_FETCHER_IDENTIFIER -> d + java.lang.String TABLE_FETCHERS_NOTIFICATIONS -> e + java.lang.String COLUMN_FETCHER_ID -> f + java.lang.String COLUMN_INSTALL_ID -> g + java.lang.String COLUMN_CUSTOM_ID -> h + java.lang.String TABLE_NOTIFICATIONS -> i + java.lang.String COLUMN_NOTIFICATION_ID -> j + java.lang.String COLUMN_SEND_ID -> k + java.lang.String COLUMN_TITLE -> l + java.lang.String COLUMN_BODY -> m + java.lang.String COLUMN_UNREAD -> n + java.lang.String COLUMN_DELETED -> o + java.lang.String COLUMN_DATE -> p + java.lang.String COLUMN_PAYLOAD -> q + java.lang.String DATABASE_NAME -> r + int DATABASE_VERSION -> s + 1:42:void (android.content.Context):0:41 -> + 1:97:void onCreate(android.database.sqlite.SQLiteDatabase):0:96 -> onCreate + 1:136:void onUpgrade(android.database.sqlite.SQLiteDatabase,int,int):0:135 -> onUpgrade +com.batch.android.inbox.InboxDatasource -> com.batch.android.q.d: +# {"id":"sourceFile","fileName":"InboxDatasource.java"} + android.database.sqlite.SQLiteDatabase database -> a + com.batch.android.inbox.InboxDatabaseHelper databaseHelper -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q/c;"} + java.lang.String TAG -> c + 1:51:void (android.content.Context):0:50 -> + 52:52:void (android.content.Context):47:47 -> + 1:635:boolean cleanDatabase():0:634 -> a + 636:656:boolean cleanDatabase():630:650 -> a + 657:658:boolean cleanDatabase():629:629 -> a + 680:680:boolean cleanDatabase():651:651 -> a + 681:1421:java.lang.String createInClause(int):0:740 -> a + 1422:2024:boolean deleteNotifications(java.util.List):0:602 -> a + 2025:2033:boolean deleteNotifications(java.util.List):600:608 -> a + 2034:2045:boolean deleteNotifications(java.util.List):606:617 -> a + 2046:2049:boolean deleteNotifications(java.util.List):614:617 -> a + 2050:2051:boolean deleteNotifications(java.util.List):617:618 -> a + 2052:2337:java.util.List getCandidateNotifications(java.lang.String,int,long):0:285 -> a + 2338:2347:java.util.List getCandidateNotifications(java.lang.String,int,long):283:292 -> a + 2348:2349:java.util.List getCandidateNotifications(java.lang.String,int,long):282:282 -> a + 2360:2400:java.util.List getCandidateNotifications(java.lang.String,int,long):293:333 -> a + 2401:2402:java.util.List getCandidateNotifications(java.lang.String,int,long):328:328 -> a + 2408:2408:java.util.List getCandidateNotifications(java.lang.String,int,long):334:334 -> a + 2409:2620:long getFetcherID(com.batch.android.inbox.FetcherType,java.lang.String):0:211 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q/a;Ljava/lang/String;)J"} + 2621:2638:long getFetcherID(com.batch.android.inbox.FetcherType,java.lang.String):204:221 -> a + 2639:2645:long getFetcherID(com.batch.android.inbox.FetcherType,java.lang.String):221:227 -> a + 2646:2647:long getFetcherID(com.batch.android.inbox.FetcherType,java.lang.String):203:203 -> a + 2666:2666:long getFetcherID(com.batch.android.inbox.FetcherType,java.lang.String):222:222 -> a + 2667:2831:long getNotificationTime(java.lang.String):0:164 -> a + 2832:2832:long getNotificationTime(java.lang.String):164:164 -> a + 2833:2834:long getNotificationTime(java.lang.String):149:149 -> a + 2850:2850:long getNotificationTime(java.lang.String):165:165 -> a + 2851:2992:java.util.List getNotifications(java.util.List,long):0:141 -> a + 2993:2994:java.util.List getNotifications(java.util.List,long):134:134 -> a + 3002:3002:java.util.List getNotifications(java.util.List,long):142:142 -> a + 3003:3417:boolean insert(com.batch.android.inbox.InboxNotificationContentInternal,long):0:414 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q/g;J)Z"} + 3418:3427:boolean insert(com.batch.android.inbox.InboxNotificationContentInternal,long):411:420 -> a + 3428:3428:boolean insert(com.batch.android.inbox.InboxNotificationContentInternal,long):373:373 -> a + 3429:3782:boolean insertResponse(com.batch.android.inbox.InboxWebserviceResponse,long):0:353 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q/i;J)Z"} + 3783:4332:int markAllAsRead(long,long):0:549 -> a + 4333:4333:int markAllAsRead(long,long):529:529 -> a + 4334:5054:com.batch.android.inbox.InboxCandidateNotificationInternal parseCandidateNotification(android.database.Cursor):0:720 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/database/Cursor;)Lcom/batch/android/q/b;"} + 5055:5496:java.lang.String updateNotification(com.batch.android.json.JSONObject,long):0:441 -> a + 5497:5503:java.lang.String updateNotification(com.batch.android.json.JSONObject,long):441:441 -> a + 5535:5536:java.lang.String updateNotification(com.batch.android.json.JSONObject,long):473:474 -> a + 5537:5538:java.lang.String updateNotification(com.batch.android.json.JSONObject,long):469:470 -> a + 5539:5540:java.lang.String updateNotification(com.batch.android.json.JSONObject,long):465:466 -> a + 5541:5542:java.lang.String updateNotification(com.batch.android.json.JSONObject,long):461:462 -> a + 5543:5546:java.lang.String updateNotification(com.batch.android.json.JSONObject,long):455:458 -> a + 5547:5548:java.lang.String updateNotification(com.batch.android.json.JSONObject,long):451:452 -> a + 5549:5550:java.lang.String updateNotification(com.batch.android.json.JSONObject,long):447:448 -> a + 5551:5610:java.lang.String updateNotification(com.batch.android.json.JSONObject,long):443:502 -> a + 5611:5624:java.lang.String updateNotification(com.batch.android.json.JSONObject,long):495:508 -> a + 5625:5630:java.lang.String updateNotification(com.batch.android.json.JSONObject,long):508:513 -> a + 1:78:void close():0:77 -> b + 79:656:void markNotificationAsDeleted(java.lang.String):0:577 -> b + 657:697:com.batch.android.inbox.InboxNotificationContentInternal parseNotification(android.database.Cursor):664:704 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/database/Cursor;)Lcom/batch/android/q/g;"} + 1:88:android.database.sqlite.SQLiteDatabase getDatabase():0:87 -> c + 89:650:void markNotificationAsRead(java.lang.String):0:561 -> c + 1:55:void open():0:54 -> d + 1:69:void wipeData():0:68 -> e +com.batch.android.inbox.InboxFetchWebserviceClient -> com.batch.android.q.e: +# {"id":"sourceFile","fileName":"InboxFetchWebserviceClient.java"} + long fetcherId -> o + java.lang.String authentication -> p + com.batch.android.webservice.listener.InboxWebserviceListener listener -> q + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e1/d;"} + java.lang.String TAG -> r + 1:63:void (android.content.Context,com.batch.android.inbox.FetcherType,java.lang.String,java.lang.String,java.lang.Integer,java.lang.String,long,com.batch.android.webservice.listener.InboxWebserviceListener):0:62 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/q/a;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;JLcom/batch/android/e1/d;)V"} + 1:1:java.lang.String getSpecificConnectTimeoutKey():238:238 -> A + 1:1:java.lang.String getSpecificReadTimeoutKey():243:243 -> B + 1:1:java.lang.String getSpecificRetryCountKey():248:248 -> C + 1:1:java.lang.String getURLSorterPatternParameterKey():213:213 -> F + 1:1:java.lang.String getPropertyParameterKey():0:0 -> H + 1:1:java.lang.String getTaskIdentifier():79:79 -> a + 1:187:com.batch.android.inbox.InboxNotificationContentInternal parseNotification(com.batch.android.json.JSONObject):0:186 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/json/JSONObject;)Lcom/batch/android/q/g;"} + 188:199:com.batch.android.inbox.InboxNotificationContentInternal parseNotification(com.batch.android.json.JSONObject):186:197 -> b + 1:24:com.batch.android.inbox.InboxWebserviceResponse parseResponse(com.batch.android.json.JSONObject):116:139 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/json/JSONObject;)Lcom/batch/android/q/i;"} + 25:33:com.batch.android.inbox.InboxWebserviceResponse parseResponse(com.batch.android.json.JSONObject):136:144 -> c + 1:1:java.lang.String getCryptorModeParameterKey():0:0 -> o + 1:1:java.lang.String getCryptorTypeParameterKey():0:0 -> p + 1:71:java.util.Map getHeaders():0:70 -> r + 1:112:void run():0:111 -> run + 113:114:void run():107:108 -> run + 115:124:void run():95:104 -> run + 1:1:java.lang.String getPostCryptorTypeParameterKey():0:0 -> v + 1:1:com.batch.android.post.PostDataProvider getPostDataProvider():0:0 -> w + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/s0/h;"} + 1:1:java.lang.String getReadCryptorTypeParameterKey():233:233 -> y +com.batch.android.inbox.InboxFetcherInternal -> com.batch.android.q.f: +# {"id":"sourceFile","fileName":"InboxFetcherInternal.java"} + com.batch.android.module.TrackerModule trackerModule -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/m0/l;"} + android.content.Context context -> b + java.lang.String cursor -> c + long fetcherId -> d + com.batch.android.inbox.FetcherType fetcherType -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q/a;"} + java.lang.String identifier -> f + java.lang.String authKey -> g + java.util.List fetchedNotifications -> h + int maxPageSize -> i + int fetchLimit -> j + java.util.concurrent.Executor fetchExecutor -> k + boolean endReached -> l + com.batch.android.inbox.InboxDatasource datasource -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q/d;"} + boolean filterSilentNotifications -> n + java.lang.String TAG -> o + boolean isDatabaseCleaned -> p + 1:1:void ():0:0 -> + 1:75:void (com.batch.android.module.TrackerModule,com.batch.android.inbox.InboxDatasource,android.content.Context,java.lang.String):0:74 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/m0/l;Lcom/batch/android/q/d;Landroid/content/Context;Ljava/lang/String;)V"} + 76:114:void (com.batch.android.module.TrackerModule,com.batch.android.inbox.InboxDatasource,android.content.Context,java.lang.String):45:83 -> + 115:231:void (com.batch.android.module.TrackerModule,com.batch.android.inbox.InboxDatasource,android.content.Context,java.lang.String,java.lang.String):0:116 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/m0/l;Lcom/batch/android/q/d;Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)V"} + 232:313:void (com.batch.android.module.TrackerModule,com.batch.android.inbox.InboxDatasource,android.content.Context,java.lang.String,java.lang.String):45:126 -> + 1:36:java.util.List access$000(com.batch.android.inbox.InboxFetcherInternal,com.batch.android.inbox.InboxWebserviceResponse,boolean):0:35 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q/f;Lcom/batch/android/q/i;Z)Ljava/util/List;"} + 37:72:java.util.List access$100(com.batch.android.inbox.InboxFetcherInternal,java.util.List):0:35 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q/f;Ljava/util/List;)Ljava/util/List;"} + 73:108:java.lang.String access$200(com.batch.android.inbox.InboxFetcherInternal):0:35 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q/f;)Ljava/lang/String;"} + 109:374:java.util.List convertInternalModelsToPublic(java.util.List):0:265 -> a + 375:758:void fetch(java.lang.String,com.batch.android.webservice.listener.InboxWebserviceListener):0:383 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Lcom/batch/android/e1/d;)V"} + 759:1070:void fetchNewNotifications(com.batch.android.BatchInboxFetcher$OnNewNotificationsFetchedListener):0:311 -> a + 1071:1434:void fetchNextPage(com.batch.android.BatchInboxFetcher$OnNextPageFetchedListener):0:363 -> a + 1435:1946:java.util.List getEventDatas(com.batch.android.inbox.InboxNotificationContentInternal):0:511 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q/g;)Ljava/util/List;"} + 1947:2469:java.util.List getPublicFetchedNotifications():0:522 -> a + 2470:3006:java.util.List handleFetchSuccess(com.batch.android.inbox.InboxWebserviceResponse,boolean):0:536 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q/i;Z)Ljava/util/List;"} + 3007:3084:java.util.List handleFetchSuccess(com.batch.android.inbox.InboxWebserviceResponse,boolean):531:608 -> a + 3085:3492:void lambda$fetch$0(com.batch.android.webservice.listener.InboxWebserviceListener,java.lang.String):0:407 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e1/d;Ljava/lang/String;)V"} + 3493:3507:void lambda$fetch$0(com.batch.android.webservice.listener.InboxWebserviceListener,java.lang.String):401:415 -> a + 3508:3971:void lambda$sync$1(com.batch.android.webservice.listener.InboxWebserviceListener,java.lang.String,java.util.List):0:463 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e1/d;Ljava/lang/String;Ljava/util/List;)V"} + 3972:4221:void markAsDeleted(com.batch.android.BatchInboxNotificationContent):0:249 -> a + 4222:4222:void markAsDeleted(com.batch.android.BatchInboxNotificationContent):249:249 -> a + 4223:4379:com.batch.android.inbox.InboxFetcherInternal provide(android.content.Context,java.lang.String,java.lang.String,boolean):0:156 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Z)Lcom/batch/android/q/f;"} + 4380:4487:com.batch.android.inbox.InboxFetcherInternal provide(android.content.Context,java.lang.String,boolean):0:107 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Ljava/lang/String;Z)Lcom/batch/android/q/f;"} + 4488:4910:void runFetchWSClient(com.batch.android.inbox.InboxFetchWebserviceClient):0:422 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q/e;)V"} + 4911:5075:void setFetchLimit(int):0:164 -> a + 5076:5244:void setFilterSilentNotifications(boolean):0:168 -> a + 5245:5247:com.batch.android.inbox.InboxFetcherInternal provide(android.content.Context,java.lang.String):89:91 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Ljava/lang/String;)Lcom/batch/android/q/f;"} + 5248:5250:com.batch.android.inbox.InboxFetcherInternal provide(android.content.Context,java.lang.String,java.lang.String):136:138 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)Lcom/batch/android/q/f;"} + 1:173:boolean isEndReached():0:172 -> b + 174:377:void markAsRead(com.batch.android.BatchInboxNotificationContent):0:203 -> b + 378:378:void markAsRead(com.batch.android.BatchInboxNotificationContent):203:203 -> b + 379:539:void setMaxPageSize(int):0:160 -> b + 540:971:boolean sync(java.lang.String,com.batch.android.webservice.listener.InboxWebserviceListener):0:431 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Lcom/batch/android/e1/d;)Z"} + 1:218:void markAllAsRead():0:217 -> c + 219:219:void markAllAsRead():217:217 -> c +com.batch.android.inbox.InboxFetcherInternal$1 -> com.batch.android.q.f$a: +# {"id":"sourceFile","fileName":"InboxFetcherInternal.java"} + com.batch.android.inbox.InboxFetcherInternal this$0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q/f;"} + 1:274:void (com.batch.android.inbox.InboxFetcherInternal):0:273 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q/f;)V"} + 1:1:void onFetchFailure(java.lang.String):0:0 -> onFetchFailure + 1:1:void onFetchSuccess(java.util.List,boolean,boolean):0:0 -> onFetchSuccess +com.batch.android.inbox.InboxFetcherInternal$2 -> com.batch.android.q.f$b: +# {"id":"sourceFile","fileName":"InboxFetcherInternal.java"} + com.batch.android.BatchInboxFetcher$OnNewNotificationsFetchedListener val$userListener -> a + com.batch.android.inbox.InboxFetcherInternal this$0 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q/f;"} + 1:289:void (com.batch.android.inbox.InboxFetcherInternal,com.batch.android.BatchInboxFetcher$OnNewNotificationsFetchedListener):0:288 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q/f;Lcom/batch/android/BatchInboxFetcher$OnNewNotificationsFetchedListener;)V"} + 1:309:void onFailure(java.lang.String):0:308 -> a + 310:606:void onSuccess(com.batch.android.inbox.InboxWebserviceResponse):0:296 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q/i;)V"} + 607:614:void onSuccess(com.batch.android.inbox.InboxWebserviceResponse):294:301 -> a +com.batch.android.inbox.InboxFetcherInternal$3 -> com.batch.android.q.f$c: +# {"id":"sourceFile","fileName":"InboxFetcherInternal.java"} + com.batch.android.inbox.InboxFetcherInternal this$0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q/f;"} + 1:327:void (com.batch.android.inbox.InboxFetcherInternal):0:326 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q/f;)V"} + 1:1:void onFetchFailure(java.lang.String):0:0 -> onFetchFailure + 1:1:void onFetchSuccess(java.util.List,boolean):0:0 -> onFetchSuccess +com.batch.android.inbox.InboxFetcherInternal$4 -> com.batch.android.q.f$d: +# {"id":"sourceFile","fileName":"InboxFetcherInternal.java"} + com.batch.android.BatchInboxFetcher$OnNextPageFetchedListener val$finalListener -> a + com.batch.android.inbox.InboxFetcherInternal this$0 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q/f;"} + 1:340:void (com.batch.android.inbox.InboxFetcherInternal,com.batch.android.BatchInboxFetcher$OnNextPageFetchedListener):0:339 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q/f;Lcom/batch/android/BatchInboxFetcher$OnNextPageFetchedListener;)V"} + 1:361:void onFailure(java.lang.String):0:360 -> a + 362:710:void onSuccess(com.batch.android.inbox.InboxWebserviceResponse):0:348 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q/i;)V"} + 711:718:void onSuccess(com.batch.android.inbox.InboxWebserviceResponse):346:353 -> a +com.batch.android.inbox.InboxFetcherInternal$ResultHandlingError -> com.batch.android.q.f$e: +# {"id":"sourceFile","fileName":"InboxFetcherInternal.java"} + java.lang.String publicMesssage -> a + com.batch.android.inbox.InboxFetcherInternal this$0 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q/f;"} + 1:618:void (com.batch.android.inbox.InboxFetcherInternal,java.lang.String,java.lang.String):0:617 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q/f;Ljava/lang/String;Ljava/lang/String;)V"} + 1:622:java.lang.String getPublicMessage():0:621 -> a +com.batch.android.inbox.InboxNotificationContentInternal -> com.batch.android.q.g: +# {"id":"sourceFile","fileName":"InboxNotificationContentInternal.java"} + java.lang.String title -> a + java.lang.String body -> b + com.batch.android.BatchNotificationSource source -> c + boolean isUnread -> d + boolean isDeleted -> e + java.util.Date date -> f + java.util.Map payload -> g + com.batch.android.inbox.NotificationIdentifiers identifiers -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q/j;"} + java.util.List duplicateIdentifiers -> i + 1:52:void (com.batch.android.BatchNotificationSource,java.util.Date,java.util.Map,com.batch.android.inbox.NotificationIdentifiers):0:51 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/BatchNotificationSource;Ljava/util/Date;Ljava/util/Map;Lcom/batch/android/q/j;)V"} + 1:68:void addDuplicateIdentifiers(com.batch.android.inbox.NotificationIdentifiers):0:67 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q/j;)V"} + 69:127:android.os.Bundle getReceiverLikePayload():0:58 -> a + 1:78:boolean isValid():0:77 -> b +com.batch.android.inbox.InboxSyncWebserviceClient -> com.batch.android.q.h: +# {"id":"sourceFile","fileName":"InboxSyncWebserviceClient.java"} + long fetcherId -> o + java.lang.String authentication -> p + java.util.List candidates -> q + com.batch.android.post.InboxSyncPostDataProvider dataProvider -> r + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/s0/b;"} + com.batch.android.webservice.listener.InboxWebserviceListener listener -> s + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e1/d;"} + java.lang.String TAG -> t + 1:72:void (android.content.Context,com.batch.android.inbox.FetcherType,java.lang.String,java.lang.String,java.lang.Integer,java.lang.String,long,java.util.List,com.batch.android.webservice.listener.InboxWebserviceListener):0:71 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/q/a;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;JLjava/util/List;Lcom/batch/android/e1/d;)V"} + 1:1:java.lang.String getSpecificConnectTimeoutKey():250:250 -> A + 1:1:java.lang.String getSpecificReadTimeoutKey():255:255 -> B + 1:1:java.lang.String getSpecificRetryCountKey():260:260 -> C + 1:1:java.lang.String getURLSorterPatternParameterKey():225:225 -> F + 1:1:java.lang.String getPropertyParameterKey():0:0 -> H + 1:1:java.lang.String getTaskIdentifier():88:88 -> a + 1:207:boolean isCandidates(java.lang.String):0:206 -> b + 208:273:com.batch.android.inbox.InboxWebserviceResponse computeResponse(com.batch.android.json.JSONObject):120:185 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/json/JSONObject;)Lcom/batch/android/q/i;"} + 274:284:com.batch.android.inbox.InboxWebserviceResponse computeResponse(com.batch.android.json.JSONObject):182:192 -> b + 285:296:com.batch.android.inbox.InboxWebserviceResponse computeResponse(com.batch.android.json.JSONObject):189:200 -> b + 1:1:java.lang.String getCryptorModeParameterKey():0:0 -> o + 1:1:java.lang.String getCryptorTypeParameterKey():0:0 -> p + 1:80:java.util.Map getHeaders():0:79 -> r + 1:115:void run():0:114 -> run + 116:117:void run():110:111 -> run + 118:127:void run():98:107 -> run + 1:1:java.lang.String getPostCryptorTypeParameterKey():240:240 -> v + 1:216:com.batch.android.post.PostDataProvider getPostDataProvider():0:215 -> w + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/s0/h;"} + 1:1:java.lang.String getReadCryptorTypeParameterKey():245:245 -> y +com.batch.android.inbox.InboxWebserviceResponse -> com.batch.android.q.i: +# {"id":"sourceFile","fileName":"InboxWebserviceResponse.java"} + boolean hasMore -> a + boolean didTimeout -> b + java.lang.String cursor -> c + java.util.List notifications -> d + 1:21:void ():0:20 -> +com.batch.android.inbox.NotificationIdentifiers -> com.batch.android.q.j: +# {"id":"sourceFile","fileName":"NotificationIdentifiers.java"} + java.lang.String identifier -> a + java.lang.String sendID -> b + java.lang.String installID -> c + java.lang.String customID -> d + java.util.Map additionalData -> e + 1:33:void (java.lang.String,java.lang.String):0:32 -> + 1:37:boolean isValid():0:36 -> a +com.batch.android.inbox.ResponseParsingException -> com.batch.android.q.k: +# {"id":"sourceFile","fileName":"ResponseParsingException.java"} + 1:6:void ():0:5 -> + 7:15:void (java.lang.String):0:8 -> + 16:28:void (java.lang.String,java.lang.Throwable):0:12 -> + 29:45:void (java.lang.Throwable):0:16 -> +com.batch.android.json.JSON -> com.batch.android.json.JSON: +# {"id":"sourceFile","fileName":"JSON.java"} + 1:1:void ():22:22 -> + 1:2:double checkDouble(double):28:29 -> a + 3:10:java.lang.Boolean toBoolean(java.lang.Object):35:42 -> a + 11:19:com.batch.android.json.JSONException typeMismatch(java.lang.Object,java.lang.Object,java.lang.String):99:107 -> a + 20:26:com.batch.android.json.JSONException typeMismatch(java.lang.Object,java.lang.String):116:122 -> a + 1:7:java.lang.Double toDouble(java.lang.Object):49:55 -> b + 1:7:java.lang.Integer toInteger(java.lang.Object):62:68 -> c + 1:7:java.lang.Long toLong(java.lang.Object):75:81 -> d + 1:4:java.lang.String toString(java.lang.Object):88:91 -> e +com.batch.android.json.JSONArray -> com.batch.android.json.JSONArray: +# {"id":"sourceFile","fileName":"JSONArray.java"} + java.util.List values -> a + 1:2:void ():58:59 -> + 3:6:void (java.util.Collection):72:75 -> + 7:16:void (com.batch.android.json.JSONTokener):89:98 -> + 17:17:void (java.lang.String):110:110 -> + 18:25:void (java.lang.Object):116:123 -> + 26:26:void (java.lang.Object):118:118 -> + 1:1:int length():131:131 -> a + 2:2:com.batch.android.json.JSONArray put(boolean):140:140 -> a + 3:3:com.batch.android.json.JSONArray put(double):152:152 -> a + 4:4:com.batch.android.json.JSONArray put(long):172:172 -> a + 5:9:void checkedPut(java.lang.Object):195:199 -> a + 10:17:com.batch.android.json.JSONArray put(int,java.lang.Object):260:267 -> a + 18:24:java.lang.Object get(int):289:295 -> a + 25:27:boolean optBoolean(int,boolean):350:352 -> a + 28:30:double optDouble(int,double):384:386 -> a + 31:33:int optInt(int,int):418:420 -> a + 34:36:long optLong(int,long):452:454 -> a + 37:38:java.lang.String optString(int,java.lang.String):485:486 -> a + 39:46:com.batch.android.json.JSONObject toJSONObject(com.batch.android.json.JSONArray):548:555 -> a + 47:56:java.lang.String join(java.lang.String):568:577 -> a + 57:61:void writeTo(com.batch.android.json.JSONStringer):614:618 -> a + 1:1:com.batch.android.json.JSONArray put(java.lang.Object):187:187 -> b + 2:2:com.batch.android.json.JSONArray put(int,boolean):210:210 -> b + 3:3:com.batch.android.json.JSONArray put(int,double):223:223 -> b + 4:4:com.batch.android.json.JSONArray put(int,int):234:234 -> b + 5:5:com.batch.android.json.JSONArray put(int,long):245:245 -> b + 6:11:boolean getBoolean(int):329:334 -> b + 12:12:boolean getBoolean(int):332:332 -> b + 1:6:double getDouble(int):363:368 -> c + 7:7:double getDouble(int):366:366 -> c + 1:6:int getInt(int):397:402 -> d + 7:7:int getInt(int):400:400 -> d + 1:5:com.batch.android.json.JSONArray getJSONArray(int):498:502 -> e + 1:1:boolean equals(java.lang.Object):623:623 -> equals + 1:5:com.batch.android.json.JSONObject getJSONObject(int):523:527 -> f + 1:6:long getLong(int):431:436 -> g + 7:7:long getLong(int):434:434 -> g + 1:4:java.lang.String getString(int):464:467 -> h + 1:1:int hashCode():629:629 -> hashCode + 1:2:boolean isNull(int):276:277 -> i + 1:4:java.lang.Object opt(int):304:307 -> j + 1:1:boolean optBoolean(int):342:342 -> k + 1:1:double optDouble(int):376:376 -> l + 1:1:int optInt(int):410:410 -> m + 1:2:com.batch.android.json.JSONArray optJSONArray(int):511:512 -> n + 1:2:com.batch.android.json.JSONObject optJSONObject(int):536:537 -> o + 1:1:long optLong(int):444:444 -> p + 1:1:java.lang.String optString(int):477:477 -> q + 1:1:com.batch.android.json.JSONArray put(int):162:162 -> r + 1:4:java.lang.Object remove(int):315:318 -> s + 1:3:java.lang.String toString(int):608:610 -> t + 1:3:java.lang.String toString():587:589 -> toString +com.batch.android.json.JSONException -> com.batch.android.json.JSONException: +# {"id":"sourceFile","fileName":"JSONException.java"} + 1:1:void (java.lang.String):50:50 -> +com.batch.android.json.JSONHelper -> com.batch.android.json.JSONHelper: +# {"id":"sourceFile","fileName":"JSONHelper.java"} + 1:1:void ():16:16 -> + 1:4:java.lang.Object jsonObjectToObject(java.lang.Object):27:30 -> a + 5:9:java.util.Map jsonObjectToMap(com.batch.android.json.JSONObject):37:41 -> a + 10:12:java.util.List jsonArrayToArray(com.batch.android.json.JSONArray):47:49 -> a +com.batch.android.json.JSONObject -> com.batch.android.json.JSONObject: +# {"id":"sourceFile","fileName":"JSONObject.java"} + java.util.LinkedHashMap nameValuePairs -> a + java.lang.Double NEGATIVE_ZERO -> b + java.lang.Object NULL -> c + 1:18:void ():87:104 -> + 1:2:void ():121:122 -> + 3:14:void (java.util.Map):135:146 -> + 15:15:void (java.util.Map):144:144 -> + 16:17:void (com.batch.android.json.JSONTokener):159:160 -> + 18:18:void (java.lang.String):172:172 -> + 19:23:void (com.batch.android.json.JSONObject,java.lang.String[]):181:185 -> + 24:28:void (com.batch.android.json.JSONObject):194:198 -> + 1:5:void readFromTokener(com.batch.android.json.JSONTokener):219:223 -> a + 6:18:com.batch.android.json.JSONObject accumulate(java.lang.String,java.lang.Object):334:346 -> a + 19:19:java.lang.String checkName(java.lang.String):382:382 -> a + 20:22:boolean optBoolean(java.lang.String,boolean):472:474 -> a + 23:25:java.lang.Boolean reallyOptBoolean(java.lang.String,java.lang.Boolean):482:484 -> a + 26:28:double optDouble(java.lang.String,double):517:519 -> a + 29:31:java.lang.Double reallyOptDouble(java.lang.String,java.lang.Double):527:529 -> a + 32:34:int optInt(java.lang.String,int):562:564 -> a + 35:37:java.lang.Integer reallyOptInteger(java.lang.String,java.lang.Integer):572:574 -> a + 38:40:java.lang.Long reallyOptLong(java.lang.String,java.lang.Long):601:603 -> a + 41:43:long optLong(java.lang.String,long):623:625 -> a + 44:45:java.lang.String optString(java.lang.String,java.lang.String):656:657 -> a + 46:56:com.batch.android.json.JSONArray toJSONArray(com.batch.android.json.JSONArray):728:738 -> a + 57:57:java.util.Set keySet():765:765 -> a + 58:60:java.lang.String toString(int):807:809 -> a + 61:65:void writeTo(com.batch.android.json.JSONStringer):813:817 -> a + 66:79:java.lang.String numberToString(java.lang.Number):831:844 -> a + 80:80:java.lang.String numberToString(java.lang.Number):828:828 -> a + 81:112:java.lang.Object wrap(java.lang.Object):883:914 -> a + 1:1:com.batch.android.json.JSONObject put(java.lang.String,boolean):241:241 -> b + 2:2:com.batch.android.json.JSONObject put(java.lang.String,double):254:254 -> b + 3:3:com.batch.android.json.JSONObject put(java.lang.String,int):265:265 -> b + 4:4:com.batch.android.json.JSONObject put(java.lang.String,long):276:276 -> b + 5:18:com.batch.android.json.JSONObject append(java.lang.String,java.lang.Object):362:375 -> b + 19:19:com.batch.android.json.JSONObject append(java.lang.String,java.lang.Object):372:372 -> b + 20:22:java.lang.Object get(java.lang.String):428:430 -> b + 23:25:java.lang.String reallyOptString(java.lang.String,java.lang.String):666:668 -> b + 26:26:java.util.Iterator keys():751:751 -> b + 1:1:int length():231:231 -> c + 2:9:com.batch.android.json.JSONObject put(java.lang.String,java.lang.Object):293:300 -> c + 10:15:boolean getBoolean(java.lang.String):451:456 -> c + 16:16:boolean getBoolean(java.lang.String):454:454 -> c + 1:1:com.batch.android.json.JSONObject putOpt(java.lang.String,java.lang.Object):312:312 -> d + 2:7:double getDouble(java.lang.String):496:501 -> d + 8:8:double getDouble(java.lang.String):499:499 -> d + 9:9:com.batch.android.json.JSONArray names():773:773 -> d + 1:6:int getInt(java.lang.String):541:546 -> e + 7:7:int getInt(java.lang.String):544:544 -> e + 1:5:com.batch.android.json.JSONArray getJSONArray(java.lang.String):680:684 -> f + 1:5:com.batch.android.json.JSONObject getJSONObject(java.lang.String):705:709 -> g + 1:6:long getLong(java.lang.String):588:593 -> h + 7:7:long getLong(java.lang.String):591:591 -> h + 1:4:java.lang.String getString(java.lang.String):635:638 -> i + 1:1:boolean has(java.lang.String):411:411 -> j + 1:1:boolean hasNonNull(java.lang.String):419:419 -> k + 1:2:boolean isNull(java.lang.String):402:403 -> l + 1:1:java.lang.Object opt(java.lang.String):440:440 -> m + 1:1:boolean optBoolean(java.lang.String):464:464 -> n + 1:1:double optDouble(java.lang.String):509:509 -> o + 1:1:int optInt(java.lang.String):554:554 -> p + 1:2:com.batch.android.json.JSONArray optJSONArray(java.lang.String):693:694 -> q + 1:2:com.batch.android.json.JSONObject optJSONObject(java.lang.String):718:719 -> r + 1:9:void readObject(java.io.ObjectInputStream):932:940 -> readObject + 1:1:long optLong(java.lang.String):613:613 -> s + 1:1:java.lang.String optString(java.lang.String):648:648 -> t + 1:3:java.lang.String toString():783:785 -> toString + 1:10:java.lang.String quote(java.lang.String):856:865 -> u + 1:1:java.lang.Object remove(java.lang.String):394:394 -> v + 1:6:void writeObject(java.io.ObjectOutputStream):923:928 -> writeObject + 7:7:void writeObject(java.io.ObjectOutputStream):925:925 -> writeObject +com.batch.android.json.JSONObject$1 -> com.batch.android.json.JSONObject$a: +# {"id":"sourceFile","fileName":"JSONObject.java"} + 1:1:void ():104:104 -> + 1:1:java.lang.String toString():112:112 -> toString +com.batch.android.json.JSONStringer -> com.batch.android.json.JSONStringer: +# {"id":"sourceFile","fileName":"JSONStringer.java"} + java.lang.StringBuilder out -> a + java.util.List stack -> b + java.lang.String indent -> c + 1:1:void ():125:125 -> + 2:60:void ():68:126 -> + 61:61:void (int):129:129 -> + 62:126:void (int):68:132 -> + 1:1:com.batch.android.json.JSONStringer array():142:142 -> a + 2:7:com.batch.android.json.JSONStringer open(com.batch.android.json.JSONStringer$Scope,java.lang.String):178:183 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/json/JSONStringer$a;Ljava/lang/String;)Lcom/batch/android/json/JSONStringer;"} + 8:17:com.batch.android.json.JSONStringer close(com.batch.android.json.JSONStringer$Scope,com.batch.android.json.JSONStringer$Scope,java.lang.String):192:201 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/json/JSONStringer$a;Lcom/batch/android/json/JSONStringer$a;Ljava/lang/String;)Lcom/batch/android/json/JSONStringer;"} + 18:18:void replaceTop(com.batch.android.json.JSONStringer$Scope):219:219 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/json/JSONStringer$a;)V"} + 19:38:com.batch.android.json.JSONStringer value(java.lang.Object):231:250 -> a + 39:39:com.batch.android.json.JSONStringer value(java.lang.Object):246:246 -> a + 40:40:com.batch.android.json.JSONStringer value(java.lang.Object):232:232 -> a + 41:45:com.batch.android.json.JSONStringer value(boolean):262:266 -> a + 46:46:com.batch.android.json.JSONStringer value(boolean):263:263 -> a + 47:51:com.batch.android.json.JSONStringer value(double):278:282 -> a + 52:52:com.batch.android.json.JSONStringer value(double):279:279 -> a + 53:57:com.batch.android.json.JSONStringer value(long):292:296 -> a + 58:58:com.batch.android.json.JSONStringer value(long):293:293 -> a + 59:60:com.batch.android.json.JSONStringer key(java.lang.String):365:366 -> a + 61:61:com.batch.android.json.JSONStringer key(java.lang.String):363:363 -> a + 1:36:void string(java.lang.String):301:336 -> b + 37:52:void string(java.lang.String):315:330 -> b + 53:53:void string(java.lang.String):324:324 -> b + 54:77:void string(java.lang.String):318:341 -> b + 78:85:void beforeKey():375:382 -> b + 86:86:void beforeKey():379:379 -> b + 1:16:void beforeValue():391:406 -> c + 1:1:com.batch.android.json.JSONStringer endArray():151:151 -> d + 1:1:com.batch.android.json.JSONStringer endObject():170:170 -> e + 1:7:void newline():345:351 -> f + 1:1:com.batch.android.json.JSONStringer object():161:161 -> g + 1:4:com.batch.android.json.JSONStringer$Scope peek():209:212 -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/json/JSONStringer$a;"} + 5:5:com.batch.android.json.JSONStringer$Scope peek():210:210 -> h + 1:1:java.lang.String toString():422:422 -> toString +com.batch.android.json.JSONStringer$Scope -> com.batch.android.json.JSONStringer$a: +# {"id":"sourceFile","fileName":"JSONStringer.java"} + com.batch.android.json.JSONStringer$Scope EMPTY_ARRAY -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/json/JSONStringer$a;"} + com.batch.android.json.JSONStringer$Scope NONEMPTY_ARRAY -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/json/JSONStringer$a;"} + com.batch.android.json.JSONStringer$Scope EMPTY_OBJECT -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/json/JSONStringer$a;"} + com.batch.android.json.JSONStringer$Scope DANGLING_KEY -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/json/JSONStringer$a;"} + com.batch.android.json.JSONStringer$Scope NONEMPTY_OBJECT -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/json/JSONStringer$a;"} + com.batch.android.json.JSONStringer$Scope NULL -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/json/JSONStringer$a;"} + com.batch.android.json.JSONStringer$Scope[] $VALUES -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/json/JSONStringer$a;"} + 1:31:void ():80:110 -> + 32:32:void ():75:75 -> + 1:1:void (java.lang.String,int):75:75 -> + 1:1:com.batch.android.json.JSONStringer$Scope[] $values():75:75 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/json/JSONStringer$a;"} + 1:1:com.batch.android.json.JSONStringer$Scope valueOf(java.lang.String):75:75 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/json/JSONStringer$a;"} + 1:1:com.batch.android.json.JSONStringer$Scope[] values():75:75 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/json/JSONStringer$a;"} +com.batch.android.json.JSONTokener -> com.batch.android.json.JSONTokener: +# {"id":"sourceFile","fileName":"JSONTokener.java"} + java.lang.String in -> a + int pos -> b + 1:6:void (java.lang.String):83:88 -> + 1:1:int dehexchar(char):0:0 -> a + 2:6:java.lang.String next(int):512:516 -> a + 7:7:java.lang.String next(int):513:513 -> a + 8:8:java.lang.String nextTo(java.lang.String):540:540 -> a + 9:9:java.lang.String nextTo(java.lang.String):538:538 -> a + 10:11:void back():580:581 -> a + 1:4:java.lang.String nextToInternal(java.lang.String):326:329 -> b + 5:11:java.lang.String nextToInternal(java.lang.String):327:333 -> b + 12:12:boolean more():465:465 -> b + 13:15:char next(char):482:484 -> b + 1:25:java.lang.String nextString(char):197:221 -> c + 26:37:java.lang.String nextString(char):214:225 -> c + 38:38:char next():474:474 -> c + 39:40:void skipPast(java.lang.String):556:557 -> c + 1:1:com.batch.android.json.JSONException syntaxError(java.lang.String):441:441 -> d + 2:2:char nextClean():496:496 -> d + 3:3:java.lang.String nextTo(char):547:547 -> d + 1:28:int nextCleanInternal():117:144 -> e + 29:34:int nextCleanInternal():134:139 -> e + 35:53:int nextCleanInternal():137:155 -> e + 54:56:char skipTo(char):566:568 -> e + 1:14:java.lang.Object nextValue():99:112 -> f + 15:20:java.lang.Object nextValue():104:109 -> f + 21:21:java.lang.Object nextValue():102:102 -> f + 1:35:com.batch.android.json.JSONArray readArray():397:431 -> g + 36:42:com.batch.android.json.JSONArray readArray():408:414 -> g + 43:43:com.batch.android.json.JSONArray readArray():405:405 -> g + 1:12:char readEscapeCharacter():235:246 -> h + 13:13:char readEscapeCharacter():239:239 -> h + 1:21:java.lang.Object readLiteral():272:292 -> i + 22:51:java.lang.Object readLiteral():289:318 -> i + 52:52:java.lang.Object readLiteral():275:275 -> i + 1:18:com.batch.android.json.JSONObject readObject():341:358 -> j + 19:47:com.batch.android.json.JSONObject readObject():357:385 -> j + 1:2:void skipToEndOfLine():171:172 -> k + 3:6:void skipToEndOfLine():171:174 -> k + 1:1:java.lang.String toString():450:450 -> toString +com.batch.android.localcampaigns.CampaignManager -> com.batch.android.r.a: +# {"id":"sourceFile","fileName":"CampaignManager.java"} + com.batch.android.core.DateProvider dateProvider -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/d;"} + com.batch.android.localcampaigns.LocalCampaignsTracker viewTracker -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/r/d;"} + com.batch.android.localcampaigns.persistence.LocalCampaignsPersistence persistor -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/u/b;"} + java.util.List campaignList -> d + com.batch.android.query.response.LocalCampaignsResponse$GlobalCappings cappings -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/x0/c$b;"} + java.lang.Object campaignListLock -> f + long nextAvailableJITTimestamp -> g + java.util.concurrent.atomic.AtomicBoolean campaignsLoaded -> h + java.util.Set watchedEventNames -> i + java.util.Map syncedJITCampaigns -> j + java.lang.String TAG -> k + java.lang.String PERSISTENCE_LOCAL_CAMPAIGNS_FILE_NAME -> l + int DEFAULT_RETRY_AFTER -> m + long CACHE_EXPIRATION_DELAY -> n + int MAX_CAMPAIGNS_JIT_THRESHOLD -> o + int MIN_DELAY_BETWEEN_JIT_SYNC -> p + int JIT_CAMPAIGN_CACHE_PERIOD -> q + 1:1:void ():71:71 -> + 1:126:void (com.batch.android.localcampaigns.LocalCampaignsTracker):0:125 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/r/d;)V"} + 127:162:void (com.batch.android.localcampaigns.LocalCampaignsTracker):91:126 -> + 1:58:long access$002(com.batch.android.localcampaigns.CampaignManager,long):0:57 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/r/a;J)J"} + 59:116:com.batch.android.core.DateProvider access$100(com.batch.android.localcampaigns.CampaignManager):0:57 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/r/a;)Lcom/batch/android/e/d;"} + 117:783:boolean areCampaignsLoaded():0:666 -> a + 784:1231:java.util.List cleanCampaignList(java.util.List):0:447 -> a + 1232:1416:void deleteAllCampaigns(android.content.Context,boolean):0:184 -> a + 1417:1417:void deleteAllCampaigns(android.content.Context,boolean):184:184 -> a + 1418:2028:void deleteSavedCampaigns(android.content.Context):0:610 -> a + 2029:2254:java.util.List getEligibleCampaignsSortedByPriority(com.batch.android.localcampaigns.signal.Signal):0:225 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/w/d;)Ljava/util/List;"} + 2255:2266:java.util.List getEligibleCampaignsSortedByPriority(com.batch.android.localcampaigns.signal.Signal):223:234 -> a + 2267:2642:com.batch.android.localcampaigns.model.LocalCampaign$SyncedJITResult$State getSyncedJITCampaignState(com.batch.android.localcampaigns.model.LocalCampaign):0:375 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/s/a;)Lcom/batch/android/s/a$b$a;"} + 2643:3116:boolean isCampaignOverCapping(com.batch.android.localcampaigns.model.LocalCampaign,boolean):0:473 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/s/a;Z)Z"} + 3117:3500:boolean isEventWatched(java.lang.String):0:383 -> a + 3501:3728:int lambda$getEligibleCampaignsSortedByPriority$0(com.batch.android.localcampaigns.model.LocalCampaign,com.batch.android.localcampaigns.model.LocalCampaign):0:227 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/s/a;Lcom/batch/android/s/a;)I"} + 3729:4332:void lambda$saveCampaignsAsync$1(android.content.Context,com.batch.android.query.response.LocalCampaignsResponse):0:603 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/x0/c;)V"} + 4333:4739:void setCappings(com.batch.android.query.response.LocalCampaignsResponse$GlobalCappings):0:406 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/x0/c$b;)V"} + 4740:5036:void verifyCampaignsEligibilityFromServer(java.util.List,com.batch.android.localcampaigns.CampaignManager$JITElectionCampaignListener):0:296 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/util/List;Lcom/batch/android/r/a$b;)V"} + 5037:5037:void verifyCampaignsEligibilityFromServer(java.util.List,com.batch.android.localcampaigns.CampaignManager$JITElectionCampaignListener):295:295 -> a + 1:58:java.util.Map access$200(com.batch.android.localcampaigns.CampaignManager):0:57 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/r/a;)Ljava/util/Map;"} + 59:745:void closeViewTracker():0:686 -> b + 746:1361:void deleteSavedCampaignsAsync(android.content.Context):0:615 -> b + 1362:1630:com.batch.android.localcampaigns.model.LocalCampaign getFirstCampaignNotRequiringJITSync(java.util.List):0:268 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/util/List;)Lcom/batch/android/s/a;"} + 1631:2156:boolean isCampaignDisplayable(com.batch.android.localcampaigns.model.LocalCampaign):0:525 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/s/a;)Z"} + 2157:2157:boolean isCampaignDisplayable(com.batch.android.localcampaigns.model.LocalCampaign):510:510 -> b + 2158:2756:void saveCampaigns(android.content.Context,com.batch.android.query.response.LocalCampaignsResponse):0:598 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/x0/c;)V"} + 2757:2757:void saveCampaigns(android.content.Context,com.batch.android.query.response.LocalCampaignsResponse):595:595 -> b + 1:252:java.util.List getFirstEligibleCampaignsRequiringSync(java.util.List):0:251 -> c + 253:875:boolean hasSavedCampaigns(android.content.Context):0:622 -> c + 876:1479:void saveCampaignsAsync(android.content.Context,com.batch.android.query.response.LocalCampaignsResponse):0:603 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/x0/c;)V"} + 1480:1480:java.util.List getCampaignList():390:390 -> c + 1:399:com.batch.android.query.response.LocalCampaignsResponse$GlobalCappings getCappings():0:398 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/x0/c$b;"} + 400:1015:void lambda$deleteSavedCampaignsAsync$2(android.content.Context):0:615 -> d + 1016:1185:void updateCampaignList(java.util.List):0:169 -> d + 1186:1186:void updateCampaignList(java.util.List):169:169 -> d + 1:692:com.batch.android.localcampaigns.ViewTracker getViewTracker():0:691 -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/r/e;"} + 693:1352:boolean loadSavedCampaignResponse(android.content.Context):0:659 -> e + 1353:1353:boolean loadSavedCampaignResponse(android.content.Context):632:632 -> e + 1:350:boolean isJITServiceAvailable():0:349 -> f + 1:559:boolean isOverGlobalCappings():0:558 -> g + 1:674:void openViewTracker():0:673 -> h + 1:1:com.batch.android.localcampaigns.CampaignManager provide():131:131 -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/r/a;"} + 1:584:void updateWatchedEventNames():0:583 -> j +com.batch.android.localcampaigns.CampaignManager$1 -> com.batch.android.r.a$a: +# {"id":"sourceFile","fileName":"CampaignManager.java"} + com.batch.android.localcampaigns.CampaignManager$JITElectionCampaignListener val$listener -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/r/a$b;"} + java.util.List val$eligibleCampaignsRequiringSync -> b + com.batch.android.localcampaigns.CampaignManager this$0 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/r/a;"} + 1:299:void (com.batch.android.localcampaigns.CampaignManager,com.batch.android.localcampaigns.CampaignManager$JITElectionCampaignListener,java.util.List):0:298 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/r/a;Lcom/batch/android/r/a$b;Ljava/util/List;)V"} + 1:337:void onFailure(com.batch.android.core.Webservice$WebserviceError):0:336 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e/k0$d;)V"} + 338:662:void onSuccess(java.util.List):0:324 -> a +com.batch.android.localcampaigns.CampaignManager$JITElectionCampaignListener -> com.batch.android.r.a$b: +# {"id":"sourceFile","fileName":"CampaignManager.java"} + void onCampaignElected(com.batch.android.localcampaigns.model.LocalCampaign) -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/s/a;)V"} +com.batch.android.localcampaigns.LocalCampaignTrackDbHelper -> com.batch.android.r.b: +# {"id":"sourceFile","fileName":"LocalCampaignTrackDbHelper.java"} + int DATABASE_VERSION -> a + java.lang.String DATABASE_NAME -> b + java.lang.String SQL_CREATE_ENTRIES -> c + java.lang.String SQL_DELETE_ENTRIES -> d + java.lang.String SQL_CREATE_VIEW_EVENTS_TABLE -> e + java.lang.String SQL_CREATE_TRIGGER_VIEW_EVENT_DELETE_ROWS -> f + 1:102:void (android.content.Context):0:101 -> + 1:137:java.lang.String getTableAsString(android.database.sqlite.SQLiteDatabase):0:136 -> a + 138:149:java.lang.String getTableAsString(android.database.sqlite.SQLiteDatabase):135:146 -> a + 1:109:void onCreate(android.database.sqlite.SQLiteDatabase):0:108 -> onCreate + 1:116:void onUpgrade(android.database.sqlite.SQLiteDatabase,int,int):0:115 -> onUpgrade +com.batch.android.localcampaigns.LocalCampaignTrackDbHelper$LocalCampaignEntry -> com.batch.android.r.b$a: +# {"id":"sourceFile","fileName":"LocalCampaignTrackDbHelper.java"} + java.lang.String TABLE_NAME -> a + java.lang.String COLUMN_NAME_CAMPAIGN_ID -> b + java.lang.String COLUMN_NAME_CAMPAIGN_KIND -> c + java.lang.String COLUMN_NAME_CAMPAIGN_LAST_OCCURRENCE -> d + java.lang.String COLUMN_NAME_CAMPAIGN_COUNT -> e + java.lang.String TABLE_VIEW_EVENTS_NAME -> f + java.lang.String COLUMN_NAME_VE_CAMPAIGN_ID -> g + java.lang.String COLUMN_NAME_VE_TIMESTAMP -> h + java.lang.String TRIGGER_VIEW_EVENTS_NAME -> i + 1:15:void ():0:14 -> +com.batch.android.localcampaigns.LocalCampaignsSQLTracker -> com.batch.android.r.c: +# {"id":"sourceFile","fileName":"LocalCampaignsSQLTracker.java"} + com.batch.android.localcampaigns.LocalCampaignTrackDbHelper dbHelper -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/r/b;"} + android.database.sqlite.SQLiteDatabase database -> c + com.batch.android.core.DateProvider dateProvider -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/d;"} + boolean open -> e + java.lang.String TAG -> f + 1:26:void ():0:25 -> + 27:30:void ():23:26 -> + 31:61:void (com.batch.android.core.DateProvider):0:30 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e/d;)V"} + 62:70:void (com.batch.android.core.DateProvider):23:31 -> + 1:200:long campaignLastOccurrence(java.lang.String):0:199 -> a + 201:245:void close():0:44 -> a + 246:461:int getNumberOfViewEventsSince(long):0:215 -> a + 462:474:int getNumberOfViewEventsSince(long):208:220 -> a + 475:641:java.util.Map getViewCounts(java.util.List):0:166 -> a + 642:663:java.util.Map getViewCounts(java.util.List):154:175 -> a + 664:700:void open(android.content.Context):0:36 -> a + 701:757:void setDateProvider(com.batch.android.core.DateProvider):0:56 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e/d;)V"} + 1:227:void deleteViewEvents():0:226 -> b + 228:316:com.batch.android.localcampaigns.ViewTracker$CountedViewEvent trackViewEvent(java.lang.String):0:88 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/r/e$a;"} + 317:342:com.batch.android.localcampaigns.ViewTracker$CountedViewEvent trackViewEvent(java.lang.String):74:99 -> b + 343:343:com.batch.android.localcampaigns.ViewTracker$CountedViewEvent trackViewEvent(java.lang.String):91:91 -> b + 1:239:void ensureWritableDatabase():0:238 -> c + 240:240:void ensureWritableDatabase():232:232 -> c + 241:371:com.batch.android.localcampaigns.ViewTracker$CountedViewEvent getViewEvent(java.lang.String):0:130 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/r/e$a;"} + 1:53:com.batch.android.core.DateProvider getDateProvider():0:52 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/e/d;"} + 1:49:boolean isOpen():0:48 -> e +com.batch.android.localcampaigns.LocalCampaignsTracker -> com.batch.android.r.d: +# {"id":"sourceFile","fileName":"LocalCampaignsTracker.java"} + int sessionViewsCount -> g + 1:12:void ():0:11 -> + 1:38:com.batch.android.localcampaigns.ViewTracker$CountedViewEvent trackViewEvent(java.lang.String):0:37 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/r/e$a;"} + 1:26:int getSessionViewsCount():0:25 -> f + 1:18:void resetSessionViewsCount():0:17 -> g +com.batch.android.localcampaigns.ViewTracker -> com.batch.android.r.e: +# {"id":"sourceFile","fileName":"ViewTracker.java"} + int KIND_VIEW -> a + long campaignLastOccurrence(java.lang.String) -> a + int getNumberOfViewEventsSince(long) -> a + java.util.Map getViewCounts(java.util.List) -> a + com.batch.android.localcampaigns.ViewTracker$CountedViewEvent trackViewEvent(java.lang.String) -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/r/e$a;"} + com.batch.android.localcampaigns.ViewTracker$CountedViewEvent getViewEvent(java.lang.String) -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/r/e$a;"} +com.batch.android.localcampaigns.ViewTracker$CountedViewEvent -> com.batch.android.r.e$a: +# {"id":"sourceFile","fileName":"ViewTracker.java"} + java.lang.String campaignID -> a + int count -> b + long lastOccurrence -> c + 1:62:void (java.lang.String):0:61 -> + 63:68:void (java.lang.String):57:62 -> +com.batch.android.localcampaigns.ViewTrackerUnavailableException -> com.batch.android.r.f: +# {"id":"sourceFile","fileName":"ViewTrackerUnavailableException.java"} + 1:6:void ():0:5 -> +com.batch.android.localcampaigns.model.LocalCampaign -> com.batch.android.s.a: +# {"id":"sourceFile","fileName":"LocalCampaign.java"} + java.lang.String id -> a + java.lang.Integer minimumAPILevel -> b + java.lang.Integer maximumAPILevel -> c + int priority -> d + com.batch.android.date.BatchDate startDate -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/h/a;"} + com.batch.android.date.BatchDate endDate -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/h/a;"} + int minimumDisplayInterval -> g + java.lang.Integer capping -> h + com.batch.android.localcampaigns.model.LocalCampaign$Output output -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/s/a$a;"} + com.batch.android.json.JSONObject eventData -> j + java.util.List triggers -> k + boolean persist -> l + java.lang.String publicToken -> m + com.batch.android.json.JSONObject customPayload -> n + boolean requiresJustInTimeSync -> o + java.lang.String TAG -> p + 1:122:void ():0:121 -> + 1:161:void displayMessage():0:160 -> a + 1:139:void generateOccurrenceID():0:138 -> b +com.batch.android.localcampaigns.model.LocalCampaign$Output -> com.batch.android.s.a$a: +# {"id":"sourceFile","fileName":"LocalCampaign.java"} + com.batch.android.json.JSONObject payload -> a + 1:173:void (com.batch.android.json.JSONObject):0:172 -> + boolean displayMessage(com.batch.android.localcampaigns.model.LocalCampaign) -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/s/a;)Z"} +com.batch.android.localcampaigns.model.LocalCampaign$SyncedJITResult -> com.batch.android.s.a$b: +# {"id":"sourceFile","fileName":"LocalCampaign.java"} + long timestamp -> a + boolean eligible -> b + 1:211:void (long):0:210 -> +com.batch.android.localcampaigns.model.LocalCampaign$SyncedJITResult$State -> com.batch.android.s.a$b$a: +# {"id":"sourceFile","fileName":"LocalCampaign.java"} + com.batch.android.localcampaigns.model.LocalCampaign$SyncedJITResult$State ELIGIBLE -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/s/a$b$a;"} + com.batch.android.localcampaigns.model.LocalCampaign$SyncedJITResult$State NOT_ELIGIBLE -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/s/a$b$a;"} + com.batch.android.localcampaigns.model.LocalCampaign$SyncedJITResult$State REQUIRES_SYNC -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/s/a$b$a;"} + com.batch.android.localcampaigns.model.LocalCampaign$SyncedJITResult$State[] $VALUES -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/s/a$b$a;"} + 1:3:void ():194:196 -> + 4:4:void ():193:193 -> + 1:194:void (java.lang.String,int):0:193 -> + 1:194:com.batch.android.localcampaigns.model.LocalCampaign$SyncedJITResult$State[] $values():0:193 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/s/a$b$a;"} + 1:1:com.batch.android.localcampaigns.model.LocalCampaign$SyncedJITResult$State valueOf(java.lang.String):193:193 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/s/a$b$a;"} + 1:1:com.batch.android.localcampaigns.model.LocalCampaign$SyncedJITResult$State[] values():193:193 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/s/a$b$a;"} +com.batch.android.localcampaigns.model.LocalCampaign$Trigger -> com.batch.android.s.a$c: +# {"id":"sourceFile","fileName":"LocalCampaign.java"} + java.lang.String getType() -> k +com.batch.android.localcampaigns.output.ActionOutput -> com.batch.android.t.a: +# {"id":"sourceFile","fileName":"ActionOutput.java"} + 1:21:void (com.batch.android.json.JSONObject):0:20 -> + 1:1:com.batch.android.localcampaigns.output.ActionOutput provide(com.batch.android.json.JSONObject):25:25 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/json/JSONObject;)Lcom/batch/android/t/a;"} + 2:34:boolean displayMessage(com.batch.android.localcampaigns.model.LocalCampaign):30:62 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/s/a;)Z"} +com.batch.android.localcampaigns.output.LandingOutput -> com.batch.android.t.b: +# {"id":"sourceFile","fileName":"LandingOutput.java"} + com.batch.android.module.MessagingModule messagingModule -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/m0/h;"} + 1:23:void (com.batch.android.module.MessagingModule,com.batch.android.json.JSONObject):0:22 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/m0/h;Lcom/batch/android/json/JSONObject;)V"} + 1:38:boolean displayMessage(com.batch.android.localcampaigns.model.LocalCampaign):0:37 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/s/a;)Z"} + 39:53:boolean displayMessage(com.batch.android.localcampaigns.model.LocalCampaign):37:51 -> a + 54:54:com.batch.android.localcampaigns.output.LandingOutput provide(com.batch.android.json.JSONObject):27:27 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/json/JSONObject;)Lcom/batch/android/t/b;"} +com.batch.android.localcampaigns.persistence.LocalCampaignsFilePersistence -> com.batch.android.u.a: +# {"id":"sourceFile","fileName":"LocalCampaignsFilePersistence.java"} + java.lang.String TAG -> a + java.lang.String PERSISTENCE_TMP_FILE_PREFIX -> b + java.lang.String PERSISTENCE_SAVE_VERSION_KEY -> c + int PERSISTENCE_CURRENT_FILE_VERSION -> d + 1:20:void ():0:19 -> + 1:170:com.batch.android.json.JSONObject loadData(android.content.Context,java.lang.String):0:169 -> a + 171:182:com.batch.android.json.JSONObject loadData(android.content.Context,java.lang.String):144:155 -> a + 183:302:void persistData(android.content.Context,com.batch.android.json.JSONObject,java.lang.String):0:119 -> a + 1:1:boolean hasSavedData(android.content.Context,java.lang.String):32:32 -> b + 1:183:void deleteData(android.content.Context,java.lang.String):0:182 -> c +com.batch.android.localcampaigns.persistence.LocalCampaignsPersistence -> com.batch.android.u.b: +# {"id":"sourceFile","fileName":"LocalCampaignsPersistence.java"} + com.batch.android.json.JSONObject loadData(android.content.Context,java.lang.String) -> a + void persistData(android.content.Context,com.batch.android.json.JSONObject,java.lang.String) -> a + boolean hasSavedData(android.content.Context,java.lang.String) -> b + void deleteData(android.content.Context,java.lang.String) -> c +com.batch.android.localcampaigns.persistence.PersistenceException -> com.batch.android.u.c: +# {"id":"sourceFile","fileName":"PersistenceException.java"} + 1:6:void ():0:5 -> + 7:15:void (java.lang.String):0:8 -> + 16:28:void (java.lang.String,java.lang.Throwable):0:12 -> + 29:45:void (java.lang.Throwable):0:16 -> +com.batch.android.localcampaigns.serialization.LocalCampaignDeserializer -> com.batch.android.v.a: +# {"id":"sourceFile","fileName":"LocalCampaignDeserializer.java"} + java.lang.String TAG -> a + 1:21:void ():0:20 -> + 1:113:com.batch.android.localcampaigns.model.LocalCampaign deserialize(com.batch.android.json.JSONObject):0:112 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/json/JSONObject;)Lcom/batch/android/s/a;"} + 114:114:com.batch.android.localcampaigns.model.LocalCampaign deserialize(com.batch.android.json.JSONObject):67:67 -> a + 115:115:com.batch.android.localcampaigns.model.LocalCampaign deserialize(com.batch.android.json.JSONObject):62:62 -> a + 116:116:com.batch.android.localcampaigns.model.LocalCampaign deserialize(com.batch.android.json.JSONObject):47:47 -> a + 117:117:com.batch.android.localcampaigns.model.LocalCampaign deserialize(com.batch.android.json.JSONObject):40:40 -> a + 118:118:com.batch.android.localcampaigns.model.LocalCampaign deserialize(com.batch.android.json.JSONObject):33:33 -> a + 119:251:java.util.List deserializeList(com.batch.android.json.JSONArray):0:132 -> a + 1:163:com.batch.android.localcampaigns.model.LocalCampaign$Output parseOutput(com.batch.android.json.JSONObject):0:162 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/json/JSONObject;)Lcom/batch/android/s/a$a;"} + 164:164:com.batch.android.localcampaigns.model.LocalCampaign$Output parseOutput(com.batch.android.json.JSONObject):150:150 -> b + 165:176:java.util.List parseTriggers(com.batch.android.json.JSONArray):175:186 -> b + 1:208:com.batch.android.localcampaigns.model.LocalCampaign$Trigger parseTrigger(com.batch.android.json.JSONObject):0:207 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/json/JSONObject;)Lcom/batch/android/s/a$c;"} + 209:221:com.batch.android.localcampaigns.model.LocalCampaign$Trigger parseTrigger(com.batch.android.json.JSONObject):207:219 -> c + 222:226:com.batch.android.localcampaigns.model.LocalCampaign$Trigger parseTrigger(com.batch.android.json.JSONObject):213:217 -> c + 227:227:com.batch.android.localcampaigns.model.LocalCampaign$Trigger parseTrigger(com.batch.android.json.JSONObject):215:215 -> c + 228:228:com.batch.android.localcampaigns.model.LocalCampaign$Trigger parseTrigger(com.batch.android.json.JSONObject):211:211 -> c + 229:229:com.batch.android.localcampaigns.model.LocalCampaign$Trigger parseTrigger(com.batch.android.json.JSONObject):202:202 -> c +com.batch.android.localcampaigns.serialization.LocalCampaignSerializer -> com.batch.android.v.b: +# {"id":"sourceFile","fileName":"LocalCampaignSerializer.java"} + 1:13:void ():0:12 -> + 1:96:com.batch.android.json.JSONObject parseOutput(com.batch.android.localcampaigns.model.LocalCampaign$Output):0:95 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/s/a$a;)Lcom/batch/android/json/JSONObject;"} + 97:226:com.batch.android.json.JSONObject parseTrigger(com.batch.android.localcampaigns.model.LocalCampaign$Trigger):0:129 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/s/a$c;)Lcom/batch/android/json/JSONObject;"} + 227:338:com.batch.android.json.JSONArray parseTriggers(java.util.List):0:111 -> a + 339:404:com.batch.android.json.JSONObject serialize(com.batch.android.localcampaigns.model.LocalCampaign):0:65 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/s/a;)Lcom/batch/android/json/JSONObject;"} + 1:80:com.batch.android.json.JSONArray serializeList(java.util.List):0:79 -> b +com.batch.android.localcampaigns.signal.EventTrackedSignal -> com.batch.android.w.a: +# {"id":"sourceFile","fileName":"EventTrackedSignal.java"} + java.lang.String name -> a + com.batch.android.json.JSONObject parameters -> b + 1:23:void (java.lang.String,com.batch.android.json.JSONObject):0:22 -> + 1:29:boolean satisfiesTrigger(com.batch.android.localcampaigns.model.LocalCampaign$Trigger):0:28 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/s/a$c;)Z"} +com.batch.android.localcampaigns.signal.NewSessionSignal -> com.batch.android.w.b: +# {"id":"sourceFile","fileName":"NewSessionSignal.java"} + 1:12:void ():0:11 -> + 1:16:boolean satisfiesTrigger(com.batch.android.localcampaigns.model.LocalCampaign$Trigger):0:15 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/s/a$c;)Z"} +com.batch.android.localcampaigns.signal.PublicEventTrackedSignal -> com.batch.android.w.c: +# {"id":"sourceFile","fileName":"PublicEventTrackedSignal.java"} + java.lang.String label -> c + 1:31:void (com.batch.android.localcampaigns.signal.EventTrackedSignal):0:30 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/w/a;)V"} + 32:32:void (com.batch.android.localcampaigns.signal.EventTrackedSignal):28:28 -> + 1:46:boolean isPublic(com.batch.android.localcampaigns.signal.EventTrackedSignal):0:45 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/w/a;)Z"} + 47:87:boolean satisfiesTrigger(com.batch.android.localcampaigns.model.LocalCampaign$Trigger):0:40 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/s/a$c;)Z"} +com.batch.android.localcampaigns.signal.Signal -> com.batch.android.w.d: +# {"id":"sourceFile","fileName":"Signal.java"} + boolean satisfiesTrigger(com.batch.android.localcampaigns.model.LocalCampaign$Trigger) -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/s/a$c;)Z"} +com.batch.android.localcampaigns.trigger.EventLocalCampaignTrigger -> com.batch.android.x.a: +# {"id":"sourceFile","fileName":"EventLocalCampaignTrigger.java"} + java.lang.String name -> a + java.lang.String label -> b + 1:30:void (java.lang.String,java.lang.String):0:29 -> + 1:41:boolean isSatisfied(java.lang.String,java.lang.String):0:40 -> a + 1:1:java.lang.String getType():49:49 -> k +com.batch.android.localcampaigns.trigger.NextSessionTrigger -> com.batch.android.x.b: +# {"id":"sourceFile","fileName":"NextSessionTrigger.java"} + 1:9:void ():0:8 -> + 1:1:java.lang.String getType():12:12 -> k +com.batch.android.messaging.AsyncImageDownloadTask -> com.batch.android.y.a: +# {"id":"sourceFile","fileName":"AsyncImageDownloadTask.java"} + com.batch.android.messaging.model.MessagingError lastError -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/d0/h;"} + java.lang.ref.WeakReference weakListener -> b + java.lang.String TAG -> c + 1:83:void (com.batch.android.messaging.AsyncImageDownloadTask$ImageDownloadListener):0:82 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/y/a$c;)V"} + 84:132:void (com.batch.android.messaging.AsyncImageDownloadTask$ImageDownloadListener):35:83 -> + 1:172:com.batch.android.messaging.AsyncImageDownloadTask$Result doInBackground(java.lang.String[]):0:171 -> doInBackground + # {"id":"com.android.tools.r8.residualsignature","signature":"([Ljava/lang/String;)Lcom/batch/android/y/a$d;"} + 173:205:com.batch.android.messaging.AsyncImageDownloadTask$Result doInBackground(java.lang.String[]):139:171 -> doInBackground + 206:236:com.batch.android.messaging.AsyncImageDownloadTask$Result doInBackground(java.lang.String[]):141:171 -> doInBackground + 237:256:com.batch.android.messaging.AsyncImageDownloadTask$Result doInBackground(java.lang.String[]):146:165 -> doInBackground + 257:268:com.batch.android.messaging.AsyncImageDownloadTask$Result doInBackground(java.lang.String[]):160:171 -> doInBackground + 269:277:com.batch.android.messaging.AsyncImageDownloadTask$Result doInBackground(java.lang.String[]):157:165 -> doInBackground + 278:289:com.batch.android.messaging.AsyncImageDownloadTask$Result doInBackground(java.lang.String[]):154:165 -> doInBackground + 290:299:com.batch.android.messaging.AsyncImageDownloadTask$Result doInBackground(java.lang.String[]):165:174 -> doInBackground + 300:300:com.batch.android.messaging.AsyncImageDownloadTask$Result doInBackground(java.lang.String[]):106:106 -> doInBackground + 301:331:java.lang.Object doInBackground(java.lang.Object[]):0:30 -> doInBackground + 1:187:void onPostExecute(com.batch.android.messaging.AsyncImageDownloadTask$Result):0:186 -> onPostExecute + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/y/a$d;)V"} + 188:218:void onPostExecute(java.lang.Object):0:30 -> onPostExecute + 1:91:void onPreExecute():0:90 -> onPreExecute +com.batch.android.messaging.AsyncImageDownloadTask$BitmapResult -> com.batch.android.y.a$a: +# {"id":"sourceFile","fileName":"AsyncImageDownloadTask.java"} + 1:60:void (java.lang.String,android.graphics.Bitmap):0:59 -> +com.batch.android.messaging.AsyncImageDownloadTask$GIFResult -> com.batch.android.y.a$b: +# {"id":"sourceFile","fileName":"AsyncImageDownloadTask.java"} + 1:67:void (java.lang.String,byte[]):0:66 -> +com.batch.android.messaging.AsyncImageDownloadTask$ImageDownloadListener -> com.batch.android.y.a$c: +# {"id":"sourceFile","fileName":"AsyncImageDownloadTask.java"} + void onImageDownloadError(com.batch.android.messaging.model.MessagingError) -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/h;)V"} + void onImageDownloadSuccess(com.batch.android.messaging.AsyncImageDownloadTask$Result) -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/y/a$d;)V"} + void onImageDownloadStart() -> c +com.batch.android.messaging.AsyncImageDownloadTask$Result -> com.batch.android.y.a$d: +# {"id":"sourceFile","fileName":"AsyncImageDownloadTask.java"} + java.lang.String key -> a + java.lang.Object value -> b + 1:45:void (java.lang.String,java.lang.Object):0:44 -> + 1:53:java.lang.Object get():0:52 -> a + 1:49:java.lang.String getKey():0:48 -> b +com.batch.android.messaging.ModalContentPanGestureDetector -> com.batch.android.y.b: +# {"id":"sourceFile","fileName":"ModalContentPanGestureDetector.java"} + com.batch.android.messaging.ModalContentPanGestureDetector$OnDismissListener dismissListener -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/y/b$a;"} + android.view.GestureDetector detector -> b + android.view.View targetView -> c + android.os.Vibrator vibrator -> d + boolean supportsAndroidXAnimation -> e + float initialSwipeXOffset -> f + float initialSwipeYOffset -> g + float initialInterceptXOffset -> h + float initialInterceptYOffset -> i + java.lang.Object[] cancellationAnimations -> j + boolean isPanning -> k + int touchSlop -> l + boolean shouldDismissOnTouchUp -> m + boolean allowHorizontalPanning -> n + long ANIMATION_DURATION -> o + long ANIMATION_DURATION_FAST -> p + float TRANSLATION_PAN_MULTIPLIER -> q + float SCALE_PAN_MULTIPLIER -> r + float DISMISSABLE_TARGET_ALPHA -> s + float DISMISS_THRESHOLD_MINIMUM_VELOCITY -> t + float SMALLEST_SCALE_RATIO -> u + float SCALE_RATIO_DISMISS_THRESHOLD -> v + float SPRING_STIFFNESS -> w + 1:101:void (android.content.Context,boolean):0:100 -> + 102:163:void (android.content.Context,boolean):52:113 -> + 1:126:void attach(com.batch.android.messaging.view.DelegatedTouchEventViewGroup,android.view.View):0:125 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e0/b;Landroid/view/View;)V"} + 127:273:void beginPan(float,float):0:146 -> a + 274:476:void cancelCancellationAnimation():0:202 -> a + 477:712:boolean onInterceptTouchEvent(android.view.MotionEvent,com.batch.android.messaging.view.DelegatedTouchEventViewGroup):0:235 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/view/MotionEvent;Lcom/batch/android/e0/b;)Z"} + 713:713:boolean onInterceptTouchEvent(android.view.MotionEvent,com.batch.android.messaging.view.DelegatedTouchEventViewGroup):213:213 -> a + 714:1067:boolean onTouchEvent(android.view.MotionEvent,com.batch.android.messaging.view.DelegatedTouchEventViewGroup,boolean):0:353 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/view/MotionEvent;Lcom/batch/android/e0/b;Z)Z"} + 1068:1120:boolean onTouchEvent(android.view.MotionEvent,com.batch.android.messaging.view.DelegatedTouchEventViewGroup,boolean):262:314 -> a + 1121:1156:boolean onTouchEvent(android.view.MotionEvent,com.batch.android.messaging.view.DelegatedTouchEventViewGroup,boolean):312:347 -> a + 1157:1256:boolean onTouchEvent(android.view.MotionEvent,com.batch.android.messaging.view.DelegatedTouchEventViewGroup,boolean):258:357 -> a + 1257:1386:void setDismissListener(com.batch.android.messaging.ModalContentPanGestureDetector$OnDismissListener):0:129 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/y/b$a;)V"} + 1:135:void dismiss():0:134 -> b + 136:275:boolean hasPassedTouchSlop(float,float):0:139 -> b + 1:369:void shouldDismissChanged():0:368 -> c + 1:174:void startCancelAnimation():0:173 -> d + 1:188:void startFallbackCancelAnimation():0:187 -> e + 1:4:void vibrate():372:375 -> f + 1:1:boolean onDown(android.view.MotionEvent):0:0 -> onDown + 1:413:boolean onFling(android.view.MotionEvent,android.view.MotionEvent,float,float):0:412 -> onFling + 1:1:void onLongPress(android.view.MotionEvent):0:0 -> onLongPress + 1:1:boolean onScroll(android.view.MotionEvent,android.view.MotionEvent,float,float):0:0 -> onScroll + 1:1:void onShowPress(android.view.MotionEvent):0:0 -> onShowPress + 1:1:boolean onSingleTapUp(android.view.MotionEvent):0:0 -> onSingleTapUp +com.batch.android.messaging.ModalContentPanGestureDetector$OnDismissListener -> com.batch.android.y.b$a: +# {"id":"sourceFile","fileName":"ModalContentPanGestureDetector.java"} + void onPanDismiss() -> e +com.batch.android.messaging.PayloadParser -> com.batch.android.y.c: +# {"id":"sourceFile","fileName":"PayloadParser.java"} + java.lang.String TAG -> a + 1:36:void ():0:35 -> + 1:358:com.batch.android.messaging.model.Action parseAction(com.batch.android.json.JSONObject):0:357 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/json/JSONObject;)Lcom/batch/android/d0/a;"} + 359:516:com.batch.android.messaging.model.AlertMessage parseAlertPayload(com.batch.android.json.JSONObject,com.batch.android.messaging.model.AlertMessage):0:157 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/json/JSONObject;Lcom/batch/android/d0/b;)Lcom/batch/android/d0/b;"} + 517:730:com.batch.android.messaging.model.BannerMessage parseBannerPayload(com.batch.android.json.JSONObject,com.batch.android.messaging.model.BannerMessage):0:213 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/json/JSONObject;Lcom/batch/android/d0/c;)Lcom/batch/android/d0/c;"} + 731:992:void parseBaseBannerPayload(com.batch.android.json.JSONObject,com.batch.android.messaging.model.BaseBannerMessage):0:261 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/json/JSONObject;Lcom/batch/android/d0/d;)V"} + 993:993:void parseBaseBannerPayload(com.batch.android.json.JSONObject,com.batch.android.messaging.model.BaseBannerMessage):258:258 -> a + 994:1014:void parseBaseBannerPayload(com.batch.android.json.JSONObject,com.batch.android.messaging.model.BaseBannerMessage):255:275 -> a + 1015:1399:android.text.Spanned parseHtmlString(java.lang.String):0:384 -> a + 1400:1696:com.batch.android.messaging.model.ImageMessage parseImagePayload(com.batch.android.json.JSONObject,com.batch.android.messaging.model.ImageMessage):0:296 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/json/JSONObject;Lcom/batch/android/d0/f;)Lcom/batch/android/d0/f;"} + 1697:1715:com.batch.android.messaging.model.ImageMessage parseImagePayload(com.batch.android.json.JSONObject,com.batch.android.messaging.model.ImageMessage):294:312 -> a + 1716:1720:com.batch.android.messaging.model.ImageMessage parseImagePayload(com.batch.android.json.JSONObject,com.batch.android.messaging.model.ImageMessage):303:307 -> a + 1721:1721:com.batch.android.messaging.model.ImageMessage parseImagePayload(com.batch.android.json.JSONObject,com.batch.android.messaging.model.ImageMessage):289:289 -> a + 1722:1941:com.batch.android.messaging.model.ModalMessage parseModalPayload(com.batch.android.json.JSONObject,com.batch.android.messaging.model.ModalMessage):0:219 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/json/JSONObject;Lcom/batch/android/d0/i;)Lcom/batch/android/d0/i;"} + 1942:2147:com.batch.android.messaging.model.UniversalMessage parseUniversalPayload(com.batch.android.json.JSONObject,com.batch.android.messaging.model.UniversalMessage):0:205 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/json/JSONObject;Lcom/batch/android/d0/j;)Lcom/batch/android/d0/j;"} + 2148:2491:com.batch.android.messaging.model.WebViewMessage parseWebViewPayload(com.batch.android.json.JSONObject,com.batch.android.messaging.model.WebViewMessage):0:343 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/json/JSONObject;Lcom/batch/android/d0/k;)Lcom/batch/android/d0/k;"} + 2492:2493:com.batch.android.messaging.model.WebViewMessage parseWebViewPayload(com.batch.android.json.JSONObject,com.batch.android.messaging.model.WebViewMessage):327:328 -> a + 1:139:com.batch.android.messaging.model.Message parseBasePayload(com.batch.android.json.JSONObject):0:138 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/json/JSONObject;)Lcom/batch/android/d0/g;"} + 140:140:com.batch.android.messaging.model.Message parseBasePayload(com.batch.android.json.JSONObject):111:111 -> b + 1:370:com.batch.android.messaging.model.CTA parseCTA(com.batch.android.json.JSONObject):0:369 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/json/JSONObject;)Lcom/batch/android/d0/e;"} + 1:87:com.batch.android.messaging.model.Message parsePayload(com.batch.android.json.JSONObject):0:86 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/json/JSONObject;)Lcom/batch/android/d0/g;"} + 88:88:com.batch.android.messaging.model.Message parsePayload(com.batch.android.json.JSONObject):49:49 -> d + 89:89:com.batch.android.messaging.model.Message parsePayload(com.batch.android.json.JSONObject):41:41 -> d +com.batch.android.messaging.PayloadParsingException -> com.batch.android.y.d: +# {"id":"sourceFile","fileName":"PayloadParsingException.java"} + 1:10:void ():0:9 -> + 11:23:void (java.lang.String):0:12 -> + 24:40:void (java.lang.String,java.lang.Throwable):0:16 -> + 41:61:void (java.lang.Throwable):0:20 -> +com.batch.android.messaging.Size2D -> com.batch.android.messaging.Size2D: +# {"id":"sourceFile","fileName":"Size2D.java"} + int width -> a + int height -> b + 1:1:void ():53:53 -> + 1:3:void (int,int):15:17 -> + 4:6:void (android.os.Parcel):20:22 -> + 1:5:boolean equals(java.lang.Object):30:34 -> equals + 1:1:int hashCode():39:39 -> hashCode + 1:2:void writeToParcel(android.os.Parcel,int):44:45 -> writeToParcel +com.batch.android.messaging.Size2D$1 -> com.batch.android.messaging.Size2D$a: +# {"id":"sourceFile","fileName":"Size2D.java"} + 1:1:void ():53:53 -> + 1:1:com.batch.android.messaging.Size2D createFromParcel(android.os.Parcel):56:56 -> a + 2:2:com.batch.android.messaging.Size2D[] newArray(int):61:61 -> a + 1:1:java.lang.Object createFromParcel(android.os.Parcel):53:53 -> createFromParcel + 1:1:java.lang.Object[] newArray(int):53:53 -> newArray +com.batch.android.messaging.WebViewActionListener -> com.batch.android.y.e: +# {"id":"sourceFile","fileName":"WebViewActionListener.java"} + void onCloseAction() -> a + void onDismissAction(java.lang.String) -> a + void onErrorAction(com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause,com.batch.android.messaging.model.MessagingError,java.lang.String) -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/BatchMessagingWebViewJavascriptBridge$e;Lcom/batch/android/d0/h;Ljava/lang/String;)V"} + void onOpenDeeplinkAction(java.lang.String,java.lang.Boolean,java.lang.String) -> a + void onPerformAction(java.lang.String,com.batch.android.json.JSONObject,java.lang.String) -> a +com.batch.android.messaging.WebViewHelper -> com.batch.android.y.f: +# {"id":"sourceFile","fileName":"WebViewHelper.java"} + 1:8:void ():0:7 -> + 1:14:java.lang.String getAnalyticsIDFromURL(java.lang.String):0:13 -> a +com.batch.android.messaging.css.CSSParsingException -> com.batch.android.z.a: +# {"id":"sourceFile","fileName":"CSSParsingException.java"} + 1:6:void ():0:5 -> + 7:15:void (java.lang.String):0:8 -> + 16:28:void (java.lang.String,java.lang.Throwable):0:12 -> + 29:45:void (java.lang.Throwable):0:16 -> +com.batch.android.messaging.css.DOMNode -> com.batch.android.z.b: +# {"id":"sourceFile","fileName":"DOMNode.java"} + java.lang.String type -> a + java.lang.String identifier -> b + java.util.List classes -> c + 1:19:void ():0:18 -> + 20:45:void (java.lang.String,java.lang.String[]):0:25 -> + 1:53:boolean matchesSelector(java.lang.String):0:52 -> a +com.batch.android.messaging.css.Declaration -> com.batch.android.z.c: +# {"id":"sourceFile","fileName":"Declaration.java"} + java.lang.String name -> a + java.lang.String value -> b + 1:4:void ():0:3 -> +com.batch.android.messaging.css.Document -> com.batch.android.z.d: +# {"id":"sourceFile","fileName":"Document.java"} + java.util.List rulesets -> a + java.util.List mediaQueries -> b + java.lang.String TAG -> c + java.util.regex.Pattern MEDIA_QUERY_PATTERN -> d + 1:1:void ():21:21 -> + 1:32:void ():0:31 -> + 1:37:java.util.Map getFlatRules(com.batch.android.messaging.css.DOMNode,android.graphics.Point):0:36 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/z/b;Landroid/graphics/Point;)Ljava/util/Map;"} + 38:179:java.util.Map getFlatRules(java.util.List):0:141 -> a + 180:360:java.util.List getRules(com.batch.android.messaging.css.DOMNode,java.util.List):0:180 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/z/b;Ljava/util/List;)Ljava/util/List;"} + 361:577:boolean matchesMediaQuery(java.lang.String,android.graphics.Point):0:216 -> a + 578:832:boolean matchesSizeMediaQuery(android.graphics.Point,java.lang.String,java.lang.String,java.lang.String,int):0:254 -> a + 1:152:java.util.List getRules(com.batch.android.messaging.css.DOMNode,android.graphics.Point):0:151 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/z/b;Landroid/graphics/Point;)Ljava/util/List;"} +com.batch.android.messaging.css.ImportFileProvider -> com.batch.android.z.e: +# {"id":"sourceFile","fileName":"ImportFileProvider.java"} + java.lang.String getContent(java.lang.String) -> a +com.batch.android.messaging.css.MediaQuery -> com.batch.android.z.f: +# {"id":"sourceFile","fileName":"MediaQuery.java"} + java.lang.String rule -> a + java.util.List rulesets -> b + 1:14:void ():0:13 -> +com.batch.android.messaging.css.Parser -> com.batch.android.z.g: +# {"id":"sourceFile","fileName":"Parser.java"} + com.batch.android.messaging.css.ImportFileProvider importFileProvider -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/z/e;"} + java.lang.String rawStylesheet -> b + com.batch.android.messaging.css.Parser$State state -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/z/g$c;"} + com.batch.android.messaging.css.Parser$Substate substate -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/z/g$d;"} + com.batch.android.messaging.css.MediaQuery currentMediaQuery -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/z/f;"} + com.batch.android.messaging.css.Ruleset currentRuleset -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/z/h;"} + com.batch.android.messaging.css.Declaration currentDeclaration -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/z/c;"} + com.batch.android.messaging.css.Document currentDocument -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/z/d;"} + java.lang.String currentToken -> i + boolean shouldMergePreviousToken -> j + java.util.regex.Pattern IMPORT_PATTERN -> k + 1:1:void ():12:12 -> + 1:31:void (com.batch.android.messaging.css.ImportFileProvider,java.lang.String):0:30 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/z/e;Ljava/lang/String;)V"} + 32:37:void (com.batch.android.messaging.css.ImportFileProvider,java.lang.String):28:33 -> + 1:120:void consumeSpecialToken(char):0:119 -> a + 121:121:void consumeSpecialToken(char):116:116 -> a + 122:122:void consumeSpecialToken(char):113:113 -> a + 123:123:void consumeSpecialToken(char):110:110 -> a + 124:124:void consumeSpecialToken(char):107:107 -> a + 125:221:void consumeToken(java.lang.String):0:96 -> a + 222:287:void fillImports():0:65 -> a + 288:294:void fillImports():63:69 -> a + 1:41:com.batch.android.messaging.css.Document parse():0:40 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/z/d;"} + 1:241:void recoverLineEndingIfPossible():0:240 -> c + 1:52:void reset():0:51 -> d + 1:18:void scan():73:90 -> e + 1:219:void switchOutOfPropertyNameState():0:218 -> f + 1:236:void switchOutOfPropertyValueState():0:235 -> g + 1:190:void switchOutOfRulesetState():0:189 -> h + 1:153:void switchToRulesetState():0:152 -> i + 1:1:void throwGenericParsingException():245:245 -> j +com.batch.android.messaging.css.Parser$1 -> com.batch.android.z.g$a: +# {"id":"sourceFile","fileName":"Parser.java"} + int[] $SwitchMap$com$batch$android$messaging$css$Parser$SpecialToken -> a + 1:1:void ():102:102 -> +com.batch.android.messaging.css.Parser$SpecialToken -> com.batch.android.z.g$b: +# {"id":"sourceFile","fileName":"Parser.java"} + com.batch.android.messaging.css.Parser$SpecialToken UNKNOWN -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/z/g$b;"} + com.batch.android.messaging.css.Parser$SpecialToken BLOCK_START -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/z/g$b;"} + com.batch.android.messaging.css.Parser$SpecialToken BLOCK_END -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/z/g$b;"} + com.batch.android.messaging.css.Parser$SpecialToken PROPERTY_SEPARATOR -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/z/g$b;"} + com.batch.android.messaging.css.Parser$SpecialToken PROPERTY_END -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/z/g$b;"} + com.batch.android.messaging.css.Parser$SpecialToken NEW_LINE -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/z/g$b;"} + com.batch.android.messaging.css.Parser$SpecialToken[] $VALUES -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/z/g$b;"} + 1:6:void ():265:270 -> + 7:7:void ():264:264 -> + 1:265:void (java.lang.String,int):0:264 -> + 1:265:com.batch.android.messaging.css.Parser$SpecialToken[] $values():0:264 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/z/g$b;"} + 266:551:com.batch.android.messaging.css.Parser$SpecialToken fromCharacter(char):0:285 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(C)Lcom/batch/android/z/g$b;"} + 552:554:com.batch.android.messaging.css.Parser$SpecialToken fromCharacter(char):279:281 -> a + 555:555:com.batch.android.messaging.css.Parser$SpecialToken fromCharacter(char):277:277 -> a + 556:564:com.batch.android.messaging.css.Parser$SpecialToken fromCharacter(char):275:283 -> a + 1:1:com.batch.android.messaging.css.Parser$SpecialToken valueOf(java.lang.String):264:264 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/z/g$b;"} + 1:1:com.batch.android.messaging.css.Parser$SpecialToken[] values():264:264 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/z/g$b;"} +com.batch.android.messaging.css.Parser$State -> com.batch.android.z.g$c: +# {"id":"sourceFile","fileName":"Parser.java"} + com.batch.android.messaging.css.Parser$State ROOT -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/z/g$c;"} + com.batch.android.messaging.css.Parser$State MEDIA_QUERY -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/z/g$c;"} + com.batch.android.messaging.css.Parser$State[] $VALUES -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/z/g$c;"} + 1:2:void ():253:254 -> + 3:3:void ():252:252 -> + 1:253:void (java.lang.String,int):0:252 -> + 1:253:com.batch.android.messaging.css.Parser$State[] $values():0:252 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/z/g$c;"} + 1:1:com.batch.android.messaging.css.Parser$State valueOf(java.lang.String):252:252 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/z/g$c;"} + 1:1:com.batch.android.messaging.css.Parser$State[] values():252:252 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/z/g$c;"} +com.batch.android.messaging.css.Parser$Substate -> com.batch.android.z.g$d: +# {"id":"sourceFile","fileName":"Parser.java"} + com.batch.android.messaging.css.Parser$Substate SELECTOR -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/z/g$d;"} + com.batch.android.messaging.css.Parser$Substate RULESET -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/z/g$d;"} + com.batch.android.messaging.css.Parser$Substate PROPERTY_NAME -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/z/g$d;"} + com.batch.android.messaging.css.Parser$Substate PROPERTY_VALUE -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/z/g$d;"} + com.batch.android.messaging.css.Parser$Substate[] $VALUES -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/z/g$d;"} + 1:4:void ():258:261 -> + 5:5:void ():257:257 -> + 1:258:void (java.lang.String,int):0:257 -> + 1:258:com.batch.android.messaging.css.Parser$Substate[] $values():0:257 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/z/g$d;"} + 1:1:com.batch.android.messaging.css.Parser$Substate valueOf(java.lang.String):257:257 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/z/g$d;"} + 1:1:com.batch.android.messaging.css.Parser$Substate[] values():257:257 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/z/g$d;"} +com.batch.android.messaging.css.Ruleset -> com.batch.android.z.h: +# {"id":"sourceFile","fileName":"Ruleset.java"} + java.lang.String selector -> a + java.util.List declarations -> b + 1:14:void ():0:13 -> +com.batch.android.messaging.css.Variable -> com.batch.android.z.i: +# {"id":"sourceFile","fileName":"Variable.java"} + 1:4:void ():0:3 -> +com.batch.android.messaging.css.builtin.BuiltinStyleProvider -> com.batch.android.a0.a: +# {"id":"sourceFile","fileName":"BuiltinStyleProvider.java"} + java.util.Map metaStyles -> a + 1:1:void ():15:15 -> + 1:14:void ():0:13 -> + 1:39:java.lang.String getContent(java.lang.String):0:38 -> a + 40:57:java.lang.String getContent(java.lang.String):38:55 -> a + 58:71:java.lang.String getContent(java.lang.String):46:59 -> a + 72:76:java.lang.String getContent(java.lang.String):44:48 -> a + 77:77:java.lang.String getContent(java.lang.String):42:42 -> a + 78:89:java.lang.String getContent(java.lang.String):40:51 -> a + 90:94:java.util.Map generateMetaStyles():66:70 -> a +com.batch.android.messaging.css.builtin.BuiltinStyles -> com.batch.android.a0.b: +# {"id":"sourceFile","fileName":"BuiltinStyles.java"} + java.lang.String GENERIC1_H_CTA -> a + java.lang.String GENERIC1_V_CTA -> b + java.lang.String GENERIC1_BASE -> c + java.lang.String BANNER1 -> d + java.lang.String MODAL1 -> e + java.lang.String BANNER_ICON_ADDON -> f + java.lang.String IMAGE1_BASE -> g + java.lang.String IMAGE1_DETACHED -> h + java.lang.String IMAGE1_FULLSCREEN -> i + java.lang.String WEBVIEW1 -> j + 1:9:void ():0:8 -> +com.batch.android.messaging.fragment.AlertTemplateFragment -> com.batch.android.b0.a: +# {"id":"sourceFile","fileName":"AlertTemplateFragment.java"} + java.lang.String TAG -> l + 1:30:void ():0:29 -> + 1:64:void lambda$onCreateDialog$0(android.content.DialogInterface,int):0:63 -> a + 65:135:void lambda$onCreateDialog$1(com.batch.android.messaging.model.AlertMessage,android.content.DialogInterface,int):0:70 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/b;Landroid/content/DialogInterface;I)V"} + 136:137:com.batch.android.messaging.fragment.AlertTemplateFragment newInstance(com.batch.android.BatchMessage,com.batch.android.messaging.model.AlertMessage):23:24 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/BatchMessage;Lcom/batch/android/d0/b;)Lcom/batch/android/b0/a;"} + 1:1:boolean canAutoClose():0:0 -> g + 1:1:int getAutoCloseDelayMillis():0:0 -> i + 1:1:void onAutoCloseCountdownStarted():0:0 -> l + 1:1:void performAutoClose():0:0 -> m + 1:79:android.app.Dialog onCreateDialog(android.os.Bundle):0:78 -> onCreateDialog +com.batch.android.messaging.fragment.BaseDialogFragment -> com.batch.android.b0.b: +# {"id":"sourceFile","fileName":"BaseDialogFragment.java"} + com.batch.android.messaging.model.Message messageModel -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/d0/g;"} + java.lang.ref.WeakReference eventListener -> b + boolean automaticallyBeginAutoClose -> c + long autoCloseAtUptime -> d + android.os.Handler autoCloseHandler -> e + com.batch.android.module.MessagingModule messagingModule -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/m0/h;"} + com.batch.android.MessagingAnalyticsDelegate analyticsDelegate -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/h;"} + android.util.LruCache imageCache -> h + java.lang.String TAG -> i + java.lang.String BUNDLE_KEY_MESSAGE_MODEL -> j + java.lang.String STATE_AUTOCLOSE_TARGET_UPTIME_KEY -> k + 1:53:void ():0:52 -> + 54:72:void ():37:55 -> + 1:122:void setDialogEventListener(com.batch.android.messaging.fragment.DialogEventListener):0:121 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/b0/c;)V"} + 123:185:void setMessageArguments(com.batch.android.BatchMessage,com.batch.android.messaging.model.Message):0:62 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/BatchMessage;Lcom/batch/android/d0/g;)V"} + 1:135:com.batch.android.messaging.AsyncImageDownloadTask$Result get(java.lang.String):0:134 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/y/a$d;"} + 136:264:void put(com.batch.android.messaging.AsyncImageDownloadTask$Result):0:128 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/y/a$d;)V"} + 1:210:void beginAutoCloseCountdown():0:209 -> f + boolean canAutoClose() -> g + 1:190:void dismissSafely():0:189 -> h + int getAutoCloseDelayMillis() -> i + 1:117:com.batch.android.messaging.model.Message getMessageModel():0:116 -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/d0/g;"} + 1:104:com.batch.android.BatchMessage getPayloadMessage():0:103 -> k + void onAutoCloseCountdownStarted() -> l + void performAutoClose() -> m + 1:217:void scheduleAutoCloseTask():0:216 -> n + 1:224:void unscheduleAutoCloseTask():0:223 -> o + 1:182:void onCancel(android.content.DialogInterface):0:181 -> onCancel + 1:86:void onCreate(android.os.Bundle):0:85 -> onCreate + 1:174:void onDismiss(android.content.DialogInterface):0:173 -> onDismiss + 1:97:void onSaveInstanceState(android.os.Bundle):0:96 -> onSaveInstanceState + 1:148:void onStart():0:147 -> onStart + 1:155:void onStop():0:154 -> onStop +com.batch.android.messaging.fragment.DialogEventListener -> com.batch.android.b0.c: +# {"id":"sourceFile","fileName":"DialogEventListener.java"} + void onDialogDismiss(androidx.fragment.app.DialogFragment) -> onDialogDismiss +com.batch.android.messaging.fragment.ImageTemplateFragment -> com.batch.android.b0.d: +# {"id":"sourceFile","fileName":"ImageTemplateFragment.java"} + com.batch.android.messaging.view.formats.ImageFormatView imageFormatView -> l + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/f0/c;"} + com.batch.android.messaging.css.Document style -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/z/d;"} + boolean darkStatusbar -> n + boolean showStatusbar -> o + boolean statusbarBackgroundTranslucent -> p + java.lang.Integer statusbarBackgroundColor -> q + android.graphics.Bitmap heroBitmap -> r + com.batch.android.messaging.AsyncImageDownloadTask heroDownloadTask -> s + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/y/a;"} + boolean dismissed -> t + java.lang.String TAG -> u + 1:62:void ():0:61 -> + 63:83:void ():42:62 -> + 1:169:android.view.View getImageFormatView(android.content.Context):0:168 -> a + 170:175:android.view.View getImageFormatView(android.content.Context):166:171 -> a + 176:401:void onCloseAction():0:225 -> a + 402:403:com.batch.android.messaging.fragment.ImageTemplateFragment newInstance(com.batch.android.BatchMessage,com.batch.android.messaging.model.ImageMessage):56:57 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/BatchMessage;Lcom/batch/android/d0/f;)Lcom/batch/android/b0/d;"} + 1:248:void onErrorAction(com.batch.android.messaging.model.MessagingError):0:247 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/h;)V"} + 249:487:void onGlobalAction():0:238 -> b + 1:254:void onImageDisplayedAction():0:253 -> d + 1:127:void dismiss():0:126 -> dismiss + 1:139:void dismissAllowingStateLoss():0:138 -> dismissAllowingStateLoss + 1:261:void onPanDismiss():0:260 -> e + 1:202:boolean canAutoClose():0:201 -> g + 1:145:void dismissSafely():0:144 -> h + 1:207:int getAutoCloseDelayMillis():0:206 -> i + 1:196:void onAutoCloseCountdownStarted():0:195 -> l + 1:215:void performAutoClose():0:214 -> m + 1:78:void onCreate(android.os.Bundle):0:77 -> onCreate + 1:90:android.view.View onCreateView(android.view.LayoutInflater,android.view.ViewGroup,android.os.Bundle):0:89 -> onCreateView + 1:110:void onDestroyView():0:109 -> onDestroyView + 1:115:void onDismiss(android.content.DialogInterface):0:114 -> onDismiss + 1:99:void onStart():0:98 -> onStart + 1:185:com.batch.android.messaging.css.Document getStyle():0:184 -> p + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/z/d;"} + 186:193:com.batch.android.messaging.css.Document getStyle():180:187 -> p +com.batch.android.messaging.fragment.ListenableDialog -> com.batch.android.b0.e: +# {"id":"sourceFile","fileName":"ListenableDialog.java"} + void setDialogEventListener(com.batch.android.messaging.fragment.DialogEventListener) -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/b0/c;)V"} +com.batch.android.messaging.fragment.ModalTemplateFragment -> com.batch.android.b0.f: +# {"id":"sourceFile","fileName":"ModalTemplateFragment.java"} + com.batch.android.messaging.view.formats.BannerView bannerView -> l + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/f0/a;"} + com.batch.android.messaging.css.Document style -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/z/d;"} + boolean darkStatusbar -> n + boolean showStatusbar -> o + boolean statusbarBackgroundTranslucent -> p + java.lang.Integer statusbarBackgroundColor -> q + android.graphics.Bitmap heroBitmap -> r + com.batch.android.messaging.AsyncImageDownloadTask heroDownloadTask -> s + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/y/a;"} + boolean dismissed -> t + java.lang.String TAG -> u + 1:68:void ():0:67 -> + 69:80:void ():48:59 -> + 1:185:android.view.View getBannerView(android.content.Context):0:184 -> a + 186:191:android.view.View getBannerView(android.content.Context):182:187 -> a + 192:473:void onCTAAction(int,com.batch.android.messaging.model.CTA):0:281 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(ILcom/batch/android/d0/e;)V"} + 474:746:void onCloseAction():0:272 -> a + 747:748:com.batch.android.messaging.fragment.ModalTemplateFragment newInstance(com.batch.android.BatchMessage,com.batch.android.messaging.model.ModalMessage):62:63 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/BatchMessage;Lcom/batch/android/d0/i;)Lcom/batch/android/b0/f;"} + 1:295:void onGlobalAction():0:294 -> b + 1:145:void dismiss():0:144 -> dismiss + 1:157:void dismissAllowingStateLoss():0:156 -> dismissAllowingStateLoss + 1:303:void onPanDismiss():0:302 -> e + 1:249:boolean canAutoClose():0:248 -> g + 1:163:void dismissSafely():0:162 -> h + 1:254:int getAutoCloseDelayMillis():0:253 -> i + 1:243:void onAutoCloseCountdownStarted():0:242 -> l + 1:262:void performAutoClose():0:261 -> m + 1:76:void onCreate(android.os.Bundle):0:75 -> onCreate + 77:83:void onCreate(android.os.Bundle):73:79 -> onCreate + 1:93:android.app.Dialog onCreateDialog(android.os.Bundle):0:92 -> onCreateDialog + 1:108:android.view.View onCreateView(android.view.LayoutInflater,android.view.ViewGroup,android.os.Bundle):0:107 -> onCreateView + 1:128:void onDestroyView():0:127 -> onDestroyView + 1:133:void onDismiss(android.content.DialogInterface):0:132 -> onDismiss + 1:117:void onStart():0:116 -> onStart + 1:201:com.batch.android.messaging.css.Document getStyle():0:200 -> p + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/z/d;"} + 202:209:com.batch.android.messaging.css.Document getStyle():196:203 -> p + 1:232:void refreshStatusbarStyle():0:231 -> q +com.batch.android.messaging.fragment.UniversalTemplateFragment -> com.batch.android.b0.g: +# {"id":"sourceFile","fileName":"UniversalTemplateFragment.java"} + com.batch.android.messaging.view.formats.UniversalRootView view -> l + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/f0/d;"} + com.batch.android.messaging.css.Document style -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/z/d;"} + boolean darkStatusbar -> n + boolean showStatusbar -> o + boolean statusbarBackgroundTranslucent -> p + java.lang.Integer statusbarBackgroundColor -> q + com.batch.android.messaging.AsyncImageDownloadTask$Result heroDownloadResult -> r + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/y/a$d;"} + com.batch.android.messaging.AsyncImageDownloadTask heroDownloadTask -> s + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/y/a;"} + android.media.MediaPlayer mediaPlayer -> t + boolean mediaPlayerPrepared -> u + android.view.Surface videoSurface -> v + boolean dismissed -> w + java.lang.String TAG -> x + java.lang.String BUNDLE_KEY_MESSAGE_MODEL -> y + 1:83:void ():0:82 -> + 84:99:void ():59:74 -> + 1:243:android.view.View getUniversalView(android.content.Context):0:242 -> a + 244:596:void onCTAAction(int,com.batch.android.messaging.model.CTA):0:352 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(ILcom/batch/android/d0/e;)V"} + 597:937:void onCloseAction():0:340 -> a + 938:1309:void onImageDownloadError(com.batch.android.messaging.model.MessagingError):0:371 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/h;)V"} + 1310:1675:void onImageDownloadSuccess(com.batch.android.messaging.AsyncImageDownloadTask$Result):0:365 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/y/a$d;)V"} + 1676:1677:com.batch.android.messaging.fragment.UniversalTemplateFragment newInstance(com.batch.android.BatchMessage,com.batch.android.messaging.model.UniversalMessage):77:78 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/BatchMessage;Lcom/batch/android/d0/j;)Lcom/batch/android/b0/g;"} + 1:377:void displayImage(com.batch.android.messaging.AsyncImageDownloadTask$Result):0:376 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/y/a$d;)V"} + 378:736:void onImageDownloadStart():0:358 -> c + 1:209:void dismiss():0:208 -> dismiss + 1:221:void dismissAllowingStateLoss():0:220 -> dismissAllowingStateLoss + 1:316:boolean canAutoClose():0:315 -> g + 1:227:void dismissSafely():0:226 -> h + 1:321:int getAutoCloseDelayMillis():0:320 -> i + 1:310:void onAutoCloseCountdownStarted():0:309 -> l + 1:329:void performAutoClose():0:328 -> m + 1:93:void onCreate(android.os.Bundle):0:92 -> onCreate + 94:105:void onCreate(android.os.Bundle):88:99 -> onCreate + 1:113:android.app.Dialog onCreateDialog(android.os.Bundle):0:112 -> onCreateDialog + 1:172:android.view.View onCreateView(android.view.LayoutInflater,android.view.ViewGroup,android.os.Bundle):0:171 -> onCreateView + 1:185:void onDestroyView():0:184 -> onDestroyView + 1:196:void onDismiss(android.content.DialogInterface):0:195 -> onDismiss + 1:385:void onPrepared(android.media.MediaPlayer):0:384 -> onPrepared + 1:404:void onSurfaceTextureAvailable(android.graphics.SurfaceTexture,int,int):0:403 -> onSurfaceTextureAvailable + 1:418:boolean onSurfaceTextureDestroyed(android.graphics.SurfaceTexture):0:417 -> onSurfaceTextureDestroyed + 1:1:void onSurfaceTextureSizeChanged(android.graphics.SurfaceTexture,int,int):0:0 -> onSurfaceTextureSizeChanged + 1:1:void onSurfaceTextureUpdated(android.graphics.SurfaceTexture):0:0 -> onSurfaceTextureUpdated + 1:255:com.batch.android.messaging.css.Document getStyle():0:254 -> p + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/z/d;"} + 256:263:com.batch.android.messaging.css.Document getStyle():250:257 -> p + 1:286:void refreshStatusbarStyle():0:285 -> q + 1:297:boolean shouldWaitForHeroImage():0:296 -> r + 1:393:void startPlayingVideo():0:392 -> s +com.batch.android.messaging.fragment.WebViewTemplateFragment -> com.batch.android.b0.h: +# {"id":"sourceFile","fileName":"WebViewTemplateFragment.java"} + com.batch.android.messaging.view.formats.WebFormatView webView -> l + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/f0/e;"} + com.batch.android.messaging.css.Document style -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/z/d;"} + boolean darkStatusbar -> n + boolean showStatusbar -> o + boolean statusbarBackgroundTranslucent -> p + java.lang.Integer statusbarBackgroundColor -> q + boolean dismissed -> r + int developmentMenuReloadItemID -> s + java.lang.String TAG -> t + 1:76:void ():0:75 -> + 77:96:void ():57:76 -> + 1:217:android.view.View getWebFormatView(android.content.Context):0:216 -> a + 218:223:android.view.View getWebFormatView(android.content.Context):214:219 -> a + 224:224:void lambda$showDevelopmentError$0(android.content.DialogInterface,int):0:0 -> a + 225:552:void lambda$showDevelopmentError$1(com.batch.android.messaging.model.MessagingError,android.content.DialogInterface):0:327 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/h;Landroid/content/DialogInterface;)V"} + 553:891:void onCloseAction():0:338 -> a + 892:1236:void onDismissAction(java.lang.String):0:344 -> a + 1237:1593:void onErrorAction(com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause,com.batch.android.messaging.model.MessagingError,java.lang.String):0:356 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/BatchMessagingWebViewJavascriptBridge$e;Lcom/batch/android/d0/h;Ljava/lang/String;)V"} + 1594:1972:void onOpenDeeplinkAction(java.lang.String,java.lang.Boolean,java.lang.String):0:378 -> a + 1973:2365:void onPerformAction(java.lang.String,com.batch.android.json.JSONObject,java.lang.String):0:392 -> a + 2366:2367:com.batch.android.messaging.fragment.WebViewTemplateFragment newInstance(com.batch.android.BatchMessage,com.batch.android.messaging.model.WebViewMessage):70:71 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/BatchMessage;Lcom/batch/android/d0/k;)Lcom/batch/android/b0/h;"} + 1:17:boolean showDevelopmentError(com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause,com.batch.android.messaging.model.MessagingError,java.lang.String):284:300 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/BatchMessagingWebViewJavascriptBridge$e;Lcom/batch/android/d0/h;Ljava/lang/String;)Z"} + 18:18:boolean showDevelopmentError(com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause,com.batch.android.messaging.model.MessagingError,java.lang.String):292:292 -> b + 19:19:boolean showDevelopmentError(com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause,com.batch.android.messaging.model.MessagingError,java.lang.String):289:289 -> b + 20:63:boolean showDevelopmentError(com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause,com.batch.android.messaging.model.MessagingError,java.lang.String):286:329 -> b + 1:273:void dismissForError(com.batch.android.messaging.model.MessagingError):0:272 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/h;)V"} + 1:177:void dismiss():0:176 -> dismiss + 1:189:void dismissAllowingStateLoss():0:188 -> dismissAllowingStateLoss + 1:1:boolean canAutoClose():0:0 -> g + 1:195:void dismissSafely():0:194 -> h + 1:1:int getAutoCloseDelayMillis():0:0 -> i + 1:1:void onAutoCloseCountdownStarted():0:0 -> l + 1:1:void performAutoClose():0:0 -> m + 1:84:void onCreate(android.os.Bundle):0:83 -> onCreate + 1:154:void onCreateContextMenu(android.view.ContextMenu,android.view.View,android.view.ContextMenu$ContextMenuInfo):0:153 -> onCreateContextMenu + 1:130:android.app.Dialog onCreateDialog(android.os.Bundle):0:129 -> onCreateDialog + 1:108:android.view.View onCreateView(android.view.LayoutInflater,android.view.ViewGroup,android.os.Bundle):0:107 -> onCreateView + 1:143:void onDestroyView():0:142 -> onDestroyView + 1:162:boolean onMenuItemClick(android.view.MenuItem):0:161 -> onMenuItemClick + 1:117:void onSaveInstanceState(android.os.Bundle):0:116 -> onSaveInstanceState + 1:264:com.batch.android.messaging.css.Document getStyle():0:263 -> p + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/z/d;"} + 265:272:com.batch.android.messaging.css.Document getStyle():259:266 -> p + 1:249:void refreshStatusbarStyle():0:248 -> q +com.batch.android.messaging.fragment.WebViewTemplateFragment$1 -> com.batch.android.b0.h$a: +# {"id":"sourceFile","fileName":"WebViewTemplateFragment.java"} + int[] $SwitchMap$com$batch$android$BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause -> a + 1:1:void ():284:284 -> +com.batch.android.messaging.gif.BasicBitmapProvider -> com.batch.android.c0.a: +# {"id":"sourceFile","fileName":"BasicBitmapProvider.java"} + 1:10:void ():0:9 -> + 1:15:android.graphics.Bitmap obtain(int,int,android.graphics.Bitmap$Config):0:14 -> a + 16:41:byte[] obtainByteArray(int):0:25 -> a + 42:61:void release(android.graphics.Bitmap):0:19 -> a + 62:62:void release(byte[]):0:0 -> a + 63:63:void release(int[]):0:0 -> a + 1:37:int[] obtainIntArray(int):0:36 -> b +com.batch.android.messaging.gif.GifDecoder -> com.batch.android.c0.b: +# {"id":"sourceFile","fileName":"GifDecoder.java"} + int STATUS_OK -> a + int STATUS_FORMAT_ERROR -> b + int STATUS_OPEN_ERROR -> c + int STATUS_PARTIAL_DECODE -> d + int TOTAL_ITERATION_COUNT_FOREVER -> e + int getDelay(int) -> a + int read(java.io.InputStream,int) -> a + int read(byte[]) -> a + void setData(com.batch.android.messaging.gif.GifHeader,java.nio.ByteBuffer) -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/c0/e;Ljava/nio/ByteBuffer;)V"} + void setData(com.batch.android.messaging.gif.GifHeader,java.nio.ByteBuffer,int) -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/c0/e;Ljava/nio/ByteBuffer;I)V"} + void setData(com.batch.android.messaging.gif.GifHeader,byte[]) -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/c0/e;[B)V"} + void setDefaultBitmapConfig(android.graphics.Bitmap$Config) -> a + void clear() -> clear + java.nio.ByteBuffer getData() -> e + int getCurrentFrameIndex() -> f + int getFrameCount() -> g + int getByteSize() -> h + int getNextDelay() -> i + int getLoopCount() -> j + android.graphics.Bitmap getNextFrame() -> k + int getWidth() -> l + void advance() -> m + int getNetscapeLoopCount() -> n + int getTotalIterationCount() -> o + int getHeight() -> p + void resetFrameIndex() -> q + int getStatus() -> r +com.batch.android.messaging.gif.GifDecoder$BitmapProvider -> com.batch.android.c0.b$a: +# {"id":"sourceFile","fileName":"GifDecoder.java"} + android.graphics.Bitmap obtain(int,int,android.graphics.Bitmap$Config) -> a + byte[] obtainByteArray(int) -> a + void release(android.graphics.Bitmap) -> a + void release(byte[]) -> a + void release(int[]) -> a + int[] obtainIntArray(int) -> b +com.batch.android.messaging.gif.GifDecoder$GifDecodeStatus -> com.batch.android.c0.b$b: +# {"id":"sourceFile","fileName":"GifDecoder.java"} +com.batch.android.messaging.gif.GifDrawable -> com.batch.android.c0.c: +# {"id":"sourceFile","fileName":"GifDrawable.java"} + android.graphics.Paint paint -> a + int dpi -> b + boolean animating -> c + boolean ranOutOfMemory -> d + com.batch.android.messaging.gif.GifDecoder gifDecoder -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/c0/b;"} + com.batch.android.messaging.gif.GifDrawable$FrameInfo currentFrame -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/c0/c$b;"} + java.util.Queue nextFrames -> g + long nextFrameDeadline -> h + android.os.Handler mainThreadHandler -> i + java.lang.Runnable produceNextFrameRunnable -> j + java.util.concurrent.Executor frameProducerExecutor -> k + int BUFFER_SIZE -> l + int MESSAGE_FRAME_PRODUCED -> m + int MESSAGE_RAN_OUT_OF_MEMORY -> n + 1:60:void (android.content.Context,com.batch.android.messaging.gif.GifDecoder):0:59 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/c0/b;)V"} + 61:87:void (android.content.Context,com.batch.android.messaging.gif.GifDecoder):39:65 -> + 1:27:void access$000(com.batch.android.messaging.gif.GifDrawable,com.batch.android.messaging.gif.GifDrawable$FrameInfo):0:26 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/c0/c;Lcom/batch/android/c0/c$b;)V"} + 28:54:void access$100(com.batch.android.messaging.gif.GifDrawable):0:26 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/c0/c;)V"} + 55:144:void onFrameProduced(com.batch.android.messaging.gif.GifDrawable$FrameInfo):0:89 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/c0/c$b;)V"} + 145:228:void produceNextFrame():0:83 -> a + 1:139:void ranOutOfMemory():0:138 -> b + 1:122:void requestNewFrameIfNeeded():0:121 -> c + 1:153:void draw(android.graphics.Canvas):0:152 -> draw + 1:179:int getIntrinsicHeight():0:178 -> getIntrinsicHeight + 1:188:int getIntrinsicWidth():0:187 -> getIntrinsicWidth + 1:167:int getOpacity():0:166 -> getOpacity + 1:211:boolean isRunning():0:210 -> isRunning + 1:159:void setAlpha(int):0:158 -> setAlpha + 1:1:void setColorFilter(android.graphics.ColorFilter):0:0 -> setColorFilter + 1:201:void start():0:200 -> start + 1:206:void stop():0:205 -> stop +com.batch.android.messaging.gif.GifDrawable$1 -> com.batch.android.c0.c$a: +# {"id":"sourceFile","fileName":"GifDrawable.java"} + com.batch.android.messaging.gif.GifDrawable this$0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/c0/c;"} + 1:45:void (com.batch.android.messaging.gif.GifDrawable,android.os.Looper):0:44 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/c0/c;Landroid/os/Looper;)V"} + 1:51:void handleMessage(android.os.Message):0:50 -> handleMessage +com.batch.android.messaging.gif.GifDrawable$FrameInfo -> com.batch.android.c0.c$b: +# {"id":"sourceFile","fileName":"GifDrawable.java"} + android.graphics.Bitmap bitmap -> a + int delay -> b + 1:221:void (android.graphics.Bitmap,int):0:220 -> +com.batch.android.messaging.gif.GifFrame -> com.batch.android.c0.d: +# {"id":"sourceFile","fileName":"GifFrame.java"} + int ix -> a + int iy -> b + int iw -> c + int ih -> d + boolean interlace -> e + boolean transparency -> f + int dispose -> g + int transIndex -> h + int delay -> i + int bufferFrameStart -> j + int[] lct -> k + int DISPOSAL_UNSPECIFIED -> l + int DISPOSAL_NONE -> m + int DISPOSAL_BACKGROUND -> n + int DISPOSAL_PREVIOUS -> o + 1:14:void ():0:13 -> +com.batch.android.messaging.gif.GifFrame$GifDisposalMethod -> com.batch.android.c0.d$a: +# {"id":"sourceFile","fileName":"GifFrame.java"} +com.batch.android.messaging.gif.GifHeader -> com.batch.android.c0.e: +# {"id":"sourceFile","fileName":"GifHeader.java"} + int[] gct -> a + int status -> b + int frameCount -> c + com.batch.android.messaging.gif.GifFrame currentFrame -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/c0/d;"} + java.util.List frames -> e + int width -> f + int height -> g + boolean gctFlag -> h + int gctSize -> i + int bgIndex -> j + int pixelAspect -> k + int bgColor -> l + int loopCount -> m + int NETSCAPE_LOOP_COUNT_FOREVER -> n + int NETSCAPE_LOOP_COUNT_DOES_NOT_EXIST -> o + 1:66:void ():0:65 -> + 1:69:int getHeight():0:68 -> a + 1:77:int getNumFrames():0:76 -> b + 1:85:int getStatus():0:84 -> c + 1:73:int getWidth():0:72 -> d +com.batch.android.messaging.gif.GifHeaderParser -> com.batch.android.c0.f: +# {"id":"sourceFile","fileName":"GifHeaderParser.java"} + byte[] block -> a + java.nio.ByteBuffer rawData -> b + com.batch.android.messaging.gif.GifHeader header -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/c0/e;"} + int blockSize -> d + java.lang.String TAG -> e + int MASK_INT_LOWEST_BYTE -> f + int IMAGE_SEPARATOR -> g + int EXTENSION_INTRODUCER -> h + int TRAILER -> i + int LABEL_GRAPHIC_CONTROL_EXTENSION -> j + int LABEL_APPLICATION_EXTENSION -> k + int LABEL_COMMENT_EXTENSION -> l + int LABEL_PLAIN_TEXT_EXTENSION -> m + int GCE_MASK_DISPOSAL_METHOD -> n + int GCE_DISPOSAL_METHOD_SHIFT -> o + int GCE_MASK_TRANSPARENT_COLOR_FLAG -> p + int DESCRIPTOR_MASK_LCT_FLAG -> q + int DESCRIPTOR_MASK_INTERLACE_FLAG -> r + int DESCRIPTOR_MASK_LCT_SIZE -> s + int LSD_MASK_GCT_FLAG -> t + int LSD_MASK_GCT_SIZE -> u + int MIN_FRAME_DELAY -> v + int DEFAULT_FRAME_DELAY -> w + int MAX_BLOCK_SIZE -> x + 1:135:void ():0:134 -> + 1:163:void clear():0:162 -> a + 164:616:int[] readColorTable(int):0:452 -> a + 617:772:com.batch.android.messaging.gif.GifHeaderParser setData(byte[]):0:155 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"([B)Lcom/batch/android/c0/f;"} + 773:775:com.batch.android.messaging.gif.GifHeader parse(java.nio.ByteBuffer):137:139 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/nio/ByteBuffer;)Lcom/batch/android/c0/e;"} + 1:527:boolean err():0:526 -> b + 528:797:void readContents(int):0:269 -> b + 798:832:void readContents(int):225:259 -> b + 833:846:void readContents(int):239:252 -> b + 847:867:void readContents(int):235:255 -> b + 868:1014:com.batch.android.messaging.gif.GifHeaderParser setData(java.nio.ByteBuffer):0:146 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/nio/ByteBuffer;)Lcom/batch/android/c0/f;"} + 1:202:boolean isAnimated():0:201 -> c + 1:190:com.batch.android.messaging.gif.GifHeader parseHeader():0:189 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/c0/e;"} + 191:191:com.batch.android.messaging.gif.GifHeader parseHeader():175:175 -> d + 1:513:int read():0:512 -> e + 1:359:void readBitmap():0:358 -> f + 1:500:void readBlock():0:499 -> g + 1:209:void readContents():0:208 -> h + 1:311:void readGraphicControlExt():0:310 -> i + 1:12:void readHeader():380:391 -> j + 1:420:void readLSD():0:419 -> k + 1:374:void readNetscapeExt():0:373 -> l + 1:523:int readShort():0:522 -> m + 1:170:void reset():0:169 -> n + 1:477:void skip():0:476 -> o + 1:466:void skipImageData():0:465 -> p +com.batch.android.messaging.gif.GifHelper -> com.batch.android.c0.g: +# {"id":"sourceFile","fileName":"GifHelper.java"} + int NEEDED_BYTES_FOR_TYPE_CHECK -> a + 1:9:void ():0:8 -> + 1:40:boolean dataStartsWith(int[],byte[]):0:39 -> a + 41:98:com.batch.android.messaging.gif.GifDrawable getDrawableForBytes(android.content.Context,byte[],boolean):0:57 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;[BZ)Lcom/batch/android/c0/c;"} + 99:125:boolean isPotentiallyAGif(int[]):0:26 -> a +com.batch.android.messaging.gif.StandardGifDecoder -> com.batch.android.c0.h: +# {"id":"sourceFile","fileName":"StandardGifDecoder.java"} + java.lang.String TAG -> A + int MAX_STACK_SIZE -> B + int NULL_CODE -> C + int INITIAL_FRAME_POINTER -> D + int BYTES_PER_INTEGER -> E + int MASK_INT_LOWEST_BYTE -> F + int COLOR_TRANSPARENT_BLACK -> G + int[] act -> f + int[] pct -> g + com.batch.android.messaging.gif.GifDecoder$BitmapProvider bitmapProvider -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/c0/b$a;"} + java.nio.ByteBuffer rawData -> i + byte[] block -> j + com.batch.android.messaging.gif.GifHeaderParser parser -> k + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/c0/f;"} + short[] prefix -> l + byte[] suffix -> m + byte[] pixelStack -> n + byte[] mainPixels -> o + int[] mainScratch -> p + int framePointer -> q + com.batch.android.messaging.gif.GifHeader header -> r + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/c0/e;"} + android.graphics.Bitmap previousImage -> s + boolean savePrevious -> t + int status -> u + int sampleSize -> v + int downsampledHeight -> w + int downsampledWidth -> x + java.lang.Boolean isFirstFrameTransparent -> y + android.graphics.Bitmap$Config bitmapConfig -> z + 1:1:void ():0:0 -> + 1:158:void (com.batch.android.messaging.gif.GifDecoder$BitmapProvider):0:157 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/c0/b$a;)V"} + 159:225:void (com.batch.android.messaging.gif.GifDecoder$BitmapProvider):93:159 -> + 226:370:void (com.batch.android.messaging.gif.GifDecoder$BitmapProvider,com.batch.android.messaging.gif.GifHeader,java.nio.ByteBuffer):0:144 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/c0/b$a;Lcom/batch/android/c0/e;Ljava/nio/ByteBuffer;)V"} + 371:525:void (com.batch.android.messaging.gif.GifDecoder$BitmapProvider,com.batch.android.messaging.gif.GifHeader,java.nio.ByteBuffer,int):0:154 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/c0/b$a;Lcom/batch/android/c0/e;Ljava/nio/ByteBuffer;I)V"} + 526:665:void (com.batch.android.messaging.gif.GifDecoder$BitmapProvider,java.nio.ByteBuffer):0:139 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/c0/b$a;Ljava/nio/ByteBuffer;)V"} + 1:703:int averageColorsNear(int,int,int):0:702 -> a + 704:1357:void copyCopyIntoScratchRobust(com.batch.android.messaging.gif.GifFrame):0:653 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/c0/d;)V"} + 1358:1550:int getDelay(int):0:192 -> a + 1551:1958:com.batch.android.messaging.gif.GifHeaderParser getHeaderParser():0:407 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/c0/f;"} + 1959:2295:int read(java.io.InputStream,int):0:336 -> a + 2296:2714:int read(byte[]):0:418 -> a + 2715:3081:void setData(com.batch.android.messaging.gif.GifHeader,java.nio.ByteBuffer):0:366 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/c0/e;Ljava/nio/ByteBuffer;)V"} + 3082:3481:void setData(com.batch.android.messaging.gif.GifHeader,java.nio.ByteBuffer,int):0:399 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/c0/e;Ljava/nio/ByteBuffer;I)V"} + 3482:3482:void setData(com.batch.android.messaging.gif.GifHeader,java.nio.ByteBuffer,int):372:372 -> a + 3483:3844:void setData(com.batch.android.messaging.gif.GifHeader,byte[]):0:361 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/c0/e;[B)V"} + 3845:4275:void setDefaultBitmapConfig(android.graphics.Bitmap$Config):0:430 -> a + 4276:4762:android.graphics.Bitmap setPixels(com.batch.android.messaging.gif.GifFrame,com.batch.android.messaging.gif.GifFrame):0:486 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/c0/d;Lcom/batch/android/c0/d;)Landroid/graphics/Bitmap;"} + 4763:4781:android.graphics.Bitmap setPixels(com.batch.android.messaging.gif.GifFrame,com.batch.android.messaging.gif.GifFrame):483:501 -> a + 4782:4797:android.graphics.Bitmap setPixels(com.batch.android.messaging.gif.GifFrame,com.batch.android.messaging.gif.GifFrame):499:514 -> a + 1:561:void copyIntoScratchFast(com.batch.android.messaging.gif.GifFrame):0:560 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/c0/d;)V"} + 562:1428:android.graphics.Bitmap getNextBitmap():0:866 -> b + 1:840:void decodeBitmapData(com.batch.android.messaging.gif.GifFrame):0:839 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/c0/d;)V"} + 841:1700:int readBlock():0:859 -> c + 1:356:void clear():0:355 -> clear + 1:847:int readByte():0:846 -> d + 1:176:java.nio.ByteBuffer getData():0:175 -> e + 1:214:int getCurrentFrameIndex():0:213 -> f + 1:209:int getFrameCount():0:208 -> g + 1:249:int getByteSize():0:248 -> h + 1:204:int getNextDelay():0:203 -> i + 1:225:int getLoopCount():0:224 -> j + 1:305:android.graphics.Bitmap getNextFrame():0:304 -> k + 306:307:android.graphics.Bitmap getNextFrame():264:265 -> k + 1:165:int getWidth():0:164 -> l + 1:186:void advance():0:185 -> m + 1:233:int getNetscapeLoopCount():0:232 -> n + 1:238:int getTotalIterationCount():0:237 -> o + 1:170:int getHeight():0:169 -> p + 1:219:void resetFrameIndex():0:218 -> q + 1:181:int getStatus():0:180 -> r +com.batch.android.messaging.model.Action -> com.batch.android.d0.a: +# {"id":"sourceFile","fileName":"Action.java"} + java.lang.String action -> a + com.batch.android.json.JSONObject args -> b + 1:16:void (java.lang.String,com.batch.android.json.JSONObject):0:15 -> + 1:20:boolean isDismissAction():0:19 -> a +com.batch.android.messaging.model.AlertMessage -> com.batch.android.d0.b: +# {"id":"sourceFile","fileName":"AlertMessage.java"} + java.lang.String titleText -> g + java.lang.String cancelButtonText -> h + com.batch.android.messaging.model.CTA acceptCTA -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/d0/e;"} + 1:6:void ():0:5 -> +com.batch.android.messaging.model.BannerMessage -> com.batch.android.d0.c: +# {"id":"sourceFile","fileName":"BannerMessage.java"} + 1:6:void ():0:5 -> +com.batch.android.messaging.model.BaseBannerMessage -> com.batch.android.d0.d: +# {"id":"sourceFile","fileName":"BaseBannerMessage.java"} + java.lang.String css -> g + java.lang.String titleText -> h + com.batch.android.messaging.model.Action globalTapAction -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/d0/a;"} + long globalTapDelay -> j + boolean allowSwipeToDismiss -> k + java.lang.String imageURL -> l + java.lang.String imageDescription -> m + java.util.List ctas -> n + boolean showCloseButton -> o + int autoCloseDelay -> p + com.batch.android.messaging.model.BaseBannerMessage$CTADirection ctaDirection -> q + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/d0/d$a;"} + 1:22:void ():0:21 -> +com.batch.android.messaging.model.BaseBannerMessage$CTADirection -> com.batch.android.d0.d$a: +# {"id":"sourceFile","fileName":"BaseBannerMessage.java"} + com.batch.android.messaging.model.BaseBannerMessage$CTADirection HORIZONTAL -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/d0/d$a;"} + com.batch.android.messaging.model.BaseBannerMessage$CTADirection VERTICAL -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/d0/d$a;"} + com.batch.android.messaging.model.BaseBannerMessage$CTADirection[] $VALUES -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/d0/d$a;"} + 1:2:void ():24:25 -> + 3:3:void ():23:23 -> + 1:24:void (java.lang.String,int):0:23 -> + 1:24:com.batch.android.messaging.model.BaseBannerMessage$CTADirection[] $values():0:23 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/d0/d$a;"} + 1:1:com.batch.android.messaging.model.BaseBannerMessage$CTADirection valueOf(java.lang.String):23:23 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/d0/d$a;"} + 1:1:com.batch.android.messaging.model.BaseBannerMessage$CTADirection[] values():23:23 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/d0/d$a;"} +com.batch.android.messaging.model.CTA -> com.batch.android.d0.e: +# {"id":"sourceFile","fileName":"CTA.java"} + java.lang.String label -> c + 1:15:void (java.lang.String,java.lang.String,com.batch.android.json.JSONObject):0:14 -> +com.batch.android.messaging.model.ImageMessage -> com.batch.android.d0.f: +# {"id":"sourceFile","fileName":"ImageMessage.java"} + java.lang.String css -> g + com.batch.android.messaging.model.Action globalTapAction -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/d0/a;"} + long globalTapDelay -> i + boolean allowSwipeToDismiss -> j + java.lang.String imageURL -> k + java.lang.String imageDescription -> l + com.batch.android.messaging.Size2D imageSize -> m + int autoCloseDelay -> n + boolean isFullscreen -> o + 1:7:void ():0:6 -> +com.batch.android.messaging.model.Message -> com.batch.android.d0.g: +# {"id":"sourceFile","fileName":"Message.java"} + java.lang.String messageIdentifier -> a + java.lang.String devTrackingIdentifier -> b + java.lang.String bodyText -> c + java.lang.String bodyRawHtml -> d + com.batch.android.json.JSONObject eventData -> e + com.batch.android.messaging.model.Message$Source source -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/d0/g$a;"} + 1:22:void ():0:21 -> + 1:33:java.lang.CharSequence getBody():0:32 -> a + 1:49:android.text.Spanned getSpannedBody():0:48 -> b +com.batch.android.messaging.model.Message$Source -> com.batch.android.d0.g$a: +# {"id":"sourceFile","fileName":"Message.java"} + com.batch.android.messaging.model.Message$Source UNKNOWN -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/d0/g$a;"} + com.batch.android.messaging.model.Message$Source LANDING -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/d0/g$a;"} + com.batch.android.messaging.model.Message$Source LOCAL -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/d0/g$a;"} + com.batch.android.messaging.model.Message$Source INBOX_LANDING -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/d0/g$a;"} + com.batch.android.messaging.model.Message$Source[] $VALUES -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/d0/g$a;"} + 1:4:void ():56:59 -> + 5:5:void ():55:55 -> + 1:56:void (java.lang.String,int):0:55 -> + 1:56:com.batch.android.messaging.model.Message$Source[] $values():0:55 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/d0/g$a;"} + 1:1:com.batch.android.messaging.model.Message$Source valueOf(java.lang.String):55:55 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/d0/g$a;"} + 1:1:com.batch.android.messaging.model.Message$Source[] values():55:55 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/d0/g$a;"} +com.batch.android.messaging.model.MessagingError -> com.batch.android.d0.h: +# {"id":"sourceFile","fileName":"MessagingError.java"} + int code -> a + com.batch.android.messaging.model.MessagingError UNKNOWN -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/d0/h;"} + com.batch.android.messaging.model.MessagingError SERVER_FAILURE -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/d0/h;"} + com.batch.android.messaging.model.MessagingError INVALID_RESPONSE -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/d0/h;"} + com.batch.android.messaging.model.MessagingError CLIENT_NETWORK -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/d0/h;"} + com.batch.android.messaging.model.MessagingError[] $VALUES -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/d0/h;"} + 1:16:void ():10:25 -> + 17:17:void ():6:6 -> + 1:31:void (java.lang.String,int,int):0:30 -> + 1:7:com.batch.android.messaging.model.MessagingError[] $values():0:6 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/d0/h;"} + 1:1:com.batch.android.messaging.model.MessagingError valueOf(java.lang.String):6:6 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/d0/h;"} + 1:1:com.batch.android.messaging.model.MessagingError[] values():6:6 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/d0/h;"} +com.batch.android.messaging.model.ModalMessage -> com.batch.android.d0.i: +# {"id":"sourceFile","fileName":"ModalMessage.java"} + 1:6:void ():0:5 -> +com.batch.android.messaging.model.UniversalMessage -> com.batch.android.d0.j: +# {"id":"sourceFile","fileName":"UniversalMessage.java"} + java.lang.String css -> g + java.lang.String headingText -> h + java.lang.String titleText -> i + java.lang.String subtitleText -> j + java.util.List ctas -> k + java.lang.String heroImageURL -> l + java.lang.String videoURL -> m + java.lang.String heroDescription -> n + java.lang.Boolean showCloseButton -> o + java.lang.Boolean attachCTAsBottom -> p + java.lang.Boolean stackCTAsHorizontally -> q + java.lang.Boolean stretchCTAsHorizontally -> r + java.lang.Boolean flipHeroVertical -> s + java.lang.Boolean flipHeroHorizontal -> t + java.lang.Double heroSplitRatio -> u + int autoCloseDelay -> v + 1:18:void ():0:17 -> + 1:38:java.lang.String getVoiceString():0:37 -> c +com.batch.android.messaging.model.WebViewMessage -> com.batch.android.d0.k: +# {"id":"sourceFile","fileName":"WebViewMessage.java"} + java.lang.String css -> g + java.lang.String url -> h + int timeout -> i + boolean openDeeplinksInApp -> j + boolean devMode -> k + 1:6:void ():0:5 -> +com.batch.android.messaging.view.AnimatedCloseButton -> com.batch.android.messaging.view.a: +# {"id":"sourceFile","fileName":"AnimatedCloseButton.java"} + boolean animating -> t + long animationEndDate -> u + long duration -> v + 1:1:void (android.content.Context):21:21 -> + 2:4:void (android.content.Context):16:18 -> + 5:5:void (android.content.Context,android.util.AttributeSet):25:25 -> + 6:8:void (android.content.Context,android.util.AttributeSet):16:18 -> + 9:9:void (android.content.Context,android.util.AttributeSet,int):29:29 -> + 10:12:void (android.content.Context,android.util.AttributeSet,int):16:18 -> + 13:13:void (android.content.Context,android.util.AttributeSet,int,int):34:34 -> + 14:16:void (android.content.Context,android.util.AttributeSet,int,int):16:18 -> + 1:5:void animateForDuration(long):38:42 -> a + 1:1:boolean isAnimating():46:46 -> d + 1:8:void onAnimationFrame():52:59 -> e + 1:3:void onDraw(android.graphics.Canvas):64:66 -> onDraw + 1:11:void onRestoreInstanceState(android.os.Parcelable):84:94 -> onRestoreInstanceState + 1:4:android.os.Parcelable onSaveInstanceState():75:78 -> onSaveInstanceState +com.batch.android.messaging.view.AnimatedCountdownSavedState -> com.batch.android.messaging.view.AnimatedCountdownSavedState: +# {"id":"sourceFile","fileName":"AnimatedCountdownSavedState.java"} + boolean animating -> a + long animationEndDate -> b + long duration -> c + 1:1:void ():64:64 -> + 1:1:void (android.os.Parcel):20:20 -> + 2:8:void (android.os.Parcel):15:21 -> + 9:9:void (android.os.Parcel,java.lang.ClassLoader):27:27 -> + 10:23:void (android.os.Parcel,java.lang.ClassLoader):15:28 -> + 24:24:void (android.os.Parcelable):33:33 -> + 25:27:void (android.os.Parcelable):15:17 -> + 1:3:void readParcel(android.os.Parcel,java.lang.ClassLoader):37:39 -> a + 1:1:java.lang.String toString():53:53 -> toString + 1:4:void writeToParcel(android.os.Parcel,int):44:47 -> writeToParcel +com.batch.android.messaging.view.AnimatedCountdownSavedState$1 -> com.batch.android.messaging.view.AnimatedCountdownSavedState$a: +# {"id":"sourceFile","fileName":"AnimatedCountdownSavedState.java"} + 1:1:void ():64:64 -> + 1:1:com.batch.android.messaging.view.AnimatedCountdownSavedState createFromParcel(android.os.Parcel):67:67 -> a + 2:2:com.batch.android.messaging.view.AnimatedCountdownSavedState[] newArray(int):71:71 -> a + 1:1:java.lang.Object createFromParcel(android.os.Parcel):64:64 -> createFromParcel + 1:1:java.lang.Object[] newArray(int):64:64 -> newArray +com.batch.android.messaging.view.CloseButton -> com.batch.android.messaging.view.CloseButton: +# {"id":"sourceFile","fileName":"CloseButton.java"} + int padding -> a + int backgroundColor -> b + int glyphColor -> c + int glyphPadding -> d + int glyphWidth -> e + float countdownProgress -> f + int computedGlyphPadding -> g + android.graphics.Paint backgroundPaint -> h + android.graphics.Paint glyphPaint -> i + android.graphics.Paint borderPaint -> j + android.graphics.drawable.Drawable foregoundDrawable -> k + android.graphics.RectF countdownOval -> l + android.graphics.RectF borderOval -> m + boolean showBorder -> n + java.lang.String TAG -> o + int DEFAULT_SIZE_DP -> p + int DEFAULT_PADDING_DP -> q + int UNSCALED_GLYPH_PADDING_PX -> r + int UNSCALED_GLYPH_WIDTH_PX -> s + 1:1:void (android.content.Context):66:66 -> + 2:32:void (android.content.Context):37:67 -> + 33:33:void (android.content.Context,android.util.AttributeSet):71:71 -> + 34:69:void (android.content.Context,android.util.AttributeSet):37:72 -> + 70:70:void (android.content.Context,android.util.AttributeSet,int):76:76 -> + 71:111:void (android.content.Context,android.util.AttributeSet,int):37:77 -> + 112:112:void (android.content.Context,android.util.AttributeSet,int,int):81:81 -> + 113:158:void (android.content.Context,android.util.AttributeSet,int,int):37:82 -> + 1:31:void init():86:116 -> a + 32:66:void applyStyleRules(java.util.Map):319:353 -> a + 1:9:void recomputeMetrics():141:149 -> b + 10:17:void recomputeMetrics():148:155 -> b + 18:18:void recomputeMetrics():153:153 -> b + 19:32:void recomputeMetrics():152:165 -> b + 1:18:void refreshPaint():120:137 -> c + 1:5:void draw(android.graphics.Canvas):289:293 -> draw + 1:3:void drawableHotspotChanged(float,float):387:389 -> drawableHotspotChanged + 1:7:void drawableStateChanged():363:369 -> drawableStateChanged + 1:1:android.view.ViewOutlineProvider getOutlineProvider():246:246 -> getOutlineProvider + 1:1:int getPadding():209:209 -> getPadding + 1:3:void jumpDrawablesToCurrentState():379:381 -> jumpDrawablesToCurrentState + 1:7:void onDraw(android.graphics.Canvas):261:267 -> onDraw + 8:19:void onDraw(android.graphics.Canvas):263:274 -> onDraw + 20:33:void onDraw(android.graphics.Canvas):270:283 -> onDraw + 1:16:void onMeasure(int,int):299:314 -> onMeasure + 1:5:void onSizeChanged(int,int,int,int):251:255 -> onSizeChanged + 1:2:void setBackgroundColor(int):170:171 -> setBackgroundColor + 1:2:void setCountdownProgress(float):218:219 -> setCountdownProgress + 1:2:void setForegoundDrawable(android.graphics.drawable.Drawable):180:181 -> setForegoundDrawable + 1:2:void setGlyphColor(int):175:176 -> setGlyphColor + 1:3:void setGlyphPadding(int):228:230 -> setGlyphPadding + 1:3:void setGlyphWidth(int):239:241 -> setGlyphWidth + 1:1:void setPadding(int,int,int,int):199:199 -> setPadding + 2:3:void setPadding(int):204:205 -> setPadding + 1:2:void setShowBorder(boolean):188:189 -> setShowBorder + 1:1:boolean verifyDrawable(android.graphics.drawable.Drawable):374:374 -> verifyDrawable +com.batch.android.messaging.view.CloseButton$1 -> com.batch.android.messaging.view.CloseButton$a: +# {"id":"sourceFile","fileName":"CloseButton.java"} + com.batch.android.messaging.view.CloseButton this$0 -> a + 1:1:void (com.batch.android.messaging.view.CloseButton):87:87 -> + 1:5:void getOutline(android.view.View,android.graphics.Outline):90:94 -> getOutline + 6:6:void getOutline(android.view.View,android.graphics.Outline):90:90 -> getOutline +com.batch.android.messaging.view.CountdownView -> com.batch.android.e0.a: +# {"id":"sourceFile","fileName":"CountdownView.java"} + boolean animating -> a + long animationEndDate -> b + long duration -> c + java.lang.String TAG -> d + int MAX_PROGRESS -> e + 1:35:void (android.content.Context):0:34 -> + 36:44:void (android.content.Context):29:37 -> + 1:61:void animateForDuration(long):0:60 -> a + 62:111:void applyStyleRules(java.util.Map):0:49 -> a + 112:119:void onAnimationFrame():70:77 -> a + 1:65:boolean isAnimating():0:64 -> isAnimating + 1:85:void onDraw(android.graphics.Canvas):0:84 -> onDraw + 1:124:void onRestoreInstanceState(android.os.Parcelable):0:123 -> onRestoreInstanceState + 1:4:android.os.Parcelable onSaveInstanceState():104:107 -> onSaveInstanceState + 1:97:void setColor(int):0:96 -> setColor +com.batch.android.messaging.view.DelegatedTouchEventViewGroup -> com.batch.android.e0.b: +# {"id":"sourceFile","fileName":"DelegatedTouchEventViewGroup.java"} + boolean superOnTouchEvent(android.view.MotionEvent) -> a + boolean superOnInterceptTouchEvent(android.view.MotionEvent) -> b + void setTouchEventDelegate(com.batch.android.messaging.view.DelegatedTouchEventViewGroup$Delegate) -> setTouchEventDelegate + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e0/b$a;)V"} +com.batch.android.messaging.view.DelegatedTouchEventViewGroup$Delegate -> com.batch.android.e0.b$a: +# {"id":"sourceFile","fileName":"DelegatedTouchEventViewGroup.java"} + boolean onInterceptTouchEvent(android.view.MotionEvent,com.batch.android.messaging.view.DelegatedTouchEventViewGroup) -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/view/MotionEvent;Lcom/batch/android/e0/b;)Z"} + boolean onTouchEvent(android.view.MotionEvent,com.batch.android.messaging.view.DelegatedTouchEventViewGroup,boolean) -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/view/MotionEvent;Lcom/batch/android/e0/b;Z)Z"} +com.batch.android.messaging.view.FixedRatioFrameLayout -> com.batch.android.e0.c: +# {"id":"sourceFile","fileName":"FixedRatioFrameLayout.java"} + com.batch.android.messaging.Size2D targetSize -> a + 1:27:void (android.content.Context,android.util.AttributeSet):0:26 -> + 28:58:void (android.content.Context,android.util.AttributeSet,int):0:30 -> + 59:98:void (android.content.Context,android.util.AttributeSet,int,int):0:39 -> + 99:121:void (android.content.Context,com.batch.android.messaging.Size2D):0:22 -> + 1:44:void init(com.batch.android.messaging.Size2D):0:43 -> a + 1:86:void onMeasure(int,int):0:85 -> onMeasure + 87:87:void onMeasure(int,int):83:83 -> onMeasure + 1:52:void setTargetSize(com.batch.android.messaging.Size2D):0:51 -> setTargetSize +com.batch.android.messaging.view.FlexboxLayout -> com.batch.android.e0.d: +# {"id":"sourceFile","fileName":"FlexboxLayout.java"} + int ALIGN_CONTENT_FLEX_START -> A + int ALIGN_CONTENT_FLEX_END -> B + int ALIGN_CONTENT_CENTER -> C + int ALIGN_CONTENT_SPACE_BETWEEN -> D + int ALIGN_CONTENT_SPACE_AROUND -> E + int ALIGN_CONTENT_STRETCH -> F + int mFlexDirection -> a + int mFlexWrap -> b + int mJustifyContent -> c + int mAlignItems -> d + int mAlignContent -> e + int[] mReorderedIndices -> f + android.util.SparseIntArray mOrderCache -> g + java.util.List mFlexLines -> h + boolean[] mChildrenFrozen -> i + int FLEX_DIRECTION_ROW -> j + int FLEX_DIRECTION_ROW_REVERSE -> k + int FLEX_DIRECTION_COLUMN -> l + int FLEX_DIRECTION_COLUMN_REVERSE -> m + int FLEX_WRAP_NOWRAP -> n + int FLEX_WRAP_WRAP -> o + int FLEX_WRAP_WRAP_REVERSE -> p + int JUSTIFY_CONTENT_FLEX_START -> q + int JUSTIFY_CONTENT_FLEX_END -> r + int JUSTIFY_CONTENT_CENTER -> s + int JUSTIFY_CONTENT_SPACE_BETWEEN -> t + int JUSTIFY_CONTENT_SPACE_AROUND -> u + int ALIGN_ITEMS_FLEX_START -> v + int ALIGN_ITEMS_FLEX_END -> w + int ALIGN_ITEMS_CENTER -> x + int ALIGN_ITEMS_BASELINE -> y + int ALIGN_ITEMS_STRETCH -> z + 1:241:void (android.content.Context):0:240 -> + 242:486:void (android.content.Context,android.util.AttributeSet):0:244 -> + 487:735:void (android.content.Context,android.util.AttributeSet,int):0:248 -> + 736:736:void (android.content.Context,android.util.AttributeSet,int):230:230 -> + 1:733:void addFlexLineIfLastFlexItem(int,int,com.batch.android.messaging.view.FlexboxLayout$FlexLine):0:732 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(IILcom/batch/android/e0/d$e;)V"} + 734:1458:void checkSizeConstraints(android.view.View):0:724 -> a + 1459:1459:void checkSizeConstraints(android.view.View):722:722 -> a + 1460:1818:int[] createReorderedIndices():0:358 -> a + 1819:2161:int[] createReorderedIndices(android.view.View,int,android.view.ViewGroup$LayoutParams):0:342 -> a + 2162:2175:int[] createReorderedIndices(android.view.View,int,android.view.ViewGroup$LayoutParams):333:346 -> a + 2176:2176:void determineCrossSize(int,int,int,int):0:0 -> a + 3244:3244:void determineCrossSize(int,int,int,int):1068:1068 -> a + 3245:3246:void determineCrossSize(int,int,int,int):1064:1065 -> a + 3247:3370:void determineCrossSize(int,int,int,int):1059:1182 -> a + 3371:4145:void determineMainSize(int,int,int):0:774 -> a + 4146:4153:void determineMainSize(int,int,int):764:771 -> a + 4154:4183:void determineMainSize(int,int,int):753:782 -> a + 4184:5080:int expandFlexItems(com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int):0:896 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e0/d$e;IIII)I"} + 5081:5086:int expandFlexItems(com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int):894:899 -> a + 5087:5116:int expandFlexItems(com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int):831:860 -> a + 5117:5166:int expandFlexItems(com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int):858:907 -> a + 5167:5167:int expandFlexItems(com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int):812:812 -> a + 5168:5168:boolean isWrapRequired(int,int,int,int,int,com.batch.android.messaging.view.FlexboxLayout$LayoutParams):0:0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(IIIIILcom/batch/android/e0/d$h;)Z"} + 6577:6577:boolean isWrapRequired(int,int,int,int,int,com.batch.android.messaging.view.FlexboxLayout$LayoutParams):1409:1409 -> a + 6578:6578:void layoutHorizontal(boolean,int,int,int,int):0:0 -> a + 8071:8118:void layoutHorizontal(boolean,int,int,int,int):1493:1540 -> a + 8119:8128:void layoutHorizontal(boolean,int,int,int,int):1527:1536 -> a + 8129:8129:void layoutHorizontal(boolean,int,int,int,int):1523:1523 -> a + 8130:8175:void layoutHorizontal(boolean,int,int,int,int):1519:1564 -> a + 8176:8194:void layoutHorizontal(boolean,int,int,int,int):1557:1575 -> a + 8195:8216:void layoutHorizontal(boolean,int,int,int,int):1568:1589 -> a + 8217:8236:void layoutHorizontal(boolean,int,int,int,int):1581:1600 -> a + 8237:8253:void layoutHorizontal(boolean,int,int,int,int):1592:1608 -> a + 8254:8254:void layoutSingleChildHorizontal(android.view.View,com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int,int,int):0:0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/view/View;Lcom/batch/android/e0/d$e;IIIIII)V"} + 9899:9952:void layoutSingleChildHorizontal(android.view.View,com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int,int,int):1645:1698 -> a + 9953:9964:void layoutSingleChildHorizontal(android.view.View,com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int,int,int):1694:1705 -> a + 9965:9965:void layoutSingleChildHorizontal(android.view.View,com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int,int,int):1701:1701 -> a + 9966:9966:void layoutSingleChildHorizontal(android.view.View,com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int,int,int):1676:1676 -> a + 9967:9980:void layoutSingleChildHorizontal(android.view.View,com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int,int,int):1674:1687 -> a + 9981:9981:void layoutSingleChildHorizontal(android.view.View,com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int,int,int):1683:1683 -> a + 9982:9984:void layoutSingleChildHorizontal(android.view.View,com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int,int,int):1656:1658 -> a + 9985:9985:void layoutSingleChildVertical(android.view.View,com.batch.android.messaging.view.FlexboxLayout$FlexLine,boolean,int,int,int,int,int):0:0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/view/View;Lcom/batch/android/e0/d$e;ZIIIII)V"} + 11874:11920:void layoutSingleChildVertical(android.view.View,com.batch.android.messaging.view.FlexboxLayout$FlexLine,boolean,int,int,int,int,int):1889:1935 -> a + 11921:11923:void layoutSingleChildVertical(android.view.View,com.batch.android.messaging.view.FlexboxLayout$FlexLine,boolean,int,int,int,int,int):1909:1911 -> a + 11924:11936:void layoutSingleChildVertical(android.view.View,com.batch.android.messaging.view.FlexboxLayout$FlexLine,boolean,int,int,int,int,int):1908:1920 -> a + 11937:11937:void layoutSingleChildVertical(android.view.View,com.batch.android.messaging.view.FlexboxLayout$FlexLine,boolean,int,int,int,int,int):1917:1917 -> a + 11938:11940:void layoutSingleChildVertical(android.view.View,com.batch.android.messaging.view.FlexboxLayout$FlexLine,boolean,int,int,int,int,int):1901:1903 -> a + 11941:11941:void layoutVertical(boolean,boolean,int,int,int,int):0:0 -> a + 13676:13724:void layoutVertical(boolean,boolean,int,int,int,int):1735:1783 -> a + 13725:13734:void layoutVertical(boolean,boolean,int,int,int,int):1770:1779 -> a + 13735:13735:void layoutVertical(boolean,boolean,int,int,int,int):1766:1766 -> a + 13736:13782:void layoutVertical(boolean,boolean,int,int,int,int):1762:1808 -> a + 13783:13802:void layoutVertical(boolean,boolean,int,int,int,int):1800:1819 -> a + 13803:13824:void layoutVertical(boolean,boolean,int,int,int,int):1811:1832 -> a + 13825:13844:void layoutVertical(boolean,boolean,int,int,int,int):1824:1843 -> a + 13845:13861:void layoutVertical(boolean,boolean,int,int,int,int):1835:1851 -> a + 13862:14339:void measureHorizontal(int,int):0:477 -> a + 14340:14347:void measureHorizontal(int,int):475:482 -> a + 14348:14373:void measureHorizontal(int,int):480:505 -> a + 14374:14409:void measureHorizontal(int,int):500:535 -> a + 14410:14451:void measureHorizontal(int,int):533:574 -> a + 14452:14823:int[] sortOrdersIntoReorderedIndices(int,java.util.List):0:371 -> a + 14824:14824:void stretchViewHorizontally(android.view.View,int):0:0 -> a + 16096:16101:void stretchViewHorizontally(android.view.View,int):1272:1277 -> a + 16102:16102:void stretchViewHorizontally(android.view.View,int):1275:1275 -> a + 16103:16110:java.util.List createOrders(int):379:386 -> a + 1:303:void addView(android.view.View,int,android.view.ViewGroup$LayoutParams):0:302 -> addView + 1:293:android.view.View getReorderedChildAt(int):0:292 -> b + 294:705:boolean isOrderChangedFromLastMeasurement():0:411 -> b + 706:1339:void measureVertical(int,int):0:633 -> b + 1340:1347:void measureVertical(int,int):631:638 -> b + 1348:1373:void measureVertical(int,int):636:661 -> b + 1374:1408:void measureVertical(int,int):656:690 -> b + 1409:1409:void setMeasuredDimensionForFlex(int,int,int,int):0:0 -> b + 2707:2725:void setMeasuredDimensionForFlex(int,int,int,int):1298:1316 -> b + 2726:2727:void setMeasuredDimensionForFlex(int,int,int,int):1312:1313 -> b + 2728:2765:void setMeasuredDimensionForFlex(int,int,int,int):1307:1344 -> b + 2766:2766:void setMeasuredDimensionForFlex(int,int,int,int):1340:1340 -> b + 2767:2816:void setMeasuredDimensionForFlex(int,int,int,int):1330:1379 -> b + 2817:2817:void setMeasuredDimensionForFlex(int,int,int,int):1375:1375 -> b + 2818:2837:void setMeasuredDimensionForFlex(int,int,int,int):1362:1381 -> b + 2838:3854:int shrinkFlexItems(com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int):0:1016 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e0/d$e;IIII)I"} + 3855:3860:int shrinkFlexItems(com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int):1014:1019 -> b + 3861:3890:int shrinkFlexItems(com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int):956:985 -> b + 3891:3935:int shrinkFlexItems(com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int):983:1027 -> b + 3936:3936:int shrinkFlexItems(com.batch.android.messaging.view.FlexboxLayout$FlexLine,int,int,int,int):938:938 -> b + 3937:3937:void stretchViewVertically(android.view.View,int):0:0 -> b + 5193:5198:void stretchViewVertically(android.view.View,int):1256:1261 -> b + 5199:5199:void stretchViewVertically(android.view.View,int):1259:1259 -> b + 1:1:void stretchViews(int,int):0:0 -> c + 1206:1225:void stretchViews(int,int):1205:1224 -> c + 1226:1226:void stretchViews(int,int):1221:1221 -> c + 1227:1252:void stretchViews(int,int):1217:1242 -> c + 1253:1253:void stretchViews(int,int):1239:1239 -> c + 1254:1254:void stretchViews(int,int):1235:1235 -> c + 1:1:boolean checkLayoutParams(android.view.ViewGroup$LayoutParams):0:0 -> checkLayoutParams + 1949:1949:boolean checkLayoutParams(android.view.ViewGroup$LayoutParams):1948:1948 -> checkLayoutParams + 1:67:android.view.ViewGroup$LayoutParams generateLayoutParams(android.util.AttributeSet):0:66 -> generateLayoutParams + 68:68:com.batch.android.messaging.view.FlexboxLayout$LayoutParams generateLayoutParams(android.util.AttributeSet):1953:1953 -> generateLayoutParams + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/util/AttributeSet;)Lcom/batch/android/e0/d$h;"} + 69:69:android.view.ViewGroup$LayoutParams generateLayoutParams(android.view.ViewGroup$LayoutParams):1958:1958 -> generateLayoutParams + 1:1:int getAlignContent():0:0 -> getAlignContent + 2012:2012:int getAlignContent():2011:2011 -> getAlignContent + 1:1:int getAlignItems():0:0 -> getAlignItems + 2000:2000:int getAlignItems():1999:1999 -> getAlignItems + 1:1:int getFlexDirection():0:0 -> getFlexDirection + 1964:1964:int getFlexDirection():1963:1963 -> getFlexDirection + 1:1:int getFlexWrap():0:0 -> getFlexWrap + 1976:1976:int getFlexWrap():1975:1975 -> getFlexWrap + 1:1:int getJustifyContent():0:0 -> getJustifyContent + 1988:1988:int getJustifyContent():1987:1987 -> getJustifyContent + 1:1:int getLargestMainSize():0:0 -> getLargestMainSize + 1423:1424:int getLargestMainSize():1422:1423 -> getLargestMainSize + 1:1:int getSumOfCrossSize():0:0 -> getSumOfCrossSize + 1436:1437:int getSumOfCrossSize():1435:1436 -> getSumOfCrossSize + 1:1:void onLayout(boolean,int,int,int,int):0:0 -> onLayout + 1444:1470:void onLayout(boolean,int,int,int,int):1443:1469 -> onLayout + 1471:1474:void onLayout(boolean,int,int,int,int):1463:1466 -> onLayout + 1475:1478:void onLayout(boolean,int,int,int,int):1456:1459 -> onLayout + 1479:1479:void onLayout(boolean,int,int,int,int):1452:1452 -> onLayout + 1480:1480:void onLayout(boolean,int,int,int,int):1448:1448 -> onLayout + 1:274:void onMeasure(int,int):0:273 -> onMeasure + 275:275:void onMeasure(int,int):270:270 -> onMeasure + 276:286:void onMeasure(int,int):266:276 -> onMeasure + 1:1:void setAlignContent(int):0:0 -> setAlignContent + 2016:2018:void setAlignContent(int):2015:2017 -> setAlignContent + 1:1:void setAlignItems(int):0:0 -> setAlignItems + 2004:2006:void setAlignItems(int):2003:2005 -> setAlignItems + 1:1:void setFlexDirection(int):0:0 -> setFlexDirection + 1968:1970:void setFlexDirection(int):1967:1969 -> setFlexDirection + 1:1:void setFlexWrap(int):0:0 -> setFlexWrap + 1980:1982:void setFlexWrap(int):1979:1981 -> setFlexWrap + 1:1:void setJustifyContent(int):0:0 -> setJustifyContent + 1992:1994:void setJustifyContent(int):1991:1993 -> setJustifyContent +com.batch.android.messaging.view.FlexboxLayout$1 -> com.batch.android.e0.d$a: +# {"id":"sourceFile","fileName":"FlexboxLayout.java"} +com.batch.android.messaging.view.FlexboxLayout$AlignContent -> com.batch.android.e0.d$b: +# {"id":"sourceFile","fileName":"FlexboxLayout.java"} +com.batch.android.messaging.view.FlexboxLayout$AlignItems -> com.batch.android.e0.d$c: +# {"id":"sourceFile","fileName":"FlexboxLayout.java"} +com.batch.android.messaging.view.FlexboxLayout$FlexDirection -> com.batch.android.e0.d$d: +# {"id":"sourceFile","fileName":"FlexboxLayout.java"} +com.batch.android.messaging.view.FlexboxLayout$FlexLine -> com.batch.android.e0.d$e: +# {"id":"sourceFile","fileName":"FlexboxLayout.java"} + int mainSize -> a + int crossSize -> b + int itemCount -> c + float totalFlexGrow -> d + float totalFlexShrink -> e + int maxBaseline -> f + java.util.List indicesAlignSelfStretch -> g + 1:1:void ():0:0 -> + 2186:2220:void ():2185:2219 -> + 2221:2221:void (com.batch.android.messaging.view.FlexboxLayout$1):0:0 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e0/d$a;)V"} + 4406:4406:void (com.batch.android.messaging.view.FlexboxLayout$1):2185:2185 -> +com.batch.android.messaging.view.FlexboxLayout$FlexWrap -> com.batch.android.e0.d$f: +# {"id":"sourceFile","fileName":"FlexboxLayout.java"} +com.batch.android.messaging.view.FlexboxLayout$JustifyContent -> com.batch.android.e0.d$g: +# {"id":"sourceFile","fileName":"FlexboxLayout.java"} +com.batch.android.messaging.view.FlexboxLayout$LayoutParams -> com.batch.android.e0.d$h: +# {"id":"sourceFile","fileName":"FlexboxLayout.java"} + int order -> a + float flexGrow -> b + float flexShrink -> c + int alignSelf -> d + float flexBasisPercent -> e + int minWidth -> f + int minHeight -> g + int maxWidth -> h + int maxHeight -> i + boolean wrapBefore -> j + int ORDER_DEFAULT -> k + float FLEX_GROW_DEFAULT -> l + float FLEX_SHRINK_DEFAULT -> m + float FLEX_BASIS_PERCENT_DEFAULT -> n + int ALIGN_SELF_AUTO -> o + int ALIGN_SELF_FLEX_START -> p + int ALIGN_SELF_FLEX_END -> q + int ALIGN_SELF_CENTER -> r + int ALIGN_SELF_BASELINE -> s + int ALIGN_SELF_STRETCH -> t + int MAX_SIZE -> u + 1:1:void (int,int):0:0 -> + 2149:2149:void (int,int):2148:2148 -> + 2150:2208:void (int,int):2053:2111 -> + 2209:2209:void (android.content.Context,android.util.AttributeSet):0:0 -> + 4335:4335:void (android.content.Context,android.util.AttributeSet):2126:2126 -> + 4336:4394:void (android.content.Context,android.util.AttributeSet):2053:2111 -> + 4395:4395:void (android.view.ViewGroup$LayoutParams):0:0 -> + 6539:6539:void (android.view.ViewGroup$LayoutParams):2144:2144 -> + 6540:6598:void (android.view.ViewGroup$LayoutParams):2053:2111 -> + 6599:6599:void (com.batch.android.messaging.view.FlexboxLayout$LayoutParams):0:0 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e0/d$h;)V"} + 8729:8729:void (com.batch.android.messaging.view.FlexboxLayout$LayoutParams):2130:2130 -> + 8730:8817:void (com.batch.android.messaging.view.FlexboxLayout$LayoutParams):2053:2140 -> +com.batch.android.messaging.view.FlexboxLayout$Order -> com.batch.android.e0.d$i: +# {"id":"sourceFile","fileName":"FlexboxLayout.java"} + int index -> a + int order -> b + 1:1:void ():0:0 -> + 2157:2157:void ():2156:2156 -> + 2158:2158:void (com.batch.android.messaging.view.FlexboxLayout$1):0:0 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e0/d$a;)V"} + 4314:4314:void (com.batch.android.messaging.view.FlexboxLayout$1):2156:2156 -> + 1:1:int compareTo(com.batch.android.messaging.view.FlexboxLayout$Order):0:0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e0/d$i;)I"} + 2171:2174:int compareTo(com.batch.android.messaging.view.FlexboxLayout$Order):2170:2173 -> a + 1:1:int compareTo(java.lang.Object):0:0 -> compareTo + 2157:2157:int compareTo(java.lang.Object):2156:2156 -> compareTo + 1:1:java.lang.String toString():2178:2178 -> toString +com.batch.android.messaging.view.MaximumHeightScrollView -> com.batch.android.e0.e: +# {"id":"sourceFile","fileName":"MaximumHeightScrollView.java"} + int maxHeightPx -> a + 1:16:void (android.content.Context):0:15 -> + 17:17:void (android.content.Context):12:12 -> + 18:37:void (android.content.Context,android.util.AttributeSet):0:19 -> + 38:38:void (android.content.Context,android.util.AttributeSet):12:12 -> + 39:62:void (android.content.Context,android.util.AttributeSet,int):0:23 -> + 63:63:void (android.content.Context,android.util.AttributeSet,int):12:12 -> + 64:91:void (android.content.Context,android.util.AttributeSet,int,int):0:27 -> + 92:92:void (android.content.Context,android.util.AttributeSet,int,int):12:12 -> + 1:44:void onMeasure(int,int):0:43 -> onMeasure + 1:32:void setMaxHeight(int):0:31 -> setMaxHeight +com.batch.android.messaging.view.PannableBannerFrameLayout -> com.batch.android.e0.f: +# {"id":"sourceFile","fileName":"PannableBannerFrameLayout.java"} + boolean supportsAndroidXAnimation -> a + android.view.GestureDetector detector -> b + com.batch.android.messaging.view.PannableBannerFrameLayout$DismissDirection dismissDirection -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e0/f$b;"} + com.batch.android.messaging.view.PannableBannerFrameLayout$OnDismissListener dismissListener -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e0/f$c;"} + boolean isPannable -> e + float initialSwipeYOffset -> f + float initialInterceptYOffset -> g + java.lang.Object cancellationAnimation -> h + boolean isPanning -> i + int cancellationAnimationDuration -> j + int dismissAnimationDuration -> k + int touchSlop -> l + int FLING_VELOCITY_DISMISS_THRESHOLD -> m + float PAN_HEIGHT_DISMISS_RATIO_THRESHOLD -> n + 1:87:void (android.content.Context):0:86 -> + 88:123:void (android.content.Context):52:87 -> + 124:215:void (android.content.Context,android.util.AttributeSet):0:91 -> + 216:256:void (android.content.Context,android.util.AttributeSet):52:92 -> + 257:353:void (android.content.Context,android.util.AttributeSet,int):0:96 -> + 354:399:void (android.content.Context,android.util.AttributeSet,int):52:97 -> + 1:29:com.batch.android.messaging.view.PannableBannerFrameLayout$OnDismissListener access$000(com.batch.android.messaging.view.PannableBannerFrameLayout):0:28 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e0/f;)Lcom/batch/android/e0/f$c;"} + 30:331:void beginPan(float):0:301 -> a + 332:665:void cancelCancellationAnimation():0:333 -> a + 666:962:boolean hasYPassedTouchSlop(float,float):0:296 -> a + 1:378:void dismiss():0:377 -> b + 1:116:void setup():0:115 -> c + 1:315:void startCancelAnimation():0:314 -> d + 1:325:void startFallbackCancelAnimation():0:324 -> e + 1:1:boolean onDown(android.view.MotionEvent):0:0 -> onDown + 1:290:boolean onFling(android.view.MotionEvent,android.view.MotionEvent,float,float):0:289 -> onFling + 1:159:boolean onInterceptTouchEvent(android.view.MotionEvent):0:158 -> onInterceptTouchEvent + 160:160:boolean onInterceptTouchEvent(android.view.MotionEvent):142:142 -> onInterceptTouchEvent + 1:1:void onLongPress(android.view.MotionEvent):0:0 -> onLongPress + 1:1:boolean onScroll(android.view.MotionEvent,android.view.MotionEvent,float,float):0:0 -> onScroll + 1:1:void onShowPress(android.view.MotionEvent):0:0 -> onShowPress + 1:1:boolean onSingleTapUp(android.view.MotionEvent):0:0 -> onSingleTapUp + 1:239:boolean onTouchEvent(android.view.MotionEvent):0:238 -> onTouchEvent + 240:287:boolean onTouchEvent(android.view.MotionEvent):185:232 -> onTouchEvent + 288:349:boolean onTouchEvent(android.view.MotionEvent):181:242 -> onTouchEvent + 1:121:void setDismissDirection(com.batch.android.messaging.view.PannableBannerFrameLayout$DismissDirection):0:120 -> setDismissDirection + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e0/f$b;)V"} + 1:125:void setDismissListener(com.batch.android.messaging.view.PannableBannerFrameLayout$OnDismissListener):0:124 -> setDismissListener + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e0/f$c;)V"} + 1:129:void setPannable(boolean):0:128 -> setPannable +com.batch.android.messaging.view.PannableBannerFrameLayout$1 -> com.batch.android.e0.f$a: +# {"id":"sourceFile","fileName":"PannableBannerFrameLayout.java"} + com.batch.android.messaging.view.PannableBannerFrameLayout this$0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e0/f;"} + 1:351:void (com.batch.android.messaging.view.PannableBannerFrameLayout):0:350 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e0/f;)V"} + 1:1:void onAnimationCancel(android.animation.Animator):0:0 -> onAnimationCancel + 1:358:void onAnimationEnd(android.animation.Animator):0:357 -> onAnimationEnd + 1:1:void onAnimationRepeat(android.animation.Animator):0:0 -> onAnimationRepeat + 1:1:void onAnimationStart(android.animation.Animator):0:0 -> onAnimationStart +com.batch.android.messaging.view.PannableBannerFrameLayout$DismissDirection -> com.batch.android.e0.f$b: +# {"id":"sourceFile","fileName":"PannableBannerFrameLayout.java"} + com.batch.android.messaging.view.PannableBannerFrameLayout$DismissDirection TOP -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e0/f$b;"} + com.batch.android.messaging.view.PannableBannerFrameLayout$DismissDirection BOTTOM -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e0/f$b;"} + com.batch.android.messaging.view.PannableBannerFrameLayout$DismissDirection[] $VALUES -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/e0/f$b;"} + 1:2:void ():384:385 -> + 3:3:void ():383:383 -> + 1:384:void (java.lang.String,int):0:383 -> + 1:384:com.batch.android.messaging.view.PannableBannerFrameLayout$DismissDirection[] $values():0:383 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/e0/f$b;"} + 1:1:com.batch.android.messaging.view.PannableBannerFrameLayout$DismissDirection valueOf(java.lang.String):383:383 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/e0/f$b;"} + 1:1:com.batch.android.messaging.view.PannableBannerFrameLayout$DismissDirection[] values():383:383 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/e0/f$b;"} +com.batch.android.messaging.view.PannableBannerFrameLayout$OnDismissListener -> com.batch.android.e0.f$c: +# {"id":"sourceFile","fileName":"PannableBannerFrameLayout.java"} + void onDismiss(com.batch.android.messaging.view.PannableBannerFrameLayout) -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e0/f;)V"} +com.batch.android.messaging.view.PositionableGradientDrawable -> com.batch.android.e0.g: +# {"id":"sourceFile","fileName":"PositionableGradientDrawable.java"} + float DEFAULT_THICKNESS_RATIO -> A + com.batch.android.messaging.view.PositionableGradientDrawable$GradientState mGradientState -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e0/g$b;"} + android.graphics.Paint mFillPaint -> b + android.graphics.Rect mPadding -> c + android.graphics.Paint mStrokePaint -> d + android.graphics.ColorFilter mColorFilter -> e + android.graphics.PorterDuffColorFilter mTintFilter -> f + int mAlpha -> g + android.graphics.Path mPath -> h + android.graphics.RectF mRect -> i + android.graphics.Paint mLayerPaint -> j + boolean mGradientIsDirty -> k + boolean mMutated -> l + android.graphics.Path mRingPath -> m + boolean mPathIsDirty -> n + float mGradientRadius -> o + int RECTANGLE -> p + int OVAL -> q + int LINE -> r + int RING -> s + int LINEAR_GRADIENT -> t + int RADIAL_GRADIENT -> u + int SWEEP_GRADIENT -> v + int RADIUS_TYPE_PIXELS -> w + int RADIUS_TYPE_FRACTION -> x + int RADIUS_TYPE_FRACTION_PARENT -> y + float DEFAULT_INNER_RADIUS_RATIO -> z + 1:166:void ():0:165 -> + 167:167:void (com.batch.android.messaging.view.PositionableGradientDrawable$GradientState,android.content.res.Resources):0:0 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e0/g$b;Landroid/content/res/Resources;)V"} + 1503:1503:void (com.batch.android.messaging.view.PositionableGradientDrawable$GradientState,android.content.res.Resources):1336:1336 -> + 1504:1518:void (com.batch.android.messaging.view.PositionableGradientDrawable$GradientState,android.content.res.Resources):105:119 -> + 2736:2738:void (com.batch.android.messaging.view.PositionableGradientDrawable$GradientState,android.content.res.Resources):1337:1339 -> + 2739:2787:void (com.batch.android.messaging.view.PositionableGradientDrawable$GradientState,android.content.res.Resources,com.batch.android.messaging.view.PositionableGradientDrawable$1):0:48 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e0/g$b;Landroid/content/res/Resources;Lcom/batch/android/e0/g$a;)V"} + 2788:2961:void (com.batch.android.messaging.view.PositionableGradientDrawable$Orientation,int[],float[]):0:173 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e0/g$c;[I[F)V"} + 1:629:void buildPathIfDirty():0:628 -> a + 630:1308:android.graphics.Path buildRing(com.batch.android.messaging.view.PositionableGradientDrawable$GradientState):0:678 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e0/g$b;)Landroid/graphics/Path;"} + 1309:1309:boolean isOpaque(int):0:0 -> a + 1310:2033:void setColor(android.content.res.ColorStateList):0:723 -> a + 2034:2519:void setColors(int[],float[]):0:485 -> a + 2520:2724:void setCornerRadii(float[]):0:204 -> a + 2725:2948:void setCornerRadius(float):0:223 -> a + 2949:3334:void setGradientCenter(float,float):0:385 -> a + 3335:3797:void setOrientation(com.batch.android.messaging.view.PositionableGradientDrawable$Orientation):0:462 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e0/g$c;)V"} + 3798:4132:void setSize(int,int):0:334 -> a + 4133:4407:void setStroke(int,int,float,float):0:274 -> a + 4408:4663:void setStroke(int,android.content.res.ColorStateList):0:255 -> a + 4664:4965:void setStroke(int,android.content.res.ColorStateList,float,float):0:301 -> a + 4966:5401:void setUseLevel(boolean):0:435 -> a + 5402:5402:void updateLocalState(android.content.res.Resources):0:0 -> a + 6745:6787:void updateLocalState(android.content.res.Resources):1343:1385 -> a + 1:1:void clearMutated():0:0 -> b + 1091:1091:void clearMutated():1090:1090 -> b + 1092:1531:int modulateAlpha(int):0:439 -> b + 1532:1934:void setGradientRadius(float):0:402 -> b + 1935:2174:void setStroke(int,int):0:239 -> b + 2175:2492:void setStrokeInternal(int,int,float,float):0:317 -> b + 1:932:boolean ensureValidRect():0:931 -> c + 933:935:boolean ensureValidRect():922:924 -> c + 936:939:boolean ensureValidRect():916:919 -> c + 940:943:boolean ensureValidRect():910:913 -> c + 944:947:boolean ensureValidRect():904:907 -> c + 948:950:boolean ensureValidRect():898:900 -> c + 951:954:boolean ensureValidRect():892:895 -> c + 955:1075:boolean ensureValidRect():886:1006 -> c + 1076:1773:void setColor(int):0:697 -> c + 1:418:float getGradientRadius():0:417 -> d + 419:786:void setGradientType(int):0:367 -> d + 1:608:void draw(android.graphics.Canvas):0:607 -> draw + 609:612:void draw(android.graphics.Canvas):596:599 -> draw + 613:615:void draw(android.graphics.Canvas):589:591 -> draw + 616:671:void draw(android.graphics.Canvas):562:617 -> draw + 1:448:com.batch.android.messaging.view.PositionableGradientDrawable$Orientation getOrientation():0:447 -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/e0/g$c;"} + 449:800:void setShape(int):0:351 -> e + 1:1:boolean isOpaqueForState():0:0 -> f + 1027:1031:boolean isOpaqueForState():1026:1030 -> f + 1:794:int getAlpha():0:793 -> getAlpha + 1:781:int getChangingConfigurations():0:780 -> getChangingConfigurations + 1:807:android.graphics.ColorFilter getColorFilter():0:806 -> getColorFilter + 1:1:android.graphics.drawable.Drawable$ConstantState getConstantState():0:0 -> getConstantState + 1022:1023:android.graphics.drawable.Drawable$ConstantState getConstantState():1021:1022 -> getConstantState + 1:1:int getIntrinsicHeight():0:0 -> getIntrinsicHeight + 1017:1017:int getIntrinsicHeight():1016:1016 -> getIntrinsicHeight + 1:1:int getIntrinsicWidth():0:0 -> getIntrinsicWidth + 1012:1012:int getIntrinsicWidth():1011:1011 -> getIntrinsicWidth + 1:834:int getOpacity():0:833 -> getOpacity + 1:1:void getOutline(android.graphics.Outline):0:0 -> getOutline + 1040:1071:void getOutline(android.graphics.Outline):1039:1070 -> getOutline + 1072:1072:void getOutline(android.graphics.Outline):1060:1060 -> getOutline + 1073:1084:void getOutline(android.graphics.Outline):1046:1057 -> getOutline + 1:183:boolean getPadding(android.graphics.Rect):0:182 -> getPadding + 1:773:boolean isStateful():0:772 -> isStateful + 774:775:boolean isStateful():772:773 -> isStateful + 776:777:boolean isStateful():773:774 -> isStateful + 1:1:android.graphics.drawable.Drawable mutate():0:0 -> mutate + 1078:1081:android.graphics.drawable.Drawable mutate():1077:1080 -> mutate + 1:844:void onBoundsChange(android.graphics.Rect):0:843 -> onBoundsChange + 1:852:boolean onLevelChange(int):0:851 -> onLevelChange + 1:761:boolean onStateChange(int[]):0:760 -> onStateChange + 1:788:void setAlpha(int):0:787 -> setAlpha + 1:814:void setColorFilter(android.graphics.ColorFilter):0:813 -> setColorFilter + 1:801:void setDither(boolean):0:800 -> setDither + 1:822:void setTintList(android.content.res.ColorStateList):0:821 -> setTintList + 1:829:void setTintMode(android.graphics.PorterDuff$Mode):0:828 -> setTintMode +com.batch.android.messaging.view.PositionableGradientDrawable$1 -> com.batch.android.e0.g$a: +# {"id":"sourceFile","fileName":"PositionableGradientDrawable.java"} + int[] $SwitchMap$com$batch$android$messaging$view$PositionableGradientDrawable$Orientation -> a + 1:1:void ():884:884 -> +com.batch.android.messaging.view.PositionableGradientDrawable$GradientState -> com.batch.android.e0.g$b: +# {"id":"sourceFile","fileName":"PositionableGradientDrawable.java"} + float mGradientRadius -> A + int mGradientRadiusType -> B + boolean mUseLevel -> C + boolean mUseLevelForShape -> D + boolean mOpaqueOverBounds -> E + boolean mOpaqueOverShape -> F + android.content.res.ColorStateList mTint -> G + android.graphics.PorterDuff$Mode mTintMode -> H + int[] mThemeAttrs -> I + int[] mAttrSize -> J + int[] mAttrGradient -> K + int[] mAttrSolid -> L + int[] mAttrStroke -> M + int[] mAttrCorners -> N + int[] mAttrPadding -> O + int mChangingConfigurations -> a + int mShape -> b + int mGradient -> c + int mAngle -> d + com.batch.android.messaging.view.PositionableGradientDrawable$Orientation mOrientation -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e0/g$c;"} + android.content.res.ColorStateList mSolidColors -> f + android.content.res.ColorStateList mStrokeColors -> g + int[] mGradientColors -> h + int[] mTempColors -> i + float[] mTempPositions -> j + float[] mPositions -> k + int mStrokeWidth -> l + float mStrokeDashWidth -> m + float mStrokeDashGap -> n + float mRadius -> o + float[] mRadiusArray -> p + android.graphics.Rect mPadding -> q + int mWidth -> r + int mHeight -> s + float mInnerRadiusRatio -> t + float mThicknessRatio -> u + int mInnerRadius -> v + int mThickness -> w + boolean mDither -> x + float mCenterX -> y + float mCenterY -> z + 1:1:void (com.batch.android.messaging.view.PositionableGradientDrawable$GradientState):0:0 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e0/g$b;)V"} + 1149:1149:void (com.batch.android.messaging.view.PositionableGradientDrawable$GradientState):1148:1148 -> + 1150:1249:void (com.batch.android.messaging.view.PositionableGradientDrawable$GradientState):1096:1195 -> + 1250:1250:void (com.batch.android.messaging.view.PositionableGradientDrawable$Orientation,int[],float[]):0:0 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e0/g$c;[I[F)V"} + 2392:2392:void (com.batch.android.messaging.view.PositionableGradientDrawable$Orientation,int[],float[]):1142:1142 -> + 2393:2442:void (com.batch.android.messaging.view.PositionableGradientDrawable$Orientation,int[],float[]):1096:1145 -> + 1:1:void access$100(com.batch.android.messaging.view.PositionableGradientDrawable$GradientState):0:0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e0/g$b;)V"} + 1094:1094:void access$100(com.batch.android.messaging.view.PositionableGradientDrawable$GradientState):1093:1093 -> a + 1095:1095:void computeOpacity():0:0 -> a + 2363:2382:void computeOpacity():1268:1287 -> a + 2383:2383:void setCornerRadii(float[]):0:0 -> a + 3690:3692:void setCornerRadii(float[]):1307:1309 -> a + 3693:3693:void setCornerRadius(float):0:0 -> a + 4995:4996:void setCornerRadius(float):1302:1303 -> a + 4997:4997:void setGradientCenter(float,float):0:0 -> a + 6243:6244:void setGradientCenter(float,float):1246:1247 -> a + 6245:6245:void setGradientColors(int[]):0:0 -> a + 7496:7498:void setGradientColors(int[]):1251:1253 -> a + 7499:7499:void setGradientRadius(float,int):0:0 -> a + 8818:8819:void setGradientRadius(float,int):1319:1320 -> a + 8820:8820:void setGradientType(int):0:0 -> a + 10062:10062:void setGradientType(int):1242:1242 -> a + 10063:10063:void setSize(int,int):0:0 -> a + 11377:11378:void setSize(int,int):1314:1315 -> a + 11379:11379:void setSolidColors(android.content.res.ColorStateList):0:0 -> a + 12641:12643:void setSolidColors(android.content.res.ColorStateList):1262:1264 -> a + 12644:12644:void setStroke(int,android.content.res.ColorStateList,float,float):0:0 -> a + 13935:13939:void setStroke(int,android.content.res.ColorStateList,float,float):1291:1295 -> a + 1:1:void setGradientPositions(float[]):0:0 -> b + 1258:1259:void setGradientPositions(float[]):1257:1258 -> b + 1260:1260:void setShape(int):0:0 -> b + 2497:2498:void setShape(int):1237:1238 -> b + 1:1:boolean canApplyTheme():0:0 -> canApplyTheme + 1201:1209:boolean canApplyTheme():1200:1208 -> canApplyTheme + 1:9:int getChangingConfigurations():1224:1232 -> getChangingConfigurations + 1:1:android.graphics.drawable.Drawable newDrawable():1214:1214 -> newDrawable + 2:2:android.graphics.drawable.Drawable newDrawable(android.content.res.Resources):1219:1219 -> newDrawable +com.batch.android.messaging.view.PositionableGradientDrawable$Orientation -> com.batch.android.e0.g$c: +# {"id":"sourceFile","fileName":"PositionableGradientDrawable.java"} + com.batch.android.messaging.view.PositionableGradientDrawable$Orientation TOP_BOTTOM -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e0/g$c;"} + com.batch.android.messaging.view.PositionableGradientDrawable$Orientation TR_BL -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e0/g$c;"} + com.batch.android.messaging.view.PositionableGradientDrawable$Orientation RIGHT_LEFT -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e0/g$c;"} + com.batch.android.messaging.view.PositionableGradientDrawable$Orientation BR_TL -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e0/g$c;"} + com.batch.android.messaging.view.PositionableGradientDrawable$Orientation BOTTOM_TOP -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e0/g$c;"} + com.batch.android.messaging.view.PositionableGradientDrawable$Orientation BL_TR -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e0/g$c;"} + com.batch.android.messaging.view.PositionableGradientDrawable$Orientation LEFT_RIGHT -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e0/g$c;"} + com.batch.android.messaging.view.PositionableGradientDrawable$Orientation TL_BR -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e0/g$c;"} + com.batch.android.messaging.view.PositionableGradientDrawable$Orientation[] $VALUES -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/e0/g$c;"} + 1:29:void ():133:161 -> + 30:30:void ():129:129 -> + 1:130:void (java.lang.String,int):0:129 -> + 1:130:com.batch.android.messaging.view.PositionableGradientDrawable$Orientation[] $values():0:129 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/e0/g$c;"} + 1:1:com.batch.android.messaging.view.PositionableGradientDrawable$Orientation valueOf(java.lang.String):129:129 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/e0/g$c;"} + 1:1:com.batch.android.messaging.view.PositionableGradientDrawable$Orientation[] values():129:129 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/e0/g$c;"} +com.batch.android.messaging.view.formats.BannerView -> com.batch.android.f0.a: +# {"id":"sourceFile","fileName":"BannerView.java"} + android.content.Context context -> a + com.batch.android.messaging.model.BaseBannerMessage message -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/d0/d;"} + com.batch.android.messaging.view.helper.ImageHelper$Cache imageCache -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/g0/a$a;"} + com.batch.android.messaging.css.Document style -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/z/d;"} + android.graphics.Point screenSizeDP -> e + com.batch.android.messaging.view.formats.BannerView$VerticalEdge pinnedVerticalEdge -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/f0/a$b;"} + com.batch.android.messaging.view.styled.SeparatedFlexboxLayout contentLayout -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/j0/a;"} + com.batch.android.messaging.view.CountdownView countdownView -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e0/a;"} + com.batch.android.messaging.view.roundimage.RoundedImageView imageView -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/i0/c;"} + com.batch.android.messaging.view.formats.BannerView$OnActionListener actionListener -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/f0/a$a;"} + long uptimeWhenShown -> k + int IMAGE_FADE_IN_ANIMATION_DURATION -> l + int BODY_MIN_HEIGHT_DP -> m + int BODY_MAX_HEIGHT_DP -> n + 1:114:void (android.content.Context,com.batch.android.messaging.model.BaseBannerMessage,com.batch.android.messaging.css.Document,com.batch.android.messaging.css.DOMNode,com.batch.android.messaging.view.helper.ImageHelper$Cache):0:113 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/d0/d;Lcom/batch/android/z/d;Lcom/batch/android/z/b;Lcom/batch/android/g0/a$a;)V"} + 115:153:void (android.content.Context,com.batch.android.messaging.model.BaseBannerMessage,com.batch.android.messaging.css.Document,com.batch.android.messaging.css.DOMNode,com.batch.android.messaging.view.helper.ImageHelper$Cache):112:150 -> + 1:383:void addCloseButton():0:382 -> a + 384:401:void addCloseButton():381:398 -> a + 402:833:com.batch.android.messaging.view.formats.BannerView$VerticalEdge getPinnedVerticalEdge(java.util.Map):0:431 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/util/Map;)Lcom/batch/android/f0/a$b;"} + 834:1284:java.util.Map getRulesForSeparator(com.batch.android.messaging.view.styled.SeparatedFlexboxLayout,java.lang.String):0:450 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/j0/a;Ljava/lang/String;)Ljava/util/Map;"} + 1285:1285:java.util.Map getRulesForSeparator(com.batch.android.messaging.view.styled.SeparatedFlexboxLayout,java.lang.String):449:449 -> a + 1286:1730:java.util.Map getRulesForView(com.batch.android.messaging.css.DOMNode):0:444 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/z/b;)Ljava/util/Map;"} + 1731:2070:android.view.View getStyledFlexboxSubview(android.util.Pair):0:339 -> a + 2071:2466:void lambda$addCloseButton$3(android.view.View):0:395 -> a + 2467:2769:void lambda$makeCTALayout$2(int,com.batch.android.messaging.model.CTA,android.view.View):0:302 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(ILcom/batch/android/d0/e;Landroid/view/View;)V"} + 2770:2770:void onImageDownloadError(com.batch.android.messaging.model.MessagingError):0:0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/h;)V"} + 2771:3263:void onImageDownloadSuccess(com.batch.android.messaging.AsyncImageDownloadTask$Result):0:492 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/y/a$d;)V"} + 1:421:void addCountdownView():0:420 -> b + 422:927:void displayImage(com.batch.android.messaging.AsyncImageDownloadTask$Result):0:505 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/y/a$d;)V"} + 928:1158:void lambda$makeContentLayout$1(android.view.View):0:230 -> b + 1159:1478:com.batch.android.messaging.view.styled.SeparatedFlexboxLayout makeCTALayout(java.util.Map):0:319 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/util/Map;)Lcom/batch/android/j0/a;"} + 1:143:void lambda$new$0(android.view.View):0:142 -> c + 144:404:com.batch.android.messaging.view.styled.SeparatedFlexboxLayout makeContentLayout(java.util.Map):0:260 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/util/Map;)Lcom/batch/android/j0/a;"} + 405:405:void onImageDownloadStart():0:0 -> c + 1:370:void addImage():0:369 -> d + 1:167:boolean canAutoClose():0:166 -> e + 1:1:boolean mustWaitTapDelay():455:455 -> f + 1:468:void onGlobalTap():0:467 -> g + 1:159:com.batch.android.messaging.view.styled.SeparatedFlexboxLayout getContentView():0:158 -> getContentView + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/j0/a;"} + 1:441:com.batch.android.messaging.view.formats.BannerView$VerticalEdge getPinnedVerticalEdge():0:440 -> getPinnedVerticalEdge + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/f0/a$b;"} + 1:163:void onShown():0:162 -> h + 1:172:void startAutoCloseCountdown():0:171 -> i + 1:479:void onAttachedToWindow():0:478 -> onAttachedToWindow + 1:155:void setActionListener(com.batch.android.messaging.view.formats.BannerView$OnActionListener):0:154 -> setActionListener + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/f0/a$a;)V"} +com.batch.android.messaging.view.formats.BannerView$OnActionListener -> com.batch.android.f0.a$a: +# {"id":"sourceFile","fileName":"BannerView.java"} + void onCTAAction(int,com.batch.android.messaging.model.CTA) -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(ILcom/batch/android/d0/e;)V"} + void onCloseAction() -> a + void onGlobalAction() -> b +com.batch.android.messaging.view.formats.BannerView$VerticalEdge -> com.batch.android.f0.a$b: +# {"id":"sourceFile","fileName":"BannerView.java"} + com.batch.android.messaging.view.formats.BannerView$VerticalEdge TOP -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/f0/a$b;"} + com.batch.android.messaging.view.formats.BannerView$VerticalEdge BOTTOM -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/f0/a$b;"} + com.batch.android.messaging.view.formats.BannerView$VerticalEdge[] $VALUES -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/f0/a$b;"} + 1:2:void ():510:511 -> + 3:3:void ():509:509 -> + 1:510:void (java.lang.String,int):0:509 -> + 1:510:com.batch.android.messaging.view.formats.BannerView$VerticalEdge[] $values():0:509 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/f0/a$b;"} + 1:1:com.batch.android.messaging.view.formats.BannerView$VerticalEdge valueOf(java.lang.String):509:509 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/f0/a$b;"} + 1:1:com.batch.android.messaging.view.formats.BannerView$VerticalEdge[] values():509:509 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/f0/a$b;"} +com.batch.android.messaging.view.formats.EmbeddedBannerContainer -> com.batch.android.f0.b: +# {"id":"sourceFile","fileName":"EmbeddedBannerContainer.java"} + android.content.Context context -> a + android.view.ViewGroup parentView -> b + com.batch.android.BatchMessage payloadMessage -> c + com.batch.android.messaging.model.BannerMessage message -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/d0/c;"} + com.batch.android.messaging.view.formats.EmbeddedBannerContainer$BaseView rootView -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/f0/b$d;"} + com.batch.android.messaging.view.formats.BannerView bannerView -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/f0/a;"} + com.batch.android.messaging.view.formats.BannerView$VerticalEdge pinnedVerticalEdge -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/f0/a$b;"} + boolean alreadyShown -> h + boolean alreadyDismissed -> i + com.batch.android.module.MessagingModule messagingModule -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/m0/h;"} + com.batch.android.MessagingAnalyticsDelegate analyticsDelegate -> k + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/h;"} + android.util.LruCache imageCache -> l + android.content.BroadcastReceiver dismissReceiver -> m + android.os.Handler mainThreadHandler -> n + java.lang.Object autoCloseHandlerToken -> o + int IN_OUT_ANIMATION_DURATION_MS -> p + 1:120:void (com.batch.android.module.MessagingModule,android.view.View,com.batch.android.BatchMessage,com.batch.android.messaging.model.BannerMessage,com.batch.android.MessagingAnalyticsDelegate,boolean):0:119 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/m0/h;Landroid/view/View;Lcom/batch/android/BatchMessage;Lcom/batch/android/d0/c;Lcom/batch/android/h;Z)V"} + 121:177:void (com.batch.android.module.MessagingModule,android.view.View,com.batch.android.BatchMessage,com.batch.android.messaging.model.BannerMessage,com.batch.android.MessagingAnalyticsDelegate,boolean):71:127 -> + 178:215:void (com.batch.android.module.MessagingModule,android.view.View,com.batch.android.BatchMessage,com.batch.android.messaging.model.BannerMessage,com.batch.android.MessagingAnalyticsDelegate,boolean):125:162 -> + 216:232:void (com.batch.android.module.MessagingModule,android.view.View,com.batch.android.BatchMessage,com.batch.android.messaging.model.BannerMessage,com.batch.android.MessagingAnalyticsDelegate,boolean):159:175 -> + 233:233:void (com.batch.android.module.MessagingModule,android.view.View,com.batch.android.BatchMessage,com.batch.android.messaging.model.BannerMessage,com.batch.android.MessagingAnalyticsDelegate,boolean):133:133 -> + 1:53:boolean access$000(com.batch.android.messaging.view.formats.EmbeddedBannerContainer):0:52 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/f0/b;)Z"} + 54:396:void dismiss(boolean):0:342 -> a + 397:595:android.view.ViewGroup findBestParentView(android.view.View):0:198 -> a + 596:963:void onCTAAction(int,com.batch.android.messaging.model.CTA):0:367 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(ILcom/batch/android/d0/e;)V"} + 964:1324:void onCloseAction():0:360 -> a + 1325:1710:void onDismiss(com.batch.android.messaging.view.PannableBannerFrameLayout):0:385 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e0/f;)V"} + 1711:1712:com.batch.android.messaging.view.formats.EmbeddedBannerContainer provide(android.view.View,com.batch.android.BatchMessage,com.batch.android.messaging.model.BannerMessage,com.batch.android.MessagingAnalyticsDelegate,boolean):101:102 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/view/View;Lcom/batch/android/BatchMessage;Lcom/batch/android/d0/c;Lcom/batch/android/h;Z)Lcom/batch/android/f0/b;"} + 1:53:android.content.BroadcastReceiver access$100(com.batch.android.messaging.view.formats.EmbeddedBannerContainer):0:52 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/f0/b;)Landroid/content/BroadcastReceiver;"} + 54:356:void dismissOnMainThread(boolean):0:302 -> b + 357:754:com.batch.android.messaging.AsyncImageDownloadTask$Result get(java.lang.String):0:397 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/y/a$d;"} + 755:1132:void onGlobalAction():0:377 -> b + 1133:1524:void put(com.batch.android.messaging.AsyncImageDownloadTask$Result):0:391 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/y/a$d;)V"} + 1:53:android.content.Context access$200(com.batch.android.messaging.view.formats.EmbeddedBannerContainer):0:52 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/f0/b;)Landroid/content/Context;"} + 54:356:void lambda$dismissOnMainThread$0(boolean):0:302 -> c + 357:711:int layoutGravityForPinnedEdge():0:354 -> c + 1:53:void access$300(com.batch.android.messaging.view.formats.EmbeddedBannerContainer):0:52 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/f0/b;)V"} + 54:55:com.batch.android.messaging.view.formats.BannerView makeBannerView():206:207 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/f0/a;"} + 1:53:void access$400(com.batch.android.messaging.view.formats.EmbeddedBannerContainer):0:52 -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/f0/b;)V"} + 54:351:void performAutoClose():0:297 -> e + 1:350:void removeFromParent():0:349 -> f + 1:286:void scheduleAutoClose():0:285 -> g + 1:278:void show():0:277 -> h + 1:292:void unscheduleAutoClose():0:291 -> i +com.batch.android.messaging.view.formats.EmbeddedBannerContainer$1 -> com.batch.android.f0.b$a: +# {"id":"sourceFile","fileName":"EmbeddedBannerContainer.java"} + com.batch.android.messaging.view.formats.EmbeddedBannerContainer this$0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/f0/b;"} + 1:81:void (com.batch.android.messaging.view.formats.EmbeddedBannerContainer):0:80 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/f0/b;)V"} + 1:85:void onReceive(android.content.Context,android.content.Intent):0:84 -> onReceive +com.batch.android.messaging.view.formats.EmbeddedBannerContainer$2 -> com.batch.android.f0.b$b: +# {"id":"sourceFile","fileName":"EmbeddedBannerContainer.java"} + com.batch.android.messaging.view.formats.EmbeddedBannerContainer this$0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/f0/b;"} + 1:266:void (com.batch.android.messaging.view.formats.EmbeddedBannerContainer):0:265 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/f0/b;)V"} + 1:1:void onViewAttachedToWindow(android.view.View):0:0 -> onViewAttachedToWindow + 1:273:void onViewDetachedFromWindow(android.view.View):0:272 -> onViewDetachedFromWindow +com.batch.android.messaging.view.formats.EmbeddedBannerContainer$3 -> com.batch.android.f0.b$c: +# {"id":"sourceFile","fileName":"EmbeddedBannerContainer.java"} + com.batch.android.messaging.view.formats.EmbeddedBannerContainer this$0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/f0/b;"} + 1:318:void (com.batch.android.messaging.view.formats.EmbeddedBannerContainer):0:317 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/f0/b;)V"} + 1:329:void onAnimationCancel(android.animation.Animator):0:328 -> onAnimationCancel + 1:324:void onAnimationEnd(android.animation.Animator):0:323 -> onAnimationEnd + 1:1:void onAnimationRepeat(android.animation.Animator):0:0 -> onAnimationRepeat + 1:1:void onAnimationStart(android.animation.Animator):0:0 -> onAnimationStart +com.batch.android.messaging.view.formats.EmbeddedBannerContainer$BaseView -> com.batch.android.f0.b$d: +# {"id":"sourceFile","fileName":"EmbeddedBannerContainer.java"} + 1:407:void (android.content.Context):0:406 -> + 1:413:void onAttachedToWindow():0:412 -> onAttachedToWindow +com.batch.android.messaging.view.formats.ImageFormatView -> com.batch.android.f0.c: +# {"id":"sourceFile","fileName":"ImageFormatView.java"} + android.content.Context context -> a + com.batch.android.messaging.model.ImageMessage message -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/d0/f;"} + com.batch.android.messaging.view.helper.ImageHelper$Cache imageCache -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/g0/a$a;"} + com.batch.android.messaging.css.Document style -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/z/d;"} + android.graphics.Point screenSizeDP -> e + com.batch.android.messaging.view.AnimatedCloseButton closeButton -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/messaging/view/a;"} + android.widget.RelativeLayout rootContainerView -> g + com.batch.android.messaging.view.formats.ImageFormatView$ImageContainerView imageContainerView -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/f0/c$a;"} + android.widget.ProgressBar imageViewLoader -> i + com.batch.android.messaging.view.roundimage.RoundedImageView imageView -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/i0/c;"} + com.batch.android.messaging.view.formats.ImageFormatView$OnActionListener actionListener -> k + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/f0/c$b;"} + long uptimeWhenShown -> l + com.batch.android.core.Promise viewShownPromise -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/a0;"} + float CLOSE_SIZE_DP -> n + float FULLSCREEN_CLOSE_BUTTON_MARGIN_DP -> o + float CLOSE_PADDING_DP -> p + float MODAL_CONTAINER_MARGIN_DP -> q + int IMAGE_FADE_IN_ANIMATION_DURATION -> r + 1:98:void (android.content.Context,com.batch.android.messaging.model.ImageMessage,com.batch.android.messaging.css.Document,com.batch.android.messaging.view.helper.ImageHelper$Cache):0:97 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/d0/f;Lcom/batch/android/z/d;Lcom/batch/android/g0/a$a;)V"} + 99:143:void (android.content.Context,com.batch.android.messaging.model.ImageMessage,com.batch.android.messaging.css.Document,com.batch.android.messaging.view.helper.ImageHelper$Cache):82:126 -> + 1:171:void addBackgroundView():0:170 -> a + 172:466:com.batch.android.messaging.view.AnimatedCloseButton addCloseButton(android.widget.RelativeLayout,android.view.View):0:294 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/widget/RelativeLayout;Landroid/view/View;)Lcom/batch/android/messaging/view/a;"} + 467:688:com.batch.android.messaging.view.formats.ImageFormatView$ImageContainerView addImageContainer(android.widget.RelativeLayout):0:221 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/widget/RelativeLayout;)Lcom/batch/android/f0/c$a;"} + 689:846:java.util.Map getRulesForView(com.batch.android.messaging.css.DOMNode):0:157 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/z/b;)Ljava/util/Map;"} + 847:1138:void lambda$addCloseButton$1(android.view.View):0:291 -> a + 1139:1522:void lambda$displayImage$2(java.lang.Void):0:383 -> a + 1523:1871:void onImageDownloadError(com.batch.android.messaging.model.MessagingError):0:348 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/h;)V"} + 1872:2212:void onImageDownloadSuccess(com.batch.android.messaging.AsyncImageDownloadTask$Result):0:340 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/y/a$d;)V"} + 2213:2225:android.widget.ProgressBar addImageLoader(android.widget.FrameLayout):243:255 -> a + 1:379:void displayImage(com.batch.android.messaging.AsyncImageDownloadTask$Result):0:378 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/y/a$d;)V"} + 380:599:void lambda$addImageContainer$0(android.view.View):0:219 -> b + 600:611:android.widget.RelativeLayout addRootContainerView():174:185 -> b + 612:624:com.batch.android.messaging.view.roundimage.RoundedImageView addImageView(android.widget.FrameLayout):226:238 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/widget/FrameLayout;)Lcom/batch/android/i0/c;"} + 1:1:void onImageDownloadStart():0:0 -> c + 1:147:boolean canAutoClose():0:146 -> d + 1:1:boolean mustWaitTapDelay():303:303 -> e + 1:316:void onGlobalTap():0:315 -> f + 1:143:void onShown():0:142 -> g + 1:139:android.view.View getPanEffectsView():0:138 -> getPanEffectsView + 1:135:com.batch.android.messaging.view.formats.ImageFormatView$ImageContainerView getPannableView():0:134 -> getPannableView + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/f0/c$a;"} + 1:153:void startAutoCloseCountdown():0:152 -> h + 1:403:android.view.WindowInsets onApplyWindowInsets(android.view.WindowInsets):0:402 -> onApplyWindowInsets + 404:413:android.view.WindowInsets onApplyWindowInsets(android.view.WindowInsets):398:407 -> onApplyWindowInsets + 1:330:void onAttachedToWindow():0:329 -> onAttachedToWindow + 1:131:void setActionListener(com.batch.android.messaging.view.formats.ImageFormatView$OnActionListener):0:130 -> setActionListener + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/f0/c$b;)V"} +com.batch.android.messaging.view.formats.ImageFormatView$ImageContainerView -> com.batch.android.f0.c$a: +# {"id":"sourceFile","fileName":"ImageFormatView.java"} + com.batch.android.messaging.view.DelegatedTouchEventViewGroup$Delegate delegate -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e0/b$a;"} + 1:436:void (android.content.Context,com.batch.android.messaging.Size2D):0:435 -> + 1:470:boolean superOnTouchEvent(android.view.MotionEvent):0:469 -> a + 1:465:boolean superOnInterceptTouchEvent(android.view.MotionEvent):0:464 -> b + 1:444:boolean onInterceptTouchEvent(android.view.MotionEvent):0:443 -> onInterceptTouchEvent + 1:454:boolean onTouchEvent(android.view.MotionEvent):0:453 -> onTouchEvent + 1:460:void setTouchEventDelegate(com.batch.android.messaging.view.DelegatedTouchEventViewGroup$Delegate):0:459 -> setTouchEventDelegate + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e0/b$a;)V"} +com.batch.android.messaging.view.formats.ImageFormatView$OnActionListener -> com.batch.android.f0.c$b: +# {"id":"sourceFile","fileName":"ImageFormatView.java"} + void onCloseAction() -> a + void onErrorAction(com.batch.android.messaging.model.MessagingError) -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/h;)V"} + void onGlobalAction() -> b + void onImageDisplayedAction() -> d +com.batch.android.messaging.view.formats.UniversalRootView -> com.batch.android.f0.d: +# {"id":"sourceFile","fileName":"UniversalRootView.java"} + int HERO_LAYOUT_ID -> A + long TAP_DELAY_MILLIS -> B + boolean landscape -> b + boolean childRelayoutingNeeded -> c + android.content.Context context -> d + android.widget.FrameLayout heroLayout -> e + com.batch.android.messaging.view.styled.SeparatedFlexboxLayout contentLayout -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/j0/a;"} + com.batch.android.messaging.view.styled.SeparatedFlexboxLayout ctasLayout -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/j0/a;"} + java.util.Map contentStyleRules -> h + java.util.Map ctasStyleRules -> i + com.batch.android.messaging.view.AnimatedCloseButton closeButton -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/messaging/view/a;"} + android.view.TextureView videoView -> k + com.batch.android.messaging.view.roundimage.RoundedImageView heroImageView -> l + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/i0/c;"} + android.view.View heroPlaceholder -> m + android.widget.ProgressBar heroLoader -> n + com.batch.android.messaging.model.UniversalMessage message -> o + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/d0/j;"} + com.batch.android.messaging.css.Document style -> p + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/z/d;"} + boolean waitForHeroImage -> q + com.batch.android.messaging.AsyncImageDownloadTask$Result heroDownloadResult -> r + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/y/a$d;"} + com.batch.android.messaging.view.formats.UniversalRootView$OnActionListener actionListener -> s + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/f0/d$a;"} + android.view.TextureView$SurfaceTextureListener surfaceHolderCallback -> t + android.graphics.Point screenSizeDP -> u + int topInset -> v + int originalContentPaddingTop -> w + int originalCloseMarginTop -> x + long drawTimeMillis -> y + double DEFAULT_HERO_SPLIT_RATIO -> z + 1:108:void (android.content.Context,com.batch.android.messaging.model.UniversalMessage,com.batch.android.messaging.css.Document,com.batch.android.messaging.AsyncImageDownloadTask$Result,boolean):0:107 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/d0/j;Lcom/batch/android/z/d;Lcom/batch/android/y/a$d;Z)V"} + 109:167:void (android.content.Context,com.batch.android.messaging.model.UniversalMessage,com.batch.android.messaging.css.Document,com.batch.android.messaging.AsyncImageDownloadTask$Result,boolean):66:124 -> + 1:547:boolean canAutoClose():0:546 -> a + 548:876:android.view.View getConfiguredView(android.util.Pair):0:328 -> a + 877:1514:java.util.Map getRulesForSeparator(com.batch.android.messaging.view.styled.SeparatedFlexboxLayout,java.lang.String):0:637 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/j0/a;Ljava/lang/String;)Ljava/util/Map;"} + 1515:1515:java.util.Map getRulesForSeparator(com.batch.android.messaging.view.styled.SeparatedFlexboxLayout,java.lang.String):636:636 -> a + 1516:2147:java.util.Map getRulesForView(com.batch.android.messaging.css.DOMNode):0:631 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/z/b;)Ljava/util/Map;"} + 2148:2334:void lambda$createViews$0(android.view.View):0:186 -> a + 2335:2613:void lambda$setupContentLayout$1(int,com.batch.android.messaging.model.CTA,android.view.View):0:278 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(ILcom/batch/android/d0/e;Landroid/view/View;)V"} + 2614:3194:void onHeroDownloaded(com.batch.android.messaging.AsyncImageDownloadTask$Result):0:580 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/y/a$d;)V"} + 1:40:void createViews():156:195 -> b + 1:542:void displayHero():0:541 -> c + 1:1:boolean mustWaitTapDelay():627:627 -> d + 1:152:void dispatchDraw(android.graphics.Canvas):0:151 -> dispatchDraw + 1:570:void onHeroBitmapStartsDownloading():0:569 -> e + 1:107:void setupContentLayout():201:307 -> f + 1:429:void setupCtaLayoutIfNeeded():0:428 -> g + 1:75:void setupHeroLayout():334:408 -> h + 1:535:void setupVariableLayoutParameters():0:534 -> i + 1:621:boolean shouldApplyWindowInsetToContent():0:620 -> j + 1:553:void startAutoCloseCountdown():0:552 -> k + 1:608:void updateLayoutInsets():0:607 -> l + 609:620:void updateLayoutInsets():603:614 -> l + 1:594:android.view.WindowInsets onApplyWindowInsets(android.view.WindowInsets):0:593 -> onApplyWindowInsets + 595:601:android.view.WindowInsets onApplyWindowInsets(android.view.WindowInsets):589:595 -> onApplyWindowInsets + 1:143:void onDraw(android.graphics.Canvas):0:142 -> onDraw + 1:135:void onSizeChanged(int,int,int,int):0:134 -> onSizeChanged + 1:558:void setActionListener(com.batch.android.messaging.view.formats.UniversalRootView$OnActionListener):0:557 -> setActionListener + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/f0/d$a;)V"} + 1:566:void setSurfaceHolderCallback(android.view.TextureView$SurfaceTextureListener):0:565 -> setSurfaceHolderCallback +com.batch.android.messaging.view.formats.UniversalRootView$OnActionListener -> com.batch.android.f0.d$a: +# {"id":"sourceFile","fileName":"UniversalRootView.java"} + void onCTAAction(int,com.batch.android.messaging.model.CTA) -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(ILcom/batch/android/d0/e;)V"} + void onCloseAction() -> a +com.batch.android.messaging.view.formats.WebFormatView -> com.batch.android.f0.e: +# {"id":"sourceFile","fileName":"WebFormatView.java"} + android.content.Context context -> a + com.batch.android.messaging.model.WebViewMessage message -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/d0/k;"} + com.batch.android.messaging.css.Document style -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/z/d;"} + android.graphics.Point screenSizeDP -> d + com.batch.android.messaging.view.AnimatedCloseButton closeButton -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/messaging/view/a;"} + android.widget.RelativeLayout rootContainerView -> f + android.widget.ProgressBar webViewLoader -> g + android.os.Handler timeoutHandler -> h + com.batch.android.messaging.view.styled.WebView webView -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/j0/d;"} + boolean timeoutDone -> j + com.batch.android.messaging.WebViewActionListener actionListener -> k + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/y/e;"} + java.lang.String STATE_TIMEOUT_DONE_KEY -> l + float CLOSE_SIZE_DP -> m + float CLOSE_PADDING_DP -> n + float FULLSCREEN_CLOSE_BUTTON_MARGIN_DP -> o + 1:101:void (android.content.Context,com.batch.android.messaging.model.WebViewMessage,com.batch.android.messaging.css.Document,com.batch.android.BatchMessagingWebViewJavascriptBridge):0:100 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/d0/k;Lcom/batch/android/z/d;Lcom/batch/android/BatchMessagingWebViewJavascriptBridge;)V"} + 102:364:void (android.content.Context,com.batch.android.messaging.model.WebViewMessage,com.batch.android.messaging.css.Document,com.batch.android.BatchMessagingWebViewJavascriptBridge):84:346 -> + 1:64:com.batch.android.messaging.WebViewActionListener access$000(com.batch.android.messaging.view.formats.WebFormatView):0:63 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/f0/e;)Lcom/batch/android/y/e;"} + 65:128:boolean access$402(com.batch.android.messaging.view.formats.WebFormatView,boolean):0:63 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/f0/e;Z)Z"} + 129:192:void access$500(com.batch.android.messaging.view.formats.WebFormatView,java.lang.String,int):0:63 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/f0/e;Ljava/lang/String;I)V"} + 193:256:void access$600(com.batch.android.messaging.view.formats.WebFormatView,com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause,com.batch.android.messaging.model.MessagingError,java.lang.String):0:63 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/f0/e;Lcom/batch/android/BatchMessagingWebViewJavascriptBridge$e;Lcom/batch/android/d0/h;Ljava/lang/String;)V"} + 257:669:void closeMessageWithError(com.batch.android.BatchMessagingWebViewJavascriptBridge$DevelopmentErrorCause,com.batch.android.messaging.model.MessagingError,java.lang.String):0:412 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/BatchMessagingWebViewJavascriptBridge$e;Lcom/batch/android/d0/h;Ljava/lang/String;)V"} + 670:1129:java.util.Map getRulesForView(com.batch.android.messaging.css.DOMNode):0:459 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/z/b;)Ljava/util/Map;"} + 1130:1521:void handleWebViewError(java.lang.String,int):0:391 -> a + 1522:2074:void lambda$addCloseButton$0(android.view.View):0:552 -> a + 2075:2521:void restoreState(android.os.Bundle):0:446 -> a + 2522:2528:android.widget.RelativeLayout addRootContainerView():465:471 -> a + 2529:2552:com.batch.android.messaging.view.AnimatedCloseButton addCloseButton(android.widget.RelativeLayout):532:555 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/widget/RelativeLayout;)Lcom/batch/android/messaging/view/a;"} + 1:64:void access$100(com.batch.android.messaging.view.formats.WebFormatView):0:63 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/f0/e;)V"} + 65:65:boolean canAutoClose():0:0 -> b + 66:504:void saveState(android.os.Bundle):0:438 -> b + 505:515:com.batch.android.messaging.view.styled.WebView addWebView(android.widget.RelativeLayout):476:486 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/widget/RelativeLayout;)Lcom/batch/android/j0/d;"} + 1:64:void access$200(com.batch.android.messaging.view.formats.WebFormatView):0:63 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/f0/e;)V"} + 65:586:android.widget.ProgressBar addWebViewLoader(android.widget.RelativeLayout):0:521 -> c + 587:983:void closeMessage():0:396 -> c + 1:64:androidx.appcompat.app.AlertDialog$Builder access$300(com.batch.android.messaging.view.formats.WebFormatView):0:63 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/f0/e;)Landroidx/appcompat/app/AlertDialog$Builder;"} + 65:467:void dismissMessage():0:402 -> d + 1:1:androidx.appcompat.app.AlertDialog$Builder makeAlertBuilder():455:455 -> e + 1:426:void performTimeout():0:425 -> f + 1:528:void removeWebViewLoader():0:527 -> g + 1:351:android.view.View getCloseButton():0:350 -> getCloseButton + 1:420:void scheduleTimeout():0:419 -> h + 1:369:void startLoading():0:368 -> i + 1:574:android.view.WindowInsets onApplyWindowInsets(android.view.WindowInsets):0:573 -> onApplyWindowInsets + 575:584:android.view.WindowInsets onApplyWindowInsets(android.view.WindowInsets):569:578 -> onApplyWindowInsets + 1:431:void setActionListener(com.batch.android.messaging.WebViewActionListener):0:430 -> setActionListener + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/y/e;)V"} +com.batch.android.messaging.view.formats.WebFormatView$1 -> com.batch.android.f0.e$a: +# {"id":"sourceFile","fileName":"WebFormatView.java"} + android.content.Context val$context -> a + com.batch.android.messaging.view.formats.WebFormatView this$0 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/f0/e;"} + 1:130:void (com.batch.android.messaging.view.formats.WebFormatView,android.content.Context):0:129 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/f0/e;Landroid/content/Context;)V"} + 1:190:void lambda$onJsAlert$0(android.webkit.JsResult,android.content.DialogInterface,int):0:189 -> a + 191:384:void lambda$onJsAlert$1(android.webkit.JsResult,android.content.DialogInterface):0:193 -> a + 385:623:void lambda$onJsPrompt$4(android.widget.EditText,android.webkit.JsPromptResult,android.content.DialogInterface,int):0:238 -> a + 624:868:void lambda$onJsPrompt$5(android.webkit.JsPromptResult,android.content.DialogInterface,int):0:244 -> a + 869:1117:void lambda$onJsPrompt$6(android.webkit.JsPromptResult,android.content.DialogInterface):0:248 -> a + 1:209:void lambda$onJsConfirm$2(android.webkit.JsResult,android.content.DialogInterface,int):0:208 -> b + 210:422:void lambda$onJsConfirm$3(android.webkit.JsResult,android.content.DialogInterface):0:212 -> b + 1:170:void onCloseWindow(android.webkit.WebView):0:169 -> onCloseWindow + 1:163:boolean onCreateWindow(android.webkit.WebView,boolean,boolean,android.os.Message):0:162 -> onCreateWindow + 1:197:boolean onJsAlert(android.webkit.WebView,java.lang.String,java.lang.String,android.webkit.JsResult):0:196 -> onJsAlert + 1:216:boolean onJsConfirm(android.webkit.WebView,java.lang.String,java.lang.String,android.webkit.JsResult):0:215 -> onJsConfirm + 1:252:boolean onJsPrompt(android.webkit.WebView,java.lang.String,java.lang.String,java.lang.String,android.webkit.JsPromptResult):0:251 -> onJsPrompt + 1:178:void onProgressChanged(android.webkit.WebView,int):0:177 -> onProgressChanged +com.batch.android.messaging.view.formats.WebFormatView$2 -> com.batch.android.f0.e$b: +# {"id":"sourceFile","fileName":"WebFormatView.java"} + boolean mainFrameFinished -> a + com.batch.android.messaging.view.formats.WebFormatView this$0 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/f0/e;"} + 1:260:void (com.batch.android.messaging.view.formats.WebFormatView):0:259 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/f0/e;)V"} + 1:272:void onBatchPageStartedDrawing():0:271 -> a + 1:279:void onPageCommitVisible(android.webkit.WebView,java.lang.String):0:278 -> onPageCommitVisible + 1:288:void onPageFinished(android.webkit.WebView,java.lang.String):0:287 -> onPageFinished + 1:302:void onReceivedError(android.webkit.WebView,int,java.lang.String,java.lang.String):0:301 -> onReceivedError + 303:642:void onReceivedError(android.webkit.WebView,android.webkit.WebResourceRequest,android.webkit.WebResourceError):0:339 -> onReceivedError + 1:326:void onReceivedHttpError(android.webkit.WebView,android.webkit.WebResourceRequest,android.webkit.WebResourceResponse):0:325 -> onReceivedHttpError + 327:327:void onReceivedHttpError(android.webkit.WebView,android.webkit.WebResourceRequest,android.webkit.WebResourceResponse):322:322 -> onReceivedHttpError + 1:310:void onReceivedSslError(android.webkit.WebView,android.webkit.SslErrorHandler,android.net.http.SslError):0:309 -> onReceivedSslError +com.batch.android.messaging.view.helper.ImageHelper -> com.batch.android.g0.a: +# {"id":"sourceFile","fileName":"ImageHelper.java"} + 1:12:void ():0:11 -> + 1:35:void setDownloadResultInImage(android.widget.ImageView,com.batch.android.messaging.AsyncImageDownloadTask$Result):0:34 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/widget/ImageView;Lcom/batch/android/y/a$d;)V"} +com.batch.android.messaging.view.helper.ImageHelper$Cache -> com.batch.android.g0.a$a: +# {"id":"sourceFile","fileName":"ImageHelper.java"} + com.batch.android.messaging.AsyncImageDownloadTask$Result get(java.lang.String) -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/y/a$d;"} + void put(com.batch.android.messaging.AsyncImageDownloadTask$Result) -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/y/a$d;)V"} +com.batch.android.messaging.view.helper.StyleHelper -> com.batch.android.g0.b: +# {"id":"sourceFile","fileName":"StyleHelper.java"} + java.lang.String TAG -> a + int RIPPLE_COLOR -> b + 1:1:void ():50:50 -> + 1:56:void ():0:55 -> + 1:137:void applyCommonRules(android.view.View,java.util.Map):0:136 -> a + 138:287:void applyCommonRules(android.view.View,java.util.Map):133:282 -> a + 288:348:void applyCommonRules(android.view.View,java.util.Map):241:301 -> a + 349:349:void applyCommonRules(android.view.View,java.util.Map):297:297 -> a + 350:1066:int darkenColor(int):0:716 -> a + 1067:1700:int dpToPixels(android.content.res.Resources,java.lang.Float):0:633 -> a + 1701:2103:com.batch.android.messaging.view.FlexboxLayout$LayoutParams getFlexLayoutParams(android.content.Context,com.batch.android.messaging.view.FlexboxLayout$LayoutParams,java.util.Map):0:402 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/e0/d$h;Ljava/util/Map;)Lcom/batch/android/e0/d$h;"} + 2104:2104:com.batch.android.messaging.view.FlexboxLayout$LayoutParams getFlexLayoutParams(android.content.Context,com.batch.android.messaging.view.FlexboxLayout$LayoutParams,java.util.Map):398:398 -> a + 2105:2712:android.widget.FrameLayout$LayoutParams getFrameLayoutParams(android.content.Context,android.widget.FrameLayout$LayoutParams,java.util.Map):0:607 -> a + 2713:2757:android.widget.FrameLayout$LayoutParams getFrameLayoutParams(android.content.Context,android.widget.FrameLayout$LayoutParams,java.util.Map):572:616 -> a + 2758:2758:android.widget.FrameLayout$LayoutParams getFrameLayoutParams(android.content.Context,android.widget.FrameLayout$LayoutParams,java.util.Map):612:612 -> a + 2759:3492:android.graphics.drawable.Drawable getPressableGradientDrawable(com.batch.android.messaging.view.PositionableGradientDrawable):0:733 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e0/g;)Landroid/graphics/drawable/Drawable;"} + 3493:4007:com.batch.android.messaging.view.percent.PercentRelativeLayout$LayoutParams getRelativeLayoutParams(android.content.Context,com.batch.android.messaging.view.percent.PercentRelativeLayout$LayoutParams,java.util.Map,int,android.view.View):0:514 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/h0/c$a;Ljava/util/Map;ILandroid/view/View;)Lcom/batch/android/h0/c$a;"} + 4008:4083:com.batch.android.messaging.view.percent.PercentRelativeLayout$LayoutParams getRelativeLayoutParams(android.content.Context,com.batch.android.messaging.view.percent.PercentRelativeLayout$LayoutParams,java.util.Map,int,android.view.View):452:527 -> a + 4084:4084:com.batch.android.messaging.view.percent.PercentRelativeLayout$LayoutParams getRelativeLayoutParams(android.content.Context,com.batch.android.messaging.view.percent.PercentRelativeLayout$LayoutParams,java.util.Map,int,android.view.View):523:523 -> a + 4085:4767:java.lang.Float optFloat(java.lang.String):0:682 -> a + 1:664:java.lang.Integer optInt(java.lang.String):0:663 -> b + 665:1312:float pixelsToDp(android.content.res.Resources,java.lang.Float):0:647 -> b + 1:701:int parseColor(java.lang.String):0:700 -> c + 1:70:com.batch.android.messaging.css.Document parseStyle(java.lang.String):0:69 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/z/d;"} + 71:79:com.batch.android.messaging.css.Document parseStyle(java.lang.String):65:73 -> d +com.batch.android.messaging.view.helper.ThemeHelper -> com.batch.android.g0.c: +# {"id":"sourceFile","fileName":"ThemeHelper.java"} + 1:13:void ():0:12 -> + 1:62:int getDefaultLightTheme(android.content.Context):0:61 -> a + 63:138:int getThemeByName(java.lang.String,android.content.res.Resources,java.lang.String):0:75 -> a + 1:40:int getDefaultTheme(android.content.Context):0:39 -> b +com.batch.android.messaging.view.helper.ViewCompat -> com.batch.android.g0.d: +# {"id":"sourceFile","fileName":"ViewCompat.java"} + 1:32:void ():0:31 -> + 1:61:android.graphics.Point getScreenSize(android.content.Context):0:60 -> a + 62:62:int generateViewId():40:40 -> a + 1:79:boolean isTouchExplorationEnabled(android.content.Context):0:78 -> b +com.batch.android.messaging.view.percent.PercentFrameLayout -> com.batch.android.h0.a: +# {"id":"sourceFile","fileName":"PercentFrameLayout.java"} + com.batch.android.messaging.view.percent.PercentLayoutHelper mHelper -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/h0/b;"} + 1:71:void (android.content.Context):0:70 -> + 72:72:void (android.content.Context):67:67 -> + 73:147:void (android.content.Context,android.util.AttributeSet):0:74 -> + 148:148:void (android.content.Context,android.util.AttributeSet):67:67 -> + 149:227:void (android.content.Context,android.util.AttributeSet,int):0:78 -> + 228:228:void (android.content.Context,android.util.AttributeSet,int):67:67 -> + 1:94:void onLayout(boolean,int,int,int,int):0:93 -> onLayout + 1:87:void onMeasure(int,int):0:86 -> onMeasure +com.batch.android.messaging.view.percent.PercentFrameLayout$LayoutParams -> com.batch.android.h0.a$a: +# {"id":"sourceFile","fileName":"PercentFrameLayout.java"} + com.batch.android.messaging.view.percent.PercentLayoutHelper$PercentLayoutInfo mPercentLayoutInfo -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/h0/b$a;"} + 1:104:void (int,int):0:103 -> + 105:212:void (int,int,int):0:107 -> + 213:324:void (android.view.ViewGroup$LayoutParams):0:111 -> + 325:440:void (android.view.ViewGroup$MarginLayoutParams):0:115 -> + 441:561:void (android.widget.FrameLayout$LayoutParams):0:120 -> + 562:687:void (com.batch.android.messaging.view.percent.PercentFrameLayout$LayoutParams):0:125 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/h0/a$a;)V"} + 1:135:com.batch.android.messaging.view.percent.PercentLayoutHelper$PercentLayoutInfo getPercentLayoutInfo():0:134 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/h0/b$a;"} + 1:140:void setBaseAttributes(android.content.res.TypedArray,int,int):0:139 -> setBaseAttributes +com.batch.android.messaging.view.percent.PercentLayoutHelper -> com.batch.android.h0.b: +# {"id":"sourceFile","fileName":"PercentLayoutHelper.java"} + android.view.ViewGroup mHost -> a + java.lang.String TAG -> b + 1:77:void (android.view.ViewGroup):0:76 -> + 1:92:void fetchWidthAndHeight(android.view.ViewGroup$LayoutParams,android.content.res.TypedArray,int,int):0:91 -> a + 93:295:boolean handleMeasuredStateTooSmall():0:202 -> a + 296:514:boolean shouldHandleMeasuredHeightTooSmall(android.view.View,com.batch.android.messaging.view.percent.PercentLayoutHelper$PercentLayoutInfo):0:218 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/view/View;Lcom/batch/android/h0/b$a;)Z"} + 515:523:void adjustChildren(int,int):102:110 -> a + 524:551:void adjustChildren(int,int):103:130 -> a + 1:159:void restoreOriginalParams():0:158 -> b + 160:369:boolean shouldHandleMeasuredWidthTooSmall(android.view.View,com.batch.android.messaging.view.percent.PercentLayoutHelper$PercentLayoutInfo):0:209 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/view/View;Lcom/batch/android/h0/b$a;)Z"} +com.batch.android.messaging.view.percent.PercentLayoutHelper$PercentLayoutInfo -> com.batch.android.h0.b$a: +# {"id":"sourceFile","fileName":"PercentLayoutHelper.java"} + float widthPercent -> a + float heightPercent -> b + float leftMarginPercent -> c + float topMarginPercent -> d + float rightMarginPercent -> e + float bottomMarginPercent -> f + float startMarginPercent -> g + float endMarginPercent -> h + android.view.ViewGroup$MarginLayoutParams mPreservedParams -> i + 1:259:void ():0:258 -> + 1:277:void fillLayoutParams(android.view.ViewGroup$LayoutParams,int,int):0:276 -> a + 278:592:void fillMarginLayoutParams(android.view.ViewGroup$MarginLayoutParams,int,int):0:314 -> a + 593:949:void restoreLayoutParams(android.view.ViewGroup$LayoutParams):0:356 -> a + 950:1296:void restoreMarginLayoutParams(android.view.ViewGroup$MarginLayoutParams):0:346 -> a + 1:11:java.lang.String toString():320:330 -> toString + 12:12:java.lang.String toString():320:320 -> toString +com.batch.android.messaging.view.percent.PercentLayoutHelper$PercentLayoutParams -> com.batch.android.h0.b$b: +# {"id":"sourceFile","fileName":"PercentLayoutHelper.java"} + com.batch.android.messaging.view.percent.PercentLayoutHelper$PercentLayoutInfo getPercentLayoutInfo() -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/h0/b$a;"} +com.batch.android.messaging.view.percent.PercentRelativeLayout -> com.batch.android.h0.c: +# {"id":"sourceFile","fileName":"PercentRelativeLayout.java"} + com.batch.android.messaging.view.percent.PercentLayoutHelper mHelper -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/h0/b;"} + 1:71:void (android.content.Context):0:70 -> + 72:72:void (android.content.Context):67:67 -> + 73:147:void (android.content.Context,android.util.AttributeSet):0:74 -> + 148:148:void (android.content.Context,android.util.AttributeSet):67:67 -> + 149:227:void (android.content.Context,android.util.AttributeSet,int):0:78 -> + 228:228:void (android.content.Context,android.util.AttributeSet,int):67:67 -> + 1:94:void onLayout(boolean,int,int,int,int):0:93 -> onLayout + 1:87:void onMeasure(int,int):0:86 -> onMeasure +com.batch.android.messaging.view.percent.PercentRelativeLayout$LayoutParams -> com.batch.android.h0.c$a: +# {"id":"sourceFile","fileName":"PercentRelativeLayout.java"} + com.batch.android.messaging.view.percent.PercentLayoutHelper$PercentLayoutInfo mPercentLayoutInfo -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/h0/b$a;"} + 1:104:void (int,int):0:103 -> + 105:212:void (android.view.ViewGroup$LayoutParams):0:107 -> + 213:324:void (android.view.ViewGroup$MarginLayoutParams):0:111 -> + 1:121:com.batch.android.messaging.view.percent.PercentLayoutHelper$PercentLayoutInfo getPercentLayoutInfo():0:120 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/h0/b$a;"} + 1:126:void setBaseAttributes(android.content.res.TypedArray,int,int):0:125 -> setBaseAttributes +com.batch.android.messaging.view.roundimage.Corner -> com.batch.android.i0.a: +# {"id":"sourceFile","fileName":"Corner.java"} + int TOP_LEFT -> a + int TOP_RIGHT -> b + int BOTTOM_RIGHT -> c + int BOTTOM_LEFT -> d +com.batch.android.messaging.view.roundimage.RoundedDrawable -> com.batch.android.i0.b: +# {"id":"sourceFile","fileName":"RoundedDrawable.java"} + android.graphics.RectF mBounds -> a + android.graphics.RectF mDrawableRect -> b + android.graphics.RectF mBitmapRect -> c + android.graphics.Bitmap mBitmap -> d + android.graphics.Paint mBitmapPaint -> e + int mBitmapWidth -> f + int mBitmapHeight -> g + android.graphics.RectF mBorderRect -> h + android.graphics.Paint mBorderPaint -> i + android.graphics.Matrix mShaderMatrix -> j + android.graphics.RectF mSquareCornersRect -> k + android.graphics.Shader$TileMode mTileModeX -> l + android.graphics.Shader$TileMode mTileModeY -> m + boolean mRebuildShader -> n + float mCornerRadius -> o + boolean[] mCornersRounded -> p + boolean mOval -> q + float mBorderWidth -> r + android.content.res.ColorStateList mBorderColor -> s + android.widget.ImageView$ScaleType mScaleType -> t + java.lang.String TAG -> u + int DEFAULT_BORDER_COLOR -> v + 1:75:void (android.graphics.Bitmap):0:74 -> + 76:116:void (android.graphics.Bitmap):49:89 -> + 1:622:boolean all(boolean[]):0:621 -> a + 623:767:android.graphics.Bitmap drawableToBitmap(android.graphics.drawable.Drawable):0:144 -> a + 768:862:com.batch.android.messaging.view.roundimage.RoundedDrawable fromBitmap(android.graphics.Bitmap):0:94 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/graphics/Bitmap;)Lcom/batch/android/i0/b;"} + 863:1398:int getBorderColor():0:535 -> a + 1399:1843:float getCornerRadius(int):0:444 -> a + 1844:2448:boolean only(int,boolean[]):0:604 -> a + 2449:2790:void redrawBitmapForSquareCorners(android.graphics.Canvas):0:341 -> a + 2791:3339:com.batch.android.messaging.view.roundimage.RoundedDrawable setBorderColor(android.content.res.ColorStateList):0:548 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/res/ColorStateList;)Lcom/batch/android/i0/b;"} + 3340:3870:com.batch.android.messaging.view.roundimage.RoundedDrawable setBorderWidth(float):0:530 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(F)Lcom/batch/android/i0/b;"} + 3871:4350:com.batch.android.messaging.view.roundimage.RoundedDrawable setCornerRadius(int,float):0:479 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(IF)Lcom/batch/android/i0/b;"} + 4351:4908:com.batch.android.messaging.view.roundimage.RoundedDrawable setOval(boolean):0:557 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Z)Lcom/batch/android/i0/b;"} + 4909:5480:com.batch.android.messaging.view.roundimage.RoundedDrawable setScaleType(android.widget.ImageView$ScaleType):0:571 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/widget/ImageView$ScaleType;)Lcom/batch/android/i0/b;"} + 5481:6065:com.batch.android.messaging.view.roundimage.RoundedDrawable setTileModeX(android.graphics.Shader$TileMode):0:584 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/graphics/Shader$TileMode;)Lcom/batch/android/i0/b;"} + 6066:6083:com.batch.android.messaging.view.roundimage.RoundedDrawable setCornerRadius(float,float,float,float):495:512 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(FFFF)Lcom/batch/android/i0/b;"} + 6084:6094:com.batch.android.messaging.view.roundimage.RoundedDrawable setCornerRadius(float,float,float,float):510:520 -> a + 6095:6095:com.batch.android.messaging.view.roundimage.RoundedDrawable setCornerRadius(float,float,float,float):504:504 -> a + 1:613:boolean any(boolean[]):0:612 -> b + 614:737:android.graphics.drawable.Drawable fromDrawable(android.graphics.drawable.Drawable):0:123 -> b + 738:1281:android.content.res.ColorStateList getBorderColors():0:543 -> b + 1282:1661:void redrawBorderForSquareCorners(android.graphics.Canvas):0:379 -> b + 1662:2201:com.batch.android.messaging.view.roundimage.RoundedDrawable setBorderColor(int):0:539 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/i0/b;"} + 2202:2656:com.batch.android.messaging.view.roundimage.RoundedDrawable setCornerRadius(float):0:454 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(F)Lcom/batch/android/i0/b;"} + 2657:3254:com.batch.android.messaging.view.roundimage.RoundedDrawable setTileModeY(android.graphics.Shader$TileMode):0:597 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/graphics/Shader$TileMode;)Lcom/batch/android/i0/b;"} + 1:526:float getBorderWidth():0:525 -> c + 1:437:float getCornerRadius():0:436 -> d + 1:303:void draw(android.graphics.Canvas):0:302 -> draw + 1:563:android.widget.ImageView$ScaleType getScaleType():0:562 -> e + 1:153:android.graphics.Bitmap getSourceBitmap():0:152 -> f + 1:578:android.graphics.Shader$TileMode getTileModeX():0:577 -> g + 1:391:int getAlpha():0:390 -> getAlpha + 1:402:android.graphics.ColorFilter getColorFilter():0:401 -> getColorFilter + 1:430:int getIntrinsicHeight():0:429 -> getIntrinsicHeight + 1:425:int getIntrinsicWidth():0:424 -> getIntrinsicWidth + 1:1:int getOpacity():0:0 -> getOpacity + 1:591:android.graphics.Shader$TileMode getTileModeY():0:590 -> h + 1:554:boolean isOval():0:553 -> i + 1:158:boolean isStateful():0:157 -> isStateful + 1:631:android.graphics.Bitmap toBitmap():0:630 -> j + 1:78:void updateShaderMatrix():176:253 -> k + 79:83:void updateShaderMatrix():243:247 -> k + 84:88:void updateShaderMatrix():236:240 -> k + 89:106:void updateShaderMatrix():208:225 -> k + 107:124:void updateShaderMatrix():188:205 -> k + 125:131:void updateShaderMatrix():178:184 -> k + 132:207:void updateShaderMatrix():182:257 -> k + 1:267:void onBoundsChange(android.graphics.Rect):0:266 -> onBoundsChange + 1:168:boolean onStateChange(int[]):0:167 -> onStateChange + 1:397:void setAlpha(int):0:396 -> setAlpha + 1:408:void setColorFilter(android.graphics.ColorFilter):0:407 -> setColorFilter + 1:414:void setDither(boolean):0:413 -> setDither + 1:420:void setFilterBitmap(boolean):0:419 -> setFilterBitmap +com.batch.android.messaging.view.roundimage.RoundedDrawable$1 -> com.batch.android.i0.b$a: +# {"id":"sourceFile","fileName":"RoundedDrawable.java"} + int[] $SwitchMap$android$widget$ImageView$ScaleType -> a + 1:1:void ():176:176 -> +com.batch.android.messaging.view.roundimage.RoundedImageView -> com.batch.android.i0.c: +# {"id":"sourceFile","fileName":"RoundedImageView.java"} + boolean $assertionsDisabled -> A + float[] mCornerRadii -> a + android.graphics.drawable.Drawable mBackgroundDrawable -> b + android.content.res.ColorStateList mBorderColor -> c + float mBorderWidth -> d + android.graphics.ColorFilter mColorFilter -> e + boolean mColorMod -> f + android.graphics.drawable.Drawable mDrawable -> g + boolean mHasColorFilter -> h + boolean mIsOval -> i + boolean mMutateBackground -> j + int mResource -> k + int mBackgroundResource -> l + android.widget.ImageView$ScaleType mScaleType -> m + android.graphics.Shader$TileMode mTileModeX -> n + android.graphics.Shader$TileMode mTileModeY -> o + float cornerRadius -> p + boolean[] roundedCorners -> q + int TILE_MODE_UNDEFINED -> r + int TILE_MODE_CLAMP -> s + int TILE_MODE_REPEAT -> t + int TILE_MODE_MIRROR -> u + java.lang.String TAG -> v + float DEFAULT_RADIUS -> w + float DEFAULT_BORDER_WIDTH -> x + android.graphics.Shader$TileMode DEFAULT_TILE_MODE -> y + android.widget.ImageView$ScaleType[] SCALE_TYPES -> z + 1:15:void ():48:62 -> + 1:97:void (android.content.Context):0:96 -> + 98:118:void (android.content.Context):73:93 -> + 119:219:void (android.content.Context,android.util.AttributeSet):0:100 -> + 220:324:void (android.content.Context,android.util.AttributeSet,int):0:104 -> + 325:345:void (android.content.Context,android.util.AttributeSet,int):73:93 -> + 1:270:void applyColorMod():0:269 -> a + 271:883:void applyStyleRules(java.util.Map):0:612 -> a + 884:884:void applyStyleRules(java.util.Map):608:608 -> a + 885:1227:float getCornerRadius(int):0:342 -> a + 1228:1751:void mutateBackground(boolean):0:523 -> a + 1752:2175:void setCornerRadius(float,float,float,float):0:423 -> a + 2176:2570:void setCornerRadius(int,float):0:394 -> a + 2571:2933:void setCornerRadiusDimen(int,int):0:362 -> a + 2934:3237:void updateAttrs(android.graphics.drawable.Drawable,android.widget.ImageView$ScaleType):0:303 -> a + 1:473:boolean isOval():0:472 -> b + 474:588:android.graphics.Shader$TileMode parseTileMode(int):0:114 -> b + 589:589:android.graphics.Shader$TileMode parseTileMode(int):112:112 -> b + 590:590:android.graphics.Shader$TileMode parseTileMode(int):110:110 -> b + 591:838:void updateBackgroundDrawableAttrs(boolean):0:247 -> b + 1:514:boolean mutatesBackground():0:513 -> c + 1:236:android.graphics.drawable.Drawable resolveBackgroundResource():0:235 -> d + 1:124:void drawableStateChanged():0:123 -> drawableStateChanged + 1:196:android.graphics.drawable.Drawable resolveResource():0:195 -> e + 1:240:void updateDrawableAttrs():0:239 -> f + 1:448:int getBorderColor():0:447 -> getBorderColor + 1:456:android.content.res.ColorStateList getBorderColors():0:455 -> getBorderColors + 1:428:float getBorderWidth():0:427 -> getBorderWidth + 1:322:float getCornerRadius():0:321 -> getCornerRadius + 1:331:float getMaxCornerRadius():0:330 -> getMaxCornerRadius + 1:129:android.widget.ImageView$ScaleType getScaleType():0:128 -> getScaleType + 1:484:android.graphics.Shader$TileMode getTileModeX():0:483 -> getTileModeX + 1:499:android.graphics.Shader$TileMode getTileModeY():0:498 -> getTileModeY + 1:201:void setBackground(android.graphics.drawable.Drawable):0:200 -> setBackground + 1:216:void setBackgroundColor(int):0:215 -> setBackgroundColor + 1:315:void setBackgroundDrawable(android.graphics.drawable.Drawable):0:314 -> setBackgroundDrawable + 1:209:void setBackgroundResource(int):0:208 -> setBackgroundResource + 1:452:void setBorderColor(int):0:451 -> setBorderColor + 453:920:void setBorderColor(android.content.res.ColorStateList):0:467 -> setBorderColor + 1:443:void setBorderWidth(float):0:442 -> setBorderWidth + 444:875:void setBorderWidth(int):0:431 -> setBorderWidth + 1:259:void setColorFilter(android.graphics.ColorFilter):0:258 -> setColorFilter + 1:377:void setCornerRadius(float):0:376 -> setCornerRadius + 378:378:void setCornerRadius(float):372:372 -> setCornerRadius + 1:353:void setCornerRadiusDimen(int):0:352 -> setCornerRadiusDimen + 1:160:void setImageBitmap(android.graphics.Bitmap):0:159 -> setImageBitmap + 1:151:void setImageDrawable(android.graphics.drawable.Drawable):0:150 -> setImageDrawable + 1:169:void setImageResource(int):0:168 -> setImageResource + 1:176:void setImageURI(android.net.Uri):0:175 -> setImageURI + 1:480:void setOval(boolean):0:479 -> setOval + 1:9:void setScaleType(android.widget.ImageView$ScaleType):133:141 -> setScaleType + 1:495:void setTileModeX(android.graphics.Shader$TileMode):0:494 -> setTileModeX + 1:510:void setTileModeY(android.graphics.Shader$TileMode):0:509 -> setTileModeY +com.batch.android.messaging.view.roundimage.RoundedTransformationBuilder -> com.batch.android.i0.d: +# {"id":"sourceFile","fileName":"RoundedTransformationBuilder.java"} + android.util.DisplayMetrics mDisplayMetrics -> a + float[] mCornerRadii -> b + boolean mOval -> c + float mBorderWidth -> d + android.content.res.ColorStateList mBorderColor -> e + android.widget.ImageView$ScaleType mScaleType -> f + 1:38:void ():0:37 -> + 39:47:void ():30:38 -> + 1:123:com.batch.android.messaging.view.roundimage.RoundedTransformationBuilder borderColor(int):0:122 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/i0/d;"} + 124:257:com.batch.android.messaging.view.roundimage.RoundedTransformationBuilder borderColor(android.content.res.ColorStateList):0:133 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/res/ColorStateList;)Lcom/batch/android/i0/d;"} + 258:358:com.batch.android.messaging.view.roundimage.RoundedTransformationBuilder borderWidth(float):0:100 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(F)Lcom/batch/android/i0/d;"} + 359:427:com.batch.android.messaging.view.roundimage.RoundedTransformationBuilder cornerRadius(int,float):0:68 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(IF)Lcom/batch/android/i0/d;"} + 428:572:com.batch.android.messaging.view.roundimage.RoundedTransformationBuilder oval(boolean):0:144 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Z)Lcom/batch/android/i0/d;"} + 573:615:com.batch.android.messaging.view.roundimage.RoundedTransformationBuilder scaleType(android.widget.ImageView$ScaleType):0:42 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/widget/ImageView$ScaleType;)Lcom/batch/android/i0/d;"} + 1:112:com.batch.android.messaging.view.roundimage.RoundedTransformationBuilder borderWidthDp(float):0:111 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(F)Lcom/batch/android/i0/d;"} + 113:203:com.batch.android.messaging.view.roundimage.RoundedTransformationBuilder cornerRadiusDp(int,float):0:90 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(IF)Lcom/batch/android/i0/d;"} + 1:57:com.batch.android.messaging.view.roundimage.RoundedTransformationBuilder cornerRadius(float):0:56 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"(F)Lcom/batch/android/i0/d;"} + 1:80:com.batch.android.messaging.view.roundimage.RoundedTransformationBuilder cornerRadiusDp(float):0:79 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"(F)Lcom/batch/android/i0/d;"} +com.batch.android.messaging.view.styled.Button -> com.batch.android.messaging.view.styled.a: +# {"id":"sourceFile","fileName":"Button.java"} + 1:1:void (android.content.Context):17:17 -> + 2:2:void (android.content.Context,android.util.AttributeSet):21:21 -> + 3:3:void (android.content.Context,android.util.AttributeSet,int):25:25 -> + 1:11:void applyStyleRules(java.util.Map):30:40 -> a +com.batch.android.messaging.view.styled.SeparatedFlexboxLayout -> com.batch.android.j0.a: +# {"id":"sourceFile","fileName":"SeparatedFlexboxLayout.java"} + com.batch.android.messaging.view.DelegatedTouchEventViewGroup$Delegate delegate -> G + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e0/b$a;"} + java.lang.String separatorPrefix -> H + com.batch.android.messaging.view.styled.SeparatedFlexboxLayout$SeparatorStyleProvider styleProvider -> I + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/j0/a$a;"} + int separatorCount -> J + 1:30:void (android.content.Context,java.lang.String,com.batch.android.messaging.view.styled.SeparatedFlexboxLayout$SeparatorStyleProvider):0:29 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Ljava/lang/String;Lcom/batch/android/j0/a$a;)V"} + 31:43:void (android.content.Context,java.lang.String,com.batch.android.messaging.view.styled.SeparatedFlexboxLayout$SeparatorStyleProvider):26:38 -> + 44:44:void (android.content.Context,java.lang.String,com.batch.android.messaging.view.styled.SeparatedFlexboxLayout$SeparatorStyleProvider):34:34 -> + 1:142:void applyStyleRules(java.util.Map):0:141 -> a + 143:325:boolean superOnTouchEvent(android.view.MotionEvent):0:182 -> a + 1:50:void addView(android.view.View):0:49 -> addView + 1:54:void internalAddView(android.view.View):0:53 -> b + 55:232:boolean superOnInterceptTouchEvent(android.view.MotionEvent):0:177 -> b + 1:81:void addSeparator():0:80 -> c + 82:82:void addSeparator():78:78 -> c + 83:93:void addSeparator():77:87 -> c + 1:58:boolean isHorizontal():0:57 -> d + 1:66:java.lang.String getSeparatorPrefix():0:65 -> getSeparatorPrefix + 1:157:boolean onInterceptTouchEvent(android.view.MotionEvent):0:156 -> onInterceptTouchEvent + 1:167:boolean onTouchEvent(android.view.MotionEvent):0:166 -> onTouchEvent + 1:173:void setTouchEventDelegate(com.batch.android.messaging.view.DelegatedTouchEventViewGroup$Delegate):0:172 -> setTouchEventDelegate + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e0/b$a;)V"} +com.batch.android.messaging.view.styled.SeparatedFlexboxLayout$SeparatorStyleProvider -> com.batch.android.j0.a$a: +# {"id":"sourceFile","fileName":"SeparatedFlexboxLayout.java"} + java.util.Map getRulesForSeparator(com.batch.android.messaging.view.styled.SeparatedFlexboxLayout,java.lang.String) -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/j0/a;Ljava/lang/String;)Ljava/util/Map;"} +com.batch.android.messaging.view.styled.SeparatorView -> com.batch.android.j0.b: +# {"id":"sourceFile","fileName":"SeparatorView.java"} + 1:15:void (android.content.Context):0:14 -> + 1:20:void applyStyleRules(java.util.Map):0:19 -> a +com.batch.android.messaging.view.styled.Styleable -> com.batch.android.j0.c: +# {"id":"sourceFile","fileName":"Styleable.java"} + void applyStyleRules(java.util.Map) -> a +com.batch.android.messaging.view.styled.TextView -> com.batch.android.messaging.view.styled.TextView: +# {"id":"sourceFile","fileName":"TextView.java"} + java.lang.String TAG -> a + android.graphics.Typeface typefaceOverride -> b + android.graphics.Typeface boldTypefaceOverride -> c + 1:1:void (android.content.Context):35:35 -> + 2:2:void (android.content.Context,android.util.AttributeSet):39:39 -> + 3:3:void (android.content.Context,android.util.AttributeSet,int):43:43 -> + 4:4:void (android.content.Context,android.util.AttributeSet,int,int):47:47 -> + 1:1:void applyStyleRules(java.util.Map):52:52 -> a + 2:50:void applyStyleRules(android.widget.TextView,java.util.Map):62:110 -> a + 51:76:void applyStyleRules(android.widget.TextView,java.util.Map):108:133 -> a + 77:122:void applyStyleRules(android.widget.TextView,java.util.Map):132:177 -> a + 123:123:void applyStyleRules(android.widget.TextView,java.util.Map):175:175 -> a + 124:130:void makeScrollable():184:190 -> a +com.batch.android.messaging.view.styled.TextView$1 -> com.batch.android.messaging.view.styled.TextView$a: +# {"id":"sourceFile","fileName":"TextView.java"} + android.view.GestureDetector gesture -> a + android.widget.Scroller val$scroller -> b + com.batch.android.messaging.view.styled.TextView this$0 -> c + 1:3:void (com.batch.android.messaging.view.styled.TextView,android.widget.Scroller):191:193 -> + 1:5:boolean onTouch(android.view.View,android.view.MotionEvent):210:214 -> onTouch +com.batch.android.messaging.view.styled.TextView$1$1 -> com.batch.android.messaging.view.styled.TextView$a$a: +# {"id":"sourceFile","fileName":"TextView.java"} + com.batch.android.messaging.view.styled.TextView$1 this$1 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/messaging/view/styled/TextView$a;"} + 1:1:void (com.batch.android.messaging.view.styled.TextView$1):194:194 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/messaging/view/styled/TextView$a;)V"} + 1:5:boolean onFling(android.view.MotionEvent,android.view.MotionEvent,float,float):197:201 -> onFling +com.batch.android.messaging.view.styled.WebView -> com.batch.android.j0.d: +# {"id":"sourceFile","fileName":"WebView.java"} + 1:12:void (android.content.Context):0:11 -> + 1:17:void applyStyleRules(java.util.Map):0:16 -> a +com.batch.android.metrics.MetricManager -> com.batch.android.k0.a: +# {"id":"sourceFile","fileName":"MetricManager.java"} + java.util.List metrics -> a + java.util.concurrent.atomic.AtomicBoolean isSending -> b + java.util.concurrent.ScheduledExecutorService sendExecutor -> c + long nextMetricServiceAvailableTimestamp -> d + com.batch.android.core.DateProvider dateProvider -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/d;"} + java.lang.String TAG -> f + int DEFAULT_RETRY_AFTER -> g + int DELAY_BEFORE_SENDING -> h + 1:66:void ():0:65 -> + 1:29:java.util.concurrent.atomic.AtomicBoolean access$000(com.batch.android.metrics.MetricManager):0:28 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/k0/a;)Ljava/util/concurrent/atomic/AtomicBoolean;"} + 30:58:long access$102(com.batch.android.metrics.MetricManager,long):0:28 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/k0/a;J)J"} + 59:134:void addMetric(com.batch.android.metrics.model.Metric):0:75 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/l0/b;)V"} + 135:135:void addMetric(com.batch.android.metrics.model.Metric):75:75 -> a + 136:251:java.util.List getMetricsToSend():0:115 -> a + 252:425:void lambda$sendMetrics$0(android.content.Context):0:173 -> a + 1:29:com.batch.android.core.DateProvider access$200(com.batch.android.metrics.MetricManager):0:28 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/k0/a;)Lcom/batch/android/e/d;"} + 30:154:boolean isMetricServiceAvailable():0:124 -> b + 1:1:com.batch.android.metrics.MetricManager provide():69:69 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/k0/a;"} + 1:145:void sendMetrics():0:144 -> d +com.batch.android.metrics.MetricManager$1 -> com.batch.android.k0.a$a: +# {"id":"sourceFile","fileName":"MetricManager.java"} + com.batch.android.metrics.MetricManager this$0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/k0/a;"} + 1:155:void (com.batch.android.metrics.MetricManager):0:154 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/k0/a;)V"} + 1:169:void onFailure(com.batch.android.core.Webservice$WebserviceError):0:168 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e/k0$d;)V"} + 1:159:void onSuccess():0:158 -> onSuccess +com.batch.android.metrics.MetricRegistry -> com.batch.android.k0.b: +# {"id":"sourceFile","fileName":"MetricRegistry.java"} + com.batch.android.metrics.model.Observation localCampaignsJITResponseTime -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/l0/c;"} + com.batch.android.metrics.model.Counter localCampaignsJITCount -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/l0/a;"} + com.batch.android.metrics.model.Observation localCampaignsSyncResponseTime -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/l0/c;"} + 1:15:void ():12:26 -> + 1:10:void ():0:9 -> +com.batch.android.metrics.model.Counter -> com.batch.android.l0.a: +# {"id":"sourceFile","fileName":"Counter.java"} + float value -> g + 1:19:void (com.batch.android.metrics.model.Counter):0:18 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/l0/a;)V"} + 20:44:void (java.lang.String):0:24 -> + 1:8:java.lang.Object newChild(java.util.List):0:7 -> a + 1:2:com.batch.android.metrics.model.Counter newChild(java.util.List):29:30 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/util/List;)Lcom/batch/android/l0/a;"} + 1:39:void reset():0:38 -> j + 1:46:void inc():0:45 -> l +com.batch.android.metrics.model.Metric -> com.batch.android.l0.b: +# {"id":"sourceFile","fileName":"Metric.java"} + java.lang.String name -> a + java.lang.String type -> b + java.util.List values -> c + java.util.List labelNames -> d + java.util.List labelValues -> e + java.util.concurrent.ConcurrentMap children -> f + 1:33:void (java.lang.String):0:32 -> + 34:37:void (java.lang.String):30:33 -> + 1:109:java.util.concurrent.ConcurrentMap getChildren():0:108 -> a + 110:152:java.lang.Object labelNames(java.lang.String[]):0:42 -> a + java.lang.Object newChild(java.util.List) -> a + 153:225:void pack(com.batch.android.msgpack.core.MessageBufferPacker):0:72 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o0/b;)V"} + 1:101:java.util.List getLabelNames():0:100 -> b + 102:153:java.lang.Object labels(java.lang.String[]):0:51 -> b + 1:105:java.util.List getLabelValues():0:104 -> c + 1:89:java.lang.String getName():0:88 -> d + 1:93:java.lang.String getType():0:92 -> e + 1:97:java.util.List getValues():0:96 -> f + 1:81:boolean hasChanged():0:80 -> g + 1:85:boolean hasChildren():0:84 -> h + 1:38:java.lang.Object register():0:37 -> i + void reset() -> j + 1:1:void update():76:76 -> k +com.batch.android.metrics.model.Metric$Type -> com.batch.android.l0.b$a: +# {"id":"sourceFile","fileName":"Metric.java"} + java.lang.String COUNTER -> a + java.lang.String OBSERVATION -> b +com.batch.android.metrics.model.Observation -> com.batch.android.l0.c: +# {"id":"sourceFile","fileName":"Observation.java"} + long startTime -> g + java.util.concurrent.atomic.AtomicBoolean observing -> h + 1:24:void (com.batch.android.metrics.model.Observation):0:23 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/l0/c;)V"} + 25:42:void (com.batch.android.metrics.model.Observation):14:31 -> + 43:60:void (java.lang.String):0:17 -> + 61:66:void (java.lang.String):14:19 -> + 1:11:java.lang.Object newChild(java.util.List):0:10 -> a + 1:2:com.batch.android.metrics.model.Observation newChild(java.util.List):36:37 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/util/List;)Lcom/batch/android/l0/c;"} + 1:45:void reset():0:44 -> j + 1:61:boolean isObserving():0:60 -> l + 1:57:void observeDuration():0:56 -> m + 1:50:void startTimer():0:49 -> n +com.batch.android.module.ActionModule -> com.batch.android.m0.a: +# {"id":"sourceFile","fileName":"ActionModule.java"} + java.util.HashMap registeredActions -> a + java.util.HashMap drawableAliases -> b + com.batch.android.BatchDeeplinkInterceptor deeplinkInterceptor -> c + java.lang.String TAG -> d + java.lang.String RESERVED_ACTION_IDENTIFIER_PREFIX -> e + 1:51:void ():0:50 -> + 52:59:void ():48:55 -> + 1:127:void addDrawableAlias(java.lang.String,int):0:126 -> a + 128:128:void addDrawableAlias(java.lang.String,int):123:123 -> a + 129:129:void addDrawableAlias(java.lang.String,int):119:119 -> a + 130:130:void addDrawableAlias(java.lang.String,int):115:115 -> a + 131:273:int getAliasedDrawableID(java.lang.String):0:142 -> a + 274:556:int getDrawableIdForNameOrAlias(android.content.Context,java.lang.String):0:282 -> a + 557:753:boolean performAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject,com.batch.android.UserActionSource):0:196 -> a + 754:924:boolean performUserAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject):0:170 -> a + 925:925:boolean performUserAction(android.content.Context,java.lang.String,com.batch.android.json.JSONObject):159:159 -> a + 926:1005:void registerAction(com.batch.android.UserAction):0:79 -> a + 1006:1006:void registerAction(com.batch.android.UserAction):69:69 -> a + 1007:1007:void registerAction(com.batch.android.UserAction):64:64 -> a + 1008:1218:void setDeeplinkInterceptor(com.batch.android.BatchDeeplinkInterceptor):0:210 -> a + 1:107:void unregisterAction(java.lang.String):0:106 -> b + 108:108:void unregisterAction(java.lang.String):97:97 -> b + 109:109:void unregisterAction(java.lang.String):93:93 -> b + 110:110:void unregisterAction(java.lang.String):89:89 -> b + 1:1:java.lang.String getId():292:292 -> g + 1:1:int getState():0:0 -> h + 1:219:com.batch.android.BatchDeeplinkInterceptor getDeeplinkInterceptor():0:218 -> i + 1:268:void registerBuiltinActions():0:267 -> j +com.batch.android.module.BatchModule -> com.batch.android.m0.b: +# {"id":"sourceFile","fileName":"BatchModule.java"} + 1:12:void ():0:11 -> + 1:1:void batchContextBecameAvailable(android.content.Context):0:0 -> a + 1:1:void batchDidStart():0:0 -> b + 1:1:void batchDidStop():0:0 -> c + 1:1:void batchIsFinishing():0:0 -> d + 1:1:void batchWillStart():0:0 -> e + 1:1:void batchWillStop():0:0 -> f + java.lang.String getId() -> g + int getState() -> h +com.batch.android.module.BatchModuleMaster -> com.batch.android.m0.c: +# {"id":"sourceFile","fileName":"BatchModuleMaster.java"} + java.util.List modules -> a + 1:36:void (java.util.List):0:35 -> + 1:71:void batchContextBecameAvailable(android.content.Context):0:70 -> a + 1:85:void batchDidStart():0:84 -> b + 1:106:void batchDidStop():0:105 -> c + 1:92:void batchIsFinishing():0:91 -> d + 1:78:void batchWillStart():0:77 -> e + 1:99:void batchWillStop():0:98 -> f + 1:1:java.lang.String getId():59:59 -> g + 1:1:int getState():0:0 -> h + 1:13:com.batch.android.module.BatchModuleMaster provide():40:52 -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/c;"} +com.batch.android.module.DataCollectionModule -> com.batch.android.m0.d: +# {"id":"sourceFile","fileName":"DataCollectionModule.java"} + com.batch.android.BatchDataCollectionConfig dataCollectionConfig -> a + com.batch.android.BatchDataCollectionConfig cachedDataCollectionConfig -> b + java.lang.String TAG -> c + 1:42:void ():0:41 -> + 1:104:void batchContextBecameAvailable(android.content.Context):0:103 -> a + 105:105:void batchContextBecameAvailable(android.content.Context):103:103 -> a + 106:391:void persistDataCollectionConfig(android.content.Context,com.batch.android.BatchDataCollectionConfig):0:285 -> a + 392:555:void updateDataCollectionConfig(com.batch.android.BatchDataCollectionConfig$Editor):0:163 -> a + 556:556:void updateDataCollectionConfig(com.batch.android.BatchDataCollectionConfig$Editor):163:163 -> a + 557:633:void onDataCollectionConfigChanged(com.batch.android.BatchDataCollectionConfig):181:257 -> a + 634:634:void sendNativeDataChangedEvent(com.batch.android.json.JSONObject):266:266 -> a + 1:115:void batchDidStart():0:114 -> b + 116:230:void lambda$batchDidStart$0(android.content.Context):0:114 -> b + 1:311:void loadDataCollectionConfig(android.content.Context):0:310 -> c + 1:145:void systemParametersMayHaveChanged(android.content.Context):0:144 -> d + 1:1:java.lang.String getId():69:69 -> g + 1:1:int getState():0:0 -> h + 1:175:com.batch.android.BatchDataCollectionConfig getDataCollectionConfig():0:174 -> i + 1:1:com.batch.android.module.DataCollectionModule provide():58:58 -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/d;"} + 1:321:void setDefaultDataCollectionConfig():0:320 -> k +com.batch.android.module.DisplayReceiptModule -> com.batch.android.m0.e: +# {"id":"sourceFile","fileName":"DisplayReceiptModule.java"} + com.batch.android.module.OptOutModule optOutModule -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/m0/i;"} + java.lang.String TAG -> b + 1:39:void (com.batch.android.module.OptOutModule):0:38 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/m0/i;)V"} + 1:87:java.io.File savePushReceipt(android.content.Context,com.batch.android.core.InternalPushData):0:86 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/e/p;)Ljava/io/File;"} + 88:274:void sendReceipt(android.content.Context,boolean):0:186 -> a + 1:69:void batchDidStart():0:68 -> b + 70:284:void wipeData(android.content.Context):0:214 -> b + 285:335:void scheduleDisplayReceipt(android.content.Context,com.batch.android.core.InternalPushData):96:146 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/e/p;)V"} + 1:1:java.lang.String getId():48:48 -> g + 1:1:int getState():0:0 -> h + 1:1:com.batch.android.module.DisplayReceiptModule provide():43:43 -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/e;"} +com.batch.android.module.DisplayReceiptModule$1 -> com.batch.android.m0.e$a: +# {"id":"sourceFile","fileName":"DisplayReceiptModule.java"} + java.util.Map val$payloads -> a + 1:190:void (java.util.Map):0:189 -> + 1:1:void onFailure(com.batch.android.core.Webservice$WebserviceError):201:201 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e/k0$d;)V"} + 1:196:void onSuccess():0:195 -> onSuccess +com.batch.android.module.EventDispatcherModule -> com.batch.android.m0.f: +# {"id":"sourceFile","fileName":"EventDispatcherModule.java"} + java.util.Set eventDispatchers -> a + com.batch.android.module.OptOutModule optOutModule -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/m0/i;"} + boolean isContextLoaded -> c + java.lang.String TAG -> d + java.lang.String COMPONENT_SENTINEL_VALUE -> e + java.lang.String COMPONENT_KEY_PREFIX -> f + 1:36:void (com.batch.android.module.OptOutModule):0:35 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/m0/i;)V"} + 37:43:void (com.batch.android.module.OptOutModule):30:36 -> + 1:66:void addEventDispatcher(com.batch.android.BatchEventDispatcher):0:65 -> a + 67:67:void addEventDispatcher(com.batch.android.BatchEventDispatcher):65:65 -> a + 68:68:void printDeprecatedDispatcher(java.lang.String):59:59 -> a + 69:78:void dispatchEvent(com.batch.android.Batch$EventDispatcher$Type,com.batch.android.Batch$EventDispatcher$Payload):75:84 -> a + 79:79:void dispatchEvent(com.batch.android.Batch$EventDispatcher$Type,com.batch.android.Batch$EventDispatcher$Payload):84:84 -> a + 1:72:boolean removeEventDispatcher(com.batch.android.BatchEventDispatcher):0:71 -> b + 73:73:void printLoadedDispatcher(java.lang.String):55:55 -> b + 74:99:void loadDispatcherFromContext(android.content.Context):88:113 -> b + 100:126:void loadDispatcherFromContext(android.content.Context):111:137 -> b + 127:127:void loadDispatcherFromContext(android.content.Context):99:99 -> b + 1:1:java.lang.String getId():46:46 -> g + 1:1:int getState():0:0 -> h + 1:153:com.batch.android.json.JSONObject getDispatchersAnalyticRepresentation():0:152 -> i + 1:1:com.batch.android.module.EventDispatcherModule provide():41:41 -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/f;"} +com.batch.android.module.LocalCampaignsModule -> com.batch.android.m0.g: +# {"id":"sourceFile","fileName":"LocalCampaignsModule.java"} + com.batch.android.localcampaigns.CampaignManager campaignManager -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/r/a;"} + boolean triedToReadSavedCampaign -> b + java.util.LinkedList signalQueue -> c + java.util.concurrent.atomic.AtomicBoolean isReady -> d + java.util.concurrent.atomic.AtomicBoolean isWaitingJITSync -> e + java.util.concurrent.ExecutorService triggerExecutor -> f + boolean isNewSessionBroadcastReceiverRegistered -> g + android.content.BroadcastReceiver newSessionBroadcastReceiver -> h + java.lang.String TAG -> i + 1:86:void (com.batch.android.localcampaigns.CampaignManager):0:85 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/r/a;)V"} + 87:358:void (com.batch.android.localcampaigns.CampaignManager):53:324 -> + 359:359:void (com.batch.android.localcampaigns.CampaignManager):86:86 -> + 1:42:java.util.concurrent.atomic.AtomicBoolean access$000(com.batch.android.module.LocalCampaignsModule):0:41 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/m0/g;)Ljava/util/concurrent/atomic/AtomicBoolean;"} + 43:413:void batchContextBecameAvailable(android.content.Context):0:370 -> a + 414:687:void displayMessage(com.batch.android.localcampaigns.model.LocalCampaign):0:273 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/s/a;)V"} + 688:951:void electCampaignForSignal(com.batch.android.localcampaigns.signal.Signal):0:263 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/w/d;)V"} + 952:1193:void lambda$electCampaignForSignal$1(com.batch.android.localcampaigns.model.LocalCampaign,com.batch.android.localcampaigns.model.LocalCampaign):0:241 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/s/a;Lcom/batch/android/s/a;)V"} + 1:134:void enqueueSignal(com.batch.android.localcampaigns.signal.Signal):0:133 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/w/d;)V"} + 135:141:void enqueueSignal(com.batch.android.localcampaigns.signal.Signal):131:137 -> b + 142:142:void enqueueSignal(com.batch.android.localcampaigns.signal.Signal):137:137 -> b + 143:503:void lambda$loadSavedCampaigns$2(android.content.Context):0:360 -> b + 1:376:void batchDidStop():0:375 -> c + 377:551:void lambda$processSignal$0(com.batch.android.localcampaigns.signal.Signal):0:174 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/w/d;)V"} + 552:915:void loadSavedCampaigns(android.content.Context):0:363 -> c + 1:170:void processSignal(com.batch.android.localcampaigns.signal.Signal):0:169 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/w/d;)V"} + 171:516:void registerBroadcastReceiverIfNeeded(android.content.Context):0:345 -> d + 1:118:void sendSignal(com.batch.android.localcampaigns.signal.Signal):0:117 -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/w/d;)V"} + 119:436:void wipeData(android.content.Context):0:317 -> e + 1:1:java.lang.String getId():98:98 -> g + 1:1:int getState():0:0 -> h + 1:300:void dequeueSignals():0:299 -> i + 301:301:void dequeueSignals():299:299 -> i + 1:282:void makeReady():0:281 -> j + 1:307:void onLocalCampaignsWebserviceFinished():0:306 -> k + 1:1:com.batch.android.module.LocalCampaignsModule provide():91:91 -> l + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/g;"} +com.batch.android.module.LocalCampaignsModule$1 -> com.batch.android.m0.g$a: +# {"id":"sourceFile","fileName":"LocalCampaignsModule.java"} + com.batch.android.module.LocalCampaignsModule this$0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/m0/g;"} + 1:325:void (com.batch.android.module.LocalCampaignsModule):0:324 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/m0/g;)V"} + 1:331:void onReceive(android.content.Context,android.content.Intent):0:330 -> onReceive +com.batch.android.module.MessagingModule -> com.batch.android.m0.h: +# {"id":"sourceFile","fileName":"MessagingModule.java"} + boolean showForegroundLandings -> a + boolean automaticMode -> b + com.batch.android.Batch$Messaging$LifecycleListener listener -> c + boolean doNotDisturbMode -> d + com.batch.android.BatchMessage pendingMessage -> e + com.batch.android.module.ActionModule actionModule -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/m0/a;"} + com.batch.android.module.TrackerModule trackerModule -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/m0/l;"} + java.lang.String TAG -> h + java.lang.String ACTION_DISMISS_INTERSTITIAL -> i + java.lang.String ACTION_DISMISS_BANNER -> j + double DEFAULT_IMAGE_DOWNLOAD_TIMEOUT -> k + java.lang.String MESSAGING_EVENT_NAME_SHOW -> l + java.lang.String MESSAGING_EVENT_NAME_DISMISS -> m + java.lang.String MESSAGING_EVENT_NAME_CLOSE -> n + java.lang.String MESSAGING_EVENT_NAME_CLOSE_ERROR -> o + java.lang.String MESSAGING_EVENT_NAME_AUTO_CLOSE -> p + java.lang.String MESSAGING_EVENT_NAME_GLOBAL_TAP -> q + java.lang.String MESSAGING_EVENT_NAME_CTA -> r + java.lang.String MESSAGING_EVENT_NAME_WEBVIEW_CLICK -> s + 1:111:void (com.batch.android.module.ActionModule,com.batch.android.module.TrackerModule):0:110 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/m0/a;Lcom/batch/android/m0/l;)V"} + 112:128:void (com.batch.android.module.ActionModule,com.batch.android.module.TrackerModule):96:112 -> + 1:358:void displayMessage(android.content.Context,com.batch.android.BatchMessage,boolean):0:357 -> a + 359:679:com.batch.android.BatchBannerView loadBanner(android.content.Context,com.batch.android.BatchMessage,com.batch.android.json.JSONObject):0:320 -> a + 680:686:com.batch.android.BatchBannerView loadBanner(android.content.Context,com.batch.android.BatchMessage,com.batch.android.json.JSONObject):317:323 -> a + 687:688:com.batch.android.BatchBannerView loadBanner(android.content.Context,com.batch.android.BatchMessage,com.batch.android.json.JSONObject):312:313 -> a + 689:689:com.batch.android.BatchBannerView loadBanner(android.content.Context,com.batch.android.BatchMessage,com.batch.android.json.JSONObject):292:292 -> a + 690:690:com.batch.android.BatchBannerView loadBanner(android.content.Context,com.batch.android.BatchMessage,com.batch.android.json.JSONObject):288:288 -> a + 691:691:com.batch.android.BatchBannerView loadBanner(android.content.Context,com.batch.android.BatchMessage,com.batch.android.json.JSONObject):283:283 -> a + 692:1240:void onMessageAutoClosed(com.batch.android.messaging.model.Message):0:548 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/g;)V"} + 1241:1742:void onMessageCTAClicked(com.batch.android.messaging.model.Message,int,com.batch.android.messaging.model.CTA):0:501 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/g;ILcom/batch/android/d0/e;)V"} + 1743:2299:void onMessageClosedError(com.batch.android.messaging.model.Message,com.batch.android.messaging.model.MessagingError):0:556 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/g;Lcom/batch/android/d0/h;)V"} + 2300:2837:void onMessageGlobalTap(com.batch.android.messaging.model.Message,com.batch.android.messaging.model.Action):0:537 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/g;Lcom/batch/android/d0/a;)V"} + 2838:3352:void onWebViewMessageClickTracked(com.batch.android.messaging.model.Message,com.batch.android.messaging.model.Action,java.lang.String):0:514 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/g;Lcom/batch/android/d0/a;Ljava/lang/String;)V"} + 3353:3682:void performAction(android.content.Context,com.batch.android.BatchMessage,com.batch.android.messaging.model.Action):0:329 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/BatchMessage;Lcom/batch/android/d0/a;)V"} + 3683:3855:void setLifecycleListener(com.batch.android.Batch$Messaging$LifecycleListener):0:172 -> a + 3856:4024:void setTypefaceOverride(android.graphics.Typeface,android.graphics.Typeface):0:168 -> a + 4025:4476:void trackCTAClickEvent(com.batch.android.messaging.model.Message,int,java.lang.String):0:451 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/g;ILjava/lang/String;)V"} + 4477:4945:void trackWebViewClickEvent(com.batch.android.messaging.model.Message,java.lang.String,java.lang.String):0:468 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/g;Ljava/lang/String;Ljava/lang/String;)V"} + 4946:4958:boolean doesAppHaveRequiredLibraries(boolean):194:206 -> a + 4959:4973:void displayInAppMessage(com.batch.android.BatchInAppMessage):361:375 -> a + 4974:4979:void displayInAppMessage(com.batch.android.BatchInAppMessage):373:378 -> a + 4980:4994:com.batch.android.json.JSONObject generateBaseEventParameters(com.batch.android.messaging.model.Message,java.lang.String):391:405 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/g;Ljava/lang/String;)Lcom/batch/android/json/JSONObject;"} + 4995:4995:com.batch.android.json.JSONObject generateBaseEventParameters(com.batch.android.messaging.model.Message,java.lang.String):402:402 -> a + 4996:4996:com.batch.android.json.JSONObject generateBaseEventParameters(com.batch.android.messaging.model.Message,java.lang.String):399:399 -> a + 4997:5015:com.batch.android.json.JSONObject generateBaseEventParameters(com.batch.android.messaging.model.Message,java.lang.String):396:414 -> a + 1:273:androidx.fragment.app.DialogFragment loadFragment(android.content.Context,com.batch.android.BatchMessage,com.batch.android.json.JSONObject):0:272 -> b + 274:275:androidx.fragment.app.DialogFragment loadFragment(android.content.Context,com.batch.android.BatchMessage,com.batch.android.json.JSONObject):253:254 -> b + 276:276:androidx.fragment.app.DialogFragment loadFragment(android.content.Context,com.batch.android.BatchMessage,com.batch.android.json.JSONObject):233:233 -> b + 277:277:androidx.fragment.app.DialogFragment loadFragment(android.content.Context,com.batch.android.BatchMessage,com.batch.android.json.JSONObject):229:229 -> b + 278:278:androidx.fragment.app.DialogFragment loadFragment(android.content.Context,com.batch.android.BatchMessage,com.batch.android.json.JSONObject):224:224 -> b + 279:773:void onMessageClosed(com.batch.android.messaging.model.Message):0:494 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/g;)V"} + 774:937:void setAutomaticMode(boolean):0:163 -> b + 938:1373:void trackCloseErrorEvent(com.batch.android.messaging.model.Message,com.batch.android.messaging.model.MessagingError):0:435 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/g;Lcom/batch/android/d0/h;)V"} + 1374:1797:void trackGenericEvent(com.batch.android.messaging.model.Message,java.lang.String):0:423 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/g;Ljava/lang/String;)V"} + 1:487:void onMessageDismissed(com.batch.android.messaging.model.Message):0:486 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/g;)V"} + 488:664:void setDoNotDisturbEnabled(boolean):0:176 -> c + 1:480:void onMessageShown(com.batch.android.messaging.model.Message):0:479 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/d0/g;)V"} + 481:640:void setShowForegroundLandings(boolean):0:159 -> d + 1:1:java.lang.String getId():126:126 -> g + 1:1:int getState():0:0 -> h + 1:148:com.batch.android.Batch$Messaging$LifecycleListener getListener():0:147 -> i + 1:181:boolean hasPendingMessage():0:180 -> j + 1:152:boolean isDoNotDisturbEnabled():0:151 -> k + 1:144:boolean isInAutomaticMode():0:143 -> l + 1:187:com.batch.android.BatchMessage popPendingMessage():0:186 -> m + 1:1:com.batch.android.module.MessagingModule provide():117:117 -> n + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/h;"} + 1:140:boolean shouldShowForegroundLandings():0:139 -> o +com.batch.android.module.MessagingModule$1 -> com.batch.android.m0.h$a: +# {"id":"sourceFile","fileName":"MessagingModule.java"} + int[] $SwitchMap$com$batch$android$messaging$model$Message$Source -> a + 1:1:void ():394:394 -> +com.batch.android.module.OptOutModule -> com.batch.android.m0.i: +# {"id":"sourceFile","fileName":"OptOutModule.java"} + java.lang.Boolean isOptedOut -> a + android.content.SharedPreferences preferences -> b + java.lang.String TAG -> c + java.lang.String INTENT_OPTED_OUT -> d + java.lang.String INTENT_OPTED_IN -> e + java.lang.String INTENT_OPTED_OUT_WIPE_DATA_EXTRA -> f + java.lang.String OPT_OUT_PREFERENCES_NAME -> g + java.lang.String OPTED_OUT_FROM_BATCHSDK_KEY -> h + java.lang.String SHOULD_SEND_OPTIN_EVENT_KEY -> i + 1:53:void ():0:52 -> + 54:54:void ():48:48 -> + 1:178:void doOptOut(android.content.Context,boolean):0:177 -> a + 179:323:void lambda$optOut$0(com.batch.android.BatchOptOutResultListener,android.content.Context,boolean,com.batch.android.core.Promise):0:144 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/BatchOptOutResultListener;Landroid/content/Context;ZLcom/batch/android/e/a0;)V"} + 324:482:void lambda$optOut$2(com.batch.android.BatchOptOutResultListener,com.batch.android.core.Promise,android.content.Context,boolean):0:158 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/BatchOptOutResultListener;Lcom/batch/android/e/a0;Landroid/content/Context;Z)V"} + 483:645:com.batch.android.core.Promise optOut(android.content.Context,boolean,com.batch.android.BatchOptOutResultListener):0:162 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;ZLcom/batch/android/BatchOptOutResultListener;)Lcom/batch/android/e/a0;"} + 646:647:void lambda$optOut$1(android.content.Context,com.batch.android.BatchOptOutResultListener,boolean,com.batch.android.core.Promise,java.lang.Void):138:139 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/BatchOptOutResultListener;ZLcom/batch/android/e/a0;Ljava/lang/Void;)V"} + 648:649:void lambda$optOut$3(android.content.Context,com.batch.android.BatchOptOutResultListener,com.batch.android.core.Promise,boolean,java.lang.Exception):149:150 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/BatchOptOutResultListener;Lcom/batch/android/e/a0;ZLjava/lang/Exception;)V"} + 1:60:android.content.SharedPreferences getPreferences(android.content.Context):0:59 -> b + 1:83:boolean isOptedOutSync(android.content.Context):0:82 -> c + 1:108:void optIn(android.content.Context):0:107 -> d + 1:93:void trackOptinEventIfNeeded(android.content.Context):0:92 -> e + 1:199:void wipeData(android.content.Context):0:198 -> f + 1:1:java.lang.String getId():205:205 -> g + 1:1:int getState():0:0 -> h + 1:64:java.lang.Boolean isOptedOut():0:63 -> i +com.batch.android.module.ProfileModule -> com.batch.android.m0.j: +# {"id":"sourceFile","fileName":"ProfileModule.java"} + com.batch.android.module.TrackerModule trackerModule -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/m0/l;"} + java.lang.String TAG -> b + 1:58:void (com.batch.android.module.TrackerModule):0:57 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/m0/l;)V"} + 1:119:void handleProfileDataChanged(com.batch.android.profile.ProfileUpdateOperation):0:118 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/t0/e;)V"} + 120:222:void identify(java.lang.String):0:102 -> a + 223:380:void lambda$onProjectChanged$1(android.content.Context,com.batch.android.runtime.Config):0:157 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/a1/b;)V"} + 381:619:void trackPublicEvent(java.lang.String,com.batch.android.BatchEventAttributes):0:238 -> a + 620:638:void trackPublicEvent(java.lang.String,com.batch.android.BatchEventAttributes):236:254 -> a + 639:639:void trackPublicEvent(java.lang.String,com.batch.android.BatchEventAttributes):228:228 -> a + 640:650:void onProjectChanged(java.lang.String,java.lang.String):129:139 -> a + 1:158:void lambda$onProjectChanged$0(android.content.Context):0:157 -> b + 159:172:void sendIdentifyEvent(java.lang.String):199:212 -> b + 1:187:void migrateCustomData(android.content.Context):0:186 -> c + 188:194:void migrateCustomData(android.content.Context):184:190 -> c + 1:1:java.lang.String getId():72:72 -> g + 1:1:int getState():0:0 -> h + 1:1:com.batch.android.module.ProfileModule provide():66:66 -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/j;"} +com.batch.android.module.PushModule -> com.batch.android.m0.k: +# {"id":"sourceFile","fileName":"PushModule.java"} + boolean shouldRefreshToken -> a + int smallIconResourceId -> b + android.graphics.Bitmap largeIcon -> c + java.lang.String gcmSenderId -> d + int notificationColor -> e + android.net.Uri notificationSoundUri -> f + boolean manualDisplay -> g + java.util.EnumSet tempNotifType -> h + java.lang.Integer customOpenIntentFlags -> i + com.batch.android.BatchNotificationInterceptor notificationInterceptor -> j + com.batch.android.PushRegistrationProvider registrationProvider -> k + boolean didSetupRegistrationProvider -> l + com.batch.android.module.DisplayReceiptModule displayReceiptModule -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/m0/e;"} + java.lang.String TAG -> n + int NO_COLOR -> o + 1:129:void (com.batch.android.module.DisplayReceiptModule):0:128 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/m0/e;)V"} + 130:180:void (com.batch.android.module.DisplayReceiptModule):79:129 -> + 1:66:void access$000(com.batch.android.module.PushModule,android.content.Context,com.batch.android.BatchPushRegistration):0:65 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/m0/k;Landroid/content/Context;Lcom/batch/android/BatchPushRegistration;)V"} + 67:535:void appendBatchData(android.content.Intent,android.content.Intent):0:468 -> a + 536:1029:void appendBatchData(android.os.Bundle,android.content.Intent):0:493 -> a + 1030:1536:void appendBatchData(com.google.firebase.messaging.RemoteMessage,android.content.Intent):0:506 -> a + 1537:2188:void displayNotification(android.content.Context,android.content.Intent,com.batch.android.BatchNotificationInterceptor,boolean):0:651 -> a + 2189:2197:void displayNotification(android.content.Context,android.content.Intent,com.batch.android.BatchNotificationInterceptor,boolean):648:656 -> a + 2198:2879:void displayNotification(android.content.Context,com.google.firebase.messaging.RemoteMessage,com.batch.android.BatchNotificationInterceptor):0:681 -> a + 2880:2888:void displayNotification(android.content.Context,com.google.firebase.messaging.RemoteMessage,com.batch.android.BatchNotificationInterceptor):678:686 -> a + 2889:3723:void emitRegistration(android.content.Context,com.batch.android.BatchPushRegistration):0:834 -> a + 3724:3987:boolean isBatchPush(android.content.Intent):0:263 -> a + 3988:4268:boolean isBatchPush(com.google.firebase.messaging.RemoteMessage):0:280 -> a + 4269:5246:void lambda$batchWillStart$4(com.batch.android.runtime.State):0:977 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/a1/g;)V"} + 5247:6105:void lambda$emitRegistration$3(com.batch.android.BatchPushRegistration,android.content.Context,com.batch.android.runtime.State):0:858 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/BatchPushRegistration;Landroid/content/Context;Lcom/batch/android/a1/g;)V"} + 6106:6118:void lambda$emitRegistration$3(com.batch.android.BatchPushRegistration,android.content.Context,com.batch.android.runtime.State):856:868 -> a + 6119:6137:void lambda$emitRegistration$3(com.batch.android.BatchPushRegistration,android.content.Context,com.batch.android.runtime.State):866:884 -> a + 6138:6435:void lambda$getRegistration$1(java.util.concurrent.atomic.AtomicReference,com.batch.android.runtime.State):0:297 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/util/concurrent/atomic/AtomicReference;Lcom/batch/android/a1/g;)V"} + 6436:6823:void lambda$setNotificationsType$2(int,java.util.concurrent.atomic.AtomicBoolean,com.batch.android.runtime.State):0:387 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(ILjava/util/concurrent/atomic/AtomicBoolean;Lcom/batch/android/a1/g;)V"} + 6824:7359:android.app.PendingIntent makePendingIntent(android.content.Context,android.content.Intent,android.os.Bundle):0:535 -> a + 7360:7912:android.app.PendingIntent makePendingIntent(android.content.Context,android.content.Intent,com.google.firebase.messaging.RemoteMessage):0:552 -> a + 7913:8492:android.app.PendingIntent makePendingIntentForDeeplink(android.content.Context,java.lang.String,android.os.Bundle):0:579 -> a + 8493:9089:android.app.PendingIntent makePendingIntentForDeeplink(android.content.Context,java.lang.String,com.google.firebase.messaging.RemoteMessage):0:596 -> a + 9090:9796:void onNotificationDisplayed(android.content.Context,android.content.Intent):0:706 -> a + 9797:10520:void onNotificationDisplayed(android.content.Context,com.google.firebase.messaging.RemoteMessage):0:723 -> a + 10521:11467:void requestNotificationPermission(android.content.Context,com.batch.android.BatchPermissionListener):0:946 -> a + 11468:11468:void requestNotificationPermission(android.content.Context,com.batch.android.BatchPermissionListener):943:943 -> a + 11469:11641:void setAdditionalIntentFlags(java.lang.Integer):0:172 -> a + 11642:11832:void setCustomLargeIcon(android.graphics.Bitmap):0:190 -> a + 11833:11987:void setCustomSmallIconResourceId(int):0:154 -> a + 11988:12189:void setGCMSenderId(java.lang.String):0:201 -> a + 12190:12634:void setManualDisplay(boolean):0:444 -> a + 12635:12843:void setNotificationInterceptor(com.batch.android.BatchNotificationInterceptor):0:208 -> a + 12844:13239:void setNotificationsType(java.util.EnumSet):0:395 -> a + 13240:13665:void setSound(android.net.Uri):0:425 -> a + 13666:13669:void requestRegistration(com.batch.android.PushRegistrationProvider):765:768 -> a + 13670:13670:void printRegistration(com.batch.android.BatchPushRegistration):931:931 -> a + 1:360:java.util.EnumSet getNotificationsType(android.content.Context):0:359 -> b + 361:602:void lambda$dismissNotifications$0(com.batch.android.runtime.State):0:241 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/a1/g;)V"} + 603:1009:void setNotificationsColor(int):0:406 -> b + 1010:1620:boolean shouldDisplayPush(android.content.Context,android.content.Intent):0:610 -> b + 1621:2243:boolean shouldDisplayPush(android.content.Context,com.google.firebase.messaging.RemoteMessage):0:622 -> b + 1:326:com.batch.android.BatchPushRegistration getRegistration(android.content.Context):0:325 -> c + 1:4:boolean isBackgroundRestricted(android.content.Context):921:924 -> d + 1:988:void batchWillStart():0:987 -> e + 1:1:java.lang.String getId():953:953 -> g + 1:959:int getState():0:958 -> h + 1:2:void dismissNotifications():223:224 -> i + 1:163:java.lang.Integer getAdditionalIntentFlags():0:162 -> j + 1:8:java.lang.String getAppVersion():750:757 -> k + 1:182:android.graphics.Bitmap getCustomLargeIcon():0:181 -> l + 1:146:int getCustomSmallIconResourceId():0:145 -> m + 1:416:int getNotificationColor():0:415 -> n + 1:216:com.batch.android.BatchNotificationInterceptor getNotificationInterceptor():0:215 -> o + 1:12:com.batch.android.BatchPushRegistration getRegistration():290:301 -> p + 1:1012:com.batch.android.PushRegistrationProvider getRegistrationProvider():0:1011 -> q + 1:435:android.net.Uri getSound():0:434 -> r + 1:11:boolean isBatchPushServiceAvailable():898:908 -> s + 1:454:boolean isManualDisplayModeActivated():0:453 -> t + 1:1:com.batch.android.module.PushModule provide():134:134 -> u + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/k;"} + 1:738:void refreshRegistration():0:737 -> v +com.batch.android.module.PushModule$1 -> com.batch.android.m0.k$a: +# {"id":"sourceFile","fileName":"PushModule.java"} + com.batch.android.PushRegistrationProvider val$provider -> a + android.content.Context val$context -> b + com.batch.android.module.PushModule this$0 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/m0/k;"} + 1:770:void (com.batch.android.module.PushModule,com.batch.android.PushRegistrationProvider,android.content.Context):0:769 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/m0/k;Lcom/batch/android/PushRegistrationProvider;Landroid/content/Context;)V"} + 1:1:java.lang.String getTaskIdentifier():812:812 -> a + 1:796:void run():0:795 -> run + 797:812:void run():792:807 -> run + 813:813:void run():787:787 -> run + 814:819:void run():775:780 -> run + 820:820:void run():775:775 -> run +com.batch.android.module.TrackerModule -> com.batch.android.m0.l: +# {"id":"sourceFile","fileName":"TrackerModule.java"} + com.batch.android.tracker.TrackerDatasource datasource -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/b1/b;"} + java.util.Queue memoryStorage -> b + java.util.concurrent.ExecutorService flushExecutor -> c + java.util.concurrent.atomic.AtomicBoolean isFlushing -> d + com.batch.android.event.EventSender sender -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o/e;"} + int batchSendQuantity -> f + com.batch.android.module.OptOutModule optOutModule -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/m0/i;"} + com.batch.android.module.LocalCampaignsModule localCampaignsModule -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/m0/g;"} + com.batch.android.localcampaigns.CampaignManager campaignManager -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/r/a;"} + com.batch.android.module.PushModule pushModule -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/m0/k;"} + java.lang.String TAG -> k + 1:102:void (com.batch.android.module.OptOutModule,com.batch.android.module.LocalCampaignsModule,com.batch.android.localcampaigns.CampaignManager,com.batch.android.module.PushModule):0:101 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/m0/i;Lcom/batch/android/m0/g;Lcom/batch/android/r/a;Lcom/batch/android/m0/k;)V"} + 103:144:void (com.batch.android.module.OptOutModule,com.batch.android.module.LocalCampaignsModule,com.batch.android.localcampaigns.CampaignManager,com.batch.android.module.PushModule):64:105 -> + 1:410:void lambda$flush$2(com.batch.android.runtime.State):0:409 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/a1/g;)V"} + 411:896:void lambda$onEventsSendFailure$4(java.util.List,com.batch.android.runtime.State):0:485 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/util/List;Lcom/batch/android/a1/g;)V"} + 897:1084:void track(java.lang.String):0:187 -> a + 1085:1336:void track(java.lang.String,long):0:251 -> a + 1337:1534:void track(java.lang.String,com.batch.android.json.JSONObject):0:197 -> a + 1535:1872:com.batch.android.core.Promise trackOptOutEvent(android.content.Context,java.lang.String):0:337 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Ljava/lang/String;)Lcom/batch/android/e/a0;"} + 1873:1886:void track(java.lang.String,long,com.batch.android.json.JSONObject):208:221 -> a + 1887:1889:void lambda$trackOptOutEvent$0(android.content.Context,java.util.List,com.batch.android.core.Promise):312:314 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Ljava/util/List;Lcom/batch/android/e/a0;)V"} + 1890:1910:void lambda$trackOptOutEvent$0(android.content.Context,java.util.List,com.batch.android.core.Promise):313:333 -> a + 1911:1915:void onEventsSendFailure(java.util.List):461:465 -> a + 1916:1918:java.util.List getEventsToSend():493:495 -> a + 1:167:void batchDidStart():0:166 -> b + 168:621:void lambda$onEventsSendSuccess$3(java.util.List,com.batch.android.runtime.State):0:453 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/util/List;Lcom/batch/android/a1/g;)V"} + 622:1138:void lambda$wipeData$6(android.content.Context):0:516 -> b + 1139:1421:void trackCampaignView(java.lang.String,com.batch.android.json.JSONObject):0:282 -> b + 1422:1422:void trackCampaignView(java.lang.String,com.batch.android.json.JSONObject):269:269 -> b + 1423:1431:void trackCollapsible(java.lang.String,long,com.batch.android.json.JSONObject):233:241 -> b + 1432:1436:void onEventsSendSuccess(java.util.List):438:442 -> b + 1:176:void batchDidStop():0:175 -> c + 177:672:void lambda$getEventsToSend$5(java.util.List):0:495 -> c + 673:1037:com.batch.android.json.JSONObject makeOptBaseEventData(android.content.Context):0:364 -> c + 1:294:void trackOptInEvent(android.content.Context):0:293 -> d + 1:136:void batchWillStart():0:135 -> e + 137:150:void batchWillStart():132:145 -> e + 151:162:void batchWillStart():144:155 -> e + 163:180:void batchWillStart():141:158 -> e + 181:686:void wipeData(android.content.Context):0:505 -> e + 1:1:java.lang.String getId():120:120 -> g + 1:1:int getState():0:0 -> h + 1:383:void closeDatasource():0:382 -> i + 1:405:void flush():0:404 -> j + 1:429:void lambda$flush$1():0:428 -> k + 430:443:void lambda$flush$1():415:428 -> k + 444:446:void lambda$flush$1():426:428 -> k + 447:448:void lambda$flush$1():428:429 -> k + 1:5:com.batch.android.module.TrackerModule provide():110:114 -> l + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/l;"} +com.batch.android.module.TrackerModule$1 -> com.batch.android.m0.l$a: +# {"id":"sourceFile","fileName":"TrackerModule.java"} + com.batch.android.core.Promise val$promise -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/e/a0;"} + com.batch.android.module.TrackerModule this$0 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/m0/l;"} + 1:318:void (com.batch.android.module.TrackerModule,com.batch.android.core.Promise):0:317 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/m0/l;Lcom/batch/android/e/a0;)V"} + 1:326:void onFailure(com.batch.android.FailReason,java.util.List):0:325 -> a + 327:327:void onFinish():0:0 -> a + 328:648:void onSuccess(java.util.List):0:320 -> a +com.batch.android.module.UserModule -> com.batch.android.m0.m: +# {"id":"sourceFile","fileName":"UserModule.java"} + java.util.List operationQueues -> a + android.content.BroadcastReceiver localBroadcastReceiver -> b + java.util.concurrent.atomic.AtomicBoolean checkScheduled -> c + long lastLocationTrackTimestamp -> d + com.batch.android.module.TrackerModule trackerModule -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/m0/l;"} + java.lang.String TAG -> f + java.lang.String PARAMETER_KEY_LABEL -> g + java.lang.String PARAMETER_KEY_DATA -> h + java.util.regex.Pattern EVENT_NAME_PATTERN -> i + long LOCATION_UPDATE_MINIMUM_TIME_MS -> j + long CIPHER_FALLBACK_RESET_TIME_MS -> k + java.util.concurrent.ScheduledExecutorService applyQueue -> l + 1:5:void ():60:64 -> + 1:77:void (com.batch.android.module.TrackerModule):0:76 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/m0/l;)V"} + 78:85:void (com.batch.android.module.TrackerModule):70:77 -> + 1:499:void addOperationQueueAndSubmit(long,com.batch.android.user.UserOperationQueue):0:498 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(JLcom/batch/android/c1/j;)V"} + 500:500:void addOperationQueueAndSubmit(long,com.batch.android.user.UserOperationQueue):492:492 -> a + 501:897:void bumpVersion(long):0:396 -> a + 898:1146:void lambda$clearInstallationData$0(com.batch.android.user.SQLUserDatasource):0:248 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/c1/c;)V"} + 1147:1345:void setCustomID(android.content.Context,java.lang.String):0:198 -> a + 1346:1711:void storeTransactionID(java.lang.String,long):0:365 -> a + 1712:2183:void trackLocation(android.location.Location):0:471 -> a + 2184:2184:void trackLocation(android.location.Location):451:451 -> a + 2185:2202:void lambda$storeTransactionID$3(long,java.lang.String):372:389 -> a + 2203:2203:void lambda$storeTransactionID$3(long,java.lang.String):375:375 -> a + 2204:2207:void submitOnApplyQueue(long,java.lang.Runnable):479:482 -> a + 1:135:void batchDidStart():0:134 -> b + 136:344:java.lang.String getCustomID(android.content.Context):0:208 -> b + 345:495:void setLanguage(android.content.Context,java.lang.String):0:150 -> b + 496:517:void lambda$bumpVersion$4(long):403:424 -> b + 518:518:void lambda$bumpVersion$4(long):406:406 -> b + 1:163:java.lang.String getLanguage(android.content.Context):0:162 -> c + 164:339:void setRegion(android.content.Context,java.lang.String):0:175 -> c + 340:644:void startCheckWS(long):0:304 -> c + 645:729:void applyUserOperationsSync(java.util.List):532:616 -> c + 730:730:void applyUserOperationsSync(java.util.List):548:548 -> c + 731:731:void applyUserOperationsSync(java.util.List):535:535 -> c + 1:187:java.lang.String getRegion(android.content.Context):0:186 -> d + 188:447:void startSendWS(long):0:259 -> d + 1:224:long getVersion(android.content.Context):0:223 -> e + 225:753:void submitOperationQueues(long):0:528 -> e + 754:754:void submitOperationQueues(long):528:528 -> e + 1:237:void incrementVersion(android.content.Context):0:236 -> f + 1:664:void lambda$wipeData$6(android.content.Context):0:663 -> g + 665:665:java.lang.String getId():89:89 -> g + 1:1:int getState():0:0 -> h + 2:653:void wipeData(android.content.Context):0:651 -> h + 1:247:void clearInstallationData():0:246 -> i + 248:248:void clearInstallationData():243:243 -> i + 1:353:void lambda$startCheckWS$2():0:352 -> j + 354:354:void lambda$startCheckWS$2():351:351 -> j + 355:355:void lambda$startCheckWS$2():325:325 -> j + 1:34:void lambda$startSendWS$1():262:295 -> k + 35:35:void lambda$startSendWS$1():291:291 -> k + 36:36:void lambda$startSendWS$1():274:274 -> k + 1:525:void lambda$submitOperationQueues$5():0:524 -> l + 1:1:java.util.concurrent.ScheduledExecutorService makeApplyQueue():67:67 -> m + 1:1:com.batch.android.module.UserModule provide():82:82 -> n + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/m0/m;"} + 1:2:void userOptedIn():669:670 -> o +com.batch.android.module.UserModule$1 -> com.batch.android.m0.m$a: +# {"id":"sourceFile","fileName":"UserModule.java"} + com.batch.android.module.UserModule this$0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/m0/m;"} + 1:122:void (com.batch.android.module.UserModule):0:121 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/m0/m;)V"} + 1:126:void onReceive(android.content.Context,android.content.Intent):0:125 -> onReceive +com.batch.android.module.UserModule$SaveException -> com.batch.android.m0.m$b: +# {"id":"sourceFile","fileName":"UserModule.java"} + java.lang.String internalErrorMessage -> a + 1:631:void (java.lang.String,java.lang.String):0:630 -> + 632:1267:void (java.lang.String,java.lang.String,java.lang.Throwable):0:635 -> + 1:641:void log():0:640 -> a +com.batch.android.msgpack.MessagePackHelper -> com.batch.android.n0.a: +# {"id":"sourceFile","fileName":"MessagePackHelper.java"} + 1:11:void ():0:10 -> + 1:59:void packList(com.batch.android.msgpack.core.MessageBufferPacker,java.util.List):0:58 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o0/b;Ljava/util/List;)V"} + 60:111:void packMap(com.batch.android.msgpack.core.MessageBufferPacker,java.util.Map):0:51 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o0/b;Ljava/util/Map;)V"} + 112:155:void packObject(com.batch.android.msgpack.core.MessageBufferPacker,java.lang.Object):0:43 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o0/b;Ljava/lang/Object;)V"} +com.batch.android.msgpack.core.ExtensionTypeHeader -> com.batch.android.o0.a: +# {"id":"sourceFile","fileName":"ExtensionTypeHeader.java"} + byte type -> a + int length -> b + 1:50:void (byte,int):0:49 -> + 1:54:byte checkedCastToByte(int):0:53 -> a + 55:120:int getLength():0:65 -> a + 1:62:byte getType():0:61 -> b + 1:78:boolean equals(java.lang.Object):0:77 -> equals + 1:71:int hashCode():0:70 -> hashCode + 1:1:java.lang.String toString():84:84 -> toString +com.batch.android.msgpack.core.MessageBufferPacker -> com.batch.android.o0.b: +# {"id":"sourceFile","fileName":"MessageBufferPacker.java"} + 1:35:void (com.batch.android.msgpack.core.MessagePack$PackerConfig):0:34 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o0/h$b;)V"} + 36:74:void (com.batch.android.msgpack.core.buffer.ArrayBufferOutput,com.batch.android.msgpack.core.MessagePack$PackerConfig):0:38 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/p0/b;Lcom/batch/android/o0/h$b;)V"} + 1:56:void clear():0:55 -> a + 57:102:com.batch.android.msgpack.core.buffer.MessageBufferOutput reset(com.batch.android.msgpack.core.buffer.MessageBufferOutput):0:45 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/p0/h;)Lcom/batch/android/p0/h;"} + 103:103:com.batch.android.msgpack.core.buffer.MessageBufferOutput reset(com.batch.android.msgpack.core.buffer.MessageBufferOutput):43:43 -> a + 1:50:com.batch.android.msgpack.core.buffer.ArrayBufferOutput getArrayBufferOut():0:49 -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/p0/b;"} + 1:117:int getBufferSize():0:116 -> g + 1:110:java.util.List toBufferList():0:109 -> h + 111:111:java.util.List toBufferList():107:107 -> h + 1:74:byte[] toByteArray():0:73 -> i + 75:75:byte[] toByteArray():71:71 -> i + 1:92:com.batch.android.msgpack.core.buffer.MessageBuffer toMessageBuffer():0:91 -> j + 93:93:com.batch.android.msgpack.core.buffer.MessageBuffer toMessageBuffer():89:89 -> j +com.batch.android.msgpack.core.MessageFormat -> com.batch.android.o0.c: +# {"id":"sourceFile","fileName":"MessageFormat.java"} + com.batch.android.msgpack.core.MessageFormat FIXEXT4 -> A + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat FIXEXT8 -> B + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat FIXEXT16 -> C + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat STR8 -> D + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat STR16 -> E + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat STR32 -> F + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat ARRAY16 -> G + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat ARRAY32 -> H + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat MAP16 -> I + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat MAP32 -> J + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat NEGFIXINT -> K + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat[] formatTable -> L + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat[] $VALUES -> M + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.value.ValueType valueType -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/z;"} + com.batch.android.msgpack.core.MessageFormat POSFIXINT -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat FIXMAP -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat FIXARRAY -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat FIXSTR -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat NIL -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat NEVER_USED -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat BOOLEAN -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat BIN8 -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat BIN16 -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat BIN32 -> k + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat EXT8 -> l + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat EXT16 -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat EXT32 -> n + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat FLOAT32 -> o + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat FLOAT64 -> p + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat UINT8 -> q + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat UINT16 -> r + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat UINT32 -> s + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat UINT64 -> t + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat INT8 -> u + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat INT16 -> v + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat INT32 -> w + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat INT64 -> x + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat FIXEXT1 -> y + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + com.batch.android.msgpack.core.MessageFormat FIXEXT2 -> z + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/c;"} + 1:40:void ():27:66 -> + 41:108:void ():25:92 -> + 1:73:void (java.lang.String,int,com.batch.android.msgpack.value.ValueType):0:72 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;ILcom/batch/android/q0/z;)V"} + 1:26:com.batch.android.msgpack.core.MessageFormat[] $values():0:25 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/o0/c;"} + 27:219:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):0:192 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(B)Lcom/batch/android/o0/c;"} + 220:220:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):190:190 -> a + 221:221:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):188:188 -> a + 222:222:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):186:186 -> a + 223:223:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):184:184 -> a + 224:224:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):182:182 -> a + 225:225:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):180:180 -> a + 226:226:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):178:178 -> a + 227:227:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):176:176 -> a + 228:228:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):174:174 -> a + 229:229:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):172:172 -> a + 230:230:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):170:170 -> a + 231:231:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):168:168 -> a + 232:232:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):166:166 -> a + 233:233:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):164:164 -> a + 234:234:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):162:162 -> a + 235:235:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):160:160 -> a + 236:236:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):158:158 -> a + 237:237:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):156:156 -> a + 238:238:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):154:154 -> a + 239:239:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):152:152 -> a + 240:240:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):150:150 -> a + 241:241:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):148:148 -> a + 242:242:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):146:146 -> a + 243:243:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):144:144 -> a + 244:244:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):142:142 -> a + 245:245:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):140:140 -> a + 246:246:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):138:138 -> a + 247:247:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):136:136 -> a + 248:248:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):134:134 -> a + 249:249:com.batch.android.msgpack.core.MessageFormat toMessageFormat(byte):131:131 -> a + 1:86:com.batch.android.msgpack.value.ValueType getValueType():0:85 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/z;"} + 87:87:com.batch.android.msgpack.value.ValueType getValueType():83:83 -> b + 88:88:com.batch.android.msgpack.core.MessageFormat valueOf(byte):103:103 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(B)Lcom/batch/android/o0/c;"} + 1:1:com.batch.android.msgpack.core.MessageFormat valueOf(java.lang.String):25:25 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/o0/c;"} + 1:1:com.batch.android.msgpack.core.MessageFormat[] values():25:25 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/o0/c;"} +com.batch.android.msgpack.core.MessageFormatException -> com.batch.android.o0.d: +# {"id":"sourceFile","fileName":"MessageFormatException.java"} + 1:29:void (java.lang.String):0:28 -> + 30:62:void (java.lang.String,java.lang.Throwable):0:32 -> + 63:87:void (java.lang.Throwable):0:24 -> +com.batch.android.msgpack.core.MessageInsufficientBufferException -> com.batch.android.o0.e: +# {"id":"sourceFile","fileName":"MessageInsufficientBufferException.java"} + 1:25:void ():0:24 -> + 26:54:void (java.lang.String):0:28 -> + 55:91:void (java.lang.String,java.lang.Throwable):0:36 -> + 92:124:void (java.lang.Throwable):0:32 -> +com.batch.android.msgpack.core.MessageIntegerOverflowException -> com.batch.android.o0.f: +# {"id":"sourceFile","fileName":"MessageIntegerOverflowException.java"} + java.math.BigInteger bigInteger -> b + 1:36:void (long):0:35 -> + 37:77:void (java.lang.String,java.math.BigInteger):0:40 -> + 78:109:void (java.math.BigInteger):0:31 -> + 1:45:java.math.BigInteger getBigInteger():0:44 -> a + 1:50:java.lang.String getMessage():0:49 -> getMessage +com.batch.android.msgpack.core.MessageNeverUsedFormatException -> com.batch.android.o0.g: +# {"id":"sourceFile","fileName":"MessageNeverUsedFormatException.java"} + 1:29:void (java.lang.String):0:28 -> + 30:62:void (java.lang.String,java.lang.Throwable):0:32 -> + 63:87:void (java.lang.Throwable):0:24 -> +com.batch.android.msgpack.core.MessagePack -> com.batch.android.o0.h: +# {"id":"sourceFile","fileName":"MessagePack.java"} + java.nio.charset.Charset UTF8 -> a + com.batch.android.msgpack.core.MessagePack$PackerConfig DEFAULT_PACKER_CONFIG -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/h$b;"} + com.batch.android.msgpack.core.MessagePack$UnpackerConfig DEFAULT_UNPACKER_CONFIG -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/o0/h$c;"} + 1:11:void ():67:77 -> + 1:161:void ():0:160 -> + 1:1:com.batch.android.msgpack.core.MessagePacker newDefaultPacker(com.batch.android.msgpack.core.buffer.MessageBufferOutput):177:177 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/p0/h;)Lcom/batch/android/o0/j;"} + 2:2:com.batch.android.msgpack.core.MessagePacker newDefaultPacker(java.io.OutputStream):192:192 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/io/OutputStream;)Lcom/batch/android/o0/j;"} + 3:3:com.batch.android.msgpack.core.MessagePacker newDefaultPacker(java.nio.channels.WritableByteChannel):204:204 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/nio/channels/WritableByteChannel;)Lcom/batch/android/o0/j;"} + 4:4:com.batch.android.msgpack.core.MessageBufferPacker newDefaultBufferPacker():217:217 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/o0/b;"} + 5:5:com.batch.android.msgpack.core.MessageUnpacker newDefaultUnpacker(com.batch.android.msgpack.core.buffer.MessageBufferInput):234:234 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/p0/g;)Lcom/batch/android/o0/o;"} + 6:6:com.batch.android.msgpack.core.MessageUnpacker newDefaultUnpacker(java.io.InputStream):249:249 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/io/InputStream;)Lcom/batch/android/o0/o;"} + 7:7:com.batch.android.msgpack.core.MessageUnpacker newDefaultUnpacker(java.nio.channels.ReadableByteChannel):261:261 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/nio/channels/ReadableByteChannel;)Lcom/batch/android/o0/o;"} + 8:8:com.batch.android.msgpack.core.MessageUnpacker newDefaultUnpacker(byte[]):275:275 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"([B)Lcom/batch/android/o0/o;"} + 9:9:com.batch.android.msgpack.core.MessageUnpacker newDefaultUnpacker(byte[],int,int):291:291 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"([BII)Lcom/batch/android/o0/o;"} + 10:10:com.batch.android.msgpack.core.MessageUnpacker newDefaultUnpacker(java.nio.ByteBuffer):307:307 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/nio/ByteBuffer;)Lcom/batch/android/o0/o;"} +com.batch.android.msgpack.core.MessagePack$Code -> com.batch.android.o0.h$a: +# {"id":"sourceFile","fileName":"MessagePack.java"} + byte FIXEXT4 -> A + byte FIXEXT8 -> B + byte FIXEXT16 -> C + byte STR8 -> D + byte STR16 -> E + byte STR32 -> F + byte ARRAY16 -> G + byte ARRAY32 -> H + byte MAP16 -> I + byte MAP32 -> J + byte NEGFIXINT_PREFIX -> K + byte POSFIXINT_MASK -> a + byte FIXMAP_PREFIX -> b + byte FIXARRAY_PREFIX -> c + byte FIXSTR_PREFIX -> d + byte NIL -> e + byte NEVER_USED -> f + byte FALSE -> g + byte TRUE -> h + byte BIN8 -> i + byte BIN16 -> j + byte BIN32 -> k + byte EXT8 -> l + byte EXT16 -> m + byte EXT32 -> n + byte FLOAT32 -> o + byte FLOAT64 -> p + byte UINT8 -> q + byte UINT16 -> r + byte UINT32 -> s + byte UINT64 -> t + byte INT8 -> u + byte INT16 -> v + byte INT32 -> w + byte INT64 -> x + byte FIXEXT1 -> y + byte FIXEXT2 -> z + 1:83:void ():0:82 -> + 1:1:boolean isFixInt(byte):0:0 -> a + 1:1:boolean isFixStr(byte):0:0 -> b + 1:1:boolean isFixedArray(byte):0:0 -> c + 1:1:boolean isFixedMap(byte):0:0 -> d + 1:1:boolean isFixedRaw(byte):0:0 -> e + 1:1:boolean isNegFixInt(byte):0:0 -> f + 1:1:boolean isPosFixInt(byte):0:0 -> g +com.batch.android.msgpack.core.MessagePack$PackerConfig -> com.batch.android.o0.h$b: +# {"id":"sourceFile","fileName":"MessagePack.java"} + int smallStringOptimizationThreshold -> a + int bufferFlushThreshold -> b + int bufferSize -> c + boolean str8FormatSupport -> d + 1:324:void ():0:323 -> + 325:331:void ():315:321 -> + 332:657:void (com.batch.android.msgpack.core.MessagePack$PackerConfig):0:325 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o0/h$b;)V"} + 658:672:void (com.batch.android.msgpack.core.MessagePack$PackerConfig):315:329 -> + 1:433:int getBufferFlushThreshold():0:432 -> a + 434:817:com.batch.android.msgpack.core.MessagePacker newPacker(java.io.OutputStream):0:383 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/io/OutputStream;)Lcom/batch/android/o0/j;"} + 818:1211:com.batch.android.msgpack.core.MessagePacker newPacker(java.nio.channels.WritableByteChannel):0:393 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/nio/channels/WritableByteChannel;)Lcom/batch/android/o0/j;"} + 1212:1639:com.batch.android.msgpack.core.MessagePack$PackerConfig withBufferFlushThreshold(int):0:427 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/o0/h$b;"} + 1640:2096:com.batch.android.msgpack.core.MessagePack$PackerConfig withStr8FormatSupport(boolean):0:456 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Z)Lcom/batch/android/o0/h$b;"} + 2097:2097:com.batch.android.msgpack.core.MessagePacker newPacker(com.batch.android.msgpack.core.buffer.MessageBufferOutput):370:370 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/p0/h;)Lcom/batch/android/o0/j;"} + 1:447:int getBufferSize():0:446 -> b + 448:889:com.batch.android.msgpack.core.MessagePack$PackerConfig withBufferSize(int):0:441 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/o0/h$b;"} + 1:419:int getSmallStringOptimizationThreshold():0:418 -> c + 420:833:com.batch.android.msgpack.core.MessagePack$PackerConfig withSmallStringOptimizationThreshold(int):0:413 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/o0/h$b;"} + 1:314:java.lang.Object clone():0:313 -> clone + 315:315:com.batch.android.msgpack.core.MessagePack$PackerConfig clone():334:334 -> clone + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/o0/h$b;"} + 1:462:boolean isStr8FormatSupport():0:461 -> d + 1:1:com.batch.android.msgpack.core.MessageBufferPacker newBufferPacker():404:404 -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/o0/b;"} + 1:353:boolean equals(java.lang.Object):0:352 -> equals + 1:343:int hashCode():0:342 -> hashCode +com.batch.android.msgpack.core.MessagePack$UnpackerConfig -> com.batch.android.o0.h$c: +# {"id":"sourceFile","fileName":"MessagePack.java"} + boolean allowReadingStringAsBinary -> a + boolean allowReadingBinaryAsString -> b + java.nio.charset.CodingErrorAction actionOnMalformedString -> c + java.nio.charset.CodingErrorAction actionOnUnmappableString -> d + int stringSizeLimit -> e + int bufferSize -> f + int stringDecoderBufferSize -> g + 1:485:void ():0:484 -> + 486:498:void ():470:482 -> + 499:985:void (com.batch.android.msgpack.core.MessagePack$UnpackerConfig):0:486 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o0/h$c;)V"} + 986:1008:void (com.batch.android.msgpack.core.MessagePack$UnpackerConfig):470:492 -> + 1:642:java.nio.charset.CodingErrorAction getActionOnMalformedString():0:641 -> a + 643:1195:com.batch.android.msgpack.core.MessageUnpacker newUnpacker(java.io.InputStream):0:552 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/io/InputStream;)Lcom/batch/android/o0/o;"} + 1196:1798:com.batch.android.msgpack.core.MessageUnpacker newUnpacker(java.nio.ByteBuffer):0:602 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/nio/ByteBuffer;)Lcom/batch/android/o0/o;"} + 1799:2361:com.batch.android.msgpack.core.MessageUnpacker newUnpacker(java.nio.channels.ReadableByteChannel):0:562 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/nio/channels/ReadableByteChannel;)Lcom/batch/android/o0/o;"} + 2362:2936:com.batch.android.msgpack.core.MessageUnpacker newUnpacker(byte[]):0:574 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"([B)Lcom/batch/android/o0/o;"} + 2937:3525:com.batch.android.msgpack.core.MessageUnpacker newUnpacker(byte[],int,int):0:588 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"([BII)Lcom/batch/android/o0/o;"} + 3526:4162:com.batch.android.msgpack.core.MessagePack$UnpackerConfig withActionOnMalformedString(java.nio.charset.CodingErrorAction):0:636 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/nio/charset/CodingErrorAction;)Lcom/batch/android/o0/h$c;"} + 4163:4786:com.batch.android.msgpack.core.MessagePack$UnpackerConfig withAllowReadingBinaryAsString(boolean):0:623 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Z)Lcom/batch/android/o0/h$c;"} + 4787:5476:com.batch.android.msgpack.core.MessagePack$UnpackerConfig withBufferSize(int):0:689 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/o0/h$c;"} + 5477:5477:com.batch.android.msgpack.core.MessageUnpacker newUnpacker(com.batch.android.msgpack.core.buffer.MessageBufferInput):539:539 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/p0/g;)Lcom/batch/android/o0/o;"} + 1:655:java.nio.charset.CodingErrorAction getActionOnUnmappableString():0:654 -> b + 656:1305:com.batch.android.msgpack.core.MessagePack$UnpackerConfig withActionOnUnmappableString(java.nio.charset.CodingErrorAction):0:649 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/nio/charset/CodingErrorAction;)Lcom/batch/android/o0/h$c;"} + 1306:1916:com.batch.android.msgpack.core.MessagePack$UnpackerConfig withAllowReadingStringAsBinary(boolean):0:610 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Z)Lcom/batch/android/o0/h$c;"} + 1917:2592:com.batch.android.msgpack.core.MessagePack$UnpackerConfig withStringDecoderBufferSize(int):0:675 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/o0/h$c;"} + 1:629:boolean getAllowReadingBinaryAsString():0:628 -> c + 630:1292:com.batch.android.msgpack.core.MessagePack$UnpackerConfig withStringSizeLimit(int):0:662 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/o0/h$c;"} + 1:469:java.lang.Object clone():0:468 -> clone + 470:470:com.batch.android.msgpack.core.MessagePack$UnpackerConfig clone():497:497 -> clone + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/o0/h$c;"} + 1:616:boolean getAllowReadingStringAsBinary():0:615 -> d + 1:695:int getBufferSize():0:694 -> e + 1:519:boolean equals(java.lang.Object):0:518 -> equals + 1:681:int getStringDecoderBufferSize():0:680 -> f + 1:668:int getStringSizeLimit():0:667 -> g + 1:509:int hashCode():0:508 -> hashCode +com.batch.android.msgpack.core.MessagePackException -> com.batch.android.o0.i: +# {"id":"sourceFile","fileName":"MessagePackException.java"} + java.lang.IllegalStateException UNREACHABLE -> a + 1:1:void ():43:43 -> + 1:25:void ():0:24 -> + 26:54:void (java.lang.String):0:28 -> + 55:87:void (java.lang.String,java.lang.Throwable):0:32 -> + 88:124:void (java.lang.Throwable):0:36 -> + 1:1:java.lang.UnsupportedOperationException UNSUPPORTED(java.lang.String):40:40 -> a +com.batch.android.msgpack.core.MessagePacker -> com.batch.android.o0.j: +# {"id":"sourceFile","fileName":"MessagePacker.java"} + int smallStringOptimizationThreshold -> a + int bufferFlushThreshold -> b + boolean str8FormatSupport -> c + com.batch.android.msgpack.core.buffer.MessageBufferOutput out -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/p0/h;"} + com.batch.android.msgpack.core.buffer.MessageBuffer buffer -> e + int position -> f + long totalFlushBytes -> g + java.nio.charset.CharsetEncoder encoder -> h + boolean CORRUPTED_CHARSET_ENCODER -> i + int UTF_8_MAX_CHAR_SIZE -> j + 1:164:void ():0:163 -> + 165:165:void ():161:161 -> + 166:166:void ():159:159 -> + 167:167:void ():157:157 -> + 168:178:void ():155:165 -> + 1:207:void (com.batch.android.msgpack.core.buffer.MessageBufferOutput,com.batch.android.msgpack.core.MessagePack$PackerConfig):0:206 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/p0/h;Lcom/batch/android/o0/h$b;)V"} + 1:915:com.batch.android.msgpack.core.MessagePacker addPayload(byte[]):0:914 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"([B)Lcom/batch/android/o0/j;"} + 916:1171:void clear():0:255 -> a + 1172:1794:int encodeStringToBufferAt(int,java.lang.String):0:622 -> a + 1795:2330:com.batch.android.msgpack.core.MessagePacker packBigInteger(java.math.BigInteger):0:535 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/math/BigInteger;)Lcom/batch/android/o0/j;"} + 2331:2718:com.batch.android.msgpack.core.MessagePacker packBoolean(boolean):0:387 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Z)Lcom/batch/android/o0/j;"} + 2719:3124:com.batch.android.msgpack.core.MessagePacker packByte(byte):0:405 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(B)Lcom/batch/android/o0/j;"} + 3125:3691:com.batch.android.msgpack.core.MessagePacker packDouble(double):0:566 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(D)Lcom/batch/android/o0/j;"} + 3692:4502:com.batch.android.msgpack.core.MessagePacker packExtensionTypeHeader(byte,int):0:810 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(BI)Lcom/batch/android/o0/j;"} + 4503:5054:com.batch.android.msgpack.core.MessagePacker packFloat(float):0:551 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(F)Lcom/batch/android/o0/j;"} + 5055:5567:com.batch.android.msgpack.core.MessagePacker packLong(long):0:512 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(J)Lcom/batch/android/o0/j;"} + 5568:6001:com.batch.android.msgpack.core.MessagePacker packShort(short):0:433 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(S)Lcom/batch/android/o0/j;"} + 6002:6669:com.batch.android.msgpack.core.MessagePacker packString(java.lang.String):0:667 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/o0/j;"} + 6670:6704:com.batch.android.msgpack.core.MessagePacker packString(java.lang.String):659:693 -> a + 6705:6725:com.batch.android.msgpack.core.MessagePacker packString(java.lang.String):685:705 -> a + 6726:6726:com.batch.android.msgpack.core.MessagePacker packString(java.lang.String):644:644 -> a + 6727:7497:com.batch.android.msgpack.core.MessagePacker packValue(com.batch.android.msgpack.value.Value):0:770 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/x;)Lcom/batch/android/o0/j;"} + 7498:7731:com.batch.android.msgpack.core.buffer.MessageBufferOutput reset(com.batch.android.msgpack.core.buffer.MessageBufferOutput):0:233 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/p0/h;)Lcom/batch/android/p0/h;"} + 7732:8041:void writeByteAndByte(byte,byte):0:309 -> a + 8042:8379:void writeByteAndDouble(byte,double):0:337 -> a + 8380:8710:void writeByteAndFloat(byte,float):0:330 -> a + 8711:9055:void writeByteAndLong(byte,long):0:344 -> a + 9056:9372:void writeByteAndShort(byte,short):0:316 -> a + 1:290:void flushBuffer():0:289 -> b + 291:866:void packStringWithGetBytes(java.lang.String):0:575 -> b + 867:1170:void writeByte(byte):0:303 -> b + 1171:1494:void writeByteAndInt(byte,int):0:323 -> b + 1495:1857:void writeLong(long):0:362 -> b + 1858:2729:com.batch.android.msgpack.core.MessagePacker writePayload(byte[]):0:871 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"([B)Lcom/batch/android/o0/j;"} + 2730:3080:void writeShort(short):0:350 -> b + 1:943:com.batch.android.msgpack.core.MessagePacker addPayload(byte[],int,int):0:942 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"([BII)Lcom/batch/android/o0/j;"} + 944:947:com.batch.android.msgpack.core.MessagePacker addPayload(byte[],int,int):936:939 -> c + 948:1245:void ensureCapacity(int):0:297 -> c + 1246:1494:long getTotalWrittenBytes():0:248 -> c + 1:282:void close():0:281 -> close + 283:284:void close():281:282 -> close + 1:731:com.batch.android.msgpack.core.MessagePacker packArrayHeader(int):0:730 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/o0/j;"} + 732:732:com.batch.android.msgpack.core.MessagePacker packArrayHeader(int):722:722 -> d + 733:1107:com.batch.android.msgpack.core.MessagePacker packNil():0:374 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/o0/j;"} + 1108:2001:com.batch.android.msgpack.core.MessagePacker writePayload(byte[],int,int):0:893 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"([BII)Lcom/batch/android/o0/j;"} + 2002:2005:com.batch.android.msgpack.core.MessagePacker writePayload(byte[],int,int):887:890 -> d + 1:832:com.batch.android.msgpack.core.MessagePacker packBinaryHeader(int):0:831 -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/o0/j;"} + 833:1430:void prepareEncoder():0:597 -> e + 1:468:com.batch.android.msgpack.core.MessagePacker packInt(int):0:467 -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/o0/j;"} + 1:269:void flush():0:268 -> flush + 1:758:com.batch.android.msgpack.core.MessagePacker packMapHeader(int):0:757 -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/o0/j;"} + 759:759:com.batch.android.msgpack.core.MessagePacker packMapHeader(int):749:749 -> g + 1:857:com.batch.android.msgpack.core.MessagePacker packRawStringHeader(int):0:856 -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/o0/j;"} + 1:357:void writeInt(int):0:356 -> i +com.batch.android.msgpack.core.MessageSizeException -> com.batch.android.o0.k: +# {"id":"sourceFile","fileName":"MessageSizeException.java"} + long size -> b + 1:28:void (long):0:27 -> + 29:61:void (java.lang.String,long):0:32 -> + 1:37:long getSize():0:36 -> a +com.batch.android.msgpack.core.MessageStringCodingException -> com.batch.android.o0.l: +# {"id":"sourceFile","fileName":"MessageStringCodingException.java"} + 1:27:void (java.lang.String,java.nio.charset.CharacterCodingException):0:26 -> + 28:58:void (java.nio.charset.CharacterCodingException):0:30 -> + 1:24:java.lang.Throwable getCause():0:23 -> getCause + 25:60:java.nio.charset.CharacterCodingException getCause():0:35 -> getCause +com.batch.android.msgpack.core.MessageTypeCastException -> com.batch.android.o0.m: +# {"id":"sourceFile","fileName":"MessageTypeCastException.java"} + 1:22:void ():0:21 -> + 23:48:void (java.lang.String):0:25 -> + 49:78:void (java.lang.String,java.lang.Throwable):0:29 -> + 79:112:void (java.lang.Throwable):0:33 -> +com.batch.android.msgpack.core.MessageTypeException -> com.batch.android.o0.n: +# {"id":"sourceFile","fileName":"MessageTypeException.java"} + 1:25:void ():0:24 -> + 26:54:void (java.lang.String):0:28 -> + 55:87:void (java.lang.String,java.lang.Throwable):0:32 -> + 88:124:void (java.lang.Throwable):0:36 -> +com.batch.android.msgpack.core.MessageUnpacker -> com.batch.android.o0.o: +# {"id":"sourceFile","fileName":"MessageUnpacker.java"} + boolean allowReadingStringAsBinary -> a + boolean allowReadingBinaryAsString -> b + java.nio.charset.CodingErrorAction actionOnMalformedString -> c + java.nio.charset.CodingErrorAction actionOnUnmappableString -> d + int stringSizeLimit -> e + int stringDecoderBufferSize -> f + com.batch.android.msgpack.core.buffer.MessageBufferInput in -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/p0/g;"} + com.batch.android.msgpack.core.buffer.MessageBuffer buffer -> h + int position -> i + long totalReadBytes -> j + com.batch.android.msgpack.core.buffer.MessageBuffer numberBuffer -> k + int nextReadPosition -> l + java.lang.StringBuilder decodeStringBuffer -> m + java.nio.charset.CharsetDecoder decoder -> n + java.nio.CharBuffer decodeBuffer -> o + com.batch.android.msgpack.core.buffer.MessageBuffer EMPTY_BUFFER -> p + java.lang.String EMPTY_STRING -> q + boolean $assertionsDisabled -> r + 1:3:void ():149:151 -> + 1:210:void (com.batch.android.msgpack.core.buffer.MessageBufferInput,com.batch.android.msgpack.core.MessagePack$UnpackerConfig):0:209 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/p0/g;Lcom/batch/android/o0/h$c;)V"} + 211:262:void (com.batch.android.msgpack.core.buffer.MessageBufferInput,com.batch.android.msgpack.core.MessagePack$UnpackerConfig):165:216 -> + 1:919:int unpackInt():0:918 -> A + 920:922:int unpackInt():912:914 -> A + 923:923:int unpackInt():909:909 -> A + 924:924:int unpackInt():906:906 -> A + 925:925:int unpackInt():903:903 -> A + 926:928:int unpackInt():897:899 -> A + 929:931:int unpackInt():891:893 -> A + 932:932:int unpackInt():888:888 -> A + 933:933:int unpackInt():885:885 -> A + 1:970:long unpackLong():0:969 -> B + 971:971:long unpackLong():966:966 -> B + 972:972:long unpackLong():963:963 -> B + 973:973:long unpackLong():960:960 -> B + 974:974:long unpackLong():957:957 -> B + 975:977:long unpackLong():951:953 -> B + 978:978:long unpackLong():944:944 -> B + 979:979:long unpackLong():941:941 -> B + 980:980:long unpackLong():938:938 -> B + 1:1:int unpackMapHeader():0:0 -> C + 1252:1268:int unpackMapHeader():1251:1267 -> C + 1269:1269:int unpackMapHeader():1258:1258 -> C + 1:702:void unpackNil():0:701 -> D + 1:1:int unpackRawStringHeader():0:0 -> E + 1358:1373:int unpackRawStringHeader():1357:1372 -> E + 1:866:short unpackShort():0:865 -> F + 867:869:short unpackShort():859:861 -> F + 870:872:short unpackShort():853:855 -> F + 873:873:short unpackShort():850:850 -> F + 874:874:short unpackShort():847:847 -> F + 875:877:short unpackShort():841:843 -> F + 878:880:short unpackShort():835:837 -> F + 881:883:short unpackShort():829:831 -> F + 884:884:short unpackShort():826:826 -> F + 1:1:java.lang.String unpackString():0:0 -> G + 1086:1165:java.lang.String unpackString():1085:1164 -> G + 1166:1169:java.lang.String unpackString():1157:1160 -> G + 1170:1199:java.lang.String unpackString():1141:1170 -> G + 1200:1201:java.lang.String unpackString():1090:1091 -> G + 1:620:com.batch.android.msgpack.value.ImmutableValue unpackValue():0:619 -> H + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/q;"} + 621:622:com.batch.android.msgpack.value.ImmutableValue unpackValue():615:616 -> H + 623:631:com.batch.android.msgpack.value.ImmutableValue unpackValue():603:611 -> H + 632:637:com.batch.android.msgpack.value.ImmutableValue unpackValue():594:599 -> H + 638:639:com.batch.android.msgpack.value.ImmutableValue unpackValue():589:590 -> H + 640:641:com.batch.android.msgpack.value.ImmutableValue unpackValue():584:585 -> H + 642:642:com.batch.android.msgpack.value.ImmutableValue unpackValue():581:581 -> H + 643:646:com.batch.android.msgpack.value.ImmutableValue unpackValue():575:578 -> H + 647:647:com.batch.android.msgpack.value.ImmutableValue unpackValue():573:573 -> H + 648:649:com.batch.android.msgpack.value.ImmutableValue unpackValue():570:571 -> H + 1:351:boolean ensureBuffer():0:350 -> a + 352:352:void handleCoderError(java.nio.charset.CoderResult):0:0 -> a + 1528:1531:void handleCoderError(java.nio.charset.CoderResult):1176:1179 -> a + 1532:1532:com.batch.android.msgpack.core.MessageIntegerOverflowException overflowI16(short):0:0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(S)Lcom/batch/android/o0/f;"} + 3152:3153:com.batch.android.msgpack.core.MessageIntegerOverflowException overflowI16(short):1620:1621 -> a + 3154:3154:com.batch.android.msgpack.core.MessageIntegerOverflowException overflowI64(long):0:0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(J)Lcom/batch/android/o0/f;"} + 4784:4785:com.batch.android.msgpack.core.MessageIntegerOverflowException overflowI64(long):1630:1631 -> a + 4786:4786:com.batch.android.msgpack.core.MessageIntegerOverflowException overflowU8(byte):0:0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(B)Lcom/batch/android/o0/f;"} + 6386:6387:com.batch.android.msgpack.core.MessageIntegerOverflowException overflowU8(byte):1600:1601 -> a + 6388:6388:void readPayload(com.batch.android.msgpack.core.buffer.MessageBuffer,int,int):0:0 -> a + 7859:7870:void readPayload(com.batch.android.msgpack.core.buffer.MessageBuffer,int,int):1471:1482 -> a + 7871:7871:void readPayload(java.nio.ByteBuffer):0:0 -> a + 9314:9324:void readPayload(java.nio.ByteBuffer):1443:1453 -> a + 9325:9325:void readPayload(byte[]):0:0 -> a + 10823:10823:void readPayload(byte[]):1498:1498 -> a + 10824:11065:com.batch.android.msgpack.core.buffer.MessageBufferInput reset(com.batch.android.msgpack.core.buffer.MessageBufferInput):0:241 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/p0/g;)Lcom/batch/android/p0/g;"} + 11066:11627:com.batch.android.msgpack.core.MessagePackException unexpected(java.lang.String,byte):0:561 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;B)Lcom/batch/android/o0/i;"} + 11628:12314:com.batch.android.msgpack.value.Variable unpackValue(com.batch.android.msgpack.value.Variable):0:686 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/a0;)Lcom/batch/android/q0/a0;"} + 12315:12316:com.batch.android.msgpack.value.Variable unpackValue(com.batch.android.msgpack.value.Variable):681:682 -> a + 12317:12324:com.batch.android.msgpack.value.Variable unpackValue(com.batch.android.msgpack.value.Variable):669:676 -> a + 12325:12330:com.batch.android.msgpack.value.Variable unpackValue(com.batch.android.msgpack.value.Variable):659:664 -> a + 12331:12332:com.batch.android.msgpack.value.Variable unpackValue(com.batch.android.msgpack.value.Variable):653:654 -> a + 12333:12334:com.batch.android.msgpack.value.Variable unpackValue(com.batch.android.msgpack.value.Variable):647:648 -> a + 12335:12335:com.batch.android.msgpack.value.Variable unpackValue(com.batch.android.msgpack.value.Variable):643:643 -> a + 12336:12341:com.batch.android.msgpack.value.Variable unpackValue(com.batch.android.msgpack.value.Variable):634:639 -> a + 12342:12342:com.batch.android.msgpack.value.Variable unpackValue(com.batch.android.msgpack.value.Variable):636:636 -> a + 12343:12343:com.batch.android.msgpack.value.Variable unpackValue(com.batch.android.msgpack.value.Variable):631:631 -> a + 12344:12345:com.batch.android.msgpack.value.Variable unpackValue(com.batch.android.msgpack.value.Variable):627:628 -> a + 1:273:com.batch.android.msgpack.core.buffer.MessageBuffer getNextBuffer():0:272 -> b + 274:274:com.batch.android.msgpack.core.buffer.MessageBuffer getNextBuffer():269:269 -> b + 275:275:com.batch.android.msgpack.core.MessageIntegerOverflowException overflowU16(short):0:0 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(S)Lcom/batch/android/o0/f;"} + 1880:1881:com.batch.android.msgpack.core.MessageIntegerOverflowException overflowU16(short):1605:1606 -> b + 1882:1882:com.batch.android.msgpack.core.MessageIntegerOverflowException overflowU64(long):0:0 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(J)Lcom/batch/android/o0/f;"} + 3497:3498:com.batch.android.msgpack.core.MessageIntegerOverflowException overflowU64(long):1615:1616 -> b + 3499:3499:int tryReadBinaryHeader(byte):0:0 -> b + 4849:4849:int tryReadBinaryHeader(byte):1350:1350 -> b + 4850:4850:int tryReadBinaryHeader(byte):1348:1348 -> b + 4851:4851:int tryReadBinaryHeader(byte):1346:1346 -> b + 1:1:java.lang.String decodeStringFastPath(int):0:0 -> c + 1185:1202:java.lang.String decodeStringFastPath(int):1184:1201 -> c + 1203:1203:java.lang.String decodeStringFastPath(int):1198:1198 -> c + 1204:1580:com.batch.android.msgpack.core.MessageFormat getNextFormat():0:376 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/o0/c;"} + 1581:1581:com.batch.android.msgpack.core.MessageFormat getNextFormat():373:373 -> c + 1582:1582:void readPayload(byte[],int,int):0:0 -> c + 3113:3124:void readPayload(byte[],int,int):1531:1542 -> c + 3125:3125:int tryReadStringHeader(byte):0:0 -> c + 4462:4462:int tryReadStringHeader(byte):1337:1337 -> c + 4463:4463:int tryReadStringHeader(byte):1335:1335 -> c + 4464:4464:int tryReadStringHeader(byte):1333:1333 -> c + 1:1:void close():0:0 -> close + 1595:1597:void close():1594:1596 -> close + 1:258:long getTotalReadBytes():0:257 -> d + 259:259:com.batch.android.msgpack.core.MessageIntegerOverflowException overflowI32(int):0:0 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/o0/f;"} + 1884:1885:com.batch.android.msgpack.core.MessageIntegerOverflowException overflowI32(int):1625:1626 -> d + 1886:2214:int utf8MultibyteCharacterSize(byte):0:328 -> d + 1:340:boolean hasNext():0:339 -> e + 341:341:com.batch.android.msgpack.core.MessageIntegerOverflowException overflowU32(int):0:0 -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/o0/f;"} + 1951:1952:com.batch.android.msgpack.core.MessageIntegerOverflowException overflowU32(int):1610:1611 -> e + 1:279:void nextBuffer():0:278 -> f + 280:280:com.batch.android.msgpack.core.MessageSizeException overflowU32Size(int):0:0 -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/o0/k;"} + 1916:1916:com.batch.android.msgpack.core.MessageSizeException overflowU32Size(int):1636:1636 -> f + 1:324:com.batch.android.msgpack.core.buffer.MessageBuffer prepareNumberBuffer(int):0:323 -> g + 325:325:com.batch.android.msgpack.core.buffer.MessageBuffer prepareNumberBuffer(int):316:316 -> g + 326:723:byte readByte():0:397 -> g + 1:424:double readDouble():0:423 -> h + 425:425:byte[] readPayload(int):0:0 -> h + 1939:1940:byte[] readPayload(int):1514:1515 -> h + 1:419:float readFloat():0:418 -> i + 420:420:com.batch.android.msgpack.core.buffer.MessageBuffer readPayloadAsReference(int):0:0 -> i + 1978:1985:com.batch.android.msgpack.core.buffer.MessageBuffer readPayloadAsReference(int):1558:1565 -> i + 1:409:int readInt():0:408 -> j + 410:410:void skipPayload(int):0:0 -> j + 1829:1837:void skipPayload(int):1419:1427 -> j + 1:414:long readLong():0:413 -> k + 415:951:void skipValue(int):0:536 -> k + 952:952:void skipValue(int):533:533 -> k + 953:953:void skipValue(int):530:530 -> k + 954:954:void skipValue(int):527:527 -> k + 955:955:void skipValue(int):524:524 -> k + 956:956:void skipValue(int):521:521 -> k + 957:957:void skipValue(int):518:518 -> k + 958:958:void skipValue(int):515:515 -> k + 959:959:void skipValue(int):512:512 -> k + 960:960:void skipValue(int):509:509 -> k + 961:961:void skipValue(int):506:506 -> k + 962:962:void skipValue(int):503:503 -> k + 963:963:void skipValue(int):500:500 -> k + 964:964:void skipValue(int):497:497 -> k + 965:965:void skipValue(int):493:493 -> k + 966:966:void skipValue(int):489:489 -> k + 967:967:void skipValue(int):485:485 -> k + 968:968:void skipValue(int):480:480 -> k + 969:969:void skipValue(int):475:475 -> k + 970:970:void skipValue(int):471:471 -> k + 971:971:void skipValue(int):466:466 -> k + 1:1:int readNextLength16():0:0 -> l + 1576:1576:int readNextLength16():1575:1575 -> l + 1:1:int readNextLength32():0:0 -> m + 1581:1583:int readNextLength32():1580:1582 -> m + 1:1:int readNextLength8():0:0 -> n + 1571:1571:int readNextLength8():1570:1570 -> n + 1:404:short readShort():0:403 -> o + 1:1:void resetDecoder():0:0 -> p + 1068:1081:void resetDecoder():1067:1080 -> p + 1:433:void skipValue():0:432 -> q + 1:722:boolean tryUnpackNil():0:721 -> r + 723:723:boolean tryUnpackNil():717:717 -> r + 1:1:int unpackArrayHeader():0:0 -> s + 1219:1235:int unpackArrayHeader():1218:1234 -> s + 1236:1236:int unpackArrayHeader():1225:1225 -> s + 1:1020:java.math.BigInteger unpackBigInteger():0:1019 -> t + 1021:1022:java.math.BigInteger unpackBigInteger():1016:1017 -> t + 1023:1024:java.math.BigInteger unpackBigInteger():1013:1014 -> t + 1025:1026:java.math.BigInteger unpackBigInteger():1010:1011 -> t + 1027:1028:java.math.BigInteger unpackBigInteger():1007:1008 -> t + 1029:1034:java.math.BigInteger unpackBigInteger():999:1004 -> t + 1035:1039:java.math.BigInteger unpackBigInteger():992:996 -> t + 1040:1041:java.math.BigInteger unpackBigInteger():989:990 -> t + 1042:1043:java.math.BigInteger unpackBigInteger():986:987 -> t + 1:1:int unpackBinaryHeader():0:0 -> u + 1393:1408:int unpackBinaryHeader():1392:1407 -> u + 1:742:boolean unpackBoolean():0:741 -> v + 1:807:byte unpackByte():0:806 -> w + 808:810:byte unpackByte():800:802 -> w + 811:813:byte unpackByte():794:796 -> w + 814:816:byte unpackByte():788:790 -> w + 817:817:byte unpackByte():785:785 -> w + 818:820:byte unpackByte():779:781 -> w + 821:823:byte unpackByte():773:775 -> w + 824:826:byte unpackByte():767:769 -> w + 827:829:byte unpackByte():761:763 -> w + 1:1:double unpackDouble():0:0 -> x + 1053:1062:double unpackDouble():1052:1061 -> x + 1063:1063:double unpackDouble():1055:1055 -> x + 1:1:com.batch.android.msgpack.core.ExtensionTypeHeader unpackExtensionTypeHeader():0:0 -> y + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/o0/a;"} + 1272:1328:com.batch.android.msgpack.core.ExtensionTypeHeader unpackExtensionTypeHeader():1271:1327 -> y + 1329:1330:com.batch.android.msgpack.core.ExtensionTypeHeader unpackExtensionTypeHeader():1295:1296 -> y + 1331:1332:com.batch.android.msgpack.core.ExtensionTypeHeader unpackExtensionTypeHeader():1290:1291 -> y + 1333:1334:com.batch.android.msgpack.core.ExtensionTypeHeader unpackExtensionTypeHeader():1285:1286 -> y + 1335:1336:com.batch.android.msgpack.core.ExtensionTypeHeader unpackExtensionTypeHeader():1280:1281 -> y + 1337:1385:com.batch.android.msgpack.core.ExtensionTypeHeader unpackExtensionTypeHeader():1275:1323 -> y + 1386:1386:com.batch.android.msgpack.core.ExtensionTypeHeader unpackExtensionTypeHeader():1319:1319 -> y + 1387:1391:com.batch.android.msgpack.core.ExtensionTypeHeader unpackExtensionTypeHeader():1308:1312 -> y + 1392:1396:com.batch.android.msgpack.core.ExtensionTypeHeader unpackExtensionTypeHeader():1300:1304 -> y + 1:1:float unpackFloat():0:0 -> z + 1033:1042:float unpackFloat():1032:1041 -> z + 1043:1043:float unpackFloat():1035:1035 -> z +com.batch.android.msgpack.core.MessageUnpacker$1 -> com.batch.android.o0.o$a: +# {"id":"sourceFile","fileName":"MessageUnpacker.java"} + int[] $SwitchMap$com$batch$android$msgpack$core$MessageFormat -> a + int[] $SwitchMap$com$batch$android$msgpack$value$ValueType -> b + 1:1:void ():568:568 -> + 2:2:void ():445:445 -> +com.batch.android.msgpack.core.Preconditions -> com.batch.android.o0.p: +# {"id":"sourceFile","fileName":"Preconditions.java"} + 1:76:void ():0:75 -> + 1:327:java.lang.String badElementIndex(int,int,java.lang.String):0:326 -> a + 328:328:java.lang.String badElementIndex(int,int,java.lang.String):324:324 -> a + 329:737:java.lang.String badPositionIndexes(int,int,int):0:408 -> a + 738:738:java.lang.String badPositionIndexes(int,int,int):405:405 -> a + 739:739:java.lang.String badPositionIndexes(int,int,int):402:402 -> a + 740:826:void checkArgument(boolean):0:86 -> a + 827:928:void checkArgument(boolean,java.lang.Object):0:101 -> a + 929:1059:void checkArgument(boolean,java.lang.String,java.lang.Object[]):0:130 -> a + 1060:1355:int checkElementIndex(int,int):0:295 -> a + 1356:1557:java.lang.Object checkNotNull(java.lang.Object):0:201 -> a + 1558:1776:java.lang.Object checkNotNull(java.lang.Object,java.lang.Object):0:218 -> a + 1777:2024:java.lang.Object checkNotNull(java.lang.Object,java.lang.String,java.lang.Object[]):0:247 -> a + 2025:2478:java.lang.String format(java.lang.String,java.lang.Object[]):0:453 -> a + 1:376:java.lang.String badPositionIndex(int,int,java.lang.String):0:375 -> b + 377:377:java.lang.String badPositionIndex(int,int,java.lang.String):373:373 -> b + 378:722:int checkPositionIndex(int,int):0:344 -> b + 723:1119:void checkPositionIndexes(int,int,int):0:396 -> b + 1120:1263:void checkState(boolean):0:143 -> b + 1264:1422:void checkState(boolean,java.lang.Object):0:158 -> b + 1423:1610:void checkState(boolean,java.lang.String,java.lang.Object[]):0:187 -> b + 1:316:int checkElementIndex(int,int,java.lang.String):0:315 -> c + 1:365:int checkPositionIndex(int,int,java.lang.String):0:364 -> d +com.batch.android.msgpack.core.buffer.ArrayBufferInput -> com.batch.android.p0.a: +# {"id":"sourceFile","fileName":"ArrayBufferInput.java"} + com.batch.android.msgpack.core.buffer.MessageBuffer buffer -> a + boolean isEmpty -> b + 1:34:void (com.batch.android.msgpack.core.buffer.MessageBuffer):0:33 -> + 35:73:void (byte[]):0:38 -> + 74:116:void (byte[],int,int):0:42 -> + 1:58:com.batch.android.msgpack.core.buffer.MessageBuffer reset(com.batch.android.msgpack.core.buffer.MessageBuffer):0:57 -> a + 59:122:void reset(byte[]):0:63 -> a + 1:68:void reset(byte[],int,int):0:67 -> c + 1:83:void close():0:82 -> close + 1:77:com.batch.android.msgpack.core.buffer.MessageBuffer next():0:76 -> next +com.batch.android.msgpack.core.buffer.ArrayBufferOutput -> com.batch.android.p0.b: +# {"id":"sourceFile","fileName":"ArrayBufferOutput.java"} + java.util.List list -> a + int bufferSize -> b + com.batch.android.msgpack.core.buffer.MessageBuffer lastBuffer -> c + 1:36:void ():0:35 -> + 37:77:void (int):0:40 -> + 1:109:void clear():0:108 -> a + 110:247:void write(byte[],int,int):0:137 -> a + 248:377:void writeBuffer(int):0:129 -> a + 1:144:void add(byte[],int,int):0:143 -> b + 145:196:int getSize():0:51 -> b + 197:315:com.batch.android.msgpack.core.buffer.MessageBuffer next(int):0:118 -> b + 1:1:java.util.List toBufferList():101:101 -> c + 1:1:void close():0:0 -> close + 1:70:byte[] toByteArray():0:69 -> d + 1:89:com.batch.android.msgpack.core.buffer.MessageBuffer toMessageBuffer():0:88 -> e + 1:1:void flush():0:0 -> flush +com.batch.android.msgpack.core.buffer.ByteBufferInput -> com.batch.android.p0.c: +# {"id":"sourceFile","fileName":"ByteBufferInput.java"} + java.nio.ByteBuffer input -> a + boolean isRead -> b + 1:31:void (java.nio.ByteBuffer):0:30 -> + 32:35:void (java.nio.ByteBuffer):28:31 -> + 1:44:java.nio.ByteBuffer reset(java.nio.ByteBuffer):0:43 -> a + 1:1:void close():0:0 -> close + 1:55:com.batch.android.msgpack.core.buffer.MessageBuffer next():0:54 -> next +com.batch.android.msgpack.core.buffer.ChannelBufferInput -> com.batch.android.p0.d: +# {"id":"sourceFile","fileName":"ChannelBufferInput.java"} + java.nio.channels.ReadableByteChannel channel -> a + com.batch.android.msgpack.core.buffer.MessageBuffer buffer -> b + 1:35:void (java.nio.channels.ReadableByteChannel):0:34 -> + 36:76:void (java.nio.channels.ReadableByteChannel,int):0:40 -> + 1:52:java.nio.channels.ReadableByteChannel reset(java.nio.channels.ReadableByteChannel):0:51 -> a + 1:69:void close():0:68 -> close + 1:64:com.batch.android.msgpack.core.buffer.MessageBuffer next():0:63 -> next +com.batch.android.msgpack.core.buffer.ChannelBufferOutput -> com.batch.android.p0.e: +# {"id":"sourceFile","fileName":"ChannelBufferOutput.java"} + java.nio.channels.WritableByteChannel channel -> a + com.batch.android.msgpack.core.buffer.MessageBuffer buffer -> b + 1:34:void (java.nio.channels.WritableByteChannel):0:33 -> + 35:73:void (java.nio.channels.WritableByteChannel,int):0:38 -> + 1:50:java.nio.channels.WritableByteChannel reset(java.nio.channels.WritableByteChannel):0:49 -> a + 51:124:void write(byte[],int,int):0:73 -> a + 125:190:void writeBuffer(int):0:65 -> a + 1:80:void add(byte[],int,int):0:79 -> b + 81:139:com.batch.android.msgpack.core.buffer.MessageBuffer next(int):0:58 -> b + 1:85:void close():0:84 -> close + 1:1:void flush():0:0 -> flush +com.batch.android.msgpack.core.buffer.DirectBufferAccess -> com.batch.android.msgpack.core.buffer.a: +# {"id":"sourceFile","fileName":"DirectBufferAccess.java"} + java.lang.reflect.Method mGetAddress -> a + java.lang.reflect.Method mCleaner -> b + java.lang.reflect.Method mClean -> c + java.lang.reflect.Method mInvokeCleaner -> d + java.lang.reflect.Constructor byteBufferConstructor -> e + java.lang.Class directByteBufferClass -> f + com.batch.android.msgpack.core.buffer.DirectBufferAccess$DirectBufferConstructorType directBufferConstructorType -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/msgpack/core/buffer/a$e;"} + java.lang.reflect.Method memoryBlockWrapFromJni -> h + 1:49:void ():54:102 -> + 50:63:void ():92:105 -> + 1:1:void ():30:30 -> + 1:1:java.lang.Object access$000(java.nio.ByteBuffer):28:28 -> a + 2:2:java.lang.Object access$100(java.nio.ByteBuffer,java.lang.reflect.Method):28:28 -> a + 3:10:void clean(java.lang.Object):232:239 -> a + 11:25:java.nio.ByteBuffer newByteBuffer(long,int,int,java.nio.ByteBuffer):249:263 -> a + 26:29:java.nio.ByteBuffer newByteBuffer(long,int,int,java.nio.ByteBuffer):257:260 -> a + 30:30:java.nio.ByteBuffer newByteBuffer(long,int,int,java.nio.ByteBuffer):257:257 -> a + 31:31:java.nio.ByteBuffer newByteBuffer(long,int,int,java.nio.ByteBuffer):255:255 -> a + 32:32:java.nio.ByteBuffer newByteBuffer(long,int,int,java.nio.ByteBuffer):253:253 -> a + 33:49:java.nio.ByteBuffer newByteBuffer(long,int,int,java.nio.ByteBuffer):251:267 -> a + 1:1:java.lang.Object access$200(java.nio.ByteBuffer):28:28 -> b + 2:5:java.lang.Object getCleanMethod(java.nio.ByteBuffer,java.lang.reflect.Method):185:188 -> b + 6:10:long getAddress(java.lang.Object):222:226 -> b + 11:11:long getAddress(java.lang.Object):224:224 -> b + 1:3:java.lang.Object getCleanerMethod(java.nio.ByteBuffer):163:165 -> c + 4:4:boolean isDirectByteBufferInstance(java.lang.Object):244:244 -> c + 1:2:java.lang.Object getInvokeCleanerMethod(java.nio.ByteBuffer):208:209 -> d + 1:27:void setupCleanerJava6(java.nio.ByteBuffer):111:137 -> e + 28:28:void setupCleanerJava6(java.nio.ByteBuffer):135:135 -> e + 29:29:void setupCleanerJava6(java.nio.ByteBuffer):121:121 -> e + 1:12:void setupCleanerJava9(java.nio.ByteBuffer):141:152 -> f + 13:13:void setupCleanerJava9(java.nio.ByteBuffer):150:150 -> f +com.batch.android.msgpack.core.buffer.DirectBufferAccess$1 -> com.batch.android.msgpack.core.buffer.a$a: +# {"id":"sourceFile","fileName":"DirectBufferAccess.java"} + java.nio.ByteBuffer val$direct -> a + 1:1:void (java.nio.ByteBuffer):113:113 -> + 1:1:java.lang.Object run():116:116 -> run +com.batch.android.msgpack.core.buffer.DirectBufferAccess$2 -> com.batch.android.msgpack.core.buffer.a$b: +# {"id":"sourceFile","fileName":"DirectBufferAccess.java"} + java.nio.ByteBuffer val$direct -> a + 1:1:void (java.nio.ByteBuffer):127:127 -> + 1:1:java.lang.Object run():130:130 -> run +com.batch.android.msgpack.core.buffer.DirectBufferAccess$3 -> com.batch.android.msgpack.core.buffer.a$c: +# {"id":"sourceFile","fileName":"DirectBufferAccess.java"} + java.nio.ByteBuffer val$direct -> a + 1:1:void (java.nio.ByteBuffer):142:142 -> + 1:1:java.lang.Object run():145:145 -> run +com.batch.android.msgpack.core.buffer.DirectBufferAccess$4 -> com.batch.android.msgpack.core.buffer.a$d: +# {"id":"sourceFile","fileName":"DirectBufferAccess.java"} + int[] $SwitchMap$com$batch$android$msgpack$core$buffer$DirectBufferAccess$DirectBufferConstructorType -> a + 1:1:void ():249:249 -> +com.batch.android.msgpack.core.buffer.DirectBufferAccess$DirectBufferConstructorType -> com.batch.android.msgpack.core.buffer.a$e: +# {"id":"sourceFile","fileName":"DirectBufferAccess.java"} + com.batch.android.msgpack.core.buffer.DirectBufferAccess$DirectBufferConstructorType ARGS_LONG_INT_REF -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/msgpack/core/buffer/a$e;"} + com.batch.android.msgpack.core.buffer.DirectBufferAccess$DirectBufferConstructorType ARGS_LONG_INT -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/msgpack/core/buffer/a$e;"} + com.batch.android.msgpack.core.buffer.DirectBufferAccess$DirectBufferConstructorType ARGS_INT_INT -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/msgpack/core/buffer/a$e;"} + com.batch.android.msgpack.core.buffer.DirectBufferAccess$DirectBufferConstructorType ARGS_MB_INT_INT -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/msgpack/core/buffer/a$e;"} + com.batch.android.msgpack.core.buffer.DirectBufferAccess$DirectBufferConstructorType[] $VALUES -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/msgpack/core/buffer/a$e;"} + 1:4:void ():33:36 -> + 5:5:void ():32:32 -> + 1:1:void (java.lang.String,int):32:32 -> + 1:1:com.batch.android.msgpack.core.buffer.DirectBufferAccess$DirectBufferConstructorType[] $values():32:32 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/msgpack/core/buffer/a$e;"} + 1:1:com.batch.android.msgpack.core.buffer.DirectBufferAccess$DirectBufferConstructorType valueOf(java.lang.String):32:32 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/msgpack/core/buffer/a$e;"} + 1:1:com.batch.android.msgpack.core.buffer.DirectBufferAccess$DirectBufferConstructorType[] values():32:32 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/msgpack/core/buffer/a$e;"} +com.batch.android.msgpack.core.buffer.InputStreamBufferInput -> com.batch.android.p0.f: +# {"id":"sourceFile","fileName":"InputStreamBufferInput.java"} + java.io.InputStream in -> a + byte[] buffer -> b + 1:46:void (java.io.InputStream):0:45 -> + 47:97:void (java.io.InputStream,int):0:50 -> + 1:42:com.batch.android.msgpack.core.buffer.MessageBufferInput newBufferInput(java.io.InputStream):0:41 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/io/InputStream;)Lcom/batch/android/p0/g;"} + 1:62:java.io.InputStream reset(java.io.InputStream):0:61 -> b + 1:77:void close():0:76 -> close + 1:72:com.batch.android.msgpack.core.buffer.MessageBuffer next():0:71 -> next +com.batch.android.msgpack.core.buffer.MessageBuffer -> com.batch.android.msgpack.core.buffer.MessageBuffer: +# {"id":"sourceFile","fileName":"MessageBuffer.java"} + 1:56:void ():50:105 -> + 57:110:void ():98:151 -> + 111:153:void ():109:151 -> + 154:194:void ():114:154 -> + 195:196:void ():150:151 -> + 1:5:void (byte[],int,int):334:338 -> + 6:27:void (java.nio.ByteBuffer):346:367 -> + 28:32:void (java.lang.Object,long,int):371:375 -> + 1:15:int getJavaVersion():158:172 -> a + 16:20:com.batch.android.msgpack.core.buffer.MessageBuffer newMessageBuffer(byte[],int,int):266:270 -> a + 21:25:com.batch.android.msgpack.core.buffer.MessageBuffer newMessageBuffer(java.nio.ByteBuffer):280:284 -> a + 26:41:com.batch.android.msgpack.core.buffer.MessageBuffer newInstance(java.lang.reflect.Constructor,java.lang.Object[]):297:312 -> a + 42:42:com.batch.android.msgpack.core.buffer.MessageBuffer newInstance(java.lang.reflect.Constructor,java.lang.Object[]):307:307 -> a + 43:43:com.batch.android.msgpack.core.buffer.MessageBuffer newInstance(java.lang.reflect.Constructor,java.lang.Object[]):303:303 -> a + 44:44:com.batch.android.msgpack.core.buffer.MessageBuffer newInstance(java.lang.reflect.Constructor,java.lang.Object[]):300:300 -> a + 1:1:com.batch.android.msgpack.core.buffer.MessageBuffer allocate(int):210:210 -> allocate + 2:2:com.batch.android.msgpack.core.buffer.MessageBuffer allocate(int):208:208 -> allocate + 1:1:byte[] array():568:568 -> array + 1:1:int arrayOffset():572:572 -> arrayOffset + 1:1:void copyTo(int,com.batch.android.msgpack.core.buffer.MessageBuffer,int,int):584:584 -> copyTo + 1:1:boolean getBoolean(int):405:405 -> getBoolean + 1:1:byte getByte(int):401:401 -> getByte + 1:1:void getBytes(int,byte[],int,int):440:440 -> getBytes + 2:6:void getBytes(int,int,java.nio.ByteBuffer):444:448 -> getBytes + 7:7:void getBytes(int,int,java.nio.ByteBuffer):445:445 -> getBytes + 1:1:double getDouble(int):436:436 -> getDouble + 1:1:float getFloat(int):427:427 -> getFloat + 1:3:int getInt(int):421:423 -> getInt + 1:2:long getLong(int):431:432 -> getLong + 1:2:short getShort(int):409:410 -> getShort + 1:1:boolean hasArray():553:553 -> hasArray + 1:1:void putBoolean(int,boolean):456:456 -> putBoolean + 1:1:void putByte(int,byte):452:452 -> putByte + 1:21:void putByteBuffer(int,java.nio.ByteBuffer,int):495:515 -> putByteBuffer + 22:22:void putByteBuffer(int,java.nio.ByteBuffer,int):500:500 -> putByteBuffer + 23:23:void putByteBuffer(int,java.nio.ByteBuffer,int):496:496 -> putByteBuffer + 1:1:void putBytes(int,byte[],int,int):491:491 -> putBytes + 1:1:void putDouble(int,double):487:487 -> putDouble + 1:1:void putFloat(int,float):477:477 -> putFloat + 1:2:void putInt(int,int):472:473 -> putInt + 1:2:void putLong(int,long):482:483 -> putLong + 1:1:void putMessageBuffer(int,com.batch.android.msgpack.core.buffer.MessageBuffer,int,int):522:522 -> putMessageBuffer + 1:2:void putShort(int,short):460:461 -> putShort + 1:7:void releaseBuffer(com.batch.android.msgpack.core.buffer.MessageBuffer):317:323 -> releaseBuffer + 1:1:int size():387:387 -> size + 1:5:com.batch.android.msgpack.core.buffer.MessageBuffer slice(int,int):392:396 -> slice + 1:7:java.nio.ByteBuffer sliceAsByteBuffer(int,int):533:539 -> sliceAsByteBuffer + 8:8:java.nio.ByteBuffer sliceAsByteBuffer(int,int):537:537 -> sliceAsByteBuffer + 9:9:java.nio.ByteBuffer sliceAsByteBuffer():549:549 -> sliceAsByteBuffer + 1:2:byte[] toByteArray():562:563 -> toByteArray + 1:8:java.lang.String toHexString(int,int):588:595 -> toHexString + 1:1:com.batch.android.msgpack.core.buffer.MessageBuffer wrap(byte[]):224:224 -> wrap + 2:2:com.batch.android.msgpack.core.buffer.MessageBuffer wrap(byte[],int,int):240:240 -> wrap + 3:3:com.batch.android.msgpack.core.buffer.MessageBuffer wrap(java.nio.ByteBuffer):256:256 -> wrap +com.batch.android.msgpack.core.buffer.MessageBufferBE -> com.batch.android.msgpack.core.buffer.MessageBufferBE: +# {"id":"sourceFile","fileName":"MessageBufferBE.java"} + 1:1:void (byte[],int,int):30:30 -> + 2:2:void (java.nio.ByteBuffer):34:34 -> + 3:3:void (java.lang.Object,long,int):38:38 -> + 1:5:com.batch.android.msgpack.core.buffer.MessageBufferBE slice(int,int):43:47 -> a + 1:1:double getDouble(int):73:73 -> getDouble + 1:1:float getFloat(int):68:68 -> getFloat + 1:1:int getInt(int):59:59 -> getInt + 1:1:long getLong(int):63:63 -> getLong + 1:1:short getShort(int):53:53 -> getShort + 1:1:void putDouble(int,double):93:93 -> putDouble + 1:1:void putInt(int,int):83:83 -> putInt + 1:1:void putLong(int,long):88:88 -> putLong + 1:1:void putShort(int,short):78:78 -> putShort + 1:1:com.batch.android.msgpack.core.buffer.MessageBuffer slice(int,int):27:27 -> slice +com.batch.android.msgpack.core.buffer.MessageBufferInput -> com.batch.android.p0.g: +# {"id":"sourceFile","fileName":"MessageBufferInput.java"} + void close() -> close + com.batch.android.msgpack.core.buffer.MessageBuffer next() -> next +com.batch.android.msgpack.core.buffer.MessageBufferOutput -> com.batch.android.p0.h: +# {"id":"sourceFile","fileName":"MessageBufferOutput.java"} + void write(byte[],int,int) -> a + void writeBuffer(int) -> a + void add(byte[],int,int) -> b + com.batch.android.msgpack.core.buffer.MessageBuffer next(int) -> b +com.batch.android.msgpack.core.buffer.MessageBufferU -> com.batch.android.msgpack.core.buffer.MessageBufferU: +# {"id":"sourceFile","fileName":"MessageBufferU.java"} + 1:2:void (byte[],int,int):31:32 -> + 3:4:void (java.nio.ByteBuffer):36:37 -> + 5:6:void (java.lang.Object,long,int,java.nio.ByteBuffer):41:42 -> + 1:1:byte[] array():233:233 -> array + 1:4:void copyTo(int,com.batch.android.msgpack.core.buffer.MessageBuffer,int,int):207:210 -> copyTo + 5:6:void copyTo(int,com.batch.android.msgpack.core.buffer.MessageBuffer,int,int):210:211 -> copyTo + 1:1:boolean getBoolean(int):73:73 -> getBoolean + 1:1:byte getByte(int):68:68 -> getByte + 1:5:void getBytes(int,int,java.nio.ByteBuffer):104:108 -> getBytes + 6:7:void getBytes(int,int,java.nio.ByteBuffer):108:109 -> getBytes + 8:11:void getBytes(int,byte[],int,int):166:169 -> getBytes + 12:13:void getBytes(int,byte[],int,int):169:170 -> getBytes + 1:1:double getDouble(int):98:98 -> getDouble + 1:1:float getFloat(int):88:88 -> getFloat + 1:1:int getInt(int):83:83 -> getInt + 1:1:long getLong(int):93:93 -> getLong + 1:1:short getShort(int):78:78 -> getShort + 1:1:boolean hasArray():228:228 -> hasArray + 1:1:void putBoolean(int,boolean):119:119 -> putBoolean + 1:1:void putByte(int,byte):114:114 -> putByte + 1:15:void putByteBuffer(int,java.nio.ByteBuffer,int):175:189 -> putByteBuffer + 16:17:void putByteBuffer(int,java.nio.ByteBuffer,int):189:190 -> putByteBuffer + 18:18:void putByteBuffer(int,java.nio.ByteBuffer,int):176:176 -> putByteBuffer + 1:4:void putBytes(int,byte[],int,int):197:200 -> putBytes + 5:6:void putBytes(int,byte[],int,int):200:201 -> putBytes + 1:1:void putDouble(int,double):144:144 -> putDouble + 1:1:void putFloat(int,float):134:134 -> putFloat + 1:1:void putInt(int,int):129:129 -> putInt + 1:1:void putLong(int,long):139:139 -> putLong + 1:1:void putMessageBuffer(int,com.batch.android.msgpack.core.buffer.MessageBuffer,int,int):216:216 -> putMessageBuffer + 1:1:void putShort(int,short):124:124 -> putShort + 1:2:void resetBufferPosition():62:63 -> resetBufferPosition + 1:1:com.batch.android.msgpack.core.buffer.MessageBuffer slice(int,int):26:26 -> slice + 2:11:com.batch.android.msgpack.core.buffer.MessageBufferU slice(int,int):47:56 -> slice + 12:13:com.batch.android.msgpack.core.buffer.MessageBufferU slice(int,int):56:57 -> slice + 1:5:java.nio.ByteBuffer sliceAsByteBuffer(int,int):150:154 -> sliceAsByteBuffer + 6:7:java.nio.ByteBuffer sliceAsByteBuffer(int,int):154:155 -> sliceAsByteBuffer + 8:8:java.nio.ByteBuffer sliceAsByteBuffer():160:160 -> sliceAsByteBuffer + 1:2:byte[] toByteArray():221:222 -> toByteArray +com.batch.android.msgpack.core.buffer.OutputStreamBufferOutput -> com.batch.android.p0.i: +# {"id":"sourceFile","fileName":"OutputStreamBufferOutput.java"} + java.io.OutputStream out -> a + com.batch.android.msgpack.core.buffer.MessageBuffer buffer -> b + 1:33:void (java.io.OutputStream):0:32 -> + 34:71:void (java.io.OutputStream,int):0:37 -> + 1:49:java.io.OutputStream reset(java.io.OutputStream):0:48 -> a + 50:117:void write(byte[],int,int):0:67 -> a + 118:180:void writeBuffer(int):0:62 -> a + 1:73:void add(byte[],int,int):0:72 -> b + 74:131:com.batch.android.msgpack.core.buffer.MessageBuffer next(int):0:57 -> b + 1:78:void close():0:77 -> close + 1:83:void flush():0:82 -> flush +com.batch.android.msgpack.value.ArrayValue -> com.batch.android.q0.a: +# {"id":"sourceFile","fileName":"ArrayValue.java"} + com.batch.android.msgpack.value.Value getOrNilValue(int) -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/q0/x;"} + com.batch.android.msgpack.value.Value get(int) -> get + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/q0/x;"} + java.util.Iterator iterator() -> iterator + java.util.List list() -> l + int size() -> size +com.batch.android.msgpack.value.BinaryValue -> com.batch.android.q0.b: +# {"id":"sourceFile","fileName":"BinaryValue.java"} +com.batch.android.msgpack.value.BooleanValue -> com.batch.android.q0.c: +# {"id":"sourceFile","fileName":"BooleanValue.java"} + boolean getBoolean() -> M +com.batch.android.msgpack.value.ExtensionValue -> com.batch.android.q0.d: +# {"id":"sourceFile","fileName":"ExtensionValue.java"} + byte[] getData() -> e + byte getType() -> k +com.batch.android.msgpack.value.FloatValue -> com.batch.android.q0.e: +# {"id":"sourceFile","fileName":"FloatValue.java"} +com.batch.android.msgpack.value.ImmutableArrayValue -> com.batch.android.q0.f: +# {"id":"sourceFile","fileName":"ImmutableArrayValue.java"} + java.util.Iterator iterator() -> iterator + java.util.List list() -> l +com.batch.android.msgpack.value.ImmutableBinaryValue -> com.batch.android.q0.g: +# {"id":"sourceFile","fileName":"ImmutableBinaryValue.java"} +com.batch.android.msgpack.value.ImmutableBooleanValue -> com.batch.android.q0.h: +# {"id":"sourceFile","fileName":"ImmutableBooleanValue.java"} +com.batch.android.msgpack.value.ImmutableExtensionValue -> com.batch.android.q0.i: +# {"id":"sourceFile","fileName":"ImmutableExtensionValue.java"} +com.batch.android.msgpack.value.ImmutableFloatValue -> com.batch.android.q0.j: +# {"id":"sourceFile","fileName":"ImmutableFloatValue.java"} +com.batch.android.msgpack.value.ImmutableIntegerValue -> com.batch.android.q0.k: +# {"id":"sourceFile","fileName":"ImmutableIntegerValue.java"} +com.batch.android.msgpack.value.ImmutableMapValue -> com.batch.android.q0.l: +# {"id":"sourceFile","fileName":"ImmutableMapValue.java"} +com.batch.android.msgpack.value.ImmutableNilValue -> com.batch.android.q0.m: +# {"id":"sourceFile","fileName":"ImmutableNilValue.java"} +com.batch.android.msgpack.value.ImmutableNumberValue -> com.batch.android.q0.n: +# {"id":"sourceFile","fileName":"ImmutableNumberValue.java"} +com.batch.android.msgpack.value.ImmutableRawValue -> com.batch.android.q0.o: +# {"id":"sourceFile","fileName":"ImmutableRawValue.java"} +com.batch.android.msgpack.value.ImmutableStringValue -> com.batch.android.q0.p: +# {"id":"sourceFile","fileName":"ImmutableStringValue.java"} +com.batch.android.msgpack.value.ImmutableValue -> com.batch.android.q0.q: +# {"id":"sourceFile","fileName":"ImmutableValue.java"} + 1:22:com.batch.android.msgpack.value.ArrayValue asArrayValue():0:21 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/a;"} + com.batch.android.msgpack.value.ImmutableArrayValue asArrayValue() -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/f;"} + com.batch.android.msgpack.value.ImmutableNilValue asNilValue() -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/m;"} + 1:22:com.batch.android.msgpack.value.NilValue asNilValue():0:21 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/t;"} + com.batch.android.msgpack.value.ImmutableIntegerValue asIntegerValue() -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/k;"} + 1:22:com.batch.android.msgpack.value.IntegerValue asIntegerValue():0:21 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/r;"} + com.batch.android.msgpack.value.ImmutableMapValue asMapValue() -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/l;"} + 1:22:com.batch.android.msgpack.value.MapValue asMapValue():0:21 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/s;"} + 1:22:com.batch.android.msgpack.value.BinaryValue asBinaryValue():0:21 -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/b;"} + com.batch.android.msgpack.value.ImmutableBinaryValue asBinaryValue() -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/g;"} + com.batch.android.msgpack.value.ImmutableStringValue asStringValue() -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/p;"} + 1:22:com.batch.android.msgpack.value.StringValue asStringValue():0:21 -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/w;"} + com.batch.android.msgpack.value.ImmutableRawValue asRawValue() -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/o;"} + 1:22:com.batch.android.msgpack.value.RawValue asRawValue():0:21 -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/v;"} + 1:22:com.batch.android.msgpack.value.BooleanValue asBooleanValue():0:21 -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/c;"} + com.batch.android.msgpack.value.ImmutableBooleanValue asBooleanValue() -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/h;"} + 1:22:com.batch.android.msgpack.value.FloatValue asFloatValue():0:21 -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/e;"} + com.batch.android.msgpack.value.ImmutableFloatValue asFloatValue() -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/j;"} +com.batch.android.msgpack.value.IntegerValue -> com.batch.android.q0.r: +# {"id":"sourceFile","fileName":"IntegerValue.java"} + java.math.BigInteger asBigInteger() -> B + long asLong() -> I + byte asByte() -> J + boolean isInLongRange() -> K + boolean isInByteRange() -> U + int asInt() -> V + boolean isInIntRange() -> p + short asShort() -> t + com.batch.android.msgpack.core.MessageFormat mostSuccinctMessageFormat() -> u + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/o0/c;"} + boolean isInShortRange() -> y +com.batch.android.msgpack.value.MapValue -> com.batch.android.q0.s: +# {"id":"sourceFile","fileName":"MapValue.java"} + java.util.Map map() -> H + java.util.Set entrySet() -> entrySet + java.util.Set keySet() -> keySet + int size() -> size + java.util.Collection values() -> values + com.batch.android.msgpack.value.Value[] getKeyValueArray() -> x + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/q0/x;"} +com.batch.android.msgpack.value.NilValue -> com.batch.android.q0.t: +# {"id":"sourceFile","fileName":"NilValue.java"} +com.batch.android.msgpack.value.NumberValue -> com.batch.android.q0.u: +# {"id":"sourceFile","fileName":"NumberValue.java"} + java.math.BigInteger toBigInteger() -> F + int toInt() -> G + long toLong() -> Y + float toFloat() -> n + double toDouble() -> o + byte toByte() -> r + short toShort() -> z +com.batch.android.msgpack.value.RawValue -> com.batch.android.q0.v: +# {"id":"sourceFile","fileName":"RawValue.java"} + java.lang.String asString() -> A + java.nio.ByteBuffer asByteBuffer() -> D + byte[] asByteArray() -> P + java.lang.String toString() -> toString +com.batch.android.msgpack.value.StringValue -> com.batch.android.q0.w: +# {"id":"sourceFile","fileName":"StringValue.java"} +com.batch.android.msgpack.value.Value -> com.batch.android.q0.x: +# {"id":"sourceFile","fileName":"Value.java"} + boolean isBinaryValue() -> C + boolean isNilValue() -> E + boolean isNumberValue() -> L + boolean isArrayValue() -> N + boolean isRawValue() -> O + boolean isExtensionValue() -> Q + com.batch.android.msgpack.value.NumberValue asNumberValue() -> R + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/u;"} + boolean isMapValue() -> S + boolean isFloatValue() -> T + boolean isBooleanValue() -> W + java.lang.String toJson() -> X + com.batch.android.msgpack.value.ArrayValue asArrayValue() -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/a;"} + void writeTo(com.batch.android.msgpack.core.MessagePacker) -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o0/j;)V"} + com.batch.android.msgpack.value.NilValue asNilValue() -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/t;"} + com.batch.android.msgpack.value.IntegerValue asIntegerValue() -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/r;"} + com.batch.android.msgpack.value.MapValue asMapValue() -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/s;"} + boolean equals(java.lang.Object) -> equals + com.batch.android.msgpack.value.BinaryValue asBinaryValue() -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/b;"} + com.batch.android.msgpack.value.StringValue asStringValue() -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/w;"} + com.batch.android.msgpack.value.RawValue asRawValue() -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/v;"} + com.batch.android.msgpack.value.BooleanValue asBooleanValue() -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/c;"} + com.batch.android.msgpack.value.FloatValue asFloatValue() -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/e;"} + com.batch.android.msgpack.value.ValueType getValueType() -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/z;"} + com.batch.android.msgpack.value.ExtensionValue asExtensionValue() -> q + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/d;"} + com.batch.android.msgpack.value.ImmutableValue immutableValue() -> s + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/q;"} + boolean isStringValue() -> v + boolean isIntegerValue() -> w +com.batch.android.msgpack.value.ValueFactory -> com.batch.android.q0.y: +# {"id":"sourceFile","fileName":"ValueFactory.java"} + 1:38:void ():0:37 -> + 1:133:com.batch.android.msgpack.value.ImmutableArrayValue newArray(java.util.List):0:132 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/util/List;)Lcom/batch/android/q0/f;"} + 134:273:com.batch.android.msgpack.value.ImmutableArrayValue newArray(com.batch.android.msgpack.value.Value[]):0:139 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"([Lcom/batch/android/q0/x;)Lcom/batch/android/q0/f;"} + 274:423:com.batch.android.msgpack.value.ImmutableArrayValue newArray(com.batch.android.msgpack.value.Value[],boolean):0:149 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"([Lcom/batch/android/q0/x;Z)Lcom/batch/android/q0/f;"} + 424:500:com.batch.android.msgpack.value.ImmutableBinaryValue newBinary(byte[]):0:76 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"([B)Lcom/batch/android/q0/g;"} + 501:589:com.batch.android.msgpack.value.ImmutableBinaryValue newBinary(byte[],int,int):0:88 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"([BII)Lcom/batch/android/q0/g;"} + 590:685:com.batch.android.msgpack.value.ImmutableBinaryValue newBinary(byte[],int,int,boolean):0:95 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"([BIIZ)Lcom/batch/android/q0/g;"} + 686:769:com.batch.android.msgpack.value.ImmutableBinaryValue newBinary(byte[],boolean):0:83 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"([BZ)Lcom/batch/android/q0/g;"} + 770:814:com.batch.android.msgpack.value.ImmutableBooleanValue newBoolean(boolean):0:44 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Z)Lcom/batch/android/q0/h;"} + 815:981:com.batch.android.msgpack.value.ImmutableMapValue newMap(java.util.Map):0:166 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/util/Map;)Lcom/batch/android/q0/l;"} + 982:1180:com.batch.android.msgpack.value.MapValue newMap(java.util.Map$Entry[]):0:198 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"([Ljava/util/Map$Entry;)Lcom/batch/android/q0/s;"} + 1181:1181:com.batch.android.msgpack.value.ImmutableIntegerValue newInteger(byte):48:48 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(B)Lcom/batch/android/q0/k;"} + 1182:1182:com.batch.android.msgpack.value.ImmutableIntegerValue newInteger(short):52:52 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(S)Lcom/batch/android/q0/k;"} + 1183:1183:com.batch.android.msgpack.value.ImmutableIntegerValue newInteger(int):56:56 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/q0/k;"} + 1184:1184:com.batch.android.msgpack.value.ImmutableIntegerValue newInteger(long):60:60 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(J)Lcom/batch/android/q0/k;"} + 1185:1185:com.batch.android.msgpack.value.ImmutableIntegerValue newInteger(java.math.BigInteger):64:64 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/math/BigInteger;)Lcom/batch/android/q0/k;"} + 1186:1186:com.batch.android.msgpack.value.ImmutableFloatValue newFloat(float):68:68 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(F)Lcom/batch/android/q0/j;"} + 1187:1187:com.batch.android.msgpack.value.ImmutableFloatValue newFloat(double):72:72 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(D)Lcom/batch/android/q0/j;"} + 1188:1188:com.batch.android.msgpack.value.ImmutableStringValue newString(java.lang.String):100:100 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/q0/p;"} + 1189:1189:com.batch.android.msgpack.value.ImmutableArrayValue emptyArray():154:154 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/f;"} + 1190:1190:java.util.Map$Entry newMapEntry(com.batch.android.msgpack.value.Value,com.batch.android.msgpack.value.Value):206:206 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/x;Lcom/batch/android/q0/x;)Ljava/util/Map$Entry;"} + 1191:1191:com.batch.android.msgpack.value.ImmutableExtensionValue newExtension(byte,byte[]):245:245 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(B[B)Lcom/batch/android/q0/i;"} + 1:174:com.batch.android.msgpack.value.ImmutableMapValue newMap(com.batch.android.msgpack.value.Value[]):0:173 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"([Lcom/batch/android/q0/x;)Lcom/batch/android/q0/l;"} + 175:358:com.batch.android.msgpack.value.ImmutableMapValue newMap(com.batch.android.msgpack.value.Value[],boolean):0:183 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"([Lcom/batch/android/q0/x;Z)Lcom/batch/android/q0/l;"} + 359:475:com.batch.android.msgpack.value.ImmutableStringValue newString(byte[],int,int):0:116 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"([BII)Lcom/batch/android/q0/p;"} + 476:599:com.batch.android.msgpack.value.ImmutableStringValue newString(byte[],int,int,boolean):0:123 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"([BIIZ)Lcom/batch/android/q0/p;"} + 600:711:com.batch.android.msgpack.value.ImmutableStringValue newString(byte[],boolean):0:111 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"([BZ)Lcom/batch/android/q0/p;"} + 712:712:com.batch.android.msgpack.value.ImmutableStringValue newString(byte[]):104:104 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"([B)Lcom/batch/android/q0/p;"} + 713:713:com.batch.android.msgpack.value.ImmutableMapValue emptyMap():188:188 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/l;"} + 1:1:com.batch.android.msgpack.value.ValueFactory$MapBuilder newMapBuilder():202:202 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/y$a;"} + 1:1:com.batch.android.msgpack.value.ImmutableNilValue newNil():40:40 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/m;"} +com.batch.android.msgpack.value.ValueFactory$MapBuilder -> com.batch.android.q0.y$a: +# {"id":"sourceFile","fileName":"ValueFactory.java"} + java.util.Map map -> a + 1:214:void ():0:213 -> + 215:215:void ():211:211 -> + 1:217:com.batch.android.msgpack.value.MapValue build():0:216 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/s;"} + 218:443:com.batch.android.msgpack.value.ValueFactory$MapBuilder put(com.batch.android.msgpack.value.Value,com.batch.android.msgpack.value.Value):0:225 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/x;Lcom/batch/android/q0/x;)Lcom/batch/android/q0/y$a;"} + 444:664:com.batch.android.msgpack.value.ValueFactory$MapBuilder put(java.util.Map$Entry):0:220 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/util/Map$Entry;)Lcom/batch/android/q0/y$a;"} + 665:896:com.batch.android.msgpack.value.ValueFactory$MapBuilder putAll(java.lang.Iterable):0:231 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/Iterable;)Lcom/batch/android/q0/y$a;"} + 897:1135:com.batch.android.msgpack.value.ValueFactory$MapBuilder putAll(java.util.Map):0:238 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/util/Map;)Lcom/batch/android/q0/y$a;"} +com.batch.android.msgpack.value.ValueType -> com.batch.android.q0.z: +# {"id":"sourceFile","fileName":"ValueType.java"} + boolean numberType -> a + boolean rawType -> b + com.batch.android.msgpack.value.ValueType NIL -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/z;"} + com.batch.android.msgpack.value.ValueType BOOLEAN -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/z;"} + com.batch.android.msgpack.value.ValueType INTEGER -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/z;"} + com.batch.android.msgpack.value.ValueType FLOAT -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/z;"} + com.batch.android.msgpack.value.ValueType STRING -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/z;"} + com.batch.android.msgpack.value.ValueType BINARY -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/z;"} + com.batch.android.msgpack.value.ValueType ARRAY -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/z;"} + com.batch.android.msgpack.value.ValueType MAP -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/z;"} + com.batch.android.msgpack.value.ValueType EXTENSION -> k + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/z;"} + com.batch.android.msgpack.value.ValueType[] $VALUES -> l + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/q0/z;"} + 1:9:void ():28:36 -> + 10:10:void ():27:27 -> + 1:44:void (java.lang.String,int,boolean,boolean):0:43 -> + 1:28:com.batch.android.msgpack.value.ValueType[] $values():0:27 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/q0/z;"} + 1:80:boolean isArrayType():0:79 -> b + 1:76:boolean isBinaryType():0:75 -> c + 1:52:boolean isBooleanType():0:51 -> d + 1:88:boolean isExtensionType():0:87 -> e + 1:64:boolean isFloatType():0:63 -> f + 1:60:boolean isIntegerType():0:59 -> g + 1:84:boolean isMapType():0:83 -> h + 1:48:boolean isNilType():0:47 -> i + 1:56:boolean isNumberType():0:55 -> j + 1:68:boolean isRawType():0:67 -> k + 1:72:boolean isStringType():0:71 -> l + 1:1:com.batch.android.msgpack.value.ValueType valueOf(java.lang.String):27:27 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/q0/z;"} + 1:1:com.batch.android.msgpack.value.ValueType[] values():27:27 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/q0/z;"} +com.batch.android.msgpack.value.Variable -> com.batch.android.q0.a0: +# {"id":"sourceFile","fileName":"Variable.java"} + com.batch.android.msgpack.value.Variable$NilValueAccessor nilAccessor -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0$l;"} + com.batch.android.msgpack.value.Variable$BooleanValueAccessor booleanAccessor -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0$g;"} + com.batch.android.msgpack.value.Variable$IntegerValueAccessor integerAccessor -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0$j;"} + com.batch.android.msgpack.value.Variable$FloatValueAccessor floatAccessor -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0$i;"} + com.batch.android.msgpack.value.Variable$BinaryValueAccessor binaryAccessor -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0$f;"} + com.batch.android.msgpack.value.Variable$StringValueAccessor stringAccessor -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0$m;"} + com.batch.android.msgpack.value.Variable$ArrayValueAccessor arrayAccessor -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0$e;"} + com.batch.android.msgpack.value.Variable$MapValueAccessor mapAccessor -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0$k;"} + com.batch.android.msgpack.value.Variable$ExtensionValueAccessor extensionAccessor -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0$h;"} + com.batch.android.msgpack.value.Variable$Type type -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0$n;"} + long longValue -> k + double doubleValue -> l + java.lang.Object objectValue -> m + com.batch.android.msgpack.value.Variable$AbstractValueAccessor accessor -> n + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0$d;"} + java.math.BigInteger LONG_MIN -> o + java.math.BigInteger LONG_MAX -> p + long BYTE_MIN -> q + long BYTE_MAX -> r + long SHORT_MIN -> s + long SHORT_MAX -> t + long INT_MIN -> u + long INT_MAX -> v + 1:298:void ():0:297 -> + 1:215:void ():0:214 -> + 216:235:void ():196:215 -> + 1:941:boolean isBinaryValue():0:940 -> C + 1:911:boolean isNilValue():0:910 -> E + 1:921:boolean isNumberValue():0:920 -> L + 1:951:boolean isArrayValue():0:950 -> N + 1:936:boolean isRawValue():0:935 -> O + 1:961:boolean isExtensionValue():0:960 -> Q + 1:985:com.batch.android.msgpack.value.NumberValue asNumberValue():0:984 -> R + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/u;"} + 986:986:com.batch.android.msgpack.value.NumberValue asNumberValue():982:982 -> R + 1:956:boolean isMapValue():0:955 -> S + 1:931:boolean isFloatValue():0:930 -> T + 1:916:boolean isBooleanValue():0:915 -> W + 1:896:java.lang.String toJson():0:895 -> X + 1:225:com.batch.android.msgpack.value.Variable setNilValue():0:224 -> Z + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/a0;"} + 1:39:long access$1000(com.batch.android.msgpack.value.Variable):0:38 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/a0;)J"} + 40:40:com.batch.android.msgpack.value.ArrayValue asArrayValue():0:0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/a;"} + 1069:1072:com.batch.android.msgpack.value.ArrayValue asArrayValue():1029:1032 -> a + 1073:1073:com.batch.android.msgpack.value.ArrayValue asArrayValue():1030:1030 -> a + 1074:1759:com.batch.android.msgpack.value.Variable setArrayValue(java.util.List):0:685 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/util/List;)Lcom/batch/android/q0/a0;"} + 1760:2369:com.batch.android.msgpack.value.Variable setBinaryValue(byte[]):0:609 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"([B)Lcom/batch/android/q0/a0;"} + 2370:2628:com.batch.android.msgpack.value.Variable setBooleanValue(boolean):0:258 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Z)Lcom/batch/android/q0/a0;"} + 2629:3461:com.batch.android.msgpack.value.Variable setExtensionValue(byte,byte[]):0:832 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(B[B)Lcom/batch/android/q0/a0;"} + 3462:3977:com.batch.android.msgpack.value.Variable setFloatValue(double):0:515 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(D)Lcom/batch/android/q0/a0;"} + 3978:4500:com.batch.android.msgpack.value.Variable setFloatValue(float):0:522 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(F)Lcom/batch/android/q0/a0;"} + 4501:4883:com.batch.android.msgpack.value.Variable setIntegerValue(long):0:382 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(J)Lcom/batch/android/q0/a0;"} + 4884:5278:com.batch.android.msgpack.value.Variable setIntegerValue(java.math.BigInteger):0:394 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/math/BigInteger;)Lcom/batch/android/q0/a0;"} + 5279:6032:com.batch.android.msgpack.value.Variable setMapValue(java.util.Map):0:753 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/util/Map;)Lcom/batch/android/q0/a0;"} + 6033:6676:com.batch.android.msgpack.value.Variable setStringValue(java.lang.String):0:643 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/q0/a0;"} + 6677:7557:void writeTo(com.batch.android.msgpack.core.MessagePacker):0:880 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o0/j;)V"} + 1:39:com.batch.android.msgpack.value.Variable$Type access$1100(com.batch.android.msgpack.value.Variable):0:38 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/a0;)Lcom/batch/android/q0/a0$n;"} + 40:1008:com.batch.android.msgpack.value.NilValue asNilValue():0:968 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/t;"} + 1009:1009:com.batch.android.msgpack.value.NilValue asNilValue():966:966 -> b + 1010:1659:com.batch.android.msgpack.value.Variable setStringValue(byte[]):0:649 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"([B)Lcom/batch/android/q0/a0;"} + 1:39:java.lang.Object access$1200(com.batch.android.msgpack.value.Variable):0:38 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/a0;)Ljava/lang/Object;"} + 40:1032:com.batch.android.msgpack.value.IntegerValue asIntegerValue():0:992 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/r;"} + 1033:1033:com.batch.android.msgpack.value.IntegerValue asIntegerValue():990:990 -> c + 1:39:double access$1300(com.batch.android.msgpack.value.Variable):0:38 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/a0;)D"} + 40:40:com.batch.android.msgpack.value.MapValue asMapValue():0:0 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/s;"} + 1077:1080:com.batch.android.msgpack.value.MapValue asMapValue():1037:1040 -> d + 1081:1081:com.batch.android.msgpack.value.MapValue asMapValue():1038:1038 -> d + 1:891:boolean equals(java.lang.Object):0:890 -> equals + 1:1:com.batch.android.msgpack.value.BinaryValue asBinaryValue():0:0 -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/b;"} + 1014:1017:com.batch.android.msgpack.value.BinaryValue asBinaryValue():1013:1016 -> f + 1018:1018:com.batch.android.msgpack.value.BinaryValue asBinaryValue():1014:1014 -> f + 1:1:com.batch.android.msgpack.value.StringValue asStringValue():0:0 -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/w;"} + 1022:1025:com.batch.android.msgpack.value.StringValue asStringValue():1021:1024 -> g + 1026:1026:com.batch.android.msgpack.value.StringValue asStringValue():1022:1022 -> g + 1:1:com.batch.android.msgpack.value.RawValue asRawValue():0:0 -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/v;"} + 1006:1009:com.batch.android.msgpack.value.RawValue asRawValue():1005:1008 -> h + 1010:1010:com.batch.android.msgpack.value.RawValue asRawValue():1006:1006 -> h + 1:886:int hashCode():0:885 -> hashCode + 1:977:com.batch.android.msgpack.value.BooleanValue asBooleanValue():0:976 -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/c;"} + 978:978:com.batch.android.msgpack.value.BooleanValue asBooleanValue():974:974 -> i + 1:1001:com.batch.android.msgpack.value.FloatValue asFloatValue():0:1000 -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/e;"} + 1002:1002:com.batch.android.msgpack.value.FloatValue asFloatValue():998:998 -> j + 1:906:com.batch.android.msgpack.value.ValueType getValueType():0:905 -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/z;"} + 1:1:com.batch.android.msgpack.value.ExtensionValue asExtensionValue():0:0 -> q + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/d;"} + 1046:1049:com.batch.android.msgpack.value.ExtensionValue asExtensionValue():1045:1048 -> q + 1050:1050:com.batch.android.msgpack.value.ExtensionValue asExtensionValue():1046:1046 -> q + 1:876:com.batch.android.msgpack.value.ImmutableValue immutableValue():0:875 -> s + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/q;"} + 1:901:java.lang.String toString():0:900 -> toString + 1:946:boolean isStringValue():0:945 -> v + 1:926:boolean isIntegerValue():0:925 -> w +com.batch.android.msgpack.value.Variable$1 -> com.batch.android.q0.a0$a: +# {"id":"sourceFile","fileName":"Variable.java"} +com.batch.android.msgpack.value.Variable$AbstractNumberValueAccessor -> com.batch.android.q0.a0$b: +# {"id":"sourceFile","fileName":"Variable.java"} + com.batch.android.msgpack.value.Variable this$0 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0;"} + 1:306:void (com.batch.android.msgpack.value.Variable):0:305 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/a0;)V"} + 307:612:void (com.batch.android.msgpack.value.Variable,com.batch.android.msgpack.value.Variable$1):0:305 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/a0;Lcom/batch/android/q0/a0$a;)V"} + 1:352:java.math.BigInteger toBigInteger():0:351 -> F + 1:334:int toInt():0:333 -> G + 1:1:com.batch.android.msgpack.value.NumberValue asNumberValue():0:0 -> R + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/u;"} + 1:342:long toLong():0:341 -> Y + 1:362:float toFloat():0:361 -> n + 1:372:double toDouble():0:371 -> o + 1:318:byte toByte():0:317 -> r + 1:326:short toShort():0:325 -> z +com.batch.android.msgpack.value.Variable$AbstractRawValueAccessor -> com.batch.android.q0.a0$c: +# {"id":"sourceFile","fileName":"Variable.java"} + com.batch.android.msgpack.value.Variable this$0 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0;"} + 1:556:void (com.batch.android.msgpack.value.Variable):0:555 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/a0;)V"} + 557:1112:void (com.batch.android.msgpack.value.Variable,com.batch.android.msgpack.value.Variable$1):0:555 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/a0;Lcom/batch/android/q0/a0$a;)V"} + 1:583:java.lang.String asString():0:582 -> A + 1:570:java.nio.ByteBuffer asByteBuffer():0:569 -> D + 1:565:byte[] asByteArray():0:564 -> P + 1:1:com.batch.android.msgpack.value.RawValue asRawValue():0:0 -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/v;"} + 1:598:java.lang.String toString():0:597 -> toString +com.batch.android.msgpack.value.Variable$AbstractValueAccessor -> com.batch.android.q0.a0$d: +# {"id":"sourceFile","fileName":"Variable.java"} + com.batch.android.msgpack.value.Variable this$0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0;"} + 1:41:void (com.batch.android.msgpack.value.Variable):0:40 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/a0;)V"} + 42:82:void (com.batch.android.msgpack.value.Variable,com.batch.android.msgpack.value.Variable$1):0:40 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/a0;Lcom/batch/android/q0/a0$a;)V"} + 1:75:boolean isBinaryValue():0:74 -> C + 1:45:boolean isNilValue():0:44 -> E + 1:55:boolean isNumberValue():0:54 -> L + 1:85:boolean isArrayValue():0:84 -> N + 1:70:boolean isRawValue():0:69 -> O + 1:95:boolean isExtensionValue():0:94 -> Q + 1:1:com.batch.android.msgpack.value.NumberValue asNumberValue():109:109 -> R + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/u;"} + 1:90:boolean isMapValue():0:89 -> S + 1:65:boolean isFloatValue():0:64 -> T + 1:50:boolean isBooleanValue():0:49 -> W + 1:165:java.lang.String toJson():0:164 -> X + 1:1:com.batch.android.msgpack.value.ArrayValue asArrayValue():139:139 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/a;"} + 1:1:com.batch.android.msgpack.value.NilValue asNilValue():99:99 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/t;"} + 1:1:com.batch.android.msgpack.value.IntegerValue asIntegerValue():114:114 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/r;"} + 1:1:com.batch.android.msgpack.value.MapValue asMapValue():144:144 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/s;"} + 1:155:boolean equals(java.lang.Object):0:154 -> equals + 1:1:com.batch.android.msgpack.value.BinaryValue asBinaryValue():129:129 -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/b;"} + 1:1:com.batch.android.msgpack.value.StringValue asStringValue():134:134 -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/w;"} + 1:1:com.batch.android.msgpack.value.RawValue asRawValue():124:124 -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/v;"} + 1:160:int hashCode():0:159 -> hashCode + 1:1:com.batch.android.msgpack.value.BooleanValue asBooleanValue():104:104 -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/c;"} + 1:1:com.batch.android.msgpack.value.FloatValue asFloatValue():119:119 -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/e;"} + 1:1:com.batch.android.msgpack.value.ExtensionValue asExtensionValue():149:149 -> q + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/d;"} + 1:170:java.lang.String toString():0:169 -> toString + 1:80:boolean isStringValue():0:79 -> v + 1:60:boolean isIntegerValue():0:59 -> w +com.batch.android.msgpack.value.Variable$ArrayValueAccessor -> com.batch.android.q0.a0$e: +# {"id":"sourceFile","fileName":"Variable.java"} + com.batch.android.msgpack.value.Variable this$0 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0;"} + 1:690:void (com.batch.android.msgpack.value.Variable):0:689 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/a0;)V"} + 691:1380:void (com.batch.android.msgpack.value.Variable,com.batch.android.msgpack.value.Variable$1):0:689 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/a0;Lcom/batch/android/q0/a0$a;)V"} + 1:704:com.batch.android.msgpack.value.ImmutableArrayValue immutableValue():0:703 -> Z + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/f;"} + 1:1:com.batch.android.msgpack.value.ArrayValue asArrayValue():0:0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/a;"} + 2:724:com.batch.android.msgpack.value.Value getOrNilValue(int):0:722 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/q0/x;"} + 725:1466:void writeTo(com.batch.android.msgpack.core.MessagePacker):0:741 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o0/j;)V"} + 1:714:com.batch.android.msgpack.value.Value get(int):0:713 -> get + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/q0/x;"} + 1:728:java.util.Iterator iterator():0:727 -> iterator + 1:734:java.util.List list():0:733 -> l + 1:1:com.batch.android.msgpack.value.ValueType getValueType():693:693 -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/z;"} + 1:690:com.batch.android.msgpack.value.ImmutableValue immutableValue():0:689 -> s + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/q;"} + 1:709:int size():0:708 -> size +com.batch.android.msgpack.value.Variable$BinaryValueAccessor -> com.batch.android.q0.a0$f: +# {"id":"sourceFile","fileName":"Variable.java"} + com.batch.android.msgpack.value.Variable this$0 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0;"} + 1:614:void (com.batch.android.msgpack.value.Variable):0:613 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/a0;)V"} + 615:1228:void (com.batch.android.msgpack.value.Variable,com.batch.android.msgpack.value.Variable$1):0:613 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/a0;Lcom/batch/android/q0/a0$a;)V"} + 1:628:com.batch.android.msgpack.value.ImmutableBinaryValue immutableValue():0:627 -> Z + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/g;"} + 1:635:void writeTo(com.batch.android.msgpack.core.MessagePacker):0:634 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o0/j;)V"} + 1:1:com.batch.android.msgpack.value.BinaryValue asBinaryValue():0:0 -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/b;"} + 1:1:com.batch.android.msgpack.value.ValueType getValueType():617:617 -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/z;"} + 1:614:com.batch.android.msgpack.value.ImmutableValue immutableValue():0:613 -> s + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/q;"} +com.batch.android.msgpack.value.Variable$BooleanValueAccessor -> com.batch.android.q0.a0$g: +# {"id":"sourceFile","fileName":"Variable.java"} + com.batch.android.msgpack.value.Variable this$0 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0;"} + 1:263:void (com.batch.android.msgpack.value.Variable):0:262 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/a0;)V"} + 264:526:void (com.batch.android.msgpack.value.Variable,com.batch.android.msgpack.value.Variable$1):0:262 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/a0;Lcom/batch/android/q0/a0$a;)V"} + 1:282:boolean getBoolean():0:281 -> M + 1:277:com.batch.android.msgpack.value.ImmutableBooleanValue immutableValue():0:276 -> Z + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/h;"} + 1:287:void writeTo(com.batch.android.msgpack.core.MessagePacker):0:286 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o0/j;)V"} + 1:1:com.batch.android.msgpack.value.BooleanValue asBooleanValue():0:0 -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/c;"} + 1:1:com.batch.android.msgpack.value.ValueType getValueType():266:266 -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/z;"} + 1:263:com.batch.android.msgpack.value.ImmutableValue immutableValue():0:262 -> s + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/q;"} +com.batch.android.msgpack.value.Variable$ExtensionValueAccessor -> com.batch.android.q0.a0$h: +# {"id":"sourceFile","fileName":"Variable.java"} + com.batch.android.msgpack.value.Variable this$0 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0;"} + 1:837:void (com.batch.android.msgpack.value.Variable):0:836 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/a0;)V"} + 838:1674:void (com.batch.android.msgpack.value.Variable,com.batch.android.msgpack.value.Variable$1):0:836 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/a0;Lcom/batch/android/q0/a0$a;)V"} + 1:851:com.batch.android.msgpack.value.ImmutableExtensionValue immutableValue():0:850 -> Z + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/i;"} + 1:866:void writeTo(com.batch.android.msgpack.core.MessagePacker):0:865 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o0/j;)V"} + 1:861:byte[] getData():0:860 -> e + 1:856:byte getType():0:855 -> k + 1:1:com.batch.android.msgpack.value.ValueType getValueType():840:840 -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/z;"} + 1:1:com.batch.android.msgpack.value.ExtensionValue asExtensionValue():0:0 -> q + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/d;"} + 1:837:com.batch.android.msgpack.value.ImmutableValue immutableValue():0:836 -> s + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/q;"} +com.batch.android.msgpack.value.Variable$FloatValueAccessor -> com.batch.android.q0.a0$i: +# {"id":"sourceFile","fileName":"Variable.java"} + com.batch.android.msgpack.value.Variable this$0 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0;"} + 1:527:void (com.batch.android.msgpack.value.Variable):0:526 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/a0;)V"} + 528:1054:void (com.batch.android.msgpack.value.Variable,com.batch.android.msgpack.value.Variable$1):0:526 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/a0;Lcom/batch/android/q0/a0$a;)V"} + 1:536:com.batch.android.msgpack.value.ImmutableFloatValue immutableValue():0:535 -> Z + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/j;"} + 1:546:void writeTo(com.batch.android.msgpack.core.MessagePacker):0:545 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o0/j;)V"} + 1:1:com.batch.android.msgpack.value.FloatValue asFloatValue():0:0 -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/e;"} + 1:1:com.batch.android.msgpack.value.ValueType getValueType():540:540 -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/z;"} + 1:527:com.batch.android.msgpack.value.ImmutableValue immutableValue():0:526 -> s + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/q;"} +com.batch.android.msgpack.value.Variable$IntegerValueAccessor -> com.batch.android.q0.a0$j: +# {"id":"sourceFile","fileName":"Variable.java"} + com.batch.android.msgpack.value.Variable this$0 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0;"} + 1:400:void (com.batch.android.msgpack.value.Variable):0:399 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/a0;)V"} + 401:800:void (com.batch.android.msgpack.value.Variable,com.batch.android.msgpack.value.Variable$1):0:399 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/a0;Lcom/batch/android/q0/a0$a;)V"} + 1:494:java.math.BigInteger asBigInteger():0:493 -> B + 1:486:long asLong():0:485 -> I + 487:487:long asLong():483:483 -> I + 1:462:byte asByte():0:461 -> J + 463:463:byte asByte():459:459 -> J + 1:446:boolean isInLongRange():0:445 -> K + 1:425:boolean isInByteRange():0:424 -> U + 1:478:int asInt():0:477 -> V + 479:479:int asInt():475:475 -> V + 1:417:com.batch.android.msgpack.value.ImmutableIntegerValue immutableValue():0:416 -> Z + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/k;"} + 1:503:void writeTo(com.batch.android.msgpack.core.MessagePacker):0:502 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o0/j;)V"} + 1:1:com.batch.android.msgpack.value.IntegerValue asIntegerValue():0:0 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/r;"} + 1:1:com.batch.android.msgpack.value.ValueType getValueType():403:403 -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/z;"} + 1:441:boolean isInIntRange():0:440 -> p + 1:400:com.batch.android.msgpack.value.ImmutableValue immutableValue():0:399 -> s + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/q;"} + 1:470:short asShort():0:469 -> t + 471:471:short asShort():467:467 -> t + 1:454:com.batch.android.msgpack.core.MessageFormat mostSuccinctMessageFormat():0:453 -> u + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/o0/c;"} + 1:433:boolean isInShortRange():0:432 -> y +com.batch.android.msgpack.value.Variable$MapValueAccessor -> com.batch.android.q0.a0$k: +# {"id":"sourceFile","fileName":"Variable.java"} + com.batch.android.msgpack.value.Variable this$0 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0;"} + 1:758:void (com.batch.android.msgpack.value.Variable):0:757 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/a0;)V"} + 759:1516:void (com.batch.android.msgpack.value.Variable,com.batch.android.msgpack.value.Variable$1):0:757 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/a0;Lcom/batch/android/q0/a0$a;)V"} + 1:813:java.util.Map map():0:812 -> H + 1:772:com.batch.android.msgpack.value.ImmutableMapValue immutableValue():0:771 -> Z + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/l;"} + 1:822:void writeTo(com.batch.android.msgpack.core.MessagePacker):0:821 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o0/j;)V"} + 1:1:com.batch.android.msgpack.value.MapValue asMapValue():0:0 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/s;"} + 1:787:java.util.Set entrySet():0:786 -> entrySet + 1:782:java.util.Set keySet():0:781 -> keySet + 1:1:com.batch.android.msgpack.value.ValueType getValueType():761:761 -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/z;"} + 1:758:com.batch.android.msgpack.value.ImmutableValue immutableValue():0:757 -> s + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/q;"} + 1:777:int size():0:776 -> size + 1:792:java.util.Collection values():0:791 -> values + 1:805:com.batch.android.msgpack.value.Value[] getKeyValueArray():0:804 -> x + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/q0/x;"} +com.batch.android.msgpack.value.Variable$NilValueAccessor -> com.batch.android.q0.a0$l: +# {"id":"sourceFile","fileName":"Variable.java"} + com.batch.android.msgpack.value.Variable this$0 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0;"} + 1:229:void (com.batch.android.msgpack.value.Variable):0:228 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/a0;)V"} + 230:458:void (com.batch.android.msgpack.value.Variable,com.batch.android.msgpack.value.Variable$1):0:228 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/a0;Lcom/batch/android/q0/a0$a;)V"} + 1:1:com.batch.android.msgpack.value.ImmutableNilValue immutableValue():242:242 -> Z + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/m;"} + 1:248:void writeTo(com.batch.android.msgpack.core.MessagePacker):0:247 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o0/j;)V"} + 1:1:com.batch.android.msgpack.value.NilValue asNilValue():0:0 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/t;"} + 1:1:com.batch.android.msgpack.value.ValueType getValueType():232:232 -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/z;"} + 1:229:com.batch.android.msgpack.value.ImmutableValue immutableValue():0:228 -> s + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/q;"} +com.batch.android.msgpack.value.Variable$StringValueAccessor -> com.batch.android.q0.a0$m: +# {"id":"sourceFile","fileName":"Variable.java"} + com.batch.android.msgpack.value.Variable this$0 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0;"} + 1:654:void (com.batch.android.msgpack.value.Variable):0:653 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/a0;)V"} + 655:1308:void (com.batch.android.msgpack.value.Variable,com.batch.android.msgpack.value.Variable$1):0:653 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/a0;Lcom/batch/android/q0/a0$a;)V"} + 1:668:com.batch.android.msgpack.value.ImmutableStringValue immutableValue():0:667 -> Z + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/p;"} + 1:675:void writeTo(com.batch.android.msgpack.core.MessagePacker):0:674 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o0/j;)V"} + 1:1:com.batch.android.msgpack.value.StringValue asStringValue():0:0 -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/w;"} + 1:1:com.batch.android.msgpack.value.ValueType getValueType():657:657 -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/z;"} + 1:654:com.batch.android.msgpack.value.ImmutableValue immutableValue():0:653 -> s + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/q;"} +com.batch.android.msgpack.value.Variable$Type -> com.batch.android.q0.a0$n: +# {"id":"sourceFile","fileName":"Variable.java"} + com.batch.android.msgpack.value.ValueType valueType -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/z;"} + com.batch.android.msgpack.value.Variable$Type NULL -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0$n;"} + com.batch.android.msgpack.value.Variable$Type BOOLEAN -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0$n;"} + com.batch.android.msgpack.value.Variable$Type LONG -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0$n;"} + com.batch.android.msgpack.value.Variable$Type BIG_INTEGER -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0$n;"} + com.batch.android.msgpack.value.Variable$Type DOUBLE -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0$n;"} + com.batch.android.msgpack.value.Variable$Type BYTE_ARRAY -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0$n;"} + com.batch.android.msgpack.value.Variable$Type RAW_STRING -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0$n;"} + com.batch.android.msgpack.value.Variable$Type LIST -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0$n;"} + com.batch.android.msgpack.value.Variable$Type MAP -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0$n;"} + com.batch.android.msgpack.value.Variable$Type EXTENSION -> k + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/a0$n;"} + com.batch.android.msgpack.value.Variable$Type[] $VALUES -> l + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/q0/a0$n;"} + 1:10:void ():174:183 -> + 11:11:void ():173:173 -> + 1:189:void (java.lang.String,int,com.batch.android.msgpack.value.ValueType):0:188 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;ILcom/batch/android/q0/z;)V"} + 1:174:com.batch.android.msgpack.value.Variable$Type[] $values():0:173 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/q0/a0$n;"} + 1:193:com.batch.android.msgpack.value.ValueType getValueType():0:192 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/z;"} + 1:1:com.batch.android.msgpack.value.Variable$Type valueOf(java.lang.String):173:173 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/q0/a0$n;"} + 1:1:com.batch.android.msgpack.value.Variable$Type[] values():173:173 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/q0/a0$n;"} +com.batch.android.msgpack.value.impl.AbstractImmutableRawValue -> com.batch.android.r0.a: +# {"id":"sourceFile","fileName":"AbstractImmutableRawValue.java"} + byte[] data -> a + java.lang.String decodedStringCache -> b + java.nio.charset.CharacterCodingException codingException -> c + char[] HEX_TABLE -> d + 1:1:void ():158:158 -> + 1:40:void (java.lang.String):0:39 -> + 41:75:void (byte[]):0:34 -> + 1:66:java.lang.String asString():0:65 -> A + 67:67:java.lang.String asString():63:63 -> A + 1:28:boolean isBinaryValue():0:27 -> C + 1:55:java.nio.ByteBuffer asByteBuffer():0:54 -> D + 1:28:boolean isNilValue():0:27 -> E + 1:28:boolean isNumberValue():0:27 -> L + 1:28:boolean isArrayValue():0:27 -> N + 1:28:boolean isRawValue():0:27 -> O + 1:50:byte[] asByteArray():0:49 -> P + 1:28:boolean isExtensionValue():0:27 -> Q + 1:28:boolean isMapValue():0:27 -> S + 1:28:boolean isFloatValue():0:27 -> T + 1:28:boolean isBooleanValue():0:27 -> W + 1:3:java.lang.String toJson():71:73 -> X + 1:28:com.batch.android.msgpack.value.ImmutableExtensionValue asExtensionValue():0:27 -> Z + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/i;"} + 1:134:void appendJsonString(java.lang.StringBuilder,java.lang.String):0:133 -> a + 135:141:void appendJsonString(java.lang.StringBuilder,java.lang.String):120:126 -> a + 142:170:void appendJsonString(java.lang.StringBuilder,java.lang.String):117:145 -> a + 171:187:void appendJsonString(java.lang.StringBuilder,java.lang.String):139:155 -> a + 188:215:com.batch.android.msgpack.value.ImmutableArrayValue asArrayValue():0:27 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/f;"} + 216:381:void escapeChar(java.lang.StringBuilder,int):0:165 -> a + 1:28:com.batch.android.msgpack.value.ImmutableNumberValue asNumberValue():0:27 -> a0 + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/n;"} + 1:28:com.batch.android.msgpack.value.ImmutableNilValue asNilValue():0:27 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/m;"} + 1:100:void decodeString():0:99 -> b0 + 101:105:void decodeString():95:99 -> b0 + 1:28:com.batch.android.msgpack.value.ImmutableIntegerValue asIntegerValue():0:27 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/k;"} + 1:28:com.batch.android.msgpack.value.ImmutableMapValue asMapValue():0:27 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/l;"} + 1:28:com.batch.android.msgpack.value.ImmutableBinaryValue asBinaryValue():0:27 -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/g;"} + 1:28:com.batch.android.msgpack.value.ImmutableStringValue asStringValue():0:27 -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/p;"} + 1:1:com.batch.android.msgpack.value.ImmutableRawValue asRawValue():0:0 -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/o;"} + 2:29:com.batch.android.msgpack.value.RawValue asRawValue():0:27 -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/v;"} + 1:28:com.batch.android.msgpack.value.ImmutableBooleanValue asBooleanValue():0:27 -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/h;"} + 1:28:com.batch.android.msgpack.value.ImmutableFloatValue asFloatValue():0:27 -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/j;"} + 1:108:java.lang.String toString():0:107 -> toString + 1:28:boolean isStringValue():0:27 -> v + 1:28:boolean isIntegerValue():0:27 -> w +com.batch.android.msgpack.value.impl.AbstractImmutableValue -> com.batch.android.r0.b: +# {"id":"sourceFile","fileName":"AbstractImmutableValue.java"} + 1:33:void ():0:32 -> + 1:67:boolean isBinaryValue():0:66 -> C + 1:37:boolean isNilValue():0:36 -> E + 1:47:boolean isNumberValue():0:46 -> L + 1:77:boolean isArrayValue():0:76 -> N + 1:62:boolean isRawValue():0:61 -> O + 1:87:boolean isExtensionValue():0:86 -> Q + 1:33:com.batch.android.msgpack.value.NumberValue asNumberValue():0:32 -> R + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/u;"} + 1:82:boolean isMapValue():0:81 -> S + 1:57:boolean isFloatValue():0:56 -> T + 1:42:boolean isBooleanValue():0:41 -> W + 1:1:com.batch.android.msgpack.value.ImmutableExtensionValue asExtensionValue():141:141 -> Z + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/i;"} + 1:33:com.batch.android.msgpack.value.ArrayValue asArrayValue():0:32 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/a;"} + 34:34:com.batch.android.msgpack.value.ImmutableArrayValue asArrayValue():131:131 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/f;"} + 1:1:com.batch.android.msgpack.value.ImmutableNumberValue asNumberValue():101:101 -> a0 + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/n;"} + 1:33:com.batch.android.msgpack.value.NilValue asNilValue():0:32 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/t;"} + 34:34:com.batch.android.msgpack.value.ImmutableNilValue asNilValue():91:91 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/m;"} + 1:33:com.batch.android.msgpack.value.IntegerValue asIntegerValue():0:32 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/r;"} + 34:34:com.batch.android.msgpack.value.ImmutableIntegerValue asIntegerValue():106:106 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/k;"} + 1:33:com.batch.android.msgpack.value.MapValue asMapValue():0:32 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/s;"} + 34:34:com.batch.android.msgpack.value.ImmutableMapValue asMapValue():136:136 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/l;"} + 1:33:com.batch.android.msgpack.value.BinaryValue asBinaryValue():0:32 -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/b;"} + 34:34:com.batch.android.msgpack.value.ImmutableBinaryValue asBinaryValue():121:121 -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/g;"} + 1:33:com.batch.android.msgpack.value.StringValue asStringValue():0:32 -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/w;"} + 34:34:com.batch.android.msgpack.value.ImmutableStringValue asStringValue():126:126 -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/p;"} + 1:33:com.batch.android.msgpack.value.RawValue asRawValue():0:32 -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/v;"} + 34:34:com.batch.android.msgpack.value.ImmutableRawValue asRawValue():116:116 -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/o;"} + 1:33:com.batch.android.msgpack.value.BooleanValue asBooleanValue():0:32 -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/c;"} + 34:34:com.batch.android.msgpack.value.ImmutableBooleanValue asBooleanValue():96:96 -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/h;"} + 1:33:com.batch.android.msgpack.value.FloatValue asFloatValue():0:32 -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/e;"} + 34:34:com.batch.android.msgpack.value.ImmutableFloatValue asFloatValue():111:111 -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/j;"} + 1:33:com.batch.android.msgpack.value.ExtensionValue asExtensionValue():0:32 -> q + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/d;"} + 1:72:boolean isStringValue():0:71 -> v + 1:52:boolean isIntegerValue():0:51 -> w +com.batch.android.msgpack.value.impl.ImmutableArrayValueImpl -> com.batch.android.r0.c: +# {"id":"sourceFile","fileName":"ImmutableArrayValueImpl.java"} + com.batch.android.msgpack.value.Value[] array -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/q0/x;"} + com.batch.android.msgpack.value.impl.ImmutableArrayValueImpl EMPTY -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/r0/c;"} + 1:1:void ():37:37 -> + 1:47:void (com.batch.android.msgpack.value.Value[]):0:46 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"([Lcom/batch/android/q0/x;)V"} + 1:36:boolean isBinaryValue():0:35 -> C + 1:36:boolean isNilValue():0:35 -> E + 1:36:boolean isNumberValue():0:35 -> L + 1:36:boolean isArrayValue():0:35 -> N + 1:36:boolean isRawValue():0:35 -> O + 1:36:boolean isExtensionValue():0:35 -> Q + 1:36:boolean isMapValue():0:35 -> S + 1:36:boolean isFloatValue():0:35 -> T + 1:36:boolean isBooleanValue():0:35 -> W + 1:157:java.lang.String toJson():0:156 -> X + 1:36:com.batch.android.msgpack.value.ImmutableExtensionValue asExtensionValue():0:35 -> Z + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/i;"} + 1:180:void appendString(java.lang.StringBuilder,com.batch.android.msgpack.value.Value):0:179 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/StringBuilder;Lcom/batch/android/q0/x;)V"} + 181:216:com.batch.android.msgpack.value.ArrayValue asArrayValue():0:35 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/a;"} + 217:217:com.batch.android.msgpack.value.ImmutableArrayValue asArrayValue():0:0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/f;"} + 218:297:com.batch.android.msgpack.value.Value getOrNilValue(int):0:79 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/q0/x;"} + 298:394:void writeTo(com.batch.android.msgpack.core.MessagePacker):0:96 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o0/j;)V"} + 1:36:com.batch.android.msgpack.value.ImmutableNumberValue asNumberValue():0:35 -> a0 + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/n;"} + 1:36:com.batch.android.msgpack.value.ImmutableNilValue asNilValue():0:35 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/m;"} + 1:1:com.batch.android.msgpack.value.ImmutableArrayValue empty():40:40 -> b0 + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/f;"} + 1:36:com.batch.android.msgpack.value.ImmutableIntegerValue asIntegerValue():0:35 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/k;"} + 1:1:com.batch.android.msgpack.value.ImmutableArrayValue immutableValue():0:0 -> c0 + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/f;"} + 1:36:com.batch.android.msgpack.value.ImmutableMapValue asMapValue():0:35 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/l;"} + 1:125:boolean equals(java.lang.Object):0:124 -> equals + 1:36:com.batch.android.msgpack.value.ImmutableBinaryValue asBinaryValue():0:35 -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/g;"} + 1:36:com.batch.android.msgpack.value.ImmutableStringValue asStringValue():0:35 -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/p;"} + 1:72:com.batch.android.msgpack.value.Value get(int):0:71 -> get + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/q0/x;"} + 1:36:com.batch.android.msgpack.value.ImmutableRawValue asRawValue():0:35 -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/o;"} + 1:139:int hashCode():0:138 -> hashCode + 1:36:com.batch.android.msgpack.value.ImmutableBooleanValue asBooleanValue():0:35 -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/h;"} + 1:1:java.util.Iterator iterator():84:84 -> iterator + 1:36:com.batch.android.msgpack.value.ImmutableFloatValue asFloatValue():0:35 -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/j;"} + 1:1:java.util.List list():89:89 -> l + 1:1:com.batch.android.msgpack.value.ValueType getValueType():51:51 -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/z;"} + 1:36:com.batch.android.msgpack.value.ImmutableValue immutableValue():0:35 -> s + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/q;"} + 1:67:int size():0:66 -> size + 1:173:java.lang.String toString():0:172 -> toString + 1:36:boolean isStringValue():0:35 -> v + 1:36:boolean isIntegerValue():0:35 -> w +com.batch.android.msgpack.value.impl.ImmutableArrayValueImpl$ImmutableArrayValueList -> com.batch.android.r0.c$a: +# {"id":"sourceFile","fileName":"ImmutableArrayValueImpl.java"} + com.batch.android.msgpack.value.Value[] array -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/q0/x;"} + 1:189:void (com.batch.android.msgpack.value.Value[]):0:188 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"([Lcom/batch/android/q0/x;)V"} + 1:194:com.batch.android.msgpack.value.Value get(int):0:193 -> get + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/q0/x;"} + 195:378:java.lang.Object get(int):0:183 -> get + 1:199:int size():0:198 -> size +com.batch.android.msgpack.value.impl.ImmutableArrayValueImpl$Ite -> com.batch.android.r0.c$b: +# {"id":"sourceFile","fileName":"ImmutableArrayValueImpl.java"} + com.batch.android.msgpack.value.Value[] array -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/q0/x;"} + int index -> b + 1:210:void (com.batch.android.msgpack.value.Value[]):0:209 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"([Lcom/batch/android/q0/x;)V"} + 1:225:com.batch.android.msgpack.value.Value next():0:224 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/x;"} + 226:226:com.batch.android.msgpack.value.Value next():221:221 -> a + 1:215:boolean hasNext():0:214 -> hasNext + 1:203:java.lang.Object next():0:202 -> next + 1:1:void remove():229:229 -> remove +com.batch.android.msgpack.value.impl.ImmutableBigIntegerValueImpl -> com.batch.android.r0.d: +# {"id":"sourceFile","fileName":"ImmutableBigIntegerValueImpl.java"} + java.math.BigInteger value -> a + java.math.BigInteger BYTE_MIN -> b + java.math.BigInteger BYTE_MAX -> c + java.math.BigInteger SHORT_MIN -> d + java.math.BigInteger SHORT_MAX -> e + java.math.BigInteger INT_MIN -> f + java.math.BigInteger INT_MAX -> g + java.math.BigInteger LONG_MIN -> h + java.math.BigInteger LONG_MAX -> i + 1:64:void ():0:63 -> + 1:54:void (java.math.BigInteger):0:53 -> + 1:180:java.math.BigInteger asBigInteger():0:179 -> B + 1:35:boolean isBinaryValue():0:34 -> C + 1:35:boolean isNilValue():0:34 -> E + 1:108:java.math.BigInteger toBigInteger():0:107 -> F + 1:98:int toInt():0:97 -> G + 1:175:long asLong():0:174 -> I + 176:176:long asLong():172:172 -> I + 1:151:byte asByte():0:150 -> J + 152:152:byte asByte():148:148 -> J + 1:138:boolean isInLongRange():0:137 -> K + 1:35:boolean isNumberValue():0:34 -> L + 1:35:boolean isArrayValue():0:34 -> N + 1:35:boolean isRawValue():0:34 -> O + 1:35:boolean isExtensionValue():0:34 -> Q + 1:35:com.batch.android.msgpack.value.NumberValue asNumberValue():0:34 -> R + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/u;"} + 1:35:boolean isMapValue():0:34 -> S + 1:35:boolean isFloatValue():0:34 -> T + 1:123:boolean isInByteRange():0:122 -> U + 1:167:int asInt():0:166 -> V + 168:168:int asInt():164:164 -> V + 1:35:boolean isBooleanValue():0:34 -> W + 1:218:java.lang.String toJson():0:217 -> X + 1:103:long toLong():0:102 -> Y + 1:35:com.batch.android.msgpack.value.ImmutableExtensionValue asExtensionValue():0:34 -> Z + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/i;"} + 1:35:com.batch.android.msgpack.value.ImmutableArrayValue asArrayValue():0:34 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/f;"} + 36:82:com.batch.android.msgpack.core.MessageFormat mostSuccinctMessageFormat(com.batch.android.msgpack.value.IntegerValue):0:46 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q0/r;)Lcom/batch/android/o0/c;"} + 83:267:void writeTo(com.batch.android.msgpack.core.MessagePacker):0:184 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o0/j;)V"} + 1:1:com.batch.android.msgpack.value.ImmutableNumberValue asNumberValue():0:0 -> a0 + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/n;"} + 1:35:com.batch.android.msgpack.value.ImmutableNilValue asNilValue():0:34 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/m;"} + 1:1:com.batch.android.msgpack.value.ImmutableIntegerValue immutableValue():0:0 -> b0 + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/k;"} + 1:1:com.batch.android.msgpack.value.ImmutableIntegerValue asIntegerValue():0:0 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/k;"} + 2:36:com.batch.android.msgpack.value.IntegerValue asIntegerValue():0:34 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/r;"} + 1:35:com.batch.android.msgpack.value.ImmutableMapValue asMapValue():0:34 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/l;"} + 1:202:boolean equals(java.lang.Object):0:201 -> equals + 1:35:com.batch.android.msgpack.value.ImmutableBinaryValue asBinaryValue():0:34 -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/g;"} + 1:35:com.batch.android.msgpack.value.ImmutableStringValue asStringValue():0:34 -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/p;"} + 1:35:com.batch.android.msgpack.value.ImmutableRawValue asRawValue():0:34 -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/o;"} + 1:7:int hashCode():206:212 -> hashCode + 1:35:com.batch.android.msgpack.value.ImmutableBooleanValue asBooleanValue():0:34 -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/h;"} + 1:35:com.batch.android.msgpack.value.ImmutableFloatValue asFloatValue():0:34 -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/j;"} + 1:1:com.batch.android.msgpack.value.ValueType getValueType():67:67 -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/z;"} + 1:113:float toFloat():0:112 -> n + 1:118:double toDouble():0:117 -> o + 1:133:boolean isInIntRange():0:132 -> p + 1:88:byte toByte():0:87 -> r + 1:35:com.batch.android.msgpack.value.ImmutableValue immutableValue():0:34 -> s + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/q;"} + 1:159:short asShort():0:158 -> t + 160:160:short asShort():156:156 -> t + 1:223:java.lang.String toString():0:222 -> toString + 1:143:com.batch.android.msgpack.core.MessageFormat mostSuccinctMessageFormat():0:142 -> u + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/o0/c;"} + 1:35:boolean isStringValue():0:34 -> v + 1:35:boolean isIntegerValue():0:34 -> w + 1:128:boolean isInShortRange():0:127 -> y + 1:93:short toShort():0:92 -> z +com.batch.android.msgpack.value.impl.ImmutableBinaryValueImpl -> com.batch.android.r0.e: +# {"id":"sourceFile","fileName":"ImmutableBinaryValueImpl.java"} + 1:35:void (byte[]):0:34 -> + 1:56:void writeTo(com.batch.android.msgpack.core.MessagePacker):0:55 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o0/j;)V"} + 1:1:com.batch.android.msgpack.value.ImmutableBinaryValue immutableValue():0:0 -> c0 + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/g;"} + 1:76:boolean equals(java.lang.Object):0:75 -> equals + 1:32:com.batch.android.msgpack.value.BinaryValue asBinaryValue():0:31 -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/b;"} + 33:33:com.batch.android.msgpack.value.ImmutableBinaryValue asBinaryValue():0:0 -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/g;"} + 1:82:int hashCode():0:81 -> hashCode + 1:1:com.batch.android.msgpack.value.ValueType getValueType():39:39 -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/z;"} + 1:32:com.batch.android.msgpack.value.ImmutableValue immutableValue():0:31 -> s + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/q;"} +com.batch.android.msgpack.value.impl.ImmutableBooleanValueImpl -> com.batch.android.r0.f: +# {"id":"sourceFile","fileName":"ImmutableBooleanValueImpl.java"} + boolean value -> a + com.batch.android.msgpack.value.ImmutableBooleanValue TRUE -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/h;"} + com.batch.android.msgpack.value.ImmutableBooleanValue FALSE -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/h;"} + 1:2:void ():33:34 -> + 1:40:void (boolean):0:39 -> + 1:32:boolean isBinaryValue():0:31 -> C + 1:32:boolean isNilValue():0:31 -> E + 1:32:boolean isNumberValue():0:31 -> L + 1:60:boolean getBoolean():0:59 -> M + 1:32:boolean isArrayValue():0:31 -> N + 1:32:boolean isRawValue():0:31 -> O + 1:32:boolean isExtensionValue():0:31 -> Q + 1:32:boolean isMapValue():0:31 -> S + 1:32:boolean isFloatValue():0:31 -> T + 1:32:boolean isBooleanValue():0:31 -> W + 1:95:java.lang.String toJson():0:94 -> X + 1:32:com.batch.android.msgpack.value.ImmutableExtensionValue asExtensionValue():0:31 -> Z + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/i;"} + 1:32:com.batch.android.msgpack.value.ImmutableArrayValue asArrayValue():0:31 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/f;"} + 33:97:void writeTo(com.batch.android.msgpack.core.MessagePacker):0:64 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o0/j;)V"} + 1:32:com.batch.android.msgpack.value.ImmutableNumberValue asNumberValue():0:31 -> a0 + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/n;"} + 1:32:com.batch.android.msgpack.value.ImmutableNilValue asNilValue():0:31 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/m;"} + 1:1:com.batch.android.msgpack.value.ImmutableBooleanValue immutableValue():0:0 -> b0 + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/h;"} + 1:32:com.batch.android.msgpack.value.ImmutableIntegerValue asIntegerValue():0:31 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/k;"} + 1:32:com.batch.android.msgpack.value.ImmutableMapValue asMapValue():0:31 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/l;"} + 1:81:boolean equals(java.lang.Object):0:80 -> equals + 1:32:com.batch.android.msgpack.value.ImmutableBinaryValue asBinaryValue():0:31 -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/g;"} + 1:32:com.batch.android.msgpack.value.ImmutableStringValue asStringValue():0:31 -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/p;"} + 1:32:com.batch.android.msgpack.value.ImmutableRawValue asRawValue():0:31 -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/o;"} + 1:86:int hashCode():0:85 -> hashCode + 1:32:com.batch.android.msgpack.value.BooleanValue asBooleanValue():0:31 -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/c;"} + 33:33:com.batch.android.msgpack.value.ImmutableBooleanValue asBooleanValue():0:0 -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/h;"} + 1:32:com.batch.android.msgpack.value.ImmutableFloatValue asFloatValue():0:31 -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/j;"} + 1:1:com.batch.android.msgpack.value.ValueType getValueType():44:44 -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/z;"} + 1:32:com.batch.android.msgpack.value.ImmutableValue immutableValue():0:31 -> s + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/q;"} + 1:100:java.lang.String toString():0:99 -> toString + 1:32:boolean isStringValue():0:31 -> v + 1:32:boolean isIntegerValue():0:31 -> w +com.batch.android.msgpack.value.impl.ImmutableDoubleValueImpl -> com.batch.android.r0.g: +# {"id":"sourceFile","fileName":"ImmutableDoubleValueImpl.java"} + double value -> a + 1:38:void (double):0:37 -> + 1:33:boolean isBinaryValue():0:32 -> C + 1:33:boolean isNilValue():0:32 -> E + 1:1:java.math.BigInteger toBigInteger():82:82 -> F + 1:73:int toInt():0:72 -> G + 1:33:boolean isNumberValue():0:32 -> L + 1:33:boolean isArrayValue():0:32 -> N + 1:33:boolean isRawValue():0:32 -> O + 1:33:boolean isExtensionValue():0:32 -> Q + 1:33:com.batch.android.msgpack.value.NumberValue asNumberValue():0:32 -> R + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/u;"} + 1:33:boolean isMapValue():0:32 -> S + 1:33:boolean isFloatValue():0:32 -> T + 1:33:boolean isBooleanValue():0:32 -> W + 1:128:java.lang.String toJson():0:127 -> X + 129:129:java.lang.String toJson():125:125 -> X + 1:78:long toLong():0:77 -> Y + 1:33:com.batch.android.msgpack.value.ImmutableExtensionValue asExtensionValue():0:32 -> Z + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/i;"} + 1:33:com.batch.android.msgpack.value.ImmutableArrayValue asArrayValue():0:32 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/f;"} + 34:131:void writeTo(com.batch.android.msgpack.core.MessagePacker):0:97 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o0/j;)V"} + 1:1:com.batch.android.msgpack.value.ImmutableNumberValue asNumberValue():0:0 -> a0 + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/n;"} + 1:33:com.batch.android.msgpack.value.ImmutableNilValue asNilValue():0:32 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/m;"} + 1:1:com.batch.android.msgpack.value.impl.ImmutableDoubleValueImpl immutableValue():0:0 -> b0 + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/r0/g;"} + 1:33:com.batch.android.msgpack.value.ImmutableIntegerValue asIntegerValue():0:32 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/k;"} + 1:33:com.batch.android.msgpack.value.ImmutableMapValue asMapValue():0:32 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/l;"} + 1:114:boolean equals(java.lang.Object):0:113 -> equals + 1:33:com.batch.android.msgpack.value.ImmutableBinaryValue asBinaryValue():0:32 -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/g;"} + 1:33:com.batch.android.msgpack.value.ImmutableStringValue asStringValue():0:32 -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/p;"} + 1:33:com.batch.android.msgpack.value.ImmutableRawValue asRawValue():0:32 -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/o;"} + 1:119:int hashCode():0:118 -> hashCode + 1:33:com.batch.android.msgpack.value.ImmutableBooleanValue asBooleanValue():0:32 -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/h;"} + 1:33:com.batch.android.msgpack.value.FloatValue asFloatValue():0:32 -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/e;"} + 34:34:com.batch.android.msgpack.value.ImmutableFloatValue asFloatValue():0:0 -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/j;"} + 1:1:com.batch.android.msgpack.value.ValueType getValueType():42:42 -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/z;"} + 1:88:float toFloat():0:87 -> n + 1:93:double toDouble():0:92 -> o + 1:63:byte toByte():0:62 -> r + 1:33:com.batch.android.msgpack.value.ImmutableValue immutableValue():0:32 -> s + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/q;"} + 1:134:java.lang.String toString():0:133 -> toString + 1:33:boolean isStringValue():0:32 -> v + 1:33:boolean isIntegerValue():0:32 -> w + 1:68:short toShort():0:67 -> z +com.batch.android.msgpack.value.impl.ImmutableExtensionValueImpl -> com.batch.android.r0.h: +# {"id":"sourceFile","fileName":"ImmutableExtensionValueImpl.java"} + byte type -> a + byte[] data -> b + 1:39:void (byte,byte[]):0:38 -> + 1:32:boolean isBinaryValue():0:31 -> C + 1:32:boolean isNilValue():0:31 -> E + 1:32:boolean isNumberValue():0:31 -> L + 1:32:boolean isArrayValue():0:31 -> N + 1:32:boolean isRawValue():0:31 -> O + 1:32:boolean isExtensionValue():0:31 -> Q + 1:32:boolean isMapValue():0:31 -> S + 1:32:boolean isFloatValue():0:31 -> T + 1:32:boolean isBooleanValue():0:31 -> W + 1:109:java.lang.String toJson():0:108 -> X + 1:1:com.batch.android.msgpack.value.ImmutableExtensionValue asExtensionValue():0:0 -> Z + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/i;"} + 1:32:com.batch.android.msgpack.value.ImmutableArrayValue asArrayValue():0:31 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/f;"} + 33:102:void writeTo(com.batch.android.msgpack.core.MessagePacker):0:69 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o0/j;)V"} + 1:32:com.batch.android.msgpack.value.ImmutableNumberValue asNumberValue():0:31 -> a0 + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/n;"} + 1:32:com.batch.android.msgpack.value.ImmutableNilValue asNilValue():0:31 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/m;"} + 1:1:com.batch.android.msgpack.value.ImmutableExtensionValue immutableValue():0:0 -> b0 + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/i;"} + 1:32:com.batch.android.msgpack.value.ImmutableIntegerValue asIntegerValue():0:31 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/k;"} + 1:32:com.batch.android.msgpack.value.ImmutableMapValue asMapValue():0:31 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/l;"} + 1:64:byte[] getData():0:63 -> e + 1:87:boolean equals(java.lang.Object):0:86 -> equals + 1:32:com.batch.android.msgpack.value.ImmutableBinaryValue asBinaryValue():0:31 -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/g;"} + 1:32:com.batch.android.msgpack.value.ImmutableStringValue asStringValue():0:31 -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/p;"} + 1:32:com.batch.android.msgpack.value.ImmutableRawValue asRawValue():0:31 -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/o;"} + 1:93:int hashCode():0:92 -> hashCode + 1:32:com.batch.android.msgpack.value.ImmutableBooleanValue asBooleanValue():0:31 -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/h;"} + 1:32:com.batch.android.msgpack.value.ImmutableFloatValue asFloatValue():0:31 -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/j;"} + 1:59:byte getType():0:58 -> k + 1:1:com.batch.android.msgpack.value.ValueType getValueType():43:43 -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/z;"} + 1:32:com.batch.android.msgpack.value.ExtensionValue asExtensionValue():0:31 -> q + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/d;"} + 1:32:com.batch.android.msgpack.value.ImmutableValue immutableValue():0:31 -> s + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/q;"} + 1:122:java.lang.String toString():0:121 -> toString + 1:32:boolean isStringValue():0:31 -> v + 1:32:boolean isIntegerValue():0:31 -> w +com.batch.android.msgpack.value.impl.ImmutableLongValueImpl -> com.batch.android.r0.i: +# {"id":"sourceFile","fileName":"ImmutableLongValueImpl.java"} + long value -> a + long BYTE_MIN -> b + long BYTE_MAX -> c + long SHORT_MIN -> d + long SHORT_MAX -> e + long INT_MIN -> f + long INT_MAX -> g + 1:40:void (long):0:39 -> + 1:161:java.math.BigInteger asBigInteger():0:160 -> B + 1:35:boolean isBinaryValue():0:34 -> C + 1:35:boolean isNilValue():0:34 -> E + 1:92:java.math.BigInteger toBigInteger():0:91 -> F + 1:82:int toInt():0:81 -> G + 1:156:long asLong():0:155 -> I + 1:135:byte asByte():0:134 -> J + 136:136:byte asByte():132:132 -> J + 1:1:boolean isInLongRange():0:0 -> K + 1:35:boolean isNumberValue():0:34 -> L + 1:35:boolean isArrayValue():0:34 -> N + 1:35:boolean isRawValue():0:34 -> O + 1:35:boolean isExtensionValue():0:34 -> Q + 1:35:com.batch.android.msgpack.value.NumberValue asNumberValue():0:34 -> R + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/u;"} + 1:35:boolean isMapValue():0:34 -> S + 1:35:boolean isFloatValue():0:34 -> T + 1:107:boolean isInByteRange():0:106 -> U + 1:151:int asInt():0:150 -> V + 152:152:int asInt():148:148 -> V + 1:35:boolean isBooleanValue():0:34 -> W + 1:200:java.lang.String toJson():0:199 -> X + 1:87:long toLong():0:86 -> Y + 1:35:com.batch.android.msgpack.value.ImmutableExtensionValue asExtensionValue():0:34 -> Z + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/i;"} + 1:35:com.batch.android.msgpack.value.ImmutableArrayValue asArrayValue():0:34 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/f;"} + 36:201:void writeTo(com.batch.android.msgpack.core.MessagePacker):0:165 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o0/j;)V"} + 1:1:com.batch.android.msgpack.value.ImmutableNumberValue asNumberValue():0:0 -> a0 + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/n;"} + 1:35:com.batch.android.msgpack.value.ImmutableNilValue asNilValue():0:34 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/m;"} + 1:1:com.batch.android.msgpack.value.ImmutableIntegerValue immutableValue():0:0 -> b0 + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/k;"} + 1:1:com.batch.android.msgpack.value.ImmutableIntegerValue asIntegerValue():0:0 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/k;"} + 2:36:com.batch.android.msgpack.value.IntegerValue asIntegerValue():0:34 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/r;"} + 1:35:com.batch.android.msgpack.value.ImmutableMapValue asMapValue():0:34 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/l;"} + 1:186:boolean equals(java.lang.Object):0:185 -> equals + 1:35:com.batch.android.msgpack.value.ImmutableBinaryValue asBinaryValue():0:34 -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/g;"} + 1:35:com.batch.android.msgpack.value.ImmutableStringValue asStringValue():0:34 -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/p;"} + 1:35:com.batch.android.msgpack.value.ImmutableRawValue asRawValue():0:34 -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/o;"} + 1:191:int hashCode():0:190 -> hashCode + 1:35:com.batch.android.msgpack.value.ImmutableBooleanValue asBooleanValue():0:34 -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/h;"} + 1:35:com.batch.android.msgpack.value.ImmutableFloatValue asFloatValue():0:34 -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/j;"} + 1:1:com.batch.android.msgpack.value.ValueType getValueType():51:51 -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/z;"} + 1:97:float toFloat():0:96 -> n + 1:102:double toDouble():0:101 -> o + 1:117:boolean isInIntRange():0:116 -> p + 1:72:byte toByte():0:71 -> r + 1:35:com.batch.android.msgpack.value.ImmutableValue immutableValue():0:34 -> s + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/q;"} + 1:143:short asShort():0:142 -> t + 144:144:short asShort():140:140 -> t + 1:205:java.lang.String toString():0:204 -> toString + 1:127:com.batch.android.msgpack.core.MessageFormat mostSuccinctMessageFormat():0:126 -> u + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/o0/c;"} + 1:35:boolean isStringValue():0:34 -> v + 1:35:boolean isIntegerValue():0:34 -> w + 1:112:boolean isInShortRange():0:111 -> y + 1:77:short toShort():0:76 -> z +com.batch.android.msgpack.value.impl.ImmutableMapValueImpl -> com.batch.android.r0.j: +# {"id":"sourceFile","fileName":"ImmutableMapValueImpl.java"} + com.batch.android.msgpack.value.Value[] kvs -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/q0/x;"} + com.batch.android.msgpack.value.impl.ImmutableMapValueImpl EMPTY -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/r0/j;"} + 1:1:void ():41:41 -> + 1:51:void (com.batch.android.msgpack.value.Value[]):0:50 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"([Lcom/batch/android/q0/x;)V"} + 1:40:boolean isBinaryValue():0:39 -> C + 1:40:boolean isNilValue():0:39 -> E + 1:1:java.util.Map map():95:95 -> H + 1:40:boolean isNumberValue():0:39 -> L + 1:40:boolean isArrayValue():0:39 -> N + 1:40:boolean isRawValue():0:39 -> O + 1:40:boolean isExtensionValue():0:39 -> Q + 1:40:boolean isMapValue():0:39 -> S + 1:40:boolean isFloatValue():0:39 -> T + 1:40:boolean isBooleanValue():0:39 -> W + 1:150:java.lang.String toJson():0:149 -> X + 1:40:com.batch.android.msgpack.value.ImmutableExtensionValue asExtensionValue():0:39 -> Z + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/i;"} + 1:157:void appendJsonKey(java.lang.StringBuilder,com.batch.android.msgpack.value.Value):0:156 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/StringBuilder;Lcom/batch/android/q0/x;)V"} + 158:197:com.batch.android.msgpack.value.ImmutableArrayValue asArrayValue():0:39 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/f;"} + 198:300:void writeTo(com.batch.android.msgpack.core.MessagePacker):0:102 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o0/j;)V"} + 1:40:com.batch.android.msgpack.value.ImmutableNumberValue asNumberValue():0:39 -> a0 + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/n;"} + 1:185:void appendString(java.lang.StringBuilder,com.batch.android.msgpack.value.Value):0:184 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/StringBuilder;Lcom/batch/android/q0/x;)V"} + 186:225:com.batch.android.msgpack.value.ImmutableNilValue asNilValue():0:39 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/m;"} + 1:1:com.batch.android.msgpack.value.ImmutableMapValue empty():44:44 -> b0 + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/l;"} + 1:40:com.batch.android.msgpack.value.ImmutableIntegerValue asIntegerValue():0:39 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/k;"} + 1:1:com.batch.android.msgpack.value.ImmutableMapValue immutableValue():0:0 -> c0 + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/l;"} + 1:1:com.batch.android.msgpack.value.ImmutableMapValue asMapValue():0:0 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/l;"} + 2:41:com.batch.android.msgpack.value.MapValue asMapValue():0:39 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/s;"} + 1:1:java.util.Set entrySet():85:85 -> entrySet + 1:121:boolean equals(java.lang.Object):0:120 -> equals + 1:40:com.batch.android.msgpack.value.ImmutableBinaryValue asBinaryValue():0:39 -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/g;"} + 1:40:com.batch.android.msgpack.value.ImmutableStringValue asStringValue():0:39 -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/p;"} + 1:40:com.batch.android.msgpack.value.ImmutableRawValue asRawValue():0:39 -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/o;"} + 1:128:int hashCode():0:127 -> hashCode + 1:40:com.batch.android.msgpack.value.ImmutableBooleanValue asBooleanValue():0:39 -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/h;"} + 1:40:com.batch.android.msgpack.value.ImmutableFloatValue asFloatValue():0:39 -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/j;"} + 1:1:java.util.Set keySet():80:80 -> keySet + 1:1:com.batch.android.msgpack.value.ValueType getValueType():55:55 -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/z;"} + 1:40:com.batch.android.msgpack.value.ImmutableValue immutableValue():0:39 -> s + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/q;"} + 1:76:int size():0:75 -> size + 1:178:java.lang.String toString():0:177 -> toString + 1:40:boolean isStringValue():0:39 -> v + 1:1:java.util.Collection values():90:90 -> values + 1:40:boolean isIntegerValue():0:39 -> w + 1:71:com.batch.android.msgpack.value.Value[] getKeyValueArray():0:70 -> x + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/q0/x;"} +com.batch.android.msgpack.value.impl.ImmutableMapValueImpl$EntryIterator -> com.batch.android.r0.j$a: +# {"id":"sourceFile","fileName":"ImmutableMapValueImpl.java"} + com.batch.android.msgpack.value.Value[] kvs -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/q0/x;"} + int index -> b + 1:302:void (com.batch.android.msgpack.value.Value[],int):0:301 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"([Lcom/batch/android/q0/x;I)V"} + 1:317:com.batch.android.msgpack.value.Value next():0:316 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/x;"} + 318:318:com.batch.android.msgpack.value.Value next():313:313 -> a + 1:307:boolean hasNext():0:306 -> hasNext + 1:295:java.lang.Object next():0:294 -> next + 1:1:void remove():321:321 -> remove +com.batch.android.msgpack.value.impl.ImmutableMapValueImpl$EntrySet -> com.batch.android.r0.j$b: +# {"id":"sourceFile","fileName":"ImmutableMapValueImpl.java"} + com.batch.android.msgpack.value.Value[] kvs -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/q0/x;"} + 1:208:void (com.batch.android.msgpack.value.Value[]):0:207 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"([Lcom/batch/android/q0/x;)V"} + 1:1:java.util.Iterator iterator():217:217 -> iterator + 1:213:int size():0:212 -> size +com.batch.android.msgpack.value.impl.ImmutableMapValueImpl$EntrySetIterator -> com.batch.android.r0.j$c: +# {"id":"sourceFile","fileName":"ImmutableMapValueImpl.java"} + com.batch.android.msgpack.value.Value[] kvs -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/q0/x;"} + int index -> b + 1:229:void (com.batch.android.msgpack.value.Value[]):0:228 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"([Lcom/batch/android/q0/x;)V"} + 1:247:java.util.Map$Entry next():0:246 -> a + 248:248:java.util.Map$Entry next():239:239 -> a + 1:234:boolean hasNext():0:233 -> hasNext + 1:222:java.lang.Object next():0:221 -> next + 1:1:void remove():252:252 -> remove +com.batch.android.msgpack.value.impl.ImmutableMapValueImpl$ImmutableMapValueMap -> com.batch.android.r0.j$d: +# {"id":"sourceFile","fileName":"ImmutableMapValueImpl.java"} + com.batch.android.msgpack.value.Value[] kvs -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/q0/x;"} + 1:194:void (com.batch.android.msgpack.value.Value[]):0:193 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"([Lcom/batch/android/q0/x;)V"} + 1:1:java.util.Set entrySet():198:198 -> entrySet +com.batch.android.msgpack.value.impl.ImmutableMapValueImpl$KeySet -> com.batch.android.r0.j$e: +# {"id":"sourceFile","fileName":"ImmutableMapValueImpl.java"} + com.batch.android.msgpack.value.Value[] kvs -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/q0/x;"} + 1:262:void (com.batch.android.msgpack.value.Value[]):0:261 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"([Lcom/batch/android/q0/x;)V"} + 1:1:java.util.Iterator iterator():271:271 -> iterator + 1:267:int size():0:266 -> size +com.batch.android.msgpack.value.impl.ImmutableMapValueImpl$ValueCollection -> com.batch.android.r0.j$f: +# {"id":"sourceFile","fileName":"ImmutableMapValueImpl.java"} + com.batch.android.msgpack.value.Value[] kvs -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/q0/x;"} + 1:281:void (com.batch.android.msgpack.value.Value[]):0:280 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"([Lcom/batch/android/q0/x;)V"} + 1:1:java.util.Iterator iterator():290:290 -> iterator + 1:286:int size():0:285 -> size +com.batch.android.msgpack.value.impl.ImmutableNilValueImpl -> com.batch.android.r0.k: +# {"id":"sourceFile","fileName":"ImmutableNilValueImpl.java"} + com.batch.android.msgpack.value.ImmutableNilValue instance -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/q0/m;"} + 1:1:void ():33:33 -> + 1:40:void ():0:39 -> + 1:32:boolean isBinaryValue():0:31 -> C + 1:32:boolean isNilValue():0:31 -> E + 1:32:boolean isNumberValue():0:31 -> L + 1:32:boolean isArrayValue():0:31 -> N + 1:32:boolean isRawValue():0:31 -> O + 1:32:boolean isExtensionValue():0:31 -> Q + 1:32:boolean isMapValue():0:31 -> S + 1:32:boolean isFloatValue():0:31 -> T + 1:32:boolean isBooleanValue():0:31 -> W + 1:1:java.lang.String toJson():84:84 -> X + 1:32:com.batch.android.msgpack.value.ImmutableExtensionValue asExtensionValue():0:31 -> Z + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/i;"} + 1:32:com.batch.android.msgpack.value.ImmutableArrayValue asArrayValue():0:31 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/f;"} + 33:91:void writeTo(com.batch.android.msgpack.core.MessagePacker):0:58 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o0/j;)V"} + 1:32:com.batch.android.msgpack.value.ImmutableNumberValue asNumberValue():0:31 -> a0 + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/n;"} + 1:1:com.batch.android.msgpack.value.ImmutableNilValue asNilValue():0:0 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/m;"} + 2:33:com.batch.android.msgpack.value.NilValue asNilValue():0:31 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/t;"} + 1:1:com.batch.android.msgpack.value.ImmutableNilValue get():36:36 -> b0 + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/m;"} + 1:32:com.batch.android.msgpack.value.ImmutableIntegerValue asIntegerValue():0:31 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/k;"} + 1:1:com.batch.android.msgpack.value.ImmutableNilValue immutableValue():0:0 -> c0 + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/m;"} + 1:32:com.batch.android.msgpack.value.ImmutableMapValue asMapValue():0:31 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/l;"} + 1:70:boolean equals(java.lang.Object):0:69 -> equals + 1:32:com.batch.android.msgpack.value.ImmutableBinaryValue asBinaryValue():0:31 -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/g;"} + 1:32:com.batch.android.msgpack.value.ImmutableStringValue asStringValue():0:31 -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/p;"} + 1:32:com.batch.android.msgpack.value.ImmutableRawValue asRawValue():0:31 -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/o;"} + 1:1:int hashCode():0:0 -> hashCode + 1:32:com.batch.android.msgpack.value.ImmutableBooleanValue asBooleanValue():0:31 -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/h;"} + 1:32:com.batch.android.msgpack.value.ImmutableFloatValue asFloatValue():0:31 -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/j;"} + 1:1:com.batch.android.msgpack.value.ValueType getValueType():43:43 -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/z;"} + 1:32:com.batch.android.msgpack.value.ImmutableValue immutableValue():0:31 -> s + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/q;"} + 1:80:java.lang.String toString():0:79 -> toString + 1:32:boolean isStringValue():0:31 -> v + 1:32:boolean isIntegerValue():0:31 -> w +com.batch.android.msgpack.value.impl.ImmutableStringValueImpl -> com.batch.android.r0.l: +# {"id":"sourceFile","fileName":"ImmutableStringValueImpl.java"} + 1:39:void (java.lang.String):0:38 -> + 40:74:void (byte[]):0:34 -> + 1:60:void writeTo(com.batch.android.msgpack.core.MessagePacker):0:59 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o0/j;)V"} + 1:1:com.batch.android.msgpack.value.ImmutableStringValue immutableValue():0:0 -> c0 + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/p;"} + 1:80:boolean equals(java.lang.Object):0:79 -> equals + 1:1:com.batch.android.msgpack.value.ImmutableStringValue asStringValue():0:0 -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/p;"} + 2:33:com.batch.android.msgpack.value.StringValue asStringValue():0:31 -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/w;"} + 1:86:int hashCode():0:85 -> hashCode + 1:1:com.batch.android.msgpack.value.ValueType getValueType():43:43 -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/z;"} + 1:32:com.batch.android.msgpack.value.ImmutableValue immutableValue():0:31 -> s + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/q0/q;"} +com.batch.android.post.DisplayReceiptPostDataProvider -> com.batch.android.s0.a: +# {"id":"sourceFile","fileName":"DisplayReceiptPostDataProvider.java"} + java.util.Collection receipts -> b + 1:15:void (java.util.Collection):0:14 -> + 1:10:java.lang.Object getRawData():0:9 -> b + 1:36:byte[] pack():0:35 -> c + 37:40:byte[] pack():31:34 -> c + 1:20:java.util.Collection getRawData():0:19 -> d + 1:41:boolean isEmpty():0:40 -> isEmpty +com.batch.android.post.InboxSyncPostDataProvider -> com.batch.android.s0.b: +# {"id":"sourceFile","fileName":"InboxSyncPostDataProvider.java"} + com.batch.android.json.JSONObject body -> a + java.lang.String TAG -> b + 1:31:void (java.util.Collection):0:30 -> + 1:1:java.lang.String getContentType():50:50 -> a + 1:12:java.lang.Object getRawData():0:11 -> b + 1:37:com.batch.android.json.JSONObject getRawData():0:36 -> c + 1:42:byte[] getData():0:41 -> e + 1:46:boolean isEmpty():0:45 -> isEmpty +com.batch.android.post.JSONPostDataProvider -> com.batch.android.s0.c: +# {"id":"sourceFile","fileName":"JSONPostDataProvider.java"} + com.batch.android.json.JSONObject data -> a + 1:24:void ():0:23 -> + 25:61:void (com.batch.android.json.JSONObject):0:36 -> + 62:62:void (com.batch.android.json.JSONObject):33:33 -> + 1:1:java.lang.String getContentType():48:48 -> a + 1:11:java.lang.Object getRawData():0:10 -> b + 1:59:com.batch.android.json.JSONObject getRawData():0:58 -> c + 1:44:byte[] getData():0:43 -> e + 1:54:boolean isEmpty():0:53 -> isEmpty +com.batch.android.post.LocalCampaignsJITPostDataProvider -> com.batch.android.s0.d: +# {"id":"sourceFile","fileName":"LocalCampaignsJITPostDataProvider.java"} + java.util.Collection campaigns -> b + java.lang.String TAG -> c + java.lang.String IDS_KEY -> d + java.lang.String CAMPAIGNS_KEY -> e + java.lang.String ATTRIBUTES_KEY -> f + java.lang.String VIEWS_KEY -> g + java.lang.String COUNT_KEY -> h + java.lang.String ELIGIBLE_CAMPAIGNS_KEY -> i + 1:41:void (java.util.Collection):0:40 -> + 1:121:java.util.List unpack(byte[]):0:120 -> a + 1:27:java.lang.Object getRawData():0:26 -> b + 1:48:byte[] pack():50:97 -> c + 49:52:byte[] pack():93:96 -> c + 1:46:java.util.Collection getRawData():0:45 -> d + 1:128:boolean isEmpty():0:127 -> isEmpty +com.batch.android.post.MessagePackPostDataProvider -> com.batch.android.s0.e: +# {"id":"sourceFile","fileName":"MessagePackPostDataProvider.java"} + java.lang.String TAG -> a + 1:7:void ():0:6 -> + 1:1:java.lang.String getContentType():24:24 -> a + byte[] pack() -> c + 1:19:byte[] getData():0:18 -> e +com.batch.android.post.MetricPostDataProvider -> com.batch.android.s0.f: +# {"id":"sourceFile","fileName":"MetricPostDataProvider.java"} + java.util.Collection metrics -> b + 1:15:void (java.util.Collection):0:14 -> + 1:10:java.lang.Object getRawData():0:9 -> b + 1:36:byte[] pack():0:35 -> c + 37:40:byte[] pack():31:34 -> c + 1:20:java.util.Collection getRawData():0:19 -> d + 1:41:boolean isEmpty():0:40 -> isEmpty +com.batch.android.post.ParametersPostDataProvider -> com.batch.android.s0.g: +# {"id":"sourceFile","fileName":"ParametersPostDataProvider.java"} + java.util.Map params -> a + 1:26:void ():0:25 -> + 27:60:void (java.util.Map):0:33 -> + 61:82:void (java.util.Map):17:38 -> + 83:83:void (java.util.Map):35:35 -> + 1:1:java.lang.String getContentType():76:76 -> a + 1:13:java.lang.Object getRawData():0:12 -> b + 1:46:java.util.Map getRawData():0:45 -> c + 1:72:byte[] getData():0:71 -> e + 1:82:boolean isEmpty():0:81 -> isEmpty +com.batch.android.post.PostDataProvider -> com.batch.android.s0.h: +# {"id":"sourceFile","fileName":"PostDataProvider.java"} + java.lang.String getContentType() -> a + java.lang.Object getRawData() -> b + byte[] getData() -> e + boolean isEmpty() -> isEmpty +com.batch.android.profile.ProfileDataHelper -> com.batch.android.t0.a: +# {"id":"sourceFile","fileName":"ProfileDataHelper.java"} + int CUSTOM_USER_ID_MAX_LENGTH -> a + int EMAIL_MAX_LENGTH -> b + java.util.regex.Pattern EMAIL_KEY_PATTERN -> c + java.util.regex.Pattern ATTR_KEY_PATTERN -> d + int ATTR_STRING_MAX_LENGTH -> e + int ATTR_STRING_ARRAY_MAX_SIZE -> f + int ATTR_URL_MAX_LENGTH -> g + 1:6:void ():27:32 -> + 1:13:void ():0:12 -> + 1:173:void assertNotNull(java.lang.Object):0:172 -> a + 174:230:boolean isNotValidCustomUserID(java.lang.String):0:56 -> a + 231:361:boolean isNotValidStringArray(java.util.List):0:130 -> a + 362:478:boolean isNotValidURIValue(java.net.URI):0:116 -> a + 1:67:boolean isNotValidEmail(java.lang.String):0:66 -> b + 68:174:boolean isURITooLong(java.net.URI):0:106 -> b + 1:77:boolean isNotValidLanguage(java.lang.String):0:76 -> c + 1:87:boolean isNotValidRegion(java.lang.String):0:86 -> d + 1:97:boolean isNotValidStringValue(java.lang.String):0:96 -> e + 1:149:java.lang.String normalizeAttributeKey(java.lang.String):0:148 -> f + 150:150:java.lang.String normalizeAttributeKey(java.lang.String):146:146 -> f + 1:162:java.lang.String normalizeTagValue(java.lang.String):0:161 -> g + 163:163:java.lang.String normalizeTagValue(java.lang.String):159:159 -> g +com.batch.android.profile.ProfileDataHelper$1 -> com.batch.android.t0.a$a: +# {"id":"sourceFile","fileName":"ProfileDataHelper.java"} + int[] $SwitchMap$com$batch$android$profile$ProfileDataHelper$AttributeValidationException$Type -> a + 1:1:void ():194:194 -> +com.batch.android.profile.ProfileDataHelper$AttributeValidationException -> com.batch.android.t0.a$b: +# {"id":"sourceFile","fileName":"ProfileDataHelper.java"} + com.batch.android.profile.ProfileDataHelper$AttributeValidationException$Type errorType -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/t0/a$b$a;"} + 1:191:void (com.batch.android.profile.ProfileDataHelper$AttributeValidationException$Type):0:190 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/t0/a$b$a;)V"} + 1:9:void printErrorMessage(java.lang.String,java.lang.String):194:202 -> a + 10:10:void printErrorMessage(java.lang.String,java.lang.String):196:196 -> a +com.batch.android.profile.ProfileDataHelper$AttributeValidationException$Type -> com.batch.android.t0.a$b$a: +# {"id":"sourceFile","fileName":"ProfileDataHelper.java"} + com.batch.android.profile.ProfileDataHelper$AttributeValidationException$Type INVALID_KEY -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/t0/a$b$a;"} + com.batch.android.profile.ProfileDataHelper$AttributeValidationException$Type INVALID_STRING_ITEM -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/t0/a$b$a;"} + com.batch.android.profile.ProfileDataHelper$AttributeValidationException$Type NULL_VALUE -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/t0/a$b$a;"} + com.batch.android.profile.ProfileDataHelper$AttributeValidationException$Type[] $VALUES -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/t0/a$b$a;"} + 1:3:void ():182:184 -> + 4:4:void ():181:181 -> + 1:182:void (java.lang.String,int):0:181 -> + 1:182:com.batch.android.profile.ProfileDataHelper$AttributeValidationException$Type[] $values():0:181 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/t0/a$b$a;"} + 1:1:com.batch.android.profile.ProfileDataHelper$AttributeValidationException$Type valueOf(java.lang.String):181:181 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/t0/a$b$a;"} + 1:1:com.batch.android.profile.ProfileDataHelper$AttributeValidationException$Type[] values():181:181 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/t0/a$b$a;"} +com.batch.android.profile.ProfileDataSerializer -> com.batch.android.t0.b: +# {"id":"sourceFile","fileName":"ProfileDataSerializer.java"} + java.lang.String EMAIL_KEY -> a + java.lang.String EMAIL_MARKETING -> b + java.lang.String LANGUAGE_KEY -> c + java.lang.String REGION_KEY -> d + java.lang.String CUSTOM_ATTRIBUTES_KEY -> e + 1:13:void ():0:12 -> + 1:66:com.batch.android.json.JSONObject serialize(com.batch.android.profile.ProfileUpdateOperation):0:65 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/t0/e;)Lcom/batch/android/json/JSONObject;"} + 67:67:com.batch.android.json.JSONObject serialize(com.batch.android.profile.ProfileUpdateOperation):64:64 -> a + 68:77:com.batch.android.json.JSONObject serialize(com.batch.android.profile.ProfileUpdateOperation):62:71 -> a + 78:84:com.batch.android.json.JSONObject serialize(com.batch.android.profile.ProfileUpdateOperation):69:75 -> a + 85:182:com.batch.android.json.JSONObject serializePartialUpdateAttribute(com.batch.android.profile.ProfilePartialUpdateAttribute):0:97 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/t0/d;)Lcom/batch/android/json/JSONObject;"} +com.batch.android.profile.ProfileDeletableAttribute -> com.batch.android.t0.c: +# {"id":"sourceFile","fileName":"ProfileDeletableAttribute.java"} + java.lang.String value -> a + boolean shouldDelete -> b + 1:30:void (java.lang.String):0:29 -> + 1:49:java.lang.Object getSerializedValue():0:48 -> a + 1:39:java.lang.String getValue():0:38 -> b +com.batch.android.profile.ProfilePartialUpdateAttribute -> com.batch.android.t0.d: +# {"id":"sourceFile","fileName":"ProfilePartialUpdateAttribute.java"} + java.util.List added -> a + java.util.List removed -> b + 1:18:void (java.util.List):0:17 -> + 19:41:void (java.util.List,java.util.List):0:22 -> + 1:28:java.util.List getAdded():0:27 -> a + 29:68:void putInAdded(java.util.List):0:39 -> a + 1:33:java.util.List getRemoved():0:32 -> b + 34:80:void putInRemoved(java.util.List):0:46 -> b + 1:1:java.lang.String toString():52:52 -> toString +com.batch.android.profile.ProfileUpdateOperation -> com.batch.android.t0.e: +# {"id":"sourceFile","fileName":"ProfileUpdateOperation.java"} + com.batch.android.profile.ProfileDeletableAttribute email -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/t0/c;"} + com.batch.android.BatchEmailSubscriptionState emailMarketing -> b + com.batch.android.profile.ProfileDeletableAttribute language -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/t0/c;"} + com.batch.android.profile.ProfileDeletableAttribute region -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/t0/c;"} + java.util.Map customAttributes -> e + 1:46:void ():0:45 -> + 1:132:void addAttribute(java.lang.String,com.batch.android.user.UserAttribute):0:131 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Lcom/batch/android/c1/d;)V"} + 133:299:void addToList(java.lang.String,java.util.List):0:166 -> a + 300:422:java.util.Map getCustomAttributes():0:122 -> a + 423:598:void removeAttribute(java.lang.String):0:175 -> a + 599:678:void setEmailMarketing(com.batch.android.BatchEmailSubscriptionState):0:79 -> a + 1:55:com.batch.android.profile.ProfileDeletableAttribute getEmail():0:54 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/t0/c;"} + 56:270:void removeFromList(java.lang.String,java.util.List):0:214 -> b + 271:333:void setEmail(java.lang.String):0:62 -> b + 1:72:com.batch.android.BatchEmailSubscriptionState getEmailMarketing():0:71 -> c + 73:169:void setLanguage(java.lang.String):0:96 -> c + 1:89:com.batch.android.profile.ProfileDeletableAttribute getLanguage():0:88 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/t0/c;"} + 90:203:void setRegion(java.lang.String):0:113 -> d + 1:106:com.batch.android.profile.ProfileDeletableAttribute getRegion():0:105 -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/t0/c;"} +com.batch.android.push.FCMAbstractRegistrationProvider -> com.batch.android.u0.a: +# {"id":"sourceFile","fileName":"FCMAbstractRegistrationProvider.java"} + java.lang.String senderID -> a + java.lang.String fcmProjectID -> b + 1:17:void ():0:16 -> + 18:22:void ():13:17 -> + 1:1:boolean isFirebaseCorePresent():84:84 -> a + 1:1:boolean isFirebaseMessagingPresent():94:94 -> b + 1:18:void loadProjectInformation():22:39 -> c + 1:77:void checkLibraryAvailability():0:76 -> checkLibraryAvailability + 78:78:void checkLibraryAvailability():70:70 -> checkLibraryAvailability + 79:79:void checkLibraryAvailability():64:64 -> checkLibraryAvailability + 1:1:void checkServiceAvailability():0:0 -> checkServiceAvailability + 1:52:java.lang.String getGCPProjectID():0:51 -> getGCPProjectID + 1:46:java.lang.String getSenderID():0:45 -> getSenderID +com.batch.android.push.FCMTokenRegistrationProvider -> com.batch.android.u0.b: +# {"id":"sourceFile","fileName":"FCMTokenRegistrationProvider.java"} + 1:15:void ():0:14 -> + 1:39:java.lang.String getRegistration():0:38 -> getRegistration + 1:1:java.lang.String getShortname():19:19 -> getShortname +com.batch.android.push.PushRegistrationDiscoveryService -> com.batch.android.push.PushRegistrationDiscoveryService: +# {"id":"sourceFile","fileName":"PushRegistrationDiscoveryService.java"} + 1:1:void ():11:11 -> +com.batch.android.push.PushRegistrationProviderFactory -> com.batch.android.u0.c: +# {"id":"sourceFile","fileName":"PushRegistrationProviderFactory.java"} + android.content.Context context -> a + java.lang.String TAG -> b + java.lang.String COMPONENT_SENTINEL_VALUE -> c + java.lang.String COMPONENT_KEY_PREFIX -> d + 1:29:void (android.content.Context):0:28 -> + 1:103:com.batch.android.PushRegistrationProvider getExternalPushRegistrationProvider():0:102 -> a + 104:124:com.batch.android.PushRegistrationProvider getExternalPushRegistrationProvider():100:120 -> a + 125:141:com.batch.android.PushRegistrationProvider getExternalPushRegistrationProvider():115:131 -> a + 142:153:com.batch.android.PushRegistrationProvider getExternalPushRegistrationProvider():128:139 -> a + 154:162:com.batch.android.PushRegistrationProvider getExternalPushRegistrationProvider():136:144 -> a + 163:163:boolean isExternalProviderAllowed(java.lang.String):158:158 -> a + 1:60:com.batch.android.PushRegistrationProvider getRegistrationProvider():0:59 -> b + 1:5:boolean isFCMTokenApiAvailable():74:78 -> c +com.batch.android.push.PushRegistrationRegistrar -> com.batch.android.push.PushRegistrationRegistrar: +# {"id":"sourceFile","fileName":"PushRegistrationRegistrar.java"} + com.batch.android.PushRegistrationProvider getPushRegistrationProvider(android.content.Context) -> a +com.batch.android.push.formats.APENFormat -> com.batch.android.v0.a: +# {"id":"sourceFile","fileName":"APENFormat.java"} + com.batch.android.push.formats.APENFormat$LayoutType layoutType -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/v0/a$a;"} + java.lang.String LAYOUT_TYPE_KEY -> f + 1:90:void (java.lang.String,java.lang.String,android.graphics.Bitmap,android.graphics.Bitmap):0:89 -> + 91:91:void (java.lang.String,java.lang.String,android.graphics.Bitmap,android.graphics.Bitmap):81:81 -> + 1:153:void applyArguments(com.batch.android.json.JSONObject):0:152 -> a + 154:154:void applyArguments(com.batch.android.json.JSONObject):148:148 -> a + 155:155:void applyArguments(com.batch.android.json.JSONObject):145:145 -> a + 156:156:void applyArguments(com.batch.android.json.JSONObject):142:142 -> a + 157:157:void applyExtraBuilderConfiguration(androidx.core.app.NotificationCompat$Builder):0:0 -> a + 158:259:android.widget.RemoteViews generateCollapsedView(java.lang.String):0:101 -> a + 260:260:androidx.core.app.NotificationCompat$Style getSupportNotificationStyle():134:134 -> a + 1:129:android.widget.RemoteViews generateExpandedView(java.lang.String):0:128 -> b + 130:292:com.batch.android.push.formats.APENFormat$LayoutType getLayoutType():0:162 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/v0/a$a;"} +com.batch.android.push.formats.APENFormat$LayoutType -> com.batch.android.v0.a$a: +# {"id":"sourceFile","fileName":"APENFormat.java"} + int imageScaleType -> a + boolean forceLayoutHeight -> b + com.batch.android.push.formats.APENFormat$LayoutType CENTER_CROP_MP -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/v0/a$a;"} + com.batch.android.push.formats.APENFormat$LayoutType CENTER_CROP_200 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/v0/a$a;"} + com.batch.android.push.formats.APENFormat$LayoutType FIT_CENTER_MP -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/v0/a$a;"} + com.batch.android.push.formats.APENFormat$LayoutType FIT_CENTER_200 -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/v0/a$a;"} + com.batch.android.push.formats.APENFormat$LayoutType[] $VALUES -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/v0/a$a;"} + 1:15:void ():30:44 -> + 16:16:void ():26:26 -> + 1:59:void (java.lang.String,int,int,boolean):0:58 -> + 1:27:com.batch.android.push.formats.APENFormat$LayoutType[] $values():0:26 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/v0/a$a;"} + 1:75:boolean shouldFitCenter():0:74 -> b + 1:67:boolean shouldForceLayoutHeight():0:66 -> c + 1:1:com.batch.android.push.formats.APENFormat$LayoutType valueOf(java.lang.String):26:26 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/v0/a$a;"} + 1:1:com.batch.android.push.formats.APENFormat$LayoutType[] values():26:26 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/v0/a$a;"} +com.batch.android.push.formats.BaseFormat -> com.batch.android.v0.b: +# {"id":"sourceFile","fileName":"BaseFormat.java"} + java.lang.String title -> a + java.lang.String body -> b + android.graphics.Bitmap icon -> c + android.graphics.Bitmap picture -> d + 1:28:void (java.lang.String,java.lang.String,android.graphics.Bitmap,android.graphics.Bitmap):0:27 -> +com.batch.android.push.formats.NotificationFormat -> com.batch.android.v0.c: +# {"id":"sourceFile","fileName":"NotificationFormat.java"} + void applyArguments(com.batch.android.json.JSONObject) -> a + void applyExtraBuilderConfiguration(androidx.core.app.NotificationCompat$Builder) -> a + android.widget.RemoteViews generateCollapsedView(java.lang.String) -> a + androidx.core.app.NotificationCompat$Style getSupportNotificationStyle() -> a + android.widget.RemoteViews generateExpandedView(java.lang.String) -> b +com.batch.android.push.formats.SystemFormat -> com.batch.android.v0.d: +# {"id":"sourceFile","fileName":"SystemFormat.java"} + boolean useLegacyBigPictureIconBehaviour -> e + 1:26:void (java.lang.String,java.lang.String,android.graphics.Bitmap,android.graphics.Bitmap,boolean):0:25 -> + 1:1:void applyArguments(com.batch.android.json.JSONObject):0:0 -> a + 2:79:void applyExtraBuilderConfiguration(androidx.core.app.NotificationCompat$Builder):0:77 -> a + 80:80:android.widget.RemoteViews generateCollapsedView(java.lang.String):0:0 -> a + 81:140:androidx.core.app.NotificationCompat$Style getSupportNotificationStyle():0:59 -> a + 1:1:android.widget.RemoteViews generateExpandedView(java.lang.String):0:0 -> b +com.batch.android.query.AttributesCheckQuery -> com.batch.android.w0.a: +# {"id":"sourceFile","fileName":"AttributesCheckQuery.java"} + long version -> d + java.lang.String transactionID -> e + 1:37:void (android.content.Context,long,java.lang.String):0:36 -> + 38:38:void (android.content.Context,long,java.lang.String):32:32 -> + 39:39:void (android.content.Context,long,java.lang.String):28:28 -> + 1:47:com.batch.android.json.JSONObject toJSON():0:46 -> e +com.batch.android.query.AttributesSendQuery -> com.batch.android.w0.b: +# {"id":"sourceFile","fileName":"AttributesSendQuery.java"} + long version -> d + java.util.Map attributes -> e + java.util.Map tags -> f + 1:54:void (android.content.Context,long,java.util.Map,java.util.Map):0:53 -> + 55:55:void (android.content.Context,long,java.util.Map,java.util.Map):48:48 -> + 56:56:void (android.content.Context,long,java.util.Map,java.util.Map):44:44 -> + 57:57:void (android.content.Context,long,java.util.Map,java.util.Map):40:40 -> + 1:65:com.batch.android.json.JSONObject toJSON():0:64 -> e +com.batch.android.query.LocalCampaignsQuery -> com.batch.android.w0.c: +# {"id":"sourceFile","fileName":"LocalCampaignsQuery.java"} + java.util.Map capping -> d + java.lang.String TAG -> e + 1:31:void (com.batch.android.localcampaigns.CampaignManager,android.content.Context):0:30 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/r/a;Landroid/content/Context;)V"} + 32:48:void (com.batch.android.localcampaigns.CampaignManager,android.content.Context):27:43 -> + 1:57:com.batch.android.json.JSONObject toJSON():0:56 -> e +com.batch.android.query.PushQuery -> com.batch.android.w0.d: +# {"id":"sourceFile","fileName":"PushQuery.java"} + com.batch.android.BatchPushRegistration registration -> d + 1:30:void (android.content.Context,com.batch.android.BatchPushRegistration):0:29 -> + 31:31:void (android.content.Context,com.batch.android.BatchPushRegistration):26:26 -> + 1:43:com.batch.android.json.JSONObject toJSON():0:42 -> e + 44:48:com.batch.android.json.JSONObject toJSON():40:44 -> e + 1:59:int getNotificationType():0:58 -> f + 60:60:int getNotificationType():56:56 -> f +com.batch.android.query.Query -> com.batch.android.w0.e: +# {"id":"sourceFile","fileName":"Query.java"} + android.content.Context context -> a + java.lang.String id -> b + com.batch.android.query.QueryType type -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/w0/f;"} + 1:45:void (android.content.Context,com.batch.android.query.QueryType):0:44 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/content/Context;Lcom/batch/android/w0/f;)V"} + 46:46:void (android.content.Context,com.batch.android.query.QueryType):39:39 -> + 47:47:void (android.content.Context,com.batch.android.query.QueryType):35:35 -> + 1:1:java.lang.String generateID():102:102 -> a + 1:74:android.content.Context getContext():0:73 -> b + 1:56:java.lang.String getID():0:55 -> c + 1:65:com.batch.android.query.QueryType getType():0:64 -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/w0/f;"} + 1:4:com.batch.android.json.JSONObject toJSON():86:89 -> e +com.batch.android.query.QueryType -> com.batch.android.w0.f: +# {"id":"sourceFile","fileName":"QueryType.java"} + com.batch.android.query.QueryType START -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/w0/f;"} + com.batch.android.query.QueryType TRACKING -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/w0/f;"} + com.batch.android.query.QueryType PUSH -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/w0/f;"} + com.batch.android.query.QueryType ATTRIBUTES -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/w0/f;"} + com.batch.android.query.QueryType ATTRIBUTES_CHECK -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/w0/f;"} + com.batch.android.query.QueryType LOCAL_CAMPAIGNS -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/w0/f;"} + com.batch.android.query.QueryType[] $VALUES -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/w0/f;"} + 1:21:void ():11:31 -> + 22:22:void ():7:7 -> + 1:8:void (java.lang.String,int):0:7 -> + 1:8:com.batch.android.query.QueryType[] $values():0:7 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/w0/f;"} + 1:1:com.batch.android.query.QueryType valueOf(java.lang.String):7:7 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/w0/f;"} + 1:1:com.batch.android.query.QueryType[] values():7:7 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/w0/f;"} +com.batch.android.query.StartQuery -> com.batch.android.w0.g: +# {"id":"sourceFile","fileName":"StartQuery.java"} + boolean userActivity -> d + boolean fromPush -> e + java.lang.String pushId -> f + 1:37:void (android.content.Context,boolean,java.lang.String,boolean):0:36 -> + 1:50:com.batch.android.json.JSONObject toJSON():0:49 -> e +com.batch.android.query.TrackingQuery -> com.batch.android.w0.h: +# {"id":"sourceFile","fileName":"TrackingQuery.java"} + java.util.List events -> d + 1:37:void (android.content.Context,java.util.List):0:36 -> + 38:38:void (android.content.Context,java.util.List):33:33 -> + 1:89:com.batch.android.json.JSONObject toJSON():0:88 -> e +com.batch.android.query.response.AttributesCheckResponse -> com.batch.android.x0.a: +# {"id":"sourceFile","fileName":"AttributesCheckResponse.java"} + java.lang.String actionString -> c + long version -> d + java.lang.Long time -> e + java.lang.String projectKey -> f + 1:22:void (java.lang.String):0:21 -> + 23:25:void (java.lang.String):14:16 -> + 1:57:void setActionString(java.lang.String):0:56 -> a + 58:130:void setTime(java.lang.Long):0:72 -> a + 131:195:void setVersion(long):0:64 -> a + 1:77:void setProjectKey(java.lang.String):0:76 -> b + 1:40:com.batch.android.query.response.AttributesCheckResponse$Action getAction():0:39 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/x0/a$a;"} + 1:45:java.lang.String getProjectKey():0:44 -> d + 1:69:java.lang.Long getTime():0:68 -> e + 1:61:long getVersion():0:60 -> f +com.batch.android.query.response.AttributesCheckResponse$Action -> com.batch.android.x0.a$a: +# {"id":"sourceFile","fileName":"AttributesCheckResponse.java"} + com.batch.android.query.response.AttributesCheckResponse$Action OK -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/x0/a$a;"} + com.batch.android.query.response.AttributesCheckResponse$Action BUMP -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/x0/a$a;"} + com.batch.android.query.response.AttributesCheckResponse$Action RECHECK -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/x0/a$a;"} + com.batch.android.query.response.AttributesCheckResponse$Action RESEND -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/x0/a$a;"} + com.batch.android.query.response.AttributesCheckResponse$Action UNKNOWN -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/x0/a$a;"} + com.batch.android.query.response.AttributesCheckResponse$Action[] $VALUES -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/x0/a$a;"} + 1:5:void ():48:52 -> + 6:6:void ():47:47 -> + 1:48:void (java.lang.String,int):0:47 -> + 1:48:com.batch.android.query.response.AttributesCheckResponse$Action[] $values():0:47 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/x0/a$a;"} + 1:1:com.batch.android.query.response.AttributesCheckResponse$Action valueOf(java.lang.String):47:47 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/x0/a$a;"} + 1:1:com.batch.android.query.response.AttributesCheckResponse$Action[] values():47:47 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/x0/a$a;"} +com.batch.android.query.response.AttributesSendResponse -> com.batch.android.x0.b: +# {"id":"sourceFile","fileName":"AttributesSendResponse.java"} + java.lang.String transactionID -> c + long version -> d + java.lang.String projectKey -> e + 1:19:void (java.lang.String):0:18 -> + 20:20:void (java.lang.String):13:13 -> + 1:43:void setProjectKey(java.lang.String):0:42 -> a + 44:70:void setVersion(long):0:26 -> a + 1:23:void setTransactionID(java.lang.String):0:22 -> b + 1:39:java.lang.String getProjectKey():0:38 -> c + 1:31:java.lang.String getTransactionID():0:30 -> d + 1:35:long getVersion():0:34 -> e +com.batch.android.query.response.LocalCampaignsResponse -> com.batch.android.x0.c: +# {"id":"sourceFile","fileName":"LocalCampaignsResponse.java"} + com.batch.android.query.response.LocalCampaignsResponse$Error error -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/x0/c$a;"} + java.util.List campaigns -> d + java.lang.Long minDisplayInterval -> e + com.batch.android.query.response.LocalCampaignsResponse$GlobalCappings cappings -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/x0/c$b;"} + java.lang.String TAG -> g + 1:41:void (java.lang.String):0:40 -> + 1:73:void setCampaigns(java.util.List):0:72 -> a + 74:171:void setCappings(com.batch.android.query.response.LocalCampaignsResponse$GlobalCappings):0:97 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/x0/c$b;)V"} + 172:256:void setError(com.batch.android.query.response.LocalCampaignsResponse$Error):0:84 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/x0/c$a;)V"} + 257:333:void setMinDisplayInterval(java.lang.Long):0:76 -> a + 1:50:java.util.List getCampaigns():0:49 -> c + 1:61:java.util.List getCampaignsToSave():0:60 -> d + 1:94:com.batch.android.query.response.LocalCampaignsResponse$GlobalCappings getCappings():0:93 -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/x0/c$b;"} + 1:81:com.batch.android.query.response.LocalCampaignsResponse$Error getError():0:80 -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/x0/c$a;"} + 1:69:java.lang.Long getMinDisplayInterval():0:68 -> g + 1:45:boolean hasCampaigns():0:44 -> h + 1:102:boolean hasCappings():0:101 -> i + 1:89:boolean hasError():0:88 -> j +com.batch.android.query.response.LocalCampaignsResponse$Error -> com.batch.android.x0.c$a: +# {"id":"sourceFile","fileName":"LocalCampaignsResponse.java"} + int code -> a + java.lang.String message -> b + 1:168:void ():0:167 -> + 1:181:int getCode():0:180 -> a + 182:366:void setCode(int):0:184 -> a + 367:559:void setMessage(java.lang.String):0:192 -> a + 1:189:java.lang.String getMessage():0:188 -> b + 1:1:java.lang.String toString():198:198 -> toString +com.batch.android.query.response.LocalCampaignsResponse$GlobalCappings -> com.batch.android.x0.c$b: +# {"id":"sourceFile","fileName":"LocalCampaignsResponse.java"} + java.lang.Integer session -> a + java.util.List timeBasedCappings -> b + 1:154:void (java.lang.Integer,java.util.List):0:153 -> + 1:159:java.lang.Integer getSession():0:158 -> a + 1:164:java.util.List getTimeBasedCappings():0:163 -> b +com.batch.android.query.response.LocalCampaignsResponse$GlobalCappings$TimeBasedCapping -> com.batch.android.x0.c$b$a: +# {"id":"sourceFile","fileName":"LocalCampaignsResponse.java"} + java.lang.Integer views -> a + java.lang.Integer duration -> b + 1:128:void (java.lang.Integer,java.lang.Integer):0:127 -> + 1:138:java.lang.Integer getDuration():0:137 -> a + 1:133:java.lang.Integer getViews():0:132 -> b +com.batch.android.query.response.PushResponse -> com.batch.android.x0.d: +# {"id":"sourceFile","fileName":"PushResponse.java"} + 1:16:void (java.lang.String):0:15 -> +com.batch.android.query.response.Response -> com.batch.android.x0.e: +# {"id":"sourceFile","fileName":"Response.java"} + java.lang.String queryID -> a + com.batch.android.query.QueryType queryType -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/w0/f;"} + 1:34:void (com.batch.android.query.QueryType,java.lang.String):0:33 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/w0/f;Ljava/lang/String;)V"} + 35:35:void (com.batch.android.query.QueryType,java.lang.String):29:29 -> + 36:36:void (com.batch.android.query.QueryType,java.lang.String):25:25 -> + 1:43:java.lang.String getQueryID():0:42 -> a + 1:52:com.batch.android.query.QueryType getQueryType():0:51 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/w0/f;"} +com.batch.android.query.response.StartResponse -> com.batch.android.x0.f: +# {"id":"sourceFile","fileName":"StartResponse.java"} + 1:16:void (java.lang.String):0:15 -> +com.batch.android.query.response.TrackingResponse -> com.batch.android.x0.g: +# {"id":"sourceFile","fileName":"TrackingResponse.java"} + 1:16:void (java.lang.String):0:15 -> +com.batch.android.query.serialization.deserializers.AttributesCheckResponseDeserializer -> com.batch.android.y0.a: +# {"id":"sourceFile","fileName":"AttributesCheckResponseDeserializer.java"} + 1:19:void (com.batch.android.json.JSONObject):0:18 -> + 1:11:com.batch.android.query.response.Response deserialize():0:10 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/x0/e;"} + 1:43:com.batch.android.query.response.AttributesCheckResponse deserialize():0:42 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/x0/a;"} +com.batch.android.query.serialization.deserializers.AttributesSendResponseDeserializer -> com.batch.android.y0.b: +# {"id":"sourceFile","fileName":"AttributesSendResponseDeserializer.java"} + 1:19:void (com.batch.android.json.JSONObject):0:18 -> + 1:11:com.batch.android.query.response.Response deserialize():0:10 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/x0/e;"} + 1:40:com.batch.android.query.response.AttributesSendResponse deserialize():0:39 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/x0/b;"} +com.batch.android.query.serialization.deserializers.LocalCampaignsResponseDeserializer -> com.batch.android.y0.c: +# {"id":"sourceFile","fileName":"LocalCampaignsResponseDeserializer.java"} + com.batch.android.localcampaigns.serialization.LocalCampaignDeserializer localCampaignDeserializer -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/v/a;"} + java.lang.String TAG -> c + 1:34:void (com.batch.android.json.JSONObject):0:33 -> + 35:35:void (com.batch.android.json.JSONObject):25:25 -> + 1:19:com.batch.android.query.response.Response deserialize():0:18 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/x0/e;"} + 20:37:java.util.List parseTimeBasedCappings(com.batch.android.json.JSONArray):109:126 -> a + 1:63:com.batch.android.query.response.LocalCampaignsResponse deserialize():0:62 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/x0/c;"} + 64:64:com.batch.android.query.response.LocalCampaignsResponse deserialize():45:45 -> c + 1:75:java.util.List deserializeCampaigns():0:74 -> d + 1:97:com.batch.android.query.response.LocalCampaignsResponse$GlobalCappings deserializeCappings():0:96 -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/x0/c$b;"} + 1:146:com.batch.android.query.response.LocalCampaignsResponse$Error parseError():0:145 -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/x0/c$a;"} +com.batch.android.query.serialization.deserializers.PushResponseDeserializer -> com.batch.android.y0.d: +# {"id":"sourceFile","fileName":"PushResponseDeserializer.java"} + 1:19:void (com.batch.android.json.JSONObject):0:18 -> + 1:11:com.batch.android.query.response.Response deserialize():0:10 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/x0/e;"} + 1:1:com.batch.android.query.response.PushResponse deserialize():29:29 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/x0/d;"} +com.batch.android.query.serialization.deserializers.ResponseDeserializer -> com.batch.android.y0.e: +# {"id":"sourceFile","fileName":"ResponseDeserializer.java"} + com.batch.android.json.JSONObject json -> a + 1:24:void (com.batch.android.json.JSONObject):0:23 -> + com.batch.android.query.response.Response deserialize() -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/x0/e;"} + 1:34:java.lang.String getId():0:33 -> b +com.batch.android.query.serialization.deserializers.StartResponseDeserializer -> com.batch.android.y0.f: +# {"id":"sourceFile","fileName":"StartResponseDeserializer.java"} + 1:19:void (com.batch.android.json.JSONObject):0:18 -> + 1:11:com.batch.android.query.response.Response deserialize():0:10 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/x0/e;"} + 1:1:com.batch.android.query.response.StartResponse deserialize():29:29 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/x0/f;"} +com.batch.android.query.serialization.deserializers.TrackingResponseDeserializer -> com.batch.android.y0.g: +# {"id":"sourceFile","fileName":"TrackingResponseDeserializer.java"} + 1:19:void (com.batch.android.json.JSONObject):0:18 -> + 1:11:com.batch.android.query.response.Response deserialize():0:10 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/x0/e;"} + 1:1:com.batch.android.query.response.TrackingResponse deserialize():29:29 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/x0/g;"} +com.batch.android.query.serialization.serializers.LocalCampaignsResponseSerializer -> com.batch.android.z0.a: +# {"id":"sourceFile","fileName":"LocalCampaignsResponseSerializer.java"} + com.batch.android.localcampaigns.serialization.LocalCampaignSerializer localCampaignSerializer -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/v/b;"} + 1:22:void ():0:21 -> + 1:45:com.batch.android.json.JSONObject serialize(com.batch.android.query.response.LocalCampaignsResponse):0:44 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/x0/c;)Lcom/batch/android/json/JSONObject;"} + 46:46:com.batch.android.json.JSONObject serialize(com.batch.android.query.response.LocalCampaignsResponse):38:38 -> a + 47:47:com.batch.android.json.JSONObject serialize(com.batch.android.query.response.LocalCampaignsResponse):32:32 -> a + 48:104:com.batch.android.json.JSONArray serializeCampaigns(java.util.List):0:56 -> a + 105:183:com.batch.android.json.JSONObject serializeCappings(com.batch.android.query.response.LocalCampaignsResponse$GlobalCappings):0:78 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/x0/c$b;)Lcom/batch/android/json/JSONObject;"} +com.batch.android.runtime.ChangeStateAction -> com.batch.android.a1.a: +# {"id":"sourceFile","fileName":"ChangeStateAction.java"} + com.batch.android.runtime.State run(com.batch.android.runtime.State,com.batch.android.runtime.Config) -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/a1/g;Lcom/batch/android/a1/b;)Lcom/batch/android/a1/g;"} +com.batch.android.runtime.Config -> com.batch.android.a1.b: +# {"id":"sourceFile","fileName":"Config.java"} + java.lang.String apikey -> a + com.batch.android.LoggerDelegate loggerDelegate -> b + com.batch.android.LoggerLevel loggerLevel -> c + java.lang.Integer migrations -> d + 1:43:void ():0:42 -> + 44:56:void ():24:36 -> + 1:60:void setApikey(java.lang.String):0:59 -> a + 61:143:void setLoggerDelegate(com.batch.android.LoggerDelegate):0:82 -> a + 144:246:void setLoggerLevel(com.batch.android.LoggerLevel):0:102 -> a + 247:367:void setMigrations(java.lang.Integer):0:120 -> a + 368:372:com.batch.android.runtime.Config copy():130:134 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/a1/b;"} + 1:52:java.lang.String getApikey():0:51 -> b + 1:70:com.batch.android.LoggerDelegate getLoggerDelegate():0:69 -> c + 1:93:com.batch.android.LoggerLevel getLoggerLevel():0:92 -> d + 1:113:java.lang.Integer getMigrations():0:112 -> e +com.batch.android.runtime.ConfigAction -> com.batch.android.a1.c: +# {"id":"sourceFile","fileName":"ConfigAction.java"} + void run(com.batch.android.runtime.Config) -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/a1/b;)V"} +com.batch.android.runtime.ForegroundActivityLifecycleListener -> com.batch.android.a1.d: +# {"id":"sourceFile","fileName":"ForegroundActivityLifecycleListener.java"} + java.util.concurrent.atomic.AtomicInteger resumeCount -> a + java.util.concurrent.atomic.AtomicBoolean isPaused -> b + android.os.Handler handler -> c + com.batch.android.runtime.ForegroundActivityLifecycleListener$AppLifecycleListener listener -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/a1/d$a;"} + java.lang.Runnable delayedPauseRunnable -> e + java.lang.String TAG -> f + int TIMEOUT_MS -> g + 1:58:void ():0:57 -> + 1:128:boolean isApplicationInForeground():0:127 -> a + 129:201:void registerAppLifecycleListener(com.batch.android.runtime.ForegroundActivityLifecycleListener$AppLifecycleListener):0:72 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/a1/d$a;)V"} + 1:62:void lambda$new$0():0:61 -> b + 1:1:void onActivityCreated(android.app.Activity,android.os.Bundle):0:0 -> onActivityCreated + 1:1:void onActivityDestroyed(android.app.Activity):0:0 -> onActivityDestroyed + 1:96:void onActivityPaused(android.app.Activity):0:95 -> onActivityPaused + 1:88:void onActivityResumed(android.app.Activity):0:87 -> onActivityResumed + 1:1:void onActivitySaveInstanceState(android.app.Activity,android.os.Bundle):0:0 -> onActivitySaveInstanceState + 1:1:void onActivityStarted(android.app.Activity):0:0 -> onActivityStarted + 1:1:void onActivityStopped(android.app.Activity):0:0 -> onActivityStopped +com.batch.android.runtime.ForegroundActivityLifecycleListener$AppLifecycleListener -> com.batch.android.a1.d$a: +# {"id":"sourceFile","fileName":"ForegroundActivityLifecycleListener.java"} + void onEnterBackground() -> a + void onEnterForeground() -> b +com.batch.android.runtime.RuntimeManager -> com.batch.android.a1.e: +# {"id":"sourceFile","fileName":"RuntimeManager.java"} + android.content.Context context -> a + java.util.concurrent.atomic.AtomicInteger serviceRefCount -> b + java.util.Date lastUserStartDate -> c + android.app.Activity activity -> d + com.batch.android.runtime.ForegroundActivityLifecycleListener foregroundActivityLifecycleListener -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/a1/d;"} + com.batch.android.runtime.SessionManager sessionManager -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/a1/f;"} + java.util.Date stopDate -> g + com.batch.android.runtime.State state -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/a1/g;"} + java.util.concurrent.locks.ReentrantReadWriteLock lock -> i + java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock r -> j + java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock w -> k + com.batch.android.runtime.Config config -> l + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/a1/b;"} + com.batch.android.debug.FindMyInstallationHelper installationIdHelper -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/i/a;"} + java.lang.String TAG -> n + 1:99:void ():0:98 -> + 100:155:void ():37:92 -> + 1:24:com.batch.android.debug.FindMyInstallationHelper access$000(com.batch.android.runtime.RuntimeManager):0:23 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/a1/e;)Lcom/batch/android/i/a;"} + 25:176:boolean changeState(com.batch.android.runtime.ChangeStateAction):0:151 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/a1/a;)Z"} + 177:178:boolean changeState(com.batch.android.runtime.ChangeStateAction):151:151 -> a + 179:179:boolean changeState(com.batch.android.runtime.ChangeStateAction):152:152 -> a + 180:357:boolean changeStateIf(com.batch.android.runtime.State,com.batch.android.runtime.ChangeStateAction):0:177 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/a1/g;Lcom/batch/android/a1/a;)Z"} + 358:366:boolean changeStateIf(com.batch.android.runtime.State,com.batch.android.runtime.ChangeStateAction):169:177 -> a + 367:368:boolean changeStateIf(com.batch.android.runtime.State,com.batch.android.runtime.ChangeStateAction):177:177 -> a + 369:369:boolean changeStateIf(com.batch.android.runtime.State,com.batch.android.runtime.ChangeStateAction):178:178 -> a + 370:677:void decrementServiceRefCount():0:307 -> a + 678:790:void readConfig(com.batch.android.runtime.ConfigAction):0:112 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/a1/c;)V"} + 791:792:void readConfig(com.batch.android.runtime.ConfigAction):112:113 -> a + 793:1207:void registerActivityListenerIfNeeded(android.app.Application):0:414 -> a + 1208:1650:void registerSessionManagerIfNeeded(android.app.Application,boolean):0:442 -> a + 1651:1842:void run(com.batch.android.runtime.StateAction):0:191 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/a1/h;)V"} + 1843:1844:void run(com.batch.android.runtime.StateAction):191:192 -> a + 1845:2055:void runIf(com.batch.android.runtime.State,com.batch.android.runtime.StateAction):0:210 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/a1/g;Lcom/batch/android/a1/h;)V"} + 2056:2058:void runIf(com.batch.android.runtime.State,com.batch.android.runtime.StateAction):208:210 -> a + 2059:2060:void runIf(com.batch.android.runtime.State,com.batch.android.runtime.StateAction):210:211 -> a + 2061:2303:boolean runIf(com.batch.android.runtime.State,java.lang.Runnable):0:242 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/a1/g;Ljava/lang/Runnable;)Z"} + 2304:2308:boolean runIf(com.batch.android.runtime.State,java.lang.Runnable):238:242 -> a + 2309:2310:boolean runIf(com.batch.android.runtime.State,java.lang.Runnable):242:243 -> a + 2311:2532:boolean runIfReady(java.lang.Runnable):0:221 -> a + 2533:2817:void setActivity(android.app.Activity):0:284 -> a + 2818:3203:void setContext(android.content.Context):0:385 -> a + 1:294:android.app.Activity getActivity():0:293 -> b + 295:425:void updateConfig(com.batch.android.runtime.ConfigAction):0:130 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/a1/c;)V"} + 426:428:void updateConfig(com.batch.android.runtime.ConfigAction):128:130 -> b + 429:430:void updateConfig(com.batch.android.runtime.ConfigAction):130:131 -> b + 1:396:android.content.Context getContext():0:395 -> c + 1:372:java.util.Date getLastUserStartDate():0:371 -> d + 1:458:java.lang.String getSessionIdentifier():0:457 -> e + 1:462:com.batch.android.runtime.SessionManager getSessionManager():0:461 -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/a1/f;"} + 1:301:void incrementServiceRefCount():0:300 -> g + 1:424:boolean isApplicationInForeground():0:423 -> h + 1:323:boolean isReady():0:322 -> i + 1:344:boolean isRetainedByService():0:343 -> j + 1:259:java.lang.Long onStart():0:258 -> k + 260:261:java.lang.Long onStart():258:259 -> k + 1:273:void onStopWithoutFinishing():0:272 -> l + 1:316:void resetServiceRefCount():0:315 -> m + 1:363:void updateLastUserStartDate():0:362 -> n +com.batch.android.runtime.RuntimeManager$1 -> com.batch.android.a1.e$a: +# {"id":"sourceFile","fileName":"RuntimeManager.java"} + com.batch.android.runtime.RuntimeManager this$0 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/a1/e;"} + 1:405:void (com.batch.android.runtime.RuntimeManager):0:404 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/a1/e;)V"} + 1:1:void onEnterBackground():0:0 -> a + 1:408:void onEnterForeground():0:407 -> b +com.batch.android.runtime.SessionManager -> com.batch.android.a1.f: +# {"id":"sourceFile","fileName":"SessionManager.java"} + java.util.concurrent.atomic.AtomicInteger createCount -> a + java.lang.Long backgroundSessionExpirationUptime -> b + boolean sessionActive -> c + java.lang.String sessionIdentifier -> d + java.lang.String INTENT_NEW_SESSION -> e + java.lang.String TAG -> f + int BACKGROUNDED_SESSION_EXPIRATION_SEC -> g + 1:54:void ():0:53 -> + 1:111:boolean areAllActivitiesDestroyed():0:110 -> a + 112:199:void startNewSessionIfNeeded(android.content.Context):0:87 -> a + 1:62:java.lang.String getSessionIdentifier():0:61 -> b + 1:1:long getUptime():125:125 -> c + 1:72:void invalidateSessionIfNeeded():0:71 -> d + 1:149:void onActivityCreated(android.app.Activity,android.os.Bundle):0:148 -> onActivityCreated + 1:182:void onActivityDestroyed(android.app.Activity):0:181 -> onActivityDestroyed + 1:1:void onActivityPaused(android.app.Activity):0:0 -> onActivityPaused + 1:161:void onActivityResumed(android.app.Activity):0:160 -> onActivityResumed + 1:1:void onActivitySaveInstanceState(android.app.Activity,android.os.Bundle):0:0 -> onActivitySaveInstanceState + 1:1:void onActivityStarted(android.app.Activity):0:0 -> onActivityStarted + 1:1:void onActivityStopped(android.app.Activity):0:0 -> onActivityStopped + 1:1:void onConfigurationChanged(android.content.res.Configuration):0:0 -> onConfigurationChanged + 1:141:void onLowMemory():0:140 -> onLowMemory + 1:132:void onTrimMemory(int):0:131 -> onTrimMemory +com.batch.android.runtime.State -> com.batch.android.a1.g: +# {"id":"sourceFile","fileName":"State.java"} + com.batch.android.runtime.State OFF -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/a1/g;"} + com.batch.android.runtime.State READY -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/a1/g;"} + com.batch.android.runtime.State FINISHING -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/a1/g;"} + com.batch.android.runtime.State[] $VALUES -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/a1/g;"} + 1:11:void ():11:21 -> + 12:12:void ():7:7 -> + 1:8:void (java.lang.String,int):0:7 -> + 1:8:com.batch.android.runtime.State[] $values():0:7 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/a1/g;"} + 1:1:com.batch.android.runtime.State valueOf(java.lang.String):7:7 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/a1/g;"} + 1:1:com.batch.android.runtime.State[] values():7:7 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/a1/g;"} +com.batch.android.runtime.StateAction -> com.batch.android.a1.h: +# {"id":"sourceFile","fileName":"StateAction.java"} + void run(com.batch.android.runtime.State) -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/a1/g;)V"} +com.batch.android.tracker.TrackerDatabaseHelper -> com.batch.android.b1.a: +# {"id":"sourceFile","fileName":"TrackerDatabaseHelper.java"} + java.lang.String TABLE_EVENTS -> a + java.lang.String COLUMN_DB_ID -> b + java.lang.String COLUMN_ID -> c + java.lang.String COLUMN_NAME -> d + java.lang.String COLUMN_DATE -> e + java.lang.String COLUMN_TIMEZONE -> f + java.lang.String COLUMN_PARAMETERS -> g + java.lang.String COLUMN_STATE -> h + java.lang.String COLUMN_SERVER_TIME -> i + java.lang.String COLUMN_SECURE_DATE -> j + java.lang.String COLUMN_SESSION_ID -> k + java.lang.String DATABASE_NAME -> l + int DATABASE_VERSION -> m + 1:34:void (android.content.Context):0:33 -> + 1:39:void onCreate(android.database.sqlite.SQLiteDatabase):0:38 -> onCreate + 1:72:void onUpgrade(android.database.sqlite.SQLiteDatabase,int,int):0:71 -> onUpgrade +com.batch.android.tracker.TrackerDatasource -> com.batch.android.b1.b: +# {"id":"sourceFile","fileName":"TrackerDatasource.java"} + android.content.Context context -> a + android.database.sqlite.SQLiteDatabase database -> b + com.batch.android.tracker.TrackerDatabaseHelper databaseHelper -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/b1/a;"} + java.lang.String TAG -> d + 1:50:void (android.content.Context):0:49 -> + 51:51:void (android.content.Context):44:44 -> + 1:95:boolean addEvent(com.batch.android.event.Event):0:94 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o/b;)Z"} + 96:177:void clearDB():0:81 -> a + 178:460:int deleteEvents(java.lang.String[]):0:282 -> a + 461:755:int deleteOverflowEvents(int):0:294 -> a + 756:959:com.batch.android.event.Event parseEvent(android.database.Cursor):0:203 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Landroid/database/Cursor;)Lcom/batch/android/o/b;"} + 960:975:int updateEventsToNewState(java.lang.String[],com.batch.android.event.Event$State):238:253 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"([Ljava/lang/String;Lcom/batch/android/o/b$a;)I"} + 1:317:void close():0:316 -> b + 318:444:java.util.List extractEventsToSend(int):0:126 -> b + 445:482:java.util.List extractEventsToSend(int):119:156 -> b + 483:491:java.util.List extractEventsToSend(int):150:158 -> b + 492:834:boolean insert(com.batch.android.event.Event):0:342 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/o/b;)Z"} + 835:880:boolean insert(com.batch.android.event.Event):339:384 -> b + 881:881:boolean insert(com.batch.android.event.Event):333:333 -> b + 882:1098:boolean updateEventsToNew(java.lang.String[]):0:216 -> b + 1:73:java.util.List getAllEvents():0:72 -> c + 74:74:java.util.List getAllEvents():62:62 -> c + 75:301:boolean updateEventsToOld(java.lang.String[]):0:226 -> c + 1:408:boolean resetEventStatus():0:407 -> d + 409:422:boolean resetEventStatus():400:413 -> d +com.batch.android.user.AttributeType -> com.batch.android.c1.a: +# {"id":"sourceFile","fileName":"AttributeType.java"} + int value -> a + char typeChar -> b + com.batch.android.user.AttributeType DELETED -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/c1/a;"} + com.batch.android.user.AttributeType STRING -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/c1/a;"} + com.batch.android.user.AttributeType LONG -> e + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/c1/a;"} + com.batch.android.user.AttributeType DOUBLE -> f + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/c1/a;"} + com.batch.android.user.AttributeType BOOL -> g + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/c1/a;"} + com.batch.android.user.AttributeType DATE -> h + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/c1/a;"} + com.batch.android.user.AttributeType URL -> i + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/c1/a;"} + com.batch.android.user.AttributeType OBJECT -> j + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/c1/a;"} + com.batch.android.user.AttributeType STRING_ARRAY -> k + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/c1/a;"} + com.batch.android.user.AttributeType OBJECT_ARRAY -> l + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/c1/a;"} + com.batch.android.user.AttributeType[] $VALUES -> m + # {"id":"com.android.tools.r8.residualsignature","signature":"[Lcom/batch/android/c1/a;"} + 1:16:void ():7:22 -> + 17:17:void ():6:6 -> + 1:33:void (java.lang.String,int,int,char):0:32 -> + 1:7:com.batch.android.user.AttributeType[] $values():0:6 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/c1/a;"} + 8:9:com.batch.android.user.AttributeType fromValue(int):52:53 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(I)Lcom/batch/android/c1/a;"} + 1:41:char getTypeChar():0:40 -> b + 1:37:int getValue():0:36 -> c + 1:1:com.batch.android.user.AttributeType valueOf(java.lang.String):6:6 -> valueOf + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/c1/a;"} + 1:1:com.batch.android.user.AttributeType[] values():6:6 -> values + # {"id":"com.android.tools.r8.residualsignature","signature":"()[Lcom/batch/android/c1/a;"} +com.batch.android.user.InstallDataEditor -> com.batch.android.c1.b: +# {"id":"sourceFile","fileName":"InstallDataEditor.java"} + com.batch.android.user.UserOperationQueue operationQueue -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/c1/j;"} + boolean[] updatedFields -> b + java.lang.String[] userFields -> c + com.batch.android.module.UserModule userModule -> d + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/m0/m;"} + int LANGUAGE_INDEX -> e + int REGION_INDEX -> f + 1:32:void ():0:31 -> + 33:39:void ():26:32 -> + 1:275:com.batch.android.user.InstallDataEditor addTag(java.lang.String,java.lang.String):0:274 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Ljava/lang/String;)Lcom/batch/android/c1/b;"} + 276:278:com.batch.android.user.InstallDataEditor addTag(java.lang.String,java.lang.String):264:266 -> a + 279:279:com.batch.android.user.InstallDataEditor addTag(java.lang.String,java.lang.String):264:264 -> a + 280:280:com.batch.android.user.InstallDataEditor addTag(java.lang.String,java.lang.String):258:258 -> a + 281:607:com.batch.android.user.InstallDataEditor clearTagCollection(java.lang.String):0:326 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/c1/b;"} + 608:608:com.batch.android.user.InstallDataEditor clearTagCollection(java.lang.String):324:324 -> a + 609:1009:void executeUserUpdateOperation():0:400 -> a + 1010:1010:void executeUserUpdateOperation():383:383 -> a + 1011:1285:void lambda$addTag$7(java.lang.String,java.lang.String,com.batch.android.user.SQLUserDatasource):0:274 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Ljava/lang/String;Lcom/batch/android/c1/c;)V"} + 1286:1608:void lambda$clearTagCollection$9(java.lang.String,com.batch.android.user.SQLUserDatasource):0:322 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Lcom/batch/android/c1/c;)V"} + 1609:1975:void lambda$saveSync$10(java.util.List,com.batch.android.core.Promise):0:366 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/util/List;Lcom/batch/android/e/a0;)V"} + 1976:2062:void lambda$setAttribute$0(java.lang.String,long,com.batch.android.user.SQLUserDatasource):0:86 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;JLcom/batch/android/c1/c;)V"} + 2063:2169:void lambda$setAttribute$1(java.lang.String,double,com.batch.android.user.SQLUserDatasource):0:106 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;DLcom/batch/android/c1/c;)V"} + 2170:2295:void lambda$setAttribute$2(java.lang.String,boolean,com.batch.android.user.SQLUserDatasource):0:125 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;ZLcom/batch/android/c1/c;)V"} + 2296:2446:void lambda$setAttribute$3(java.lang.String,java.util.Date,com.batch.android.user.SQLUserDatasource):0:150 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Ljava/util/Date;Lcom/batch/android/c1/c;)V"} + 2447:2669:void lambda$setAttribute$5(java.lang.String,java.net.URI,com.batch.android.user.SQLUserDatasource):0:222 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Ljava/net/URI;Lcom/batch/android/c1/c;)V"} + 1:242:void lambda$removeAttribute$6(java.lang.String,com.batch.android.user.SQLUserDatasource):0:241 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Lcom/batch/android/c1/c;)V"} + 243:551:void lambda$removeTag$8(java.lang.String,java.lang.String,com.batch.android.user.SQLUserDatasource):0:308 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Ljava/lang/String;Lcom/batch/android/c1/c;)V"} + 552:957:java.util.List popOperationQueue():0:405 -> b + 958:1266:com.batch.android.user.InstallDataEditor removeTag(java.lang.String,java.lang.String):0:308 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Ljava/lang/String;)Lcom/batch/android/c1/b;"} + 1267:1269:com.batch.android.user.InstallDataEditor removeTag(java.lang.String,java.lang.String):298:300 -> b + 1270:1270:com.batch.android.user.InstallDataEditor removeTag(java.lang.String,java.lang.String):298:298 -> b + 1271:1271:com.batch.android.user.InstallDataEditor removeTag(java.lang.String,java.lang.String):292:292 -> b + 1:179:void lambda$setAttribute$4(java.lang.String,java.lang.String,com.batch.android.user.SQLUserDatasource):0:178 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Ljava/lang/String;Lcom/batch/android/c1/c;)V"} + 180:549:com.batch.android.core.Promise saveSync():0:369 -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/e/a0;"} + 1:242:com.batch.android.user.InstallDataEditor removeAttribute(java.lang.String):0:241 -> removeAttribute + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/c1/b;"} + 243:243:com.batch.android.user.InstallDataEditor removeAttribute(java.lang.String):238:238 -> removeAttribute + 1:348:void save():0:347 -> save + 1:107:com.batch.android.user.InstallDataEditor setAttribute(java.lang.String,double):0:106 -> setAttribute + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;D)Lcom/batch/android/c1/b;"} + 108:108:com.batch.android.user.InstallDataEditor setAttribute(java.lang.String,double):102:102 -> setAttribute + 109:195:com.batch.android.user.InstallDataEditor setAttribute(java.lang.String,long):0:86 -> setAttribute + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;J)Lcom/batch/android/c1/b;"} + 196:196:com.batch.android.user.InstallDataEditor setAttribute(java.lang.String,long):83:83 -> setAttribute + 197:377:com.batch.android.user.InstallDataEditor setAttribute(java.lang.String,java.lang.String):0:180 -> setAttribute + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Ljava/lang/String;)Lcom/batch/android/c1/b;"} + 378:600:com.batch.android.user.InstallDataEditor setAttribute(java.lang.String,java.net.URI):0:222 -> setAttribute + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Ljava/net/URI;)Lcom/batch/android/c1/b;"} + 601:601:com.batch.android.user.InstallDataEditor setAttribute(java.lang.String,java.net.URI):199:199 -> setAttribute + 602:753:com.batch.android.user.InstallDataEditor setAttribute(java.lang.String,java.util.Date):0:151 -> setAttribute + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Ljava/util/Date;)Lcom/batch/android/c1/b;"} + 754:754:com.batch.android.user.InstallDataEditor setAttribute(java.lang.String,java.util.Date):151:151 -> setAttribute + 755:755:com.batch.android.user.InstallDataEditor setAttribute(java.lang.String,java.util.Date):142:142 -> setAttribute + 756:881:com.batch.android.user.InstallDataEditor setAttribute(java.lang.String,boolean):0:125 -> setAttribute + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Z)Lcom/batch/android/c1/b;"} + 882:882:com.batch.android.user.InstallDataEditor setAttribute(java.lang.String,boolean):122:122 -> setAttribute + 1:51:com.batch.android.user.InstallDataEditor setLanguage(java.lang.String):0:50 -> setLanguage + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/c1/b;"} + 1:68:com.batch.android.user.InstallDataEditor setRegion(java.lang.String):0:67 -> setRegion + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;)Lcom/batch/android/c1/b;"} +com.batch.android.user.SQLUserDatasource -> com.batch.android.c1.c: +# {"id":"sourceFile","fileName":"SQLUserDatasource.java"} + android.content.Context context -> a + android.database.sqlite.SQLiteDatabase database -> b + com.batch.android.user.UserDatabaseHelper databaseHelper -> c + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/c1/g;"} + boolean transactionOccurring -> d + long currentChangeset -> e + java.lang.String TAG -> f + 1:60:void (android.content.Context):0:59 -> + 61:75:void (android.content.Context):52:66 -> + 76:76:void (android.content.Context):61:61 -> + 1:107:void acquireTransactionLock(long):0:106 -> a + 108:350:void clearTags(java.lang.String):0:242 -> a + 351:477:void commitTransaction():0:126 -> a + 478:638:void setAttribute(java.lang.String,double):0:160 -> a + 639:792:void setAttribute(java.lang.String,long):0:153 -> a + 793:1065:void setAttribute(java.lang.String,android.content.ContentValues,com.batch.android.user.AttributeType,boolean):0:272 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/String;Landroid/content/ContentValues;Lcom/batch/android/c1/a;Z)V"} + 1066:1076:void setAttribute(java.lang.String,android.content.ContentValues,com.batch.android.user.AttributeType,boolean):272:282 -> a + 1077:1077:void setAttribute(java.lang.String,android.content.ContentValues,com.batch.android.user.AttributeType,boolean):267:267 -> a + 1078:1252:void setAttribute(java.lang.String,java.lang.String):0:174 -> a + 1253:1441:void setAttribute(java.lang.String,java.net.URI):0:188 -> a + 1442:1623:void setAttribute(java.lang.String,java.util.Date):0:181 -> a + 1624:1791:void setAttribute(java.lang.String,boolean):0:167 -> a + 1792:1793:void logAndThrow(java.lang.String,java.lang.Throwable):504:505 -> a + 1:203:void addTag(java.lang.String,java.lang.String):0:202 -> b + 204:437:void clearTags():0:233 -> b + 438:734:void deleteAttribute(java.lang.String,boolean):0:296 -> b + 735:735:void deleteAttribute(java.lang.String,boolean):296:296 -> b + 736:742:void deleteAttribute(java.lang.String,boolean):293:299 -> b + 743:743:void deleteAttribute(java.lang.String,boolean):288:288 -> b + 744:937:void removeAttribute(java.lang.String):0:193 -> b + 1:256:void clearAttributes():0:255 -> c + 257:464:void removeTag(java.lang.String,java.lang.String):0:207 -> c + 1:225:void clear():0:224 -> clear + 1:82:void close():0:81 -> close + 1:342:void deleteTag(java.lang.String,java.lang.String):0:341 -> d + 343:343:void deleteTag(java.lang.String,java.lang.String):330:330 -> d + 344:783:java.util.HashMap getAttributes():0:439 -> d + 784:819:java.util.HashMap getAttributes():438:473 -> d + 820:820:java.util.HashMap getAttributes():470:470 -> d + 821:821:java.util.HashMap getAttributes():467:467 -> d + 822:823:java.util.HashMap getAttributes():462:463 -> d + 824:824:java.util.HashMap getAttributes():458:458 -> d + 825:854:java.util.HashMap getAttributes():455:484 -> d + 855:861:java.util.HashMap getAttributes():483:489 -> d + 862:937:java.util.HashMap getAttributes():419:494 -> d + 1:409:java.util.Map getTagCollections():0:408 -> e + 410:413:java.util.Map getTagCollections():374:377 -> e + 414:446:java.util.Map getTagCollections():376:408 -> e + 447:501:java.util.Map getTagCollections():355:409 -> e + 502:826:void writeTag(java.lang.String,java.lang.String):0:324 -> e + 827:827:void writeTag(java.lang.String,java.lang.String):309:309 -> e + 1:142:void rollbackTransaction():0:141 -> f + 1:1:void throwInvalidStateException():509:509 -> g +com.batch.android.user.SQLUserDatasource$1 -> com.batch.android.c1.c$a: +# {"id":"sourceFile","fileName":"SQLUserDatasource.java"} + int[] $SwitchMap$com$batch$android$user$AttributeType -> a + 1:1:void ():453:453 -> +com.batch.android.user.UserAttribute -> com.batch.android.c1.d: +# {"id":"sourceFile","fileName":"UserAttribute.java"} + java.lang.Object value -> a + com.batch.android.user.AttributeType type -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/c1/a;"} + 1:17:void (java.lang.Object,com.batch.android.user.AttributeType):0:16 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Ljava/lang/Object;Lcom/batch/android/c1/a;)V"} + 1:38:java.util.Map getServerMapRepresentation(java.util.Map,boolean):0:37 -> a + 39:39:java.util.Map getServerMapRepresentation(java.util.Map,boolean):35:35 -> a + 1:57:boolean equals(java.lang.Object):0:56 -> equals + 1:1:java.lang.String toString():62:62 -> toString +com.batch.android.user.UserDataDiff -> com.batch.android.c1.e: +# {"id":"sourceFile","fileName":"UserDataDiff.java"} + com.batch.android.user.UserDataDiff$Result result -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/c1/e$b;"} + 1:40:void (java.util.Map,java.util.Map,java.util.Map,java.util.Map):0:39 -> + 1:67:void computeAttributes(java.util.Map,java.util.Map):0:66 -> a + 68:204:void computeTagSetDiff(java.util.Set,java.util.Set,java.util.Set[]):0:136 -> a + 205:205:void computeTagSetDiff(java.util.Set,java.util.Set,java.util.Set[]):116:116 -> a + 206:209:void computeTagSetDiff(java.util.Set,java.util.Set,java.util.Set[]):109:112 -> a + 1:97:void computeTags(java.util.Map,java.util.Map):0:96 -> b +com.batch.android.user.UserDataDiff$1 -> com.batch.android.c1.e$a: +# {"id":"sourceFile","fileName":"UserDataDiff.java"} +com.batch.android.user.UserDataDiff$Result -> com.batch.android.c1.e$b: +# {"id":"sourceFile","fileName":"UserDataDiff.java"} + java.util.Map addedAttributes -> a + java.util.Map removedAttributes -> b + java.util.Map addedTags -> c + java.util.Map removedTags -> d + 1:152:void ():0:151 -> + 153:296:void (com.batch.android.user.UserDataDiff$1):0:143 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/c1/e$a;)V"} + 1:193:com.batch.android.json.JSONObject convertToJson(java.util.Map,java.util.Map):0:192 -> a + 194:352:boolean hasChanges():0:158 -> a + 353:357:com.batch.android.json.JSONObject toEventParameters(long):166:170 -> a +com.batch.android.user.UserDatabaseException -> com.batch.android.c1.f: +# {"id":"sourceFile","fileName":"UserDatabaseException.java"} + 1:7:void (java.lang.String):0:6 -> +com.batch.android.user.UserDatabaseHelper -> com.batch.android.c1.g: +# {"id":"sourceFile","fileName":"UserDatabaseHelper.java"} + java.lang.String TABLE_ATTRIBUTES -> a + java.lang.String COLUMN_ATTR_NAME -> b + java.lang.String COLUMN_ATTR_TYPE -> c + java.lang.String COLUMN_ATTR_VALUE -> d + java.lang.String COLUMN_ATTR_CHANGESET -> e + java.lang.String TABLE_TAGS -> f + java.lang.String COLUMN_TAG_COLLECTION -> g + java.lang.String COLUMN_TAG_VALUE -> h + java.lang.String COLUMN_TAG_CHANGESET -> i + java.lang.String DATABASE_NAME -> j + int DATABASE_VERSION -> k + 1:35:void (android.content.Context):0:34 -> + 1:64:void onCreate(android.database.sqlite.SQLiteDatabase):0:63 -> onCreate + 1:1:void onUpgrade(android.database.sqlite.SQLiteDatabase,int,int):0:0 -> onUpgrade +com.batch.android.user.UserDatasource -> com.batch.android.c1.h: +# {"id":"sourceFile","fileName":"UserDatasource.java"} + void acquireTransactionLock(long) -> a + void clearTags(java.lang.String) -> a + void commitTransaction() -> a + void setAttribute(java.lang.String,double) -> a + void setAttribute(java.lang.String,long) -> a + void setAttribute(java.lang.String,java.lang.String) -> a + void setAttribute(java.lang.String,java.net.URI) -> a + void setAttribute(java.lang.String,java.util.Date) -> a + void setAttribute(java.lang.String,boolean) -> a + void addTag(java.lang.String,java.lang.String) -> b + void clearTags() -> b + void removeAttribute(java.lang.String) -> b + void clearAttributes() -> c + void removeTag(java.lang.String,java.lang.String) -> c + void clear() -> clear + void close() -> close + java.util.HashMap getAttributes() -> d + java.util.Map getTagCollections() -> e + void rollbackTransaction() -> f +com.batch.android.user.UserOperation -> com.batch.android.c1.i: +# {"id":"sourceFile","fileName":"UserOperation.java"} + void execute(com.batch.android.user.SQLUserDatasource) -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/c1/c;)V"} +com.batch.android.user.UserOperationQueue -> com.batch.android.c1.j: +# {"id":"sourceFile","fileName":"UserOperationQueue.java"} + java.util.List operationQueue -> a + 1:15:void ():0:14 -> + 16:34:void (java.util.List):0:18 -> + 1:39:void addFirstOperation(com.batch.android.user.UserOperation):0:38 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/c1/i;)V"} + 40:40:void addFirstOperation(com.batch.android.user.UserOperation):38:38 -> a + 41:91:java.util.List popOperations():0:50 -> a + 1:29:void addOperation(com.batch.android.user.UserOperation):0:28 -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/c1/i;)V"} + 30:30:void addOperation(com.batch.android.user.UserOperation):28:28 -> b + 31:91:int size():0:60 -> b +com.batch.android.util.DataCollectionUtils -> com.batch.android.d1.a: +# {"id":"sourceFile","fileName":"DataCollectionUtils.java"} + 1:8:void ():0:7 -> + 1:36:boolean areConfigsEquals(com.batch.android.BatchDataCollectionConfig,com.batch.android.BatchDataCollectionConfig):0:35 -> a +com.batch.android.util.MetaDataUtils -> com.batch.android.d1.b: +# {"id":"sourceFile","fileName":"MetaDataUtils.java"} + java.lang.String MANIFEST_OPT_OUT_BY_DEFAULT_KEY -> a + 1:11:void ():0:10 -> + 1:25:android.os.Bundle getAppMetaData(android.content.Context):0:24 -> a + 26:68:boolean getBooleanMetaData(android.content.Context,java.lang.String):0:42 -> a + 1:62:int getIntMetaData(android.content.Context,java.lang.String):0:61 -> b +com.batch.android.webservice.listener.AttributesCheckWebserviceListener -> com.batch.android.e1.a: +# {"id":"sourceFile","fileName":"AttributesCheckWebserviceListener.java"} + void onError(com.batch.android.FailReason) -> a + void onSuccess(com.batch.android.query.response.AttributesCheckResponse) -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/x0/a;)V"} +com.batch.android.webservice.listener.AttributesSendWebserviceListener -> com.batch.android.e1.b: +# {"id":"sourceFile","fileName":"AttributesSendWebserviceListener.java"} + void onError(com.batch.android.FailReason) -> a + void onSuccess(com.batch.android.query.response.AttributesSendResponse) -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/x0/b;)V"} +com.batch.android.webservice.listener.DisplayReceiptWebserviceListener -> com.batch.android.e1.c: +# {"id":"sourceFile","fileName":"DisplayReceiptWebserviceListener.java"} + void onFailure(com.batch.android.core.Webservice$WebserviceError) -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e/k0$d;)V"} + void onSuccess() -> onSuccess +com.batch.android.webservice.listener.InboxWebserviceListener -> com.batch.android.e1.d: +# {"id":"sourceFile","fileName":"InboxWebserviceListener.java"} + void onFailure(java.lang.String) -> a + void onSuccess(com.batch.android.inbox.InboxWebserviceResponse) -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/q/i;)V"} +com.batch.android.webservice.listener.LocalCampaignsJITWebserviceListener -> com.batch.android.e1.e: +# {"id":"sourceFile","fileName":"LocalCampaignsJITWebserviceListener.java"} + void onFailure(com.batch.android.core.Webservice$WebserviceError) -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e/k0$d;)V"} + void onSuccess(java.util.List) -> a +com.batch.android.webservice.listener.LocalCampaignsWebserviceListener -> com.batch.android.e1.f: +# {"id":"sourceFile","fileName":"LocalCampaignsWebserviceListener.java"} + void onError(com.batch.android.FailReason) -> a + void onSuccess(java.util.List) -> a +com.batch.android.webservice.listener.MetricWebserviceListener -> com.batch.android.e1.g: +# {"id":"sourceFile","fileName":"MetricWebserviceListener.java"} + void onFailure(com.batch.android.core.Webservice$WebserviceError) -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/e/k0$d;)V"} + void onSuccess() -> onSuccess +com.batch.android.webservice.listener.PushWebserviceListener -> com.batch.android.e1.h: +# {"id":"sourceFile","fileName":"PushWebserviceListener.java"} + void onError(com.batch.android.FailReason) -> a + void onSuccess() -> onSuccess +com.batch.android.webservice.listener.StartWebserviceListener -> com.batch.android.e1.i: +# {"id":"sourceFile","fileName":"StartWebserviceListener.java"} + void onError(com.batch.android.FailReason) -> a + void onSuccess() -> onSuccess +com.batch.android.webservice.listener.TrackerWebserviceListener -> com.batch.android.e1.j: +# {"id":"sourceFile","fileName":"TrackerWebserviceListener.java"} + void onFailure(com.batch.android.FailReason,java.util.List) -> a + void onFinish() -> a + void onSuccess(java.util.List) -> a +com.batch.android.webservice.listener.impl.AttributesCheckWebserviceListenerImpl -> com.batch.android.f1.a: +# {"id":"sourceFile","fileName":"AttributesCheckWebserviceListenerImpl.java"} + long DEFAULT_RECHECK_TIME -> a + 1:19:void ():0:18 -> + 1:46:void onSuccess(com.batch.android.query.response.AttributesCheckResponse):26:71 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/x0/a;)V"} + 47:47:void onSuccess(com.batch.android.query.response.AttributesCheckResponse):63:63 -> a + 48:57:void onSuccess(com.batch.android.query.response.AttributesCheckResponse):44:53 -> a + 58:107:void onSuccess(com.batch.android.query.response.AttributesCheckResponse):33:82 -> a + 108:108:void onError(com.batch.android.FailReason):89:89 -> a +com.batch.android.webservice.listener.impl.AttributesCheckWebserviceListenerImpl$1 -> com.batch.android.f1.a$a: +# {"id":"sourceFile","fileName":"AttributesCheckWebserviceListenerImpl.java"} + int[] $SwitchMap$com$batch$android$query$response$AttributesCheckResponse$Action -> a + 1:1:void ():26:26 -> +com.batch.android.webservice.listener.impl.AttributesSendWebserviceListenerImpl -> com.batch.android.f1.b: +# {"id":"sourceFile","fileName":"AttributesSendWebserviceListenerImpl.java"} + 1:18:void ():0:17 -> + 1:35:void onSuccess(com.batch.android.query.response.AttributesSendResponse):0:34 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/x0/b;)V"} + 36:36:void onError(com.batch.android.FailReason):41:41 -> a +com.batch.android.webservice.listener.impl.LocalCampaignsWebserviceListenerImpl -> com.batch.android.f1.c: +# {"id":"sourceFile","fileName":"LocalCampaignsWebserviceListenerImpl.java"} + com.batch.android.module.LocalCampaignsModule localCampaignsModule -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/m0/g;"} + com.batch.android.localcampaigns.CampaignManager campaignManager -> b + # {"id":"com.android.tools.r8.residualsignature","signature":"Lcom/batch/android/r/a;"} + 1:31:void (com.batch.android.module.LocalCampaignsModule,com.batch.android.localcampaigns.CampaignManager):0:30 -> + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/m0/g;Lcom/batch/android/r/a;)V"} + 1:58:void handleInAppResponse(com.batch.android.query.response.LocalCampaignsResponse):0:57 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"(Lcom/batch/android/x0/c;)V"} + 59:110:void onError(com.batch.android.FailReason):0:51 -> a + 111:155:void onSuccess(java.util.List):0:44 -> a + 156:158:com.batch.android.webservice.listener.impl.LocalCampaignsWebserviceListenerImpl provide():35:37 -> a + # {"id":"com.android.tools.r8.residualsignature","signature":"()Lcom/batch/android/f1/c;"} +com.batch.android.webservice.listener.impl.PushWebserviceListenerImpl -> com.batch.android.f1.d: +# {"id":"sourceFile","fileName":"PushWebserviceListenerImpl.java"} + 1:11:void ():0:10 -> + 1:1:void onError(com.batch.android.FailReason):0:0 -> a + 1:1:void onSuccess():0:0 -> onSuccess +com.batch.android.webservice.listener.impl.StartWebserviceListenerImpl -> com.batch.android.f1.e: +# {"id":"sourceFile","fileName":"StartWebserviceListenerImpl.java"} + 1:11:void ():0:10 -> + 1:1:void onError(com.batch.android.FailReason):0:0 -> a + 1:1:void onSuccess():0:0 -> onSuccess