From f1096e3109e34a67ef58185115fa6fe9de86d83d Mon Sep 17 00:00:00 2001 From: ChaseApptentive <85038972+ChaseApptentive@users.noreply.github.com> Date: Thu, 2 Dec 2021 13:16:30 -0600 Subject: [PATCH 001/491] [PBI-2243] Remove Apptentive reset function (#194) * [PBI-2243] Remove Apptentive reset function [PBI-2243] * ktlint * Remove additional internal reset function * Use camel case to match other xml IDs --- .../java/apptentive/com/app/MainActivity.kt | 6 +++-- app/src/main/res/layout/activity_main.xml | 4 ++-- app/src/main/res/values/strings.xml | 4 ++-- .../com/android/feedback/Apptentive.kt | 23 ------------------- .../feedback/ApptentiveDefaultClient.kt | 9 -------- 5 files changed, 8 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/apptentive/com/app/MainActivity.kt b/app/src/main/java/apptentive/com/app/MainActivity.kt index 01d7a3328..d2cb15bfd 100644 --- a/app/src/main/java/apptentive/com/app/MainActivity.kt +++ b/app/src/main/java/apptentive/com/app/MainActivity.kt @@ -1,5 +1,7 @@ package apptentive.com.app +import android.app.ActivityManager +import android.content.Context import android.content.Intent import android.os.Build import android.os.Bundle @@ -75,8 +77,8 @@ class MainActivity : AppCompatActivity() { Apptentive.engage(this, "rating_dialog_event") { handleResult(it) } } - binding.resetSDKStateButton.setOnClickListener { - Apptentive.reset(this) + binding.clearAppDataButton.setOnClickListener { + (getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager).clearApplicationUserData() } } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index f07a668ff..71b1d564f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -166,7 +166,7 @@ app:layout_constraintTop_toBottomOf="@id/rating_dialog_button" /> + app:layout_constraintTop_toBottomOf="@id/clearAppDataButton" /> No event entered Interactions Shows the Apptentive Rating Dialog.\n\'Rate\' sends you to the customAppStoreURL set in ApptentiveConfiguration. - Reset SDK Data - Clears the conversation and calls a \"launch\" event + Clear App Data + Clears all of the app\'s data and closes the app.\nWill require manual opening of the app again. Sanitize Logs Determines if sensitive info should be logged.\nWill require manual opening of the app again. Back button diff --git a/apptentive-feedback/src/main/java/apptentive/com/android/feedback/Apptentive.kt b/apptentive-feedback/src/main/java/apptentive/com/android/feedback/Apptentive.kt index 352381d71..9f3db2785 100644 --- a/apptentive-feedback/src/main/java/apptentive/com/android/feedback/Apptentive.kt +++ b/apptentive-feedback/src/main/java/apptentive/com/android/feedback/Apptentive.kt @@ -2,7 +2,6 @@ package apptentive.com.android.feedback import android.app.Application import android.content.Context -import androidx.annotation.VisibleForTesting import apptentive.com.android.concurrent.Executor import apptentive.com.android.concurrent.ExecutorQueue import apptentive.com.android.concurrent.Executors @@ -16,7 +15,6 @@ import apptentive.com.android.core.TimeInterval import apptentive.com.android.core.format import apptentive.com.android.feedback.engagement.Event import apptentive.com.android.feedback.engagement.interactions.InteractionId -import apptentive.com.android.feedback.utils.RuntimeUtils import apptentive.com.android.feedback.utils.SensitiveDataUtils import apptentive.com.android.feedback.utils.ThrottleUtils import apptentive.com.android.feedback.utils.ThrottleUtils.SHARED_PREF_THROTTLE @@ -29,7 +27,6 @@ import apptentive.com.android.network.HttpNetworkResponse import apptentive.com.android.network.HttpRequest import apptentive.com.android.network.asString import apptentive.com.android.util.Log -import apptentive.com.android.util.LogTags import apptentive.com.android.util.LogTags.NETWORK sealed class EngagementResult { @@ -209,26 +206,6 @@ object Apptentive { } } - //region Debug - - /** - * *** DEBUG ONLY FUNCTION *** - * Clears the Conversation and records an internal "launch" event - * @see apptentive.com.android.feedback.ApptentiveDefaultClient.reset - */ - @VisibleForTesting - fun reset(context: Context) { - if (RuntimeUtils.getApplicationInfo(context).debuggable) { - stateExecutor.execute { - val client = client as? ApptentiveDefaultClient - if (client != null) client.reset() - else Log.e(LogTags.CORE, "Unable to clear event: sdk is not initialized") - } - } else throw IllegalStateException("Can only use reset method in Debug mode") - } - - //endregion - // region Person data updates /** diff --git a/apptentive-feedback/src/main/java/apptentive/com/android/feedback/ApptentiveDefaultClient.kt b/apptentive-feedback/src/main/java/apptentive/com/android/feedback/ApptentiveDefaultClient.kt index 676287258..89aa03bff 100644 --- a/apptentive-feedback/src/main/java/apptentive/com/android/feedback/ApptentiveDefaultClient.kt +++ b/apptentive-feedback/src/main/java/apptentive/com/android/feedback/ApptentiveDefaultClient.kt @@ -338,15 +338,6 @@ internal class ApptentiveDefaultClient( //endregion - //region Debug - - internal fun reset() { - conversationManager.clear() - conversationManager.recordEvent(Event.internal("launch")) // trick sdk to think it was launched - } - - //endregion - companion object { private fun getConversationFile(): File { val conversationsDir = getConversationDir() From 37b6b2d603064b34dff9a06a9416a265b90996b1 Mon Sep 17 00:00:00 2001 From: ChaseApptentive <85038972+ChaseApptentive@users.noreply.github.com> Date: Mon, 6 Dec 2021 13:27:35 -0600 Subject: [PATCH 002/491] [PBI-2368] OS Version parsing (#196) * [PBI-2368] OS Version parsing [PBI-2368] * Fix version tests --- .../feedback/engagement/criteria/DefaultTargetingState.kt | 2 +- .../engagement/criteria/DefaultTargetingStateTest.kt | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apptentive-feedback/src/main/java/apptentive/com/android/feedback/engagement/criteria/DefaultTargetingState.kt b/apptentive-feedback/src/main/java/apptentive/com/android/feedback/engagement/criteria/DefaultTargetingState.kt index dabc1b7cc..cee14a096 100644 --- a/apptentive-feedback/src/main/java/apptentive/com/android/feedback/engagement/criteria/DefaultTargetingState.kt +++ b/apptentive-feedback/src/main/java/apptentive/com/android/feedback/engagement/criteria/DefaultTargetingState.kt @@ -68,7 +68,7 @@ internal data class DefaultTargetingState( is person.custom_data -> person.customData[field.key] is device.os_name -> device.osName - is device.os_version -> device.osVersion + is device.os_version -> Version.parse(device.osVersion) is device.os_build -> device.osBuild is device.manufacturer -> device.manufacturer is device.model -> device.model diff --git a/apptentive-feedback/src/test/java/apptentive/com/android/feedback/engagement/criteria/DefaultTargetingStateTest.kt b/apptentive-feedback/src/test/java/apptentive/com/android/feedback/engagement/criteria/DefaultTargetingStateTest.kt index fb131be4e..5aef28945 100644 --- a/apptentive-feedback/src/test/java/apptentive/com/android/feedback/engagement/criteria/DefaultTargetingStateTest.kt +++ b/apptentive-feedback/src/test/java/apptentive/com/android/feedback/engagement/criteria/DefaultTargetingStateTest.kt @@ -297,7 +297,7 @@ class DefaultTargetingStateTest : TestCase() { val state = state.copy( device = mockDevice.copy( osName = "device_os_name", - osVersion = "device_os_version", + osVersion = "12", osBuild = "device_os_build", osApiLevel = 30, manufacturer = "device_manufacturer", @@ -324,7 +324,7 @@ class DefaultTargetingStateTest : TestCase() { ) assertThat(state.getValue(device.os_name)).isEqualTo("device_os_name") - assertThat(state.getValue(device.os_version)).isEqualTo("device_os_version") + assertThat(state.getValue(device.os_version)).isEqualTo(Version(12, 0, 0)) assertThat(state.getValue(device.os_build)).isEqualTo("device_os_build") assertThat(state.getValue(device.manufacturer)).isEqualTo("device_manufacturer") assertThat(state.getValue(device.model)).isEqualTo("device_model") @@ -355,7 +355,7 @@ class DefaultTargetingStateTest : TestCase() { val state = state.copy( device = Device( osName = "device_os_name", - osVersion = "device_os_version", + osVersion = "12", osBuild = "device_os_build", osApiLevel = 30, manufacturer = "device_manufacturer", @@ -376,7 +376,7 @@ class DefaultTargetingStateTest : TestCase() { ) assertThat(state.getValue(device.os_name)).isEqualTo("device_os_name") - assertThat(state.getValue(device.os_version)).isEqualTo("device_os_version") + assertThat(state.getValue(device.os_version)).isEqualTo(Version(12, 0, 0)) assertThat(state.getValue(device.os_build)).isEqualTo("device_os_build") assertThat(state.getValue(device.manufacturer)).isEqualTo("device_manufacturer") assertThat(state.getValue(device.model)).isEqualTo("device_model") From aebd3bc8ff2df1c7d922ef5e68cf8089b355458b Mon Sep 17 00:00:00 2001 From: ChaseApptentive <85038972+ChaseApptentive@users.noreply.github.com> Date: Mon, 6 Dec 2021 13:53:08 -0600 Subject: [PATCH 003/491] Update publish.util and settings gradle (#195) * Update publishutil and settings gradle * I could write to jfrog but sdk-kit couldn't read for some reason. * I changed around the gradle settings a bit and removed the allprojects repos and things are working as expected now. * I can't remember what the projectProperties was for, but after removing it, it still worked. * The only task we'll need to run now to publish everything is publishKit (up for a rename if you want) * Update task names. Add back in parameters for public repo command --- apptentive-sdk-kit/build.gradle | 14 -------------- build.gradle | 6 +----- publishutil.gradle | 25 +++++++++++++++---------- settings.gradle | 19 +++++++++++++++++++ 4 files changed, 35 insertions(+), 29 deletions(-) diff --git a/apptentive-sdk-kit/build.gradle b/apptentive-sdk-kit/build.gradle index a55a1515c..17c9dcc73 100644 --- a/apptentive-sdk-kit/build.gradle +++ b/apptentive-sdk-kit/build.gradle @@ -22,20 +22,6 @@ android { } } -repositories { - maven { - def artifactoryProperties = new Properties() - if (file('./local.properties').exists()) { - artifactoryProperties.load(file('./local.properties').newDataInputStream()) - } - url "https://apptentive.jfrog.io/artifactory/InternalNewAndroidSDK" - credentials { - username = artifactoryProperties['artifactory_username'] ? artifactoryProperties['artifactory_username']:"" - password = artifactoryProperties['artifactory_password'] ? artifactoryProperties['artifactory_password']:"" - } - } -} - dependencies { implementation "com.apptentive:apptentive-core:$versionId" implementation "com.apptentive:apptentive-core-ui:$versionId" diff --git a/build.gradle b/build.gradle index a495dc180..4fef2e78a 100644 --- a/build.gradle +++ b/build.gradle @@ -64,7 +64,7 @@ buildscript { } project.ext { - versionId = '1.0.15' + versionId = '1.0.17' } repositories { @@ -102,10 +102,6 @@ plugins { allprojects { apply plugin: 'com.jfrog.artifactory' apply plugin: 'maven-publish' - repositories { - mavenCentral() - google() - } } task clean(type: Delete) { diff --git a/publishutil.gradle b/publishutil.gradle index e1c47b973..da5d19736 100644 --- a/publishutil.gradle +++ b/publishutil.gradle @@ -1,6 +1,5 @@ -task assembleModules(type: GradleBuild) { +task assembleApptentiveModules(type: GradleBuild) { buildName = "assembleApptentiveModules" - startParameter.projectProperties = project.gradle.startParameter.projectProperties tasks = ['apptentive-core:assembleRelease', 'apptentive-core-ui:assembleRelease', 'apptentive-feedback:assembleRelease', @@ -9,11 +8,10 @@ task assembleModules(type: GradleBuild) { 'apptentive-navigate-to-link:assembleRelease', 'apptentive-notes:assembleRelease', 'apptentive-ratings:assembleRelease', - 'apptentive-survey:assembleRelease', - 'apptentive-sdk-kit:assembleRelease'] + 'apptentive-survey:assembleRelease'] } -task publishModules(type: GradleBuild) { +task publishApptentiveModules(type: GradleBuild) { buildName = "publishApptentiveModules" startParameter.projectProperties = project.gradle.startParameter.projectProperties tasks = ['apptentive-core:artifactoryPublish', @@ -24,12 +22,19 @@ task publishModules(type: GradleBuild) { 'apptentive-navigate-to-link:artifactoryPublish', 'apptentive-notes:artifactoryPublish', 'apptentive-ratings:artifactoryPublish', - 'apptentive-survey:artifactoryPublish', - 'apptentive-sdk-kit:artifactoryPublish'] + 'apptentive-survey:artifactoryPublish'] + dependsOn assembleApptentiveModules +} + +task assembleApptentiveKit(type: GradleBuild) { + buildName = "assembleApptentiveKit" + tasks = ['apptentive-sdk-kit:assembleRelease'] + dependsOn publishApptentiveModules } task publishApptentiveKit(type: GradleBuild) { - //forward projectProperties + buildName = "publishApptentiveKit" startParameter.projectProperties = project.gradle.startParameter.projectProperties - dependsOn assembleModules.finalizedBy(publishModules) -} \ No newline at end of file + tasks = ['apptentive-sdk-kit:artifactoryPublish'] + dependsOn assembleApptentiveKit +} diff --git a/settings.gradle b/settings.gradle index 5efdfa83e..1ae269004 100644 --- a/settings.gradle +++ b/settings.gradle @@ -15,4 +15,23 @@ include ':app', ':apptentive-survey', ':apptentive-sdk-kit' +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + maven { + def artifactoryProperties = new Properties() + if (file('./local.properties').exists()) { + artifactoryProperties.load(file('./local.properties').newDataInputStream()) + } + url "https://apptentive.jfrog.io/artifactory/InternalNewAndroidSDK" + credentials { + username = artifactoryProperties['artifactory_username'] ? artifactoryProperties['artifactory_username']:"" + password = artifactoryProperties['artifactory_password'] ? artifactoryProperties['artifactory_password']:"" + } + } + } +} + rootProject.name = 'apptentive-sdk-ktx' From f3b058903f53e592b4959416eed6b06c955a6045 Mon Sep 17 00:00:00 2001 From: Twinkle Sharma Date: Tue, 7 Dec 2021 09:59:33 -0800 Subject: [PATCH 004/491] changed the names of Success and Failure of EngagementResult (#198) --- .../java/apptentive/com/app/test/MainActivity.kt | 4 ++-- .../main/java/apptentive/com/app/MainActivity.kt | 2 +- .../enjoyment/EnjoymentDialogViewModelTest.kt | 2 +- .../feedback/engagement/MockEngagementContext.kt | 4 ++-- .../apptentive/com/android/feedback/Apptentive.kt | 4 ++-- .../feedback/engagement/DefaultEngagement.kt | 6 +++--- .../com/android/feedback/engagement/Engagement.kt | 4 ++-- .../feedback/engagement/InteractionEngagement.kt | 4 ++-- .../feedback/engagement/DefaultEngagementTest.kt | 8 ++++---- .../InAppReviewInteractionLauncherTest.kt | 8 ++++---- .../com/android/feedback/link/LinkNavigatorTest.kt | 2 +- .../feedback/textmodal/TextModalViewModel.kt | 2 +- .../notes/viewmodel/TextModalViewModelTest.kt | 14 +++++++------- .../ratings/appstorerating/StoreNavigatorTest.kt | 2 +- .../ratingdialog/RatingDialogViewModelTest.kt | 6 +++--- .../interaction/SurveyInteractionLauncherTest.kt | 2 +- 16 files changed, 37 insertions(+), 37 deletions(-) diff --git a/app-ui-test/src/main/java/apptentive/com/app/test/MainActivity.kt b/app-ui-test/src/main/java/apptentive/com/app/test/MainActivity.kt index 9b77cc10f..6c840defc 100644 --- a/app-ui-test/src/main/java/apptentive/com/app/test/MainActivity.kt +++ b/app-ui-test/src/main/java/apptentive/com/app/test/MainActivity.kt @@ -78,14 +78,14 @@ class MainActivity : AppCompatActivity() { customData: Map?, extendedData: List? ): EngagementResult { - return EngagementResult.Failure("No runnable interactions") + return EngagementResult.InteractionNotShown("No runnable interactions") } override fun engage( context: EngagementContext, invocations: List ): EngagementResult { - return EngagementResult.Failure("No runnable interactions") + return EngagementResult.InteractionNotShown("No runnable interactions") } }, payloadSender = object : PayloadSender { diff --git a/app/src/main/java/apptentive/com/app/MainActivity.kt b/app/src/main/java/apptentive/com/app/MainActivity.kt index d2cb15bfd..ba28d5362 100644 --- a/app/src/main/java/apptentive/com/app/MainActivity.kt +++ b/app/src/main/java/apptentive/com/app/MainActivity.kt @@ -83,7 +83,7 @@ class MainActivity : AppCompatActivity() { } private fun handleResult(it: EngagementResult) { - if (it !is EngagementResult.Success) { + if (it !is EngagementResult.InteractionShown) { Toast.makeText(this, "Not engaged: $it", Toast.LENGTH_LONG).show() } } diff --git a/apptentive-enjoyment-dialog/src/test/java/apptentive/com/android/feedback/enjoyment/EnjoymentDialogViewModelTest.kt b/apptentive-enjoyment-dialog/src/test/java/apptentive/com/android/feedback/enjoyment/EnjoymentDialogViewModelTest.kt index 41f0b559d..b47a26528 100644 --- a/apptentive-enjoyment-dialog/src/test/java/apptentive/com/android/feedback/enjoyment/EnjoymentDialogViewModelTest.kt +++ b/apptentive-enjoyment-dialog/src/test/java/apptentive/com/android/feedback/enjoyment/EnjoymentDialogViewModelTest.kt @@ -17,7 +17,7 @@ class EnjoymentDialogViewModelTest : TestCase() { val context = MockEngagementContext( onEngage = { args -> addResult(args) - EngagementResult.Failure("No runnable interactions") + EngagementResult.InteractionNotShown("No runnable interactions") }, onSendPayload = { payload -> throw AssertionError("We didn't expect any payloads here but this one slipped though: $payload") diff --git a/apptentive-feedback-test/src/main/java/apptentive/com/android/feedback/engagement/MockEngagementContext.kt b/apptentive-feedback-test/src/main/java/apptentive/com/android/feedback/engagement/MockEngagementContext.kt index 96b7231e7..c6452968c 100644 --- a/apptentive-feedback-test/src/main/java/apptentive/com/android/feedback/engagement/MockEngagementContext.kt +++ b/apptentive-feedback-test/src/main/java/apptentive/com/android/feedback/engagement/MockEngagementContext.kt @@ -44,14 +44,14 @@ class MockEngagementContext( customData, extendedData ) - ) ?: EngagementResult.Failure("No runnable interactions") + ) ?: EngagementResult.InteractionNotShown("No runnable interactions") } override fun engage( context: EngagementContext, invocations: List ): EngagementResult { - return onInvoke?.invoke(invocations) ?: EngagementResult.Failure("No runnable interactions") + return onInvoke?.invoke(invocations) ?: EngagementResult.InteractionNotShown("No runnable interactions") } }, payloadSender = MockPayloadSender(onSendPayload), diff --git a/apptentive-feedback/src/main/java/apptentive/com/android/feedback/Apptentive.kt b/apptentive-feedback/src/main/java/apptentive/com/android/feedback/Apptentive.kt index 9f3db2785..f9b9ce8fa 100644 --- a/apptentive-feedback/src/main/java/apptentive/com/android/feedback/Apptentive.kt +++ b/apptentive-feedback/src/main/java/apptentive/com/android/feedback/Apptentive.kt @@ -30,10 +30,10 @@ import apptentive.com.android.util.Log import apptentive.com.android.util.LogTags.NETWORK sealed class EngagementResult { - data class Success(val interactionId: InteractionId) : EngagementResult() { + data class InteractionShown(val interactionId: InteractionId) : EngagementResult() { init { Log.d(INTERACTIONS, "Interaction Engaged => interactionID: $interactionId") } } - data class Failure(val description: String) : EngagementResult() { + data class InteractionNotShown(val description: String) : EngagementResult() { init { Log.d(INTERACTIONS, "Interaction NOT Engaged => $description") } } data class Error(val message: String) : EngagementResult() { diff --git a/apptentive-feedback/src/main/java/apptentive/com/android/feedback/engagement/DefaultEngagement.kt b/apptentive-feedback/src/main/java/apptentive/com/android/feedback/engagement/DefaultEngagement.kt index 96c11dcb5..dd8a2873d 100644 --- a/apptentive-feedback/src/main/java/apptentive/com/android/feedback/engagement/DefaultEngagement.kt +++ b/apptentive-feedback/src/main/java/apptentive/com/android/feedback/engagement/DefaultEngagement.kt @@ -42,7 +42,7 @@ internal data class DefaultEngagement( val interactionData = interactionDataProvider.getInteractionData(event) if (interactionData == null) { - return EngagementResult.Failure("No runnable interactions for event '${event.name}'") + return EngagementResult.InteractionNotShown("No runnable interactions for event '${event.name}'") } val interaction = interactionConverter.convert(interactionData) @@ -59,7 +59,7 @@ internal data class DefaultEngagement( ): EngagementResult { val interactionData = interactionDataProvider.getInteractionData(invocations) if (interactionData == null) { - return EngagementResult.Failure("No runnable interactions") + return EngagementResult.InteractionNotShown("No runnable interactions") } val interaction = interactionConverter.convert(interactionData) @@ -75,7 +75,7 @@ internal data class DefaultEngagement( interaction: Interaction ): EngagementResult { val result = interactionEngagement.engage(context, interaction) - if (result is EngagementResult.Success) { + if (result is EngagementResult.InteractionShown) { recordInteraction(interaction) } diff --git a/apptentive-feedback/src/main/java/apptentive/com/android/feedback/engagement/Engagement.kt b/apptentive-feedback/src/main/java/apptentive/com/android/feedback/engagement/Engagement.kt index 5f0615fb8..8c0375cd0 100644 --- a/apptentive-feedback/src/main/java/apptentive/com/android/feedback/engagement/Engagement.kt +++ b/apptentive-feedback/src/main/java/apptentive/com/android/feedback/engagement/Engagement.kt @@ -32,13 +32,13 @@ internal class NullEngagement : Engagement { customData: Map?, extendedData: List? ): EngagementResult { - return EngagementResult.Failure("Unable to engage event $event: SDK is not fully initialized") + return EngagementResult.Error("Unable to engage event $event: SDK is not fully initialized") } override fun engage( context: EngagementContext, invocations: List ): EngagementResult { - return EngagementResult.Failure("Unable to engage invocations: SDK is not fully initialized") + return EngagementResult.Error("Unable to engage invocations: SDK is not fully initialized") } } diff --git a/apptentive-feedback/src/main/java/apptentive/com/android/feedback/engagement/InteractionEngagement.kt b/apptentive-feedback/src/main/java/apptentive/com/android/feedback/engagement/InteractionEngagement.kt index 41feda09c..fe7cbf82a 100644 --- a/apptentive-feedback/src/main/java/apptentive/com/android/feedback/engagement/InteractionEngagement.kt +++ b/apptentive-feedback/src/main/java/apptentive/com/android/feedback/engagement/InteractionEngagement.kt @@ -24,8 +24,8 @@ internal data class DefaultInteractionEngagement( if (!shouldThrottleInteraction) { launcher.launchInteraction(context, interaction) - EngagementResult.Success(interactionId = interaction.id) - } else EngagementResult.Failure("${interaction.type.name} throttled.") + EngagementResult.InteractionShown(interactionId = interaction.id) + } else EngagementResult.InteractionNotShown("${interaction.type.name} throttled.") } else EngagementResult.Error("Interaction launcher not found: ${interactionClass.name}") } } diff --git a/apptentive-feedback/src/test/java/apptentive/com/android/feedback/engagement/DefaultEngagementTest.kt b/apptentive-feedback/src/test/java/apptentive/com/android/feedback/engagement/DefaultEngagementTest.kt index 76beabcac..6345d5e89 100644 --- a/apptentive-feedback/src/test/java/apptentive/com/android/feedback/engagement/DefaultEngagementTest.kt +++ b/apptentive-feedback/src/test/java/apptentive/com/android/feedback/engagement/DefaultEngagementTest.kt @@ -29,10 +29,10 @@ class DefaultEngagementTest : TestCase() { @Test fun engageSuccessful() { - interactionEngagement.addResult(EngagementResult.Success(mockInteraction.id)) + interactionEngagement.addResult(EngagementResult.InteractionShown(mockInteraction.id)) val result = engagement.engage(MockEngagementContext(), mockEvent) - assertThat(result).isInstanceOf(EngagementResult.Success::class.java) + assertThat(result).isInstanceOf(EngagementResult.InteractionShown::class.java) assertResults( "Event: ${mockEvent.fullName}", @@ -42,10 +42,10 @@ class DefaultEngagementTest : TestCase() { @Test fun engageUnsuccessful() { - interactionEngagement.addResult(EngagementResult.Failure("Something went wrong")) + interactionEngagement.addResult(EngagementResult.InteractionNotShown("Something went wrong")) val result = engagement.engage(MockEngagementContext(), mockEvent) - assertThat(result).isInstanceOf(EngagementResult.Failure::class.java) + assertThat(result).isInstanceOf(EngagementResult.InteractionNotShown::class.java) assertResults("Event: ${mockEvent.fullName}") } diff --git a/apptentive-in-app-review/src/androidTest/java/apptentive/com/android/feedback/rating/interaction/InAppReviewInteractionLauncherTest.kt b/apptentive-in-app-review/src/androidTest/java/apptentive/com/android/feedback/rating/interaction/InAppReviewInteractionLauncherTest.kt index 484db8894..4dca0ebcc 100644 --- a/apptentive-in-app-review/src/androidTest/java/apptentive/com/android/feedback/rating/interaction/InAppReviewInteractionLauncherTest.kt +++ b/apptentive-in-app-review/src/androidTest/java/apptentive/com/android/feedback/rating/interaction/InAppReviewInteractionLauncherTest.kt @@ -33,7 +33,7 @@ class InAppReviewInteractionLauncherTest : TestCase() { launcher.launchInteraction( createEngagementContext(onEngage = { addResult("engage ${it.event}") - EngagementResult.Success(it.interactionId as InteractionId) + EngagementResult.InteractionShown(it.interactionId as InteractionId) }), InAppReviewInteraction("58eebbf2127096704e0000d0") ) @@ -52,7 +52,7 @@ class InAppReviewInteractionLauncherTest : TestCase() { launcher.launchInteraction( createEngagementContext(onEngage = { addResult("engage ${it.event}") - EngagementResult.Failure("Something went wrong") + EngagementResult.InteractionNotShown("Something went wrong") }), InAppReviewInteraction("58eebbf2127096704e0000d0") ) @@ -70,7 +70,7 @@ class InAppReviewInteractionLauncherTest : TestCase() { launcher.launchInteraction( createEngagementContext(context = appContext, onEngage = { addResult("engage ${it.event}") - EngagementResult.Success(it.interactionId as InteractionId) + EngagementResult.InteractionShown(it.interactionId as InteractionId) }), InAppReviewInteraction("58eebbf2127096704e0000d0") ) @@ -99,7 +99,7 @@ class InAppReviewInteractionLauncherTest : TestCase() { ) = MockEngagementContext( onEngage = onEngage ?: { args -> addResult(args) - EngagementResult.Success(args.interactionId as InteractionId) + EngagementResult.InteractionShown(args.interactionId as InteractionId) }, onSendPayload = onSendPayload ?: { payload -> addResult(payload.toJson()) diff --git a/apptentive-navigate-to-link/src/test/java/apptentive/com/android/feedback/link/LinkNavigatorTest.kt b/apptentive-navigate-to-link/src/test/java/apptentive/com/android/feedback/link/LinkNavigatorTest.kt index 1a16a971a..582faddf3 100644 --- a/apptentive-navigate-to-link/src/test/java/apptentive/com/android/feedback/link/LinkNavigatorTest.kt +++ b/apptentive-navigate-to-link/src/test/java/apptentive/com/android/feedback/link/LinkNavigatorTest.kt @@ -54,6 +54,6 @@ class LinkNavigatorTest : TestCase() { private fun createEngagementContext() = MockEngagementContext( onEngage = { addResult(it) - EngagementResult.Failure("No runnable interactions") + EngagementResult.InteractionNotShown("No runnable interactions") }) } \ No newline at end of file diff --git a/apptentive-notes/src/main/java/apptentive/com/android/feedback/textmodal/TextModalViewModel.kt b/apptentive-notes/src/main/java/apptentive/com/android/feedback/textmodal/TextModalViewModel.kt index be0516b1e..224b6f8da 100644 --- a/apptentive-notes/src/main/java/apptentive/com/android/feedback/textmodal/TextModalViewModel.kt +++ b/apptentive-notes/src/main/java/apptentive/com/android/feedback/textmodal/TextModalViewModel.kt @@ -108,7 +108,7 @@ internal class TextModalViewModel( ): Map { // we need to include a target interaction id (if any) if (engagementResult != null) { - val interactionId = (engagementResult as? EngagementResult.Success)?.interactionId + val interactionId = (engagementResult as? EngagementResult.InteractionShown)?.interactionId return mapOf( DATA_ACTION_ID to action.id, DATA_ACTION_LABEL to action.label, diff --git a/apptentive-notes/src/test/java/apptentive/com/android/feedback/notes/viewmodel/TextModalViewModelTest.kt b/apptentive-notes/src/test/java/apptentive/com/android/feedback/notes/viewmodel/TextModalViewModelTest.kt index 3480df6b6..c0ca2ef80 100644 --- a/apptentive-notes/src/test/java/apptentive/com/android/feedback/notes/viewmodel/TextModalViewModelTest.kt +++ b/apptentive-notes/src/test/java/apptentive/com/android/feedback/notes/viewmodel/TextModalViewModelTest.kt @@ -49,7 +49,7 @@ class TextModalViewModelTest : TestCase() { val viewModel = createViewModel( onInvoke = { // trick it to think an interaction has been invoked - EngagementResult.Success(targetInteractionId) + EngagementResult.InteractionShown(targetInteractionId) } ) @@ -84,7 +84,7 @@ class TextModalViewModelTest : TestCase() { val viewModel = createViewModel( onInvoke = { // no interactions to invoke - EngagementResult.Failure("No runnable interactions") + EngagementResult.InteractionNotShown("No runnable interactions") } ) @@ -126,8 +126,8 @@ class TextModalViewModelTest : TestCase() { val viewModel = createViewModel( onEngage = { // trick it to think an interaction has been invoked - if (it.event.name == TARGET_EVENT) EngagementResult.Success(targetInteractionId) - else EngagementResult.Failure("No runnable interactions") + if (it.event.name == TARGET_EVENT) EngagementResult.InteractionShown(targetInteractionId) + else EngagementResult.InteractionNotShown("No runnable interactions") } ) @@ -167,7 +167,7 @@ class TextModalViewModelTest : TestCase() { val viewModel = createViewModel( onEngage = { // no interactions to invoke - EngagementResult.Failure("No runnable interactions") + EngagementResult.InteractionNotShown("No runnable interactions") } ) @@ -279,13 +279,13 @@ class TextModalViewModelTest : TestCase() { onEngage = { args -> addResult(args) onEngage?.invoke(args) - ?: EngagementResult.Failure("No runnable interactions") + ?: EngagementResult.InteractionNotShown("No runnable interactions") }, // record invocations for every engage call onInvoke = { invocations -> addResult(invocations) onInvoke?.invoke(invocations) - ?: EngagementResult.Failure("No runnable interactions") + ?: EngagementResult.InteractionNotShown("No runnable interactions") }, // we don't expect payloads here onSendPayload = { payload -> diff --git a/apptentive-ratings/src/test/java/apptentive/com/android/ratings/appstorerating/StoreNavigatorTest.kt b/apptentive-ratings/src/test/java/apptentive/com/android/ratings/appstorerating/StoreNavigatorTest.kt index 8315a39ee..2cf61f7e7 100644 --- a/apptentive-ratings/src/test/java/apptentive/com/android/ratings/appstorerating/StoreNavigatorTest.kt +++ b/apptentive-ratings/src/test/java/apptentive/com/android/ratings/appstorerating/StoreNavigatorTest.kt @@ -74,6 +74,6 @@ class StoreNavigatorTest : TestCase() { private fun createEngagementContext() = MockEngagementContext( onEngage = { addResult(it) - EngagementResult.Failure("No runnable interactions") + EngagementResult.InteractionNotShown("No runnable interactions") }) } \ No newline at end of file diff --git a/apptentive-ratings/src/test/java/apptentive/com/android/ratings/ratingdialog/RatingDialogViewModelTest.kt b/apptentive-ratings/src/test/java/apptentive/com/android/ratings/ratingdialog/RatingDialogViewModelTest.kt index c7374ba57..36c62083f 100644 --- a/apptentive-ratings/src/test/java/apptentive/com/android/ratings/ratingdialog/RatingDialogViewModelTest.kt +++ b/apptentive-ratings/src/test/java/apptentive/com/android/ratings/ratingdialog/RatingDialogViewModelTest.kt @@ -31,7 +31,7 @@ class RatingDialogViewModelTest : TestCase() { val viewModel = createViewModel( onInvoke = { // trick it to think an interaction has been invoked - EngagementResult.Success(targetInteractionId) + EngagementResult.InteractionShown(targetInteractionId) } ) @@ -88,13 +88,13 @@ class RatingDialogViewModelTest : TestCase() { onEngage = { args -> addResult(args) onEngage?.invoke(args) - ?: EngagementResult.Failure("No runnable interactions") + ?: EngagementResult.InteractionNotShown("No runnable interactions") }, // record invocations for every engage call onInvoke = { invocations -> addResult(invocations) onInvoke?.invoke(invocations) - ?: EngagementResult.Failure("No runnable interactions") + ?: EngagementResult.InteractionNotShown("No runnable interactions") }, // we don't expect payloads here onSendPayload = { payload -> diff --git a/apptentive-survey/src/test/java/apptentive/com/android/feedback/survey/interaction/SurveyInteractionLauncherTest.kt b/apptentive-survey/src/test/java/apptentive/com/android/feedback/survey/interaction/SurveyInteractionLauncherTest.kt index 98ce3f8ec..7c2345e35 100644 --- a/apptentive-survey/src/test/java/apptentive/com/android/feedback/survey/interaction/SurveyInteractionLauncherTest.kt +++ b/apptentive-survey/src/test/java/apptentive/com/android/feedback/survey/interaction/SurveyInteractionLauncherTest.kt @@ -98,7 +98,7 @@ class SurveyInteractionLauncherTest : TestCase() { ) = MockEngagementContext( onEngage = onEngage ?: { args -> addResult(args) - EngagementResult.Failure("No runnable interactions") + EngagementResult.InteractionNotShown("No runnable interactions") }, onSendPayload = onSendPayload ?: { payload -> addResult(payload.toJson()) From 53a6364d1bc2d2189a00a154c8717e867ca7c7ef Mon Sep 17 00:00:00 2001 From: ChaseApptentive <85038972+ChaseApptentive@users.noreply.github.com> Date: Wed, 8 Dec 2021 12:27:48 -0600 Subject: [PATCH 005/491] Update example app with 1 import, customStoreURL, and new Engagement names (#199) * Update example app with 1 import, customStoreURL, and new Engagement names * Update GitHub link --- apptentive-example/build.gradle | 44 ++--------------- .../com/apptentive/example/MainActivity.kt | 49 ++++++++++++------- .../com/apptentive/example/MyApplication.kt | 10 ++-- .../src/main/res/layout/activity_main.xml | 11 +++++ .../src/main/res/values/strings.xml | 1 + 5 files changed, 54 insertions(+), 61 deletions(-) diff --git a/apptentive-example/build.gradle b/apptentive-example/build.gradle index 09e94dd1b..96ef947ad 100644 --- a/apptentive-example/build.gradle +++ b/apptentive-example/build.gradle @@ -22,47 +22,9 @@ dependencies { implementation 'androidx.constraintlayout:constraintlayout:2.1.1' /** - * TODO Step 1: Uncomment the code below for the interactions you'd like to demo + * TODO Step 1: Uncomment the import line below. * TODO Step 2: Replace APPTENTIVE_VERSION with released version from GitHub - * https://github.com/apptentive/android-sdk - * TODO Dev - (Replace GitHub link with public version) + * https://github.com/apptentive/apptentive-android-sdk */ -// def apptentive_version = APPTENTIVE_VERSION - - // Core Apptentive code for using any Apptentive Interaction -// implementation "com.apptentive:apptentive-core:$apptentive_version" -// implementation "com.apptentive:apptentive-core-ui:$apptentive_version" -// implementation "com.apptentive:apptentive-feedback:$apptentive_version" - - // Love Dialog Interaction - // https://learn.apptentive.com/knowledge-base/getting-started-with-apptentive/#love-dialog -// implementation "com.apptentive:apptentive-enjoyment-dialog:$apptentive_version" - - // Notes Interaction - // https://learn.apptentive.com/knowledge-base/getting-started-with-apptentive/#notes -// implementation "com.apptentive:apptentive-notes:$apptentive_version" - - // Support library for external linking and deep linking -// implementation "com.apptentive:apptentive-navigate-to-link:$apptentive_version" - - // Survey Interaction - // https://learn.apptentive.com/knowledge-base/getting-started-with-apptentive/#surveys -// implementation "com.apptentive:apptentive-survey:$apptentive_version" - - - /** - * The example app is not set up to handle Google In-App Review and Apptentive Rating Dialog. - * Included here (In Gradle) as an implementation example. - * - * Google In-App Review Interaction - Requires the app to be in the Play Store - * Apptentive Rating Dialog Interaction - Requires Android OS < 5 (API level 20 or below) - * or a non-Play Store App (TO BE IMPLEMENTED) - */ - // Google In-App Review - // https://learn.apptentive.com/knowledge-base/requesting-ratings-on-google-play/ -// implementation "com.apptentive:apptentive-in-app-review:$apptentive_version" - - // Apptentive Rating Dialog Interaction - // https://learn.apptentive.com/knowledge-base/getting-started-with-apptentive/#rating-dialog -// implementation "com.apptentive:apptentive-ratings:$apptentive_version" +// implementation "com.apptentive:apptentive-sdk-kit:APPTENTIVE_VERSION" } \ No newline at end of file diff --git a/apptentive-example/src/main/java/com/apptentive/example/MainActivity.kt b/apptentive-example/src/main/java/com/apptentive/example/MainActivity.kt index 43d5977d7..f76c8a2d8 100644 --- a/apptentive-example/src/main/java/com/apptentive/example/MainActivity.kt +++ b/apptentive-example/src/main/java/com/apptentive/example/MainActivity.kt @@ -2,7 +2,6 @@ package com.apptentive.example import android.os.Bundle import android.widget.Button -import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.apptentive.apptentive_example.R @@ -14,43 +13,59 @@ class MainActivity : AppCompatActivity() { val loveDialogButton = findViewById