Context
- Expo SDK Version : 48
- Platform : Android 11
In the "ExpoSettings" ExpoModule application sample, I'd like to create an Activity "on demand" when pressing a button.
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.
Here is the codebase
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.