aws-amplify / amplify-android

The fastest and easiest way to use AWS from your Android app.
https://docs.amplify.aws/lib/q/platform/android/
Apache License 2.0
250 stars 117 forks source link

RxAmplify.Analytics - Crash #2943

Open lolucosmin opened 1 week ago

lolucosmin commented 1 week ago

Before opening, please confirm:

Language and Async Model

RxJava

Amplify Categories

Analytics

Gradle script dependencies

implementation("com.amplifyframework:core:2.24.0") implementation("com.amplifyframework:aws-auth-cognito:2.24.0") implementation("com.amplifyframework:aws-api:2.24.0") implementation("com.amplifyframework:aws-analytics-pinpoint:2.24.0") implementation("com.amplifyframework:aws-storage-s3:2.24.0") implementation("com.amplifyframework:aws-analytics-pinpoint:2.24.0") implementation("com.amplifyframework:rxbindings:2.24.0") coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.3")

Environment information

``` # Put output below this line ------------------------------------------------------------ Gradle 8.6 ------------------------------------------------------------ Build time: 2024-02-02 16:47:16 UTC Revision: d55c486870a0dc6f6278f53d21381396d0741c6e Kotlin: 1.9.20 Groovy: 3.0.17 Ant: Apache Ant(TM) version 1.10.13 compiled on January 4 2023 JVM: 21.0.3 (JetBrains s.r.o. 21.0.3+-12282718-b509.11) OS: Windows 11 10.0 amd64 ```

Please include any relevant guides or documentation you're referencing

Amplify V2

Describe the bug

Hi, I am migrating the project to Amplify 2. I followed the steps in the documentation to initialize then to add plugins and everything was fine.

I created hubs for each plugin and for all of them I have InitializationStatus.SUCCEEDED. I use RxAmplify in my code and was fine until I tried to record a event with RxAmplify.Analytics.recordEvent(event). When I run that command i get this error:

java.lang.IllegalStateException: Tried to get a plugin but that plugin was not present. Check if the plugin was added originally or perhaps was already removed. at com.amplifyframework.core.category.Category.getPluginIfConfiguredOrThrow(Category.java:257) at com.amplifyframework.core.category.Category.getSelectedPlugin(Category.java:252) at com.amplifyframework.analytics.AnalyticsCategory.enable(AnalyticsCategory.java:72) at com.bfan.sso.logic.services.analitycs.AnalyticsTracker.createEvent(AnalyticsTracker.java:33) at com.bfan.sso.gui.base.fragment.BaseFragment.lambda$onViewCreated$0(BaseFragment.java:88)

As you can see from a base fragment I track the content name. After a while I decide to use Amplify.Analytics.recordEvent(event) and is works fine.

Issue: RxAmplify.Analytics.recordEvent(event) has a problem. Mention: I use everywhere in the app RxAmplify

Reproduction steps (if applicable)

No response

Code Snippet

// Put your code below this line.

Log output

``` // Put your logs below this line java.lang.IllegalStateException: Tried to get a plugin but that plugin was not present. Check if the plugin was added originally or perhaps was already removed. at com.amplifyframework.core.category.Category.getPluginIfConfiguredOrThrow(Category.java:257) at com.amplifyframework.core.category.Category.getSelectedPlugin(Category.java:252) at com.amplifyframework.analytics.AnalyticsCategory.enable(AnalyticsCategory.java:72) at com.bfan.sso.logic.services.analitycs.AnalyticsTracker.createEvent(AnalyticsTracker.java:33) at com.bfan.sso.gui.base.fragment.BaseFragment.lambda$onViewCreated$0(BaseFragment.java:88) ```

amplifyconfiguration.json

No response

GraphQL Schema

```graphql // Put your schema below this line ```

Additional information and screenshots

No response

mattcreaser commented 1 week ago

Hi @lolucosmin, could you post your code where you configure Amplify? This exception indicates that the Analytics Plugin isn't being added, you should have something like:

Amplify.addPlugin(AWSCognitoAuthPlugin())
Amplify.addPlugin(AWSS3StoragePlugin())
Amplify.addPlugin(AWSPinpointAnalyticsPlugin()) // ensure this is here
Amplify.configure(...)
lolucosmin commented 1 week ago

Hi @lolucosmin, could you post your code where you configure Amplify? This exception indicates that the Analytics Plugin isn't being added, you should have something like:

Amplify.addPlugin(AWSCognitoAuthPlugin())
Amplify.addPlugin(AWSS3StoragePlugin())
Amplify.addPlugin(AWSPinpointAnalyticsPlugin()) // ensure this is here
Amplify.configure(...)

Sure @mattcreaser :

//init Amplify AWSApiPlugin apiPlugin = AWSApiPlugin.builder().build(); apiPlugin.configure(AmplifyConfig.Companion.getInstance().getApiConfiguration(), AppApplication.Companion.getInstance());

        RxAmplify.addPlugin(apiPlugin);
        RxAmplify.addPlugin(new AWSCognitoAuthPlugin());
        RxAmplify.addPlugin(new AWSS3StoragePlugin());
        RxAmplify.addPlugin(new AWSPinpointAnalyticsPlugin());

        AmplifyConfiguration configuration = AmplifyConfiguration.builder(AmplifyConfig.Companion.getInstance().getAWSConfiguration())
                .devMenuEnabled(BuildConfig.DEBUG)
                .build();
        RxAmplify.configure(configuration, AppApplication.Companion.getInstance());
        if (BuildConfig.DEBUG) {
            RxAmplify.Logging.enable();
        }

Also I have hub:

Disposable analitycsHubDisposable = RxAmplify.Hub.on(HubChannel.ANALYTICS) .map(HubEvent::getName) .subscribe(name -> { if (name.equals(InitializationStatus.SUCCEEDED.name())) { isAnalyticsInitialized = true; LogUtils.i("RxAmplify.ANALYTICS Initialization: " + InitializationStatus.SUCCEEDED.name());

                } else if (name.equals(InitializationStatus.FAILED.name())) {
                    isAnalyticsInitialized = false;
                    LogUtils.i("RxAmplify.ANALYTICS Initialization: " + InitializationStatus.FAILED.name());
                }
            });

    this.compositeDisposable.add(authHubDisposable);
    this.compositeDisposable.add(storageHubDisposable);
    this.compositeDisposable.add(analitycsHubDisposable);

And in hub I get the success event. Weird is why is working with Amplify.Analytics.recordEvent(event)

mattcreaser commented 1 week ago

Thanks for the additional info @lolucosmin, it seems you have uncovered a surprising bug. This line is a clear bug that means Analytics will never work when using RxAmplify.

I will submit a fix for this issue and we will try to get it released as quickly as we can.

mattcreaser commented 1 week ago

Note: you should also be able to work around this crash by calling RxAmplify.addPlugin(...) instead of Amplify.addPlugin(...). It appears that is the intended way to register plugins when using Rx, but it still should not crash and the current implementation prevents mixing usage for the Analytics category, but not for other categories.

lolucosmin commented 1 week ago

RxAmplify.addPlugin(...)

I use this if you check my code so still is crashing.

mattcreaser commented 1 week ago

Ah my mistake, you're right. It doesn't matter which you use. This will be fixed soon.

mattcreaser commented 16 hours ago

The fix for this issue has been merged and will be included in our next release.