AppModule.kt 11.1 KB
Newer Older
1 2 3
package chat.rocket.android.dagger.module

import android.app.Application
4
import android.app.NotificationManager
5 6 7
import android.app.job.JobInfo
import android.app.job.JobScheduler
import android.content.ComponentName
8
import android.content.Context
9
import android.content.SharedPreferences
10
import chat.rocket.android.BuildConfig
11
import chat.rocket.android.R
Lucio Maciel's avatar
Lucio Maciel committed
12
import chat.rocket.android.authentication.infraestructure.SharedPreferencesMultiServerTokenRepository
13
import chat.rocket.android.authentication.infraestructure.SharedPreferencesTokenRepository
14
import chat.rocket.android.chatroom.service.MessageService
15
import chat.rocket.android.dagger.qualifier.ForAuthentication
Lucio Maciel's avatar
Lucio Maciel committed
16
import chat.rocket.android.dagger.qualifier.ForMessages
17
import chat.rocket.android.helper.MessageParser
18
import chat.rocket.android.infrastructure.LocalRepository
19
import chat.rocket.android.infrastructure.SharedPreferencesLocalRepository
20
import chat.rocket.android.push.GroupedPush
21
import chat.rocket.android.push.PushManager
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
import chat.rocket.android.server.domain.AccountsRepository
import chat.rocket.android.server.domain.ActiveUsersRepository
import chat.rocket.android.server.domain.ChatRoomsRepository
import chat.rocket.android.server.domain.CurrentServerRepository
import chat.rocket.android.server.domain.GetAccountInteractor
import chat.rocket.android.server.domain.GetCurrentServerInteractor
import chat.rocket.android.server.domain.GetSettingsInteractor
import chat.rocket.android.server.domain.JobSchedulerInteractor
import chat.rocket.android.server.domain.MessagesRepository
import chat.rocket.android.server.domain.MultiServerTokenRepository
import chat.rocket.android.server.domain.PermissionsRepository
import chat.rocket.android.server.domain.RoomRepository
import chat.rocket.android.server.domain.SettingsRepository
import chat.rocket.android.server.domain.TokenRepository
import chat.rocket.android.server.domain.UsersRepository
import chat.rocket.android.server.infraestructure.JobSchedulerInteractorImpl
import chat.rocket.android.server.infraestructure.MemoryActiveUsersRepository
import chat.rocket.android.server.infraestructure.MemoryChatRoomsRepository
import chat.rocket.android.server.infraestructure.MemoryRoomRepository
import chat.rocket.android.server.infraestructure.MemoryUsersRepository
import chat.rocket.android.server.infraestructure.SharedPreferencesAccountsRepository
import chat.rocket.android.server.infraestructure.SharedPreferencesMessagesRepository
import chat.rocket.android.server.infraestructure.SharedPreferencesPermissionsRepository
import chat.rocket.android.server.infraestructure.SharedPreferencesSettingsRepository
46
import chat.rocket.android.server.infraestructure.SharedPrefsConnectingServerRepository
47
import chat.rocket.android.server.infraestructure.SharedPrefsCurrentServerRepository
48
import chat.rocket.android.util.AppJsonAdapterFactory
49
import chat.rocket.android.util.HttpLoggingInterceptor
50
import chat.rocket.android.util.TimberLogger
51
import chat.rocket.common.internal.FallbackSealedClassJsonAdapter
52 53 54 55
import chat.rocket.common.internal.ISO8601Date
import chat.rocket.common.model.TimestampAdapter
import chat.rocket.common.util.CalendarISO8601Converter
import chat.rocket.common.util.Logger
56
import chat.rocket.common.util.PlatformLogger
57
import chat.rocket.core.internal.AttachmentAdapterFactory
58
import chat.rocket.core.internal.ReactionsAdapter
59 60 61 62
import com.facebook.drawee.backends.pipeline.DraweeConfig
import com.facebook.imagepipeline.backends.okhttp3.OkHttpImagePipelineConfigFactory
import com.facebook.imagepipeline.core.ImagePipelineConfig
import com.facebook.imagepipeline.listener.RequestLoggingListener
63
import com.squareup.moshi.Moshi
64 65 66
import dagger.Module
import dagger.Provides
import okhttp3.OkHttpClient
67 68
import ru.noties.markwon.SpannableConfiguration
import ru.noties.markwon.spans.SpannableTheme
69
import timber.log.Timber
70
import java.util.concurrent.TimeUnit
71 72 73 74 75 76 77 78 79 80 81 82 83 84
import javax.inject.Singleton

