You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
3.1 KiB
83 lines
3.1 KiB
7 months ago
|
/*
|
||
|
* Copyright (C) 2017 The Dagger Authors.
|
||
|
*
|
||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
* you may not use this file except in compliance with the License.
|
||
|
* You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
* See the License for the specific language governing permissions and
|
||
|
* limitations under the License.
|
||
|
*/
|
||
|
|
||
|
package dagger.android;
|
||
|
|
||
|
import android.app.Application;
|
||
|
import android.content.ContentProvider;
|
||
|
import com.google.errorprone.annotations.ForOverride;
|
||
|
import dagger.internal.Beta;
|
||
|
import javax.inject.Inject;
|
||
|
|
||
|
/**
|
||
|
* An {@link Application} that injects its members and can be used to inject objects that the
|
||
|
* Android framework instantiates, such as Activitys, Fragments, or Services. Injection is performed
|
||
|
* in {@link #onCreate()} or the first call to {@link AndroidInjection#inject(ContentProvider)},
|
||
|
* whichever happens first.
|
||
|
*/
|
||
|
@Beta
|
||
|
public abstract class DaggerApplication extends Application implements HasAndroidInjector {
|
||
|
@Inject volatile DispatchingAndroidInjector<Object> androidInjector;
|
||
|
|
||
|
@Override
|
||
|
public void onCreate() {
|
||
|
super.onCreate();
|
||
|
injectIfNecessary();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Implementations should return an {@link AndroidInjector} for the concrete {@link
|
||
|
* DaggerApplication}. Typically, that injector is a {@link dagger.Component}.
|
||
|
*/
|
||
|
@ForOverride
|
||
|
protected abstract AndroidInjector<? extends DaggerApplication> applicationInjector();
|
||
|
|
||
|
/**
|
||
|
* Lazily injects the {@link DaggerApplication}'s members. Injection cannot be performed in {@link
|
||
|
* Application#onCreate()} since {@link android.content.ContentProvider}s' {@link
|
||
|
* android.content.ContentProvider#onCreate() onCreate()} method will be called first and might
|
||
|
* need injected members on the application. Injection is not performed in the constructor, as
|
||
|
* that may result in members-injection methods being called before the constructor has completed,
|
||
|
* allowing for a partially-constructed instance to escape.
|
||
|
*/
|
||
|
private void injectIfNecessary() {
|
||
|
if (androidInjector == null) {
|
||
|
synchronized (this) {
|
||
|
if (androidInjector == null) {
|
||
|
@SuppressWarnings("unchecked")
|
||
|
AndroidInjector<DaggerApplication> applicationInjector =
|
||
|
(AndroidInjector<DaggerApplication>) applicationInjector();
|
||
|
applicationInjector.inject(this);
|
||
|
if (androidInjector == null) {
|
||
|
throw new IllegalStateException(
|
||
|
"The AndroidInjector returned from applicationInjector() did not inject the "
|
||
|
+ "DaggerApplication");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public AndroidInjector<Object> androidInjector() {
|
||
|
// injectIfNecessary should already be called unless we are about to inject a ContentProvider,
|
||
|
// which can happen before Application.onCreate()
|
||
|
injectIfNecessary();
|
||
|
|
||
|
return androidInjector;
|
||
|
}
|
||
|
}
|