From c3d354cd5b4dd9c8a75a4239dc2180e7271ea412 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Thu, 10 Jan 2019 17:10:10 +0100 Subject: [PATCH] Add chucker okhttp inspector (#205) --- .travis.yml | 4 ++++ app/build.gradle | 5 ++++- app/src/main/AndroidManifest.xml | 2 ++ .../github/wulkanowy/data/RepositoryModule.kt | 17 ++++++++++++++++- .../data/repositories/PreferencesRepository.kt | 4 ++++ .../io/github/wulkanowy/ui/base/ErrorHandler.kt | 4 +++- .../ui/base/session/SessionErrorHandler.kt | 3 ++- .../ui/modules/login/LoginErrorHandler.kt | 3 ++- .../ui/modules/settings/SettingsFragment.kt | 2 ++ .../ui/modules/settings/SettingsPresenter.kt | 8 +++++++- app/src/main/res/values-pl/strings.xml | 1 + app/src/main/res/values/preferences_keys.xml | 1 + app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/scheme_preferences.xml | 5 +++++ 14 files changed, 54 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index a430c90ef..e144bdd77 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,6 +11,10 @@ cache: - $HOME/.gradle/caches/ - $HOME/.gradle/wrapper/ +branches: + only: + - master + android: licenses: - android-sdk-preview-license-.+ diff --git a/app/build.gradle b/app/build.gradle index 9325c91c7..5aa3a521a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -80,7 +80,7 @@ play { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" - implementation('io.github.wulkanowy:api:0.6.2') { exclude module: "threetenbp" } + implementation('io.github.wulkanowy:api:0.6.3') { exclude module: "threetenbp" } implementation "androidx.legacy:legacy-support-v4:1.0.0" implementation "androidx.appcompat:appcompat:1.0.2" @@ -118,6 +118,9 @@ dependencies { implementation 'com.google.firebase:firebase-core:16.0.6' implementation 'com.crashlytics.sdk.android:crashlytics:2.9.8' + releaseImplementation 'fr.o80.chucker:library-no-op:2.0.3' + debugImplementation 'fr.o80.chucker:library:2.0.3' + debugImplementation "com.amitshekhar.android:debug-db:1.0.4" testImplementation "junit:junit:4.12" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 10fe53119..2bc7e0a91 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,6 +4,8 @@ package="io.github.wulkanowy" android:installLocation="internalOnly"> + + diff --git a/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt b/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt index 3c58ea4bd..f5bb1b2a4 100644 --- a/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt +++ b/app/src/main/java/io/github/wulkanowy/data/RepositoryModule.kt @@ -6,10 +6,14 @@ import android.content.res.Resources import androidx.preference.PreferenceManager import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.InternetObservingSettings import com.github.pwittchen.reactivenetwork.library.rx2.internet.observing.strategy.SocketInternetObservingStrategy +import com.readystatesoftware.chuck.api.ChuckCollector +import com.readystatesoftware.chuck.api.ChuckInterceptor +import com.readystatesoftware.chuck.api.RetentionManager import dagger.Module import dagger.Provides import io.github.wulkanowy.api.Api import io.github.wulkanowy.data.db.AppDatabase +import io.github.wulkanowy.data.repositories.PreferencesRepository import okhttp3.logging.HttpLoggingInterceptor import okhttp3.logging.HttpLoggingInterceptor.Level.BASIC import okhttp3.logging.HttpLoggingInterceptor.Level.NONE @@ -30,15 +34,26 @@ internal class RepositoryModule { @Singleton @Provides - fun provideApi(): Api { + fun provideApi(chuckCollector: ChuckCollector, context: Context): Api { return Api().apply { logLevel = NONE androidVersion = android.os.Build.VERSION.RELEASE buildTag = android.os.Build.MODEL setInterceptor(HttpLoggingInterceptor(HttpLoggingInterceptor.Logger { Timber.d(it) }).setLevel(BASIC)) + + // for debug only + setInterceptor(ChuckInterceptor(context, chuckCollector).maxContentLength(250000L), true, 0) } } + @Singleton + @Provides + fun provideChuckCollector(context: Context, prefRepository: PreferencesRepository): ChuckCollector { + return ChuckCollector(context) + .showNotification(prefRepository.isShowChuckerNotification) + .retentionManager(RetentionManager(context, ChuckCollector.Period.ONE_HOUR)) + } + @Singleton @Provides fun provideDatabase(context: Context) = AppDatabase.newInstance(context) diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/PreferencesRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/PreferencesRepository.kt index 205baa3aa..d83ae667d 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/PreferencesRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/PreferencesRepository.kt @@ -44,4 +44,8 @@ class PreferencesRepository @Inject constructor( val isNotificationsEnable: Boolean get() = sharedPref.getBoolean(context.getString(R.string.pref_key_notifications_enable), true) + + val isShowChuckerNotificationKey: String = context.getString(R.string.pref_key_debug_chucker_notification) + val isShowChuckerNotification: Boolean + get() = sharedPref.getBoolean(isShowChuckerNotificationKey, false) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt index e0e32e2c8..a8f210e67 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/ErrorHandler.kt @@ -1,6 +1,7 @@ package io.github.wulkanowy.ui.base import android.content.res.Resources +import com.readystatesoftware.chuck.api.ChuckCollector import io.github.wulkanowy.R import io.github.wulkanowy.api.interceptor.ServiceUnavailableException import io.github.wulkanowy.api.login.NotLoggedInException @@ -9,11 +10,12 @@ import java.net.SocketTimeoutException import java.net.UnknownHostException import javax.inject.Inject -open class ErrorHandler @Inject constructor(protected val resources: Resources) { +open class ErrorHandler @Inject constructor(protected val resources: Resources, private val chuckCollector: ChuckCollector) { var showErrorMessage: (String, Throwable) -> Unit = { _, _ -> } fun dispatch(error: Throwable) { + chuckCollector.onError(error.javaClass.simpleName, error) Timber.e(error, "An exception occurred while the Wulkanowy was running") proceed(error) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/session/SessionErrorHandler.kt b/app/src/main/java/io/github/wulkanowy/ui/base/session/SessionErrorHandler.kt index 89654732a..f8ea6e3db 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/session/SessionErrorHandler.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/session/SessionErrorHandler.kt @@ -1,11 +1,12 @@ package io.github.wulkanowy.ui.base.session import android.content.res.Resources +import com.readystatesoftware.chuck.api.ChuckCollector import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.security.ScramblerException import javax.inject.Inject -class SessionErrorHandler @Inject constructor(resources: Resources) : ErrorHandler(resources) { +class SessionErrorHandler @Inject constructor(resources: Resources, chuckCollector: ChuckCollector) : ErrorHandler(resources, chuckCollector) { var onDecryptionFail: () -> Unit = {} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginErrorHandler.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginErrorHandler.kt index 40f1d711c..18c3a422a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginErrorHandler.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginErrorHandler.kt @@ -2,12 +2,13 @@ package io.github.wulkanowy.ui.modules.login import android.content.res.Resources import android.database.sqlite.SQLiteConstraintException +import com.readystatesoftware.chuck.api.ChuckCollector import io.github.wulkanowy.R import io.github.wulkanowy.api.login.BadCredentialsException import io.github.wulkanowy.ui.base.ErrorHandler import javax.inject.Inject -class LoginErrorHandler @Inject constructor(resources: Resources) : ErrorHandler(resources) { +class LoginErrorHandler @Inject constructor(resources: Resources, chuckCollector: ChuckCollector) : ErrorHandler(resources, chuckCollector) { var onBadCredentials: () -> Unit = {} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt index 7273e8e9a..57fcea099 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt @@ -6,6 +6,7 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatDelegate import com.takisoft.preferencex.PreferenceFragmentCompat import dagger.android.support.AndroidSupportInjection +import io.github.wulkanowy.BuildConfig import io.github.wulkanowy.R import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.ui.modules.main.MainView @@ -36,6 +37,7 @@ class SettingsFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedP override fun onCreatePreferencesFix(savedInstanceState: Bundle?, rootKey: String?) { addPreferencesFromResource(R.xml.scheme_preferences) + findPreference(getString(R.string.pref_key_debug_chucker_notification)).isVisible = BuildConfig.DEBUG } override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt index 403689138..6a2087558 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt @@ -1,5 +1,7 @@ package io.github.wulkanowy.ui.modules.settings +import com.readystatesoftware.chuck.api.ChuckCollector +import io.github.wulkanowy.data.RepositoryModule_ProvideChuckCollectorFactory import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.services.job.ServiceHelper import io.github.wulkanowy.ui.base.BasePresenter @@ -13,7 +15,8 @@ class SettingsPresenter @Inject constructor( errorHandler: ErrorHandler, private val preferencesRepository: PreferencesRepository, private val serviceHelper: ServiceHelper, - private val analytics: FirebaseAnalyticsHelper + private val analytics: FirebaseAnalyticsHelper, + private val chuckCollector: ChuckCollector ) : BasePresenter(errorHandler) { override fun onAttachView(view: SettingsView) { @@ -37,6 +40,9 @@ class SettingsPresenter @Inject constructor( preferencesRepository.currentThemeKey -> { view?.setTheme(preferencesRepository.currentTheme) } + preferencesRepository.isShowChuckerNotificationKey -> { + chuckCollector.showNotification(preferencesRepository.isShowChuckerNotification) + } } analytics.logEvent("setting_changed", mapOf("name" to key)) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index f2e48b4da..3c4a4ebba 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -227,6 +227,7 @@ Powiadomienia Pokazuj powiadomienia + Pokazuj powiadomienia debugowania Synchronizacja Automatyczna aktualizacja diff --git a/app/src/main/res/values/preferences_keys.xml b/app/src/main/res/values/preferences_keys.xml index ea2585e79..54cc2bbde 100644 --- a/app/src/main/res/values/preferences_keys.xml +++ b/app/src/main/res/values/preferences_keys.xml @@ -10,4 +10,5 @@ services_interval services_disable_wifi_only notifications_enable + chucker_notification diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a4cb76952..f6140ad04 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -210,6 +210,7 @@ Notifications Show notifications + Show debug notifications Synchronization Automatic update diff --git a/app/src/main/res/xml/scheme_preferences.xml b/app/src/main/res/xml/scheme_preferences.xml index 1ba8885a6..575fea63d 100644 --- a/app/src/main/res/xml/scheme_preferences.xml +++ b/app/src/main/res/xml/scheme_preferences.xml @@ -80,5 +80,10 @@ android:key="@string/pref_key_notifications_enable" android:title="@string/pref_notify_switch" app:iconSpaceReserved="false" /> +