xref: /aosp_15_r20/external/dagger2/javatests/dagger/hilt/android/ViewModelAssistedTest.java (revision f585d8a307d0621d6060bd7e80091fdcbf94fe27)
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