Expo Module : new Activity did'nt return appropriate resultCode

  1. SDK Version = 48
  2. Platform : Android 11
  3. Sorry, I didn’t find appropriate tag

Hello Expo Team. First, congrats for your amazing job at Expo’s, we use your work on a day to day basis in my company ! :slight_smile:

Context
In the “ExpoSettings” ExpoModule application sample, I’d like to create an Activity “on demand” when pressing a button. I have the following code :

Module code

// ExpoSettingsModule

        // fired by pressing button
        Function("startDummyActivity") {
            startDummyActivity()
        }

        RegisterActivityContracts {
            dummyActivityLauncher = registerForActivityResult(
                DummyContract(this@ExpoSettingsModule),
            ) { input, result ->
                Log.i(
                    "ExpoSettingsModule",
                    "dummyActivityLauncher result : $result"
                )
            }
        }

    private lateinit var dummyActivityLauncher: AppContextActivityResultLauncher<DummyContractOptions, DummyContractResult>


    private fun startDummyActivity() {
        CoroutineScope(Dispatchers.Main).launch {
            dummyActivityLauncher.launch(DummyContractOptions(DummyParam.DUMMY_INPUT))
        }
    }

Activity’s contract code

internal class DummyContract(private val appContextProvider: AppContextProvider) :
    AppContextActivityResultContract<DummyContractOptions, DummyContractResult> {
    override fun createIntent(context: Context, input: DummyContractOptions): Intent {
        val extras = Bundle()
        extras.putParcelable(
            "DummyActivityParcelable",
            input.dummyParam
        )
        val intent = Intent(appContextProvider.appContext.reactContext, DummyActivity::class.java)
        intent.putExtras(extras)
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        return intent
    }

    override fun parseResult(
        input: DummyContractOptions,
        resultCode: Int,
        intent: Intent?
    ): DummyContractResult =
        if (resultCode == Activity.RESULT_CANCELED) {
            Log.i("DummyContract", "DummyContractResult.Cancelled.")
            DummyContractResult.Cancelled()
        } else {
            Log.i("DummyContract", "DummyContractResult.Success. resultCode : $resultCode")
            DummyContractResult.Success()
        }
}

Activity

class DummyActivity: AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
        super.onCreate(savedInstanceState, persistentState)

        Timer().schedule(7000) {
            Log.i("DummyActivity", "timeout ! finish activity")
            finish()
        }

        Log.i("DummyActivity", "onCreate")
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.i("DummyActivity", "onDestroy")
    }
}

Logcat output

ActivityTaskManager : START u0 {flg=0x10000000 cmp=expo.modules.settings.example/expo.modules.settings.DummyActivity (has extras)} from uid 10210, pid 19462

ActivityTaskManager: ->startActivity for ActivityRecord{99a7f6c u0 expo.modules.settings.example/expo.modules.settings.DummyActivity t169} result:START_SUCCESS

WindowManager: (Error Log) SET_USER_ACTIVITY_TIMEOUT t=-1

DummyContract : DummyContractResult.Cancelled.

Issue
onCreate and onDestroy Activity’s callbacks aren’t called. The parseResult Success branch is never called, as the Activity returned an Activity.RESULT_CANCELED resultCode just upon been created.
As you can see, there is also this weird WindowManager error.

Thanks a lot for your help, if you need more information, don’t hesitate to ask me, I’m kind of stuck here.