opensrp / fhircore

FHIR Core / OpenSRP 2 is a Kotlin application for delivering offline-capable, mobile-first healthcare project implementations from local community to national and international scale using FHIR and WHO Smart Guidelines on Android.
https://opensrp.io
Apache License 2.0
55 stars 56 forks source link

Quest applications crashing at launch when a different app ID is found persisted in memory #921

Closed f-odhiambo closed 2 years ago

f-odhiambo commented 2 years ago

Describe the bug App crashing when launching

To Reproduce Steps to reproduce the behaviour:

  1. Go to Android Studio or load APK
  2. Run app
  3. See an error/crush

Expected behaviour App should launch normally

Screenshots If applicable, add screenshots to help explain your problem.

Smartphone (please complete the following information):

Additional context N/A

Log report


-------- beginning of crash
2022-01-02 21:20:20.472 15473-15473/org.smartregister.fhircore.eir E/AndroidRuntime: FATAL EXCEPTION: main
    Process: org.smartregister.fhircore.eir, PID: 15473
    java.lang.RuntimeException: Unable to start activity ComponentInfo{org.smartregister.fhircore.eir/org.smartregister.fhircore.engine.ui.appsetting.AppSettingActivity}: com.google.crypto.tink.shaded.protobuf.InvalidProtocolBufferException: While parsing a protocol message, the input ended unexpectedly in the middle of a field.  This could mean either that the input has been truncated or that an embedded message misreported its own length.
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3635)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2210)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loopOnce(Looper.java:201)
        at android.os.Looper.loop(Looper.java:288)
        at android.app.ActivityThread.main(ActivityThread.java:7839)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
     Caused by: com.google.crypto.tink.shaded.protobuf.InvalidProtocolBufferException: While parsing a protocol message, the input ended unexpectedly in the middle of a field.  This could mean either that the input has been truncated or that an embedded message misreported its own length.
        at com.google.crypto.tink.shaded.protobuf.GeneratedMessageLite.parsePartialFrom(GeneratedMessageLite.java:1566)
        at com.google.crypto.tink.shaded.protobuf.GeneratedMessageLite.parseFrom(GeneratedMessageLite.java:1664)
        at com.google.crypto.tink.proto.Keyset.parseFrom(Keyset.java:957)
        at com.google.crypto.tink.integration.android.SharedPrefKeysetReader.read(SharedPrefKeysetReader.java:84)
        at com.google.crypto.tink.CleartextKeysetHandle.read(CleartextKeysetHandle.java:58)
        at com.google.crypto.tink.integration.android.AndroidKeysetManager$Builder.read(AndroidKeysetManager.java:328)
        at com.google.crypto.tink.integration.android.AndroidKeysetManager$Builder.readOrGenerateNewKeyset(AndroidKeysetManager.java:287)
        at com.google.crypto.tink.integration.android.AndroidKeysetManager$Builder.build(AndroidKeysetManager.java:238)
        at androidx.security.crypto.EncryptedSharedPreferences.create(EncryptedSharedPreferences.java:155)
        at androidx.security.crypto.EncryptedSharedPreferences.create(EncryptedSharedPreferences.java:120)
        at org.smartregister.fhircore.engine.util.SecureSharedPreference.<init>(SecureSharedPreference.kt:34)
        at org.smartregister.fhircore.eir.DaggerEirApplication_HiltComponents_SingletonC.secureSharedPreference(DaggerEirApplication_HiltComponents_SingletonC.java:163)
        at org.smartregister.fhircore.eir.DaggerEirApplication_HiltComponents_SingletonC.access$3700(DaggerEirApplication_HiltComponents_SingletonC.java:109)
        at org.smartregister.fhircore.eir.DaggerEirApplication_HiltComponents_SingletonC$SwitchingProvider.get(DaggerEirApplication_HiltComponents_SingletonC.java:933)
        at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
        at org.smartregister.fhircore.eir.DaggerEirApplication_HiltComponents_SingletonC.tokenManagerService(DaggerEirApplication_HiltComponents_SingletonC.java:179)
        at org.smartregister.fhircore.eir.DaggerEirApplication_HiltComponents_SingletonC.access$4000(DaggerEirApplication_HiltComponents_SingletonC.java:109)
        at org.smartregister.fhircore.eir.DaggerEirApplication_HiltComponents_SingletonC$SwitchingProvider.get(DaggerEirApplication_HiltComponents_SingletonC.java:942)
        at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
