diff --git a/.travis.yml b/.travis.yml index a430c90e..e144bdd7 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 9325c91c..5aa3a521 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 10fe5311..2bc7e0a9 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 3c58ea4b..f5bb1b2a 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 205baa3a..d83ae667 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 e0e32e2c..a8f210e6 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 89654732..f8ea6e3d 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 40f1d711..18c3a422 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 7273e8e9..57fcea09 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 40368913..6a208755 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 f2e48b4d..3c4a4ebb 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 ea2585e7..54cc2bbd 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 a4cb7695..f6140ad0 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 1ba8885a..575fea63 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" /> +