Dagger: Remove references to deprecated android.app.Fragment

Created on 10 Aug 2018  路  6Comments  路  Source: google/dagger

Description:

Using my project here: https://github.com/jaredsburrows/android-gif-example, setting the compileSdk and targetSdk to 28 and the compiling you will see that android.app.Fragment is now deprecated. It seems that the DaggerAppComponent relies on android.app.Fragment instead of the support Fragments.

How can I prevent these errors without turning off warnings as errors?

DaggerAppComponent:

// Generated by Dagger (https://google.github.io/dagger).
package burrows.apps.example.gif.di.component;

import android.app.Activity;
import android.app.Application;
import android.app.Fragment;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.ContentProvider;
import burrows.apps.example.gif.App;
import burrows.apps.example.gif.SchedulerProvider;
import burrows.apps.example.gif.data.ImageService;
import burrows.apps.example.gif.data.RiffsyApiClient;
import burrows.apps.example.gif.di.module.ActivityBuilderModule_ProvidesMainActivity;
import burrows.apps.example.gif.di.module.LeakCanaryModule;
import burrows.apps.example.gif.di.module.LeakCanaryModule_ProvidesRefWatcherFactory;
import burrows.apps.example.gif.di.module.NetModule;
import burrows.apps.example.gif.di.module.NetModule_ProvidesCacheFactory;
import burrows.apps.example.gif.di.module.NetModule_ProvidesMoshiFactory;
import burrows.apps.example.gif.di.module.NetModule_ProvidesOkHttpClientFactory;
import burrows.apps.example.gif.di.module.NetModule_ProvidesRetrofitFactory;
import burrows.apps.example.gif.di.module.RiffsyModule;
import burrows.apps.example.gif.di.module.RiffsyModule_ProvidesRiffsyApiFactory;
import burrows.apps.example.gif.giflist.GifActivity;
import burrows.apps.example.gif.giflist.GifActivity_MembersInjector;
import burrows.apps.example.gif.giflist.GifPresenter;
import com.squareup.leakcanary.RefWatcher;
import dagger.android.AndroidInjector;
import dagger.android.DaggerApplication_MembersInjector;
import dagger.android.DispatchingAndroidInjector;
import dagger.android.DispatchingAndroidInjector_Factory;
import dagger.android.support.DaggerAppCompatActivity_MembersInjector;
import dagger.internal.Preconditions;
import java.util.Collections;
import java.util.Map;
import javax.inject.Provider;
import okhttp3.Cache;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;

public final class DaggerAppComponent implements AppComponent {
  private Application application;

  private LeakCanaryModule leakCanaryModule;

  private Provider<ActivityBuilderModule_ProvidesMainActivity.GifActivitySubcomponent.Builder>
      gifActivitySubcomponentBuilderProvider;

  private DaggerAppComponent(Builder builder) {
    initialize(builder);
  }

  public static AppComponent.Builder builder() {
    return new Builder();
  }

  private Map<Class<? extends Activity>, Provider<AndroidInjector.Factory<? extends Activity>>>
      getMapOfClassOfAndProviderOfFactoryOf() {
    return Collections
        .<Class<? extends Activity>, Provider<AndroidInjector.Factory<? extends Activity>>>
            singletonMap(GifActivity.class, (Provider) gifActivitySubcomponentBuilderProvider);
  }

  private DispatchingAndroidInjector<Activity> getDispatchingAndroidInjectorOfActivity() {
    return DispatchingAndroidInjector_Factory.newDispatchingAndroidInjector(
        getMapOfClassOfAndProviderOfFactoryOf(),
        Collections.<String, Provider<AndroidInjector.Factory<? extends Activity>>>emptyMap());
  }

  private DispatchingAndroidInjector<BroadcastReceiver>
      getDispatchingAndroidInjectorOfBroadcastReceiver() {
    return DispatchingAndroidInjector_Factory.newDispatchingAndroidInjector(
        Collections
            .<Class<? extends BroadcastReceiver>,
                Provider<AndroidInjector.Factory<? extends BroadcastReceiver>>>
                emptyMap(),
        Collections
            .<String, Provider<AndroidInjector.Factory<? extends BroadcastReceiver>>>emptyMap());
  }

