husky/husky/app/src/main/java/com/keylesspalace/tusky/TuskyApplication.kt

164 lines
5.8 KiB
Kotlin

/*
* Husky -- A Pleroma client for Android
*
* Copyright (C) 2021 The Husky Developers
* Copyright (C) 2020 Tusky Contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.keylesspalace.tusky
import android.app.Application
import android.content.Context
import android.content.res.Configuration
import android.graphics.Bitmap
import androidx.core.app.NotificationManagerCompat
import androidx.emoji.text.EmojiCompat
import androidx.preference.PreferenceManager
import androidx.work.WorkManager
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
import com.github.piasy.biv.BigImageViewer
import com.github.piasy.biv.loader.glide.GlideCustomImageLoader
import com.keylesspalace.tusky.components.notifications.NotificationWorkerFactory
import com.keylesspalace.tusky.core.logging.HyperlinkDebugTree
import com.keylesspalace.tusky.core.utils.ApplicationUtils
import com.keylesspalace.tusky.di.AppInjector
import com.keylesspalace.tusky.settings.PrefKeys
import com.keylesspalace.tusky.util.EmojiCompatFont
import com.keylesspalace.tusky.util.LocaleManager
import com.keylesspalace.tusky.util.ThemeUtils
import com.uber.autodispose.AutoDisposePlugins
import dagger.android.DispatchingAndroidInjector
import dagger.android.HasAndroidInjector
import io.reactivex.plugins.RxJavaPlugins
import java.security.Security
import javax.inject.Inject
import org.acra.ReportField.ANDROID_VERSION
import org.acra.ReportField.APP_VERSION_CODE
import org.acra.ReportField.APP_VERSION_NAME
import org.acra.ReportField.BUILD_CONFIG
import org.acra.ReportField.STACK_TRACE
import org.acra.config.mailSender
import org.acra.config.notification
import org.acra.data.StringFormat
import org.acra.ktx.initAcra
import org.conscrypt.Conscrypt
import timber.log.Timber
class TuskyApplication : Application(), HasAndroidInjector {
@Inject
lateinit var androidInjector: DispatchingAndroidInjector<Any>
@Inject
lateinit var notificationWorkerFactory: NotificationWorkerFactory
override fun onCreate() {
super.onCreate()
if(ApplicationUtils.isDebug()) {
Timber.plant(HyperlinkDebugTree())
}
Security.insertProviderAt(Conscrypt.newProvider(), 1)
AutoDisposePlugins.setHideProxies(false) // a small performance optimization
AppInjector.init(this)
val preferences = PreferenceManager.getDefaultSharedPreferences(this)
// init the custom emoji fonts
val emojiSelection = preferences.getInt(PrefKeys.EMOJI, 0)
val emojiConfig = EmojiCompatFont.byId(emojiSelection)
.getConfig(this)
.setReplaceAll(true)
EmojiCompat.init(emojiConfig)
// init night mode
val theme = preferences.getString("appTheme", ThemeUtils.APP_THEME_DEFAULT)
ThemeUtils.setAppNightMode(theme)
RxJavaPlugins.setErrorHandler {
Timber.tag("RxJava").w("undeliverable exception: $it")
}
SubsamplingScaleImageView.setPreferredBitmapConfig(Bitmap.Config.ARGB_8888)
BigImageViewer.initialize(GlideCustomImageLoader.with(this))
WorkManager.initialize(
this,
androidx.work.Configuration.Builder()
.setWorkerFactory(notificationWorkerFactory)
.build()
)
}
override fun attachBaseContext(base: Context) {
localeManager = LocaleManager(base)
super.attachBaseContext(localeManager.setLocale(base))
setupAcra()
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
localeManager.setLocale(this)
}
override fun androidInjector() = androidInjector
companion object {
@JvmStatic
lateinit var localeManager: LocaleManager
}
private fun setupAcra() {
initAcra {
buildConfigClass = BuildConfig::class.java
reportFormat = StringFormat.KEY_VALUE_LIST
reportContent = listOf(
ANDROID_VERSION,
APP_VERSION_NAME,
APP_VERSION_CODE,
BUILD_CONFIG,
STACK_TRACE
)
notification {
title = getString(R.string.acra_notification_title)
text = getString(R.string.acra_notification_body)
channelName = getString(R.string.acra_notification_channel_title)
channelDescription = getString(R.string.acra_notification_channel_body)
channelImportance = NotificationManagerCompat.IMPORTANCE_DEFAULT
//resIcon = R.drawable.notification_icon
sendButtonText = getString(R.string.acra_notification_report)
//resSendButtonIcon = R.drawable.notification_send
discardButtonText = getString(R.string.acra_notification_discard)
//resDiscardButtonIcon = R.drawable.notification_discard
sendOnClick = false
}
mailSender {
mailTo = getString(R.string.acra_email)
subject = getString(R.string.acra_email_subject)
body = getString(R.string.acra_email_body)
reportAsFile = true
reportFileName = getString(R.string.acra_email_report_filename)
}
}
}
}