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.

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.