From 6a7b7cbbe8340589e97cb9e322d4a8be7bff970d Mon Sep 17 00:00:00 2001 From: maskara Date: Sun, 12 Nov 2017 01:04:10 +0530 Subject: [PATCH] Introduce dagger --- app/build.gradle | 6 ++++ .../free/nrw/commons/CommonsApplication.java | 28 ++++++++++++++---- .../contributions/ContributionsActivity.java | 10 ++++++- .../free/nrw/commons/di/ActivityBuilder.java | 12 ++++++++ .../fr/free/nrw/commons/di/AppComponent.java | 29 +++++++++++++++++++ .../fr/free/nrw/commons/di/AppModule.java | 28 ++++++++++++++++++ gradle.properties | 1 + 7 files changed, 108 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/fr/free/nrw/commons/di/ActivityBuilder.java create mode 100644 app/src/main/java/fr/free/nrw/commons/di/AppComponent.java create mode 100644 app/src/main/java/fr/free/nrw/commons/di/AppModule.java diff --git a/app/build.gradle b/app/build.gradle index 588a7da636..f45aa7cd46 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -43,6 +43,12 @@ dependencies { implementation 'com.facebook.fresco:fresco:1.3.0' implementation 'com.facebook.stetho:stetho:1.5.0' + implementation "com.google.dagger:dagger:$DAGGER_VERSION" + implementation "com.google.dagger:dagger-android-support:$DAGGER_VERSION" + + annotationProcessor "com.google.dagger:dagger-android-processor:$DAGGER_VERSION" + annotationProcessor "com.google.dagger:dagger-compiler:$DAGGER_VERSION" + testImplementation 'junit:junit:4.12' testImplementation 'org.robolectric:robolectric:3.4' diff --git a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java index faaff749a5..44bf72ff4e 100644 --- a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java +++ b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java @@ -6,6 +6,7 @@ import android.accounts.AccountManagerFuture; import android.accounts.AuthenticatorException; import android.accounts.OperationCanceledException; +import android.app.Activity; import android.app.Application; import android.content.Context; import android.content.SharedPreferences; @@ -26,11 +27,16 @@ import java.io.File; import java.io.IOException; +import javax.inject.Inject; + +import dagger.android.DispatchingAndroidInjector; +import dagger.android.HasActivityInjector; import fr.free.nrw.commons.auth.AccountUtil; import fr.free.nrw.commons.caching.CacheController; import fr.free.nrw.commons.contributions.Contribution; import fr.free.nrw.commons.data.Category; import fr.free.nrw.commons.data.DBOpenHelper; +import fr.free.nrw.commons.di.DaggerAppComponent; import fr.free.nrw.commons.modifications.ModifierSequence; import fr.free.nrw.commons.mwapi.ApacheHttpClientMediaWikiApi; import fr.free.nrw.commons.mwapi.MediaWikiApi; @@ -47,7 +53,7 @@ resDialogCommentPrompt = R.string.crash_dialog_comment_prompt, resDialogOkToast = R.string.crash_dialog_ok_toast ) -public class CommonsApplication extends Application { +public class CommonsApplication extends Application implements HasActivityInjector { private Account currentAccount = null; // Unlike a savings account... @@ -61,6 +67,9 @@ public class CommonsApplication extends Application { public static final String FEEDBACK_EMAIL = "commons-app-android@googlegroups.com"; public static final String FEEDBACK_EMAIL_SUBJECT = "Commons Android App (%s) Feedback"; + @Inject DispatchingAndroidInjector dispatchingActivityInjector; + @Inject MediaWikiApi mediaWikiApi; + private static CommonsApplication instance = null; private MediaWikiApi api = null; private LruCache thumbnailUrlCache = new LruCache<>(1024); @@ -123,7 +132,11 @@ public void onCreate() { Timber.plant(new Timber.DebugTree()); - + DaggerAppComponent + .builder() + .application(this) + .build() + .inject(this); if (!BuildConfig.DEBUG) { ACRA.init(this); @@ -168,11 +181,11 @@ public Boolean revalidateAuthToken() { if (curAccount == null) { return false; // This should never happen } - - accountManager.invalidateAuthToken(AccountUtil.accountType(), getMWApi().getAuthCookie()); + + accountManager.invalidateAuthToken(AccountUtil.accountType(), mediaWikiApi.getAuthCookie()); try { String authCookie = accountManager.blockingGetAuthToken(curAccount, "", false); - getMWApi().setAuthCookie(authCookie); + mediaWikiApi.setAuthCookie(authCookie); return true; } catch (OperationCanceledException | NullPointerException | IOException | AuthenticatorException e) { e.printStackTrace(); @@ -249,6 +262,11 @@ public void run(AccountManagerFuture accountManagerFuture) { } } + @Override + public DispatchingAndroidInjector activityInjector() { + return dispatchingActivityInjector; + } + /** * Deletes all tables and re-creates them. */ diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java index 330baaf586..63a6e9c641 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java @@ -23,13 +23,17 @@ import java.util.ArrayList; +import javax.inject.Inject; + import butterknife.ButterKnife; +import dagger.android.AndroidInjection; import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.HandlerService; import fr.free.nrw.commons.Media; import fr.free.nrw.commons.R; import fr.free.nrw.commons.auth.AuthenticatedActivity; import fr.free.nrw.commons.media.MediaDetailPagerFragment; +import fr.free.nrw.commons.mwapi.MediaWikiApi; import fr.free.nrw.commons.settings.Prefs; import fr.free.nrw.commons.upload.UploadService; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -57,6 +61,9 @@ public class ContributionsActivity extends AuthenticatedActivity private ArrayList observersWaitingForLoad = new ArrayList<>(); private String CONTRIBUTION_SELECTION = ""; + @Inject + MediaWikiApi mediaWikiApi; + /* This sorts in the following order: Currently Uploading @@ -131,6 +138,7 @@ protected void onAuthCookieAcquired(String authCookie) { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + AndroidInjection.inject(this); setContentView(R.layout.activity_contributions); ButterKnife.bind(this); @@ -281,7 +289,7 @@ public int getTotalMediaCount() { private void setUploadCount() { CommonsApplication app = ((CommonsApplication) getApplication()); compositeDisposable.add( - app.getMWApi() + mediaWikiApi .getUploadCount(app.getCurrentAccount().name) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) diff --git a/app/src/main/java/fr/free/nrw/commons/di/ActivityBuilder.java b/app/src/main/java/fr/free/nrw/commons/di/ActivityBuilder.java new file mode 100644 index 0000000000..a35e3888a1 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/di/ActivityBuilder.java @@ -0,0 +1,12 @@ +package fr.free.nrw.commons.di; + +import dagger.Module; +import dagger.android.ContributesAndroidInjector; +import fr.free.nrw.commons.contributions.ContributionsActivity; + +@Module +public abstract class ActivityBuilder { + + @ContributesAndroidInjector() + abstract ContributionsActivity bindSplashScreenActivity(); +} diff --git a/app/src/main/java/fr/free/nrw/commons/di/AppComponent.java b/app/src/main/java/fr/free/nrw/commons/di/AppComponent.java new file mode 100644 index 0000000000..9cc9e33dd3 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/di/AppComponent.java @@ -0,0 +1,29 @@ +package fr.free.nrw.commons.di; + +import android.app.Application; + +import javax.inject.Singleton; + +import dagger.BindsInstance; +import dagger.Component; +import dagger.android.support.AndroidSupportInjectionModule; +import fr.free.nrw.commons.CommonsApplication; + +@Singleton +@Component(modules = { + AndroidSupportInjectionModule.class, + AppModule.class, + ActivityBuilder.class +}) +public interface AppComponent { + + @Component.Builder + interface Builder { + @BindsInstance + Builder application(Application application); + + AppComponent build(); + } + + void inject(CommonsApplication application); +} diff --git a/app/src/main/java/fr/free/nrw/commons/di/AppModule.java b/app/src/main/java/fr/free/nrw/commons/di/AppModule.java new file mode 100644 index 0000000000..f67d0bad5c --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/di/AppModule.java @@ -0,0 +1,28 @@ +package fr.free.nrw.commons.di; + +import android.app.Application; +import android.content.Context; + +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; +import fr.free.nrw.commons.BuildConfig; +import fr.free.nrw.commons.mwapi.ApacheHttpClientMediaWikiApi; +import fr.free.nrw.commons.mwapi.MediaWikiApi; + +@Module +public class AppModule { + + @Provides + @Singleton + Context provideContext(Application application) { + return application; + } + + @Provides + @Singleton + public MediaWikiApi getMWApi() { + return new ApacheHttpClientMediaWikiApi(BuildConfig.WIKIMEDIA_API_HOST); + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index bff1c9f63f..07148a5816 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,6 +12,7 @@ android.useDeprecatedNdk=true # Library dependencies BUTTERKNIFE_VERSION=8.6.0 +DAGGER_VERSION=2.11 org.gradle.jvmargs=-Xmx1536M