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

Implement dagger support for service injections

parent df96f8a7
......@@ -8,10 +8,10 @@
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission
android:name="chat.rocket.android.permission.C2D_MESSAGE"
android:name="${applicationId}.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="chat.rocket.android.permission.C2D_MESSAGE" />
<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" />
<application
android:name=".app.RocketChatApplication"
......@@ -52,7 +52,7 @@
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="chat.rocket.android" />
<category android:name="${applicationId}" />
</intent-filter>
</receiver>
......
......@@ -2,24 +2,29 @@ package chat.rocket.android.app
import android.app.Activity
import android.app.Application
import android.app.Service
import chat.rocket.android.BuildConfig
import chat.rocket.android.app.utils.CustomImageFormatConfigurator
import com.facebook.drawee.backends.pipeline.DraweeConfig
import chat.rocket.android.dagger.DaggerAppComponent
import com.facebook.drawee.backends.pipeline.DraweeConfig
import com.facebook.drawee.backends.pipeline.Fresco
import com.facebook.imagepipeline.core.ImagePipelineConfig
import com.jakewharton.threetenabp.AndroidThreeTen
import dagger.android.AndroidInjector
import dagger.android.DispatchingAndroidInjector
import dagger.android.HasActivityInjector
import dagger.android.HasServiceInjector
import timber.log.Timber
import javax.inject.Inject
class RocketChatApplication : Application(), HasActivityInjector {
class RocketChatApplication : Application(), HasActivityInjector, HasServiceInjector {
@Inject
lateinit var activityDispatchingAndroidInjector: DispatchingAndroidInjector<Activity>
@Inject
lateinit var serviceDispatchingAndroidInjector: DispatchingAndroidInjector<Service>
override fun onCreate() {
super.onCreate()
......@@ -52,4 +57,8 @@ class RocketChatApplication : Application(), HasActivityInjector {
override fun activityInjector(): AndroidInjector<Activity> {
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
import chat.rocket.android.core.lifecycle.CancelStrategy
import chat.rocket.android.helper.NetworkHelper
import chat.rocket.android.infrastructure.LocalRepository
import chat.rocket.android.infrastructure.SharedPreferencesRepository
import chat.rocket.android.util.launchUI
import chat.rocket.common.RocketChatException
import chat.rocket.common.RocketChatTwoFactorException
......@@ -16,7 +15,8 @@ import javax.inject.Inject
class LoginPresenter @Inject constructor(private val view: LoginView,
private val strategy: CancelStrategy,
private val navigator: AuthenticationNavigator) {
private val navigator: AuthenticationNavigator,
private val localRepository: LocalRepository) {
@Inject lateinit var client: RocketChatClient
fun authenticate(usernameOrEmail: String, password: String) {
......@@ -63,9 +63,6 @@ class LoginPresenter @Inject constructor(private val view: LoginView,
}
private suspend fun registerPushToken() {
// TODO: put it on constructor
val localRepository: LocalRepository = SharedPreferencesRepository(navigator.activity)
localRepository.get(LocalRepository.KEY_PUSH_TOKEN)?.let {
client.registerPushToken(it)
}
......
......@@ -3,16 +3,19 @@ package chat.rocket.android.authentication.signup.presentation
import chat.rocket.android.authentication.presentation.AuthenticationNavigator
import chat.rocket.android.core.lifecycle.CancelStrategy
import chat.rocket.android.helper.NetworkHelper
import chat.rocket.android.infrastructure.LocalRepository
import chat.rocket.android.util.launchUI
import chat.rocket.common.RocketChatException
import chat.rocket.core.RocketChatClient
import chat.rocket.core.internal.rest.login
import chat.rocket.core.internal.rest.registerPushToken
import chat.rocket.core.internal.rest.signup
import javax.inject.Inject
class SignupPresenter @Inject constructor(private val view: SignupView,
private val strategy: CancelStrategy,
private val navigator: AuthenticationNavigator) {
private val navigator: AuthenticationNavigator,
private val localRepository: LocalRepository) {
@Inject lateinit var client: RocketChatClient
fun signup(name: String, username: String, password: String, email: String) {
......@@ -37,6 +40,7 @@ class SignupPresenter @Inject constructor(private val view: SignupView,
try {
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?
registerPushToken()
navigator.toChatList()
} catch (exception: RocketChatException) {
val errorMessage = exception.message
......@@ -63,4 +67,11 @@ class SignupPresenter @Inject constructor(private val view: SignupView,
fun privacyPolicy() {
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
import chat.rocket.android.core.lifecycle.CancelStrategy
import chat.rocket.android.helper.NetworkHelper
import chat.rocket.android.infrastructure.LocalRepository
import chat.rocket.android.infrastructure.SharedPreferencesRepository
import chat.rocket.android.util.launchUI
import chat.rocket.common.RocketChatAuthException
import chat.rocket.common.RocketChatException
......@@ -15,7 +14,8 @@ import javax.inject.Inject
class TwoFAPresenter @Inject constructor(private val view: TwoFAView,
private val strategy: CancelStrategy,
private val navigator: AuthenticationNavigator) {
private val navigator: AuthenticationNavigator,
private val localRepository: LocalRepository) {
@Inject lateinit var client: RocketChatClient
fun authenticate(twoFactorAuthenticationCode: String) {
......@@ -56,13 +56,9 @@ class TwoFAPresenter @Inject constructor(private val view: TwoFAView,
}
private suspend fun registerPushToken() {
// TODO: put it on constructor
val localRepository: LocalRepository = SharedPreferencesRepository(navigator.activity)
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,13 +4,15 @@ import android.app.Application
import chat.rocket.android.app.RocketChatApplication
import chat.rocket.android.dagger.module.ActivityBuilder
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.Component
import dagger.android.support.AndroidSupportInjectionModule
import javax.inject.Singleton
@Singleton
@Component(modules = [AndroidSupportInjectionModule::class, AppModule::class, ActivityBuilder::class])
@Component(modules = [AndroidSupportInjectionModule::class, AppModule::class, ActivityBuilder::class, ServiceBuilder::class])
interface AppComponent {
@Component.Builder
......@@ -23,6 +25,8 @@ interface AppComponent {
fun inject(app: RocketChatApplication)
fun inject(service: FirebaseTokenService)
/*@Component.Builder
abstract class Builder : AndroidInjector.Builder<RocketChatApplication>()*/
}
......@@ -3,16 +3,19 @@ package chat.rocket.android.dagger.module
import android.app.Application
import android.arch.persistence.room.Room
import android.content.Context
import android.content.SharedPreferences
import chat.rocket.android.BuildConfig
import chat.rocket.android.app.RocketChatApplication
import chat.rocket.android.app.RocketChatDatabase
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.util.TimberLogger
import chat.rocket.common.util.PlatformLogger
import chat.rocket.core.RocketChatClient
import dagger.Module
import dagger.Provides
import okhttp3.HttpUrl
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import javax.inject.Singleton
......@@ -84,4 +87,16 @@ class AppModule {
fun providePlatformLogger(): PlatformLogger {
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
import android.content.Context
import android.content.SharedPreferences
class SharedPreferencesRepository(context: Context) : LocalRepository {
val preferences: SharedPreferences
init {
preferences = context.getSharedPreferences("local.prefs", Context.MODE_PRIVATE)
}
class SharedPreferencesRepository(private val preferences: SharedPreferences) : LocalRepository {
override fun save(key: String, value: String?) {
preferences.edit().putString(key, value).apply()
......
......@@ -2,14 +2,13 @@ package chat.rocket.android.push
import chat.rocket.android.R
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.core.RocketChatClient
import chat.rocket.core.internal.rest.registerPushToken
import com.google.android.gms.gcm.GoogleCloudMessaging
import com.google.android.gms.iid.InstanceID
import com.google.firebase.iid.FirebaseInstanceIdService
import dagger.android.AndroidInjection
import kotlinx.coroutines.experimental.launch
import timber.log.Timber
import javax.inject.Inject
......@@ -24,13 +23,9 @@ class FirebaseTokenService : FirebaseInstanceIdService() {
override fun onCreate() {
super.onCreate()
DaggerPushComponent.builder()
.pushModule(PushModule(this))
.build()
.inject(this)
AndroidInjection.inject(this);
}
override fun onTokenRefresh() {
//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.
......
......@@ -2,11 +2,10 @@ package chat.rocket.android.push.di
import chat.rocket.android.dagger.module.AppModule
import chat.rocket.android.push.FirebaseTokenService
import dagger.Component
import javax.inject.Singleton
import dagger.Module
import dagger.android.ContributesAndroidInjector
@Singleton
@Component(modules = [PushModule::class])
interface PushComponent {
fun inject(service: FirebaseTokenService)
@Module abstract class FirebaseTokenServiceProvider {
@ContributesAndroidInjector(modules = [AppModule::class])
abstract fun provideFirebaseTokenService(): 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