1 /* <lambda>null2 * Copyright (C) 2020 The Dagger Authors. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package dagger.hilt.android.simpleKotlin.viewmodel 18 19 import android.os.Bundle 20 import androidx.activity.viewModels 21 import androidx.fragment.app.Fragment 22 import androidx.fragment.app.FragmentActivity 23 import androidx.fragment.app.FragmentManager 24 import androidx.fragment.app.activityViewModels 25 import androidx.fragment.app.viewModels 26 import androidx.test.core.app.ActivityScenario 27 import androidx.test.ext.junit.runners.AndroidJUnit4 28 import androidx.test.filters.LargeTest 29 import com.google.common.truth.Truth.assertThat 30 import dagger.hilt.android.AndroidEntryPoint 31 import dagger.hilt.android.testing.HiltAndroidRule 32 import dagger.hilt.android.testing.HiltAndroidTest 33 import org.junit.Rule 34 import org.junit.Test 35 import org.junit.runner.RunWith 36 37 @LargeTest 38 @HiltAndroidTest 39 @RunWith(AndroidJUnit4::class) 40 class FragmentInjectionTest { 41 42 @get:Rule 43 val rule = HiltAndroidRule(this) 44 45 @Test 46 fun verifyInjection() { 47 ActivityScenario.launch(TestActivity::class.java).use { 48 it.onActivity { activity -> 49 activity.addTestFragment() 50 activity.supportFragmentManager.findTestFragment().let { fragment -> 51 assertThat(fragment.myAndroidViewModel).isNotNull() 52 assertThat(fragment.myViewModel).isNotNull() 53 assertThat(fragment.myInjectedViewModel).isNotNull() 54 assertThat(fragment.myInjectedViewModelWithSavedState).isNotNull() 55 } 56 } 57 } 58 } 59 60 @Test 61 fun verifyActivityViewModelInjection() { 62 ActivityScenario.launch(TestActivity::class.java).use { 63 it.onActivity { activity -> 64 activity.addTestFragment() 65 activity.supportFragmentManager.findTestFragment().let { fragment -> 66 assertThat(fragment.myInjectedViewModel).isNotNull() 67 assertThat(fragment.myActivityLevelInjectedViewModel).isNotNull() 68 assertThat(fragment.myInjectedViewModel) 69 .isNotEqualTo(fragment.myActivityLevelInjectedViewModel) 70 assertThat(fragment.myActivityLevelInjectedViewModel) 71 .isEqualTo(activity.myInjectedViewModel) 72 } 73 activity.removeTestFragment() 74 activity.addTestFragment() 75 activity.supportFragmentManager.findTestFragment().let { fragment -> 76 assertThat(fragment.myInjectedViewModel).isNotNull() 77 assertThat(fragment.myActivityLevelInjectedViewModel).isNotNull() 78 assertThat(fragment.myInjectedViewModel) 79 .isNotEqualTo(fragment.myActivityLevelInjectedViewModel) 80 assertThat(fragment.myActivityLevelInjectedViewModel) 81 .isEqualTo(activity.myInjectedViewModel) 82 } 83 } 84 } 85 } 86 87 @AndroidEntryPoint 88 class TestActivity : FragmentActivity() { 89 90 val myInjectedViewModel by viewModels<MyInjectedViewModel>() 91 92 override fun onCreate(savedInstanceState: Bundle?) { 93 super.onCreate(savedInstanceState) 94 addTestFragment() 95 } 96 97 fun addTestFragment() { 98 val fragment = supportFragmentManager.fragmentFactory.instantiate( 99 TestFragment::class.java.classLoader!!, 100 TestFragment::class.java.name 101 ) 102 supportFragmentManager.beginTransaction() 103 .add(0, fragment, FRAGMENT_TAG) 104 .commitNow() 105 } 106 107 fun removeTestFragment() { 108 supportFragmentManager.beginTransaction() 109 .remove(supportFragmentManager.findFragmentByTag(FRAGMENT_TAG)!!) 110 .commitNow() 111 } 112 } 113 114 @AndroidEntryPoint 115 class TestFragment : Fragment() { 116 val myAndroidViewModel by viewModels<MyAndroidViewModel>() 117 val myViewModel by viewModels<MyViewModel>() 118 val myInjectedViewModel by viewModels<MyInjectedViewModel>() 119 val myInjectedViewModelWithSavedState by viewModels<MyInjectedViewModelWithSavedState>() 120 val myActivityLevelInjectedViewModel by activityViewModels<MyInjectedViewModel>() 121 } 122 123 private fun FragmentManager.findTestFragment() = 124 findFragmentByTag(FRAGMENT_TAG) as TestFragment 125 126 companion object { 127 const val FRAGMENT_TAG = "tag" 128 } 129 } 130