0

Context

  1. Expo SDK Version : 48
  2. 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.
47tibo
  • 11
  • 4

0 Answers0