2022-01-02 21:20:20.473 15473-15473/org.smartregister.fhircore.eir E/AndroidRuntime:     at org.smartregister.fhircore.eir.DaggerEirApplication_HiltComponents_SingletonC.oAuthInterceptor(DaggerEirApplication_HiltComponents_SingletonC.java:183)
        at org.smartregister.fhircore.eir.DaggerEirApplication_HiltComponents_SingletonC.authOkHttpClientQualifierOkHttpClient(DaggerEirApplication_HiltComponents_SingletonC.java:187)
        at org.smartregister.fhircore.eir.DaggerEirApplication_HiltComponents_SingletonC.oAuthService(DaggerEirApplication_HiltComponents_SingletonC.java:191)
        at org.smartregister.fhircore.eir.DaggerEirApplication_HiltComponents_SingletonC.accountAuthenticator(DaggerEirApplication_HiltComponents_SingletonC.java:195)
        at org.smartregister.fhircore.eir.DaggerEirApplication_HiltComponents_SingletonC.access$3800(DaggerEirApplication_HiltComponents_SingletonC.java:109)
        at org.smartregister.fhircore.eir.DaggerEirApplication_HiltComponents_SingletonC$SwitchingProvider.get(DaggerEirApplication_HiltComponents_SingletonC.java:936)
        at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
        at org.smartregister.fhircore.eir.DaggerEirApplication_HiltComponents_SingletonC$ActivityCImpl.injectAppSettingActivity2(DaggerEirApplication_HiltComponents_SingletonC.java:668)
        at org.smartregister.fhircore.eir.DaggerEirApplication_HiltComponents_SingletonC$ActivityCImpl.injectAppSettingActivity(DaggerEirApplication_HiltComponents_SingletonC.java:629)
        at org.smartregister.fhircore.engine.ui.appsetting.Hilt_AppSettingActivity.inject(Hilt_AppSettingActivity.java:69)
        at org.smartregister.fhircore.engine.ui.appsetting.Hilt_AppSettingActivity$1.onContextAvailable(Hilt_AppSettingActivity.java:40)
        at androidx.activity.contextaware.ContextAwareHelper.dispatchOnContextAvailable(ContextAwareHelper.java:99)
        at androidx.activity.ComponentActivity.onCreate(ComponentActivity.java:313)
        at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:273)
        at org.smartregister.fhircore.engine.ui.appsetting.AppSettingActivity.onCreate(AppSettingActivity.kt:45)
        at android.app.Activity.performCreate(Activity.java:8051)
        at android.app.Activity.performCreate(Activity.java:8031)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3608)
            ... 12 more`
f-odhiambo commented 2 years ago

This issue seems to be caused by a HILT setting being persisted in memory

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: org.smartregister.fhircore.eir, PID: 24907
    java.lang.RuntimeException: Unable to start activity ComponentInfo{org.smartregister.fhircore.eir/org.smartregister.fhircore.engine.ui.appsetting.AppSettingActivity}: com.google.crypto.tink.shaded.protobuf.InvalidProtocolBufferException: While parsing a protocol message, the input ended unexpectedly in the middle of a field.  This could mean either that the input has been truncated or that an embedded message misreported its own length.
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3635)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2210)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loopOnce(Looper.java:201)
        at android.os.Looper.loop(Looper.java:288)
        at android.app.ActivityThread.main(ActivityThread.java:7839)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
     Caused by: com.google.crypto.tink.shaded.protobuf.InvalidProtocolBufferException: While parsing a protocol message, the input ended unexpectedly in the middle of a field.  This could mean either that the input has been truncated or that an embedded message misreported its own length.
        at com.google.crypto.tink.shaded.protobuf.GeneratedMessageLite.parsePartialFrom(GeneratedMessageLite.java:1566)
        at com.google.crypto.tink.shaded.protobuf.GeneratedMessageLite.parseFrom(GeneratedMessageLite.java:1664)
        at com.google.crypto.tink.proto.Keyset.parseFrom(Keyset.java:957)
        at com.google.crypto.tink.integration.android.SharedPrefKeysetReader.read(SharedPrefKeysetReader.java:84)
        at com.google.crypto.tink.CleartextKeysetHandle.read(CleartextKeysetHandle.java:58)
        at com.google.crypto.tink.integration.android.AndroidKeysetManager$Builder.read(AndroidKeysetManager.java:328)
        at com.google.crypto.tink.integration.android.AndroidKeysetManager$Builder.readOrGenerateNewKeyset(AndroidKeysetManager.java:287)
        at com.google.crypto.tink.integration.android.AndroidKeysetManager$Builder.build(AndroidKeysetManager.java:238)
        at androidx.security.crypto.EncryptedSharedPreferences.create(EncryptedSharedPreferences.java:155)
        at androidx.security.crypto.EncryptedSharedPreferences.create(EncryptedSharedPreferences.java:120)
        at org.smartregister.fhircore.engine.util.SecureSharedPreference.<init>(SecureSharedPreference.kt:34)
        at org.smartregister.fhircore.eir.DaggerEirApplication_HiltComponents_SingletonC.secureSharedPreference(DaggerEirApplication_HiltComponents_SingletonC.java:163)
        at org.smartregister.fhircore.eir.DaggerEirApplication_HiltComponents_SingletonC.access$3700(DaggerEirApplication_HiltComponents_SingletonC.java:109)
        at org.smartregister.fhircore.eir.DaggerEirApplication_HiltComponents_SingletonC$SwitchingProvider.get(DaggerEirApplication_HiltComponents_SingletonC.java:933)
        at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
        at org.smartregister.fhircore.eir.DaggerEirApplication_HiltComponents_SingletonC.tokenManagerService(DaggerEirApplication_HiltComponents_SingletonC.java:179)
        at org.smartregister.fhircore.eir.DaggerEirApplication_HiltComponents_SingletonC.access$4000(DaggerEirApplication_HiltComponents_SingletonC.java:109)
        at org.smartregister.fhircore.eir.DaggerEirApplication_HiltComponents_SingletonC$SwitchingProvider.get(DaggerEirApplication_HiltComponents_SingletonC.java:942)
        at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
E/AndroidRuntime:     at org.smartregister.fhircore.eir.DaggerEirApplication_HiltComponents_SingletonC.oAuthInterceptor(DaggerEirApplication_HiltComponents_SingletonC.java:183)
        at org.smartregister.fhircore.eir.DaggerEirApplication_HiltComponents_SingletonC.authOkHttpClientQualifierOkHttpClient(DaggerEirApplication_HiltComponents_SingletonC.java:187)
        at org.smartregister.fhircore.eir.DaggerEirApplication_HiltComponents_SingletonC.oAuthService(DaggerEirApplication_HiltComponents_SingletonC.java:191)
        at org.smartregister.fhircore.eir.DaggerEirApplication_HiltComponents_SingletonC.accountAuthenticator(DaggerEirApplication_HiltComponents_SingletonC.java:195)
        at org.smartregister.fhircore.eir.DaggerEirApplication_HiltComponents_SingletonC.access$3800(DaggerEirApplication_HiltComponents_SingletonC.java:109)
        at org.smartregister.fhircore.eir.DaggerEirApplication_HiltComponents_SingletonC$SwitchingProvider.get(DaggerEirApplication_HiltComponents_SingletonC.java:936)
        at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
        at org.smartregister.fhircore.eir.DaggerEirApplication_HiltComponents_SingletonC$ActivityCImpl.injectAppSettingActivity2(DaggerEirApplication_HiltComponents_SingletonC.java:668)
        at org.smartregister.fhircore.eir.DaggerEirApplication_HiltComponents_SingletonC$ActivityCImpl.injectAppSettingActivity(DaggerEirApplication_HiltComponents_SingletonC.java:629)
        at org.smartregister.fhircore.engine.ui.appsetting.Hilt_AppSettingActivity.inject(Hilt_AppSettingActivity.java:69)
        at org.smartregister.fhircore.engine.ui.appsetting.Hilt_AppSettingActivity$1.onContextAvailable(Hilt_AppSettingActivity.java:40)
        at androidx.activity.contextaware.ContextAwareHelper.dispatchOnContextAvailable(ContextAwareHelper.java:99)
        at androidx.activity.ComponentActivity.onCreate(ComponentActivity.java:313)
        at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:273)
        at org.smartregister.fhircore.engine.ui.appsetting.AppSettingActivity.onCreate(AppSettingActivity.kt:45)
        at android.app.Activity.performCreate(Activity.java:8051)
        at android.app.Activity.performCreate(Activity.java:8031)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3608)
            ... 12 more
ellykits commented 2 years ago

This error occurs when unrecognized application ID is persisted. The bug was introduced by persisting application id regardless of whether configurations exist or not. It's been resolved.