1*f585d8a3SJacky Wang /* 2*f585d8a3SJacky Wang * Copyright (C) 2021 The Dagger Authors. 3*f585d8a3SJacky Wang * 4*f585d8a3SJacky Wang * Licensed under the Apache License, Version 2.0 (the "License"); 5*f585d8a3SJacky Wang * you may not use this file except in compliance with the License. 6*f585d8a3SJacky Wang * You may obtain a copy of the License at 7*f585d8a3SJacky Wang * 8*f585d8a3SJacky Wang * http://www.apache.org/licenses/LICENSE-2.0 9*f585d8a3SJacky Wang * 10*f585d8a3SJacky Wang * Unless required by applicable law or agreed to in writing, software 11*f585d8a3SJacky Wang * distributed under the License is distributed on an "AS IS" BASIS, 12*f585d8a3SJacky Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*f585d8a3SJacky Wang * See the License for the specific language governing permissions and 14*f585d8a3SJacky Wang * limitations under the License. 15*f585d8a3SJacky Wang */ 16*f585d8a3SJacky Wang 17*f585d8a3SJacky Wang package dagger.hilt.android; 18*f585d8a3SJacky Wang 19*f585d8a3SJacky Wang import static androidx.test.core.app.ApplicationProvider.getApplicationContext; 20*f585d8a3SJacky Wang import static com.google.common.truth.Truth.assertThat; 21*f585d8a3SJacky Wang 22*f585d8a3SJacky Wang import android.content.Intent; 23*f585d8a3SJacky Wang import android.os.Build; 24*f585d8a3SJacky Wang import android.os.Bundle; 25*f585d8a3SJacky Wang import androidx.fragment.app.FragmentActivity; 26*f585d8a3SJacky Wang import androidx.lifecycle.SavedStateHandle; 27*f585d8a3SJacky Wang import androidx.lifecycle.ViewModel; 28*f585d8a3SJacky Wang import androidx.lifecycle.ViewModelProvider; 29*f585d8a3SJacky Wang import androidx.test.core.app.ActivityScenario; 30*f585d8a3SJacky Wang import androidx.test.ext.junit.runners.AndroidJUnit4; 31*f585d8a3SJacky Wang import dagger.Module; 32*f585d8a3SJacky Wang import dagger.Provides; 33*f585d8a3SJacky Wang import dagger.hilt.InstallIn; 34*f585d8a3SJacky Wang import dagger.hilt.android.components.ActivityComponent; 35*f585d8a3SJacky Wang import dagger.hilt.android.testing.HiltAndroidRule; 36*f585d8a3SJacky Wang import dagger.hilt.android.testing.HiltAndroidTest; 37*f585d8a3SJacky Wang import dagger.hilt.android.testing.HiltTestApplication; 38*f585d8a3SJacky Wang import javax.inject.Inject; 39*f585d8a3SJacky Wang import org.junit.Rule; 40*f585d8a3SJacky Wang import org.junit.Test; 41*f585d8a3SJacky Wang import org.junit.runner.RunWith; 42*f585d8a3SJacky Wang import org.robolectric.annotation.Config; 43*f585d8a3SJacky Wang 44*f585d8a3SJacky Wang @HiltAndroidTest 45*f585d8a3SJacky Wang @RunWith(AndroidJUnit4.class) 46*f585d8a3SJacky Wang // Robolectric requires Java9 to run API 29 and above, so use API 28 instead 47*f585d8a3SJacky Wang @Config(sdk = Build.VERSION_CODES.P, application = HiltTestApplication.class) 48*f585d8a3SJacky Wang public class ActivityInjectedSavedStateViewModelTest { 49*f585d8a3SJacky Wang 50*f585d8a3SJacky Wang private static final String DATA_KEY = "TEST_KEY"; 51*f585d8a3SJacky Wang 52*f585d8a3SJacky Wang @Rule public final HiltAndroidRule rule = new HiltAndroidRule(this); 53*f585d8a3SJacky Wang 54*f585d8a3SJacky Wang @Test memberInjectedViewModelWithSavedState()55*f585d8a3SJacky Wang public void memberInjectedViewModelWithSavedState() { 56*f585d8a3SJacky Wang Intent intent = new Intent(getApplicationContext(), TestActivity.class); 57*f585d8a3SJacky Wang intent.putExtra(DATA_KEY, "test data"); 58*f585d8a3SJacky Wang try (ActivityScenario<TestActivity> scenario = ActivityScenario.launch(intent)) { 59*f585d8a3SJacky Wang scenario.onActivity( 60*f585d8a3SJacky Wang activity -> { 61*f585d8a3SJacky Wang String data = activity.myViewModel.handle.get(DATA_KEY); 62*f585d8a3SJacky Wang assertThat(data).isEqualTo("test data"); 63*f585d8a3SJacky Wang }); 64*f585d8a3SJacky Wang } 65*f585d8a3SJacky Wang } 66*f585d8a3SJacky Wang 67*f585d8a3SJacky Wang // Note that assertion of object not being yet injected is in the SuperActivity, while the 68*f585d8a3SJacky Wang // assertion in the scenario is confirming injection eventually does occur. 69*f585d8a3SJacky Wang @Test notYetMemberInjectedSuperActivity()70*f585d8a3SJacky Wang public void notYetMemberInjectedSuperActivity() { 71*f585d8a3SJacky Wang try (ActivityScenario<TestActivityWithSuperActivity> scenario = 72*f585d8a3SJacky Wang ActivityScenario.launch(TestActivityWithSuperActivity.class)) { 73*f585d8a3SJacky Wang scenario.onActivity(activity -> assertThat(activity.someObject).isNotNull()); 74*f585d8a3SJacky Wang } 75*f585d8a3SJacky Wang } 76*f585d8a3SJacky Wang 77*f585d8a3SJacky Wang @AndroidEntryPoint(FragmentActivity.class) 78*f585d8a3SJacky Wang public static final class TestActivity 79*f585d8a3SJacky Wang extends Hilt_ActivityInjectedSavedStateViewModelTest_TestActivity { 80*f585d8a3SJacky Wang @Inject MyViewModel myViewModel; 81*f585d8a3SJacky Wang } 82*f585d8a3SJacky Wang 83*f585d8a3SJacky Wang @AndroidEntryPoint(SuperActivity.class) 84*f585d8a3SJacky Wang public static final class TestActivityWithSuperActivity 85*f585d8a3SJacky Wang extends Hilt_ActivityInjectedSavedStateViewModelTest_TestActivityWithSuperActivity {} 86*f585d8a3SJacky Wang 87*f585d8a3SJacky Wang public static class SuperActivity extends FragmentActivity { 88*f585d8a3SJacky Wang @Inject Object someObject; 89*f585d8a3SJacky Wang 90*f585d8a3SJacky Wang @Override onCreate(Bundle savedInstanceState)91*f585d8a3SJacky Wang protected void onCreate(Bundle savedInstanceState) { 92*f585d8a3SJacky Wang assertThat(someObject).isNull(); // not yet injected 93*f585d8a3SJacky Wang super.onCreate(savedInstanceState); 94*f585d8a3SJacky Wang } 95*f585d8a3SJacky Wang } 96*f585d8a3SJacky Wang 97*f585d8a3SJacky Wang @Module 98*f585d8a3SJacky Wang @InstallIn(ActivityComponent.class) 99*f585d8a3SJacky Wang static final class MyViewModelModel { 100*f585d8a3SJacky Wang @Provides provideModel(FragmentActivity activity)101*f585d8a3SJacky Wang static MyViewModel provideModel(FragmentActivity activity) { 102*f585d8a3SJacky Wang return new ViewModelProvider(activity).get(MyViewModel.class); 103*f585d8a3SJacky Wang } 104*f585d8a3SJacky Wang 105*f585d8a3SJacky Wang @Provides provideObject()106*f585d8a3SJacky Wang static Object provideObject() { 107*f585d8a3SJacky Wang return new Object(); 108*f585d8a3SJacky Wang } 109*f585d8a3SJacky Wang } 110*f585d8a3SJacky Wang 111*f585d8a3SJacky Wang public static final class MyViewModel extends ViewModel { 112*f585d8a3SJacky Wang final SavedStateHandle handle; 113*f585d8a3SJacky Wang MyViewModel(SavedStateHandle handle)114*f585d8a3SJacky Wang public MyViewModel(SavedStateHandle handle) { 115*f585d8a3SJacky Wang this.handle = handle; 116*f585d8a3SJacky Wang } 117*f585d8a3SJacky Wang } 118*f585d8a3SJacky Wang } 119