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