  private DispatchingAndroidInjector<Fragment> getDispatchingAndroidInjectorOfFragment() {
    return DispatchingAndroidInjector_Factory.newDispatchingAndroidInjector(
        Collections
            .<Class<? extends Fragment>, Provider<AndroidInjector.Factory<? extends Fragment>>>
                emptyMap(),
        Collections.<String, Provider<AndroidInjector.Factory<? extends Fragment>>>emptyMap());
  }

  private DispatchingAndroidInjector<Service> getDispatchingAndroidInjectorOfService() {
    return DispatchingAndroidInjector_Factory.newDispatchingAndroidInjector(
        Collections
            .<Class<? extends Service>, Provider<AndroidInjector.Factory<? extends Service>>>
                emptyMap(),
        Collections.<String, Provider<AndroidInjector.Factory<? extends Service>>>emptyMap());
  }

  private DispatchingAndroidInjector<ContentProvider>
      getDispatchingAndroidInjectorOfContentProvider() {
    return DispatchingAndroidInjector_Factory.newDispatchingAndroidInjector(
        Collections
            .<Class<? extends ContentProvider>,
                Provider<AndroidInjector.Factory<? extends ContentProvider>>>
                emptyMap(),
        Collections
            .<String, Provider<AndroidInjector.Factory<? extends ContentProvider>>>emptyMap());
  }

  @SuppressWarnings("unchecked")
  private void initialize(final Builder builder) {
    this.gifActivitySubcomponentBuilderProvider =
        new Provider<ActivityBuilderModule_ProvidesMainActivity.GifActivitySubcomponent.Builder>() {
          @Override
          public ActivityBuilderModule_ProvidesMainActivity.GifActivitySubcomponent.Builder get() {
            return new GifActivitySubcomponentBuilder();
          }
        };
    this.application = builder.application;
    this.leakCanaryModule = builder.leakCanaryModule;
  }

  @Override
  public void inject(App arg0) {
    injectApp(arg0);
  }

  private App injectApp(App instance) {
    DaggerApplication_MembersInjector.injectActivityInjector(
        instance, getDispatchingAndroidInjectorOfActivity());
    DaggerApplication_MembersInjector.injectBroadcastReceiverInjector(
        instance, getDispatchingAndroidInjectorOfBroadcastReceiver());
    DaggerApplication_MembersInjector.injectFragmentInjector(
        instance, getDispatchingAndroidInjectorOfFragment());
    DaggerApplication_MembersInjector.injectServiceInjector(
        instance, getDispatchingAndroidInjectorOfService());
    DaggerApplication_MembersInjector.injectContentProviderInjector(
        instance, getDispatchingAndroidInjectorOfContentProvider());
    DaggerApplication_MembersInjector.injectSetInjected(instance);
    return instance;
  }

  private static final class Builder implements AppComponent.Builder {
    private LeakCanaryModule leakCanaryModule;

    private Application application;

    @Override
    public AppComponent build() {
      if (leakCanaryModule == null) {
        this.leakCanaryModule = new LeakCanaryModule();
      }
      if (application == null) {
        throw new IllegalStateException(Application.class.getCanonicalName() + " must be set");
      }
      return new DaggerAppComponent(this);
    }

    @Override
    public Builder application(Application application) {
      this.application = Preconditions.checkNotNull(application);
      return this;
    }
  }

  private final class GifActivitySubcomponentBuilder
      extends ActivityBuilderModule_ProvidesMainActivity.GifActivitySubcomponent.Builder {
    private RiffsyModule riffsyModule;

    private NetModule netModule;

    private GifActivity seedInstance;

    @Override
    public ActivityBuilderModule_ProvidesMainActivity.GifActivitySubcomponent build() {
      if (riffsyModule == null) {
        this.riffsyModule = new RiffsyModule();
      }
      if (netModule == null) {
        this.netModule = new NetModule();
      }
      if (seedInstance == null) {
        throw new IllegalStateException(GifActivity.class.getCanonicalName() + " must be set");
      }
      return new GifActivitySubcomponentImpl(this);
    }

    @Override
    public void seedInstance(GifActivity arg0) {
      this.seedInstance = Preconditions.checkNotNull(arg0);
    }
  }

