Ali Doran
Ali Doran

Reputation: 556

FragmentScenario.EmptyFragmentActivity isn't available in launchFragmentInHiltContainer

EmptyFragmentActivity is internal now.
How can I implement launchFragmentInHiltContainer for FragmentScenario testing?

@ExperimentalCoroutinesApi
inline fun <reified T : Fragment> launchFragmentInHiltContainer(
fragmentArgs: Bundle? = null,
themeResId: Int = R.style.FragmentScenarioEmptyFragmentActivityTheme,
fragmentFactory: FragmentFactory? = null,
crossinline action: T.() -> Unit = {}
) {
val mainActivityIntent = Intent.makeMainActivity(
    ComponentName(
        ApplicationProvider.getApplicationContext(),
        HiltTestActivity::class.java
    )
).putExtra(FragmentScenario.EmptyFragmentActivity.THEME_EXTRAS_BUNDLE_KEY, themeResId)

ActivityScenario.launch<HiltTestActivity>(mainActivityIntent).onActivity { activity ->
    fragmentFactory?.let {
        activity.supportFragmentManager.fragmentFactory = it
    }
    val fragment = activity.supportFragmentManager.fragmentFactory.instantiate(
        Preconditions.checkNotNull(T::class.java.classLoader),
        T::class.java.name
    )
    fragment.arguments = fragmentArgs

    activity.supportFragmentManager.beginTransaction()
        .add(android.R.id.content, fragment, "")
        .commitNow()

    (fragment as T).action()
  }
}

When I wanted to implement this method for creating an annotated activity for hilt testing I faced not accessing the EmptyFragmentActivity.

Upvotes: 4

Views: 1516

Answers (1)

Ali Doran
Ali Doran

Reputation: 556

As below link that introduced by google
Goole intereduced link
Solution link

I change this code

putExtra(FragmentScenario.EmptyFragmentActivity.THEME_EXTRAS_BUNDLE_KEY, 
themeResId)

with this one

.putExtra("FragmentScenario.EmptyFragmentActivity.THEME_EXTRAS_BUNDLE_KEY", 
themeResId)

so the new file is look like this

import android.content.ComponentName
import android.content.Intent
import android.os.Bundle
import androidx.core.util.Preconditions
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentFactory
import androidx.test.core.app.ActivityScenario
import androidx.test.core.app.ApplicationProvider
import kotlinx.coroutines.ExperimentalCoroutinesApi

@ExperimentalCoroutinesApi
inline fun <reified T : Fragment> launchFragmentInHiltContainer(
fragmentArgs: Bundle? = null,
themeResId: Int = 
androidx.fragment.testing.
R.style.FragmentScenarioEmptyFragmentActivityTheme,
fragmentFactory: FragmentFactory? = null,
crossinline action: T.() -> Unit = {}
) {
val mainActivityIntent = Intent.makeMainActivity(
    ComponentName(
        ApplicationProvider.getApplicationContext(),
        HiltTestActivity::class.java
    )
).putExtra(
"FragmentScenario.EmptyFragmentActivity.THEME_EXTRAS_BUNDLE_KEY", 
themeResId)

ActivityScenario.launch<HiltTestActivity>(mainActivityIntent).onActivity { 
activity ->
    fragmentFactory?.let {
        activity.supportFragmentManager.fragmentFactory = it
    }
    val fragment = 
activity.supportFragmentManager.fragmentFactory.instantiate(
        Preconditions.checkNotNull(T::class.java.classLoader),
        T::class.java.name
    )
    fragment.arguments = fragmentArgs

    activity.supportFragmentManager.beginTransaction()
        .add(android.R.id.content, fragment, "")
        .commitNow()

    (fragment as T).action()
  }
}

Upvotes: 3

Related Questions