From 2cef6a5bb4cb4afb1b1f1b704f83c1565e441825 Mon Sep 17 00:00:00 2001 From: "(´⌣`ʃƪ)" Date: Sun, 3 Oct 2021 01:32:15 -0700 Subject: Replace Timber with logcat (#1509) * Replace Timber with logcat (#1505) * Add extension for asLog which takes a message param Co-authored-by: Aditya Wasan --- .../aps/util/auth/BiometricAuthenticator.kt | 5 ++-- .../util/autofill/Api30AutofillResponseBuilder.kt | 6 ++-- .../msfjarvis/aps/util/autofill/AutofillMatcher.kt | 16 +++++------ .../aps/util/autofill/AutofillResponseBuilder.kt | 8 ++++-- .../aps/util/extensions/AndroidExtensions.kt | 4 +-- .../msfjarvis/aps/util/extensions/Extensions.kt | 4 +++ .../java/dev/msfjarvis/aps/util/git/GitLogModel.kt | 13 ++++++--- .../aps/util/git/operation/GitOperation.kt | 6 ++-- .../aps/util/git/sshj/OpenKeychainKeyProvider.kt | 8 +++--- .../java/dev/msfjarvis/aps/util/git/sshj/SshKey.kt | 14 ++++----- .../dev/msfjarvis/aps/util/git/sshj/SshjConfig.kt | 33 +++++++++++++--------- .../aps/util/git/sshj/SshjSessionFactory.kt | 18 ++++++------ .../aps/util/services/ClipboardService.kt | 8 +++--- .../aps/util/services/OreoAutofillService.kt | 12 ++++---- .../aps/util/services/PasswordExportService.kt | 6 ++-- .../dev/msfjarvis/aps/util/settings/Migrations.kt | 11 +++++--- .../aps/util/shortcuts/ShortcutHandler.kt | 4 +-- 17 files changed, 100 insertions(+), 76 deletions(-) (limited to 'app/src/main/java/dev/msfjarvis/aps/util') diff --git a/app/src/main/java/dev/msfjarvis/aps/util/auth/BiometricAuthenticator.kt b/app/src/main/java/dev/msfjarvis/aps/util/auth/BiometricAuthenticator.kt index 7236ac7c..a582337b 100644 --- a/app/src/main/java/dev/msfjarvis/aps/util/auth/BiometricAuthenticator.kt +++ b/app/src/main/java/dev/msfjarvis/aps/util/auth/BiometricAuthenticator.kt @@ -12,9 +12,8 @@ import androidx.biometric.BiometricPrompt import androidx.core.content.ContextCompat import androidx.core.content.getSystemService import androidx.fragment.app.FragmentActivity -import com.github.ajalt.timberkt.Timber.tag -import com.github.ajalt.timberkt.d import dev.msfjarvis.aps.R +import logcat.logcat object BiometricAuthenticator { @@ -43,7 +42,7 @@ object BiometricAuthenticator { object : BiometricPrompt.AuthenticationCallback() { override fun onAuthenticationError(errorCode: Int, errString: CharSequence) { super.onAuthenticationError(errorCode, errString) - tag(TAG).d { "BiometricAuthentication error: errorCode=$errorCode, msg=$errString" } + logcat(TAG) { "BiometricAuthentication error: errorCode=$errorCode, msg=$errString" } callback( when (errorCode) { BiometricPrompt.ERROR_CANCELED, diff --git a/app/src/main/java/dev/msfjarvis/aps/util/autofill/Api30AutofillResponseBuilder.kt b/app/src/main/java/dev/msfjarvis/aps/util/autofill/Api30AutofillResponseBuilder.kt index 14cc634c..fd8faa7f 100644 --- a/app/src/main/java/dev/msfjarvis/aps/util/autofill/Api30AutofillResponseBuilder.kt +++ b/app/src/main/java/dev/msfjarvis/aps/util/autofill/Api30AutofillResponseBuilder.kt @@ -15,7 +15,6 @@ import android.service.autofill.SaveInfo import android.view.inputmethod.InlineSuggestionsRequest import android.widget.inline.InlinePresentationSpec import androidx.annotation.RequiresApi -import com.github.ajalt.timberkt.e import com.github.androidpasswordstore.autofillparser.AutofillAction import com.github.androidpasswordstore.autofillparser.FillableForm import com.github.androidpasswordstore.autofillparser.fillWith @@ -28,6 +27,9 @@ import dev.msfjarvis.aps.ui.autofill.AutofillPublisherChangedActivity import dev.msfjarvis.aps.ui.autofill.AutofillSaveActivity import dev.msfjarvis.aps.util.FeatureFlags import java.io.File +import logcat.LogPriority.ERROR +import logcat.asLog +import logcat.logcat /** Implements [AutofillResponseBuilder]'s methods for API 30 and above */ @RequiresApi(Build.VERSION_CODES.R) @@ -213,7 +215,7 @@ class Api30AutofillResponseBuilder(form: FillableForm) { callback.onSuccess(makeFillResponse(context, inlineSuggestionsRequest, matchedFiles)) }, failure = { e -> - e(e) + logcat(ERROR) { e.asLog() } callback.onSuccess(makePublisherChangedResponse(context, inlineSuggestionsRequest, e)) } ) diff --git a/app/src/main/java/dev/msfjarvis/aps/util/autofill/AutofillMatcher.kt b/app/src/main/java/dev/msfjarvis/aps/util/autofill/AutofillMatcher.kt index ea10c1ac..206074fa 100644 --- a/app/src/main/java/dev/msfjarvis/aps/util/autofill/AutofillMatcher.kt +++ b/app/src/main/java/dev/msfjarvis/aps/util/autofill/AutofillMatcher.kt @@ -8,9 +8,6 @@ import android.content.Context import android.content.SharedPreferences import android.widget.Toast import androidx.core.content.edit -import com.github.ajalt.timberkt.Timber.e -import com.github.ajalt.timberkt.d -import com.github.ajalt.timberkt.w import com.github.androidpasswordstore.autofillparser.FormOrigin import com.github.androidpasswordstore.autofillparser.computeCertificatesHash import com.github.michaelbull.result.Err @@ -18,6 +15,9 @@ import com.github.michaelbull.result.Ok import com.github.michaelbull.result.Result import dev.msfjarvis.aps.R import java.io.File +import logcat.LogPriority.ERROR +import logcat.LogPriority.WARN +import logcat.logcat private const val PREFERENCES_AUTOFILL_APP_MATCHES = "oreo_autofill_app_matches" private val Context.autofillAppMatches @@ -69,7 +69,7 @@ class AutofillMatcher { context.autofillAppMatches.getString(tokenKey(formOrigin), null) ?: return false val hashHasChanged = certificatesHash != storedCertificatesHash if (hashHasChanged) { - e { "$packageName: stored=$storedCertificatesHash, new=$certificatesHash" } + logcat(ERROR) { "$packageName: stored=$storedCertificatesHash, new=$certificatesHash" } true } else { false @@ -134,7 +134,7 @@ class AutofillMatcher { if (hasFormOriginHashChanged(context, formOrigin)) { // This should never happen since we already verified the publisher in // getMatchesFor. - e { "App publisher changed between getMatchesFor and addMatchFor" } + logcat(ERROR) { "App publisher changed between getMatchesFor and addMatchFor" } throw AutofillPublisherChangedException(formOrigin) } val matchPreferences = context.matchPreferences(formOrigin) @@ -154,7 +154,7 @@ class AutofillMatcher { putStringSet(matchesKey(formOrigin), newFiles.map { it.absolutePath }.toSet()) } storeFormOriginHash(context, formOrigin) - d { "Stored match for $formOrigin" } + logcat { "Stored match for $formOrigin" } } /** @@ -176,7 +176,7 @@ class AutofillMatcher { // created with `putStringSet`. @Suppress("UNCHECKED_CAST") val oldMatches = value as? Set if (oldMatches == null) { - w { "Failed to read matches for $key" } + logcat(WARN) { "Failed to read matches for $key" } continue } // Delete all matches for file locations that are going to be overwritten, then @@ -188,7 +188,7 @@ class AutofillMatcher { .minus(oldNewPathMap.values) .map { match -> val newPath = oldNewPathMap[match] ?: return@map match - d { "Updating match for $key: $match --> $newPath" } + logcat { "Updating match for $key: $match --> $newPath" } newPath } .toSet() diff --git a/app/src/main/java/dev/msfjarvis/aps/util/autofill/AutofillResponseBuilder.kt b/app/src/main/java/dev/msfjarvis/aps/util/autofill/AutofillResponseBuilder.kt index 1a825de8..723347f2 100644 --- a/app/src/main/java/dev/msfjarvis/aps/util/autofill/AutofillResponseBuilder.kt +++ b/app/src/main/java/dev/msfjarvis/aps/util/autofill/AutofillResponseBuilder.kt @@ -13,7 +13,6 @@ import android.service.autofill.FillCallback import android.service.autofill.FillResponse import android.service.autofill.SaveInfo import androidx.annotation.RequiresApi -import com.github.ajalt.timberkt.e import com.github.androidpasswordstore.autofillparser.AutofillAction import com.github.androidpasswordstore.autofillparser.AutofillScenario import com.github.androidpasswordstore.autofillparser.Credentials @@ -28,6 +27,9 @@ import dev.msfjarvis.aps.ui.autofill.AutofillPublisherChangedActivity import dev.msfjarvis.aps.ui.autofill.AutofillSaveActivity import dev.msfjarvis.aps.util.FeatureFlags import java.io.File +import logcat.LogPriority.ERROR +import logcat.asLog +import logcat.logcat @RequiresApi(Build.VERSION_CODES.O) class AutofillResponseBuilder(form: FillableForm) { @@ -180,7 +182,7 @@ class AutofillResponseBuilder(form: FillableForm) { .fold( success = { matchedFiles -> callback.onSuccess(makeFillResponse(context, matchedFiles)) }, failure = { e -> - e(e) + logcat(ERROR) { e.asLog() } callback.onSuccess(makePublisherChangedResponse(context, e)) } ) @@ -209,7 +211,7 @@ class AutofillResponseBuilder(form: FillableForm) { } return builder.run { if (scenario != null) fillWith(scenario, action, credentials) - else e { "Failed to recover scenario from client state" } + else logcat(ERROR) { "Failed to recover scenario from client state" } build() } } diff --git a/app/src/main/java/dev/msfjarvis/aps/util/extensions/AndroidExtensions.kt b/app/src/main/java/dev/msfjarvis/aps/util/extensions/AndroidExtensions.kt index 0ad122e6..7671adb4 100644 --- a/app/src/main/java/dev/msfjarvis/aps/util/extensions/AndroidExtensions.kt +++ b/app/src/main/java/dev/msfjarvis/aps/util/extensions/AndroidExtensions.kt @@ -21,7 +21,6 @@ import androidx.core.content.getSystemService import androidx.fragment.app.FragmentActivity import androidx.security.crypto.EncryptedSharedPreferences import androidx.security.crypto.MasterKey -import com.github.ajalt.timberkt.d import com.github.michaelbull.result.Ok import com.github.michaelbull.result.Result import com.google.android.material.snackbar.Snackbar @@ -29,6 +28,7 @@ import dev.msfjarvis.aps.BuildConfig import dev.msfjarvis.aps.R import dev.msfjarvis.aps.data.repo.PasswordRepository import dev.msfjarvis.aps.util.git.operation.GitOperation +import logcat.logcat /** Get an instance of [AutofillManager]. Only available on Android Oreo and above */ val Context.autofillManager: AutofillManager? @@ -91,7 +91,7 @@ suspend fun FragmentActivity.commitChange( ) override fun preExecute(): Boolean { - d { "Committing with message: '$message'" } + logcat { "Committing with message: '$message'" } return true } } diff --git a/app/src/main/java/dev/msfjarvis/aps/util/extensions/Extensions.kt b/app/src/main/java/dev/msfjarvis/aps/util/extensions/Extensions.kt index f04dba33..6c779af6 100644 --- a/app/src/main/java/dev/msfjarvis/aps/util/extensions/Extensions.kt +++ b/app/src/main/java/dev/msfjarvis/aps/util/extensions/Extensions.kt @@ -9,6 +9,7 @@ import com.github.michaelbull.result.runCatching import dev.msfjarvis.aps.data.repo.PasswordRepository import java.io.File import java.util.Date +import logcat.asLog import org.eclipse.jgit.lib.ObjectId import org.eclipse.jgit.revwalk.RevCommit @@ -78,3 +79,6 @@ fun String.splitLines(): Array { /** Alias to [lazy] with thread safety mode always set to [LazyThreadSafetyMode.NONE]. */ fun unsafeLazy(initializer: () -> T) = lazy(LazyThreadSafetyMode.NONE) { initializer.invoke() } + +/** A convenience extension to turn a [Throwable] with a message into a loggable string. */ +fun Throwable.asLog(message: String): String = "$message\n${asLog()}" diff --git a/app/src/main/java/dev/msfjarvis/aps/util/git/GitLogModel.kt b/app/src/main/java/dev/msfjarvis/aps/util/git/GitLogModel.kt index 0fa21271..4753bcd6 100644 --- a/app/src/main/java/dev/msfjarvis/aps/util/git/GitLogModel.kt +++ b/app/src/main/java/dev/msfjarvis/aps/util/git/GitLogModel.kt @@ -5,24 +5,28 @@ package dev.msfjarvis.aps.util.git -import com.github.ajalt.timberkt.e import com.github.michaelbull.result.getOrElse import com.github.michaelbull.result.runCatching import dev.msfjarvis.aps.data.repo.PasswordRepository +import dev.msfjarvis.aps.util.extensions.asLog import dev.msfjarvis.aps.util.extensions.hash import dev.msfjarvis.aps.util.extensions.time import dev.msfjarvis.aps.util.extensions.unsafeLazy +import logcat.LogPriority.ERROR +import logcat.logcat import org.eclipse.jgit.api.Git import org.eclipse.jgit.revwalk.RevCommit +private val TAG = GitLogModel::class.java.simpleName + private fun commits(): Iterable { val repo = PasswordRepository.getRepository(null) if (repo == null) { - e { "Could not access git repository" } + logcat(TAG, ERROR) { "Could not access git repository" } return listOf() } return runCatching { Git(repo).log().call() }.getOrElse { e -> - e(e) { "Failed to obtain git commits" } + logcat(TAG, ERROR) { e.asLog("Failed to obtain git commits") } listOf() } } @@ -48,7 +52,8 @@ class GitLogModel { val size = cache.size fun get(index: Int): GitCommit? { - if (index >= size) e { "Cannot get git commit with index $index. There are only $size." } + if (index >= size) + logcat(ERROR) { "Cannot get git commit with index $index. There are only $size." } return cache.getOrNull(index) } } diff --git a/app/src/main/java/dev/msfjarvis/aps/util/git/operation/GitOperation.kt b/app/src/main/java/dev/msfjarvis/aps/util/git/operation/GitOperation.kt index 9d296353..736b69c2 100644 --- a/app/src/main/java/dev/msfjarvis/aps/util/git/operation/GitOperation.kt +++ b/app/src/main/java/dev/msfjarvis/aps/util/git/operation/GitOperation.kt @@ -7,7 +7,6 @@ package dev.msfjarvis.aps.util.git.operation import android.content.Intent import android.widget.Toast import androidx.fragment.app.FragmentActivity -import com.github.ajalt.timberkt.e import com.github.michaelbull.result.Err import com.github.michaelbull.result.Ok import com.github.michaelbull.result.Result @@ -34,6 +33,9 @@ import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import logcat.LogPriority.ERROR +import logcat.asLog +import logcat.logcat import net.schmizz.sshj.common.DisconnectReason import net.schmizz.sshj.common.SSHException import net.schmizz.sshj.userauth.password.PasswordFinder @@ -110,7 +112,7 @@ abstract class GitOperation(protected val callingActivity: FragmentActivity) { } callingActivity.startActivity(intent) } - .onFailure { e -> e(e) } + .onFailure { e -> logcat(ERROR) { e.asLog() } } } private fun registerAuthProviders( diff --git a/app/src/main/java/dev/msfjarvis/aps/util/git/sshj/OpenKeychainKeyProvider.kt b/app/src/main/java/dev/msfjarvis/aps/util/git/sshj/OpenKeychainKeyProvider.kt index d726c353..3a40b8a2 100644 --- a/app/src/main/java/dev/msfjarvis/aps/util/git/sshj/OpenKeychainKeyProvider.kt +++ b/app/src/main/java/dev/msfjarvis/aps/util/git/sshj/OpenKeychainKeyProvider.kt @@ -9,7 +9,6 @@ import android.content.Intent import androidx.activity.result.IntentSenderRequest import androidx.core.content.edit import androidx.lifecycle.lifecycleScope -import com.github.ajalt.timberkt.d import dev.msfjarvis.aps.util.extensions.OPENPGP_PROVIDER import dev.msfjarvis.aps.util.extensions.sharedPrefs import dev.msfjarvis.aps.util.settings.PreferenceKeys @@ -21,6 +20,7 @@ import kotlin.coroutines.suspendCoroutine import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import logcat.logcat import net.schmizz.sshj.common.DisconnectReason import net.schmizz.sshj.common.KeyType import net.schmizz.sshj.userauth.UserAuthException @@ -81,7 +81,7 @@ class OpenKeychainKeyProvider private constructor(val activity: ContinuationCont sshServiceConnection.connect( object : SshAuthenticationConnection.OnBound { override fun onBound(sshAgent: ISshAuthenticationService) { - d { "Bound to SshAuthenticationApi: $OPENPGP_PROVIDER" } + logcat { "Bound to SshAuthenticationApi: $OPENPGP_PROVIDER" } cont.resume(SshAuthenticationApi(context, sshAgent)) } @@ -134,7 +134,7 @@ class OpenKeychainKeyProvider private constructor(val activity: ContinuationCont request: Request, resultOfUserInteraction: Intent? = null ): ApiResponse { - d { "executeRequest($request) called" } + logcat { "executeRequest($request) called" } val result = withContext(Dispatchers.Main) { // If the request required user interaction, the data returned from the @@ -142,7 +142,7 @@ class OpenKeychainKeyProvider private constructor(val activity: ContinuationCont // is used as the real request. sshServiceApi.executeApi(resultOfUserInteraction ?: request.toIntent())!! } - return parseResult(request, result).also { d { "executeRequest($request): $it" } } + return parseResult(request, result).also { logcat { "executeRequest($request): $it" } } } private suspend fun parseResult(request: Request, result: Intent): ApiResponse { diff --git a/app/src/main/java/dev/msfjarvis/aps/util/git/sshj/SshKey.kt b/app/src/main/java/dev/msfjarvis/aps/util/git/sshj/SshKey.kt index 66617a18..f2db6067 100644 --- a/app/src/main/java/dev/msfjarvis/aps/util/git/sshj/SshKey.kt +++ b/app/src/main/java/dev/msfjarvis/aps/util/git/sshj/SshKey.kt @@ -16,8 +16,6 @@ import android.util.Base64 import androidx.core.content.edit import androidx.security.crypto.EncryptedFile import androidx.security.crypto.MasterKey -import com.github.ajalt.timberkt.d -import com.github.ajalt.timberkt.e import com.github.michaelbull.result.getOrElse import com.github.michaelbull.result.runCatching import dev.msfjarvis.aps.Application @@ -39,6 +37,8 @@ import javax.crypto.SecretKeyFactory import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext +import logcat.asLog +import logcat.logcat import net.i2p.crypto.eddsa.EdDSAPrivateKey import net.i2p.crypto.eddsa.spec.EdDSANamedCurveTable import net.i2p.crypto.eddsa.spec.EdDSAPrivateKeySpec @@ -101,7 +101,7 @@ object SshKey { // It is fine to swallow the exception here since it will reappear when the key // is // used for SSH authentication and can then be shown in the UI. - d(error) + logcat { error.asLog() } false } } @@ -317,13 +317,13 @@ object SshKey { override fun getPublic(): PublicKey = runCatching { androidKeystore.sshPublicKey!! }.getOrElse { error -> - e(error) + logcat { error.asLog() } throw IOException("Failed to get public key '$KEYSTORE_ALIAS' from Android Keystore", error) } override fun getPrivate(): PrivateKey = runCatching { androidKeystore.sshPrivateKey!! }.getOrElse { error -> - e(error) + logcat { error.asLog() } throw IOException( "Failed to access private key '$KEYSTORE_ALIAS' from Android Keystore", error @@ -337,7 +337,7 @@ object SshKey { override fun getPublic(): PublicKey = runCatching { parseSshPublicKey(sshPublicKey!!)!! }.getOrElse { error -> - e(error) + logcat { error.asLog() } throw IOException("Failed to get the public key for wrapped ed25519 key", error) } @@ -353,7 +353,7 @@ object SshKey { ) } .getOrElse { error -> - e(error) + logcat { error.asLog() } throw IOException("Failed to unwrap wrapped ed25519 key", error) } diff --git a/app/src/main/java/dev/msfjarvis/aps/util/git/sshj/SshjConfig.kt b/app/src/main/java/dev/msfjarvis/aps/util/git/sshj/SshjConfig.kt index f8053ef3..f0405e04 100644 --- a/app/src/main/java/dev/msfjarvis/aps/util/git/sshj/SshjConfig.kt +++ b/app/src/main/java/dev/msfjarvis/aps/util/git/sshj/SshjConfig.kt @@ -4,8 +4,6 @@ */ package dev.msfjarvis.aps.util.git.sshj -import com.github.ajalt.timberkt.Timber -import com.github.ajalt.timberkt.d import com.github.michaelbull.result.runCatching import com.hierynomus.sshj.key.KeyAlgorithms import com.hierynomus.sshj.transport.cipher.BlockCiphers @@ -14,6 +12,12 @@ import com.hierynomus.sshj.transport.kex.ExtInfoClientFactory import com.hierynomus.sshj.transport.mac.Macs import com.hierynomus.sshj.userauth.keyprovider.OpenSSHKeyV1KeyFile import java.security.Security +import logcat.LogPriority.ERROR +import logcat.LogPriority.INFO +import logcat.LogPriority.VERBOSE +import logcat.LogPriority.WARN +import logcat.asLog +import logcat.logcat import net.schmizz.keepalive.KeepAliveProvider import net.schmizz.sshj.ConfigImpl import net.schmizz.sshj.common.LoggerFactory @@ -49,7 +53,9 @@ fun setUpBouncyCastleForSshj() { runCatching { Class.forName("sun.security.jca.Providers") } Security.insertProviderAt(BouncyCastleProvider(), bcIndex + 1) } - d { "JCE providers: ${Security.getProviders().joinToString { "${it.name} (${it.version})" }}" } + logcat("setUpBouncyCastleForSshj") { + "JCE providers: ${Security.getProviders().joinToString { "${it.name} (${it.version})" }}" + } // Prevent sshj from forwarding all cryptographic operations to BC. SecurityUtils.setRegisterBouncyCastle(false) SecurityUtils.setSecurityProvider(null) @@ -147,10 +153,9 @@ private abstract class AbstractLogger(private val name: String) : Logger { override fun error(marker: Marker?, msg: String, t: Throwable?) = error(msg, t) } -object TimberLoggerFactory : LoggerFactory { - private class TimberLogger(name: String) : AbstractLogger(name) { +object LogcatLoggerFactory : LoggerFactory { + private class LogcatLogger(name: String) : AbstractLogger(name) { - // We defer the log level checks to Timber. override fun isTraceEnabled() = true override fun isDebugEnabled() = true override fun isInfoEnabled() = true @@ -163,39 +168,39 @@ object TimberLoggerFactory : LoggerFactory { private fun String.fix() = replace("""(?!<\\)\{\}""".toRegex(), "%s") override fun t(message: String, t: Throwable?, vararg args: Any?) { - Timber.tag(name).v(t, message.fix(), *args) + logcat(name, VERBOSE) { message.fix().format(*args) + (t?.asLog() ?: "") } } override fun d(message: String, t: Throwable?, vararg args: Any?) { - Timber.tag(name).d(t, message.fix(), *args) + logcat(name) { message.fix().format(*args) + (t?.asLog() ?: "") } } override fun i(message: String, t: Throwable?, vararg args: Any?) { - Timber.tag(name).i(t, message.fix(), *args) + logcat(name, INFO) { message.fix().format(*args) + (t?.asLog() ?: "") } } override fun w(message: String, t: Throwable?, vararg args: Any?) { - Timber.tag(name).w(t, message.fix(), *args) + logcat(name, WARN) { message.fix().format(*args) + (t?.asLog() ?: "") } } override fun e(message: String, t: Throwable?, vararg args: Any?) { - Timber.tag(name).e(t, message.fix(), *args) + logcat(name, ERROR) { message.fix().format(*args) + (t?.asLog() ?: "") } } } override fun getLogger(name: String): Logger { - return TimberLogger(name) + return LogcatLogger(name) } override fun getLogger(clazz: Class<*>): Logger { - return TimberLogger(clazz.name) + return LogcatLogger(clazz.name) } } class SshjConfig : ConfigImpl() { init { - loggerFactory = TimberLoggerFactory + loggerFactory = LogcatLoggerFactory keepAliveProvider = KeepAliveProvider.HEARTBEAT version = "OpenSSH_8.2p1 Ubuntu-4ubuntu0.1" diff --git a/app/src/main/java/dev/msfjarvis/aps/util/git/sshj/SshjSessionFactory.kt b/app/src/main/java/dev/msfjarvis/aps/util/git/sshj/SshjSessionFactory.kt index bc068f52..79438bcc 100644 --- a/app/src/main/java/dev/msfjarvis/aps/util/git/sshj/SshjSessionFactory.kt +++ b/app/src/main/java/dev/msfjarvis/aps/util/git/sshj/SshjSessionFactory.kt @@ -5,8 +5,6 @@ package dev.msfjarvis.aps.util.git.sshj import android.util.Base64 -import com.github.ajalt.timberkt.d -import com.github.ajalt.timberkt.w import com.github.michaelbull.result.getOrElse import com.github.michaelbull.result.runCatching import dev.msfjarvis.aps.util.git.operation.CredentialFinder @@ -20,6 +18,8 @@ import kotlin.coroutines.Continuation import kotlin.coroutines.suspendCoroutine import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runBlocking +import logcat.LogPriority.WARN +import logcat.logcat import net.schmizz.sshj.SSHClient import net.schmizz.sshj.common.Buffer.PlainBuffer import net.schmizz.sshj.common.DisconnectReason @@ -76,7 +76,7 @@ class SshjSessionFactory(private val authMethod: SshAuthMethod, private val host ): RemoteSession { return currentSession ?: SshjSession(uri, uri.user, authMethod, hostKeyFile).connect().also { - d { "New SSH connection created" } + logcat { "New SSH connection created" } currentSession = it } } @@ -96,13 +96,15 @@ private fun makeTofuHostKeyVerifier(hostKeyFile: File): HostKeyVerifier { digest.update(PlainBuffer().putPublicKey(key).compactData) val digestData = digest.digest() val hostKeyEntry = "SHA256:${Base64.encodeToString(digestData, Base64.NO_WRAP)}" - d { "Trusting host key on first use: $hostKeyEntry" } + logcat(SshjSessionFactory::class.java.simpleName) { + "Trusting host key on first use: $hostKeyEntry" + } hostKeyFile.writeText(hostKeyEntry) true } } else { val hostKeyEntry = hostKeyFile.readText() - d { "Pinned host key: $hostKeyEntry" } + logcat(SshjSessionFactory::class.java.simpleName) { "Pinned host key: $hostKeyEntry" } return FingerprintVerifier.getInstance(hostKeyEntry) } } @@ -122,12 +124,12 @@ private class SshjSession( // URIish's String constructor cannot handle '@' in the user part of the URI and the URL // constructor can't be used since Java's URL does not recognize the ssh scheme. We thus // need to patch everything up ourselves. - d { "Before fixup: user=${uri.user}, host=${uri.host}" } + logcat { "Before fixup: user=${uri.user}, host=${uri.host}" } val userPlusHost = "${uri.user}@${uri.host}" val realUser = userPlusHost.substringBeforeLast('@') val realHost = userPlusHost.substringAfterLast('@') uri.setUser(realUser).setHost(realHost).also { - d { "After fixup: user=${it.user}, host=${it.host}" } + logcat { "After fixup: user=${it.user}, host=${it.host}" } } } else { uri @@ -162,7 +164,7 @@ private class SshjSession( override fun exec(commandName: String?, timeout: Int): Process { if (currentCommand != null) { - w { "Killing old command" } + logcat(WARN) { "Killing old command" } disconnect() } val session = ssh.startSession() diff --git a/app/src/main/java/dev/msfjarvis/aps/util/services/ClipboardService.kt b/app/src/main/java/dev/msfjarvis/aps/util/services/ClipboardService.kt index de7d727c..84de5c91 100644 --- a/app/src/main/java/dev/msfjarvis/aps/util/services/ClipboardService.kt +++ b/app/src/main/java/dev/msfjarvis/aps/util/services/ClipboardService.kt @@ -16,7 +16,6 @@ import android.os.IBinder import androidx.annotation.RequiresApi import androidx.core.app.NotificationCompat import androidx.core.content.getSystemService -import com.github.ajalt.timberkt.d import dev.msfjarvis.aps.R import dev.msfjarvis.aps.util.extensions.clipboard import dev.msfjarvis.aps.util.extensions.sharedPrefs @@ -29,6 +28,7 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import logcat.logcat class ClipboardService : Service() { @@ -82,7 +82,7 @@ class ClipboardService : Service() { if (clipboard != null) { scope.launch { - d { "Clearing the clipboard" } + logcat { "Clearing the clipboard" } val clip = ClipData.newPlainText("pgp_handler_result_pm", "") clipboard.setPrimaryClip(clip) if (deepClear) { @@ -95,7 +95,7 @@ class ClipboardService : Service() { } } } else { - d { "Cannot get clipboard manager service" } + logcat { "Cannot get clipboard manager service" } } } @@ -169,7 +169,7 @@ class ClipboardService : Service() { if (manager != null) { manager.createNotificationChannel(serviceChannel) } else { - d { "Failed to create notification channel" } + logcat { "Failed to create notification channel" } } } } diff --git a/app/src/main/java/dev/msfjarvis/aps/util/services/OreoAutofillService.kt b/app/src/main/java/dev/msfjarvis/aps/util/services/OreoAutofillService.kt index 4c75a619..a52caff0 100644 --- a/app/src/main/java/dev/msfjarvis/aps/util/services/OreoAutofillService.kt +++ b/app/src/main/java/dev/msfjarvis/aps/util/services/OreoAutofillService.kt @@ -14,8 +14,6 @@ import android.service.autofill.FillResponse import android.service.autofill.SaveCallback import android.service.autofill.SaveRequest import androidx.annotation.RequiresApi -import com.github.ajalt.timberkt.d -import com.github.ajalt.timberkt.e import com.github.androidpasswordstore.autofillparser.AutofillScenario import com.github.androidpasswordstore.autofillparser.Credentials import com.github.androidpasswordstore.autofillparser.FillableForm @@ -34,6 +32,8 @@ import dev.msfjarvis.aps.util.extensions.getString import dev.msfjarvis.aps.util.extensions.hasFlag import dev.msfjarvis.aps.util.extensions.sharedPrefs import dev.msfjarvis.aps.util.settings.PreferenceKeys +import logcat.LogPriority.ERROR +import logcat.logcat @RequiresApi(Build.VERSION_CODES.O) class OreoAutofillService : AutofillService() { @@ -92,7 +92,7 @@ class OreoAutofillService : AutofillService() { getCustomSuffixes(), ) ?: run { - d { "Form cannot be filled" } + logcat { "Form cannot be filled" } callback.onSuccess(null) return } @@ -117,21 +117,21 @@ class OreoAutofillService : AutofillService() { val clientState = request.clientState ?: run { - e { "Received save request without client state" } + logcat(ERROR) { "Received save request without client state" } callback.onFailure(getString(R.string.oreo_autofill_save_internal_error)) return } val scenario = AutofillScenario.fromClientState(clientState)?.recoverNodes(structure) ?: run { - e { "Failed to recover client state or nodes from client state" } + logcat(ERROR) { "Failed to recover client state or nodes from client state" } callback.onFailure(getString(R.string.oreo_autofill_save_internal_error)) return } val formOrigin = FormOrigin.fromBundle(clientState) ?: run { - e { "Failed to recover form origin from client state" } + logcat(ERROR) { "Failed to recover form origin from client state" } callback.onFailure(getString(R.string.oreo_autofill_save_internal_error)) return } diff --git a/app/src/main/java/dev/msfjarvis/aps/util/services/PasswordExportService.kt b/app/src/main/java/dev/msfjarvis/aps/util/services/PasswordExportService.kt index 72f14144..6740fc04 100644 --- a/app/src/main/java/dev/msfjarvis/aps/util/services/PasswordExportService.kt +++ b/app/src/main/java/dev/msfjarvis/aps/util/services/PasswordExportService.kt @@ -15,13 +15,13 @@ import android.os.IBinder import androidx.core.app.NotificationCompat import androidx.core.content.getSystemService import androidx.documentfile.provider.DocumentFile -import com.github.ajalt.timberkt.d import dev.msfjarvis.aps.R import dev.msfjarvis.aps.data.repo.PasswordRepository import java.time.LocalDateTime import java.time.format.DateTimeFormatter import java.util.Calendar import java.util.TimeZone +import logcat.logcat class PasswordExportService : Service() { @@ -62,7 +62,7 @@ class PasswordExportService : Service() { val repositoryDirectory = requireNotNull(PasswordRepository.getRepositoryDirectory()) val sourcePassDir = DocumentFile.fromFile(repositoryDirectory) - d { "Copying ${repositoryDirectory.path} to $targetDirectory" } + logcat { "Copying ${repositoryDirectory.path} to $targetDirectory" } val dateString = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { @@ -146,7 +146,7 @@ class PasswordExportService : Service() { if (manager != null) { manager.createNotificationChannel(serviceChannel) } else { - d { "Failed to create notification channel" } + logcat { "Failed to create notification channel" } } } } diff --git a/app/src/main/java/dev/msfjarvis/aps/util/settings/Migrations.kt b/app/src/main/java/dev/msfjarvis/aps/util/settings/Migrations.kt index b24914d0..c001091d 100644 --- a/app/src/main/java/dev/msfjarvis/aps/util/settings/Migrations.kt +++ b/app/src/main/java/dev/msfjarvis/aps/util/settings/Migrations.kt @@ -8,14 +8,17 @@ package dev.msfjarvis.aps.util.settings import android.content.SharedPreferences import androidx.core.content.edit -import com.github.ajalt.timberkt.e -import com.github.ajalt.timberkt.i import com.github.michaelbull.result.get import com.github.michaelbull.result.runCatching import dev.msfjarvis.aps.util.extensions.getString import dev.msfjarvis.aps.util.git.sshj.SshKey import java.io.File import java.net.URI +import logcat.LogPriority.ERROR +import logcat.LogPriority.INFO +import logcat.logcat + +private const val TAG = "Migrations" fun runMigrations(filesDirPath: String, sharedPrefs: SharedPreferences, gitSettings: GitSettings) { migrateToGitUrlBasedConfig(sharedPrefs, gitSettings) @@ -26,7 +29,7 @@ fun runMigrations(filesDirPath: String, sharedPrefs: SharedPreferences, gitSetti private fun migrateToGitUrlBasedConfig(sharedPrefs: SharedPreferences, gitSettings: GitSettings) { val serverHostname = sharedPrefs.getString(PreferenceKeys.GIT_REMOTE_SERVER) ?: return - i { "Migrating to URL-based Git config" } + logcat(TAG, INFO) { "Migrating to URL-based Git config" } val serverPort = sharedPrefs.getString(PreferenceKeys.GIT_REMOTE_PORT) ?: "" val serverUser = sharedPrefs.getString(PreferenceKeys.GIT_REMOTE_USERNAME) ?: "" val serverPath = sharedPrefs.getString(PreferenceKeys.GIT_REMOTE_LOCATION) ?: "" @@ -79,7 +82,7 @@ private fun migrateToGitUrlBasedConfig(sharedPrefs: SharedPreferences, gitSettin newBranch = gitSettings.branch ) != GitSettings.UpdateConnectionSettingsResult.Valid ) { - e { "Failed to migrate to URL-based Git config, generated URL is invalid" } + logcat(TAG, ERROR) { "Failed to migrate to URL-based Git config, generated URL is invalid" } } } diff --git a/app/src/main/java/dev/msfjarvis/aps/util/shortcuts/ShortcutHandler.kt b/app/src/main/java/dev/msfjarvis/aps/util/shortcuts/ShortcutHandler.kt index 8e36c9af..59eda23e 100644 --- a/app/src/main/java/dev/msfjarvis/aps/util/shortcuts/ShortcutHandler.kt +++ b/app/src/main/java/dev/msfjarvis/aps/util/shortcuts/ShortcutHandler.kt @@ -13,12 +13,12 @@ import android.graphics.drawable.Icon import android.os.Build import androidx.annotation.RequiresApi import androidx.core.content.getSystemService -import com.github.ajalt.timberkt.d import dagger.Reusable import dagger.hilt.android.qualifiers.ApplicationContext import dev.msfjarvis.aps.R import dev.msfjarvis.aps.data.password.PasswordItem import javax.inject.Inject +import logcat.logcat @Reusable class ShortcutHandler @@ -70,7 +70,7 @@ constructor( if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) return val shortcutManager: ShortcutManager = context.getSystemService() ?: return if (!shortcutManager.isRequestPinShortcutSupported) { - d { "addPinnedShortcut: pin shortcuts unsupported" } + logcat { "addPinnedShortcut: pin shortcuts unsupported" } return } val shortcut = buildShortcut(item, intent) -- cgit v1.2.3