1*f585d8a3SJacky Wang /* 2*f585d8a3SJacky Wang * Copyright (C) 2020 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 com.google.common.truth.Truth.assertThat; 20*f585d8a3SJacky Wang import static org.junit.Assert.assertThrows; 21*f585d8a3SJacky Wang 22*f585d8a3SJacky Wang import android.os.Build; 23*f585d8a3SJacky Wang import android.os.Bundle; 24*f585d8a3SJacky Wang import androidx.fragment.app.Fragment; 25*f585d8a3SJacky Wang import androidx.fragment.app.FragmentActivity; 26*f585d8a3SJacky Wang import androidx.annotation.Nullable; 27*f585d8a3SJacky Wang import androidx.lifecycle.SavedStateHandle; 28*f585d8a3SJacky Wang import androidx.lifecycle.ViewModel; 29*f585d8a3SJacky Wang import androidx.lifecycle.ViewModelProvider; 30*f585d8a3SJacky Wang import androidx.test.core.app.ActivityScenario; 31*f585d8a3SJacky Wang import androidx.test.ext.junit.runners.AndroidJUnit4; 32*f585d8a3SJacky Wang import dagger.assisted.Assisted; 33*f585d8a3SJacky Wang import dagger.assisted.AssistedFactory; 34*f585d8a3SJacky Wang import dagger.assisted.AssistedInject; 35*f585d8a3SJacky Wang import dagger.hilt.android.lifecycle.HiltViewModel; 36*f585d8a3SJacky Wang import dagger.hilt.android.lifecycle.HiltViewModelExtensions; 37*f585d8a3SJacky Wang import dagger.hilt.android.scopes.ViewModelScoped; 38*f585d8a3SJacky Wang import dagger.hilt.android.testing.HiltAndroidRule; 39*f585d8a3SJacky Wang import dagger.hilt.android.testing.HiltAndroidTest; 40*f585d8a3SJacky Wang import dagger.hilt.android.testing.HiltTestApplication; 41*f585d8a3SJacky Wang import javax.inject.Inject; 42*f585d8a3SJacky Wang import org.junit.Rule; 43*f585d8a3SJacky Wang import org.junit.Test; 44*f585d8a3SJacky Wang import org.junit.runner.RunWith; 45*f585d8a3SJacky Wang import org.robolectric.annotation.Config; 46*f585d8a3SJacky Wang 47*f585d8a3SJacky Wang @HiltAndroidTest 48*f585d8a3SJacky Wang @RunWith(AndroidJUnit4.class) 49*f585d8a3SJacky Wang // Robolectric requires Java9 to run API 29 and above, so use API 28 instead 50*f585d8a3SJacky Wang @Config(sdk = Build.VERSION_CODES.P, application = HiltTestApplication.class) 51*f585d8a3SJacky Wang public class ViewModelAssistedTest { 52*f585d8a3SJacky Wang 53*f585d8a3SJacky Wang @Rule public final HiltAndroidRule rule = new HiltAndroidRule(this); 54*f585d8a3SJacky Wang 55*f585d8a3SJacky Wang @Test testConfigChange()56*f585d8a3SJacky Wang public void testConfigChange() { 57*f585d8a3SJacky Wang try (ActivityScenario<TestConfigChangeActivity> scenario = 58*f585d8a3SJacky Wang ActivityScenario.launch(TestConfigChangeActivity.class)) { 59*f585d8a3SJacky Wang scenario.onActivity( 60*f585d8a3SJacky Wang activity -> { 61*f585d8a3SJacky Wang assertThat(activity.vm.one.bar).isNotNull(); 62*f585d8a3SJacky Wang assertThat(activity.vm.one.bar).isSameInstanceAs(activity.vm.two.bar); 63*f585d8a3SJacky Wang assertThat(activity.vm.s).isEqualTo("foo"); 64*f585d8a3SJacky Wang }); 65*f585d8a3SJacky Wang scenario.recreate(); 66*f585d8a3SJacky Wang scenario.onActivity( 67*f585d8a3SJacky Wang activity -> { 68*f585d8a3SJacky Wang // Check that we still get the same ViewModel instance after config change and the 69*f585d8a3SJacky Wang // passed assisted arg has no effect anymore. 70*f585d8a3SJacky Wang assertThat(activity.vm.s).isEqualTo("foo"); 71*f585d8a3SJacky Wang }); 72*f585d8a3SJacky Wang } 73*f585d8a3SJacky Wang } 74*f585d8a3SJacky Wang 75*f585d8a3SJacky Wang @Test testKeyedViewModels()76*f585d8a3SJacky Wang public void testKeyedViewModels() { 77*f585d8a3SJacky Wang try (ActivityScenario<TestKeyedViewModelActivity> scenario = 78*f585d8a3SJacky Wang ActivityScenario.launch(TestKeyedViewModelActivity.class)) { 79*f585d8a3SJacky Wang scenario.onActivity( 80*f585d8a3SJacky Wang activity -> { 81*f585d8a3SJacky Wang assertThat(activity.vm1.s).isEqualTo("foo"); 82*f585d8a3SJacky Wang assertThat(activity.vm2.s).isEqualTo("bar"); 83*f585d8a3SJacky Wang }); 84*f585d8a3SJacky Wang } 85*f585d8a3SJacky Wang } 86*f585d8a3SJacky Wang 87*f585d8a3SJacky Wang @Test testNoCreationCallbacks()88*f585d8a3SJacky Wang public void testNoCreationCallbacks() { 89*f585d8a3SJacky Wang Exception exception = 90*f585d8a3SJacky Wang assertThrows( 91*f585d8a3SJacky Wang IllegalStateException.class, 92*f585d8a3SJacky Wang () -> ActivityScenario.launch(TestNoCreationCallbacksActivity.class).close()); 93*f585d8a3SJacky Wang assertThat(exception) 94*f585d8a3SJacky Wang .hasMessageThat() 95*f585d8a3SJacky Wang .contains( 96*f585d8a3SJacky Wang "Found @HiltViewModel-annotated class" 97*f585d8a3SJacky Wang + " dagger.hilt.android.ViewModelAssistedTest$MyViewModel" 98*f585d8a3SJacky Wang + " using @AssistedInject but no creation callback was provided" 99*f585d8a3SJacky Wang + " in CreationExtras."); 100*f585d8a3SJacky Wang } 101*f585d8a3SJacky Wang 102*f585d8a3SJacky Wang @Test testNoFactory()103*f585d8a3SJacky Wang public void testNoFactory() { 104*f585d8a3SJacky Wang Exception exception = 105*f585d8a3SJacky Wang assertThrows( 106*f585d8a3SJacky Wang RuntimeException.class, 107*f585d8a3SJacky Wang () -> ActivityScenario.launch(TestNoFactoryActivity.class).close()); 108*f585d8a3SJacky Wang assertThat(exception) 109*f585d8a3SJacky Wang .hasMessageThat() 110*f585d8a3SJacky Wang .contains( 111*f585d8a3SJacky Wang "Found creation callback but class" 112*f585d8a3SJacky Wang + " dagger.hilt.android.ViewModelAssistedTest$MyInjectedViewModel does not have an" 113*f585d8a3SJacky Wang + " assisted factory specified in @HiltViewModel."); 114*f585d8a3SJacky Wang } 115*f585d8a3SJacky Wang 116*f585d8a3SJacky Wang @Test testFragmentArgs()117*f585d8a3SJacky Wang public void testFragmentArgs() { 118*f585d8a3SJacky Wang try (ActivityScenario<TestFragmentArgsActivity> scenario = 119*f585d8a3SJacky Wang ActivityScenario.launch(TestFragmentArgsActivity.class)) { 120*f585d8a3SJacky Wang scenario.onActivity( 121*f585d8a3SJacky Wang activity -> { 122*f585d8a3SJacky Wang TestFragment fragment = 123*f585d8a3SJacky Wang (TestFragment) activity.getSupportFragmentManager().findFragmentByTag("tag"); 124*f585d8a3SJacky Wang assertThat(fragment.vm.handle.<String>get("key")).isEqualTo("foobar"); 125*f585d8a3SJacky Wang }); 126*f585d8a3SJacky Wang } 127*f585d8a3SJacky Wang } 128*f585d8a3SJacky Wang 129*f585d8a3SJacky Wang @Test testIncompatibleFactories()130*f585d8a3SJacky Wang public void testIncompatibleFactories() { 131*f585d8a3SJacky Wang Exception exception = 132*f585d8a3SJacky Wang assertThrows( 133*f585d8a3SJacky Wang ClassCastException.class, 134*f585d8a3SJacky Wang () -> ActivityScenario.launch(TestIncompatibleFactoriesActivity.class).close()); 135*f585d8a3SJacky Wang assertThat(exception) 136*f585d8a3SJacky Wang .hasMessageThat() 137*f585d8a3SJacky Wang .contains( 138*f585d8a3SJacky Wang "class dagger.hilt.android.ViewModelAssistedTest_MyViewModel_Factory_Impl cannot be" 139*f585d8a3SJacky Wang + " cast to class" 140*f585d8a3SJacky Wang + " dagger.hilt.android.ViewModelAssistedTest$MyViewModel$AnotherFactory"); 141*f585d8a3SJacky Wang } 142*f585d8a3SJacky Wang 143*f585d8a3SJacky Wang @AndroidEntryPoint(FragmentActivity.class) 144*f585d8a3SJacky Wang public static class TestConfigChangeActivity 145*f585d8a3SJacky Wang extends Hilt_ViewModelAssistedTest_TestConfigChangeActivity { 146*f585d8a3SJacky Wang 147*f585d8a3SJacky Wang MyViewModel vm; 148*f585d8a3SJacky Wang 149*f585d8a3SJacky Wang @Override onCreate(@ullable Bundle savedInstanceState)150*f585d8a3SJacky Wang protected void onCreate(@Nullable Bundle savedInstanceState) { 151*f585d8a3SJacky Wang super.onCreate(savedInstanceState); 152*f585d8a3SJacky Wang if (savedInstanceState == null) { 153*f585d8a3SJacky Wang vm = 154*f585d8a3SJacky Wang new ViewModelProvider( 155*f585d8a3SJacky Wang getViewModelStore(), 156*f585d8a3SJacky Wang getDefaultViewModelProviderFactory(), 157*f585d8a3SJacky Wang HiltViewModelExtensions.withCreationCallback( 158*f585d8a3SJacky Wang getDefaultViewModelCreationExtras(), 159*f585d8a3SJacky Wang (MyViewModel.Factory factory) -> factory.create("foo"))) 160*f585d8a3SJacky Wang .get(MyViewModel.class); 161*f585d8a3SJacky Wang } else { 162*f585d8a3SJacky Wang vm = 163*f585d8a3SJacky Wang new ViewModelProvider( 164*f585d8a3SJacky Wang getViewModelStore(), 165*f585d8a3SJacky Wang getDefaultViewModelProviderFactory(), 166*f585d8a3SJacky Wang HiltViewModelExtensions.withCreationCallback( 167*f585d8a3SJacky Wang getDefaultViewModelCreationExtras(), 168*f585d8a3SJacky Wang (MyViewModel.Factory factory) -> factory.create("bar"))) 169*f585d8a3SJacky Wang .get(MyViewModel.class); 170*f585d8a3SJacky Wang } 171*f585d8a3SJacky Wang } 172*f585d8a3SJacky Wang } 173*f585d8a3SJacky Wang 174*f585d8a3SJacky Wang @AndroidEntryPoint(FragmentActivity.class) 175*f585d8a3SJacky Wang public static class TestKeyedViewModelActivity 176*f585d8a3SJacky Wang extends Hilt_ViewModelAssistedTest_TestKeyedViewModelActivity { 177*f585d8a3SJacky Wang 178*f585d8a3SJacky Wang MyViewModel vm1; 179*f585d8a3SJacky Wang MyViewModel vm2; 180*f585d8a3SJacky Wang 181*f585d8a3SJacky Wang @Override onCreate(@ullable Bundle savedInstanceState)182*f585d8a3SJacky Wang protected void onCreate(@Nullable Bundle savedInstanceState) { 183*f585d8a3SJacky Wang super.onCreate(savedInstanceState); 184*f585d8a3SJacky Wang vm1 = 185*f585d8a3SJacky Wang new ViewModelProvider( 186*f585d8a3SJacky Wang getViewModelStore(), 187*f585d8a3SJacky Wang getDefaultViewModelProviderFactory(), 188*f585d8a3SJacky Wang HiltViewModelExtensions.withCreationCallback( 189*f585d8a3SJacky Wang getDefaultViewModelCreationExtras(), 190*f585d8a3SJacky Wang (MyViewModel.Factory factory) -> factory.create("foo"))) 191*f585d8a3SJacky Wang .get("a", MyViewModel.class); 192*f585d8a3SJacky Wang 193*f585d8a3SJacky Wang vm2 = 194*f585d8a3SJacky Wang new ViewModelProvider( 195*f585d8a3SJacky Wang getViewModelStore(), 196*f585d8a3SJacky Wang getDefaultViewModelProviderFactory(), 197*f585d8a3SJacky Wang HiltViewModelExtensions.withCreationCallback( 198*f585d8a3SJacky Wang getDefaultViewModelCreationExtras(), 199*f585d8a3SJacky Wang (MyViewModel.Factory factory) -> factory.create("bar"))) 200*f585d8a3SJacky Wang .get("b", MyViewModel.class); 201*f585d8a3SJacky Wang } 202*f585d8a3SJacky Wang } 203*f585d8a3SJacky Wang 204*f585d8a3SJacky Wang @AndroidEntryPoint(FragmentActivity.class) 205*f585d8a3SJacky Wang public static class TestNoCreationCallbacksActivity 206*f585d8a3SJacky Wang extends Hilt_ViewModelAssistedTest_TestNoCreationCallbacksActivity { 207*f585d8a3SJacky Wang 208*f585d8a3SJacky Wang MyViewModel vm; 209*f585d8a3SJacky Wang 210*f585d8a3SJacky Wang @Override onCreate(@ullable Bundle savedInstanceState)211*f585d8a3SJacky Wang protected void onCreate(@Nullable Bundle savedInstanceState) { 212*f585d8a3SJacky Wang super.onCreate(savedInstanceState); 213*f585d8a3SJacky Wang vm = new ViewModelProvider(this).get(MyViewModel.class); 214*f585d8a3SJacky Wang } 215*f585d8a3SJacky Wang } 216*f585d8a3SJacky Wang 217*f585d8a3SJacky Wang @AndroidEntryPoint(FragmentActivity.class) 218*f585d8a3SJacky Wang public static class TestNoFactoryActivity 219*f585d8a3SJacky Wang extends Hilt_ViewModelAssistedTest_TestNoFactoryActivity { 220*f585d8a3SJacky Wang 221*f585d8a3SJacky Wang MyInjectedViewModel vm; 222*f585d8a3SJacky Wang 223*f585d8a3SJacky Wang @Override onCreate(@ullable Bundle savedInstanceState)224*f585d8a3SJacky Wang protected void onCreate(@Nullable Bundle savedInstanceState) { 225*f585d8a3SJacky Wang super.onCreate(savedInstanceState); 226*f585d8a3SJacky Wang 227*f585d8a3SJacky Wang vm = 228*f585d8a3SJacky Wang new ViewModelProvider( 229*f585d8a3SJacky Wang getViewModelStore(), 230*f585d8a3SJacky Wang getDefaultViewModelProviderFactory(), 231*f585d8a3SJacky Wang HiltViewModelExtensions.withCreationCallback( 232*f585d8a3SJacky Wang getDefaultViewModelCreationExtras(), 233*f585d8a3SJacky Wang (MyViewModel.Factory factory) -> factory.create("bar"))) 234*f585d8a3SJacky Wang .get(MyInjectedViewModel.class); 235*f585d8a3SJacky Wang } 236*f585d8a3SJacky Wang } 237*f585d8a3SJacky Wang 238*f585d8a3SJacky Wang @AndroidEntryPoint(FragmentActivity.class) 239*f585d8a3SJacky Wang public static class TestFragmentArgsActivity 240*f585d8a3SJacky Wang extends Hilt_ViewModelAssistedTest_TestFragmentArgsActivity { 241*f585d8a3SJacky Wang @Override onCreate(@ullable Bundle savedInstanceState)242*f585d8a3SJacky Wang protected void onCreate(@Nullable Bundle savedInstanceState) { 243*f585d8a3SJacky Wang super.onCreate(savedInstanceState); 244*f585d8a3SJacky Wang if (savedInstanceState == null) { 245*f585d8a3SJacky Wang Fragment f = 246*f585d8a3SJacky Wang getSupportFragmentManager() 247*f585d8a3SJacky Wang .getFragmentFactory() 248*f585d8a3SJacky Wang .instantiate(TestFragment.class.getClassLoader(), TestFragment.class.getName()); 249*f585d8a3SJacky Wang Bundle b = new Bundle(); 250*f585d8a3SJacky Wang b.putString("key", "foobar"); 251*f585d8a3SJacky Wang f.setArguments(b); 252*f585d8a3SJacky Wang getSupportFragmentManager().beginTransaction().add(0, f, "tag").commitNow(); 253*f585d8a3SJacky Wang } 254*f585d8a3SJacky Wang } 255*f585d8a3SJacky Wang } 256*f585d8a3SJacky Wang 257*f585d8a3SJacky Wang @AndroidEntryPoint(FragmentActivity.class) 258*f585d8a3SJacky Wang public static class TestIncompatibleFactoriesActivity 259*f585d8a3SJacky Wang extends Hilt_ViewModelAssistedTest_TestIncompatibleFactoriesActivity { 260*f585d8a3SJacky Wang 261*f585d8a3SJacky Wang MyViewModel vm; 262*f585d8a3SJacky Wang 263*f585d8a3SJacky Wang @Override onCreate(@ullable Bundle savedInstanceState)264*f585d8a3SJacky Wang protected void onCreate(@Nullable Bundle savedInstanceState) { 265*f585d8a3SJacky Wang super.onCreate(savedInstanceState); 266*f585d8a3SJacky Wang vm = 267*f585d8a3SJacky Wang new ViewModelProvider( 268*f585d8a3SJacky Wang getViewModelStore(), 269*f585d8a3SJacky Wang getDefaultViewModelProviderFactory(), 270*f585d8a3SJacky Wang HiltViewModelExtensions.withCreationCallback( 271*f585d8a3SJacky Wang getDefaultViewModelCreationExtras(), 272*f585d8a3SJacky Wang (MyViewModel.AnotherFactory factory) -> factory.create("foo"))) 273*f585d8a3SJacky Wang .get(MyViewModel.class); 274*f585d8a3SJacky Wang } 275*f585d8a3SJacky Wang } 276*f585d8a3SJacky Wang 277*f585d8a3SJacky Wang @AndroidEntryPoint(Fragment.class) 278*f585d8a3SJacky Wang public static class TestFragment extends Hilt_ViewModelAssistedTest_TestFragment { 279*f585d8a3SJacky Wang 280*f585d8a3SJacky Wang MyViewModel vm; 281*f585d8a3SJacky Wang 282*f585d8a3SJacky Wang @Override onCreate(@ullable Bundle bundle)283*f585d8a3SJacky Wang public void onCreate(@Nullable Bundle bundle) { 284*f585d8a3SJacky Wang super.onCreate(bundle); 285*f585d8a3SJacky Wang vm = 286*f585d8a3SJacky Wang new ViewModelProvider( 287*f585d8a3SJacky Wang getViewModelStore(), 288*f585d8a3SJacky Wang getDefaultViewModelProviderFactory(), 289*f585d8a3SJacky Wang HiltViewModelExtensions.withCreationCallback( 290*f585d8a3SJacky Wang getDefaultViewModelCreationExtras(), 291*f585d8a3SJacky Wang (MyViewModel.Factory factory) -> factory.create("foo"))) 292*f585d8a3SJacky Wang .get(MyViewModel.class); 293*f585d8a3SJacky Wang } 294*f585d8a3SJacky Wang } 295*f585d8a3SJacky Wang 296*f585d8a3SJacky Wang @HiltViewModel(assistedFactory = MyViewModel.Factory.class) 297*f585d8a3SJacky Wang static class MyViewModel extends ViewModel { 298*f585d8a3SJacky Wang 299*f585d8a3SJacky Wang final DependsOnBarOne one; 300*f585d8a3SJacky Wang final DependsOnBarTwo two; 301*f585d8a3SJacky Wang final SavedStateHandle handle; 302*f585d8a3SJacky Wang final String s; 303*f585d8a3SJacky Wang boolean cleared = false; 304*f585d8a3SJacky Wang 305*f585d8a3SJacky Wang @AssistedInject MyViewModel( DependsOnBarOne one, DependsOnBarTwo two, ViewModelLifecycle lifecycle, SavedStateHandle handle, @Assisted String s)306*f585d8a3SJacky Wang MyViewModel( 307*f585d8a3SJacky Wang DependsOnBarOne one, 308*f585d8a3SJacky Wang DependsOnBarTwo two, 309*f585d8a3SJacky Wang ViewModelLifecycle lifecycle, 310*f585d8a3SJacky Wang SavedStateHandle handle, 311*f585d8a3SJacky Wang @Assisted String s) { 312*f585d8a3SJacky Wang this.one = one; 313*f585d8a3SJacky Wang this.two = two; 314*f585d8a3SJacky Wang this.s = s; 315*f585d8a3SJacky Wang this.handle = handle; 316*f585d8a3SJacky Wang lifecycle.addOnClearedListener(() -> cleared = true); 317*f585d8a3SJacky Wang } 318*f585d8a3SJacky Wang 319*f585d8a3SJacky Wang @AssistedFactory 320*f585d8a3SJacky Wang interface Factory { create(String s)321*f585d8a3SJacky Wang MyViewModel create(String s); 322*f585d8a3SJacky Wang } 323*f585d8a3SJacky Wang 324*f585d8a3SJacky Wang @AssistedFactory 325*f585d8a3SJacky Wang interface AnotherFactory { create(String s)326*f585d8a3SJacky Wang MyViewModel create(String s); 327*f585d8a3SJacky Wang } 328*f585d8a3SJacky Wang } 329*f585d8a3SJacky Wang 330*f585d8a3SJacky Wang @HiltViewModel 331*f585d8a3SJacky Wang static class MyInjectedViewModel extends ViewModel { 332*f585d8a3SJacky Wang 333*f585d8a3SJacky Wang final DependsOnBarOne one; 334*f585d8a3SJacky Wang final DependsOnBarTwo two; 335*f585d8a3SJacky Wang final SavedStateHandle handle; 336*f585d8a3SJacky Wang boolean cleared = false; 337*f585d8a3SJacky Wang 338*f585d8a3SJacky Wang @Inject MyInjectedViewModel( DependsOnBarOne one, DependsOnBarTwo two, ViewModelLifecycle lifecycle, SavedStateHandle handle)339*f585d8a3SJacky Wang MyInjectedViewModel( 340*f585d8a3SJacky Wang DependsOnBarOne one, 341*f585d8a3SJacky Wang DependsOnBarTwo two, 342*f585d8a3SJacky Wang ViewModelLifecycle lifecycle, 343*f585d8a3SJacky Wang SavedStateHandle handle) { 344*f585d8a3SJacky Wang this.one = one; 345*f585d8a3SJacky Wang this.two = two; 346*f585d8a3SJacky Wang this.handle = handle; 347*f585d8a3SJacky Wang lifecycle.addOnClearedListener(() -> cleared = true); 348*f585d8a3SJacky Wang } 349*f585d8a3SJacky Wang } 350*f585d8a3SJacky Wang 351*f585d8a3SJacky Wang @ViewModelScoped 352*f585d8a3SJacky Wang static class Bar { 353*f585d8a3SJacky Wang @Inject Bar()354*f585d8a3SJacky Wang Bar() {} 355*f585d8a3SJacky Wang } 356*f585d8a3SJacky Wang 357*f585d8a3SJacky Wang static class DependsOnBarOne { 358*f585d8a3SJacky Wang final Bar bar; 359*f585d8a3SJacky Wang 360*f585d8a3SJacky Wang @Inject DependsOnBarOne(Bar bar)361*f585d8a3SJacky Wang DependsOnBarOne(Bar bar) { 362*f585d8a3SJacky Wang this.bar = bar; 363*f585d8a3SJacky Wang } 364*f585d8a3SJacky Wang } 365*f585d8a3SJacky Wang 366*f585d8a3SJacky Wang static class DependsOnBarTwo { 367*f585d8a3SJacky Wang final Bar bar; 368*f585d8a3SJacky Wang 369*f585d8a3SJacky Wang @Inject DependsOnBarTwo(Bar bar)370*f585d8a3SJacky Wang DependsOnBarTwo(Bar bar) { 371*f585d8a3SJacky Wang this.bar = bar; 372*f585d8a3SJacky Wang } 373*f585d8a3SJacky Wang } 374*f585d8a3SJacky Wang } 375