Commit 049de2ba authored by Leonardo Aramaki's avatar Leonardo Aramaki

Implement dagger support for service injections

parent df96f8a7
...@@ -8,10 +8,10 @@ ...@@ -8,10 +8,10 @@
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission <permission
android:name="chat.rocket.android.permission.C2D_MESSAGE" android:name="${applicationId}.permission.C2D_MESSAGE"
android:protectionLevel="signature" /> android:protectionLevel="signature" />
<uses-permission android:name="chat.rocket.android.permission.C2D_MESSAGE" /> <uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" />
<application <application
android:name=".app.RocketChatApplication" android:name=".app.RocketChatApplication"
...@@ -52,7 +52,7 @@ ...@@ -52,7 +52,7 @@
<action android:name="com.google.android.c2dm.intent.RECEIVE" /> <action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="chat.rocket.android" /> <category android:name="${applicationId}" />
</intent-filter> </intent-filter>
</receiver> </receiver>
......
...@@ -2,24 +2,29 @@ package chat.rocket.android.app ...@@ -2,24 +2,29 @@ package chat.rocket.android.app
import android.app.Activity import android.app.Activity
import android.app.Application import android.app.Application
import android.app.Service
import chat.rocket.android.BuildConfig import chat.rocket.android.BuildConfig
import chat.rocket.android.app.utils.CustomImageFormatConfigurator import chat.rocket.android.app.utils.CustomImageFormatConfigurator
import com.facebook.drawee.backends.pipeline.DraweeConfig
import chat.rocket.android.dagger.DaggerAppComponent import chat.rocket.android.dagger.DaggerAppComponent
import com.facebook.drawee.backends.pipeline.DraweeConfig
import com.facebook.drawee.backends.pipeline.Fresco import com.facebook.drawee.backends.pipeline.Fresco
import com.facebook.imagepipeline.core.ImagePipelineConfig import com.facebook.imagepipeline.core.ImagePipelineConfig
import com.jakewharton.threetenabp.AndroidThreeTen import com.jakewharton.threetenabp.AndroidThreeTen
import dagger.android.AndroidInjector import dagger.android.AndroidInjector
import dagger.android.DispatchingAndroidInjector import dagger.android.DispatchingAndroidInjector
import dagger.android.HasActivityInjector import dagger.android.HasActivityInjector
import dagger.android.HasServiceInjector
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
class RocketChatApplication : Application(), HasActivityInjector { class RocketChatApplication : Application(), HasActivityInjector, HasServiceInjector {
@Inject @Inject
lateinit var activityDispatchingAndroidInjector: DispatchingAndroidInjector<Activity> lateinit var activityDispatchingAndroidInjector: DispatchingAndroidInjector<Activity>
@Inject
lateinit var serviceDispatchingAndroidInjector: DispatchingAndroidInjector<Service>
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
...@@ -52,4 +57,8 @@ class RocketChatApplication : Application(), HasActivityInjector { ...@@ -52,4 +57,8 @@ class RocketChatApplication : Application(), HasActivityInjector {
override fun activityInjector(): AndroidInjector<Activity> { override fun activityInjector(): AndroidInjector<Activity> {
return activityDispatchingAndroidInjector return activityDispatchingAndroidInjector
} }
override fun serviceInjector(): AndroidInjector<Service> {
return serviceDispatchingAndroidInjector
}
} }
\ No newline at end of file
...@@ -4,7 +4,6 @@ import chat.rocket.android.authentication.presentation.AuthenticationNavigator ...@@ -4,7 +4,6 @@ import chat.rocket.android.authentication.presentation.AuthenticationNavigator
import chat.rocket.android.core.lifecycle.CancelStrategy import chat.rocket.android.core.lifecycle.CancelStrategy
import chat.rocket.android.helper.NetworkHelper import chat.rocket.android.helper.NetworkHelper
import chat.rocket.android.infrastructure.LocalRepository import chat.rocket.android.infrastructure.LocalRepository
import chat.rocket.android.infrastructure.SharedPreferencesRepository
import chat.rocket.android.util.launchUI import chat.rocket.android.util.launchUI
import chat.rocket.common.RocketChatException import chat.rocket.common.RocketChatException
import chat.rocket.common.RocketChatTwoFactorException import chat.rocket.common.RocketChatTwoFactorException
...@@ -16,7 +15,8 @@ import javax.inject.Inject ...@@ -16,7 +15,8 @@ import javax.inject.Inject
class LoginPresenter @Inject constructor(private val view: LoginView, class LoginPresenter @Inject constructor(private val view: LoginView,
private val strategy: CancelStrategy, private val strategy: CancelStrategy,
private val navigator: AuthenticationNavigator) { private val navigator: AuthenticationNavigator,
private val localRepository: LocalRepository) {
@Inject lateinit var client: RocketChatClient @Inject lateinit var client: RocketChatClient
fun authenticate(usernameOrEmail: String, password: String) { fun authenticate(usernameOrEmail: String, password: String) {
...@@ -63,9 +63,6 @@ class LoginPresenter @Inject constructor(private val view: LoginView, ...@@ -63,9 +63,6 @@ class LoginPresenter @Inject constructor(private val view: LoginView,
} }
private suspend fun registerPushToken() { private suspend fun registerPushToken() {
// TODO: put it on constructor
val localRepository: LocalRepository = SharedPreferencesRepository(navigator.activity)
localRepository.get(LocalRepository.KEY_PUSH_TOKEN)?.let { localRepository.get(LocalRepository.KEY_PUSH_TOKEN)?.let {
client.registerPushToken(it) client.registerPushToken(it)
} }
......
...@@ -3,16 +3,19 @@ package chat.rocket.android.authentication.signup.presentation ...@@ -3,16 +3,19 @@ package chat.rocket.android.authentication.signup.presentation
import chat.rocket.android.authentication.presentation.AuthenticationNavigator import chat.rocket.android.authentication.presentation.AuthenticationNavigator
import chat.rocket.android.core.lifecycle.CancelStrategy import chat.rocket.android.core.lifecycle.CancelStrategy
import chat.rocket.android.helper.NetworkHelper import chat.rocket.android.helper.NetworkHelper
import chat.rocket.android.infrastructure.LocalRepository
import chat.rocket.android.util.launchUI import chat.rocket.android.util.launchUI
import chat.rocket.common.RocketChatException import chat.rocket.common.RocketChatException
import chat.rocket.core.RocketChatClient import chat.rocket.core.RocketChatClient
import chat.rocket.core.internal.rest.login import chat.rocket.core.internal.rest.login
import chat.rocket.core.internal.rest.registerPushToken
import chat.rocket.core.internal.rest.signup import chat.rocket.core.internal.rest.signup
import javax.inject.Inject import javax.inject.Inject
class SignupPresenter @Inject constructor(private val view: SignupView, class SignupPresenter @Inject constructor(private val view: SignupView,
private val strategy: CancelStrategy, private val strategy: CancelStrategy,
private val navigator: AuthenticationNavigator) { private val navigator: AuthenticationNavigator,
private val localRepository: LocalRepository) {
@Inject lateinit var client: RocketChatClient @Inject lateinit var client: RocketChatClient
fun signup(name: String, username: String, password: String, email: String) { fun signup(name: String, username: String, password: String, email: String) {
...@@ -37,6 +40,7 @@ class SignupPresenter @Inject constructor(private val view: SignupView, ...@@ -37,6 +40,7 @@ class SignupPresenter @Inject constructor(private val view: SignupView,
try { try {
client.signup(email, name, username, password) // TODO This function returns a user so should we save it? client.signup(email, name, username, password) // TODO This function returns a user so should we save it?
client.login(username, password) // TODO This function returns a user token so should we save it? client.login(username, password) // TODO This function returns a user token so should we save it?
registerPushToken()
navigator.toChatList() navigator.toChatList()
} catch (exception: RocketChatException) { } catch (exception: RocketChatException) {
val errorMessage = exception.message val errorMessage = exception.message
...@@ -63,4 +67,11 @@ class SignupPresenter @Inject constructor(private val view: SignupView, ...@@ -63,4 +67,11 @@ class SignupPresenter @Inject constructor(private val view: SignupView,
fun privacyPolicy() { fun privacyPolicy() {
navigator.toPrivacyPolicy() navigator.toPrivacyPolicy()
} }
private suspend fun registerPushToken() {
localRepository.get(LocalRepository.KEY_PUSH_TOKEN)?.let {
client.registerPushToken(it)
}
// TODO: Schedule push token registering when it comes up null
}
} }
\ No newline at end of file
...@@ -4,7 +4,6 @@ import chat.rocket.android.authentication.presentation.AuthenticationNavigator ...@@ -4,7 +4,6 @@ import chat.rocket.android.authentication.presentation.AuthenticationNavigator
import chat.rocket.android.core.lifecycle.CancelStrategy import chat.rocket.android.core.lifecycle.CancelStrategy
import chat.rocket.android.helper.NetworkHelper import chat.rocket.android.helper.NetworkHelper
import chat.rocket.android.infrastructure.LocalRepository import chat.rocket.android.infrastructure.LocalRepository
import chat.rocket.android.infrastructure.SharedPreferencesRepository
import chat.rocket.android.util.launchUI import chat.rocket.android.util.launchUI
import chat.rocket.common.RocketChatAuthException import chat.rocket.common.RocketChatAuthException
import chat.rocket.common.RocketChatException import chat.rocket.common.RocketChatException
...@@ -15,7 +14,8 @@ import javax.inject.Inject ...@@ -15,7 +14,8 @@ import javax.inject.Inject
class TwoFAPresenter @Inject constructor(private val view: TwoFAView, class TwoFAPresenter @Inject constructor(private val view: TwoFAView,
private val strategy: CancelStrategy, private val strategy: CancelStrategy,
private val navigator: AuthenticationNavigator) { private val navigator: AuthenticationNavigator,
private val localRepository: LocalRepository) {
@Inject lateinit var client: RocketChatClient @Inject lateinit var client: RocketChatClient
fun authenticate(twoFactorAuthenticationCode: String) { fun authenticate(twoFactorAuthenticationCode: String) {
...@@ -56,13 +56,9 @@ class TwoFAPresenter @Inject constructor(private val view: TwoFAView, ...@@ -56,13 +56,9 @@ class TwoFAPresenter @Inject constructor(private val view: TwoFAView,
} }
private suspend fun registerPushToken() { private suspend fun registerPushToken() {
// TODO: put it on constructor
val localRepository: LocalRepository = SharedPreferencesRepository(navigator.activity)
localRepository.get(LocalRepository.KEY_PUSH_TOKEN)?.let { localRepository.get(LocalRepository.KEY_PUSH_TOKEN)?.let {
client.registerPushToken(it) client.registerPushToken(it)
} }
// TODO: Schedule push token registering when it comes up null // TODO: Schedule push token registering when it comes up null
} }
} }
\ No newline at end of file
...@@ -4,13 +4,15 @@ import android.app.Application ...@@ -4,13 +4,15 @@ import android.app.Application
import chat.rocket.android.app.RocketChatApplication import chat.rocket.android.app.RocketChatApplication
import chat.rocket.android.dagger.module.ActivityBuilder import chat.rocket.android.dagger.module.ActivityBuilder
import chat.rocket.android.dagger.module.AppModule import chat.rocket.android.dagger.module.AppModule
import chat.rocket.android.dagger.module.ServiceBuilder
import chat.rocket.android.push.FirebaseTokenService
import dagger.BindsInstance import dagger.BindsInstance
import dagger.Component import dagger.Component
import dagger.android.support.AndroidSupportInjectionModule import dagger.android.support.AndroidSupportInjectionModule
import javax.inject.Singleton import javax.inject.Singleton
@Singleton @Singleton
@Component(modules = [AndroidSupportInjectionModule::class, AppModule::class, ActivityBuilder::class]) @Component(modules = [AndroidSupportInjectionModule::class, AppModule::class, ActivityBuilder::class, ServiceBuilder::class])
interface AppComponent { interface AppComponent {
@Component.Builder @Component.Builder
...@@ -23,6 +25,8 @@ interface AppComponent { ...@@ -23,6 +25,8 @@ interface AppComponent {
fun inject(app: RocketChatApplication) fun inject(app: RocketChatApplication)
fun inject(service: FirebaseTokenService)
/*@Component.Builder /*@Component.Builder
abstract class Builder : AndroidInjector.Builder<RocketChatApplication>()*/ abstract class Builder : AndroidInjector.Builder<RocketChatApplication>()*/
} }
...@@ -3,16 +3,19 @@ package chat.rocket.android.dagger.module ...@@ -3,16 +3,19 @@ package chat.rocket.android.dagger.module
import android.app.Application import android.app.Application
import android.arch.persistence.room.Room import android.arch.persistence.room.Room
import android.content.Context import android.content.Context
import android.content.SharedPreferences
import chat.rocket.android.BuildConfig import chat.rocket.android.BuildConfig
import chat.rocket.android.app.RocketChatApplication
import chat.rocket.android.app.RocketChatDatabase import chat.rocket.android.app.RocketChatDatabase
import chat.rocket.android.authentication.infraestructure.AuthTokenRepository import chat.rocket.android.authentication.infraestructure.AuthTokenRepository
import chat.rocket.android.infrastructure.LocalRepository
import chat.rocket.android.infrastructure.SharedPreferencesRepository
import chat.rocket.android.server.infraestructure.ServerDao import chat.rocket.android.server.infraestructure.ServerDao
import chat.rocket.android.util.TimberLogger import chat.rocket.android.util.TimberLogger
import chat.rocket.common.util.PlatformLogger import chat.rocket.common.util.PlatformLogger
import chat.rocket.core.RocketChatClient import chat.rocket.core.RocketChatClient
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import okhttp3.HttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor import okhttp3.logging.HttpLoggingInterceptor
import javax.inject.Singleton import javax.inject.Singleton
...@@ -84,4 +87,16 @@ class AppModule { ...@@ -84,4 +87,16 @@ class AppModule {
fun providePlatformLogger(): PlatformLogger { fun providePlatformLogger(): PlatformLogger {
return TimberLogger return TimberLogger
} }
@Provides
@Singleton
fun provideSharedPreferences(context: Context): SharedPreferences {
return context.getSharedPreferences("rocket.chat", Context.MODE_PRIVATE)
}
@Provides
@Singleton
fun provideSharedPreferencesRepository(preferences: SharedPreferences): LocalRepository {
return SharedPreferencesRepository(preferences)
}
} }
package chat.rocket.android.dagger.module
import chat.rocket.android.push.FirebaseTokenService
import chat.rocket.android.push.di.FirebaseTokenServiceProvider
import dagger.Module
import dagger.android.ContributesAndroidInjector
@Module abstract class ServiceBuilder {
@ContributesAndroidInjector(modules = [FirebaseTokenServiceProvider::class])
abstract fun bindFirebaseTokenService(): FirebaseTokenService
}
\ No newline at end of file
package chat.rocket.android.infrastructure package chat.rocket.android.infrastructure
import android.content.Context
import android.content.SharedPreferences import android.content.SharedPreferences
class SharedPreferencesRepository(context: Context) : LocalRepository { class SharedPreferencesRepository(private val preferences: SharedPreferences) : LocalRepository {
val preferences: SharedPreferences
init {
preferences = context.getSharedPreferences("local.prefs", Context.MODE_PRIVATE)
}
override fun save(key: String, value: String?) { override fun save(key: String, value: String?) {
preferences.edit().putString(key, value).apply() preferences.edit().putString(key, value).apply()
......
...@@ -2,14 +2,13 @@ package chat.rocket.android.push ...@@ -2,14 +2,13 @@ package chat.rocket.android.push
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.infrastructure.LocalRepository import chat.rocket.android.infrastructure.LocalRepository
import chat.rocket.android.push.di.DaggerPushComponent
import chat.rocket.android.push.di.PushModule
import chat.rocket.common.RocketChatException import chat.rocket.common.RocketChatException
import chat.rocket.core.RocketChatClient import chat.rocket.core.RocketChatClient
import chat.rocket.core.internal.rest.registerPushToken import chat.rocket.core.internal.rest.registerPushToken
import com.google.android.gms.gcm.GoogleCloudMessaging import com.google.android.gms.gcm.GoogleCloudMessaging
import com.google.android.gms.iid.InstanceID import com.google.android.gms.iid.InstanceID
import com.google.firebase.iid.FirebaseInstanceIdService import com.google.firebase.iid.FirebaseInstanceIdService
import dagger.android.AndroidInjection
import kotlinx.coroutines.experimental.launch import kotlinx.coroutines.experimental.launch
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
...@@ -24,13 +23,9 @@ class FirebaseTokenService : FirebaseInstanceIdService() { ...@@ -24,13 +23,9 @@ class FirebaseTokenService : FirebaseInstanceIdService() {
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
DaggerPushComponent.builder() AndroidInjection.inject(this);
.pushModule(PushModule(this))
.build()
.inject(this)
} }
override fun onTokenRefresh() { override fun onTokenRefresh() {
//TODO: We need to use the Cordova Project gcm_sender_id since it's the one configured on RC //TODO: We need to use the Cordova Project gcm_sender_id since it's the one configured on RC
// default push gateway. We should register this project's own project sender id into it. // default push gateway. We should register this project's own project sender id into it.
......
...@@ -2,11 +2,10 @@ package chat.rocket.android.push.di ...@@ -2,11 +2,10 @@ package chat.rocket.android.push.di
import chat.rocket.android.dagger.module.AppModule import chat.rocket.android.dagger.module.AppModule
import chat.rocket.android.push.FirebaseTokenService import chat.rocket.android.push.FirebaseTokenService
import dagger.Component import dagger.Module
import javax.inject.Singleton import dagger.android.ContributesAndroidInjector
@Singleton @Module abstract class FirebaseTokenServiceProvider {
@Component(modules = [PushModule::class]) @ContributesAndroidInjector(modules = [AppModule::class])
interface PushComponent { abstract fun provideFirebaseTokenService(): FirebaseTokenService
fun inject(service: FirebaseTokenService)
} }
\ No newline at end of file
package chat.rocket.android.push.di
import chat.rocket.android.BuildConfig
import chat.rocket.android.authentication.infraestructure.AuthTokenRepository
import chat.rocket.android.infrastructure.LocalRepository
import chat.rocket.android.infrastructure.SharedPreferencesRepository
import chat.rocket.android.push.FirebaseTokenService
import chat.rocket.android.util.TimberLogger
import chat.rocket.common.util.PlatformLogger
import chat.rocket.core.RocketChatClient
import chat.rocket.core.TokenRepository
import dagger.Module
import dagger.Provides
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import javax.inject.Singleton
@Module
@Singleton
class PushModule(val context: FirebaseTokenService) {
@Provides
fun provideAuthTokenRepository(): TokenRepository = AuthTokenRepository()
@Provides
fun provideLocalRepository(): LocalRepository = SharedPreferencesRepository(context)
@Provides
@Singleton
fun providePlatformLogger(): PlatformLogger {
return TimberLogger
}
@Provides
@Singleton
fun provideHttpLoggingInterceptor(): HttpLoggingInterceptor {
val interceptor = HttpLoggingInterceptor()
if (BuildConfig.DEBUG) {
interceptor.level = HttpLoggingInterceptor.Level.BODY
} else {
interceptor.level = HttpLoggingInterceptor.Level.HEADERS
}
return interceptor
}
@Provides
@Singleton
fun provideOkHttpClient(logger: HttpLoggingInterceptor): OkHttpClient {
return OkHttpClient.Builder().apply {
addInterceptor(logger)
}.build()
}
@Provides
fun provideRocketChatClient(okHttpClient: OkHttpClient, repository: TokenRepository, logger: PlatformLogger): RocketChatClient {
return RocketChatClient.create {
httpClient = okHttpClient
restUrl = "https://open.rocket.chat"
tokenRepository = repository
platformLogger = logger
}
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment