xref: /aosp_15_r20/external/dagger2/java/dagger/android/AndroidInjector.java (revision f585d8a307d0621d6060bd7e80091fdcbf94fe27)
1*f585d8a3SJacky Wang /*
2*f585d8a3SJacky Wang  * Copyright (C) 2016 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.android;
18*f585d8a3SJacky Wang 
19*f585d8a3SJacky Wang import dagger.BindsInstance;
20*f585d8a3SJacky Wang import dagger.internal.Beta;
21*f585d8a3SJacky Wang 
22*f585d8a3SJacky Wang /**
23*f585d8a3SJacky Wang  * Performs members-injection for a concrete subtype of a <a
24*f585d8a3SJacky Wang  * href="https://developer.android.com/guide/components/">core Android type</a> (e.g., {@link
25*f585d8a3SJacky Wang  * android.app.Activity} or {@link android.app.Fragment}).
26*f585d8a3SJacky Wang  *
27*f585d8a3SJacky Wang  * <p>Commonly implemented by {@link dagger.Subcomponent}-annotated types whose {@link
28*f585d8a3SJacky Wang  * dagger.Subcomponent.Factory} extends {@link Factory}.
29*f585d8a3SJacky Wang  *
30*f585d8a3SJacky Wang  * @param <T> a concrete subtype of a core Android type
31*f585d8a3SJacky Wang  * @see AndroidInjection
32*f585d8a3SJacky Wang  * @see DispatchingAndroidInjector
33*f585d8a3SJacky Wang  * @see ContributesAndroidInjector
34*f585d8a3SJacky Wang  */
35*f585d8a3SJacky Wang @Beta
36*f585d8a3SJacky Wang public interface AndroidInjector<T> {
37*f585d8a3SJacky Wang 
38*f585d8a3SJacky Wang   /** Injects the members of {@code instance}. */
inject(T instance)39*f585d8a3SJacky Wang   void inject(T instance);
40*f585d8a3SJacky Wang 
41*f585d8a3SJacky Wang   /**
42*f585d8a3SJacky Wang    * Creates {@link AndroidInjector}s for a concrete subtype of a core Android type.
43*f585d8a3SJacky Wang    *
44*f585d8a3SJacky Wang    * @param <T> the concrete type to be injected
45*f585d8a3SJacky Wang    */
46*f585d8a3SJacky Wang   interface Factory<T> {
47*f585d8a3SJacky Wang     /**
48*f585d8a3SJacky Wang      * Creates an {@link AndroidInjector} for {@code instance}. This should be the same instance
49*f585d8a3SJacky Wang      * that will be passed to {@link #inject(Object)}.
50*f585d8a3SJacky Wang      */
create(@indsInstance T instance)51*f585d8a3SJacky Wang     AndroidInjector<T> create(@BindsInstance T instance);
52*f585d8a3SJacky Wang   }
53*f585d8a3SJacky Wang 
54*f585d8a3SJacky Wang   /**
55*f585d8a3SJacky Wang    * An adapter that lets the common {@link dagger.Subcomponent.Builder} pattern implement {@link
56*f585d8a3SJacky Wang    * Factory}.
57*f585d8a3SJacky Wang    *
58*f585d8a3SJacky Wang    * @param <T> the concrete type to be injected
59*f585d8a3SJacky Wang    * @deprecated Prefer {@link Factory} now that components can have {@link dagger.Component.Factory
60*f585d8a3SJacky Wang    *     factories} instead of builders
61*f585d8a3SJacky Wang    */
62*f585d8a3SJacky Wang   @Deprecated
63*f585d8a3SJacky Wang   abstract class Builder<T> implements AndroidInjector.Factory<T> {
64*f585d8a3SJacky Wang     @Override
create(T instance)65*f585d8a3SJacky Wang     public final AndroidInjector<T> create(T instance) {
66*f585d8a3SJacky Wang       seedInstance(instance);
67*f585d8a3SJacky Wang       return build();
68*f585d8a3SJacky Wang     }
69*f585d8a3SJacky Wang 
70*f585d8a3SJacky Wang     /**
71*f585d8a3SJacky Wang      * Provides {@code instance} to be used in the binding graph of the built {@link
72*f585d8a3SJacky Wang      * AndroidInjector}. By default, this is used as a {@link BindsInstance} method, but it may be
73*f585d8a3SJacky Wang      * overridden to provide any modules which need a reference to the activity.
74*f585d8a3SJacky Wang      *
75*f585d8a3SJacky Wang      * <p>This should be the same instance that will be passed to {@link #inject(Object)}.
76*f585d8a3SJacky Wang      */
77*f585d8a3SJacky Wang     @BindsInstance
seedInstance(T instance)78*f585d8a3SJacky Wang     public abstract void seedInstance(T instance);
79*f585d8a3SJacky Wang 
80*f585d8a3SJacky Wang     /** Returns a newly-constructed {@link AndroidInjector}. */
build()81*f585d8a3SJacky Wang     public abstract AndroidInjector<T> build();
82*f585d8a3SJacky Wang   }
83*f585d8a3SJacky Wang }
84