@Module
class AppModule {

    @Provides
    @Singleton
    fun provideContext(application: Application): Context {
        return application
    }

    @Provides
    @Singleton
    fun provideHttpLoggingInterceptor(): HttpLoggingInterceptor {
85 86 87 88
        val interceptor = HttpLoggingInterceptor(object  : HttpLoggingInterceptor.Logger {
            override fun log(message: String) {
                Timber.d(message)
            }
89
        })
90 91 92
        if (BuildConfig.DEBUG) {
            interceptor.level = HttpLoggingInterceptor.Level.BODY
        } else {
93 94
            // TODO - change to HEADERS on production...
            interceptor.level = HttpLoggingInterceptor.Level.BODY
95 96 97 98 99 100 101 102
        }

        return interceptor
    }

    @Provides
    @Singleton
    fun provideOkHttpClient(logger: HttpLoggingInterceptor): OkHttpClient {
103
        return OkHttpClient.Builder()
104 105 106 107 108
            .addInterceptor(logger)
            .connectTimeout(15, TimeUnit.SECONDS)
            .readTimeout(20, TimeUnit.SECONDS)
            .writeTimeout(15, TimeUnit.SECONDS)
            .build()
109 110
    }

111 112
    @Provides
    @Singleton
113
    fun provideImagePipelineConfig(context: Context, okHttpClient: OkHttpClient): ImagePipelineConfig {
114
        val listeners = setOf(RequestLoggingListener())
115 116

        return OkHttpImagePipelineConfigFactory.newBuilder(context, okHttpClient)
117 118 119
            .setRequestListeners(listeners)
            .setDownsampleEnabled(true)
            .experiment().setPartialImageCachingEnabled(true).build()
120 121 122 123 124
    }

    @Provides
    @Singleton
    fun provideDraweeConfig(): DraweeConfig {
125
        return DraweeConfig.newBuilder().build()
126 127
    }

128 129
    @Provides
    @Singleton
130 131
    fun provideTokenRepository(prefs: SharedPreferences, moshi: Moshi): TokenRepository {
        return SharedPreferencesTokenRepository(prefs, moshi)
132 133
    }

134 135 136
    @Provides
    @Singleton
    fun providePlatformLogger(): PlatformLogger {
137
        return TimberLogger
138
    }
139 140

    @Provides
141
    @Singleton
Lucio Maciel's avatar
Lucio Maciel committed
142 143 144 145 146 147 148
    fun provideSharedPreferences(context: Application) =
        context.getSharedPreferences("rocket.chat", Context.MODE_PRIVATE)


    @Provides
    @ForMessages
    fun provideMessagesSharedPreferences(context: Application) =
149
        context.getSharedPreferences("messages", Context.MODE_PRIVATE)
150

151 152
    @Provides
    @Singleton
153 154
    fun provideLocalRepository(prefs: SharedPreferences, moshi: Moshi): LocalRepository {
        return SharedPreferencesLocalRepository(prefs, moshi)
155 156
    }

157 158 159 160 161 162
    @Provides
    @Singleton
    fun provideCurrentServerRepository(prefs: SharedPreferences): CurrentServerRepository {
        return SharedPrefsCurrentServerRepository(prefs)
    }

163 164 165 166 167 168
    @Provides
    @ForAuthentication
    fun provideConnectingServerRepository(prefs: SharedPreferences): CurrentServerRepository {
        return SharedPrefsConnectingServerRepository(prefs)
    }

169 170
    @Provides
    @Singleton
171 172
    fun provideSettingsRepository(localRepository: LocalRepository): SettingsRepository {
        return SharedPreferencesSettingsRepository(localRepository)
173
    }
174

175 176 177 178 179 180
    @Provides
    @Singleton
    fun providePermissionsRepository(localRepository: LocalRepository, moshi: Moshi): PermissionsRepository {
        return SharedPreferencesPermissionsRepository(localRepository, moshi)
    }

181 182
    @Provides
    @Singleton
183 184 185 186 187 188 189
    fun provideRoomRepository(): RoomRepository {
        return MemoryRoomRepository()
    }