  private final class GifActivitySubcomponentImpl
      implements ActivityBuilderModule_ProvidesMainActivity.GifActivitySubcomponent {
    private RiffsyModule riffsyModule;

    private NetModule netModule;

    private GifActivitySubcomponentImpl(GifActivitySubcomponentBuilder builder) {
      initialize(builder);
    }

    private DispatchingAndroidInjector<android.support.v4.app.Fragment>
        getDispatchingAndroidInjectorOfFragment() {
      return DispatchingAndroidInjector_Factory.newDispatchingAndroidInjector(
          Collections
              .<Class<? extends android.support.v4.app.Fragment>,
                  Provider<AndroidInjector.Factory<? extends android.support.v4.app.Fragment>>>
                  emptyMap(),
          Collections
              .<String,
                  Provider<AndroidInjector.Factory<? extends android.support.v4.app.Fragment>>>
                  emptyMap());
    }

    private Cache getCache() {
      return NetModule_ProvidesCacheFactory.proxyProvidesCache(
          netModule, DaggerAppComponent.this.application);
    }

    private OkHttpClient getOkHttpClient() {
      return NetModule_ProvidesOkHttpClientFactory.proxyProvidesOkHttpClient(netModule, getCache());
    }

    private Retrofit.Builder getBuilder() {
      return NetModule_ProvidesRetrofitFactory.proxyProvidesRetrofit(
          netModule,
          NetModule_ProvidesMoshiFactory.proxyProvidesMoshi(netModule),
          getOkHttpClient());
    }

    private RiffsyApiClient getRiffsyApiClient() {
      return RiffsyModule_ProvidesRiffsyApiFactory.proxyProvidesRiffsyApi(
          riffsyModule, getBuilder());
    }

    private GifPresenter getGifPresenter() {
      return new GifPresenter(getRiffsyApiClient(), new SchedulerProvider());
    }

    private RefWatcher getRefWatcher() {
      return LeakCanaryModule_ProvidesRefWatcherFactory.proxyProvidesRefWatcher(
          DaggerAppComponent.this.leakCanaryModule, DaggerAppComponent.this.application);
    }

    private ImageService getImageService() {
      return new ImageService(DaggerAppComponent.this.application);
    }

    @SuppressWarnings("unchecked")
    private void initialize(final GifActivitySubcomponentBuilder builder) {
      this.riffsyModule = builder.riffsyModule;
      this.netModule = builder.netModule;
    }

    @Override
    public void inject(GifActivity arg0) {
      injectGifActivity(arg0);
    }

    private GifActivity injectGifActivity(GifActivity instance) {
      DaggerAppCompatActivity_MembersInjector.injectSupportFragmentInjector(
          instance, getDispatchingAndroidInjectorOfFragment());
      DaggerAppCompatActivity_MembersInjector.injectFrameworkFragmentInjector(
          instance, DaggerAppComponent.this.getDispatchingAndroidInjectorOfFragment());
      GifActivity_MembersInjector.injectPresenter(instance, getGifPresenter());
      GifActivity_MembersInjector.injectRefWatcher(instance, getRefWatcher());
      GifActivity_MembersInjector.injectRepository(instance, getImageService());
      return instance;
    }
  }
}

Error output(warnings as errors):

$ gradlew connectedDebugAndroidTest testDebug

> Task :compileDebugJavaWithJavac FAILED
/<>/debug/burrows/apps/example/gif/di/component/DaggerAppComponent.java:6: warning: [deprecation] Fragment in android.app has been deprecated
import android.app.Fragment;
                  ^
/<>/debug/burrows/apps/example/gif/App_MembersInjector.java:5: warning: [deprecation] Fragment in android.app has been deprecated
import android.app.Fragment;
                  ^
