diff --git a/app/build.gradle b/app/build.gradle index 22084ce68..ccc666ec4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -167,6 +167,10 @@ configurations.testImplementation { } dependencies { + implementation project(':voice-engine-ktx') + implementation project(':logging-api') + implementation project(':logging') + implementation('com.google.apis:google-api-services-calendar:v3-rev20230406-2.0.0') { exclude group: 'com.google.guava', module: 'listenablefuture' } @@ -178,7 +182,6 @@ dependencies { implementation('com.google.apis:google-api-services-drive:v3-rev20230423-2.0.0') { exclude group: 'org.apache.httpcomponents' } - implementation project(':voice-engine-ktx') implementation 'io.insert-koin:koin-android:3.5.6' implementation 'io.insert-koin:koin-android-ext:3.0.2' @@ -221,9 +224,9 @@ dependencies { implementation 'androidx.navigation:navigation-fragment-ktx:2.8.5' implementation 'androidx.navigation:navigation-ui-ktx:2.8.5' - implementation platform('com.google.firebase:firebase-bom:33.7.0') + implementation libs.firebase.bom - implementation 'com.google.firebase:firebase-crashlytics' + implementation libs.firebase.crashlytics implementation 'com.google.firebase:firebase-analytics-ktx' implementation 'com.google.firebase:firebase-auth-ktx' implementation 'com.google.firebase:firebase-config' @@ -249,7 +252,7 @@ dependencies { implementation 'com.github.naz013:android-calendar-ext:1.0.4' implementation 'com.airbnb.android:lottie:6.6.1' implementation 'com.github.chrisbanes:PhotoView:2.3.0' - implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + implementation "org.jetbrains.kotlin:kotlin-stdlib:2.1.0" implementation 'org.threeten:threetenbp:1.7.0' implementation 'com.maxkeppeler.sheets:core:2.3.1' implementation 'com.maxkeppeler.sheets:lottie:2.3.1' diff --git a/app/src/main/java/com/elementary/tasks/ReminderApp.kt b/app/src/main/java/com/elementary/tasks/ReminderApp.kt index 1fc2d90e7..03d668fd4 100644 --- a/app/src/main/java/com/elementary/tasks/ReminderApp.kt +++ b/app/src/main/java/com/elementary/tasks/ReminderApp.kt @@ -6,7 +6,6 @@ import androidx.multidex.MultiDex import androidx.multidex.MultiDexApplication import com.elementary.tasks.birthdays.birthdaysModule import com.elementary.tasks.calendar.calendarModule -import com.elementary.tasks.core.analytics.Traces import com.elementary.tasks.core.appwidgets.widgetModule import com.elementary.tasks.core.data.adapter.adapterModule import com.elementary.tasks.core.data.repository.repositoryModule @@ -31,6 +30,7 @@ import com.elementary.tasks.home.homeModule import com.elementary.tasks.notes.noteModule import com.elementary.tasks.reminder.reminderModule import com.elementary.tasks.voice.voiceModule +import com.github.naz013.logging.initLogging import org.koin.android.ext.android.get import org.koin.android.ext.koin.androidContext import org.koin.androidx.workmanager.koin.workManagerFactory @@ -39,7 +39,6 @@ import org.koin.core.context.startKoin import org.koin.core.logger.Level import org.koin.core.logger.Logger import org.koin.core.logger.MESSAGE -import timber.log.Timber @Suppress("unused") class ReminderApp : MultiDexApplication(), KoinComponent { @@ -51,8 +50,9 @@ class ReminderApp : MultiDexApplication(), KoinComponent { override fun onCreate() { super.onCreate() - if (BuildConfig.DEBUG) Timber.plant(Timber.DebugTree()) - Traces.setUpKeys(this) + initLogging( + isDebug = BuildConfig.DEBUG + ) AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) val logger = object : Logger(level = Level.DEBUG) { override fun display(level: Level, msg: MESSAGE) { diff --git a/app/src/main/java/com/elementary/tasks/birthdays/create/AddBirthdayViewModel.kt b/app/src/main/java/com/elementary/tasks/birthdays/create/AddBirthdayViewModel.kt index cef506bde..c6e8b48f0 100644 --- a/app/src/main/java/com/elementary/tasks/birthdays/create/AddBirthdayViewModel.kt +++ b/app/src/main/java/com/elementary/tasks/birthdays/create/AddBirthdayViewModel.kt @@ -7,7 +7,6 @@ import com.elementary.tasks.birthdays.work.SingleBackupWorker import com.elementary.tasks.core.analytics.AnalyticsEventSender import com.elementary.tasks.core.analytics.Feature import com.elementary.tasks.core.analytics.FeatureUsedEvent -import com.elementary.tasks.core.analytics.Traces import com.elementary.tasks.core.appwidgets.UpdatesHelper import com.elementary.tasks.core.arch.BaseProgressViewModel import com.elementary.tasks.core.data.Commands @@ -25,9 +24,9 @@ import com.elementary.tasks.core.utils.io.UriReader import com.elementary.tasks.core.utils.mutableLiveDataOf import com.elementary.tasks.core.utils.toLiveData import com.elementary.tasks.core.utils.work.WorkerLauncher +import com.github.naz013.logging.Logger import kotlinx.coroutines.launch import org.threeten.bp.LocalDate -import timber.log.Timber import java.util.UUID class AddBirthdayViewModel( @@ -65,14 +64,14 @@ class AddBirthdayViewModel( fun load() { viewModelScope.launch(dispatcherProvider.default()) { val birthday = birthdaysDao.getById(id) ?: return@launch - Traces.logEvent("Birthday loaded from DB") + Logger.logEvent("Birthday loaded from DB") onBirthdayLoaded(birthday) } } fun onIntent() { intentDataHolder.get(Constants.INTENT_ITEM, Birthday::class.java)?.run { - Traces.logEvent("Birthday loaded from intent") + Logger.logEvent("Birthday loaded from intent") onBirthdayLoaded(this) isFromFile = true findSame(uuId) @@ -83,7 +82,7 @@ class AddBirthdayViewModel( viewModelScope.launch(dispatcherProvider.default()) { runCatching { uriReader.readBirthdayObject(uri)?.also { - Traces.logEvent("Birthday loaded from file") + Logger.logEvent("Birthday loaded from file") onBirthdayLoaded(it) isFromFile = true findSame(it.uuId) @@ -97,7 +96,7 @@ class AddBirthdayViewModel( } fun onDateChanged(localDate: LocalDate) { - Timber.d("onDateChanged: $localDate") + Logger.d("onDateChanged: $localDate") selectedDate = localDate _formattedDate.postValue(uiBirthdayDateFormatter.getDateFormatted(localDate)) } @@ -133,7 +132,7 @@ class AddBirthdayViewModel( updatedAt = dateTimeManager.getNowGmtDateTime(), ignoreYear = ignoreYear ) - Traces.logEvent("Birthday saved") + Logger.logEvent("Birthday saved") analyticsEventSender.send(FeatureUsedEvent(Feature.CREATE_BIRTHDAY)) saveBirthday(birthday) } @@ -147,7 +146,7 @@ class AddBirthdayViewModel( updatesHelper.updateTasksWidget() updatesHelper.updateBirthdaysWidget() workerLauncher.startWork(BirthdayDeleteBackupWorker::class.java, Constants.INTENT_ID, id) - Traces.logEvent("Birthday deleted") + Logger.logEvent("Birthday deleted") postInProgress(false) postCommand(Commands.DELETED) } diff --git a/app/src/main/java/com/elementary/tasks/core/analytics/Traces.kt b/app/src/main/java/com/elementary/tasks/core/analytics/Traces.kt deleted file mode 100644 index 399fa2018..000000000 --- a/app/src/main/java/com/elementary/tasks/core/analytics/Traces.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.elementary.tasks.core.analytics - -import android.content.Context -import com.elementary.tasks.R -import com.elementary.tasks.core.utils.Module -import com.elementary.tasks.core.utils.SuperUtil -import com.google.firebase.crashlytics.ktx.crashlytics -import com.google.firebase.crashlytics.setCustomKeys -import com.google.firebase.ktx.Firebase -import org.slf4j.LoggerFactory - -object Traces { - - var reportingEnabled: Boolean = true - var logger: Logger = FileLogger() - - fun log(message: String) { - logger.info(message) - } - - fun d(message: String) { - logger.debug(message) - } - - fun setUpKeys(context: Context) { - Firebase.crashlytics.setCustomKeys { - key("has_google_play_services", SuperUtil.isGooglePlayServicesAvailable(context)) - key("is_tablet", context.resources.getBoolean(R.bool.is_tablet)) - key("is_chrome_os", Module.isChromeOs(context)) - key("has_location", Module.hasLocation(context)) - key("has_camera", Module.hasCamera(context)) - key("has_telephony", Module.hasTelephony(context)) - } - } - - fun logEvent(message: String) { - logger.info(message) - if (reportingEnabled) { - Firebase.crashlytics.log(message) - } - } -} - -interface Logger { - fun info(message: String) - fun debug(message: String) -} - -class FileLogger( - private val logger: org.slf4j.Logger = LoggerFactory.getLogger("FileLogger") -) : Logger { - override fun info(message: String) { - logger.info(message) - } - - override fun debug(message: String) { - logger.debug(message) - } -} diff --git a/app/src/main/java/com/elementary/tasks/core/appwidgets/singlenote/SingleNoteWidgetPrefsProvider.kt b/app/src/main/java/com/elementary/tasks/core/appwidgets/singlenote/SingleNoteWidgetPrefsProvider.kt index d7b22e0f4..4bf038aad 100644 --- a/app/src/main/java/com/elementary/tasks/core/appwidgets/singlenote/SingleNoteWidgetPrefsProvider.kt +++ b/app/src/main/java/com/elementary/tasks/core/appwidgets/singlenote/SingleNoteWidgetPrefsProvider.kt @@ -1,10 +1,10 @@ package com.elementary.tasks.core.appwidgets.singlenote import android.content.Context -import com.elementary.tasks.core.analytics.Traces import com.elementary.tasks.core.appwidgets.WidgetPrefsProvider import com.elementary.tasks.core.utils.ThemeProvider import com.elementary.tasks.core.views.drawable.NoteDrawableParams +import com.github.naz013.logging.Logger class SingleNoteWidgetPrefsProvider( context: Context, @@ -57,7 +57,7 @@ class SingleNoteWidgetPrefsProvider( fun getTextColorPosition(): Int { return getInt(WIDGET_TEXT_COLOR_POSITION, def = ThemeProvider.Color.BLACK).also { - Traces.d("getTextColorPosition: $it") + Logger.d("getTextColorPosition: $it") } } @@ -75,7 +75,7 @@ class SingleNoteWidgetPrefsProvider( fun getOverlayColorPosition(): Int { return getInt(WIDGET_OVERLAY_COLOR_POSITION, def = ThemeProvider.Color.WHITE).also { - Traces.d("getOverlayColorPosition: $it") + Logger.d("getOverlayColorPosition: $it") } } diff --git a/app/src/main/java/com/elementary/tasks/core/cloud/DataFlow.kt b/app/src/main/java/com/elementary/tasks/core/cloud/DataFlow.kt index e5ba04094..60c364502 100644 --- a/app/src/main/java/com/elementary/tasks/core/cloud/DataFlow.kt +++ b/app/src/main/java/com/elementary/tasks/core/cloud/DataFlow.kt @@ -1,12 +1,12 @@ package com.elementary.tasks.core.cloud -import com.elementary.tasks.core.analytics.Traces import com.elementary.tasks.core.cloud.completables.Completable import com.elementary.tasks.core.cloud.converters.Convertible import com.elementary.tasks.core.cloud.converters.IndexTypes import com.elementary.tasks.core.cloud.repositories.Repository import com.elementary.tasks.core.cloud.storages.Storage import com.elementary.tasks.core.utils.datetime.DateTimeManager +import com.github.naz013.logging.Logger import org.koin.core.component.KoinComponent import org.koin.core.component.inject @@ -28,7 +28,7 @@ class DataFlow( val stream = convertible.toOutputStream(item) ?: return val metadata = convertible.metadata(item) storage.backup(stream, metadata) - Traces.log("Backed up file with ext = ${metadata.fileExt} and id = ${metadata.id}") + Logger.i("Backed up file with ext = ${metadata.fileExt} and id = ${metadata.id}") } suspend fun restore(id: String, type: IndexTypes) { @@ -47,7 +47,7 @@ class DataFlow( true } if (needUpdate) { - Traces.log("Saved remote file with ext = ${metadata.fileExt} and id = $id") + Logger.i("Saved remote file with ext = ${metadata.fileExt} and id = $id") repository.insert(item) completable?.action(item) } @@ -58,7 +58,7 @@ class DataFlow( if (id.isEmpty() || fileName.isEmpty()) { return } - Traces.log("Delete file with type = $type and id = $id") + Logger.i("Delete file with type = $type and id = $id") runCatching { val t = repository.get(id) if (t != null) { diff --git a/app/src/main/java/com/elementary/tasks/core/cloud/GTasks.kt b/app/src/main/java/com/elementary/tasks/core/cloud/GTasks.kt index c9f0e2b92..d3d2015cf 100644 --- a/app/src/main/java/com/elementary/tasks/core/cloud/GTasks.kt +++ b/app/src/main/java/com/elementary/tasks/core/cloud/GTasks.kt @@ -1,7 +1,6 @@ package com.elementary.tasks.core.cloud import android.content.Context -import com.elementary.tasks.core.analytics.Traces import com.elementary.tasks.core.data.dao.GoogleTaskListsDao import com.elementary.tasks.core.data.dao.GoogleTasksDao import com.elementary.tasks.core.data.models.GoogleTask @@ -10,6 +9,7 @@ import com.elementary.tasks.core.utils.datetime.DateTimeManager import com.elementary.tasks.core.utils.params.Prefs import com.elementary.tasks.googletasks.usecase.GoogleTaskFactory import com.elementary.tasks.googletasks.usecase.GoogleTaskListFactory +import com.github.naz013.logging.Logger import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential import com.google.api.client.http.javanet.NetHttpTransport import com.google.api.client.json.gson.GsonFactory @@ -17,7 +17,6 @@ import com.google.api.services.tasks.Tasks import com.google.api.services.tasks.TasksScopes import com.google.api.services.tasks.model.Task import com.google.api.services.tasks.model.TaskList -import timber.log.Timber import java.util.Collections class GTasks( @@ -42,9 +41,9 @@ class GTasks( } fun login(user: String) { - Traces.log("Login to Google Tasks") + Logger.i("Login to Google Tasks") if (SuperUtil.isGooglePlayServicesAvailable(context) && user.matches(".*@.*".toRegex())) { - Timber.d("user -> $user") + Logger.d("Logged google user -> $user") val credential = GoogleAccountCredential.usingOAuth2( context, Collections.singleton(TasksScopes.TASKS) @@ -61,7 +60,7 @@ class GTasks( } fun logOut() { - Traces.log("Log out from Google Tasks") + Logger.i("Log out from Google Tasks") prefs.tasksUser = Prefs.DRIVE_USER_NONE tasksService = null isLogged = false @@ -74,7 +73,7 @@ class GTasks( ?.filterNotNull() ?: emptyList() } catch (e: Exception) { - Timber.e(e, "Failed to get task lists") + Logger.e("Failed to get task lists", e) emptyList() } } @@ -83,7 +82,7 @@ class GTasks( return try { withService { it.tasklists().get(listId).execute() } } catch (e: Exception) { - Timber.e(e, "Failed to get task list") + Logger.e("Failed to get task list", e) null } } @@ -123,7 +122,7 @@ class GTasks( return true } } catch (e: Exception) { - Timber.e(e, "Failed to insert task id=${item.taskId}") + Logger.e("Failed to insert task id=${item.taskId}", e) return false } return false @@ -142,7 +141,7 @@ class GTasks( googleTasksDao.insert(googleTaskFactory.update(item, result)) } } catch (e: Exception) { - Timber.e(e, "Failed to update task status id=${item.taskId}") + Logger.e("Failed to update task status id=${item.taskId}", e) } } @@ -151,7 +150,7 @@ class GTasks( try { withService { it.tasks().delete(item.listId, item.taskId).execute() } } catch (e: Exception) { - Timber.e(e, "Failed to delete task id=${item.taskId}") + Logger.e("Failed to delete task id=${item.taskId}", e) } } @@ -170,7 +169,7 @@ class GTasks( task.updated = dateTimeManager.toRfc3339Format(System.currentTimeMillis()) withService { it.tasks().update(item.listId, task.id, task).execute() } } catch (e: Exception) { - Timber.e(e, "Failed to update task id=${item.taskId}") + Logger.e("Failed to update task id=${item.taskId}", e) } } @@ -178,7 +177,7 @@ class GTasks( try { return withService { it.tasks().list(listId).execute().items } ?: emptyList() } catch (e: Exception) { - Timber.e(e, "Failed to get tasks listId=$listId") + Logger.e(e, "Failed to get tasks listId=$listId") } return emptyList() } @@ -189,7 +188,7 @@ class GTasks( taskList.title = listTitle return withService { it.tasklists().insert(taskList).execute() } } catch (e: Exception) { - Timber.e(e, "Failed to add task list $listTitle") + Logger.e(e, "Failed to add task list $listTitle") null } } @@ -202,7 +201,7 @@ class GTasks( val item = googleTaskListFactory.create(result, color) googleTaskListsDao.insert(item) } catch (e: Exception) { - Timber.e(e, "Failed to insert task list $listTitle") + Logger.e(e, "Failed to insert task list $listTitle") } } @@ -219,7 +218,7 @@ class GTasks( googleTaskListsDao.insert(googleTaskListFactory.update(item, taskList)) } } catch (e: Exception) { - Timber.e(e, "Failed to update task list $listTitle") + Logger.e(e, "Failed to update task list $listTitle") } } @@ -230,7 +229,7 @@ class GTasks( try { withService { it.tasklists().delete(listId).execute() } } catch (e: Exception) { - Timber.e(e, "Failed to delete task list") + Logger.e(e, "Failed to delete task list") } } @@ -241,7 +240,7 @@ class GTasks( try { withService { it.tasks().clear(listId).execute() } } catch (e: Exception) { - Timber.e(e, "Failed to clear task list") + Logger.e(e, "Failed to clear task list") } } @@ -256,7 +255,7 @@ class GTasks( return insertTask(item) } } catch (e: Exception) { - Timber.e(e, "Failed to move task") + Logger.e(e, "Failed to move task") } return false } diff --git a/app/src/main/java/com/elementary/tasks/core/speech/SpeechEngine.kt b/app/src/main/java/com/elementary/tasks/core/speech/SpeechEngine.kt index 2806d1eed..75232744c 100644 --- a/app/src/main/java/com/elementary/tasks/core/speech/SpeechEngine.kt +++ b/app/src/main/java/com/elementary/tasks/core/speech/SpeechEngine.kt @@ -7,8 +7,8 @@ import android.os.Bundle import android.speech.RecognitionListener import android.speech.RecognizerIntent import android.speech.SpeechRecognizer -import com.elementary.tasks.core.analytics.Traces import com.elementary.tasks.core.utils.Module +import com.github.naz013.logging.Logger class SpeechEngine( private val context: Context, @@ -21,12 +21,12 @@ class SpeechEngine( private var speech: SpeechRecognizer? = null private val listener = object : RecognitionListener { override fun onReadyForSpeech(bundle: Bundle?) { - Traces.d("SpeechEngine:onReadyForSpeech") + Logger.d("SpeechEngine:onReadyForSpeech") callback?.onStarted() } override fun onBeginningOfSpeech() { - Traces.d("SpeechEngine:onBeginningOfSpeech") + Logger.d("SpeechEngine:onBeginningOfSpeech") // Show a progress indicator callback?.onSpeechStarted() speechTextProcessor.saveSection() @@ -39,13 +39,13 @@ class SpeechEngine( } override fun onEndOfSpeech() { - Traces.d("SpeechEngine:onEndOfSpeech") + Logger.d("SpeechEngine:onEndOfSpeech") // Hide the progress indicator callback?.onSpeechEnded() } override fun onError(i: Int) { - Traces.d("SpeechEngine:onError error=$i") + Logger.d("SpeechEngine:onError error=$i") releaseSpeech() callback?.onSpeechError(SpeechError.NoSpeechError) } @@ -55,14 +55,14 @@ class SpeechEngine( override fun onPartialResults(bundle: Bundle?) { val results = bundle?.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION) - Traces.d("SpeechEngine:onPartialResults res=${results?.size}") + Logger.d("SpeechEngine:onPartialResults res=${results?.size}") if (results != null && results.size > 0) { callback?.onSpeechResult(speechTextProcessor.process(results[0].toString())) } } override fun onEvent(i: Int, bundle: Bundle?) { - Traces.d("SpeechEngine:onEvent event=$i") + Logger.d("SpeechEngine:onEvent event=$i") } } @@ -90,7 +90,7 @@ class SpeechEngine( speech?.startListening(getIntent()) state = State.STARTED } catch (e: Throwable) { - Traces.d("SpeechEngine:startListening error=${e.message}") + Logger.e("SpeechEngine:startListening error=${e.message}") callback.onSpeechError(SpeechError.OperationError(0)) } } @@ -103,7 +103,7 @@ class SpeechEngine( try { releaseSpeech() } catch (e: Throwable) { - Traces.d("SpeechEngine:stopListening error=${e.message}") + Logger.e("SpeechEngine:stopListening error=${e.message}") callback?.onSpeechError(SpeechError.OperationError(1)) } } diff --git a/app/src/main/java/com/elementary/tasks/core/speech/SpeechEngineCallback.kt b/app/src/main/java/com/elementary/tasks/core/speech/SpeechEngineCallback.kt index e6b486720..8bd2075d7 100644 --- a/app/src/main/java/com/elementary/tasks/core/speech/SpeechEngineCallback.kt +++ b/app/src/main/java/com/elementary/tasks/core/speech/SpeechEngineCallback.kt @@ -1,29 +1,29 @@ package com.elementary.tasks.core.speech -import com.elementary.tasks.core.analytics.Traces +import com.github.naz013.logging.Logger abstract class SpeechEngineCallback { open fun onStarted() { - Traces.d("SpeechEngineCallback:onStarted") + Logger.d("SpeechEngineCallback:onStarted") } open fun onStopped() { - Traces.d("SpeechEngineCallback:onStopped") + Logger.d("SpeechEngineCallback:onStopped") } open fun onSpeechStarted() { - Traces.d("SpeechEngineCallback:onSpeechStarted") + Logger.d("SpeechEngineCallback:onSpeechStarted") } open fun onSpeechEnded() { - Traces.d("SpeechEngineCallback:onSpeechEnded") + Logger.d("SpeechEngineCallback:onSpeechEnded") } open fun onSpeechError(error: SpeechError) { - Traces.d("SpeechEngineCallback:onSpeechError error=$error") + Logger.d("SpeechEngineCallback:onSpeechError error=$error") } open fun onSpeechResult(speechText: SpeechText) { - Traces.d("SpeechEngineCallback:onSpeechResult text=$speechText") + Logger.d("SpeechEngineCallback:onSpeechResult text=$speechText") } } diff --git a/app/src/main/java/com/elementary/tasks/core/speech/SpeechTextProcessor.kt b/app/src/main/java/com/elementary/tasks/core/speech/SpeechTextProcessor.kt index 44aac0c35..e87f6669a 100644 --- a/app/src/main/java/com/elementary/tasks/core/speech/SpeechTextProcessor.kt +++ b/app/src/main/java/com/elementary/tasks/core/speech/SpeechTextProcessor.kt @@ -1,6 +1,6 @@ package com.elementary.tasks.core.speech -import com.elementary.tasks.core.analytics.Traces +import com.github.naz013.logging.Logger class SpeechTextProcessor(initValue: String = "") { @@ -9,7 +9,7 @@ class SpeechTextProcessor(initValue: String = "") { private var lastSpeechText: SpeechText? = null fun setText(text: String) { - Traces.d("SpeechTextProcessor:setText text=$text") + Logger.d("SpeechTextProcessor:setText text=$text") completedSection = if (text.isEmpty()) { "" } else { @@ -28,11 +28,11 @@ class SpeechTextProcessor(initValue: String = "") { fun process(text: String): SpeechText { if (text.isEmpty() && currentSection.isEmpty()) { - Traces.d("SpeechTextProcessor:process text is empty and currentSection is empty") + Logger.d("SpeechTextProcessor:process text is empty and currentSection is empty") return SpeechText(text = completedSection, newText = null) } if (text.isEmpty()) { - Traces.d("SpeechTextProcessor:process text is empty") + Logger.d("SpeechTextProcessor:process text is empty") saveSection() return SpeechText(text = completedSection, newText = null) } diff --git a/app/src/main/java/com/elementary/tasks/core/utils/DI.kt b/app/src/main/java/com/elementary/tasks/core/utils/DI.kt index 1030231d9..96c36244d 100644 --- a/app/src/main/java/com/elementary/tasks/core/utils/DI.kt +++ b/app/src/main/java/com/elementary/tasks/core/utils/DI.kt @@ -3,7 +3,6 @@ package com.elementary.tasks.core.utils import android.app.Activity import android.content.Context import com.backdoor.engine.Recognizer -import com.elementary.tasks.BuildConfig import com.elementary.tasks.core.analytics.AnalyticsEventSender import com.elementary.tasks.core.analytics.ReminderAnalyticsTracker import com.elementary.tasks.core.analytics.VoiceAnalyticsTracker @@ -301,6 +300,3 @@ fun providesRecognizer(prefs: Prefs, language: Language) = ) .setTimeZone(ZoneId.systemDefault().id) .build() - .apply { - enableLogging = BuildConfig.DEBUG - } diff --git a/app/src/main/java/com/elementary/tasks/core/utils/params/RemotePrefs.kt b/app/src/main/java/com/elementary/tasks/core/utils/params/RemotePrefs.kt index ae15c04eb..e5e02e4c8 100644 --- a/app/src/main/java/com/elementary/tasks/core/utils/params/RemotePrefs.kt +++ b/app/src/main/java/com/elementary/tasks/core/utils/params/RemotePrefs.kt @@ -1,7 +1,6 @@ package com.elementary.tasks.core.utils.params import com.elementary.tasks.R -import com.elementary.tasks.core.analytics.Traces import com.elementary.tasks.core.os.PackageManagerWrapper import com.elementary.tasks.core.utils.FeatureManager import com.elementary.tasks.core.utils.Language @@ -10,10 +9,10 @@ import com.elementary.tasks.core.utils.datetime.DateTimeManager import com.elementary.tasks.core.utils.params.remote.InternalMessageV1 import com.elementary.tasks.core.utils.params.remote.SaleMessageV2 import com.elementary.tasks.core.utils.params.remote.UpdateMessageV2 +import com.github.naz013.logging.Logger import com.google.firebase.remoteconfig.FirebaseRemoteConfig import com.google.firebase.remoteconfig.FirebaseRemoteConfigSettings import com.google.gson.Gson -import timber.log.Timber class RemotePrefs( private val prefs: Prefs, @@ -46,7 +45,7 @@ class RemotePrefs( private fun fetchConfig() { config?.fetchAndActivate()?.addOnCompleteListener { task -> - Timber.d("fetchConfig: ${task.isSuccessful}, ${task.exception}") + Logger.d("fetchConfig: ${task.isSuccessful}, ${task.exception}") if (task.isSuccessful) { config.fetchAndActivate() } @@ -68,8 +67,8 @@ class RemotePrefs( val updateMessage = runCatching { Gson().fromJson(json, UpdateMessageV2::class.java) }.getOrNull() - Timber.d("readUpdateMessage: json=$json") - Timber.d("readUpdateMessage: message=$updateMessage") + Logger.d("readUpdateMessage: json=$json") + Logger.d("readUpdateMessage: message=$updateMessage") if (updateMessage != null) { val currentVersionCode = packageManagerWrapper.getVersionCode() @@ -94,8 +93,8 @@ class RemotePrefs( val saleMessageV2 = runCatching { Gson().fromJson(json, SaleMessageV2::class.java) }.getOrNull() - Timber.d("readSaleMessage: json=$json") - Timber.d("readSaleMessage: message=$saleMessageV2") + Logger.d("readSaleMessage: json=$json") + Logger.d("readSaleMessage: message=$saleMessageV2") if (saleMessageV2 != null) { prefs.saleMessage = json ?: "" @@ -113,9 +112,9 @@ class RemotePrefs( val startDateTime = dateTimeManager.fromRfc3339ToLocal(saleMessageV2.startAt) val endDateTime = dateTimeManager.fromRfc3339ToLocal(saleMessageV2.endAt) - Timber.d("checkSaleMessage: now=$now") - Timber.d("checkSaleMessage: startDateTime=$startDateTime") - Timber.d("checkSaleMessage: endDateTime=$endDateTime") + Logger.d("checkSaleMessage: now=$now") + Logger.d("checkSaleMessage: startDateTime=$startDateTime") + Logger.d("checkSaleMessage: endDateTime=$endDateTime") if (startDateTime != null && endDateTime != null) { if (now.isAfter(startDateTime) && now.isBefore(endDateTime)) { @@ -141,8 +140,8 @@ class RemotePrefs( val internalMessageV1 = runCatching { Gson().fromJson(json, InternalMessageV1::class.java) }.getOrNull() - Timber.d("readInternalMessage: json=$json") - Timber.d("readInternalMessage: message=$internalMessageV1") + Logger.d("readInternalMessage: json=$json") + Logger.d("readInternalMessage: message=$internalMessageV1") if (internalMessageV1 != null) { prefs.internalMessage = json ?: "" @@ -160,9 +159,9 @@ class RemotePrefs( val startDateTime = dateTimeManager.fromRfc3339ToLocal(internalMessageV1.startAt) val endDateTime = dateTimeManager.fromRfc3339ToLocal(internalMessageV1.endAt) - Timber.d("checkInternalMessage: now=$now") - Timber.d("checkInternalMessage: startDateTime=$startDateTime") - Timber.d("checkInternalMessage: endDateTime=$endDateTime") + Logger.d("checkInternalMessage: now=$now") + Logger.d("checkInternalMessage: startDateTime=$startDateTime") + Logger.d("checkInternalMessage: endDateTime=$endDateTime") if (startDateTime != null && endDateTime != null) { if (now.isAfter(startDateTime) && now.isBefore(endDateTime)) { @@ -198,9 +197,9 @@ class RemotePrefs( val termsUrl = config?.getString(TERMS_URL) val voiceHelpUrls = config?.getString(VOICE_HELP_URLS) - Timber.d("RemoteConfig: privacyUrl=$privacyUrl") - Timber.d("RemoteConfig: termsUrl=$termsUrl") - Timber.d("RemoteConfig: voiceHelpJson=$voiceHelpUrls") + Logger.d("RemoteConfig: privacyUrl=$privacyUrl") + Logger.d("RemoteConfig: termsUrl=$termsUrl") + Logger.d("RemoteConfig: voiceHelpJson=$voiceHelpUrls") privacyUrl?.also { prefs.privacyUrl = it } termsUrl?.also { prefs.termsUrl = it } @@ -211,14 +210,14 @@ class RemotePrefs( FeatureManager.Feature.entries.map { it to (readBool(it.value) ?: it.defaultValue) }.forEach { - Traces.d("Feature ${it.first} isEnabled=${it.second}") + Logger.d("Feature ${it.first} isEnabled=${it.second}") prefs.putBoolean(it.first.value, it.second) } } private fun readBool(key: String): Boolean? { return config?.getBoolean(key).also { - Timber.d("Read bool key=$key, val=$it") + Logger.d("Read bool key=$key, val=$it") } } diff --git a/app/src/main/java/com/elementary/tasks/core/work/BackupDataWorker.kt b/app/src/main/java/com/elementary/tasks/core/work/BackupDataWorker.kt index 51e6d60a8..4a2507292 100644 --- a/app/src/main/java/com/elementary/tasks/core/work/BackupDataWorker.kt +++ b/app/src/main/java/com/elementary/tasks/core/work/BackupDataWorker.kt @@ -7,12 +7,12 @@ import androidx.work.NetworkType import androidx.work.OneTimeWorkRequest import androidx.work.WorkManager import androidx.work.WorkerParameters -import com.elementary.tasks.core.analytics.Traces import com.elementary.tasks.core.cloud.SyncManagers import com.elementary.tasks.core.cloud.storages.CompositeStorage import com.elementary.tasks.core.utils.DispatcherProvider import com.elementary.tasks.core.work.operation.SyncOperationType import com.elementary.tasks.core.work.operation.SyncOperationsFactory +import com.github.naz013.logging.Logger import kotlinx.coroutines.withContext class BackupDataWorker( @@ -25,12 +25,12 @@ class BackupDataWorker( override suspend fun doWork(): Result { withContext(dispatcherProvider.io()) { - Traces.log("Start full backup") + Logger.i("Start full backup") val storage = CompositeStorage(syncManagers.storageManager) val result = OperationProcessor( syncOperationsFactory(storage, SyncOperationType.JUST_BACKUP) ).process() - Traces.log("Full backup completed with result = $result") + Logger.i("Full backup completed with result = $result") } return Result.success() } diff --git a/app/src/main/java/com/elementary/tasks/core/work/BackupWorker.kt b/app/src/main/java/com/elementary/tasks/core/work/BackupWorker.kt index fb4e602d8..b380d66e1 100644 --- a/app/src/main/java/com/elementary/tasks/core/work/BackupWorker.kt +++ b/app/src/main/java/com/elementary/tasks/core/work/BackupWorker.kt @@ -1,12 +1,12 @@ package com.elementary.tasks.core.work -import com.elementary.tasks.core.analytics.Traces import com.elementary.tasks.core.cloud.SyncManagers import com.elementary.tasks.core.cloud.storages.CompositeStorage import com.elementary.tasks.core.utils.launchIo import com.elementary.tasks.core.utils.withUIContext import com.elementary.tasks.core.work.operation.SyncOperationType import com.elementary.tasks.core.work.operation.SyncOperationsFactory +import com.github.naz013.logging.Logger import kotlinx.coroutines.Job import timber.log.Timber @@ -37,11 +37,11 @@ class BackupWorker( private fun launchSync() { val storage = CompositeStorage(syncManagers.storageManager) mJob = launchIo { - Traces.log("Start full backup") + Logger.i("Start full backup") val result = OperationProcessor( syncOperationsFactory(storage, SyncOperationType.JUST_BACKUP, true) ).process() - Traces.log("Full backup completed with result = $result") + Logger.i("Full backup completed with result = $result") withUIContext { onEnd?.invoke() } diff --git a/app/src/main/java/com/elementary/tasks/core/work/SyncDataWorker.kt b/app/src/main/java/com/elementary/tasks/core/work/SyncDataWorker.kt index 873bb42da..777b40305 100644 --- a/app/src/main/java/com/elementary/tasks/core/work/SyncDataWorker.kt +++ b/app/src/main/java/com/elementary/tasks/core/work/SyncDataWorker.kt @@ -7,7 +7,6 @@ import androidx.work.NetworkType import androidx.work.OneTimeWorkRequest import androidx.work.WorkManager import androidx.work.WorkerParameters -import com.elementary.tasks.core.analytics.Traces import com.elementary.tasks.core.appwidgets.UpdatesHelper import com.elementary.tasks.core.cloud.SyncManagers import com.elementary.tasks.core.cloud.storages.CompositeStorage @@ -16,6 +15,7 @@ import com.elementary.tasks.core.utils.params.Prefs import com.elementary.tasks.core.utils.withUIContext import com.elementary.tasks.core.work.operation.SyncOperationType import com.elementary.tasks.core.work.operation.SyncOperationsFactory +import com.github.naz013.logging.Logger import kotlinx.coroutines.withContext class SyncDataWorker( @@ -39,7 +39,7 @@ class SyncDataWorker( syncOperationsFactory(storage, SyncOperationType.FULL) ).process() - Traces.log("Sync finished with result = $result") + Logger.i("Sync finished with result = $result") withUIContext { updatesHelper.updateWidgets() diff --git a/app/src/main/java/com/elementary/tasks/core/work/operation/BackupOperation.kt b/app/src/main/java/com/elementary/tasks/core/work/operation/BackupOperation.kt index a131c481c..9ff021017 100644 --- a/app/src/main/java/com/elementary/tasks/core/work/operation/BackupOperation.kt +++ b/app/src/main/java/com/elementary/tasks/core/work/operation/BackupOperation.kt @@ -1,22 +1,22 @@ package com.elementary.tasks.core.work.operation -import com.elementary.tasks.core.analytics.Traces import com.elementary.tasks.core.cloud.BulkDataFlow import com.elementary.tasks.core.cloud.converters.IndexTypes import com.elementary.tasks.core.work.Operation import com.elementary.tasks.core.work.OperationResult +import com.github.naz013.logging.Logger class BackupOperation( private val bulkDataFlow: BulkDataFlow, - val indexTypes: IndexTypes + private val indexTypes: IndexTypes ) : Operation { override suspend fun process(): OperationResult { return try { - Traces.log("Begin backup for $indexTypes") + Logger.i("Begin backup for $indexTypes") bulkDataFlow.backup() - Traces.log("Backup complete for $indexTypes") + Logger.i("Backup complete for $indexTypes") OperationResult.Success } catch (e: Throwable) { OperationResult.Failed diff --git a/app/src/main/java/com/elementary/tasks/core/work/operation/SyncOperation.kt b/app/src/main/java/com/elementary/tasks/core/work/operation/SyncOperation.kt index a1a2ab133..018299351 100644 --- a/app/src/main/java/com/elementary/tasks/core/work/operation/SyncOperation.kt +++ b/app/src/main/java/com/elementary/tasks/core/work/operation/SyncOperation.kt @@ -1,25 +1,25 @@ package com.elementary.tasks.core.work.operation -import com.elementary.tasks.core.analytics.Traces import com.elementary.tasks.core.cloud.BulkDataFlow import com.elementary.tasks.core.cloud.converters.IndexTypes import com.elementary.tasks.core.work.Operation import com.elementary.tasks.core.work.OperationResult +import com.github.naz013.logging.Logger class SyncOperation( private val bulkDataFlow: BulkDataFlow, - val indexTypes: IndexTypes + private val indexTypes: IndexTypes ) : Operation { override suspend fun process(): OperationResult { return try { - Traces.log("Begin backup for $indexTypes") + Logger.i("Begin backup for $indexTypes") bulkDataFlow.backup() - Traces.log("Begin restoring of data for $indexTypes") + Logger.i("Begin restoring of data for $indexTypes") bulkDataFlow.restore(indexTypes = indexTypes, deleteFile = false) - Traces.log("Sync complete for $indexTypes") + Logger.i("Sync complete for $indexTypes") OperationResult.Success } catch (e: Throwable) { OperationResult.Failed diff --git a/app/src/main/java/com/elementary/tasks/globalsearch/GlobalSearchViewModel.kt b/app/src/main/java/com/elementary/tasks/globalsearch/GlobalSearchViewModel.kt index b2045c27b..77edb550b 100644 --- a/app/src/main/java/com/elementary/tasks/globalsearch/GlobalSearchViewModel.kt +++ b/app/src/main/java/com/elementary/tasks/globalsearch/GlobalSearchViewModel.kt @@ -2,7 +2,6 @@ package com.elementary.tasks.globalsearch import androidx.lifecycle.viewModelScope import com.elementary.tasks.birthdays.preview.BirthdayPreviewActivity -import com.elementary.tasks.core.analytics.Traces import com.elementary.tasks.core.arch.BaseProgressViewModel import com.elementary.tasks.core.data.dao.RecentQueryDao import com.elementary.tasks.core.data.livedata.toSingleEvent @@ -18,6 +17,7 @@ import com.elementary.tasks.groups.create.CreateGroupActivity import com.elementary.tasks.notes.preview.NotePreviewActivity import com.elementary.tasks.places.create.CreatePlaceActivity import com.elementary.tasks.reminder.preview.ReminderPreviewActivity +import com.github.naz013.logging.Logger import kotlinx.coroutines.launch import org.threeten.bp.LocalDateTime @@ -41,7 +41,7 @@ class GlobalSearchViewModel( } fun onSearchResultClicked(searchResult: SearchResult) { - Traces.logEvent("Search result clicked") + Logger.logEvent("Search result clicked") createAction(searchResult)?.also { _navigateLiveData.postValue(it) } diff --git a/app/src/main/java/com/elementary/tasks/googletasks/usecase/db/DeleteGoogleTaskList.kt b/app/src/main/java/com/elementary/tasks/googletasks/usecase/db/DeleteGoogleTaskList.kt index 8e2b260d8..a900cbb91 100644 --- a/app/src/main/java/com/elementary/tasks/googletasks/usecase/db/DeleteGoogleTaskList.kt +++ b/app/src/main/java/com/elementary/tasks/googletasks/usecase/db/DeleteGoogleTaskList.kt @@ -1,8 +1,8 @@ package com.elementary.tasks.googletasks.usecase.db -import com.elementary.tasks.core.analytics.Traces import com.elementary.tasks.core.data.dao.GoogleTaskListsDao import com.elementary.tasks.core.data.models.GoogleTaskList +import com.github.naz013.logging.Logger class DeleteGoogleTaskList( private val googleTaskListsDao: GoogleTaskListsDao, @@ -11,7 +11,7 @@ class DeleteGoogleTaskList( ) { operator fun invoke(googleTaskList: GoogleTaskList) { - Traces.log("Delete Google task list") + Logger.i("Delete Google task list") googleTaskListsDao.delete(googleTaskList) val googleTasks = getGoogleTasksByList(googleTaskList) deleteGoogleTasks(googleTasks) diff --git a/app/src/main/java/com/elementary/tasks/googletasks/usecase/remote/DownloadGoogleTaskList.kt b/app/src/main/java/com/elementary/tasks/googletasks/usecase/remote/DownloadGoogleTaskList.kt index b73d7ca21..28dc9bad1 100644 --- a/app/src/main/java/com/elementary/tasks/googletasks/usecase/remote/DownloadGoogleTaskList.kt +++ b/app/src/main/java/com/elementary/tasks/googletasks/usecase/remote/DownloadGoogleTaskList.kt @@ -1,9 +1,9 @@ package com.elementary.tasks.googletasks.usecase.remote -import com.elementary.tasks.core.analytics.Traces import com.elementary.tasks.core.cloud.GTasks import com.elementary.tasks.core.data.models.GoogleTaskList import com.elementary.tasks.googletasks.usecase.GoogleTaskListFactory +import com.github.naz013.logging.Logger class DownloadGoogleTaskList( private val gTasks: GTasks, @@ -12,7 +12,7 @@ class DownloadGoogleTaskList( operator fun invoke(taskList: GoogleTaskList): GoogleTaskList { if (!gTasks.isLogged) { - Traces.log("Download task list - not logged, return local") + Logger.i("Download task list - not logged, return local") return taskList } diff --git a/app/src/main/java/com/elementary/tasks/googletasks/usecase/task/SyncGoogleTasks.kt b/app/src/main/java/com/elementary/tasks/googletasks/usecase/task/SyncGoogleTasks.kt index e19d0e983..c80552d36 100644 --- a/app/src/main/java/com/elementary/tasks/googletasks/usecase/task/SyncGoogleTasks.kt +++ b/app/src/main/java/com/elementary/tasks/googletasks/usecase/task/SyncGoogleTasks.kt @@ -1,13 +1,12 @@ package com.elementary.tasks.googletasks.usecase.task -import com.elementary.tasks.core.analytics.Traces import com.elementary.tasks.core.data.dao.GoogleTasksDao import com.elementary.tasks.core.data.models.GoogleTaskList import com.elementary.tasks.googletasks.usecase.db.DeleteGoogleTasks import com.elementary.tasks.googletasks.usecase.db.SaveGoogleTasks import com.elementary.tasks.googletasks.usecase.remote.DownloadGoogleTasks import com.elementary.tasks.googletasks.usecase.remote.UploadGoogleTask -import timber.log.Timber +import com.github.naz013.logging.Logger class SyncGoogleTasks( private val googleTasksDao: GoogleTasksDao, @@ -20,24 +19,24 @@ class SyncGoogleTasks( operator fun invoke(taskList: GoogleTaskList) { // Get local tasks val local = googleTasksDao.getAllByList(taskList.listId) - Traces.log("Sync tasks for list - number of local tasks = ${local.size}") + Logger.i("Sync tasks for list - number of local tasks = ${local.size}") // Upload changed tasks - Traces.log("Sync tasks for list - upload") + Logger.i("Sync tasks for list - upload") local.filterNot { it.uploaded }.forEach { uploadGoogleTask(it) } // Download remote tasks val remote = downloadGoogleTasks(taskList) - Traces.log("Sync tasks for list - remote tasks = ${remote.size}") - Timber.d("Remote tasks = $remote") + Logger.i("Sync tasks for list - remote tasks = ${remote.size}") + Logger.d("Remote tasks = $remote") // Save new tasks - Traces.log("Sync tasks for list - save remote version") + Logger.i("Sync tasks for list - save remote version") saveGoogleTasks(remote) val remoteMap = remote.associateBy { it.taskId } val localDelete = local.filterNot { remoteMap.containsKey(it.taskId) } - Traces.log("Sync tasks for list - delete local versions = ${localDelete.size}") + Logger.i("Sync tasks for list - delete local versions = ${localDelete.size}") deleteGoogleTasks(localDelete) } } diff --git a/app/src/main/java/com/elementary/tasks/googletasks/usecase/tasklist/SyncAllGoogleTaskLists.kt b/app/src/main/java/com/elementary/tasks/googletasks/usecase/tasklist/SyncAllGoogleTaskLists.kt index 8c2eeb877..d2e8cee67 100644 --- a/app/src/main/java/com/elementary/tasks/googletasks/usecase/tasklist/SyncAllGoogleTaskLists.kt +++ b/app/src/main/java/com/elementary/tasks/googletasks/usecase/tasklist/SyncAllGoogleTaskLists.kt @@ -1,9 +1,9 @@ package com.elementary.tasks.googletasks.usecase.tasklist -import com.elementary.tasks.core.analytics.Traces import com.elementary.tasks.core.cloud.GTasks import com.elementary.tasks.core.data.dao.GoogleTaskListsDao import com.elementary.tasks.googletasks.usecase.db.DeleteGoogleTaskList +import com.github.naz013.logging.Logger class SyncAllGoogleTaskLists( private val gTasks: GTasks, @@ -15,29 +15,29 @@ class SyncAllGoogleTaskLists( operator fun invoke() { if (!gTasks.isLogged) { - Traces.log("Sync all gtasks - not logged") + Logger.i("Sync all gtasks - not logged") return } // Get all Google Task Lists from DB val localTaskLists = googleTaskListsDao.all() - Traces.log("Sync all gtasks, number of local = ${localTaskLists.size}") + Logger.i("Sync all gtasks, number of local = ${localTaskLists.size}") // Sync each of them localTaskLists.forEach { syncGoogleTaskList(it) } // Download latest version of task lists val remoteTaskLists = gTasks.getTaskLists() - Traces.log("Sync all gtasks, number of remote = ${remoteTaskLists.size}") + Logger.i("Sync all gtasks, number of remote = ${remoteTaskLists.size}") // Save updated to DB val localMap = localTaskLists.associateBy { it.listId } remoteTaskLists.filterNot { localMap.containsKey(it.id) } .also { if (it.isNotEmpty()) { - Traces.log("Sync all gtasks, add new task lists = ${it.size}") + Logger.i("Sync all gtasks, add new task lists = ${it.size}") } else { - Traces.log("Sync all gtasks, no new task lists") + Logger.i("Sync all gtasks, no new task lists") } } .forEach { addNewTaskList(it) } @@ -49,7 +49,7 @@ class SyncAllGoogleTaskLists( // Set default Task list if not present if (googleTaskListsDao.defaultGoogleTaskList() == null) { - Traces.log("Sync all gtasks, set default task list") + Logger.i("Sync all gtasks, set default task list") googleTaskListsDao.all().firstOrNull() ?.apply { def = 1 } ?.also { googleTaskListsDao.insert(it) } diff --git a/app/src/main/java/com/elementary/tasks/googletasks/usecase/tasklist/SyncGoogleTaskList.kt b/app/src/main/java/com/elementary/tasks/googletasks/usecase/tasklist/SyncGoogleTaskList.kt index 5f26aa23f..fe6fb0253 100644 --- a/app/src/main/java/com/elementary/tasks/googletasks/usecase/tasklist/SyncGoogleTaskList.kt +++ b/app/src/main/java/com/elementary/tasks/googletasks/usecase/tasklist/SyncGoogleTaskList.kt @@ -1,11 +1,11 @@ package com.elementary.tasks.googletasks.usecase.tasklist -import com.elementary.tasks.core.analytics.Traces import com.elementary.tasks.core.cloud.GTasks import com.elementary.tasks.core.data.models.GoogleTaskList -import com.elementary.tasks.googletasks.usecase.task.SyncGoogleTasks import com.elementary.tasks.googletasks.usecase.db.SaveGoogleTaskList import com.elementary.tasks.googletasks.usecase.remote.DownloadGoogleTaskList +import com.elementary.tasks.googletasks.usecase.task.SyncGoogleTasks +import com.github.naz013.logging.Logger class SyncGoogleTaskList( private val gTasks: GTasks, @@ -16,22 +16,22 @@ class SyncGoogleTaskList( operator fun invoke(list: GoogleTaskList) { if (!gTasks.isLogged) { - Traces.log("Sync task list - not logged") + Logger.i("Sync task list - not logged") return } // Upload if not uploaded // Download remote version - Traces.log("Sync task list - load remote version") + Logger.i("Sync task list - load remote version") val remote = downloadGoogleTaskList(list) // Save updated version to db - Traces.log("Sync task list - save new version") + Logger.i("Sync task list - save new version") saveGoogleTaskList(remote) // Sync Tasks - Traces.log("Sync task list - sync tasks") + Logger.i("Sync task list - sync tasks") syncGoogleTasks(remote) } } diff --git a/app/src/main/java/com/elementary/tasks/groups/create/CreateGroupViewModel.kt b/app/src/main/java/com/elementary/tasks/groups/create/CreateGroupViewModel.kt index a7ae43ae6..89e2abb4b 100644 --- a/app/src/main/java/com/elementary/tasks/groups/create/CreateGroupViewModel.kt +++ b/app/src/main/java/com/elementary/tasks/groups/create/CreateGroupViewModel.kt @@ -7,25 +7,25 @@ import androidx.lifecycle.viewModelScope import com.elementary.tasks.core.analytics.AnalyticsEventSender import com.elementary.tasks.core.analytics.Feature import com.elementary.tasks.core.analytics.FeatureUsedEvent -import com.elementary.tasks.core.analytics.Traces +import com.elementary.tasks.core.arch.BaseProgressViewModel import com.elementary.tasks.core.cloud.FileConfig +import com.elementary.tasks.core.data.Commands import com.elementary.tasks.core.data.adapter.group.UiGroupEditAdapter import com.elementary.tasks.core.data.dao.ReminderGroupDao import com.elementary.tasks.core.data.models.ReminderGroup import com.elementary.tasks.core.data.ui.group.UiGroupEdit import com.elementary.tasks.core.os.ContextProvider import com.elementary.tasks.core.utils.Constants +import com.elementary.tasks.core.utils.DispatcherProvider import com.elementary.tasks.core.utils.IdProvider import com.elementary.tasks.core.utils.datetime.DateTimeManager import com.elementary.tasks.core.utils.io.MemoryUtil import com.elementary.tasks.core.utils.mutableLiveDataOf import com.elementary.tasks.core.utils.toLiveData import com.elementary.tasks.core.utils.work.WorkerLauncher -import com.elementary.tasks.core.arch.BaseProgressViewModel -import com.elementary.tasks.core.data.Commands -import com.elementary.tasks.core.utils.DispatcherProvider import com.elementary.tasks.groups.work.GroupDeleteBackupWorker import com.elementary.tasks.groups.work.GroupSingleBackupWorker +import com.github.naz013.logging.Logger import kotlinx.coroutines.launch import java.util.UUID @@ -142,7 +142,7 @@ class CreateGroupViewModel( Constants.INTENT_ID, group.groupUuId ) - Traces.logEvent("Group saved") + Logger.logEvent("Group saved") postInProgress(false) postCommand(Commands.SAVED) } @@ -155,7 +155,7 @@ class CreateGroupViewModel( reminderGroupDao.delete(reminderGroup) postInProgress(false) postCommand(Commands.DELETED) - Traces.logEvent("Group deleted") + Logger.logEvent("Group deleted") workerLauncher.startWork( GroupDeleteBackupWorker::class.java, Constants.INTENT_ID, diff --git a/app/src/main/java/com/elementary/tasks/home/BottomNavActivity.kt b/app/src/main/java/com/elementary/tasks/home/BottomNavActivity.kt index 2e83b5a72..3b35d9e73 100644 --- a/app/src/main/java/com/elementary/tasks/home/BottomNavActivity.kt +++ b/app/src/main/java/com/elementary/tasks/home/BottomNavActivity.kt @@ -17,7 +17,6 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.elementary.tasks.AdsProvider import com.elementary.tasks.R -import com.elementary.tasks.core.analytics.Traces import com.elementary.tasks.core.arch.BindingActivity import com.elementary.tasks.core.os.datapicker.VoiceRecognitionLauncher import com.elementary.tasks.core.utils.ui.GlobalAction @@ -31,10 +30,10 @@ import com.elementary.tasks.navigation.SearchableFragmentQueryObserver import com.elementary.tasks.navigation.fragments.BaseNavigationFragment import com.elementary.tasks.navigation.topfragment.BaseTopFragment import com.elementary.tasks.voice.ConversationViewModel +import com.github.naz013.logging.Logger import com.google.android.material.search.SearchView import org.koin.android.ext.android.inject import org.koin.androidx.viewmodel.ext.android.viewModel -import timber.log.Timber class BottomNavActivity : BindingActivity(), @@ -57,7 +56,7 @@ class BottomNavActivity : override fun onCreate(savedInstanceState: Bundle?) { enableEdgeToEdge() super.onCreate(savedInstanceState) - Timber.d("onCreate: ${intent.action}, ${intent.data?.toString()}, ${intent.extras?.keySet()}") + Logger.d("onCreate: ${intent.action}, ${intent.data?.toString()}, ${intent.extras?.keySet()}") val navHostFragment = supportFragmentManager.findFragmentById(R.id.mainNavigationFragment) as NavHostFragment @@ -106,7 +105,7 @@ class BottomNavActivity : override fun setCurrentFragment(fragment: BaseNavigationFragment<*>) { currentResumedFragment = fragment binding.bottomNavigation.visibleGone(fragment is BaseTopFragment<*>) - Traces.logEvent("Fragment opened = ${fragment.javaClass.name}") + Logger.logEvent("Fragment opened = ${fragment.javaClass.name}") } override fun onCreateFragment(fragment: BaseNavigationFragment<*>) { @@ -144,7 +143,7 @@ class BottomNavActivity : } override fun handleBackPress(): Boolean { - Timber.d("handleBackPress: $currentResumedFragment") + Logger.d("handleBackPress: $currentResumedFragment") if (currentResumedFragment is HomeFragment) { finishAffinity() } else { diff --git a/app/src/main/java/com/elementary/tasks/notes/create/CreateNoteViewModel.kt b/app/src/main/java/com/elementary/tasks/notes/create/CreateNoteViewModel.kt index 9324874e8..5dbcaf7d8 100644 --- a/app/src/main/java/com/elementary/tasks/notes/create/CreateNoteViewModel.kt +++ b/app/src/main/java/com/elementary/tasks/notes/create/CreateNoteViewModel.kt @@ -11,7 +11,6 @@ import com.elementary.tasks.R import com.elementary.tasks.core.analytics.AnalyticsEventSender import com.elementary.tasks.core.analytics.Feature import com.elementary.tasks.core.analytics.FeatureUsedEvent -import com.elementary.tasks.core.analytics.Traces import com.elementary.tasks.core.arch.BaseProgressViewModel import com.elementary.tasks.core.cloud.FileConfig import com.elementary.tasks.core.cloud.converters.NoteToOldNoteConverter @@ -49,11 +48,11 @@ import com.elementary.tasks.notes.create.images.ImageDecoder import com.elementary.tasks.notes.work.DeleteNoteBackupWorker import com.elementary.tasks.notes.work.NoteSingleBackupWorker import com.elementary.tasks.reminder.work.ReminderSingleBackupWorker +import com.github.naz013.logging.Logger import kotlinx.coroutines.launch import org.threeten.bp.LocalDate import org.threeten.bp.LocalDateTime import org.threeten.bp.LocalTime -import timber.log.Timber import java.io.ByteArrayInputStream import java.io.ByteArrayOutputStream import java.io.File @@ -244,7 +243,7 @@ class CreateNoteViewModel( val filePath = noteImageRepository.saveTemporaryImage(imageFile.fileName, bs) - Timber.d("addBitmap: size=${bos.size()}") + Logger.d("addBitmap: size=${bos.size()}") imageFile = imageFile.copy( filePath = filePath, state = UiNoteImageState.READY @@ -300,7 +299,7 @@ class CreateNoteViewModel( } fun parseDrop(clipData: ClipData, text: String) { - Timber.d("parseDrop: ${clipData.itemCount}, ${clipData.description}") + Logger.d("parseDrop: ${clipData.itemCount}, ${clipData.description}") viewModelScope.launch(dispatcherProvider.default()) { var parsedText = "" val uris = mutableListOf() @@ -343,7 +342,7 @@ class CreateNoteViewModel( } noteWithImages.note?.archived = false analyticsEventSender.send(FeatureUsedEvent(Feature.CREATE_NOTE)) - Traces.logEvent("Note saved") + Logger.logEvent("Note saved") saveNote(noteWithImages, reminder) } @@ -352,7 +351,7 @@ class CreateNoteViewModel( postInProgress(true) viewModelScope.launch(dispatcherProvider.default()) { v.updatedAt = DateTimeManager.gmtDateTime - Timber.d("saveNote: %s", note) + Logger.d("saveNote: $note") saveImages(note.images, v.key) notesDao.insert(v) workerLauncher.startWork(NoteSingleBackupWorker::class.java, Constants.INTENT_ID, v.key) @@ -443,16 +442,16 @@ class CreateNoteViewModel( private fun saveImages(list: List, id: String) { val oldList = notesDao.getImagesByNoteId(id) - Timber.d("saveImages: ${oldList.size}") + Logger.d("saveImages: ${oldList.size}") for (image in oldList) { - Timber.d("saveImages: delete -> ${image.id}, ${image.noteId}") + Logger.d("saveImages: delete -> ${image.id}, ${image.noteId}") notesDao.delete(image) } noteImageRepository.moveImagesToFolder(list, id) .map { it.copy(noteId = id) } .takeIf { it.isNotEmpty() } ?.also { - Timber.d("saveImages: new list -> $it") + Logger.d("saveImages: new list -> $it") notesDao.insertAll(it) } } diff --git a/app/src/main/java/com/elementary/tasks/places/create/PlaceViewModel.kt b/app/src/main/java/com/elementary/tasks/places/create/PlaceViewModel.kt index 72317197e..8a668ed24 100644 --- a/app/src/main/java/com/elementary/tasks/places/create/PlaceViewModel.kt +++ b/app/src/main/java/com/elementary/tasks/places/create/PlaceViewModel.kt @@ -3,7 +3,6 @@ package com.elementary.tasks.places.create import android.content.ContentResolver import android.net.Uri import androidx.lifecycle.viewModelScope -import com.elementary.tasks.core.analytics.Traces import com.elementary.tasks.core.arch.BaseProgressViewModel import com.elementary.tasks.core.cloud.FileConfig import com.elementary.tasks.core.data.Commands @@ -22,6 +21,7 @@ import com.elementary.tasks.core.utils.toLiveData import com.elementary.tasks.core.utils.work.WorkerLauncher import com.elementary.tasks.places.work.PlaceDeleteBackupWorker import com.elementary.tasks.places.work.PlaceSingleBackupWorker +import com.github.naz013.logging.Logger import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.util.UUID @@ -83,7 +83,7 @@ class PlaceViewModel( } placesDao.insert(place) workerLauncher.startWork(PlaceSingleBackupWorker::class.java, Constants.INTENT_ID, place.id) - Traces.logEvent("Place saved") + Logger.logEvent("Place saved") postInProgress(false) postCommand(Commands.SAVED) } diff --git a/app/src/main/java/com/elementary/tasks/reminder/build/BuildReminderViewModel.kt b/app/src/main/java/com/elementary/tasks/reminder/build/BuildReminderViewModel.kt index 78db91c77..160e8f360 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/build/BuildReminderViewModel.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/build/BuildReminderViewModel.kt @@ -12,7 +12,6 @@ import com.elementary.tasks.core.analytics.FeatureUsedEvent import com.elementary.tasks.core.analytics.PresetAction import com.elementary.tasks.core.analytics.PresetUsed import com.elementary.tasks.core.analytics.ReminderAnalyticsTracker -import com.elementary.tasks.core.analytics.Traces import com.elementary.tasks.core.appwidgets.UpdatesHelper import com.elementary.tasks.core.arch.BaseProgressViewModel import com.elementary.tasks.core.cloud.FileConfig @@ -67,12 +66,12 @@ import com.elementary.tasks.reminder.build.valuedialog.ValueDialogDataHolder import com.elementary.tasks.reminder.work.ReminderDeleteBackupWorker import com.elementary.tasks.reminder.work.ReminderSingleBackupWorker import com.elementary.tasks.voice.VoiceCommandProcessor +import com.github.naz013.logging.Logger import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import org.threeten.bp.LocalDate import org.threeten.bp.LocalTime -import timber.log.Timber class BuildReminderViewModel( private val googleCalendarUtils: GoogleCalendarUtils, @@ -176,7 +175,7 @@ class BuildReminderViewModel( } fun onConfigurationChanged() { - Traces.d("BuildReminderVM: onConfigurationChanged") + Logger.d("BuildReminderVM: onConfigurationChanged") viewModelScope.launch(dispatcherProvider.default()) { val used = builderItemsLogic.getUsed() @@ -192,7 +191,7 @@ class BuildReminderViewModel( } fun processVoiceResult(matches: List) { - Timber.d("processVoiceResult: $matches") + Logger.d("processVoiceResult: $matches") viewModelScope.launch(dispatcherProvider.default()) { when (val result = voiceCommandProcessor(matches)) { is VoiceCommandProcessor.ProcessResult.ReminderSuccess -> { @@ -212,20 +211,20 @@ class BuildReminderViewModel( } fun onPermissionsGranted() { - Traces.log("Granted permission") + Logger.i("Granted permission") saveReminder(requestedNewId) } fun saveReminder(newId: Boolean) { postInProgress(true) - Traces.log("Start reminder saving, use new ID = $newId") + Logger.i("Start reminder saving, use new ID = $newId") viewModelScope.launch(dispatcherProvider.default()) { val builderItems = builderItemsLogic.getUsed().toMutableList() - Timber.d("saveReminder: builderItems=$builderItems") - Traces.log("Number of builder items = ${builderItems.size}") + Logger.d("saveReminder: builderItems=$builderItems") + Logger.i("Number of builder items = ${builderItems.size}") val allValid = builderItems.all { it.modifier.isCorrect() } - Traces.log("Are all builder items valid = $allValid") + Logger.i("Are all builder items valid = $allValid") if (!allValid) { postInProgress(false) @@ -234,14 +233,14 @@ class BuildReminderViewModel( val permissionResult = permissionValidator(builderItems) if (permissionResult is PermissionValidator.Result.Failure) { - Traces.log("Not all permissions granted. Request for = ${permissionResult.permissions}") + Logger.i("Not all permissions granted. Request for = ${permissionResult.permissions}") requestedNewId = newId _askPermissions.postValue(Event(permissionResult.permissions)) postInProgress(false) return@launch } - Traces.log("All permissions granted") + Logger.i("All permissions granted") if (!hasGroupBuilderItem(builderItems)) { getGroupBuilderItem()?.also { @@ -252,7 +251,7 @@ class BuildReminderViewModel( val reminder = original ?: Reminder() when (val buildResult = biToReminderAdapter(reminder, builderItems, newId)) { is BiToReminderAdapter.BuildResult.Success -> { - Traces.log("Reminder build success") + Logger.i("Reminder build success") saveAndStartReminder(buildResult.reminder, isEdit = isEdited) @@ -264,7 +263,7 @@ class BuildReminderViewModel( } is BiToReminderAdapter.BuildResult.Error -> { - Traces.log("Reminder build failed with error = ${buildResult.error}") + Logger.i("Reminder build failed with error = ${buildResult.error}") } } postInProgress(false) @@ -272,7 +271,7 @@ class BuildReminderViewModel( } fun handleDeepLink(intent: Intent?) { - Timber.d("handleDeepLink: $intent") + Logger.i("handleDeepLink: $intent") if (intent == null) { return } @@ -281,17 +280,17 @@ class BuildReminderViewModel( val action = intent.action when { action == Intent.ACTION_SEND && "text/plain" == intent.type -> { - Traces.log("Handle reminder text Deep Link") + Logger.i("Handle reminder text Deep Link") handleSendText(intent) } intent.data != null -> { - Traces.log("Handle reminder file Deep Link") + Logger.i("Handle reminder file Deep Link") readFromIntent(intent.data) } intent.hasExtra(Constants.INTENT_ITEM) -> { - Traces.log("Handle reminder object Deep Link") + Logger.i("Handle reminder object Deep Link") readObjectFromIntent(intent) } @@ -300,7 +299,7 @@ class BuildReminderViewModel( } !intentId.isNullOrEmpty() -> { - Traces.log("Handle reminder ID Deep Link") + Logger.i("Handle reminder ID Deep Link") editReminderIfNeeded(intentId) } } @@ -320,7 +319,7 @@ class BuildReminderViewModel( } fun onEditPermissionsGranted() { - Traces.log("On builder item edit Permission granted") + Logger.i("On builder item edit Permission granted") viewModelScope.launch(dispatcherProvider.default()) { updateSelector() } @@ -329,7 +328,7 @@ class BuildReminderViewModel( } fun onItemEditedClicked(position: Int, builderItem: BuilderItem<*>) { - Traces.log("On builder item edit clicked, type = ${builderItem.biType}") + Logger.i("On builder item edit clicked, type = ${builderItem.biType}") val pair = position to builderItem val permissions = builderItem.constraints.filterIsInstance() if (permissions.isNotEmpty()) { @@ -348,7 +347,7 @@ class BuildReminderViewModel( } fun addItem(builderItem: BuilderItem<*>) { - Traces.log("Add builder item, type = ${builderItem.biType}") + Logger.i("Add builder item, type = ${builderItem.biType}") viewModelScope.launch(dispatcherProvider.default()) { builderItemsLogic.addNew(builderItem) @@ -360,7 +359,7 @@ class BuildReminderViewModel( } fun removeItem(position: Int, builderItem: BuilderItem<*>) { - Traces.log("Remove builder item, type = ${builderItem.biType}") + Logger.i("Remove builder item, type = ${builderItem.biType}") viewModelScope.launch(dispatcherProvider.default()) { builderItem.modifier.setDefault() builderItemsLogic.update(position, builderItem) @@ -370,7 +369,7 @@ class BuildReminderViewModel( } fun updateValue(position: Int, builderItem: BuilderItem<*>) { - Traces.log("Update VALUE for builder item, type = ${builderItem.biType}") + Logger.i("Update VALUE for builder item, type = ${builderItem.biType}") viewModelScope.launch(dispatcherProvider.default()) { builderItemsLogic.update(position, builderItem) updateSelector() @@ -386,7 +385,7 @@ class BuildReminderViewModel( when (val deepLinkData = parser.readDeepLinkData(intent)) { is ReminderDatetimeTypeDeepLinkData -> { if (deepLinkData.type == Reminder.BY_DATE) { - Traces.log("Handle reminder date/time Deep Link") + Logger.i("Handle reminder date/time Deep Link") addDateItemToBuilder(deepLinkData.dateTime.toLocalDate()) addTimeItemToBuilder(deepLinkData.dateTime.toLocalTime()) updateSelector() @@ -400,7 +399,7 @@ class BuildReminderViewModel( private fun addDateItemToBuilder(date: LocalDate) { val itemIndex = builderItemsLogic.getUsed().indexOfFirst { it.biType == BiType.DATE } - Traces.log("Add Date builder item") + Logger.i("Add Date builder item") if (itemIndex == -1) { builderItemsLogic.getAvailable().firstOrNull { it.biType == BiType.DATE } ?.let { it as DateBuilderItem } @@ -415,7 +414,7 @@ class BuildReminderViewModel( private fun addTimeItemToBuilder(time: LocalTime) { val itemIndex = builderItemsLogic.getUsed().indexOfFirst { it.biType == BiType.TIME } - Traces.log("Add Time builder item") + Logger.i("Add Time builder item") if (itemIndex == -1) { builderItemsLogic.getAvailable().firstOrNull { it.biType == BiType.TIME } ?.let { it as TimeBuilderItem } @@ -455,7 +454,7 @@ class BuildReminderViewModel( } } } catch (e: Throwable) { - Timber.d("readFromIntent: ${e.message}") + Logger.e("readFromIntent: ${e.message}") } } @@ -471,7 +470,7 @@ class BuildReminderViewModel( private fun addSummaryItemToBuilder(text: String) { val itemIndex = builderItemsLogic.getUsed().indexOfFirst { it.biType == BiType.SUMMARY } - Traces.log("Add Summary builder item") + Logger.i("Add Summary builder item") if (itemIndex == -1) { builderItemsLogic.getAvailable().firstOrNull { it.biType == BiType.SUMMARY } ?.let { it as SummaryBuilderItem } @@ -493,7 +492,7 @@ class BuildReminderViewModel( } private suspend fun editReminder(reminder: Reminder) { - Traces.log("Edit reminder, id = ${reminder.uuId}") + Logger.i("Edit reminder, id = ${reminder.uuId}") isEdited = true original = reminder @@ -503,7 +502,7 @@ class BuildReminderViewModel( } val builderItems = reminderToBiDecomposer(reminder) - Timber.d("editReminder: builderItems=$builderItems") + Logger.d("editReminder: builderItems=$builderItems") if (builderItems.isNotEmpty()) { builderItemsLogic.setAll(builderItems) @@ -518,7 +517,7 @@ class BuildReminderViewModel( } private suspend fun useBuilderPreset(preset: RecurPreset) { - Traces.log("Use reminder builder preset") + Logger.i("Use reminder builder preset") val items = builderPresetToBiAdapter(preset) if (items.isNotEmpty()) { builderItemsLogic.setAll(items) @@ -528,7 +527,7 @@ class BuildReminderViewModel( } private suspend fun useRecurPreset(preset: RecurPreset) { - Traces.log("Use reminder RECUR preset") + Logger.i("Use reminder RECUR preset") val params = runCatching { recurrenceManager.parseObject(preset.recurObject) }.getOrNull() ?.getTagOrNull(TagType.RRULE) ?.params @@ -578,7 +577,7 @@ class BuildReminderViewModel( .flatten() .toSet() - Timber.d("updateSelector: errors=${errors.toList()}") + Logger.d("updateSelector: errors=${errors.toList()}") val uiSelectorItems = uiSelectorItemsAdapter.calculateStates( builderItemsLogic.getUsed(), @@ -604,10 +603,10 @@ class BuildReminderViewModel( private suspend fun updateBuilderState() { val builderItems = builderItemsLogic.getUsed().toMutableList() - Timber.d("updateBuilderState: builderItems=$builderItems") + Logger.d("updateBuilderState: builderItems=$builderItems") val allValid = builderItems.all { it.modifier.isCorrect() } - Timber.d("updateBuilderState: allValid=$allValid") + Logger.d("updateBuilderState: allValid=$allValid") if (!allValid) { return @@ -635,7 +634,7 @@ class BuildReminderViewModel( ) _canSaveAsPreset.postValue(false) _canSave.postValue(false) - Timber.d("updateBuilderState: build failed ${buildResult.error}") + Logger.d("updateBuilderState: build failed ${buildResult.error}") } } } @@ -655,7 +654,7 @@ class BuildReminderViewModel( } private suspend fun savePreset(items: List>) { - Traces.log("Save new preset") + Logger.i("Save new preset") val preset = RecurPreset( recurObject = "", name = presetName, @@ -671,7 +670,7 @@ class BuildReminderViewModel( private suspend fun saveAndStartReminder(reminder: Reminder, isEdit: Boolean = true) { runBlocking { - Timber.d("saveAndStartReminder: save START") + Logger.i("saveAndStartReminder: save START") if (reminder.groupUuId == "") { val group = reminderGroupDao.defaultGroup() if (group != null) { @@ -690,23 +689,23 @@ class BuildReminderViewModel( } } eventControlFactory.getController(reminder).justStart() - Timber.d("saveAndStartReminder: save DONE") + Logger.i("saveAndStartReminder: save DONE") analyticsEventSender.send(FeatureUsedEvent(Feature.CREATE_REMINDER)) reminderAnalyticsTracker.sendEvent(UiReminderType(reminder.type)) - Traces.logEvent("Reminder saved, type = ${reminder.type}") + Logger.logEvent("Reminder saved, type = ${reminder.type}") } backupReminder(reminder.uuId) } private suspend fun pauseReminder(reminder: Reminder) { - Traces.log("Pause reminder") + Logger.i("Pause reminder") isPaused = true eventControlFactory.getController(reminder).pause() } private fun resumeReminder(reminder: Reminder) { - Traces.log("Resume reminder") + Logger.i("Resume reminder") viewModelScope.launch(dispatcherProvider.default()) { eventControlFactory.getController(reminder).resume() } @@ -719,7 +718,7 @@ class BuildReminderViewModel( return } - Traces.log("Move reminder to Archive") + Logger.i("Move reminder to Archive") withResult { reminder.isRemoved = true @@ -737,7 +736,7 @@ class BuildReminderViewModel( return } - Traces.log("Delete reminder") + Logger.i("Delete reminder") if (showMessage) { withResult { @@ -766,7 +765,7 @@ class BuildReminderViewModel( } private fun backupReminder(uuId: String) { - Traces.log("Schedule reminder backup work") + Logger.i("Schedule reminder backup work") workerLauncher.startWork(ReminderSingleBackupWorker::class.java, Constants.INTENT_ID, uuId) } } diff --git a/app/src/main/java/com/elementary/tasks/reminder/create/EditReminderViewModel.kt b/app/src/main/java/com/elementary/tasks/reminder/create/EditReminderViewModel.kt index 37b4cbe9b..97096c8c7 100644 --- a/app/src/main/java/com/elementary/tasks/reminder/create/EditReminderViewModel.kt +++ b/app/src/main/java/com/elementary/tasks/reminder/create/EditReminderViewModel.kt @@ -8,7 +8,6 @@ import com.elementary.tasks.core.analytics.AnalyticsEventSender import com.elementary.tasks.core.analytics.Feature import com.elementary.tasks.core.analytics.FeatureUsedEvent import com.elementary.tasks.core.analytics.ReminderAnalyticsTracker -import com.elementary.tasks.core.analytics.Traces import com.elementary.tasks.core.arch.BaseProgressViewModel import com.elementary.tasks.core.controller.EventControlFactory import com.elementary.tasks.core.data.Commands @@ -28,9 +27,9 @@ import com.elementary.tasks.core.utils.toLiveData import com.elementary.tasks.core.utils.work.WorkerLauncher import com.elementary.tasks.reminder.work.ReminderDeleteBackupWorker import com.elementary.tasks.reminder.work.ReminderSingleBackupWorker +import com.github.naz013.logging.Logger import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking -import timber.log.Timber @Deprecated("Replaced by new Builder") class EditReminderViewModel( @@ -76,7 +75,7 @@ class EditReminderViewModel( postInProgress(true) viewModelScope.launch(dispatcherProvider.default()) { runBlocking { - Timber.d("saveAndStartReminder: save START") + Logger.d("saveAndStartReminder: save START") if (reminder.groupUuId == "") { val group = reminderGroupDao.defaultGroup() if (group != null) { @@ -95,10 +94,10 @@ class EditReminderViewModel( } } eventControlFactory.getController(reminder).enable() - Timber.d("saveAndStartReminder: save DONE") + Logger.d("saveAndStartReminder: save DONE") analyticsEventSender.send(FeatureUsedEvent(Feature.CREATE_REMINDER)) reminderAnalyticsTracker.sendEvent(UiReminderType(reminder.type)) - Traces.logEvent("Reminder saved, type = ${reminder.type}") + Logger.logEvent("Reminder saved, type = ${reminder.type}") } backupReminder(reminder.uuId) postInProgress(false) @@ -167,7 +166,7 @@ class EditReminderViewModel( } private fun backupReminder(uuId: String) { - Timber.d("backupReminder: start backup") + Logger.d("backupReminder: start backup") workerLauncher.startWork(ReminderSingleBackupWorker::class.java, Constants.INTENT_ID, uuId) } } diff --git a/app/src/main/java/com/elementary/tasks/settings/troubleshooting/TroubleshootingViewModel.kt b/app/src/main/java/com/elementary/tasks/settings/troubleshooting/TroubleshootingViewModel.kt index 99f284570..eb832081c 100644 --- a/app/src/main/java/com/elementary/tasks/settings/troubleshooting/TroubleshootingViewModel.kt +++ b/app/src/main/java/com/elementary/tasks/settings/troubleshooting/TroubleshootingViewModel.kt @@ -1,7 +1,6 @@ package com.elementary.tasks.settings.troubleshooting import androidx.lifecycle.LifecycleOwner -import com.elementary.tasks.core.analytics.Traces import com.elementary.tasks.core.arch.BaseProgressViewModel import com.elementary.tasks.core.data.livedata.toSingleEvent import com.elementary.tasks.core.os.ContextProvider @@ -12,7 +11,7 @@ import com.elementary.tasks.core.utils.FeatureManager import com.elementary.tasks.core.utils.io.CacheUtil import com.elementary.tasks.core.utils.mutableLiveDataOf import com.elementary.tasks.core.utils.toLiveData -import timber.log.Timber +import com.github.naz013.logging.Logger import java.io.File class TroubleshootingViewModel( @@ -51,7 +50,7 @@ class TroubleshootingViewModel( private fun getLogFile(): File? { val dir = contextProvider.context.dataDir val logDir = File(dir, "files/log") - Timber.d("getLogFile: dir = $dir, logDir = $logDir") + Logger.d("getLogFile: dir = $dir, logDir = $logDir") if (!logDir.exists()) return null val files = logDir.listFiles() ?: return null return files.firstOrNull { it.name.endsWith(".log") } @@ -67,7 +66,7 @@ class TroubleshootingViewModel( private fun checkLogs() { val enabled = featureManager.isFeatureEnabled(FeatureManager.Feature.ALLOW_LOGS) && hasLogFiles() - Traces.d("Logging is $enabled") + Logger.d("Logging is $enabled") _showSendLogs.postValue(enabled) } @@ -77,7 +76,7 @@ class TroubleshootingViewModel( private fun checkBatteryOptimization() { val optimizationStatus = powerManager?.isIgnoringBatteryOptimizations(packageName()) - Traces.d("Battery optimization is disabled = $optimizationStatus") + Logger.d("Battery optimization is disabled = $optimizationStatus") _hideBatteryOptimizationCard.postValue(optimizationStatus ?: false) } diff --git a/app/src/test/java/com/elementary/tasks/BaseTest.kt b/app/src/test/java/com/elementary/tasks/BaseTest.kt index 66791e7d9..45adeab7d 100644 --- a/app/src/test/java/com/elementary/tasks/BaseTest.kt +++ b/app/src/test/java/com/elementary/tasks/BaseTest.kt @@ -2,8 +2,7 @@ package com.elementary.tasks import android.os.Looper import androidx.arch.core.executor.testing.InstantTaskExecutorRule -import com.elementary.tasks.core.analytics.Logger -import com.elementary.tasks.core.analytics.Traces +import com.github.naz013.logging.Logger import io.mockk.every import io.mockk.mockk import io.mockk.mockkStatic @@ -22,16 +21,8 @@ open class BaseTest { @Before open fun setUp() { - Traces.reportingEnabled = false - Traces.logger = object : Logger { - override fun info(message: String) { - println(message) - } - - override fun debug(message: String) { - println(message) - } - } + Logger.reportingEnabled = false + Logger.loggingEnabled = false Dispatchers.setMain(Dispatchers.Unconfined) mockkStatic(Looper::class) val looper = mockk { diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 8f5818b02..000000000 --- a/build.gradle +++ /dev/null @@ -1,34 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. - -buildscript { - ext.kotlin_version = '2.1.0' - repositories { - google() - maven { url "https://plugins.gradle.org/m2/" } - maven { - url "https://storage.googleapis.com/r8-releases/raw/master" - } - } - dependencies { - classpath 'com.android.tools.build:gradle:8.7.3' - classpath 'com.google.gms:google-services:4.4.2' - classpath 'com.google.firebase:firebase-crashlytics-gradle:3.0.2' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.8.5" - classpath "org.jlleitschuh.gradle:ktlint-gradle:11.5.0" - classpath "com.google.devtools.ksp:symbol-processing-gradle-plugin:2.1.0-1.0.29" - } -} - -allprojects { - repositories { - google() - mavenCentral() - maven { url 'https://maven.google.com/' } - maven { url 'https://jitpack.io' } - } -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 000000000..7a12953bc --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,12 @@ +plugins { + alias(libs.plugins.android.application) apply false + alias(libs.plugins.android.library) apply false + alias(libs.plugins.kotlin.android) apply false + alias(libs.plugins.kotlin.jvm) apply false + alias(libs.plugins.kotlin.parcelize) apply false + alias(libs.plugins.navigation.safeargs) apply false + alias(libs.plugins.google.services) apply false + alias(libs.plugins.crashlytics.gradle) apply false + alias(libs.plugins.ktlint) apply false + alias(libs.plugins.ksp) apply false +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 000000000..102c38a12 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,56 @@ +[versions] +minSdk = "29" +compileSdk = "35" +kotlinTargetJvm = "17" + +# Plugins +agp = "8.7.3" +kotlin = "2.1.0" +google-services = "4.4.2" +navigation-safeargs = "2.8.5" +crashlytics-gradle = "3.0.2" +ktlint = "11.5.0" +ksp = "2.1.0-1.0.29" + +# Libraries +firebase-bom = "33.7.0" + +commons-lang3 = "3.17.0" +threetenbp = "1.7.0" + +slf4j-api = "2.0.16" +logback-android = "3.0.0" + +junit = "4.13.2" +mockk = "1.13.13" +logback-classic = "1.5.12" + +[libraries] +kotlin-stdlib = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib", version.ref = "kotlin" } +commons-lang3 = { group = "org.apache.commons", name = "commons-lang3", version.ref = "commons-lang3" } +threetenbp = { group = "org.threeten", name = "threetenbp", version.ref = "threetenbp" } + +firebase-bom = { module = "com.google.firebase:firebase-bom", version.ref = "firebase-bom" } +firebase-crashlytics = { module = "com.google.firebase:firebase-crashlytics" } + +slf4j-api = { group = "org.slf4j", name = "slf4j-api", version.ref = "slf4j-api" } +logback-android = { group = "com.github.tony19", name = "logback-android", version.ref = "logback-android" } + +# Testing +junit = { group = "junit", name = "junit", version.ref = "junit" } +mockk = { group = "io.mockk", name = "mockk", version.ref = "mockk" } + +logback-classic = { group = "ch.qos.logback", name = "logback-classic", version.ref = "logback-classic" } + +[plugins] +android-application = { id = "com.android.application", version.ref = "agp" } +android-library = { id = "com.android.library", version.ref = "agp" } +kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } +kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" } +java-library = { id = "java-library" } +google-services = { id = "com.google.gms.google-services", version.ref = "google-services" } +navigation-safeargs = { id = "androidx.navigation.safeargs.kotlin", version.ref = "navigation-safeargs" } +crashlytics-gradle = { id = "com.google.firebase.crashlytics", version.ref = "crashlytics-gradle" } +ktlint = { id = "org.jlleitschuh.gradle.ktlint", version.ref = "ktlint" } +ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } diff --git a/logging-api/.gitignore b/logging-api/.gitignore new file mode 100644 index 000000000..42afabfd2 --- /dev/null +++ b/logging-api/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/logging-api/build.gradle.kts b/logging-api/build.gradle.kts new file mode 100644 index 000000000..8b3859b1f --- /dev/null +++ b/logging-api/build.gradle.kts @@ -0,0 +1,21 @@ +plugins { + alias(libs.plugins.java.library) + alias(libs.plugins.kotlin.jvm) + alias(libs.plugins.ktlint) +} + +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17 + } +} + +ktlint { + android = false + outputColorName.set("RED") +} diff --git a/logging-api/src/main/kotlin/com/github/naz013/logging/FirebaseLogger.kt b/logging-api/src/main/kotlin/com/github/naz013/logging/FirebaseLogger.kt new file mode 100644 index 000000000..473377ddc --- /dev/null +++ b/logging-api/src/main/kotlin/com/github/naz013/logging/FirebaseLogger.kt @@ -0,0 +1,6 @@ +package com.github.naz013.logging + +interface FirebaseLogger { + fun logEvent(event: String) + fun logEvent(event: String, params: Map) +} diff --git a/logging-api/src/main/kotlin/com/github/naz013/logging/Logger.kt b/logging-api/src/main/kotlin/com/github/naz013/logging/Logger.kt new file mode 100644 index 000000000..cfce16aa3 --- /dev/null +++ b/logging-api/src/main/kotlin/com/github/naz013/logging/Logger.kt @@ -0,0 +1,81 @@ +package com.github.naz013.logging + +object Logger { + + var loggingEnabled: Boolean = true + var reportingEnabled: Boolean = true + private var isDebug: Boolean = false + private var loggerProvider: LoggerProvider? = null + private var firebaseLogger: FirebaseLogger? = null + + fun initLogging( + isDebug: Boolean, + loggerProvider: LoggerProvider, + firebaseLogger: FirebaseLogger + ) { + this.isDebug = isDebug + this.loggerProvider = loggerProvider + this.firebaseLogger = firebaseLogger + } + + fun d(tag: String, message: String) { + d("$tag: $message") + } + + fun d(message: String) { + if (loggingEnabled && isDebug) { + loggerProvider?.debug(message) + } + } + + fun i(tag: String, message: String) { + i("$tag: $message") + } + + fun i(message: String) { + if (loggingEnabled) { + loggerProvider?.info(message) + } + } + + fun w(tag: String, message: String) { + w("$tag: $message") + } + + fun w(message: String) { + if (loggingEnabled) { + loggerProvider?.warning(message) + } + } + + fun e(tag: String, message: String, t: Throwable) { + e("$tag: $message", t) + } + + fun e(tag: String, message: String) { + e("$tag: $message") + } + + fun e(t: Throwable, message: String) { + e(message, t) + } + + fun e(message: String, t: Throwable) { + if (loggingEnabled) { + loggerProvider?.error(message, t) + } + } + + fun e(message: String) { + if (loggingEnabled) { + loggerProvider?.error(message) + } + } + + fun logEvent(event: String) { + loggerProvider?.info(event) + if (reportingEnabled) { + firebaseLogger?.logEvent(event) + } + } +} diff --git a/logging-api/src/main/kotlin/com/github/naz013/logging/LoggerProvider.kt b/logging-api/src/main/kotlin/com/github/naz013/logging/LoggerProvider.kt new file mode 100644 index 000000000..ab987a57c --- /dev/null +++ b/logging-api/src/main/kotlin/com/github/naz013/logging/LoggerProvider.kt @@ -0,0 +1,10 @@ +package com.github.naz013.logging + +interface LoggerProvider { + fun info(message: String) + fun debug(message: String) + fun error(message: String) + fun error(message: String, throwable: Throwable) + fun warning(message: String) + fun warning(message: String, throwable: Throwable) +} diff --git a/logging/.gitignore b/logging/.gitignore new file mode 100644 index 000000000..42afabfd2 --- /dev/null +++ b/logging/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/logging/build.gradle.kts b/logging/build.gradle.kts new file mode 100644 index 000000000..d9ca27f63 --- /dev/null +++ b/logging/build.gradle.kts @@ -0,0 +1,50 @@ +plugins { + alias(libs.plugins.android.library) + alias(libs.plugins.kotlin.android) + alias(libs.plugins.ktlint) +} + +android { + namespace = "com.github.naz013.logging" + compileSdk = libs.versions.compileSdk.get().toInt() + + defaultConfig { + minSdk = libs.versions.minSdk.get().toInt() + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles("consumer-rules.pro") + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + kotlinOptions { + jvmTarget = libs.versions.kotlinTargetJvm.get() + } +} + +dependencies { + implementation(project(":logging-api")) + implementation(libs.slf4j.api) + implementation(libs.logback.android) + + implementation(platform(libs.firebase.bom)) + implementation(libs.firebase.crashlytics) + + testImplementation(libs.logback.classic) +} + +ktlint { + android = false + outputColorName.set("RED") +} diff --git a/logging/consumer-rules.pro b/logging/consumer-rules.pro new file mode 100644 index 000000000..e69de29bb diff --git a/logging/proguard-rules.pro b/logging/proguard-rules.pro new file mode 100644 index 000000000..481bb4348 --- /dev/null +++ b/logging/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/logging/src/androidTest/java/com/github/naz013/logging/ExampleInstrumentedTest.kt b/logging/src/androidTest/java/com/github/naz013/logging/ExampleInstrumentedTest.kt new file mode 100644 index 000000000..93826db26 --- /dev/null +++ b/logging/src/androidTest/java/com/github/naz013/logging/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.github.naz013.logging + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.github.naz013.logging.test", appContext.packageName) + } +} diff --git a/logging/src/main/AndroidManifest.xml b/logging/src/main/AndroidManifest.xml new file mode 100644 index 000000000..8bdb7e14b --- /dev/null +++ b/logging/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + diff --git a/app/src/main/assets/logback.xml b/logging/src/main/assets/logback.xml similarity index 100% rename from app/src/main/assets/logback.xml rename to logging/src/main/assets/logback.xml diff --git a/logging/src/main/kotlin/com/github/naz013/logging/FirebaseLoggerImpl.kt b/logging/src/main/kotlin/com/github/naz013/logging/FirebaseLoggerImpl.kt new file mode 100644 index 000000000..3fb9e7035 --- /dev/null +++ b/logging/src/main/kotlin/com/github/naz013/logging/FirebaseLoggerImpl.kt @@ -0,0 +1,14 @@ +package com.github.naz013.logging + +import com.google.firebase.crashlytics.ktx.crashlytics +import com.google.firebase.ktx.Firebase + +internal class FirebaseLoggerImpl : FirebaseLogger { + override fun logEvent(event: String) { + Firebase.crashlytics.log(event) + } + + override fun logEvent(event: String, params: Map) { + Firebase.crashlytics.log(event) + } +} diff --git a/logging/src/main/kotlin/com/github/naz013/logging/LoggerProviderImpl.kt b/logging/src/main/kotlin/com/github/naz013/logging/LoggerProviderImpl.kt new file mode 100644 index 000000000..557819a3c --- /dev/null +++ b/logging/src/main/kotlin/com/github/naz013/logging/LoggerProviderImpl.kt @@ -0,0 +1,43 @@ +package com.github.naz013.logging + +import android.util.Log +import org.slf4j.LoggerFactory + +internal class LoggerProviderImpl : LoggerProvider { + + private val logger: org.slf4j.Logger = LoggerFactory.getLogger("FileLogger") + + override fun info(message: String) { + logger.info(message) + Log.i(TAG, message) + } + + override fun debug(message: String) { + logger.debug(message) + Log.d(TAG, message) + } + + override fun error(message: String) { + logger.error(message) + Log.e(TAG, message) + } + + override fun error(message: String, throwable: Throwable) { + logger.error(message, throwable) + Log.e(TAG, message, throwable) + } + + override fun warning(message: String) { + logger.warn(message) + Log.w(TAG, message) + } + + override fun warning(message: String, throwable: Throwable) { + logger.warn(message, throwable) + Log.w(TAG, message, throwable) + } + + companion object { + private const val TAG = "ReminderLog" + } +} diff --git a/logging/src/main/kotlin/com/github/naz013/logging/LoggingInitializer.kt b/logging/src/main/kotlin/com/github/naz013/logging/LoggingInitializer.kt new file mode 100644 index 000000000..5bcb11866 --- /dev/null +++ b/logging/src/main/kotlin/com/github/naz013/logging/LoggingInitializer.kt @@ -0,0 +1,13 @@ +package com.github.naz013.logging + +import android.app.Application + +fun Application.initLogging( + isDebug: Boolean = false +) { + Logger.initLogging( + isDebug = isDebug, + loggerProvider = LoggerProviderImpl(), + firebaseLogger = FirebaseLoggerImpl() + ) +} diff --git a/logging/src/test/java/com/github/naz013/logging/ExampleUnitTest.kt b/logging/src/test/java/com/github/naz013/logging/ExampleUnitTest.kt new file mode 100644 index 000000000..1cfc9963b --- /dev/null +++ b/logging/src/test/java/com/github/naz013/logging/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.github.naz013.logging + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index e66939f9e..000000000 --- a/settings.gradle +++ /dev/null @@ -1,3 +0,0 @@ -include ':app' -include ':voice-engine-ktx' -rootProject.name = "Reminder" \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 000000000..319c2f072 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,24 @@ +import java.net.URI + +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + + repositories { + google() + mavenCentral() + maven { url = URI.create("https://jitpack.io") } + } +} + +rootProject.name = "Reminder" +include(":app") +include(":voice-engine-ktx") +include(":logging") +include(":logging-api") diff --git a/voice-engine-ktx/build.gradle b/voice-engine-ktx/build.gradle deleted file mode 100644 index dd8f49f03..000000000 --- a/voice-engine-ktx/build.gradle +++ /dev/null @@ -1,25 +0,0 @@ -plugins { - id 'java-library' - id 'kotlin' - id 'org.jlleitschuh.gradle.ktlint' -} - -java { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 -} - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - implementation 'org.apache.commons:commons-lang3:3.14.0' - - implementation 'org.threeten:threetenbp:1.6.9' - - testImplementation 'junit:junit:4.13.2' - testImplementation 'io.mockk:mockk:1.13.11' -} - -ktlint { - android = false - outputColorName.set("RED") -} diff --git a/voice-engine-ktx/build.gradle.kts b/voice-engine-ktx/build.gradle.kts new file mode 100644 index 000000000..056c6820b --- /dev/null +++ b/voice-engine-ktx/build.gradle.kts @@ -0,0 +1,32 @@ +plugins { + alias(libs.plugins.java.library) + alias(libs.plugins.kotlin.jvm) + alias(libs.plugins.ktlint) +} + +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17 + } +} + +ktlint { + android = false + outputColorName.set("RED") +} + +dependencies { + + implementation(project(":logging-api")) + implementation(libs.kotlin.stdlib) + implementation(libs.commons.lang3) + implementation(libs.threetenbp) + + testImplementation(libs.junit) + testImplementation(libs.mockk) +} diff --git a/voice-engine-ktx/src/main/java/com/backdoor/engine/Recognizer.kt b/voice-engine-ktx/src/main/java/com/backdoor/engine/Recognizer.kt index 73cda4a5d..bb359519a 100644 --- a/voice-engine-ktx/src/main/java/com/backdoor/engine/Recognizer.kt +++ b/voice-engine-ktx/src/main/java/com/backdoor/engine/Recognizer.kt @@ -6,10 +6,9 @@ import com.backdoor.engine.misc.Action import com.backdoor.engine.misc.ActionType import com.backdoor.engine.misc.Ampm import com.backdoor.engine.misc.ContactsInterface -import com.backdoor.engine.misc.Logger -import com.backdoor.engine.misc.Logger.log import com.backdoor.engine.misc.LongInternal import com.backdoor.engine.misc.TimeUtil.getGmtFromDateTime +import com.github.naz013.logging.Logger import org.apache.commons.lang3.StringUtils import org.threeten.bp.LocalDate import org.threeten.bp.LocalDateTime @@ -23,11 +22,6 @@ class Recognizer private constructor( timeZone: String ) { - var enableLogging: Boolean = true - set(value) { - field = value - Logger.LOG_ENABLED = value - } private var contactsInterface: ContactsInterface? = null private var zoneId = ZoneId.of(timeZone) @@ -47,12 +41,12 @@ class Recognizer private constructor( } fun recognize(input: String): Model? { - log("recognize: input = $input, worker = $worker") + Logger.d("recognize: input = $input, worker = $worker") return input.lowercase(LOCALE).trim() .let { worker.splitWords(it) ?: "" } - .also { log("recognize: after split words = $it") } + .also { Logger.d("recognize: after split words = $it") } .let { worker.replaceNumbers(it) ?: "" } - .also { log("recognize: after numbers replaced = $it") } + .also { Logger.d("recognize: after numbers replaced = $it") } .let { s -> val showAction = if (worker.hasShowAction(s)) { worker.getShowAction(s) @@ -67,7 +61,7 @@ class Recognizer private constructor( val ampm = worker.getAmpm(s) val time = runCatching { worker.getTime(s, ampm, times) }.getOrNull() val canBeReminder = worker.hasCall(s) || worker.hasSender(s) || date != null || time != null - log("recognize: action=$showAction, event=$event, can=$canBeReminder") + Logger.d("recognize: action=$showAction, event=$event, can=$canBeReminder") when { showAction != null -> createAction(worker.clearShowAction(s), showAction) worker.hasNote(s) -> getNote(input) @@ -83,10 +77,10 @@ class Recognizer private constructor( } private fun parseReminder(input: String, origin: String): Model? { - log("parse: reminder $input") + Logger.d("parse: reminder $input") return Proc(input = input) .also { proc -> - log("parse: call $proc") + Logger.d("parse: call $proc") if (worker.hasCall(proc.input)) { proc.hasAction = true proc.action = Action.CALL @@ -97,7 +91,7 @@ class Recognizer private constructor( } } .also { proc -> - log("parse: sender $proc") + Logger.d("parse: sender $proc") if (worker.hasSender(proc.input)) { worker.getMessageType(proc.input)?.also { action -> proc.hasAction = true @@ -113,7 +107,7 @@ class Recognizer private constructor( } } .also { proc -> - log("parse: has repeat $proc") + Logger.d("parse: has repeat $proc") if (worker.hasRepeat(proc.input).also { proc.isRepeating = it }) { proc.isEveryDay = worker.hasEveryDay(proc.input) proc.updateInput { worker.clearRepeat(it) } @@ -127,31 +121,31 @@ class Recognizer private constructor( } } .also { proc -> - log("parse: calendar $proc") + Logger.d("parse: calendar $proc") proc.hasCalendar = worker.hasCalendar(proc.input).also { b -> if (b) proc.updateInput { worker.clearCalendar(it) } } } .also { proc -> - log("parse: today $proc") + Logger.d("parse: today $proc") proc.hasToday = worker.hasToday(proc.input).also { b -> if (b) proc.updateInput { worker.clearToday(it) } } } .also { proc -> - log("parse: after tomorrow $proc") + Logger.d("parse: after tomorrow $proc") proc.hasAfterTomorrow = worker.hasAfterTomorrow(proc.input).also { b -> if (b) proc.updateInput { worker.clearAfterTomorrow(it) } } } .also { proc -> - log("parse: tomorrow $proc") + Logger.d("parse: tomorrow $proc") proc.hasTomorrow = worker.hasTomorrow(proc.input).also { b -> if (b) proc.updateInput { worker.clearTomorrow(it) } } } .also { proc -> - log("parse: timer check $proc") + Logger.d("parse: timer check $proc") proc.hasTimer = worker.hasTimer(proc.input).also { b -> if (b) { proc.updateInput { worker.cleanTimer(it) } @@ -162,13 +156,13 @@ class Recognizer private constructor( } } .also { proc -> - log("parse: ampm $proc") + Logger.d("parse: ampm $proc") proc.ampm = worker.getAmpm(proc.input)?.also { proc.updateInput { worker.clearAmpm(it) } } } .also { proc -> - log("parse: weekdays $proc") + Logger.d("parse: weekdays $proc") if (!proc.isEveryDay) { proc.weekdays = worker.getWeekDays(proc.input) proc.hasWeekday = proc.weekdays.any { it == 1 }.also { b -> @@ -184,39 +178,39 @@ class Recognizer private constructor( } } .also { proc -> - log("parse: date $proc") + Logger.d("parse: date $proc") proc.updateInput { s -> worker.getDateAndClear(s) { proc.date = it } } } .also { proc -> - log("parse: time $proc") + Logger.d("parse: time $proc") proc.time = worker.getTime(proc.input, proc.ampm, times)?.also { proc.updateInput { worker.clearTime(it) } } } .also { proc -> - log("parse: calculate date time $proc") + Logger.d("parse: calculate date time $proc") if (proc.hasToday) { - log("parse: today") + Logger.d("parse: today") proc.dateTime = getTodayTime(proc.time) } else if (proc.hasAfterTomorrow) { - log("parse: after tomorrow") + Logger.d("parse: after tomorrow") proc.dateTime = getAfterTomorrowTime(proc.time) } else if (proc.hasTomorrow) { - log("parse: tomorrow") + Logger.d("parse: tomorrow") proc.dateTime = getTomorrowTime(proc.time) } else if (proc.hasWeekday && !proc.isRepeating) { - log("parse: on weekday") + Logger.d("parse: on weekday") proc.dateTime = getDayTime(proc.time, proc.weekdays) } else if (proc.isRepeating) { - log("parse: repeating") + Logger.d("parse: repeating") proc.dateTime = getDateTime(proc.date, proc.time) } else if (proc.hasTimer) { - log("parse: timer") + Logger.d("parse: timer") proc.dateTime = nowDateTime().plusSeconds(proc.afterTime.value / 1000L) } else if (proc.date != null || proc.time != null) { - log("parse: date/time") + Logger.d("parse: date/time") proc.dateTime = getDateTime(proc.date, proc.time) } else { proc.skipNext = true @@ -224,7 +218,7 @@ class Recognizer private constructor( } .takeIf { !it.skipNext } ?.also { proc -> - log("parse: message $proc") + Logger.d("parse: message $proc") if (proc.hasAction && (proc.action == Action.MESSAGE || proc.action == Action.MAIL)) { proc.message = worker.getMessage(proc.input) proc.updateInput { worker.clearMessage(it) } @@ -250,7 +244,7 @@ class Recognizer private constructor( } ?.takeIf { !it.skipNext } ?.let { - log("parse: now time ${LocalDateTime.now(zoneId)}") + Logger.d("parse: now time ${LocalDateTime.now(zoneId)}") Model( type = it.actionType, summary = it.summary, @@ -263,7 +257,7 @@ class Recognizer private constructor( afterMillis = it.afterTime.value ) } - ?.also { log("parse: out = $it") } + ?.also { Logger.d("parse: out = $it") } } private fun createAction(input: String, action: Action): Model { @@ -406,7 +400,7 @@ class Recognizer private constructor( } private fun getNote(input: String?): Model? { - log("getNote: $input") + Logger.d("getNote: $input") return input?.let { StringUtils.capitalize(worker.clearNote(input)) }?.let { Model( summary = it, diff --git a/voice-engine-ktx/src/main/java/com/backdoor/engine/lang/PlWorker.kt b/voice-engine-ktx/src/main/java/com/backdoor/engine/lang/PlWorker.kt index fe21fab70..0c4956d9d 100644 --- a/voice-engine-ktx/src/main/java/com/backdoor/engine/lang/PlWorker.kt +++ b/voice-engine-ktx/src/main/java/com/backdoor/engine/lang/PlWorker.kt @@ -3,7 +3,7 @@ package com.backdoor.engine.lang import com.backdoor.engine.misc.Action import com.backdoor.engine.misc.Ampm import com.backdoor.engine.misc.ContactsInterface -import com.backdoor.engine.misc.Logger +import com.github.naz013.logging.Logger import org.threeten.bp.LocalDate import org.threeten.bp.LocalTime import org.threeten.bp.ZoneId @@ -470,7 +470,7 @@ internal class PlWorker(zoneId: ZoneId, contactsInterface: ContactsInterface?) : override fun hasNextModifier(input: String): Boolean = input.matches(".*następn.*") override fun getTime(input: String, ampm: Ampm?, times: List): LocalTime? { - Logger.log("getTime: $ampm, input $input") + Logger.d("getTime: $ampm, input $input") val parts = input.splitByWhitespaces().toTypedArray() var localTime: LocalTime? = null diff --git a/voice-engine-ktx/src/main/java/com/backdoor/engine/misc/Logger.kt b/voice-engine-ktx/src/main/java/com/backdoor/engine/misc/Logger.kt deleted file mode 100644 index 8d9574f59..000000000 --- a/voice-engine-ktx/src/main/java/com/backdoor/engine/misc/Logger.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.backdoor.engine.misc - -internal object Logger { - - var LOG_ENABLED: Boolean = true - - fun log(message: String) { - if (LOG_ENABLED) { - println("Recognizer: $message") - } - } -} diff --git a/voice-engine-ktx/src/test/java/com/backdoor/engine/lang/EnWorkerTest.kt b/voice-engine-ktx/src/test/java/com/backdoor/engine/lang/EnWorkerTest.kt index 93d191f7d..3eb498fa6 100644 --- a/voice-engine-ktx/src/test/java/com/backdoor/engine/lang/EnWorkerTest.kt +++ b/voice-engine-ktx/src/test/java/com/backdoor/engine/lang/EnWorkerTest.kt @@ -6,6 +6,7 @@ import com.backdoor.engine.misc.ActionType import com.backdoor.engine.misc.ContactsInterface import com.backdoor.engine.misc.Locale import com.backdoor.engine.misc.TimeUtil +import com.github.naz013.logging.Logger import io.mockk.every import io.mockk.mockk import org.junit.Assert.assertEquals @@ -24,6 +25,8 @@ class EnWorkerTest { @Before fun setUp() { + Logger.loggingEnabled = false + Logger.reportingEnabled = false every { contactsInterface.findNumber(any()) }.answers { null } every { contactsInterface.findNumber("home") }.answers { "123456" } every { contactsInterface.findEmail(any()) }.answers { null } diff --git a/voice-engine-ktx/src/test/java/com/backdoor/engine/lang/EsWorkerTest.kt b/voice-engine-ktx/src/test/java/com/backdoor/engine/lang/EsWorkerTest.kt index eee704c4f..41c031a00 100644 --- a/voice-engine-ktx/src/test/java/com/backdoor/engine/lang/EsWorkerTest.kt +++ b/voice-engine-ktx/src/test/java/com/backdoor/engine/lang/EsWorkerTest.kt @@ -6,6 +6,7 @@ import com.backdoor.engine.misc.ActionType import com.backdoor.engine.misc.ContactsInterface import com.backdoor.engine.misc.Locale import com.backdoor.engine.misc.TimeUtil +import com.github.naz013.logging.Logger import io.mockk.every import io.mockk.mockk import org.junit.Assert.assertEquals @@ -24,6 +25,8 @@ class EsWorkerTest { @Before fun setUp() { + Logger.loggingEnabled = false + Logger.reportingEnabled = false every { contactsInterface.findNumber(any()) }.answers { null } every { contactsInterface.findNumber("casa") }.answers { "123456" } every { contactsInterface.findEmail(any()) }.answers { null } diff --git a/voice-engine-ktx/src/test/java/com/backdoor/engine/lang/ItWorkerTest.kt b/voice-engine-ktx/src/test/java/com/backdoor/engine/lang/ItWorkerTest.kt index 2bc81b3de..e97c1eaab 100644 --- a/voice-engine-ktx/src/test/java/com/backdoor/engine/lang/ItWorkerTest.kt +++ b/voice-engine-ktx/src/test/java/com/backdoor/engine/lang/ItWorkerTest.kt @@ -6,6 +6,7 @@ import com.backdoor.engine.misc.ActionType import com.backdoor.engine.misc.ContactsInterface import com.backdoor.engine.misc.Locale import com.backdoor.engine.misc.TimeUtil +import com.github.naz013.logging.Logger import io.mockk.every import io.mockk.mockk import org.junit.Assert.assertEquals @@ -24,6 +25,8 @@ class ItWorkerTest { @Before fun setUp() { + Logger.loggingEnabled = false + Logger.reportingEnabled = false every { contactsInterface.findNumber(any()) }.answers { null } every { contactsInterface.findNumber("casa") }.answers { "123456" } every { contactsInterface.findEmail(any()) }.answers { null } diff --git a/voice-engine-ktx/src/test/java/com/backdoor/engine/lang/PlWorkerTest.kt b/voice-engine-ktx/src/test/java/com/backdoor/engine/lang/PlWorkerTest.kt index 3d02df194..4a9a1f0f3 100644 --- a/voice-engine-ktx/src/test/java/com/backdoor/engine/lang/PlWorkerTest.kt +++ b/voice-engine-ktx/src/test/java/com/backdoor/engine/lang/PlWorkerTest.kt @@ -6,6 +6,7 @@ import com.backdoor.engine.misc.ActionType import com.backdoor.engine.misc.ContactsInterface import com.backdoor.engine.misc.Locale import com.backdoor.engine.misc.TimeUtil +import com.github.naz013.logging.Logger import io.mockk.every import io.mockk.mockk import org.junit.Assert.assertEquals @@ -26,6 +27,8 @@ class PlWorkerTest { @Before fun setUp() { + Logger.loggingEnabled = false + Logger.reportingEnabled = false every { contactsInterface.findNumber(any()) }.answers { null } every { contactsInterface.findNumber("domu") }.answers { "123456" } every { contactsInterface.findEmail(any()) }.answers { null } diff --git a/voice-engine-ktx/src/test/java/com/backdoor/engine/lang/PtWorkerTest.kt b/voice-engine-ktx/src/test/java/com/backdoor/engine/lang/PtWorkerTest.kt index 0b22d79a9..ff2b9e748 100644 --- a/voice-engine-ktx/src/test/java/com/backdoor/engine/lang/PtWorkerTest.kt +++ b/voice-engine-ktx/src/test/java/com/backdoor/engine/lang/PtWorkerTest.kt @@ -6,6 +6,7 @@ import com.backdoor.engine.misc.ActionType import com.backdoor.engine.misc.ContactsInterface import com.backdoor.engine.misc.Locale import com.backdoor.engine.misc.TimeUtil +import com.github.naz013.logging.Logger import io.mockk.every import io.mockk.mockk import org.junit.Assert.assertEquals @@ -24,6 +25,8 @@ class PtWorkerTest { @Before fun setUp() { + Logger.loggingEnabled = false + Logger.reportingEnabled = false every { contactsInterface.findNumber(any()) }.answers { null } every { contactsInterface.findNumber("casa") }.answers { "123456" } every { contactsInterface.findEmail(any()) }.answers { null } diff --git a/voice-engine-ktx/src/test/java/com/backdoor/engine/lang/UkWorkerTest.kt b/voice-engine-ktx/src/test/java/com/backdoor/engine/lang/UkWorkerTest.kt index 632cb2f21..51fb91449 100644 --- a/voice-engine-ktx/src/test/java/com/backdoor/engine/lang/UkWorkerTest.kt +++ b/voice-engine-ktx/src/test/java/com/backdoor/engine/lang/UkWorkerTest.kt @@ -6,6 +6,7 @@ import com.backdoor.engine.misc.ActionType import com.backdoor.engine.misc.ContactsInterface import com.backdoor.engine.misc.Locale import com.backdoor.engine.misc.TimeUtil +import com.github.naz013.logging.Logger import io.mockk.every import io.mockk.mockk import org.junit.Assert.assertEquals @@ -24,6 +25,8 @@ class UkWorkerTest { @Before fun setUp() { + Logger.loggingEnabled = false + Logger.reportingEnabled = false every { contactsInterface.findNumber(any()) }.answers { null } every { contactsInterface.findNumber("дому") }.answers { "123456" } every { contactsInterface.findEmail(any()) }.answers { null }