    @Provides
    @Singleton
    fun provideChatRoomRepository(): ChatRoomsRepository {
190 191
        return MemoryChatRoomsRepository()
    }
192

193 194 195 196 197 198
    @Provides
    @Singleton
    fun provideActiveUsersRepository(): ActiveUsersRepository {
        return MemoryActiveUsersRepository()
    }

199 200
    @Provides
    @Singleton
201 202 203 204
    fun provideMoshi(
        logger: PlatformLogger,
        currentServerInteractor: GetCurrentServerInteractor
    ): Moshi {
205
        val url = currentServerInteractor.get() ?: ""
206
        return Moshi.Builder()
207 208 209 210 211 212 213 214 215 216 217 218 219
            .add(FallbackSealedClassJsonAdapter.ADAPTER_FACTORY)
            .add(AppJsonAdapterFactory.INSTANCE)
            .add(AttachmentAdapterFactory(Logger(logger, url)))
            .add(
                java.lang.Long::class.java,
                ISO8601Date::class.java,
                TimestampAdapter(CalendarISO8601Converter())
            )
            .add(
                Long::class.java,
                ISO8601Date::class.java,
                TimestampAdapter(CalendarISO8601Converter())
            )
220
            .add(ReactionsAdapter())
221
            .build()
222
    }
Lucio Maciel's avatar
Lucio Maciel committed
223 224 225 226 227 228

    @Provides
    @Singleton
    fun provideMultiServerTokenRepository(repository: LocalRepository, moshi: Moshi): MultiServerTokenRepository {
        return SharedPreferencesMultiServerTokenRepository(repository, moshi)
    }
229 230 231

    @Provides
    @Singleton
Lucio Maciel's avatar
Lucio Maciel committed
232
    fun provideMessageRepository(@ForMessages preferences: SharedPreferences,
Lucio Maciel's avatar
Lucio Maciel committed
233 234
                                 moshi: Moshi,
                                 currentServerInteractor: GetCurrentServerInteractor): MessagesRepository {
235
        return SharedPreferencesMessagesRepository(preferences, moshi, currentServerInteractor)
236 237
    }

238 239 240 241 242 243
    @Provides
    @Singleton
    fun provideUserRepository(): UsersRepository {
        return MemoryUsersRepository()
    }

244 245
    @Provides
    @Singleton
246
    fun provideConfiguration(context: Application): SpannableConfiguration {
247
        val res = context.resources
248
        return SpannableConfiguration.builder(context)
249 250 251 252
            .theme(SpannableTheme.builder()
                .linkColor(res.getColor(R.color.colorAccent))
                .build())
            .build()
253 254 255
    }

    @Provides
256 257 258
    fun provideMessageParser(context: Application, configuration: SpannableConfiguration, serverInteractor: GetCurrentServerInteractor, settingsInteractor: GetSettingsInteractor): MessageParser {
        val url = serverInteractor.get()!!
        return MessageParser(context, configuration, settingsInteractor.get(url))
259
    }
260

261 262 263
    @Provides
    @Singleton
    fun provideAccountsRepository(preferences: SharedPreferences, moshi: Moshi): AccountsRepository =
264
        SharedPreferencesAccountsRepository(preferences, moshi)
265 266

    @Provides
267
    fun provideNotificationManager(context: Application) =
268
        context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
269 270 271 272

    @Provides
    @Singleton
    fun provideGroupedPush() = GroupedPush()
273 274 275 276

    @Provides
    @Singleton
    fun providePushManager(
277 278 279 280 281 282
        context: Application,
        groupedPushes: GroupedPush,
        manager: NotificationManager,
        moshi: Moshi,
        getAccountInteractor: GetAccountInteractor,
        getSettingsInteractor: GetSettingsInteractor): PushManager {
283 284
        return PushManager(groupedPushes, manager, moshi, getAccountInteractor, getSettingsInteractor, context)
    }
285 286 287 288 289 290 291 292 293

    @Provides
    fun provideJobScheduler(context: Application): JobScheduler {
        return context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
    }

    @Provides
    fun provideSendMessageJob(context: Application): JobInfo {
        return JobInfo.Builder(MessageService.RETRY_SEND_MESSAGE_ID,
294 295 296
            ComponentName(context, MessageService::class.java))
            .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
            .build()
297 298 299 300 301 302
    }

    @Provides
    fun provideJobSchedulerInteractor(jobScheduler: JobScheduler, jobInfo: JobInfo): JobSchedulerInteractor {
        return JobSchedulerInteractorImpl(jobScheduler, jobInfo)
    }
303
}