error: warnings found and -Werror specified
/<>/debug/burrows/apps/example/gif/di/component/DaggerAppComponent.java:81: warning: [deprecation] Fragment in android.app has been deprecated
  private DispatchingAndroidInjector<Fragment> getDispatchingAndroidInjectorOfFragment() {
                                     ^
/<>/debug/burrows/apps/example/gif/di/component/DaggerAppComponent.java:84: warning: [deprecation] Fragment in android.app has been deprecated
            .<Class<? extends Fragment>, Provider<AndroidInjector.Factory<? extends Fragment>>>
                              ^
/<>/debug/burrows/apps/example/gif/di/component/DaggerAppComponent.java:84: warning: [deprecation] Fragment in android.app has been deprecated
            .<Class<? extends Fragment>, Provider<AndroidInjector.Factory<? extends Fragment>>>
                                                                                    ^
/<>/debug/burrows/apps/example/gif/di/component/DaggerAppComponent.java:86: warning: [deprecation] Fragment in android.app has been deprecated
        Collections.<String, Provider<AndroidInjector.Factory<? extends Fragment>>>emptyMap());
                                                                        ^
/<>/debug/burrows/apps/example/gif/App_MembersInjector.java:20: warning: [deprecation] Fragment in android.app has been deprecated
  private final Provider<DispatchingAndroidInjector<Fragment>> fragmentInjectorProvider;
                                                    ^
/<>/debug/burrows/apps/example/gif/App_MembersInjector.java:30: warning: [deprecation] Fragment in android.app has been deprecated
      Provider<DispatchingAndroidInjector<Fragment>> fragmentInjectorProvider,
                                          ^
/<>/debug/burrows/apps/example/gif/App_MembersInjector.java:43: warning: [deprecation] Fragment in android.app has been deprecated
      Provider<DispatchingAndroidInjector<Fragment>> fragmentInjectorProvider,
                                          ^
/<>/debug/burrows/apps/example/gif/giflist/GifActivity_MembersInjector.java:15: warning: [deprecation] Fragment in android.app has been deprecated
  private final Provider<DispatchingAndroidInjector<android.app.Fragment>>
                                                               ^
/<>/debug/burrows/apps/example/gif/giflist/GifActivity_MembersInjector.java:26: warning: [deprecation] Fragment in android.app has been deprecated
      Provider<DispatchingAndroidInjector<android.app.Fragment>> frameworkFragmentInjectorProvider,
                                                     ^
/<>/debug/burrows/apps/example/gif/giflist/GifActivity_MembersInjector.java:39: warning: [deprecation] Fragment in android.app has been deprecated
      Provider<DispatchingAndroidInjector<android.app.Fragment>> frameworkFragmentInjectorProvider,
                                                     ^
Note: /<>/kapt/debug/burrows/apps/example/gif/di/component/DaggerAppComponent.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error
12 warnings

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':compileDebugJavaWithJavac'.
> Compilation failed; see the compiler error output for details.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 6s
18 actionable tasks: 17 executed, 1 up-to-date

Most helpful comment

Or, alternatively, we could copy any @SuppressWarnings that are on the @Component definition. This seems like the most flexible and least awkward approach. @netdpb @cgdecker @kluever what do you think?

All 6 comments

We have to support it, but maybe we should add a suppress warnings somewhere. I don't know the best place off the top of my head, since it seems that they're all over. Suppressing over the entire file doesn't seem like a great option either... hrm.

@ronshapiro Instead of inlining android.support.v4.app.Fragment, can we inline android.app.Fragment instead and then we can easily add @SuppressWarnings("deprecated") to the methods that include android.app.Fragment to narrow the scope of the suppression?

JavaPoet decides what gets imported - we could try and trick it, but I wouldn't want to rely on it.

We could allow a -Adagger.suppressWarningsOnComponent=any_warnings_you_want. That would solve a lot of the issues reported where people have strange errors without opting anyone into them.

Try to use HasSupportFragmentInjector instead

Or, alternatively, we could copy any @SuppressWarnings that are on the @Component definition. This seems like the most flexible and least awkward approach. @netdpb @cgdecker @kluever what do you think?

Yes, please copy SuppressWarnings, Suppress and SuppressLint annotations.

Was this page helpful?
0 / 5 - 0 ratings