diff --git a/android/gradle/libs.versions.toml b/android/gradle/libs.versions.toml index f1e6be4c9..da6455f43 100644 --- a/android/gradle/libs.versions.toml +++ b/android/gradle/libs.versions.toml @@ -1,12 +1,12 @@ [versions] -agp = "8.9.3" +agp = "8.11.1" # This is the lowest version of AGP supported by the measure gradle plugin -agp741 = "7.4.1" -bundletool = "1.17.0" +agp860 = "8.6.0" +bundletool = "1.18.1" # android-tools is used for calculating app size and aab size by the gradle plugin. # The version should remain compatible with lower versions of android gradle plugin. New versions # are not backwords compatible. -android-tools = "30.4.1" +android-tools = "31.11.1" junit-platform-launcher = "1.10.2" kotlin = "1.9.21" # Use the latest snapshot (local maven) version of measure-android for @@ -20,13 +20,13 @@ androidx-junit = "1.1.5" androidx-compose-ui = "1.4.3" androidx-compose-material3 = "1.0.1" androidx-runtime-android = "1.5.4" -androidx-espresso = "3.5.1" +androidx-espresso = "3.6.1" androidx-fragment-ktx = "1.2.5" -androidx-annotation = "1.7.1" -androidx-test-rules = "1.5.0" +androidx-annotation = "1.9.1" +androidx-test-rules = "1.6.1" androidx-lifecycle = "2.6.2" androidx-uiautomator = "2.3.0" -androidx-benchmark-macro-junit4 = "1.3.3" +androidx-benchmark-macro-junit4 = "1.3.4" androidx-navigation-fragment = "2.7.6" androidx-navigation-compose = "2.6.0" androidx-activity = "1.9.2" @@ -45,9 +45,9 @@ squareup-curtains = "1.2.5" squareup-okhttp = "4.12.0" squareup-okio = "3.7.0" squareup-leakcanary = "2.14" -robolectric = "4.14.1" +robolectric = "4.15.1" kolinx-binary-compatibility-validator = "0.13.2" -diffplug-spotless = "6.24.0" +diffplug-spotless = "7.2.1" compose-plugin = "1.5.11" gradle-plugin-publish = "1.2.0" autonomousapps-testkit = "0.12" @@ -84,7 +84,7 @@ androidx-compose-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling androidx-compose-runtime-android = { module = "androidx.compose.runtime:runtime-android", version.ref = "androidx-runtime-android" } androidx-uiautomator = { module = "androidx.test.uiautomator:uiautomator", version.ref = "androidx-uiautomator" } androidx-orchestrator = { module = "androidx.test:orchestrator", version.ref = "orchestrator" } -agp741 = { module = "com.android.tools.build:gradle", version.ref = "agp741" } +agp860 = { module = "com.android.tools.build:gradle", version.ref = "agp860" } asm-commons = { module = "org.ow2.asm:asm-commons", version.ref = "asm-util" } asm-util = { module = "org.ow2.asm:asm-util", version.ref = "asm-util" } android-tools-bundletool = { module = "com.android.tools.build:bundletool", version.ref = "bundletool" } diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 7a3c827b0..0cc008ea4 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Mon Mar 17 10:37:45 IST 2025 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/android/measure-android-gradle/build.gradle.kts b/android/measure-android-gradle/build.gradle.kts index 2d9473480..f0c0e73f4 100644 --- a/android/measure-android-gradle/build.gradle.kts +++ b/android/measure-android-gradle/build.gradle.kts @@ -92,7 +92,7 @@ extensions.configure("spotless") { "docs/**/*.md", "src/**/*.properties", ) - indentWithSpaces() + leadingTabsToSpaces() trimTrailingWhitespace() endWithNewline() } @@ -113,7 +113,7 @@ fun configureSpotlessKotlin(spotlessExtension: SpotlessExtension) { } dependencies { - compileOnly(libs.agp741) + compileOnly(libs.agp860) compileOnly(libs.asm.util) compileOnly(libs.asm.commons) @@ -132,7 +132,7 @@ dependencies { testImplementation(libs.squareup.okhttp.mockwebserver) testImplementation(libs.asm.util) testImplementation(libs.asm.commons) - testImplementation(libs.agp741) + testImplementation(libs.agp860) testImplementation(libs.mockitokotlin2.mockito.kotlin) testImplementationAar(libs.measure.android) diff --git a/android/measure-android-gradle/gradle.properties b/android/measure-android-gradle/gradle.properties index a96a5920f..6f7f8bf89 100644 --- a/android/measure-android-gradle/gradle.properties +++ b/android/measure-android-gradle/gradle.properties @@ -1,5 +1,5 @@ MEASURE_PLUGIN_GROUP_ID=sh.measure MEASURE_PLUGIN_ARTIFACT_ID=sh.measure.android.gradle.gradle.plugin -MEASURE_PLUGIN_VERSION_NAME=0.9.0 +MEASURE_PLUGIN_VERSION_NAME=0.10.0-SNAPSHOT RELEASE_SIGNING_ENABLED = false \ No newline at end of file diff --git a/android/measure-android-gradle/gradle/wrapper/gradle-wrapper.properties b/android/measure-android-gradle/gradle/wrapper/gradle-wrapper.properties index e6aba2515..ed4c299ad 100644 --- a/android/measure-android-gradle/gradle/wrapper/gradle-wrapper.properties +++ b/android/measure-android-gradle/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/android/measure-android-gradle/src/functionalTest/kotlin/sh/measure/MeasurePluginTest.kt b/android/measure-android-gradle/src/functionalTest/kotlin/sh/measure/MeasurePluginTest.kt index 9b98ccfad..e49e8a89c 100644 --- a/android/measure-android-gradle/src/functionalTest/kotlin/sh/measure/MeasurePluginTest.kt +++ b/android/measure-android-gradle/src/functionalTest/kotlin/sh/measure/MeasurePluginTest.kt @@ -156,13 +156,11 @@ class MeasurePluginTest { @JvmStatic fun versions(): Stream { return Stream.of( - Arguments.of(SemVer(7, 4, 1), GradleVersion.version("7.5")), - Arguments.of(SemVer(8, 0, 2), GradleVersion.version("8.0")), - Arguments.of(SemVer(8, 3, 2), GradleVersion.version("8.5")), - Arguments.of(SemVer(8, 5, 2), GradleVersion.version("8.7")), + Arguments.of(SemVer(8, 6, 0), GradleVersion.version("8.7")), Arguments.of(SemVer(8, 7, 3), GradleVersion.version("8.9")), Arguments.of(SemVer(8, 8, 0), GradleVersion.version("8.10.2")), Arguments.of(SemVer(8, 9, 0), GradleVersion.version("8.11.1")), + Arguments.of(SemVer(8, 11, 1), GradleVersion.version("8.13")), ) } } diff --git a/android/measure-android-gradle/src/main/kotlin/sh/measure/MeasurePlugin.kt b/android/measure-android-gradle/src/main/kotlin/sh/measure/MeasurePlugin.kt index 930d6308e..bce95d1b9 100644 --- a/android/measure-android-gradle/src/main/kotlin/sh/measure/MeasurePlugin.kt +++ b/android/measure-android-gradle/src/main/kotlin/sh/measure/MeasurePlugin.kt @@ -25,7 +25,7 @@ class MeasurePlugin : Plugin { const val DEFAULT_RETRIES = 3 } - @Suppress("UnstableApiUsage") + @Suppress("NewApi") override fun apply(project: Project) { if (!project.plugins.hasPlugin("com.android.application")) { project.logger.warn( @@ -131,8 +131,6 @@ class MeasurePlugin : Plugin { } } - private fun getFlutterExtension(project: Project): Any? = project.extensions.findByName("flutter") - private fun appSizeFileProvider(project: Project, variant: Variant): Provider { return project.layout.buildDirectory.file("intermediates/measure/${variant.name}/appSize.txt") } diff --git a/android/measure-android-gradle/src/main/kotlin/sh/measure/asm/NavigationTransformer.kt b/android/measure-android-gradle/src/main/kotlin/sh/measure/asm/NavigationTransformer.kt index 519d9c670..8e01780fc 100644 --- a/android/measure-android-gradle/src/main/kotlin/sh/measure/asm/NavigationTransformer.kt +++ b/android/measure-android-gradle/src/main/kotlin/sh/measure/asm/NavigationTransformer.kt @@ -106,7 +106,7 @@ class NavigationMethodVisitor( loadArg(2) visitMethodInsn( - Opcodes.INVOKESTATIC, + INVOKESTATIC, "sh/measure/android/navigation/ComposeNavigationCollectorKt", "withMeasureNavigationListener", "(Landroidx/navigation/NavHostController;Landroidx/compose/runtime/Composer;I)Landroidx/navigation/NavHostController;", diff --git a/android/measure-android-gradle/src/main/kotlin/sh/measure/asm/OkHttpTransformer.kt b/android/measure-android-gradle/src/main/kotlin/sh/measure/asm/OkHttpTransformer.kt index f8669e071..32c94086f 100644 --- a/android/measure-android-gradle/src/main/kotlin/sh/measure/asm/OkHttpTransformer.kt +++ b/android/measure-android-gradle/src/main/kotlin/sh/measure/asm/OkHttpTransformer.kt @@ -89,14 +89,14 @@ class OkHttpMethodVisitor( // [builder, MeasureOkHttpApplicationInterceptor] // [builder] override fun onMethodEnter() { - visitVarInsn(Opcodes.ALOAD, 1) + visitVarInsn(ALOAD, 1) // create MeasureEventListenerFactory and add it to the OkHttpClient.Builder visitTypeInsn(NEW, "sh/measure/android/okhttp/MeasureEventListenerFactory") visitInsn(DUP) - visitVarInsn(Opcodes.ALOAD, 1) + visitVarInsn(ALOAD, 1) visitMethodInsn( - Opcodes.INVOKEVIRTUAL, + INVOKEVIRTUAL, "okhttp3/OkHttpClient\$Builder", "getEventListenerFactory\$okhttp", "()Lokhttp3/EventListener\$Factory;", diff --git a/android/measure/src/androidTest/java/sh/measure/android/EventsTest.kt b/android/measure/src/androidTest/java/sh/measure/android/EventsTest.kt index 1784c3343..8657ee723 100644 --- a/android/measure/src/androidTest/java/sh/measure/android/EventsTest.kt +++ b/android/measure/src/androidTest/java/sh/measure/android/EventsTest.kt @@ -651,13 +651,9 @@ class EventsTest { } } - private fun String.containsEvent(eventType: EventType): Boolean { - return contains("\"type\":\"${eventType.value}\"") - } + private fun String.containsEvent(eventType: EventType): Boolean = contains("\"type\":\"${eventType.value}\"") - private fun String.containsAttribute(key: String, value: String): Boolean { - return contains("\"$key\":\"$value\"") - } + private fun String.containsAttribute(key: String, value: String): Boolean = contains("\"$key\":\"$value\"") private fun triggerExport() { Measure.simulateAppCrash( diff --git a/android/measure/src/androidTest/java/sh/measure/android/FakeConfigProvider.kt b/android/measure/src/androidTest/java/sh/measure/android/FakeConfigProvider.kt index 3c090937a..40c8bb236 100644 --- a/android/measure/src/androidTest/java/sh/measure/android/FakeConfigProvider.kt +++ b/android/measure/src/androidTest/java/sh/measure/android/FakeConfigProvider.kt @@ -10,17 +10,11 @@ internal class FakeConfigProvider : ConfigProvider { // no-op } - override fun shouldTrackHttpBody(url: String, contentType: String?): Boolean { - return false - } + override fun shouldTrackHttpBody(url: String, contentType: String?): Boolean = false - override fun shouldTrackHttpUrl(url: String): Boolean { - return false - } + override fun shouldTrackHttpUrl(url: String): Boolean = false - override fun shouldTrackHttpHeader(key: String): Boolean { - return false - } + override fun shouldTrackHttpHeader(key: String): Boolean = false override fun setMeasureUrl(url: String) { // No-op diff --git a/android/measure/src/androidTest/java/sh/measure/android/FakeShakeDetector.kt b/android/measure/src/androidTest/java/sh/measure/android/FakeShakeDetector.kt index 023349aca..ac34f5924 100644 --- a/android/measure/src/androidTest/java/sh/measure/android/FakeShakeDetector.kt +++ b/android/measure/src/androidTest/java/sh/measure/android/FakeShakeDetector.kt @@ -4,9 +4,7 @@ import sh.measure.android.bugreport.ShakeDetector internal class FakeShakeDetector : ShakeDetector { private var listener: ShakeDetector.Listener? = null - override fun start(): Boolean { - return true - } + override fun start(): Boolean = true override fun stop() { // No-op @@ -16,7 +14,5 @@ internal class FakeShakeDetector : ShakeDetector { this.listener = listener } - override fun getShakeListener(): ShakeDetector.Listener? { - return listener - } + override fun getShakeListener(): ShakeDetector.Listener? = listener } diff --git a/android/measure/src/androidTest/java/sh/measure/android/TestClock.kt b/android/measure/src/androidTest/java/sh/measure/android/TestClock.kt index 5c4b7cf9b..3061d0376 100644 --- a/android/measure/src/androidTest/java/sh/measure/android/TestClock.kt +++ b/android/measure/src/androidTest/java/sh/measure/android/TestClock.kt @@ -3,8 +3,7 @@ package sh.measure.android import sh.measure.android.utils.SystemClock import java.util.concurrent.TimeUnit -internal class TestClock private constructor(private var currentEpochMillis: Long) : - SystemClock { +internal class TestClock private constructor(private var currentEpochMillis: Long) : SystemClock { fun setTime(time: Long) { this.currentEpochMillis = time } @@ -13,13 +12,9 @@ internal class TestClock private constructor(private var currentEpochMillis: Lon advance(time, TimeUnit.MILLISECONDS) } - override fun epochTime(): Long { - return currentEpochMillis - } + override fun epochTime(): Long = currentEpochMillis - override fun monotonicTimeSinceBoot(): Long { - return currentEpochMillis - } + override fun monotonicTimeSinceBoot(): Long = currentEpochMillis private fun advance(duration: Long, unit: TimeUnit) { currentEpochMillis += unit.toMillis(duration) @@ -27,8 +22,6 @@ internal class TestClock private constructor(private var currentEpochMillis: Lon companion object { // Default time set to Wed Oct 25 2023 18:20:15 GMT+0530 - fun create(timeInMillis: Long = 1698238215): TestClock { - return TestClock(timeInMillis) - } + fun create(timeInMillis: Long = 1698238215): TestClock = TestClock(timeInMillis) } } diff --git a/android/measure/src/main/java/sh/measure/android/Handlers.kt b/android/measure/src/main/java/sh/measure/android/Handlers.kt index af5b224c4..bc3c59e20 100644 --- a/android/measure/src/main/java/sh/measure/android/Handlers.kt +++ b/android/measure/src/main/java/sh/measure/android/Handlers.kt @@ -5,9 +5,7 @@ import android.os.Looper import android.os.Message import androidx.core.os.MessageCompat -internal fun isMainThread(): Boolean { - return Looper.myLooper() == Looper.getMainLooper() -} +internal fun isMainThread(): Boolean = Looper.myLooper() == Looper.getMainLooper() internal val mainHandler by lazy { Handler(Looper.getMainLooper()) diff --git a/android/measure/src/main/java/sh/measure/android/Measure.kt b/android/measure/src/main/java/sh/measure/android/Measure.kt index 6649aee49..9c83fb0b0 100644 --- a/android/measure/src/main/java/sh/measure/android/Measure.kt +++ b/android/measure/src/main/java/sh/measure/android/Measure.kt @@ -238,12 +238,10 @@ object Measure { * * @return [Span] A new span instance if the SDK is initialized, or an invalid no-op span if not initialized */ - fun startSpan(name: String): Span { - return if (isInitialized.get()) { - measure.startSpan(name) - } else { - Span.invalid() - } + fun startSpan(name: String): Span = if (isInitialized.get()) { + measure.startSpan(name) + } else { + Span.invalid() } /** @@ -259,12 +257,10 @@ object Measure { * Note: Use this method when you need to trace an operation that has already started and you have * captured its start time using [getCurrentTime]. */ - fun startSpan(name: String, timestamp: Long): Span { - return if (isInitialized.get()) { - measure.startSpan(name, timestamp = timestamp) - } else { - Span.invalid() - } + fun startSpan(name: String, timestamp: Long): Span = if (isInitialized.get()) { + measure.startSpan(name, timestamp = timestamp) + } else { + Span.invalid() } /** @@ -278,12 +274,10 @@ object Measure { * * Note: Use this method when you need to create a span without immediately starting it. */ - fun createSpanBuilder(name: String): SpanBuilder? { - return if (isInitialized.get()) { - measure.createSpan(name) - } else { - null - } + fun createSpanBuilder(name: String): SpanBuilder? = if (isInitialized.get()) { + measure.createSpan(name) + } else { + null } /** @@ -301,9 +295,7 @@ object Measure { * Note: Use this value in the `traceparent` HTTP header when making API calls to enable * distributed tracing between your mobile app and backend services. */ - fun getTraceParentHeaderValue(span: Span): String { - return measure.getTraceParentHeaderValue(span) - } + fun getTraceParentHeaderValue(span: Span): String = measure.getTraceParentHeaderValue(span) /** * Returns the W3C traceparent header key/name. @@ -314,9 +306,7 @@ object Measure { * @see getTraceParentHeaderValue * @see W3C Trace Context specification */ - fun getTraceParentHeaderKey(): String { - return measure.getTraceParentHeaderKey() - } + fun getTraceParentHeaderKey(): String = measure.getTraceParentHeaderKey() /** * Returns the current time in milliseconds since epoch using a monotonic clock source. @@ -326,12 +316,10 @@ object Measure { * Note: Use this method to obtain timestamps when creating spans to ensure consistent time * measurements and avoid clock drift issues within traces. */ - fun getCurrentTime(): Long { - return if (isInitialized.get()) { - measure.timeProvider.now() - } else { - System.currentTimeMillis() - } + fun getCurrentTime(): Long = if (isInitialized.get()) { + measure.timeProvider.now() + } else { + System.currentTimeMillis() } /** diff --git a/android/measure/src/main/java/sh/measure/android/MeasureInitProvider.kt b/android/measure/src/main/java/sh/measure/android/MeasureInitProvider.kt index a87d9b7f9..3290be6f9 100644 --- a/android/measure/src/main/java/sh/measure/android/MeasureInitProvider.kt +++ b/android/measure/src/main/java/sh/measure/android/MeasureInitProvider.kt @@ -18,9 +18,7 @@ import sh.measure.android.applaunch.LaunchTracker * start time. */ internal class MeasureInitProvider : ContentProvider() { - override fun onCreate(): Boolean { - return true - } + override fun onCreate(): Boolean = true override fun attachInfo(context: Context?, info: ProviderInfo) { // applicationId is expected to be prepended. Content providers need to have a unique @@ -54,34 +52,24 @@ internal class MeasureInitProvider : ContentProvider() { selection: String?, selectionArgs: Array?, sortOrder: String?, - ): Cursor? { - throw IllegalStateException("Not allowed.") - } + ): Cursor? = throw IllegalStateException("Not allowed.") - override fun getType(uri: Uri): String? { - throw IllegalStateException("Not allowed.") - } + override fun getType(uri: Uri): String? = throw IllegalStateException("Not allowed.") - override fun insert(uri: Uri, values: ContentValues?): Uri? { - throw IllegalStateException("Not allowed.") - } + override fun insert(uri: Uri, values: ContentValues?): Uri? = throw IllegalStateException("Not allowed.") override fun delete( uri: Uri, selection: String?, selectionArgs: Array?, - ): Int { - throw IllegalStateException("Not allowed.") - } + ): Int = throw IllegalStateException("Not allowed.") override fun update( uri: Uri, values: ContentValues?, selection: String?, selectionArgs: Array?, - ): Int { - throw IllegalStateException("Not allowed.") - } + ): Int = throw IllegalStateException("Not allowed.") private fun getProcessImportance(): Int { val processInfo = ActivityManager.RunningAppProcessInfo() diff --git a/android/measure/src/main/java/sh/measure/android/MeasureInternal.kt b/android/measure/src/main/java/sh/measure/android/MeasureInternal.kt index b5b53742d..f17a61d58 100644 --- a/android/measure/src/main/java/sh/measure/android/MeasureInternal.kt +++ b/android/measure/src/main/java/sh/measure/android/MeasureInternal.kt @@ -105,21 +105,17 @@ internal class MeasureInternal(measureInitializer: MeasureInitializer) : AppLife // Validates and initializes the network client, returns true if initialization was successful, // false otherwise. - private fun setupNetworkClient(clientInfo: ClientInfo?): Boolean { - return if (clientInfo != null) { - initializeWithCredentials(clientInfo.apiUrl, clientInfo.apiKey) - } else { - initializeFromManifest() - } + private fun setupNetworkClient(clientInfo: ClientInfo?): Boolean = if (clientInfo != null) { + initializeWithCredentials(clientInfo.apiUrl, clientInfo.apiKey) + } else { + initializeFromManifest() } - private fun validateApiCredentials(apiUrl: String?, apiKey: String?): String? { - return when { - apiUrl.isNullOrEmpty() -> "API URL is missing" - apiKey.isNullOrEmpty() -> "API Key is missing" - !apiKey.startsWith("msrsh") -> "invalid API Key" - else -> null - } + private fun validateApiCredentials(apiUrl: String?, apiKey: String?): String? = when { + apiUrl.isNullOrEmpty() -> "API URL is missing" + apiKey.isNullOrEmpty() -> "API Key is missing" + !apiKey.startsWith("msrsh") -> "invalid API Key" + else -> null } private fun initializeFromManifest(): Boolean { @@ -215,21 +211,13 @@ internal class MeasureInternal(measureInitializer: MeasureInitializer) : AppLife userTriggeredEventCollector.trackHandledException(throwable) } - fun createSpan(name: String): SpanBuilder? { - return spanCollector.createSpan(name) - } + fun createSpan(name: String): SpanBuilder? = spanCollector.createSpan(name) - fun startSpan(name: String, timestamp: Long? = null): Span { - return spanCollector.startSpan(name, timestamp) - } + fun startSpan(name: String, timestamp: Long? = null): Span = spanCollector.startSpan(name, timestamp) - fun getTraceParentHeaderValue(span: Span): String { - return spanCollector.getTraceParentHeaderValue(span) - } + fun getTraceParentHeaderValue(span: Span): String = spanCollector.getTraceParentHeaderValue(span) - fun getTraceParentHeaderKey(): String { - return spanCollector.getTraceParentHeaderKey() - } + fun getTraceParentHeaderKey(): String = spanCollector.getTraceParentHeaderKey() fun getSessionId(): String? { return try { @@ -366,9 +354,7 @@ internal class MeasureInternal(measureInitializer: MeasureInitializer) : AppLife } } - fun getAttachmentDirectory(): String? { - return fileStorage.getAttachmentDirectory() - } + fun getAttachmentDirectory(): String? = fileStorage.getAttachmentDirectory() private fun unregisterCollectors() { unhandledExceptionCollector.unregister() diff --git a/android/measure/src/main/java/sh/measure/android/MsrAttachment.kt b/android/measure/src/main/java/sh/measure/android/MsrAttachment.kt index 4a2ceed11..9fca68002 100644 --- a/android/measure/src/main/java/sh/measure/android/MsrAttachment.kt +++ b/android/measure/src/main/java/sh/measure/android/MsrAttachment.kt @@ -28,11 +28,9 @@ class MsrAttachment internal constructor( } } -internal fun MsrAttachment.toEventAttachment(attachmentType: String): Attachment { - return Attachment( - name = name, - type = attachmentType, - bytes = bytes, - path = path, - ) -} +internal fun MsrAttachment.toEventAttachment(attachmentType: String): Attachment = Attachment( + name = name, + type = attachmentType, + bytes = bytes, + path = path, +) diff --git a/android/measure/src/main/java/sh/measure/android/RecentSession.kt b/android/measure/src/main/java/sh/measure/android/RecentSession.kt index 9803bb5a5..e6f850dc7 100644 --- a/android/measure/src/main/java/sh/measure/android/RecentSession.kt +++ b/android/measure/src/main/java/sh/measure/android/RecentSession.kt @@ -31,7 +31,5 @@ internal data class RecentSession( */ val versionCode: String, ) { - fun hasTrackedEvent(): Boolean { - return lastEventTime != 0L - } + fun hasTrackedEvent(): Boolean = lastEventTime != 0L } diff --git a/android/measure/src/main/java/sh/measure/android/SessionManager.kt b/android/measure/src/main/java/sh/measure/android/SessionManager.kt index f3a0c2d06..c5d995d16 100644 --- a/android/measure/src/main/java/sh/measure/android/SessionManager.kt +++ b/android/measure/src/main/java/sh/measure/android/SessionManager.kt @@ -255,11 +255,7 @@ internal class SessionManagerImpl( return randomizer.random() < configProvider.samplingRateForErrorFreeSessions } - private fun Event.isUnhandledException(): Boolean { - return type == EventType.EXCEPTION && data is ExceptionData && !data.handled - } + private fun Event.isUnhandledException(): Boolean = type == EventType.EXCEPTION && data is ExceptionData && !data.handled - private fun Event.isAnr(): Boolean { - return type == EventType.ANR - } + private fun Event.isAnr(): Boolean = type == EventType.ANR } diff --git a/android/measure/src/main/java/sh/measure/android/anr/AnrCollector.kt b/android/measure/src/main/java/sh/measure/android/anr/AnrCollector.kt index ba5e2dde0..31e0008c6 100644 --- a/android/measure/src/main/java/sh/measure/android/anr/AnrCollector.kt +++ b/android/measure/src/main/java/sh/measure/android/anr/AnrCollector.kt @@ -42,12 +42,10 @@ internal class AnrCollector( nativeBridge.disableAnrReporting() } - private fun toMeasureException(anr: AnrError): ExceptionData { - return ExceptionFactory.createMeasureException( - throwable = anr, - handled = false, - thread = anr.thread, - foreground = processInfo.isForegroundProcess(), - ) - } + private fun toMeasureException(anr: AnrError): ExceptionData = ExceptionFactory.createMeasureException( + throwable = anr, + handled = false, + thread = anr.thread, + foreground = processInfo.isForegroundProcess(), + ) } diff --git a/android/measure/src/main/java/sh/measure/android/anr/AnrError.kt b/android/measure/src/main/java/sh/measure/android/anr/AnrError.kt index f1bb1ee20..e8308675c 100644 --- a/android/measure/src/main/java/sh/measure/android/anr/AnrError.kt +++ b/android/measure/src/main/java/sh/measure/android/anr/AnrError.kt @@ -1,7 +1,6 @@ package sh.measure.android.anr -internal class AnrError(val thread: Thread, val timestamp: Long, message: String) : - RuntimeException(message) { +internal class AnrError(val thread: Thread, val timestamp: Long, message: String) : RuntimeException(message) { init { stackTrace = thread.stackTrace } diff --git a/android/measure/src/main/java/sh/measure/android/appexit/AppExit.kt b/android/measure/src/main/java/sh/measure/android/appexit/AppExit.kt index 85fec62cf..075858d82 100644 --- a/android/measure/src/main/java/sh/measure/android/appexit/AppExit.kt +++ b/android/measure/src/main/java/sh/measure/android/appexit/AppExit.kt @@ -49,7 +49,5 @@ internal data class AppExit( val pid: String, ) { @RequiresApi(Build.VERSION_CODES.R) - fun isCrash(): Boolean { - return reasonId == ApplicationExitInfo.REASON_CRASH || reasonId == ApplicationExitInfo.REASON_CRASH_NATIVE || reasonId == ApplicationExitInfo.REASON_ANR - } + fun isCrash(): Boolean = reasonId == ApplicationExitInfo.REASON_CRASH || reasonId == ApplicationExitInfo.REASON_CRASH_NATIVE || reasonId == ApplicationExitInfo.REASON_ANR } diff --git a/android/measure/src/main/java/sh/measure/android/appexit/AppExitCollector.kt b/android/measure/src/main/java/sh/measure/android/appexit/AppExitCollector.kt index 15bb15c89..5494dd43d 100644 --- a/android/measure/src/main/java/sh/measure/android/appexit/AppExitCollector.kt +++ b/android/measure/src/main/java/sh/measure/android/appexit/AppExitCollector.kt @@ -76,9 +76,7 @@ internal class AppExitCollector( return reasonId == REASON_CRASH || reasonId == REASON_ANR || reasonId == REASON_CRASH_NATIVE } - private fun getSessionForAppExit(pid: Int): Session? { - return database.getSessionForAppExit(pid) - } + private fun getSessionForAppExit(pid: Int): Session? = database.getSessionForAppExit(pid) internal data class Session( val id: String, diff --git a/android/measure/src/main/java/sh/measure/android/appexit/AppExitProvider.kt b/android/measure/src/main/java/sh/measure/android/appexit/AppExitProvider.kt index 2648f6c7a..bff4d6991 100644 --- a/android/measure/src/main/java/sh/measure/android/appexit/AppExitProvider.kt +++ b/android/measure/src/main/java/sh/measure/android/appexit/AppExitProvider.kt @@ -38,16 +38,14 @@ internal class AppExitProviderImpl( } @RequiresApi(Build.VERSION_CODES.R) - fun ApplicationExitInfo.toAppExit(): AppExit { - return AppExit( - reason = getReasonName(reason), - importance = getImportanceName(importance), - trace = getTraceString(traceInputStream), - process_name = processName, - app_exit_time_ms = timestamp, - pid = pid.toString(), - ) - } + fun ApplicationExitInfo.toAppExit(): AppExit = AppExit( + reason = getReasonName(reason), + importance = getImportanceName(importance), + trace = getTraceString(traceInputStream), + process_name = processName, + app_exit_time_ms = timestamp, + pid = pid.toString(), + ) @VisibleForTesting internal fun getTraceString(traceInputStream: InputStream?): String? { @@ -84,35 +82,31 @@ internal class AppExitProviderImpl( return buffer.inputStream() } - private fun getImportanceName(importance: Int): String { - return when (importance) { - ActivityManager.RunningAppProcessInfo.IMPORTANCE_CACHED -> "CACHED" - ActivityManager.RunningAppProcessInfo.IMPORTANCE_CANT_SAVE_STATE -> "CANT_SAVE_STATE" - ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND -> "FOREGROUND" - ActivityManager.RunningAppProcessInfo.IMPORTANCE_GONE -> "GONE" - ActivityManager.RunningAppProcessInfo.IMPORTANCE_PERCEPTIBLE -> "PERCEPTIBLE" - ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE -> "SERVICE" - ActivityManager.RunningAppProcessInfo.IMPORTANCE_TOP_SLEEPING -> "TOP_SLEEPING" - ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE -> "VISIBLE" - else -> "UNKNOWN" - } + private fun getImportanceName(importance: Int): String = when (importance) { + ActivityManager.RunningAppProcessInfo.IMPORTANCE_CACHED -> "CACHED" + ActivityManager.RunningAppProcessInfo.IMPORTANCE_CANT_SAVE_STATE -> "CANT_SAVE_STATE" + ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND -> "FOREGROUND" + ActivityManager.RunningAppProcessInfo.IMPORTANCE_GONE -> "GONE" + ActivityManager.RunningAppProcessInfo.IMPORTANCE_PERCEPTIBLE -> "PERCEPTIBLE" + ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE -> "SERVICE" + ActivityManager.RunningAppProcessInfo.IMPORTANCE_TOP_SLEEPING -> "TOP_SLEEPING" + ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE -> "VISIBLE" + else -> "UNKNOWN" } - private fun getReasonName(reason: Int): String { - return when (reason) { - ApplicationExitInfo.REASON_ANR -> "ANR" - ApplicationExitInfo.REASON_CRASH -> "CRASH" - ApplicationExitInfo.REASON_CRASH_NATIVE -> "CRASH_NATIVE" - ApplicationExitInfo.REASON_DEPENDENCY_DIED -> "DEPENDENCY_DIED" - ApplicationExitInfo.REASON_EXCESSIVE_RESOURCE_USAGE -> "EXCESSIVE_RESOURCE_USAGE" - ApplicationExitInfo.REASON_EXIT_SELF -> "EXIT_SELF" - ApplicationExitInfo.REASON_INITIALIZATION_FAILURE -> "INITIALIZATION_FAILURE" - ApplicationExitInfo.REASON_LOW_MEMORY -> "LOW_MEMORY" - ApplicationExitInfo.REASON_OTHER -> "OTHER" - ApplicationExitInfo.REASON_SIGNALED -> "SIGNALED" - ApplicationExitInfo.REASON_USER_REQUESTED -> "USER_REQUESTED" - ApplicationExitInfo.REASON_UNKNOWN -> "UNKNOWN" - else -> "UNKNOWN" - } + private fun getReasonName(reason: Int): String = when (reason) { + ApplicationExitInfo.REASON_ANR -> "ANR" + ApplicationExitInfo.REASON_CRASH -> "CRASH" + ApplicationExitInfo.REASON_CRASH_NATIVE -> "CRASH_NATIVE" + ApplicationExitInfo.REASON_DEPENDENCY_DIED -> "DEPENDENCY_DIED" + ApplicationExitInfo.REASON_EXCESSIVE_RESOURCE_USAGE -> "EXCESSIVE_RESOURCE_USAGE" + ApplicationExitInfo.REASON_EXIT_SELF -> "EXIT_SELF" + ApplicationExitInfo.REASON_INITIALIZATION_FAILURE -> "INITIALIZATION_FAILURE" + ApplicationExitInfo.REASON_LOW_MEMORY -> "LOW_MEMORY" + ApplicationExitInfo.REASON_OTHER -> "OTHER" + ApplicationExitInfo.REASON_SIGNALED -> "SIGNALED" + ApplicationExitInfo.REASON_USER_REQUESTED -> "USER_REQUESTED" + ApplicationExitInfo.REASON_UNKNOWN -> "UNKNOWN" + else -> "UNKNOWN" } } diff --git a/android/measure/src/main/java/sh/measure/android/applaunch/LaunchTracker.kt b/android/measure/src/main/java/sh/measure/android/applaunch/LaunchTracker.kt index 19a868b22..e5f85fb5e 100644 --- a/android/measure/src/main/java/sh/measure/android/applaunch/LaunchTracker.kt +++ b/android/measure/src/main/java/sh/measure/android/applaunch/LaunchTracker.kt @@ -251,36 +251,34 @@ internal class LaunchTracker : ActivityLifecycleAdapter { LaunchState.lastAppVisibleElapsedRealtime = SystemClock.elapsedRealtime() } - private fun computeLaunchType(onCreateRecord: OnCreateRecord): String { - return when { - coldLaunchComplete -> { - if (onCreateRecord.sameMessage) { - "Warm" - } else { - "Hot" - } + private fun computeLaunchType(onCreateRecord: OnCreateRecord): String = when { + coldLaunchComplete -> { + if (onCreateRecord.sameMessage) { + "Warm" + } else { + "Hot" } + } - // This could have been a cold launch, but the activity was created with a saved state. - // Which reflects that the app was previously alive but the system evicted it from - // memory, but still kept the saved state. This is a "lukewarm" launch as the activity - // will still be created from scratch. It's not a cold launch as the system can benefit - // from the saved state. - LaunchState.processImportanceOnInit == IMPORTANCE_FOREGROUND && onCreateRecord.hasSavedState -> "Lukewarm" + // This could have been a cold launch, but the activity was created with a saved state. + // Which reflects that the app was previously alive but the system evicted it from + // memory, but still kept the saved state. This is a "lukewarm" launch as the activity + // will still be created from scratch. It's not a cold launch as the system can benefit + // from the saved state. + LaunchState.processImportanceOnInit == IMPORTANCE_FOREGROUND && onCreateRecord.hasSavedState -> "Lukewarm" - // This is clearly a cold launch as the process was started with a foreground importance - // and does not have a saved state. - LaunchState.processImportanceOnInit == IMPORTANCE_FOREGROUND -> "Cold" + // This is clearly a cold launch as the process was started with a foreground importance + // and does not have a saved state. + LaunchState.processImportanceOnInit == IMPORTANCE_FOREGROUND -> "Cold" - // This is a case where activity was created and resumed, but the app was - // not launched with a foreground importance. The system started the app without - // foreground importance but decided to change it's mind later. We track this as a - // lukewarm launch as the system got a chance to warm up before deciding to bring the - // activity to the foreground. Sadly we do not know when the system changed it's mind, so - // we just use the same launch time as a cold launch. We cannot rely on - // lastAppVisibleElapsedRealtime as it won't be set in this case. - else -> "Lukewarm" - } + // This is a case where activity was created and resumed, but the app was + // not launched with a foreground importance. The system started the app without + // foreground importance but decided to change it's mind later. We track this as a + // lukewarm launch as the system got a chance to warm up before deciding to bring the + // activity to the foreground. Sadly we do not know when the system changed it's mind, so + // we just use the same launch time as a cold launch. We cannot rely on + // lastAppVisibleElapsedRealtime as it won't be set in this case. + else -> "Lukewarm" } private fun getIntentData(intentData: String?): String? { diff --git a/android/measure/src/main/java/sh/measure/android/attributes/AppAttributeProcessor.kt b/android/measure/src/main/java/sh/measure/android/attributes/AppAttributeProcessor.kt index 3ea5dcdd1..e08fab80e 100644 --- a/android/measure/src/main/java/sh/measure/android/attributes/AppAttributeProcessor.kt +++ b/android/measure/src/main/java/sh/measure/android/attributes/AppAttributeProcessor.kt @@ -13,12 +13,10 @@ internal class AppAttributeProcessor( private val context: Context, ) : ComputeOnceAttributeProcessor() { - override fun computeAttributes(): Map { - return mapOf( - Attribute.APP_VERSION_KEY to packageInfoProvider.appVersion, - Attribute.APP_BUILD_KEY to packageInfoProvider.getVersionCode(), - Attribute.APP_UNIQUE_ID_KEY to context.packageName, - Attribute.MEASURE_SDK_VERSION to BuildConfig.MEASURE_SDK_VERSION, - ) - } + override fun computeAttributes(): Map = mapOf( + Attribute.APP_VERSION_KEY to packageInfoProvider.appVersion, + Attribute.APP_BUILD_KEY to packageInfoProvider.getVersionCode(), + Attribute.APP_UNIQUE_ID_KEY to context.packageName, + Attribute.MEASURE_SDK_VERSION to BuildConfig.MEASURE_SDK_VERSION, + ) } diff --git a/android/measure/src/main/java/sh/measure/android/attributes/AttributeValue.kt b/android/measure/src/main/java/sh/measure/android/attributes/AttributeValue.kt index a51813f15..e27d90b2a 100644 --- a/android/measure/src/main/java/sh/measure/android/attributes/AttributeValue.kt +++ b/android/measure/src/main/java/sh/measure/android/attributes/AttributeValue.kt @@ -51,9 +51,7 @@ value class DoubleAttr(override val value: Double) : AttributeValue // This is required because we don't want to annotate AttributeValue with @Serializable as it's a // public class. Doing so will leak the serialization implementation details to the public API. -internal fun AttributeValue.Companion.serializer(): KSerializer<@Contextual AttributeValue> { - return AttributeValueSerializer -} +internal fun AttributeValue.Companion.serializer(): KSerializer<@Contextual AttributeValue> = AttributeValueSerializer internal object AttributeValueSerializer : KSerializer { @OptIn(InternalSerializationApi::class, ExperimentalSerializationApi::class) diff --git a/android/measure/src/main/java/sh/measure/android/attributes/DeviceAttributeProcessor.kt b/android/measure/src/main/java/sh/measure/android/attributes/DeviceAttributeProcessor.kt index cf638d71c..21ad9556c 100644 --- a/android/measure/src/main/java/sh/measure/android/attributes/DeviceAttributeProcessor.kt +++ b/android/measure/src/main/java/sh/measure/android/attributes/DeviceAttributeProcessor.kt @@ -19,24 +19,22 @@ internal class DeviceAttributeProcessor( private val configuration = context.resources.configuration private val resources = context.resources - override fun computeAttributes(): Map { - return mapOf( - Attribute.DEVICE_NAME_KEY to Build.DEVICE, - Attribute.DEVICE_MODEL_KEY to Build.MODEL, - Attribute.DEVICE_MANUFACTURER_KEY to Build.MANUFACTURER, - Attribute.DEVICE_TYPE_KEY to getDeviceType(), - Attribute.DEVICE_IS_FOLDABLE_KEY to isFoldable(), - Attribute.DEVICE_IS_PHYSICAL_KEY to isPhysical(), - Attribute.DEVICE_DENSITY_DPI_KEY to configuration.densityDpi, - Attribute.DEVICE_WIDTH_PX_KEY to resources.displayMetrics.widthPixels, - Attribute.DEVICE_HEIGHT_PX_KEY to resources.displayMetrics.heightPixels, - Attribute.DEVICE_DENSITY_KEY to resources.displayMetrics.density, - Attribute.DEVICE_LOCALE_KEY to getDeviceLocale(), - Attribute.OS_NAME_KEY to "android", - Attribute.OS_VERSION_KEY to Build.VERSION.SDK_INT.toString(), - Attribute.OS_PAGE_SIZE to getPageSizeKB(), - ) - } + override fun computeAttributes(): Map = mapOf( + Attribute.DEVICE_NAME_KEY to Build.DEVICE, + Attribute.DEVICE_MODEL_KEY to Build.MODEL, + Attribute.DEVICE_MANUFACTURER_KEY to Build.MANUFACTURER, + Attribute.DEVICE_TYPE_KEY to getDeviceType(), + Attribute.DEVICE_IS_FOLDABLE_KEY to isFoldable(), + Attribute.DEVICE_IS_PHYSICAL_KEY to isPhysical(), + Attribute.DEVICE_DENSITY_DPI_KEY to configuration.densityDpi, + Attribute.DEVICE_WIDTH_PX_KEY to resources.displayMetrics.widthPixels, + Attribute.DEVICE_HEIGHT_PX_KEY to resources.displayMetrics.heightPixels, + Attribute.DEVICE_DENSITY_KEY to resources.displayMetrics.density, + Attribute.DEVICE_LOCALE_KEY to getDeviceLocale(), + Attribute.OS_NAME_KEY to "android", + Attribute.OS_VERSION_KEY to Build.VERSION.SDK_INT.toString(), + Attribute.OS_PAGE_SIZE to getPageSizeKB(), + ) // Using heuristics from: // https://android-developers.googleblog.com/2023/06/detecting-if-device-is-foldable-tablet.html @@ -67,15 +65,27 @@ internal class DeviceAttributeProcessor( private fun isPhysical(): Boolean { val isEmulator = try { ( - (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic")) || Build.FINGERPRINT.startsWith( - "generic", - ) || Build.FINGERPRINT.startsWith("unknown") || Build.HARDWARE.contains("goldfish") || Build.HARDWARE.contains( - "ranchu", - ) || Build.MODEL.contains("google_sdk") || Build.MODEL.contains("Emulator") || Build.MODEL.contains( - "Android SDK built for x86", - ) || Build.MANUFACTURER.contains("Genymotion") || Build.PRODUCT.contains("sdk") || Build.PRODUCT.contains( - "vbox86p", - ) || Build.PRODUCT.contains("emulator") || Build.PRODUCT.contains("simulator") + (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic")) || + Build.FINGERPRINT.startsWith( + "generic", + ) || + Build.FINGERPRINT.startsWith("unknown") || + Build.HARDWARE.contains("goldfish") || + Build.HARDWARE.contains( + "ranchu", + ) || + Build.MODEL.contains("google_sdk") || + Build.MODEL.contains("Emulator") || + Build.MODEL.contains( + "Android SDK built for x86", + ) || + Build.MANUFACTURER.contains("Genymotion") || + Build.PRODUCT.contains("sdk") || + Build.PRODUCT.contains( + "vbox86p", + ) || + Build.PRODUCT.contains("emulator") || + Build.PRODUCT.contains("simulator") ) } catch (e: Exception) { // assume it's a physical device @@ -84,12 +94,8 @@ internal class DeviceAttributeProcessor( return !isEmulator } - private fun getDeviceLocale(): String { - return localeProvider.getLocale() - } + private fun getDeviceLocale(): String = localeProvider.getLocale() // Returns page size in KB. - private fun getPageSizeKB(): Long { - return osSysConfProvider.get(OsConstants._SC_PAGESIZE) / 1024 - } + private fun getPageSizeKB(): Long = osSysConfProvider.get(OsConstants._SC_PAGESIZE) / 1024 } diff --git a/android/measure/src/main/java/sh/measure/android/attributes/SpanDeviceAttributeProcessor.kt b/android/measure/src/main/java/sh/measure/android/attributes/SpanDeviceAttributeProcessor.kt index 8a4b17865..53e21f73f 100644 --- a/android/measure/src/main/java/sh/measure/android/attributes/SpanDeviceAttributeProcessor.kt +++ b/android/measure/src/main/java/sh/measure/android/attributes/SpanDeviceAttributeProcessor.kt @@ -8,19 +8,15 @@ import sh.measure.android.utils.LocaleProvider internal class SpanDeviceAttributeProcessor( private val localeProvider: LocaleProvider, ) : ComputeOnceAttributeProcessor() { - override fun computeAttributes(): Map { - return mapOf( - Attribute.DEVICE_NAME_KEY to Build.DEVICE, - Attribute.DEVICE_MODEL_KEY to Build.MODEL, - Attribute.DEVICE_MANUFACTURER_KEY to Build.MANUFACTURER, - Attribute.DEVICE_LOCALE_KEY to getDeviceLocale(), - Attribute.OS_NAME_KEY to "android", - Attribute.OS_VERSION_KEY to Build.VERSION.SDK_INT.toString(), - Attribute.PLATFORM_KEY to "android", - ) - } + override fun computeAttributes(): Map = mapOf( + Attribute.DEVICE_NAME_KEY to Build.DEVICE, + Attribute.DEVICE_MODEL_KEY to Build.MODEL, + Attribute.DEVICE_MANUFACTURER_KEY to Build.MANUFACTURER, + Attribute.DEVICE_LOCALE_KEY to getDeviceLocale(), + Attribute.OS_NAME_KEY to "android", + Attribute.OS_VERSION_KEY to Build.VERSION.SDK_INT.toString(), + Attribute.PLATFORM_KEY to "android", + ) - private fun getDeviceLocale(): String { - return localeProvider.getLocale() - } + private fun getDeviceLocale(): String = localeProvider.getLocale() } diff --git a/android/measure/src/main/java/sh/measure/android/bugreport/AccelerometerShakeDetector.kt b/android/measure/src/main/java/sh/measure/android/bugreport/AccelerometerShakeDetector.kt index 2d6420dfd..28a7fff9b 100644 --- a/android/measure/src/main/java/sh/measure/android/bugreport/AccelerometerShakeDetector.kt +++ b/android/measure/src/main/java/sh/measure/android/bugreport/AccelerometerShakeDetector.kt @@ -15,7 +15,8 @@ internal class AccelerometerShakeDetector( private val sensorManager: SensorManager?, private val timeProvider: TimeProvider, private val configProvider: ConfigProvider, -) : ShakeDetector, SensorEventListener { +) : ShakeDetector, + SensorEventListener { private val accelerometer: Sensor? = sensorManager?.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) private var shakeListener: ShakeDetector.Listener? = null @@ -47,9 +48,7 @@ internal class AccelerometerShakeDetector( this.shakeListener = listener } - override fun getShakeListener(): ShakeDetector.Listener? { - return shakeListener - } + override fun getShakeListener(): ShakeDetector.Listener? = shakeListener override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) { // Not used @@ -81,9 +80,7 @@ internal class AccelerometerShakeDetector( * @param z The acceleration along the Z axis * @return The magnitude of the acceleration vector */ - private fun calculateMagnitude(x: Float, y: Float, z: Float): Float { - return sqrt(x * x + y * y + z * z) - } + private fun calculateMagnitude(x: Float, y: Float, z: Float): Float = sqrt(x * x + y * y + z * z) private fun recordMovement() { val currentTime = timeProvider.now() @@ -98,9 +95,7 @@ internal class AccelerometerShakeDetector( } } - private fun isTimedOut(currentTime: Long): Boolean { - return lastShakeTime + configProvider.shakeMinTimeIntervalMs < currentTime - } + private fun isTimedOut(currentTime: Long): Boolean = lastShakeTime + configProvider.shakeMinTimeIntervalMs < currentTime private fun notifyShake() { val currentTime = timeProvider.now() diff --git a/android/measure/src/main/java/sh/measure/android/bugreport/BugReportCollector.kt b/android/measure/src/main/java/sh/measure/android/bugreport/BugReportCollector.kt index cb81f2047..327e388e2 100644 --- a/android/measure/src/main/java/sh/measure/android/bugreport/BugReportCollector.kt +++ b/android/measure/src/main/java/sh/measure/android/bugreport/BugReportCollector.kt @@ -230,9 +230,7 @@ internal class BugReportCollectorImpl internal constructor( } } - override fun validateBugReport(attachments: Int, descriptionLength: Int): Boolean { - return attachments > 0 || descriptionLength > 0 - } + override fun validateBugReport(attachments: Int, descriptionLength: Int): Boolean = attachments > 0 || descriptionLength > 0 private fun launchImagePickerIntent(activity: Activity) { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { @@ -316,60 +314,56 @@ internal class BugReportCollectorImpl internal constructor( } } - private fun List.toEventAttachments(): List { - return mapNotNull { attachment: ParcelableAttachment -> - val file = File(attachment.path) - if (file.exists()) { - val bytes = file.readBytes() - EventAttachment( - name = attachment.name, - type = AttachmentType.SCREENSHOT, - bytes = bytes, - ) - } else { - null - } + private fun List.toEventAttachments(): List = mapNotNull { attachment: ParcelableAttachment -> + val file = File(attachment.path) + if (file.exists()) { + val bytes = file.readBytes() + EventAttachment( + name = attachment.name, + type = AttachmentType.SCREENSHOT, + bytes = bytes, + ) + } else { + null } } - private fun List.toEventAttachments(context: Context): List { - return mapNotNull { uri -> - try { - val contentResolver = context.contentResolver - val options = BitmapFactory.Options().apply { - inJustDecodeBounds = true - } - contentResolver.openInputStream(uri)?.use { - BitmapFactory.decodeStream(it, null, options) - } - val sampleSize = if (options.outWidth > MAX_OUTPUT_IMAGE_WIDTH) { - (options.outWidth.toFloat() / MAX_OUTPUT_IMAGE_WIDTH.toFloat()).roundToInt() - } else { - 1 - } - options.apply { - inJustDecodeBounds = false - inSampleSize = sampleSize - } - contentResolver.openInputStream(uri)?.use { - BitmapFactory.decodeStream(it, null, options) - }?.let { bitmap -> - BitmapHelper.compressBitmap( - bitmap, - configProvider.screenshotCompressionQuality, - logger, - )?.let { (extension, bytes) -> - EventAttachment( - name = "screenshot.$extension", - bytes = bytes, - type = AttachmentType.SCREENSHOT, - ) - } + private fun List.toEventAttachments(context: Context): List = mapNotNull { uri -> + try { + val contentResolver = context.contentResolver + val options = BitmapFactory.Options().apply { + inJustDecodeBounds = true + } + contentResolver.openInputStream(uri)?.use { + BitmapFactory.decodeStream(it, null, options) + } + val sampleSize = if (options.outWidth > MAX_OUTPUT_IMAGE_WIDTH) { + (options.outWidth.toFloat() / MAX_OUTPUT_IMAGE_WIDTH.toFloat()).roundToInt() + } else { + 1 + } + options.apply { + inJustDecodeBounds = false + inSampleSize = sampleSize + } + contentResolver.openInputStream(uri)?.use { + BitmapFactory.decodeStream(it, null, options) + }?.let { bitmap -> + BitmapHelper.compressBitmap( + bitmap, + configProvider.screenshotCompressionQuality, + logger, + )?.let { (extension, bytes) -> + EventAttachment( + name = "screenshot.$extension", + bytes = bytes, + type = AttachmentType.SCREENSHOT, + ) } - } catch (e: Exception) { - logger.log(LogLevel.Error, "Failed to read image from URI: $uri", e) - null } + } catch (e: Exception) { + logger.log(LogLevel.Error, "Failed to read image from URI: $uri", e) + null } } } diff --git a/android/measure/src/main/java/sh/measure/android/bugreport/ImageLoader.kt b/android/measure/src/main/java/sh/measure/android/bugreport/ImageLoader.kt index 057acf7c3..cfe5ebb27 100644 --- a/android/measure/src/main/java/sh/measure/android/bugreport/ImageLoader.kt +++ b/android/measure/src/main/java/sh/measure/android/bugreport/ImageLoader.kt @@ -114,11 +114,9 @@ internal object ImageLoader { * Efficiently determines the dimensions of a bitmap without loading it into memory. * BitmapFactory.Options allows us to decode just the bounds without the pixel data. */ - private fun getBitmapBounds(decoder: (BitmapFactory.Options) -> Unit): BitmapFactory.Options { - return BitmapFactory.Options().apply { - inJustDecodeBounds = true - decoder(this) - } + private fun getBitmapBounds(decoder: (BitmapFactory.Options) -> Unit): BitmapFactory.Options = BitmapFactory.Options().apply { + inJustDecodeBounds = true + decoder(this) } /** @@ -139,17 +137,13 @@ internal object ImageLoader { imageHeight: Int, availableWidth: Int, availableHeight: Int, - ): Int { - return maxOf(1, minOf(imageWidth / availableWidth, imageHeight / availableHeight, 4)) - } + ): Int = maxOf(1, minOf(imageWidth / availableWidth, imageHeight / availableHeight, 4)) /** * Loads a bitmap with the calculated scaling factor applied. */ - private fun loadScaledBitmap(filePath: String, scalingFactor: Int): Bitmap? { - return BitmapFactory.Options().run { - inSampleSize = scalingFactor - BitmapFactory.decodeFile(filePath, this) - } + private fun loadScaledBitmap(filePath: String, scalingFactor: Int): Bitmap? = BitmapFactory.Options().run { + inSampleSize = scalingFactor + BitmapFactory.decodeFile(filePath, this) } } diff --git a/android/measure/src/main/java/sh/measure/android/bugreport/MsrBugReportActivity.kt b/android/measure/src/main/java/sh/measure/android/bugreport/MsrBugReportActivity.kt index 5e5f37b2e..44da80e00 100644 --- a/android/measure/src/main/java/sh/measure/android/bugreport/MsrBugReportActivity.kt +++ b/android/measure/src/main/java/sh/measure/android/bugreport/MsrBugReportActivity.kt @@ -210,13 +210,11 @@ internal class MsrBugReportActivity : Activity() { addAttachmentView(screenshot) } - private fun getInitialScreenshot(): ParcelableAttachment? { - return IntentCompat.getParcelableExtra( - intent, - INITIAL_SCREENSHOT_EXTRA, - ParcelableAttachment::class.java, - ) - } + private fun getInitialScreenshot(): ParcelableAttachment? = IntentCompat.getParcelableExtra( + intent, + INITIAL_SCREENSHOT_EXTRA, + ParcelableAttachment::class.java, + ) private fun restoreState(savedInstanceState: Bundle) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { @@ -320,16 +318,15 @@ internal class MsrBugReportActivity : Activity() { ) } - private fun canAccessGalleryImages(): Boolean { - return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { - isPermissionDeclared( - this, - READ_MEDIA_VISUAL_USER_SELECTED, - ) || isPermissionDeclared(this, READ_MEDIA_IMAGES) - } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + private fun canAccessGalleryImages(): Boolean = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + isPermissionDeclared( + this, + READ_MEDIA_VISUAL_USER_SELECTED, + ) || isPermissionDeclared(this, READ_MEDIA_IMAGES) - } else { - isPermissionDeclared(this, READ_EXTERNAL_STORAGE) - } + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + isPermissionDeclared(this, READ_MEDIA_IMAGES) + } else { + isPermissionDeclared(this, READ_EXTERNAL_STORAGE) } } diff --git a/android/measure/src/main/java/sh/measure/android/bugreport/ParcelableAttachment.kt b/android/measure/src/main/java/sh/measure/android/bugreport/ParcelableAttachment.kt index ab77fc477..af26bc136 100644 --- a/android/measure/src/main/java/sh/measure/android/bugreport/ParcelableAttachment.kt +++ b/android/measure/src/main/java/sh/measure/android/bugreport/ParcelableAttachment.kt @@ -16,15 +16,11 @@ internal data class ParcelableAttachment( override fun describeContents(): Int = 0 internal companion object CREATOR : Parcelable.Creator { - override fun createFromParcel(parcel: Parcel): ParcelableAttachment { - return ParcelableAttachment( - parcel.readString()!!, - parcel.readString()!!, - ) - } + override fun createFromParcel(parcel: Parcel): ParcelableAttachment = ParcelableAttachment( + parcel.readString()!!, + parcel.readString()!!, + ) - override fun newArray(size: Int): Array { - return arrayOfNulls(size) - } + override fun newArray(size: Int): Array = arrayOfNulls(size) } } diff --git a/android/measure/src/main/java/sh/measure/android/config/Config.kt b/android/measure/src/main/java/sh/measure/android/config/Config.kt index 39abce87d..cd2b8257d 100644 --- a/android/measure/src/main/java/sh/measure/android/config/Config.kt +++ b/android/measure/src/main/java/sh/measure/android/config/Config.kt @@ -19,7 +19,8 @@ internal data class Config( override val trackFragmentLoadTime: Boolean = DefaultConfig.TRACK_FRAGMENT_LOAD_TIME, override val disallowedCustomHeaders: List = DefaultConfig.DISALLOWED_CUSTOM_HEADERS, override val requestHeadersProvider: MsrRequestHeadersProvider? = null, -) : InternalConfig, IMeasureConfig { +) : InternalConfig, + IMeasureConfig { override val screenshotMaskHexColor: String = "#222222" override val screenshotCompressionQuality: Int = 25 override val maxAttachmentSizeInEventsBatchInBytes: Int = 3_000_000 // 3 MB diff --git a/android/measure/src/main/java/sh/measure/android/config/ConfigProvider.kt b/android/measure/src/main/java/sh/measure/android/config/ConfigProvider.kt index 266ed41f6..f114ec48d 100644 --- a/android/measure/src/main/java/sh/measure/android/config/ConfigProvider.kt +++ b/android/measure/src/main/java/sh/measure/android/config/ConfigProvider.kt @@ -6,7 +6,9 @@ import java.util.concurrent.locks.ReentrantReadWriteLock import kotlin.concurrent.read import kotlin.concurrent.write -internal interface ConfigProvider : IMeasureConfig, InternalConfig { +internal interface ConfigProvider : + IMeasureConfig, + InternalConfig { fun loadNetworkConfig() fun shouldTrackHttpBody(url: String, contentType: String?): Boolean fun shouldTrackHttpUrl(url: String): Boolean @@ -161,9 +163,7 @@ internal class ConfigProviderImpl( } } - override fun shouldTrackHttpHeader(key: String): Boolean { - return !combinedHttpHeadersBlocklist.any { key.contains(it, ignoreCase = true) } - } + override fun shouldTrackHttpHeader(key: String): Boolean = !combinedHttpHeadersBlocklist.any { key.contains(it, ignoreCase = true) } override fun setMeasureUrl(url: String) { combinedHttpUrlBlocklist.add(url) diff --git a/android/measure/src/main/java/sh/measure/android/config/MeasureConfig.kt b/android/measure/src/main/java/sh/measure/android/config/MeasureConfig.kt index 9ca16ff4f..0c3e6df94 100644 --- a/android/measure/src/main/java/sh/measure/android/config/MeasureConfig.kt +++ b/android/measure/src/main/java/sh/measure/android/config/MeasureConfig.kt @@ -255,24 +255,23 @@ internal data class SerializableMeasureConfig( ) companion object { - fun fromMeasureConfig(config: MeasureConfig): SerializableMeasureConfig = - SerializableMeasureConfig( - enableLogging = config.enableLogging, - trackScreenshotOnCrash = config.trackScreenshotOnCrash, - screenshotMaskLevel = config.screenshotMaskLevel, - trackHttpHeaders = config.trackHttpHeaders, - trackHttpBody = config.trackHttpBody, - httpHeadersBlocklist = config.httpHeadersBlocklist, - httpUrlBlocklist = config.httpUrlBlocklist, - httpUrlAllowlist = config.httpUrlAllowlist, - trackActivityIntentData = config.trackActivityIntentData, - samplingRateForErrorFreeSessions = config.samplingRateForErrorFreeSessions, - autoStart = config.autoStart, - traceSamplingRate = config.traceSamplingRate, - trackActivityLoadTime = config.trackActivityLoadTime, - trackFragmentLoadTime = config.trackFragmentLoadTime, - requestHeadersProvider = config.requestHeadersProvider, - ) + fun fromMeasureConfig(config: MeasureConfig): SerializableMeasureConfig = SerializableMeasureConfig( + enableLogging = config.enableLogging, + trackScreenshotOnCrash = config.trackScreenshotOnCrash, + screenshotMaskLevel = config.screenshotMaskLevel, + trackHttpHeaders = config.trackHttpHeaders, + trackHttpBody = config.trackHttpBody, + httpHeadersBlocklist = config.httpHeadersBlocklist, + httpUrlBlocklist = config.httpUrlBlocklist, + httpUrlAllowlist = config.httpUrlAllowlist, + trackActivityIntentData = config.trackActivityIntentData, + samplingRateForErrorFreeSessions = config.samplingRateForErrorFreeSessions, + autoStart = config.autoStart, + traceSamplingRate = config.traceSamplingRate, + trackActivityLoadTime = config.trackActivityLoadTime, + trackFragmentLoadTime = config.trackFragmentLoadTime, + requestHeadersProvider = config.requestHeadersProvider, + ) } } diff --git a/android/measure/src/main/java/sh/measure/android/events/CustomEventCollector.kt b/android/measure/src/main/java/sh/measure/android/events/CustomEventCollector.kt index 751bf797c..f5ed658d1 100644 --- a/android/measure/src/main/java/sh/measure/android/events/CustomEventCollector.kt +++ b/android/measure/src/main/java/sh/measure/android/events/CustomEventCollector.kt @@ -98,14 +98,10 @@ internal class CustomEventCollector( } } - private fun isKeyValid(key: String): Boolean { - return key.length <= configProvider.maxUserDefinedAttributeKeyLength - } + private fun isKeyValid(key: String): Boolean = key.length <= configProvider.maxUserDefinedAttributeKeyLength - private fun isValueValid(value: AttributeValue): Boolean { - return when (value) { - is StringAttr -> value.value.length <= configProvider.maxUserDefinedAttributeValueLength - else -> true - } + private fun isValueValid(value: AttributeValue): Boolean = when (value) { + is StringAttr -> value.value.length <= configProvider.maxUserDefinedAttributeValueLength + else -> true } } diff --git a/android/measure/src/main/java/sh/measure/android/events/EventType.kt b/android/measure/src/main/java/sh/measure/android/events/EventType.kt index 46a2485b1..8ed2237b6 100644 --- a/android/measure/src/main/java/sh/measure/android/events/EventType.kt +++ b/android/measure/src/main/java/sh/measure/android/events/EventType.kt @@ -25,8 +25,6 @@ internal enum class EventType(val value: String) { ; companion object { - fun fromValue(value: String): EventType? { - return entries.find { it.value == value } - } + fun fromValue(value: String): EventType? = entries.find { it.value == value } } } diff --git a/android/measure/src/main/java/sh/measure/android/events/InternalSignalCollector.kt b/android/measure/src/main/java/sh/measure/android/events/InternalSignalCollector.kt index 6d3cff9d0..18f0aba35 100644 --- a/android/measure/src/main/java/sh/measure/android/events/InternalSignalCollector.kt +++ b/android/measure/src/main/java/sh/measure/android/events/InternalSignalCollector.kt @@ -238,47 +238,31 @@ internal class InternalSignalCollector( } } - private fun extractHttpData(map: MutableMap): HttpData { - return jsonSerializer.decodeFromJsonElement(HttpData.serializer(), map.toJsonElement()) - } + private fun extractHttpData(map: MutableMap): HttpData = jsonSerializer.decodeFromJsonElement(HttpData.serializer(), map.toJsonElement()) - private fun extractScreenViewData(map: MutableMap): ScreenViewData { - return jsonSerializer.decodeFromJsonElement( - ScreenViewData.serializer(), - map.toJsonElement(), - ) - } + private fun extractScreenViewData(map: MutableMap): ScreenViewData = jsonSerializer.decodeFromJsonElement( + ScreenViewData.serializer(), + map.toJsonElement(), + ) - private fun extractExceptionEventData(map: Map): ExceptionData { - return jsonSerializer.decodeFromJsonElement(ExceptionData.serializer(), map.toJsonElement()) - } + private fun extractExceptionEventData(map: Map): ExceptionData = jsonSerializer.decodeFromJsonElement(ExceptionData.serializer(), map.toJsonElement()) - private fun extractCustomEventData(data: Map): CustomEventData { - return jsonSerializer.decodeFromJsonElement( - CustomEventData.serializer(), - data.toJsonElement(), - ) - } + private fun extractCustomEventData(data: Map): CustomEventData = jsonSerializer.decodeFromJsonElement( + CustomEventData.serializer(), + data.toJsonElement(), + ) - private fun extractBugReportData(map: MutableMap): BugReportData { - return jsonSerializer.decodeFromJsonElement( - BugReportData.serializer(), - map.toJsonElement(), - ) - } + private fun extractBugReportData(map: MutableMap): BugReportData = jsonSerializer.decodeFromJsonElement( + BugReportData.serializer(), + map.toJsonElement(), + ) - private fun extractClickData(data: MutableMap): ClickData { - return jsonSerializer.decodeFromJsonElement(ClickData.serializer(), data.toJsonElement()) - } + private fun extractClickData(data: MutableMap): ClickData = jsonSerializer.decodeFromJsonElement(ClickData.serializer(), data.toJsonElement()) - private fun extractScrollData(data: MutableMap): ScrollData { - return jsonSerializer.decodeFromJsonElement(ScrollData.serializer(), data.toJsonElement()) - } + private fun extractScrollData(data: MutableMap): ScrollData = jsonSerializer.decodeFromJsonElement(ScrollData.serializer(), data.toJsonElement()) - private fun extractLongClickData(data: MutableMap): LongClickData { - return jsonSerializer.decodeFromJsonElement( - LongClickData.serializer(), - data.toJsonElement(), - ) - } + private fun extractLongClickData(data: MutableMap): LongClickData = jsonSerializer.decodeFromJsonElement( + LongClickData.serializer(), + data.toJsonElement(), + ) } diff --git a/android/measure/src/main/java/sh/measure/android/executors/ExecutorServiceRegistry.kt b/android/measure/src/main/java/sh/measure/android/executors/ExecutorServiceRegistry.kt index e59ebbb68..67fe6f37d 100644 --- a/android/measure/src/main/java/sh/measure/android/executors/ExecutorServiceRegistry.kt +++ b/android/measure/src/main/java/sh/measure/android/executors/ExecutorServiceRegistry.kt @@ -27,25 +27,19 @@ internal interface ExecutorServiceRegistry { internal class ExecutorServiceRegistryImpl : ExecutorServiceRegistry { private val executors: MutableMap by lazy { mutableMapOf() } - override fun ioExecutor(): MeasureExecutorService { - return executors.getOrPut(ExecutorServiceName.IOExecutor) { - val threadFactory = namedThreadFactory("msr-io") - MeasureExecutorServiceImpl(threadFactory) - } + override fun ioExecutor(): MeasureExecutorService = executors.getOrPut(ExecutorServiceName.IOExecutor) { + val threadFactory = namedThreadFactory("msr-io") + MeasureExecutorServiceImpl(threadFactory) } - override fun defaultExecutor(): MeasureExecutorService { - return executors.getOrPut(ExecutorServiceName.DefaultExecutor) { - val threadFactory = namedThreadFactory("msr-default") - MeasureExecutorServiceImpl(threadFactory) - } + override fun defaultExecutor(): MeasureExecutorService = executors.getOrPut(ExecutorServiceName.DefaultExecutor) { + val threadFactory = namedThreadFactory("msr-default") + MeasureExecutorServiceImpl(threadFactory) } - override fun eventExportExecutor(): MeasureExecutorService { - return executors.getOrPut(ExecutorServiceName.ExportExecutor) { - val threadFactory = namedThreadFactory("msr-export") - MeasureExecutorServiceImpl(threadFactory) - } + override fun eventExportExecutor(): MeasureExecutorService = executors.getOrPut(ExecutorServiceName.ExportExecutor) { + val threadFactory = namedThreadFactory("msr-export") + MeasureExecutorServiceImpl(threadFactory) } private fun namedThreadFactory(threadName: String) = ThreadFactory { runnable: Runnable -> diff --git a/android/measure/src/main/java/sh/measure/android/executors/MeasureExecutorService.kt b/android/measure/src/main/java/sh/measure/android/executors/MeasureExecutorService.kt index 44546a6fc..116df08ed 100644 --- a/android/measure/src/main/java/sh/measure/android/executors/MeasureExecutorService.kt +++ b/android/measure/src/main/java/sh/measure/android/executors/MeasureExecutorService.kt @@ -27,34 +27,27 @@ internal interface MeasureExecutorService { fun shutdown() } -internal class MeasureExecutorServiceImpl @TestOnly constructor(private val executorService: ScheduledExecutorService) : - MeasureExecutorService { +internal class MeasureExecutorServiceImpl @TestOnly constructor(private val executorService: ScheduledExecutorService) : MeasureExecutorService { constructor(threadFactory: ThreadFactory) : this( Executors.newSingleThreadScheduledExecutor(threadFactory), ) - override fun submit(callable: Callable): Future { - return executorService.submit(callable) - } + override fun submit(callable: Callable): Future = executorService.submit(callable) - override fun schedule(callable: Callable, delayMillis: Long): Future { - return executorService.schedule(callable, delayMillis, TimeUnit.MILLISECONDS) - } + override fun schedule(callable: Callable, delayMillis: Long): Future = executorService.schedule(callable, delayMillis, TimeUnit.MILLISECONDS) override fun scheduleAtFixedRate( runnable: Runnable, initialDelay: Long, delayMillis: Long, delayUnit: TimeUnit, - ): Future<*> { - return executorService.scheduleWithFixedDelay( - runnable, - initialDelay, - delayMillis, - delayUnit, - ) - } + ): Future<*> = executorService.scheduleWithFixedDelay( + runnable, + initialDelay, + delayMillis, + delayUnit, + ) override fun shutdown() { executorService.shutdown() diff --git a/android/measure/src/main/java/sh/measure/android/exporter/Exporter.kt b/android/measure/src/main/java/sh/measure/android/exporter/Exporter.kt index 5b0c4c0a9..083518a08 100644 --- a/android/measure/src/main/java/sh/measure/android/exporter/Exporter.kt +++ b/android/measure/src/main/java/sh/measure/android/exporter/Exporter.kt @@ -67,13 +67,9 @@ internal class ExporterImpl( } } - override fun createBatch(sessionId: String?): Batch? { - return batchCreator.create(sessionId) - } + override fun createBatch(sessionId: String?): Batch? = batchCreator.create(sessionId) - override fun getExistingBatches(): List { - return database.getBatches(MAX_EXISTING_BATCHES_TO_EXPORT) - } + override fun getExistingBatches(): List = database.getBatches(MAX_EXISTING_BATCHES_TO_EXPORT) private fun handleBatchProcessingResult( response: HttpResponse, diff --git a/android/measure/src/main/java/sh/measure/android/exporter/HttpUrlConnectionClient.kt b/android/measure/src/main/java/sh/measure/android/exporter/HttpUrlConnectionClient.kt index 1617f6ee9..dd88b51d6 100644 --- a/android/measure/src/main/java/sh/measure/android/exporter/HttpUrlConnectionClient.kt +++ b/android/measure/src/main/java/sh/measure/android/exporter/HttpUrlConnectionClient.kt @@ -42,9 +42,7 @@ internal class HttpUrlConnectionClient(private val logger: Logger) : HttpClient method: String, headers: Map, multipartData: List, - ): HttpResponse { - return sendMultiPartRequestWithRedirects(url, method, headers, multipartData, 0) - } + ): HttpResponse = sendMultiPartRequestWithRedirects(url, method, headers, multipartData, 0) private fun sendMultiPartRequestWithRedirects( url: String, @@ -107,16 +105,14 @@ internal class HttpUrlConnectionClient(private val logger: Logger) : HttpClient url: String, method: String, headers: Map, - ): HttpURLConnection { - return (URL(url).openConnection() as HttpURLConnection).apply { - requestMethod = method - doOutput = true - setChunkedStreamingMode(0) - connectTimeout = connectionTimeoutMs - readTimeout = readTimeoutMs - setRequestProperty("Content-Type", "multipart/form-data; boundary=$boundary") - headers.forEach { (key, value) -> setRequestProperty(key, value) } - } + ): HttpURLConnection = (URL(url).openConnection() as HttpURLConnection).apply { + requestMethod = method + doOutput = true + setChunkedStreamingMode(0) + connectTimeout = connectionTimeoutMs + readTimeout = readTimeoutMs + setRequestProperty("Content-Type", "multipart/form-data; boundary=$boundary") + headers.forEach { (key, value) -> setRequestProperty(key, value) } } private fun streamMultipartData( @@ -188,28 +184,24 @@ internal class HttpUrlConnectionClient(private val logger: Logger) : HttpClient return headers to data.inputStream.source() } - private fun getOutputStream(connection: HttpURLConnection): BufferedSink { - return if (logger.enabled) { - LoggingOutputStream(connection.outputStream, logger).sink().buffer() - } else { - connection.outputStream.sink().buffer() - } + private fun getOutputStream(connection: HttpURLConnection): BufferedSink = if (logger.enabled) { + LoggingOutputStream(connection.outputStream, logger).sink().buffer() + } else { + connection.outputStream.sink().buffer() } - private fun getResponseBody(connection: HttpURLConnection): String? { - return try { - when (connection.responseCode) { - in 200..299 -> { - connection.inputStream.source().buffer().readString(Charsets.UTF_8) - } + private fun getResponseBody(connection: HttpURLConnection): String? = try { + when (connection.responseCode) { + in 200..299 -> { + connection.inputStream.source().buffer().readString(Charsets.UTF_8) + } - else -> { - connection.errorStream?.source()?.buffer()?.readString(Charsets.UTF_8) - } + else -> { + connection.errorStream?.source()?.buffer()?.readString(Charsets.UTF_8) } - } catch (e: IOException) { - null } + } catch (e: IOException) { + null } private fun processResponse(connection: HttpURLConnection): HttpResponse { diff --git a/android/measure/src/main/java/sh/measure/android/exporter/MultipartDataFactory.kt b/android/measure/src/main/java/sh/measure/android/exporter/MultipartDataFactory.kt index 9dec55188..6f5d4f498 100644 --- a/android/measure/src/main/java/sh/measure/android/exporter/MultipartDataFactory.kt +++ b/android/measure/src/main/java/sh/measure/android/exporter/MultipartDataFactory.kt @@ -49,34 +49,32 @@ internal class MultipartDataFactoryImpl( const val SPAN_FORM_NAME = "span" } - override fun createFromEventPacket(eventPacket: EventPacket): MultipartData? { - return when { - eventPacket.serializedData != null -> { - eventPacket.getFromSerializedData()?.let { - MultipartData.FormField( - name = EVENT_FORM_NAME, - value = it, - ) - } - } - - eventPacket.serializedDataFilePath != null -> { - eventPacket.getFromFileData()?.let { - MultipartData.FormField( - name = EVENT_FORM_NAME, - value = it, - ) - } + override fun createFromEventPacket(eventPacket: EventPacket): MultipartData? = when { + eventPacket.serializedData != null -> { + eventPacket.getFromSerializedData()?.let { + MultipartData.FormField( + name = EVENT_FORM_NAME, + value = it, + ) } + } - else -> { - logger.log( - LogLevel.Debug, - "Event packet (id=${eventPacket.eventId}) does not contain serialized data or file path", + eventPacket.serializedDataFilePath != null -> { + eventPacket.getFromFileData()?.let { + MultipartData.FormField( + name = EVENT_FORM_NAME, + value = it, ) - null } } + + else -> { + logger.log( + LogLevel.Debug, + "Event packet (id=${eventPacket.eventId}) does not contain serialized data or file path", + ) + null + } } override fun createFromAttachmentPacket(attachmentPacket: AttachmentPacket): MultipartData? { @@ -93,25 +91,20 @@ internal class MultipartDataFactoryImpl( } } - override fun createFromSpanPacket(spanPacket: SpanPacket): MultipartData { - return spanPacket.getSerializedData().let { - MultipartData.FormField( - name = SPAN_FORM_NAME, - value = it, - ) - } + override fun createFromSpanPacket(spanPacket: SpanPacket): MultipartData = spanPacket.getSerializedData().let { + MultipartData.FormField( + name = SPAN_FORM_NAME, + value = it, + ) } - private fun getFileInputStream(filePath: String): InputStream? { - return fileStorage.getFile(filePath)?.inputStream().also { fileInputStream -> - if (fileInputStream == null) { - logger.log(LogLevel.Debug, "No file found at path: $filePath") - } + private fun getFileInputStream(filePath: String): InputStream? = fileStorage.getFile(filePath)?.inputStream().also { fileInputStream -> + if (fileInputStream == null) { + logger.log(LogLevel.Debug, "No file found at path: $filePath") } } - private fun getAttachmentFormDataName(attachmentPacket: AttachmentPacket): String = - "$ATTACHMENT_NAME_PREFIX${attachmentPacket.id}" + private fun getAttachmentFormDataName(attachmentPacket: AttachmentPacket): String = "$ATTACHMENT_NAME_PREFIX${attachmentPacket.id}" private fun EventPacket.getFromSerializedData(): String? { if (serializedData.isNullOrEmpty()) { @@ -131,7 +124,5 @@ internal class MultipartDataFactoryImpl( return "{\"id\":\"$eventId\",\"session_id\":\"$sessionId\",\"user_triggered\":$userTriggered,\"timestamp\":\"$timestamp\",\"type\":\"${type.value}\",\"${type.value}\":$data,\"attachments\":$serializedAttachments,\"attribute\":$serializedAttributes,\"user_defined_attribute\":$serializedUserDefinedAttributes}" } - private fun SpanPacket.getSerializedData(): String { - return jsonSerializer.encodeToString(SpanPacket.serializer(), this) - } + private fun SpanPacket.getSerializedData(): String = jsonSerializer.encodeToString(SpanPacket.serializer(), this) } diff --git a/android/measure/src/main/java/sh/measure/android/exporter/NetworkClient.kt b/android/measure/src/main/java/sh/measure/android/exporter/NetworkClient.kt index 4de531af5..fbe774afc 100644 --- a/android/measure/src/main/java/sh/measure/android/exporter/NetworkClient.kt +++ b/android/measure/src/main/java/sh/measure/android/exporter/NetworkClient.kt @@ -63,27 +63,21 @@ internal class NetworkClientImpl( } } - private fun parseUrl(url: String): URL? { - return try { - URL(url) - } catch (e: Exception) { - logger.log(LogLevel.Error, "Failed to send request: invalid API_URL", e) - null - } + private fun parseUrl(url: String): URL? = try { + URL(url) + } catch (e: Exception) { + logger.log(LogLevel.Error, "Failed to send request: invalid API_URL", e) + null } - private fun createEventsUrl(baseUrl: URL): URL? { - return try { - baseUrl.toURI().resolve(PATH_EVENTS).toURL() - } catch (e: Exception) { - logger.log(LogLevel.Error, "Failed to send request: invalid API_URL", e) - null - } + private fun createEventsUrl(baseUrl: URL): URL? = try { + baseUrl.toURI().resolve(PATH_EVENTS).toURL() + } catch (e: Exception) { + logger.log(LogLevel.Error, "Failed to send request: invalid API_URL", e) + null } - private fun isInitialized(): Boolean { - return !(baseUrl == null || eventsUrl == null || apiKey == null) - } + private fun isInitialized(): Boolean = !(baseUrl == null || eventsUrl == null || apiKey == null) private fun createHeaders(batchId: String): Map { val defaultHeaders = mapOf( diff --git a/android/measure/src/main/java/sh/measure/android/exporter/PeriodicExporter.kt b/android/measure/src/main/java/sh/measure/android/exporter/PeriodicExporter.kt index c44f6f5b3..7ec335849 100644 --- a/android/measure/src/main/java/sh/measure/android/exporter/PeriodicExporter.kt +++ b/android/measure/src/main/java/sh/measure/android/exporter/PeriodicExporter.kt @@ -27,7 +27,8 @@ internal class PeriodicExporterImpl( private val timeProvider: TimeProvider, private val heartbeat: Heartbeat, private val exporter: Exporter, -) : PeriodicExporter, HeartbeatListener { +) : PeriodicExporter, + HeartbeatListener { @VisibleForTesting internal val isExportInProgress = AtomicBoolean(false) diff --git a/android/measure/src/main/java/sh/measure/android/gestures/GestureCollector.kt b/android/measure/src/main/java/sh/measure/android/gestures/GestureCollector.kt index 436f39e1e..3cd7c8d22 100644 --- a/android/measure/src/main/java/sh/measure/android/gestures/GestureCollector.kt +++ b/android/measure/src/main/java/sh/measure/android/gestures/GestureCollector.kt @@ -115,9 +115,7 @@ internal class GestureCollector( }) } - private fun findTargetNode(layoutSnapshot: LayoutSnapshot): Node? { - return layoutSnapshot.findTargetNode() - } + private fun findTargetNode(layoutSnapshot: LayoutSnapshot): Node? = layoutSnapshot.findTargetNode() private fun handleClick( gesture: DetectedGesture.Click, @@ -193,30 +191,26 @@ internal class GestureCollector( gesture: DetectedGesture, window: Window, motionEvent: MotionEvent, - ): LayoutSnapshot { - return LayoutInspector.capture( - window.decorView.rootView, - gesture, - motionEvent, - ) - } + ): LayoutSnapshot = LayoutInspector.capture( + window.decorView.rootView, + gesture, + motionEvent, + ) // This is required for setting the correct SVG size. // The window size can change when device is rotated, folded/unfolded // or app is resized, Also, certain views like ViewPager do not respect viewport // size, and draw outside of it to improve scroll perf leading to some content being rendered // outside visible bounds of screen. - private fun getScreenWidthHeight(window: Window): Pair { - return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) { - val displayMetrics = DisplayMetrics() - @Suppress("DEPRECATION") - window.windowManager.defaultDisplay.getMetrics(displayMetrics) - Pair(displayMetrics.widthPixels, displayMetrics.heightPixels) - } else { - val bounds = window.windowManager.currentWindowMetrics.bounds - val width = bounds.width() - val height = bounds.height() - Pair(width, height) - } + private fun getScreenWidthHeight(window: Window): Pair = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) { + val displayMetrics = DisplayMetrics() + @Suppress("DEPRECATION") + window.windowManager.defaultDisplay.getMetrics(displayMetrics) + Pair(displayMetrics.widthPixels, displayMetrics.heightPixels) + } else { + val bounds = window.windowManager.currentWindowMetrics.bounds + val width = bounds.width() + val height = bounds.height() + Pair(width, height) } } diff --git a/android/measure/src/main/java/sh/measure/android/gestures/GestureEvents.kt b/android/measure/src/main/java/sh/measure/android/gestures/GestureEvents.kt index 3954efa28..8dfff8cf3 100644 --- a/android/measure/src/main/java/sh/measure/android/gestures/GestureEvents.kt +++ b/android/measure/src/main/java/sh/measure/android/gestures/GestureEvents.kt @@ -17,18 +17,16 @@ internal data class ClickData( val touch_up_time: Long?, ) { companion object { - fun fromTargetNode(gesture: DetectedGesture.Click, node: Node): ClickData { - return ClickData( - target = node.className, - target_id = node.id, - width = node.width, - height = node.height, - x = gesture.x, - y = gesture.y, - touch_down_time = gesture.touchDownTime, - touch_up_time = gesture.touchUpTime, - ) - } + fun fromTargetNode(gesture: DetectedGesture.Click, node: Node): ClickData = ClickData( + target = node.className, + target_id = node.id, + width = node.width, + height = node.height, + x = gesture.x, + y = gesture.y, + touch_down_time = gesture.touchDownTime, + touch_up_time = gesture.touchUpTime, + ) } } @@ -45,18 +43,16 @@ internal data class LongClickData( val touch_up_time: Long?, ) { companion object { - fun fromTargetNode(gesture: DetectedGesture.LongClick, node: Node): LongClickData { - return LongClickData( - target = node.className, - target_id = node.id, - width = node.width, - height = node.height, - x = gesture.x, - y = gesture.y, - touch_down_time = gesture.touchDownTime, - touch_up_time = gesture.touchUpTime, - ) - } + fun fromTargetNode(gesture: DetectedGesture.LongClick, node: Node): LongClickData = LongClickData( + target = node.className, + target_id = node.id, + width = node.width, + height = node.height, + x = gesture.x, + y = gesture.y, + touch_down_time = gesture.touchDownTime, + touch_up_time = gesture.touchUpTime, + ) } } @@ -74,18 +70,16 @@ internal data class ScrollData( val touch_up_time: Long?, ) { companion object { - fun fromTargetNode(gesture: DetectedGesture.Scroll, node: Node): ScrollData { - return ScrollData( - target = node.className, - target_id = node.id, - x = gesture.x, - y = gesture.y, - end_x = gesture.endX, - end_y = gesture.endY, - touch_down_time = gesture.touchDownTime, - touch_up_time = gesture.touchUpTime, - direction = gesture.direction.name.lowercase(), - ) - } + fun fromTargetNode(gesture: DetectedGesture.Scroll, node: Node): ScrollData = ScrollData( + target = node.className, + target_id = node.id, + x = gesture.x, + y = gesture.y, + end_x = gesture.endX, + end_y = gesture.endY, + touch_down_time = gesture.touchDownTime, + touch_up_time = gesture.touchUpTime, + direction = gesture.direction.name.lowercase(), + ) } } diff --git a/android/measure/src/main/java/sh/measure/android/layoutinspector/LayoutInspector.kt b/android/measure/src/main/java/sh/measure/android/layoutinspector/LayoutInspector.kt index 14d56a3a0..1c1a2f819 100644 --- a/android/measure/src/main/java/sh/measure/android/layoutinspector/LayoutInspector.kt +++ b/android/measure/src/main/java/sh/measure/android/layoutinspector/LayoutInspector.kt @@ -38,9 +38,7 @@ internal object LayoutInspector { */ fun capture( rootView: View, - ): LayoutSnapshot { - return parseLayoutInternal(rootView, null, null) - } + ): LayoutSnapshot = parseLayoutInternal(rootView, null, null) /** * Creates a snapshot of the view hierarchy with information about which element will consume @@ -56,9 +54,7 @@ internal object LayoutInspector { rootView: View, gesture: DetectedGesture, motionEvent: MotionEvent, - ): LayoutSnapshot { - return parseLayoutInternal(rootView, gesture, motionEvent) - } + ): LayoutSnapshot = parseLayoutInternal(rootView, gesture, motionEvent) private fun parseLayoutInternal( rootView: View, @@ -153,14 +149,12 @@ internal object LayoutInspector { } } - private fun canScroll(view: View): Boolean { - return if (view.isScrollContainer) { - view.canScrollHorizontally(-1) || view.canScrollHorizontally(1) || view.canScrollVertically( - -1, - ) || view.canScrollVertically(1) - } else { - false - } + private fun canScroll(view: View): Boolean = if (view.isScrollContainer) { + view.canScrollHorizontally(-1) || view.canScrollHorizontally(1) || view.canScrollVertically( + -1, + ) || view.canScrollVertically(1) + } else { + false } /** diff --git a/android/measure/src/main/java/sh/measure/android/layoutinspector/LayoutSnapshot.kt b/android/measure/src/main/java/sh/measure/android/layoutinspector/LayoutSnapshot.kt index c799759cc..b1684b1ec 100644 --- a/android/measure/src/main/java/sh/measure/android/layoutinspector/LayoutSnapshot.kt +++ b/android/measure/src/main/java/sh/measure/android/layoutinspector/LayoutSnapshot.kt @@ -18,19 +18,17 @@ internal class LayoutSnapshot(private val nodes: List) { * @param height The height of the SVG to be generated. * @return An [Attachment] containing the SVG data with MIME type set to LAYOUT_SNAPSHOT */ - fun generateSvgAttachment(targetNode: Node? = null, width: Int, height: Int): Attachment { - return InternalTrace.trace( - label = { "msr-generateSvgAttachment" }, - block = { - val svg = nodes.generateSvg(targetNode, width, height) - Attachment( - "snapshot.svg", - AttachmentType.LAYOUT_SNAPSHOT, - svg.encodeToByteArray(), - ) - }, - ) - } + fun generateSvgAttachment(targetNode: Node? = null, width: Int, height: Int): Attachment = InternalTrace.trace( + label = { "msr-generateSvgAttachment" }, + block = { + val svg = nodes.generateSvg(targetNode, width, height) + Attachment( + "snapshot.svg", + AttachmentType.LAYOUT_SNAPSHOT, + svg.encodeToByteArray(), + ) + }, + ) /** * Generates an SVG visualization of the layout snapshot as an attachment. @@ -43,27 +41,21 @@ internal class LayoutSnapshot(private val nodes: List) { * @param height The height of the SVG to be generated. * @return An [Attachment] containing the SVG data with MIME type set to LAYOUT_SNAPSHOT */ - fun generateSvgMsrAttachment(targetNode: Node? = null, width: Int, height: Int): MsrAttachment { - return InternalTrace.trace( - label = { "msr-generateSvgAttachment" }, - block = { - val svg = nodes.generateSvg(targetNode, width, height) - MsrAttachment( - "snapshot.svg", - bytes = svg.encodeToByteArray(), - type = AttachmentType.LAYOUT_SNAPSHOT, - ) - }, - ) - } + fun generateSvgMsrAttachment(targetNode: Node? = null, width: Int, height: Int): MsrAttachment = InternalTrace.trace( + label = { "msr-generateSvgAttachment" }, + block = { + val svg = nodes.generateSvg(targetNode, width, height) + MsrAttachment( + "snapshot.svg", + bytes = svg.encodeToByteArray(), + type = AttachmentType.LAYOUT_SNAPSHOT, + ) + }, + ) - fun findTargetNode(): Node? { - return nodes.findLast { it.willConsumeGesture } - } + fun findTargetNode(): Node? = nodes.findLast { it.willConsumeGesture } - fun isEmpty(): Boolean { - return nodes.isEmpty() - } + fun isEmpty(): Boolean = nodes.isEmpty() } internal data class Node( diff --git a/android/measure/src/main/java/sh/measure/android/lifecycle/AndroidXFragmentNavigationCollector.kt b/android/measure/src/main/java/sh/measure/android/lifecycle/AndroidXFragmentNavigationCollector.kt index a704e6979..c5710b01a 100644 --- a/android/measure/src/main/java/sh/measure/android/lifecycle/AndroidXFragmentNavigationCollector.kt +++ b/android/measure/src/main/java/sh/measure/android/lifecycle/AndroidXFragmentNavigationCollector.kt @@ -19,7 +19,8 @@ import sh.measure.android.utils.isClassAvailable internal class AndroidXFragmentNavigationCollector( private val signalProcessor: SignalProcessor, private val timeProvider: TimeProvider, -) : FragmentLifecycleAdapter(), NavController.OnDestinationChangedListener { +) : FragmentLifecycleAdapter(), + NavController.OnDestinationChangedListener { override fun onFragmentViewCreated( fm: FragmentManager, @@ -67,18 +68,15 @@ internal class AndroidXFragmentNavigationCollector( } } - private fun getDisplayName(context: Context, id: Int): String { - return if (id <= 0x00FFFFFF) { + private fun getDisplayName(context: Context, id: Int): String = if (id <= 0x00FFFFFF) { + id.toString() + } else { + try { + context.resources.getResourceName(id) + } catch (e: Resources.NotFoundException) { id.toString() - } else { - try { - context.resources.getResourceName(id) - } catch (e: Resources.NotFoundException) { - id.toString() - } } } - private fun hasAndroidxFragmentNavigation() = - isClassAvailable("androidx.navigation.fragment.NavHostFragment") + private fun hasAndroidxFragmentNavigation() = isClassAvailable("androidx.navigation.fragment.NavHostFragment") } diff --git a/android/measure/src/main/java/sh/measure/android/lifecycle/DefaultActivityLifecycleCollector.kt b/android/measure/src/main/java/sh/measure/android/lifecycle/DefaultActivityLifecycleCollector.kt index 442d40d8e..3d53939cb 100644 --- a/android/measure/src/main/java/sh/measure/android/lifecycle/DefaultActivityLifecycleCollector.kt +++ b/android/measure/src/main/java/sh/measure/android/lifecycle/DefaultActivityLifecycleCollector.kt @@ -31,7 +31,8 @@ internal class DefaultActivityLifecycleCollector( private val timeProvider: TimeProvider, private val configProvider: ConfigProvider, private val tracer: Tracer, -) : ActivityLifecycleCollector, ActivityLifecycleListener { +) : ActivityLifecycleCollector, + ActivityLifecycleListener { private val createdActivities = mutableMapOf() private val fragmentLifecycleCollector by lazy { FragmentLifecycleCollector(signalProcessor, timeProvider, configProvider, tracer) @@ -197,9 +198,7 @@ internal class DefaultActivityLifecycleCollector( } } - private fun isAndroidXFragmentAvailable() = - isClassAvailable("androidx.fragment.app.FragmentActivity") + private fun isAndroidXFragmentAvailable() = isClassAvailable("androidx.fragment.app.FragmentActivity") - private fun isAndroidXFragmentNavigationAvailable() = - isClassAvailable("androidx.navigation.fragment.NavHostFragment") + private fun isAndroidXFragmentNavigationAvailable() = isClassAvailable("androidx.navigation.fragment.NavHostFragment") } diff --git a/android/measure/src/main/java/sh/measure/android/lifecycle/FragmentLifecycleCollector.kt b/android/measure/src/main/java/sh/measure/android/lifecycle/FragmentLifecycleCollector.kt index 21249aa2b..686db6d0f 100644 --- a/android/measure/src/main/java/sh/measure/android/lifecycle/FragmentLifecycleCollector.kt +++ b/android/measure/src/main/java/sh/measure/android/lifecycle/FragmentLifecycleCollector.kt @@ -133,7 +133,5 @@ internal class FragmentLifecycleCollector( } } - private fun getIdentityHash(fragment: Fragment): String { - return Integer.toHexString(System.identityHashCode(fragment)) - } + private fun getIdentityHash(fragment: Fragment): String = Integer.toHexString(System.identityHashCode(fragment)) } diff --git a/android/measure/src/main/java/sh/measure/android/networkchange/NetworkChangesCollector.kt b/android/measure/src/main/java/sh/measure/android/networkchange/NetworkChangesCollector.kt index 7b83510e6..20e6e0887 100644 --- a/android/measure/src/main/java/sh/measure/android/networkchange/NetworkChangesCollector.kt +++ b/android/measure/src/main/java/sh/measure/android/networkchange/NetworkChangesCollector.kt @@ -188,21 +188,19 @@ internal class NetworkChangesCollector( previousNetworkType: String?, newNetworkGeneration: String?, previousNetworkGeneration: String?, - ): Boolean { - return when { - // track if network type has changed - previousNetworkType != newNetworkType -> { - true - } + ): Boolean = when { + // track if network type has changed + previousNetworkType != newNetworkType -> { + true + } - // track if network type is cellular, but network generation has changed - newNetworkType == NetworkType.CELLULAR && newNetworkGeneration != null && newNetworkGeneration != previousNetworkGeneration -> { - true - } + // track if network type is cellular, but network generation has changed + newNetworkType == NetworkType.CELLULAR && newNetworkGeneration != null && newNetworkGeneration != previousNetworkGeneration -> { + true + } - else -> { - false - } + else -> { + false } } diff --git a/android/measure/src/main/java/sh/measure/android/networkchange/NetworkStateProviderImpl.kt b/android/measure/src/main/java/sh/measure/android/networkchange/NetworkStateProviderImpl.kt index 0d06d978d..f17383342 100644 --- a/android/measure/src/main/java/sh/measure/android/networkchange/NetworkStateProviderImpl.kt +++ b/android/measure/src/main/java/sh/measure/android/networkchange/NetworkStateProviderImpl.kt @@ -37,7 +37,5 @@ internal class NetworkStateProviderImpl( this.networkState = networkState } - override fun getNetworkState(): NetworkState? { - return networkState - } + override fun getNetworkState(): NetworkState? = networkState } diff --git a/android/measure/src/main/java/sh/measure/android/okhttp/HttpData.kt b/android/measure/src/main/java/sh/measure/android/okhttp/HttpData.kt index 17531361a..a64862e9c 100644 --- a/android/measure/src/main/java/sh/measure/android/okhttp/HttpData.kt +++ b/android/measure/src/main/java/sh/measure/android/okhttp/HttpData.kt @@ -94,14 +94,11 @@ internal data class HttpData( fun failureReason(failureReason: String?) = apply { this.failureReason = failureReason } - fun failureDescription(failureDescription: String?) = - apply { this.failureDescription = failureDescription } + fun failureDescription(failureDescription: String?) = apply { this.failureDescription = failureDescription } - fun requestHeaders(requestHeaders: Map) = - apply { this.requestHeaders = requestHeaders } + fun requestHeaders(requestHeaders: Map) = apply { this.requestHeaders = requestHeaders } - fun responseHeaders(responseHeaders: Map) = - apply { this.responseHeaders = responseHeaders } + fun responseHeaders(responseHeaders: Map) = apply { this.responseHeaders = responseHeaders } fun requestBody(requestBody: String?) = apply { this.requestBody = requestBody } @@ -109,21 +106,19 @@ internal data class HttpData( fun client(client: String) = apply { this.client = client } - fun build(): HttpData { - return HttpData( - url = url, - method = method, - status_code = statusCode, - start_time = startTime, - end_time = endTime, - failure_reason = failureReason, - failure_description = failureDescription, - request_headers = requestHeaders, - response_headers = responseHeaders, - request_body = requestBody, - response_body = responseBody, - client = client, - ) - } + fun build(): HttpData = HttpData( + url = url, + method = method, + status_code = statusCode, + start_time = startTime, + end_time = endTime, + failure_reason = failureReason, + failure_description = failureDescription, + request_headers = requestHeaders, + response_headers = responseHeaders, + request_body = requestBody, + response_body = responseBody, + client = client, + ) } } diff --git a/android/measure/src/main/java/sh/measure/android/okhttp/HttpEventCollectorFactory.kt b/android/measure/src/main/java/sh/measure/android/okhttp/HttpEventCollectorFactory.kt index 39ec0b95d..920825fdc 100644 --- a/android/measure/src/main/java/sh/measure/android/okhttp/HttpEventCollectorFactory.kt +++ b/android/measure/src/main/java/sh/measure/android/okhttp/HttpEventCollectorFactory.kt @@ -16,11 +16,9 @@ internal class HttpEventCollectorFactory( private val timeProvider: TimeProvider, private val configProvider: ConfigProvider, ) { - fun create(): HttpEventCollector { - return if (isClassAvailable("okhttp3.OkHttpClient")) { - OkHttpEventCollectorImpl(logger, signalProcessor, timeProvider, configProvider) - } else { - NoOpHttpEventCollector() - } + fun create(): HttpEventCollector = if (isClassAvailable("okhttp3.OkHttpClient")) { + OkHttpEventCollectorImpl(logger, signalProcessor, timeProvider, configProvider) + } else { + NoOpHttpEventCollector() } } diff --git a/android/measure/src/main/java/sh/measure/android/okhttp/MeasureOkHttpApplicationInterceptor.kt b/android/measure/src/main/java/sh/measure/android/okhttp/MeasureOkHttpApplicationInterceptor.kt index 1613f1edb..eeaaf03e4 100644 --- a/android/measure/src/main/java/sh/measure/android/okhttp/MeasureOkHttpApplicationInterceptor.kt +++ b/android/measure/src/main/java/sh/measure/android/okhttp/MeasureOkHttpApplicationInterceptor.kt @@ -25,6 +25,5 @@ class MeasureOkHttpApplicationInterceptor internal constructor( return response } - private fun getIdentityHash(call: Call): String = - Integer.toHexString(System.identityHashCode(call)) + private fun getIdentityHash(call: Call): String = Integer.toHexString(System.identityHashCode(call)) } diff --git a/android/measure/src/main/java/sh/measure/android/okhttp/OkHttpEventCollector.kt b/android/measure/src/main/java/sh/measure/android/okhttp/OkHttpEventCollector.kt index 98eab10a5..905702d78 100644 --- a/android/measure/src/main/java/sh/measure/android/okhttp/OkHttpEventCollector.kt +++ b/android/measure/src/main/java/sh/measure/android/okhttp/OkHttpEventCollector.kt @@ -15,7 +15,9 @@ import sh.measure.android.utils.TimeProvider import java.io.IOException import java.util.concurrent.atomic.AtomicBoolean -internal abstract class OkHttpEventCollector : EventListener(), HttpEventCollector { +internal abstract class OkHttpEventCollector : + EventListener(), + HttpEventCollector { open fun request(call: Call, request: Request) {} open fun response(call: Call, request: Request, response: Response) {} } @@ -182,7 +184,5 @@ internal class OkHttpEventCollectorImpl( return null } - private fun getIdentityHash(call: Call): String { - return Integer.toHexString(System.identityHashCode(call)) - } + private fun getIdentityHash(call: Call): String = Integer.toHexString(System.identityHashCode(call)) } diff --git a/android/measure/src/main/java/sh/measure/android/performance/CpuUsageCollector.kt b/android/measure/src/main/java/sh/measure/android/performance/CpuUsageCollector.kt index 0ae089736..7c676f045 100644 --- a/android/measure/src/main/java/sh/measure/android/performance/CpuUsageCollector.kt +++ b/android/measure/src/main/java/sh/measure/android/performance/CpuUsageCollector.kt @@ -98,11 +98,9 @@ internal class CpuUsageCollector( prevCpuUsageData = cpuUsageData } - private fun getInterval(uptime: Long): Long { - return prevCpuUsageData?.let { - (uptime - it.uptime).coerceAtLeast(0) - } ?: 0 - } + private fun getInterval(uptime: Long): Long = prevCpuUsageData?.let { + (uptime - it.uptime).coerceAtLeast(0) + } ?: 0 private fun getPercentageCpuUsage( utime: Long, diff --git a/android/measure/src/main/java/sh/measure/android/screenshot/ScreenshotCollector.kt b/android/measure/src/main/java/sh/measure/android/screenshot/ScreenshotCollector.kt index d0e04f3c6..98b51e228 100644 --- a/android/measure/src/main/java/sh/measure/android/screenshot/ScreenshotCollector.kt +++ b/android/measure/src/main/java/sh/measure/android/screenshot/ScreenshotCollector.kt @@ -69,7 +69,5 @@ internal class ScreenshotCollectorImpl( } } - private fun isActivityAlive(activity: Activity): Boolean { - return !activity.isFinishing && !activity.isDestroyed - } + private fun isActivityAlive(activity: Activity): Boolean = !activity.isFinishing && !activity.isDestroyed } diff --git a/android/measure/src/main/java/sh/measure/android/screenshot/ScreenshotMask.kt b/android/measure/src/main/java/sh/measure/android/screenshot/ScreenshotMask.kt index 20db9672e..febcc74c9 100644 --- a/android/measure/src/main/java/sh/measure/android/screenshot/ScreenshotMask.kt +++ b/android/measure/src/main/java/sh/measure/android/screenshot/ScreenshotMask.kt @@ -82,34 +82,23 @@ internal class ScreenshotMask(private val configProvider: ConfigProvider) { } } - private fun shouldMaskTextView(view: TextView): Boolean { - return configProvider.screenshotMaskLevel == ScreenshotMaskLevel.AllTextAndMedia || configProvider.screenshotMaskLevel == ScreenshotMaskLevel.AllText || (configProvider.screenshotMaskLevel == ScreenshotMaskLevel.AllTextExceptClickable && !view.isClickable) || (configProvider.screenshotMaskLevel == ScreenshotMaskLevel.SensitiveFieldsOnly && view.isSensitiveInputType()) - } + private fun shouldMaskTextView(view: TextView): Boolean = configProvider.screenshotMaskLevel == ScreenshotMaskLevel.AllTextAndMedia || configProvider.screenshotMaskLevel == ScreenshotMaskLevel.AllText || (configProvider.screenshotMaskLevel == ScreenshotMaskLevel.AllTextExceptClickable && !view.isClickable) || (configProvider.screenshotMaskLevel == ScreenshotMaskLevel.SensitiveFieldsOnly && view.isSensitiveInputType()) - private fun shouldMaskComposeText(isClickable: Boolean, isPassword: Boolean): Boolean { - return ( - configProvider.screenshotMaskLevel == ScreenshotMaskLevel.AllTextAndMedia || - configProvider.screenshotMaskLevel == ScreenshotMaskLevel.AllText || - (configProvider.screenshotMaskLevel == ScreenshotMaskLevel.AllTextExceptClickable && !isClickable) || - (configProvider.screenshotMaskLevel == ScreenshotMaskLevel.SensitiveFieldsOnly && isPassword) - ) - } + private fun shouldMaskComposeText(isClickable: Boolean, isPassword: Boolean): Boolean = ( + configProvider.screenshotMaskLevel == ScreenshotMaskLevel.AllTextAndMedia || + configProvider.screenshotMaskLevel == ScreenshotMaskLevel.AllText || + (configProvider.screenshotMaskLevel == ScreenshotMaskLevel.AllTextExceptClickable && !isClickable) || + (configProvider.screenshotMaskLevel == ScreenshotMaskLevel.SensitiveFieldsOnly && isPassword) + ) - private fun isNodeImage(node: SemanticsNode): Boolean { - return node.config.getOrNull(SemanticsProperties.ContentDescription) != null - } + private fun isNodeImage(node: SemanticsNode): Boolean = node.config.getOrNull(SemanticsProperties.ContentDescription) != null - private fun isNodeClickable(node: SemanticsNode): Boolean { - return node.config.getOrNull(SemanticsActions.OnClick) != null || node.config.getOrNull( + private fun isNodeClickable(node: SemanticsNode): Boolean = node.config.getOrNull(SemanticsActions.OnClick) != null || + node.config.getOrNull( SemanticsActions.OnLongClick, ) != null - } - private fun isExoplayerView(view: View): Boolean { - return view.javaClass.name.equals("androidx.media3.ui.PlayerView") - } + private fun isExoplayerView(view: View): Boolean = view.javaClass.name.equals("androidx.media3.ui.PlayerView") - private fun androidx.compose.ui.geometry.Rect.toRect(): Rect { - return Rect(left.toInt(), top.toInt(), right.toInt(), bottom.toInt()) - } + private fun androidx.compose.ui.geometry.Rect.toRect(): Rect = Rect(left.toInt(), top.toInt(), right.toInt(), bottom.toInt()) } diff --git a/android/measure/src/main/java/sh/measure/android/storage/DbConstants.kt b/android/measure/src/main/java/sh/measure/android/storage/DbConstants.kt index bcd9d8d50..85f75a8ea 100644 --- a/android/measure/src/main/java/sh/measure/android/storage/DbConstants.kt +++ b/android/measure/src/main/java/sh/measure/android/storage/DbConstants.kt @@ -286,8 +286,7 @@ internal object Sql { } } - fun getSpansBatchQuery(spanCount: Int, ascending: Boolean): String { - return """ + fun getSpansBatchQuery(spanCount: Int, ascending: Boolean): String = """ SELECT sp.${SpansTable.COL_SPAN_ID} FROM ${SpansTable.TABLE_NAME} sp LEFT JOIN ${SpansBatchTable.TABLE_NAME} sb ON sp.${SpansTable.COL_SPAN_ID} = sb.${SpansBatchTable.COL_SPAN_ID} @@ -296,20 +295,16 @@ internal object Sql { AND sp.${SpansTable.COL_SAMPLED} = 1 ORDER BY sp.${SpansTable.COL_END_TIME} ${if (ascending) "ASC" else "DESC"} LIMIT $spanCount - """.trimIndent() - } + """.trimIndent() - fun getBatches(maxCount: Int): String { - return """ + fun getBatches(maxCount: Int): String = """ SELECT DISTINCT ${BatchesTable.COL_BATCH_ID} FROM ${BatchesTable.TABLE_NAME} ORDER BY ${BatchesTable.COL_CREATED_AT} ASC LIMIT $maxCount - """.trimIndent() - } + """.trimIndent() - fun getEventsForIds(eventIds: List): String { - return """ + fun getEventsForIds(eventIds: List): String = """ SELECT ${EventTable.COL_ID}, ${EventTable.COL_SESSION_ID}, @@ -325,11 +320,9 @@ internal object Sql { ${EventTable.COL_ATTACHMENTS} FROM ${EventTable.TABLE_NAME} WHERE ${EventTable.COL_ID} IN (${eventIds.joinToString(", ") { "\'$it\'" }}) - """.trimIndent() - } + """.trimIndent() - fun getSpansForIds(spanIds: List): String { - return """ + fun getSpansForIds(spanIds: List): String = """ SELECT ${SpansTable.COL_NAME}, ${SpansTable.COL_SESSION_ID}, @@ -345,11 +338,9 @@ internal object Sql { ${SpansTable.COL_SERIALIZED_USER_DEFINED_ATTRS} FROM ${SpansTable.TABLE_NAME} WHERE ${SpansTable.COL_SPAN_ID} IN (${spanIds.joinToString(", ") { "\'$it\'" }}) - """.trimIndent() - } + """.trimIndent() - fun getAttachmentsForEventIds(eventIds: List): String { - return """ + fun getAttachmentsForEventIds(eventIds: List): String = """ SELECT ${AttachmentTable.COL_ID}, ${AttachmentTable.COL_EVENT_ID}, @@ -360,47 +351,36 @@ internal object Sql { FROM ${AttachmentTable.TABLE_NAME} WHERE ${AttachmentTable.COL_EVENT_ID} IN (${eventIds.joinToString(", ") { "\'$it\'" }}) """ - } - fun markSessionCrashed(sessionId: String): String { - return """ + fun markSessionCrashed(sessionId: String): String = """ UPDATE ${SessionsTable.TABLE_NAME} SET ${SessionsTable.COL_CRASHED} = 1, ${SessionsTable.COL_NEEDS_REPORTING} = 1 WHERE ${SessionsTable.COL_SESSION_ID} = '$sessionId' - """.trimIndent() - } + """.trimIndent() - fun markSessionWithBugReport(sessionId: String): String { - return """ + fun markSessionWithBugReport(sessionId: String): String = """ UPDATE ${SessionsTable.TABLE_NAME} SET ${SessionsTable.COL_NEEDS_REPORTING} = 1 WHERE ${SessionsTable.COL_SESSION_ID} = '$sessionId' - """.trimIndent() - } + """.trimIndent() - fun markSessionsCrashed(sessionIds: List): String { - return """ + fun markSessionsCrashed(sessionIds: List): String = """ UPDATE ${SessionsTable.TABLE_NAME} SET ${SessionsTable.COL_CRASHED} = 1, ${SessionsTable.COL_NEEDS_REPORTING} = 1 WHERE ${SessionsTable.COL_SESSION_ID} IN (${sessionIds.joinToString(", ") { "\'$it\'" }}) - """.trimIndent() - } + """.trimIndent() - fun getEventsForSessions(sessions: List): String { - return """ + fun getEventsForSessions(sessions: List): String = """ SELECT ${EventTable.COL_ID} FROM ${EventTable.TABLE_NAME} WHERE ${EventTable.COL_SESSION_ID} IN (${sessions.joinToString(", ") { "\'$it\'" }}) - """.trimIndent() - } + """.trimIndent() - fun getAttachmentsForEvents(events: List): String { - return """ + fun getAttachmentsForEvents(events: List): String = """ SELECT ${AttachmentTable.COL_ID} FROM ${AttachmentTable.TABLE_NAME} WHERE ${AttachmentTable.COL_EVENT_ID} IN (${events.joinToString(", ") { "\'$it\'" }}) - """.trimIndent() - } + """.trimIndent() fun getSessions(needReporting: Boolean, filterSessions: List, maxCount: Int): String { val reportingCondition = @@ -422,31 +402,24 @@ internal object Sql { """.trimIndent() } - fun getOldestSession(): String { - return """ + fun getOldestSession(): String = """ SELECT ${SessionsTable.COL_SESSION_ID} FROM ${SessionsTable.TABLE_NAME} ORDER BY ${SessionsTable.COL_CREATED_AT} ASC LIMIT 1 - """.trimIndent() - } + """.trimIndent() - fun getEventsCount(): String { - return """ + fun getEventsCount(): String = """ SELECT COUNT(${EventTable.COL_ID}) AS count FROM ${EventTable.TABLE_NAME} - """.trimIndent() - } + """.trimIndent() - fun getSpansCount(): String { - return """ + fun getSpansCount(): String = """ SELECT COUNT(${SpansTable.COL_SPAN_ID}) AS count FROM ${SpansTable.TABLE_NAME} - """.trimIndent() - } + """.trimIndent() - fun getSessionForAppExit(pid: Int): String { - return """ + fun getSessionForAppExit(pid: Int): String = """ SELECT ${AppExitTable.COL_SESSION_ID}, ${AppExitTable.COL_CREATED_AT}, @@ -456,11 +429,9 @@ internal object Sql { WHERE ${AppExitTable.COL_PID} = $pid ORDER BY ${AppExitTable.COL_CREATED_AT} DESC LIMIT 1 - """.trimIndent() - } + """.trimIndent() - fun getBatchedEventIds(batchIds: List): String { - return """ + fun getBatchedEventIds(batchIds: List): String = """ SELECT ${EventsBatchTable.COL_EVENT_ID}, ${EventsBatchTable.COL_BATCH_ID} @@ -469,11 +440,9 @@ internal object Sql { WHERE ${EventsBatchTable.COL_BATCH_ID} IN (${batchIds.joinToString(", ") { "'$it'" }}) - """.trimIndent() - } + """.trimIndent() - fun getBatchedSpanIds(batchIds: List): String { - return """ + fun getBatchedSpanIds(batchIds: List): String = """ SELECT ${SpansBatchTable.COL_SPAN_ID}, ${SpansBatchTable.COL_BATCH_ID} @@ -482,6 +451,5 @@ internal object Sql { WHERE ${SpansBatchTable.COL_BATCH_ID} IN (${batchIds.joinToString(", ") { "'$it'" }}) - """.trimIndent() - } + """.trimIndent() } diff --git a/android/measure/src/main/java/sh/measure/android/storage/EventExtensions.kt b/android/measure/src/main/java/sh/measure/android/storage/EventExtensions.kt index 44bd4f2dc..74755d29d 100644 --- a/android/measure/src/main/java/sh/measure/android/storage/EventExtensions.kt +++ b/android/measure/src/main/java/sh/measure/android/storage/EventExtensions.kt @@ -70,99 +70,97 @@ internal fun Event.serializeUserDefinedAttributes(): String? { /** * Serializes the event data to a JSON string. */ -internal fun Event.serializeDataToString(): String { - return when (type) { - EventType.EXCEPTION -> { - json.encodeToString(ExceptionData.serializer(), data as ExceptionData) - } +internal fun Event.serializeDataToString(): String = when (type) { + EventType.EXCEPTION -> { + json.encodeToString(ExceptionData.serializer(), data as ExceptionData) + } - EventType.ANR -> { - json.encodeToString(ExceptionData.serializer(), data as ExceptionData) - } + EventType.ANR -> { + json.encodeToString(ExceptionData.serializer(), data as ExceptionData) + } - EventType.APP_EXIT -> { - json.encodeToString(AppExit.serializer(), data as AppExit) - } + EventType.APP_EXIT -> { + json.encodeToString(AppExit.serializer(), data as AppExit) + } - EventType.CLICK -> { - json.encodeToString(ClickData.serializer(), data as ClickData) - } + EventType.CLICK -> { + json.encodeToString(ClickData.serializer(), data as ClickData) + } - EventType.LONG_CLICK -> { - json.encodeToString(LongClickData.serializer(), data as LongClickData) - } + EventType.LONG_CLICK -> { + json.encodeToString(LongClickData.serializer(), data as LongClickData) + } - EventType.SCROLL -> { - json.encodeToString(ScrollData.serializer(), data as ScrollData) - } + EventType.SCROLL -> { + json.encodeToString(ScrollData.serializer(), data as ScrollData) + } - EventType.LIFECYCLE_ACTIVITY -> { - json.encodeToString( - ActivityLifecycleData.serializer(), - data as ActivityLifecycleData, - ) - } + EventType.LIFECYCLE_ACTIVITY -> { + json.encodeToString( + ActivityLifecycleData.serializer(), + data as ActivityLifecycleData, + ) + } - EventType.LIFECYCLE_FRAGMENT -> { - json.encodeToString( - FragmentLifecycleData.serializer(), - data as FragmentLifecycleData, - ) - } + EventType.LIFECYCLE_FRAGMENT -> { + json.encodeToString( + FragmentLifecycleData.serializer(), + data as FragmentLifecycleData, + ) + } - EventType.LIFECYCLE_APP -> { - json.encodeToString( - ApplicationLifecycleData.serializer(), - data as ApplicationLifecycleData, - ) - } + EventType.LIFECYCLE_APP -> { + json.encodeToString( + ApplicationLifecycleData.serializer(), + data as ApplicationLifecycleData, + ) + } - EventType.COLD_LAUNCH -> { - json.encodeToString(ColdLaunchData.serializer(), data as ColdLaunchData) - } + EventType.COLD_LAUNCH -> { + json.encodeToString(ColdLaunchData.serializer(), data as ColdLaunchData) + } - EventType.WARM_LAUNCH -> { - json.encodeToString(WarmLaunchData.serializer(), data as WarmLaunchData) - } + EventType.WARM_LAUNCH -> { + json.encodeToString(WarmLaunchData.serializer(), data as WarmLaunchData) + } - EventType.HOT_LAUNCH -> { - json.encodeToString(HotLaunchData.serializer(), data as HotLaunchData) - } + EventType.HOT_LAUNCH -> { + json.encodeToString(HotLaunchData.serializer(), data as HotLaunchData) + } - EventType.NETWORK_CHANGE -> { - json.encodeToString(NetworkChangeData.serializer(), data as NetworkChangeData) - } + EventType.NETWORK_CHANGE -> { + json.encodeToString(NetworkChangeData.serializer(), data as NetworkChangeData) + } - EventType.HTTP -> { - json.encodeToString(HttpData.serializer(), data as HttpData) - } + EventType.HTTP -> { + json.encodeToString(HttpData.serializer(), data as HttpData) + } - EventType.MEMORY_USAGE -> { - json.encodeToString(MemoryUsageData.serializer(), data as MemoryUsageData) - } + EventType.MEMORY_USAGE -> { + json.encodeToString(MemoryUsageData.serializer(), data as MemoryUsageData) + } - EventType.TRIM_MEMORY -> { - json.encodeToString(TrimMemoryData.serializer(), data as TrimMemoryData) - } + EventType.TRIM_MEMORY -> { + json.encodeToString(TrimMemoryData.serializer(), data as TrimMemoryData) + } - EventType.CPU_USAGE -> { - json.encodeToString(CpuUsageData.serializer(), data as CpuUsageData) - } + EventType.CPU_USAGE -> { + json.encodeToString(CpuUsageData.serializer(), data as CpuUsageData) + } - EventType.CUSTOM -> { - json.encodeToString(CustomEventData.serializer(), data as CustomEventData) - } + EventType.CUSTOM -> { + json.encodeToString(CustomEventData.serializer(), data as CustomEventData) + } - EventType.SCREEN_VIEW -> { - json.encodeToString(ScreenViewData.serializer(), data as ScreenViewData) - } + EventType.SCREEN_VIEW -> { + json.encodeToString(ScreenViewData.serializer(), data as ScreenViewData) + } - EventType.BUG_REPORT -> { - json.encodeToString(BugReportData.serializer(), data as BugReportData) - } + EventType.BUG_REPORT -> { + json.encodeToString(BugReportData.serializer(), data as BugReportData) + } - EventType.STRING -> { - json.encodeToString(String.serializer(), data as String) - } + EventType.STRING -> { + json.encodeToString(String.serializer(), data as String) } } diff --git a/android/measure/src/main/java/sh/measure/android/storage/FileStorage.kt b/android/measure/src/main/java/sh/measure/android/storage/FileStorage.kt index 8cbf38e8c..b475eccac 100644 --- a/android/measure/src/main/java/sh/measure/android/storage/FileStorage.kt +++ b/android/measure/src/main/java/sh/measure/android/storage/FileStorage.kt @@ -148,9 +148,7 @@ internal class FileStorageImpl( return null } - override fun getBugReportDir(): File { - return File("$rootDir/$MEASURE_DIR/$BUG_REPORTS_DIR") - } + override fun getBugReportDir(): File = File("$rootDir/$MEASURE_DIR/$BUG_REPORTS_DIR") override fun getAttachmentDirectory(): String { val dirPath = "$rootDir/$MEASURE_DIR" diff --git a/android/measure/src/main/java/sh/measure/android/storage/PrefsStorage.kt b/android/measure/src/main/java/sh/measure/android/storage/PrefsStorage.kt index d3d0d4d22..7cbc75bc2 100644 --- a/android/measure/src/main/java/sh/measure/android/storage/PrefsStorage.kt +++ b/android/measure/src/main/java/sh/measure/android/storage/PrefsStorage.kt @@ -17,8 +17,7 @@ internal interface PrefsStorage { fun getRecentSession(): RecentSession? } -internal class PrefsStorageImpl(private val context: Context) : - PrefsStorage { +internal class PrefsStorageImpl(private val context: Context) : PrefsStorage { private val sharedPreferenceName = "sh.measure.android" private companion object { @@ -34,17 +33,13 @@ internal class PrefsStorageImpl(private val context: Context) : context.getSharedPreferences(sharedPreferenceName, Context.MODE_PRIVATE) } - override fun getInstallationId(): String? { - return sharedPreferences.getString(Attribute.INSTALLATION_ID_KEY, null) - } + override fun getInstallationId(): String? = sharedPreferences.getString(Attribute.INSTALLATION_ID_KEY, null) override fun setInstallationId(installationId: String) { sharedPreferences.edit().putString(Attribute.INSTALLATION_ID_KEY, installationId).apply() } - override fun getUserId(): String? { - return sharedPreferences.getString(USER_ID_KEY, null) - } + override fun getUserId(): String? = sharedPreferences.getString(USER_ID_KEY, null) override fun setUserId(userId: String?) { if (userId == null) { diff --git a/android/measure/src/main/java/sh/measure/android/storage/SignalStore.kt b/android/measure/src/main/java/sh/measure/android/storage/SignalStore.kt index ee1dd80f4..802544290 100644 --- a/android/measure/src/main/java/sh/measure/android/storage/SignalStore.kt +++ b/android/measure/src/main/java/sh/measure/android/storage/SignalStore.kt @@ -294,13 +294,11 @@ internal class SignalStoreImpl( * Calculates the total size of all attachments, in bytes. */ private fun calculateAttachmentsSize(attachmentEntities: List?): Long { - fun fileSize(file: File): Long { - return try { - if (file.exists()) file.length() else 0 - } catch (e: SecurityException) { - logger.log(LogLevel.Debug, "Failed to calculate attachment size", e) - 0 - } + fun fileSize(file: File): Long = try { + if (file.exists()) file.length() else 0 + } catch (e: SecurityException) { + logger.log(LogLevel.Debug, "Failed to calculate attachment size", e) + 0 } return attachmentEntities?.sumOf { fileStorage.getFile(it.path)?.let { file -> fileSize(file) } ?: 0 diff --git a/android/measure/src/main/java/sh/measure/android/storage/SpanDataExtenstions.kt b/android/measure/src/main/java/sh/measure/android/storage/SpanDataExtenstions.kt index cc2e76e70..e3fb5bb98 100644 --- a/android/measure/src/main/java/sh/measure/android/storage/SpanDataExtenstions.kt +++ b/android/measure/src/main/java/sh/measure/android/storage/SpanDataExtenstions.kt @@ -7,34 +7,28 @@ import sh.measure.android.tracing.SpanData import sh.measure.android.utils.iso8601Timestamp import sh.measure.android.utils.toJsonElement -internal fun SpanData.toSpanEntity(): SpanEntity { - return SpanEntity( - name = name, - spanId = spanId, - startTime = startTime, - sessionId = sessionId, - duration = duration, - status = status, - parentId = parentId, - endTime = endTime, - traceId = traceId, - serializedCheckpoints = serializeCheckpoints(), - serializedAttributes = jsonSerializer.encodeToString( - JsonElement.serializer(), - attributes.toJsonElement(), - ), - serializedUserDefinedAttrs = jsonSerializer.encodeToString( - JsonElement.serializer(), - userDefinedAttrs.toJsonElement(), - ), - hasEnded = hasEnded, - ) -} +internal fun SpanData.toSpanEntity(): SpanEntity = SpanEntity( + name = name, + spanId = spanId, + startTime = startTime, + sessionId = sessionId, + duration = duration, + status = status, + parentId = parentId, + endTime = endTime, + traceId = traceId, + serializedCheckpoints = serializeCheckpoints(), + serializedAttributes = jsonSerializer.encodeToString( + JsonElement.serializer(), + attributes.toJsonElement(), + ), + serializedUserDefinedAttrs = jsonSerializer.encodeToString( + JsonElement.serializer(), + userDefinedAttrs.toJsonElement(), + ), + hasEnded = hasEnded, +) -private fun SpanData.serializeCheckpoints(): String { - return checkpoints.joinToString(",", prefix = "[", postfix = "]") { it.serialize() } -} +private fun SpanData.serializeCheckpoints(): String = checkpoints.joinToString(",", prefix = "[", postfix = "]") { it.serialize() } -private fun Checkpoint.serialize(): String { - return "{\"name\":\"${name}\",\"timestamp\":\"${timestamp.iso8601Timestamp()}\"}" -} +private fun Checkpoint.serialize(): String = "{\"name\":\"${name}\",\"timestamp\":\"${timestamp.iso8601Timestamp()}\"}" diff --git a/android/measure/src/main/java/sh/measure/android/tracing/InvalidSpan.kt b/android/measure/src/main/java/sh/measure/android/tracing/InvalidSpan.kt index bad847de1..9903619ac 100644 --- a/android/measure/src/main/java/sh/measure/android/tracing/InvalidSpan.kt +++ b/android/measure/src/main/java/sh/measure/android/tracing/InvalidSpan.kt @@ -8,63 +8,33 @@ internal class InvalidSpan : Span { override val isSampled: Boolean = false override val parentId: String? = null - override fun setStatus(status: SpanStatus): Span { - return this - } + override fun setStatus(status: SpanStatus): Span = this - override fun setParent(parentSpan: Span): Span { - return this - } + override fun setParent(parentSpan: Span): Span = this - override fun setCheckpoint(name: String): Span { - return this - } + override fun setCheckpoint(name: String): Span = this - override fun setName(name: String): Span { - return this - } + override fun setName(name: String): Span = this - override fun setAttribute(key: String, value: String): Span { - return this - } + override fun setAttribute(key: String, value: String): Span = this - override fun setAttribute(key: String, value: Long): Span { - return this - } + override fun setAttribute(key: String, value: Long): Span = this - override fun setAttribute(key: String, value: Int): Span { - return this - } + override fun setAttribute(key: String, value: Int): Span = this - override fun setAttribute(key: String, value: Double): Span { - return this - } + override fun setAttribute(key: String, value: Double): Span = this - override fun setAttribute(key: String, value: Boolean): Span { - return this - } + override fun setAttribute(key: String, value: Boolean): Span = this - override fun setAttributes(attributes: Map): Span { - return this - } + override fun setAttributes(attributes: Map): Span = this - override fun removeAttribute(key: String): Span { - return this - } + override fun removeAttribute(key: String): Span = this - override fun end(): Span { - return this - } + override fun end(): Span = this - override fun end(timestamp: Long): Span { - return this - } + override fun end(timestamp: Long): Span = this - override fun hasEnded(): Boolean { - return false - } + override fun hasEnded(): Boolean = false - override fun getDuration(): Long { - return 0 - } + override fun getDuration(): Long = 0 } diff --git a/android/measure/src/main/java/sh/measure/android/tracing/MsrSpan.kt b/android/measure/src/main/java/sh/measure/android/tracing/MsrSpan.kt index 68db8adb4..8b73c3c13 100644 --- a/android/measure/src/main/java/sh/measure/android/tracing/MsrSpan.kt +++ b/android/measure/src/main/java/sh/measure/android/tracing/MsrSpan.kt @@ -41,32 +41,30 @@ internal class MsrSpan( traceSampler: TraceSampler, parentSpan: Span?, timestamp: Long? = null, - ): Span { - return InternalTrace.trace( - { "msr-startSpan" }, - { - val startTime = timestamp ?: timeProvider.now() - val spanId: String = idProvider.spanId() - val traceId = parentSpan?.traceId ?: idProvider.traceId() - val sessionId = sessionManager.getSessionId() - val isSampled = parentSpan?.isSampled ?: traceSampler.shouldSample() - val span = MsrSpan( - logger = logger, - timeProvider = timeProvider, - spanProcessor = spanProcessor, - name = name, - spanId = spanId, - traceId = traceId, - parentId = parentSpan?.spanId, - sessionId = sessionId, - startTime = startTime, - isSampled = isSampled, - ) - spanProcessor.onStart(span) - span - }, - ) - } + ): Span = InternalTrace.trace( + { "msr-startSpan" }, + { + val startTime = timestamp ?: timeProvider.now() + val spanId: String = idProvider.spanId() + val traceId = parentSpan?.traceId ?: idProvider.traceId() + val sessionId = sessionManager.getSessionId() + val isSampled = parentSpan?.isSampled ?: traceSampler.shouldSample() + val span = MsrSpan( + logger = logger, + timeProvider = timeProvider, + spanProcessor = spanProcessor, + name = name, + spanId = spanId, + traceId = traceId, + parentId = parentSpan?.spanId, + sessionId = sessionId, + startTime = startTime, + isSampled = isSampled, + ) + spanProcessor.onStart(span) + span + }, + ) } override fun getStatus(): SpanStatus { @@ -328,9 +326,7 @@ internal class MsrSpan( } } - private fun calculateDuration(): Long { - return endTime - startTime - } + private fun calculateDuration(): Long = endTime - startTime private enum class EndState { NotEnded, diff --git a/android/measure/src/main/java/sh/measure/android/tracing/MsrSpanBuilder.kt b/android/measure/src/main/java/sh/measure/android/tracing/MsrSpanBuilder.kt index 7986dc400..5e9ac37ed 100644 --- a/android/measure/src/main/java/sh/measure/android/tracing/MsrSpanBuilder.kt +++ b/android/measure/src/main/java/sh/measure/android/tracing/MsrSpanBuilder.kt @@ -21,18 +21,16 @@ internal class MsrSpanBuilder( return this } - override fun startSpan(): Span { - return MsrSpan.startSpan( - name = name, - logger = logger, - timeProvider = timeProvider, - spanProcessor = spanProcessor, - sessionManager = sessionManager, - idProvider = idProvider, - parentSpan = parentSpan, - traceSampler = traceSampler, - ) - } + override fun startSpan(): Span = MsrSpan.startSpan( + name = name, + logger = logger, + timeProvider = timeProvider, + spanProcessor = spanProcessor, + sessionManager = sessionManager, + idProvider = idProvider, + parentSpan = parentSpan, + traceSampler = traceSampler, + ) override fun startSpan(timeMs: Long): Span { val span = MsrSpan.startSpan( diff --git a/android/measure/src/main/java/sh/measure/android/tracing/MsrTracer.kt b/android/measure/src/main/java/sh/measure/android/tracing/MsrTracer.kt index ad16e7561..94e040871 100644 --- a/android/measure/src/main/java/sh/measure/android/tracing/MsrTracer.kt +++ b/android/measure/src/main/java/sh/measure/android/tracing/MsrTracer.kt @@ -13,24 +13,20 @@ internal class MsrTracer( private val sessionManager: SessionManager, private val traceSampler: TraceSampler, ) : Tracer { - override fun spanBuilder(name: String): SpanBuilder { - return MsrSpanBuilder( - name, - idProvider, - timeProvider, - spanProcessor, - sessionManager, - traceSampler, - logger, - ) - } + override fun spanBuilder(name: String): SpanBuilder = MsrSpanBuilder( + name, + idProvider, + timeProvider, + spanProcessor, + sessionManager, + traceSampler, + logger, + ) override fun getTraceParentHeaderValue(span: Span): String { val sampledFlag = if (span.isSampled) "01" else "00" return "00-${span.traceId}-${span.spanId}-$sampledFlag" } - override fun getTraceParentHeaderKey(): String { - return "traceparent" - } + override fun getTraceParentHeaderKey(): String = "traceparent" } diff --git a/android/measure/src/main/java/sh/measure/android/tracing/Span.kt b/android/measure/src/main/java/sh/measure/android/tracing/Span.kt index 4904b0113..e3afe1806 100644 --- a/android/measure/src/main/java/sh/measure/android/tracing/Span.kt +++ b/android/measure/src/main/java/sh/measure/android/tracing/Span.kt @@ -199,8 +199,6 @@ interface Span { fun getDuration(): Long companion object { - internal fun invalid(): Span { - return InvalidSpan() - } + internal fun invalid(): Span = InvalidSpan() } } diff --git a/android/measure/src/main/java/sh/measure/android/tracing/SpanCollector.kt b/android/measure/src/main/java/sh/measure/android/tracing/SpanCollector.kt index 069f34ed8..cae2475f6 100644 --- a/android/measure/src/main/java/sh/measure/android/tracing/SpanCollector.kt +++ b/android/measure/src/main/java/sh/measure/android/tracing/SpanCollector.kt @@ -13,13 +13,9 @@ internal class SpanCollector(private val tracer: Tracer) { isEnabled.set(false) } - fun getTraceParentHeaderValue(span: Span): String { - return tracer.getTraceParentHeaderValue(span) - } + fun getTraceParentHeaderValue(span: Span): String = tracer.getTraceParentHeaderValue(span) - fun getTraceParentHeaderKey(): String { - return tracer.getTraceParentHeaderKey() - } + fun getTraceParentHeaderKey(): String = tracer.getTraceParentHeaderKey() fun createSpan(name: String): SpanBuilder? { if (!isEnabled.get()) { diff --git a/android/measure/src/main/java/sh/measure/android/tracing/SpanConstants.kt b/android/measure/src/main/java/sh/measure/android/tracing/SpanConstants.kt index d94df766f..60f39bd9f 100644 --- a/android/measure/src/main/java/sh/measure/android/tracing/SpanConstants.kt +++ b/android/measure/src/main/java/sh/measure/android/tracing/SpanConstants.kt @@ -7,13 +7,9 @@ internal object SpanName { private const val ACTIVITY_TTID_PREFIX = "Activity TTID" private const val FRAGMENT_TTID_PREFIX = "Fragment TTID" - fun activityTtidSpan(className: String, maxLength: Int): String { - return truncateClassNameIfNeeded(ACTIVITY_TTID_PREFIX, className, maxLength) - } + fun activityTtidSpan(className: String, maxLength: Int): String = truncateClassNameIfNeeded(ACTIVITY_TTID_PREFIX, className, maxLength) - fun fragmentTtidSpan(className: String, maxLength: Int): String { - return truncateClassNameIfNeeded(FRAGMENT_TTID_PREFIX, className, maxLength) - } + fun fragmentTtidSpan(className: String, maxLength: Int): String = truncateClassNameIfNeeded(FRAGMENT_TTID_PREFIX, className, maxLength) /** * Truncates the class name to fit within the specified maximum length, including the prefix. diff --git a/android/measure/src/main/java/sh/measure/android/tracing/SpanStatus.kt b/android/measure/src/main/java/sh/measure/android/tracing/SpanStatus.kt index d6f9c40d5..36cdd92c4 100644 --- a/android/measure/src/main/java/sh/measure/android/tracing/SpanStatus.kt +++ b/android/measure/src/main/java/sh/measure/android/tracing/SpanStatus.kt @@ -23,12 +23,10 @@ enum class SpanStatus(val value: Int) { ; internal companion object { - fun fromValue(value: Int): SpanStatus { - return when (value) { - 1 -> Ok - 2 -> Error - else -> Unset - } + fun fromValue(value: Int): SpanStatus = when (value) { + 1 -> Ok + 2 -> Error + else -> Unset } } } diff --git a/android/measure/src/main/java/sh/measure/android/utils/AndroidSystemClock.kt b/android/measure/src/main/java/sh/measure/android/utils/AndroidSystemClock.kt index 7c412cebd..bc7818561 100644 --- a/android/measure/src/main/java/sh/measure/android/utils/AndroidSystemClock.kt +++ b/android/measure/src/main/java/sh/measure/android/utils/AndroidSystemClock.kt @@ -6,11 +6,7 @@ import android.os.SystemClock * Provides time from an Android device. */ internal class AndroidSystemClock : sh.measure.android.utils.SystemClock { - override fun epochTime(): Long { - return System.currentTimeMillis() - } + override fun epochTime(): Long = System.currentTimeMillis() - override fun monotonicTimeSinceBoot(): Long { - return SystemClock.elapsedRealtime() - } + override fun monotonicTimeSinceBoot(): Long = SystemClock.elapsedRealtime() } diff --git a/android/measure/src/main/java/sh/measure/android/utils/BitmapHelper.kt b/android/measure/src/main/java/sh/measure/android/utils/BitmapHelper.kt index db18e1814..5d3c01db6 100644 --- a/android/measure/src/main/java/sh/measure/android/utils/BitmapHelper.kt +++ b/android/measure/src/main/java/sh/measure/android/utils/BitmapHelper.kt @@ -206,7 +206,5 @@ internal object BitmapHelper { } } - private fun isMainThread(): Boolean { - return Thread.currentThread() == Looper.getMainLooper().thread - } + private fun isMainThread(): Boolean = Thread.currentThread() == Looper.getMainLooper().thread } diff --git a/android/measure/src/main/java/sh/measure/android/utils/ClassUtil.kt b/android/measure/src/main/java/sh/measure/android/utils/ClassUtil.kt index 25117bbee..9d4243c5b 100644 --- a/android/measure/src/main/java/sh/measure/android/utils/ClassUtil.kt +++ b/android/measure/src/main/java/sh/measure/android/utils/ClassUtil.kt @@ -1,17 +1,13 @@ package sh.measure.android.utils -internal fun isClassAvailable(clazz: String): Boolean { - return loadClass(clazz) != null -} +internal fun isClassAvailable(clazz: String): Boolean = loadClass(clazz) != null -private fun loadClass(clazz: String): Class<*>? { - return try { - Class.forName(clazz) - } catch (e: ClassNotFoundException) { - null - } catch (e: UnsatisfiedLinkError) { - null - } catch (e: Throwable) { - null - } +private fun loadClass(clazz: String): Class<*>? = try { + Class.forName(clazz) +} catch (e: ClassNotFoundException) { + null +} catch (e: UnsatisfiedLinkError) { + null +} catch (e: Throwable) { + null } diff --git a/android/measure/src/main/java/sh/measure/android/utils/CollectionUtils.kt b/android/measure/src/main/java/sh/measure/android/utils/CollectionUtils.kt index d64af032d..7f57719aa 100644 --- a/android/measure/src/main/java/sh/measure/android/utils/CollectionUtils.kt +++ b/android/measure/src/main/java/sh/measure/android/utils/CollectionUtils.kt @@ -1,9 +1,5 @@ package sh.measure.android.utils -internal fun Collection.containsIgnoreCase(value: String): Boolean { - return this.any { it.equals(value, ignoreCase = true) } -} +internal fun Collection.containsIgnoreCase(value: String): Boolean = this.any { it.equals(value, ignoreCase = true) } -internal fun Map.containsIgnoreCase(key: String): Boolean { - return this.keys.any { it.equals(key, ignoreCase = true) } -} +internal fun Map.containsIgnoreCase(key: String): Boolean = this.keys.any { it.equals(key, ignoreCase = true) } diff --git a/android/measure/src/main/java/sh/measure/android/utils/ComposeHelper.kt b/android/measure/src/main/java/sh/measure/android/utils/ComposeHelper.kt index ae45c3926..112146627 100644 --- a/android/measure/src/main/java/sh/measure/android/utils/ComposeHelper.kt +++ b/android/measure/src/main/java/sh/measure/android/utils/ComposeHelper.kt @@ -6,9 +6,7 @@ internal object ComposeHelper { private const val ANDROID_COMPOSE_VIEW_CLASS_NAME = "androidx.compose.ui.platform.AndroidComposeView" - internal fun isComposeView(view: View): Boolean { - return isComposeAvailable && view.javaClass.name.contains("AndroidComposeView") - } + internal fun isComposeView(view: View): Boolean = isComposeAvailable && view.javaClass.name.contains("AndroidComposeView") private val isComposeAvailable by lazy(LazyThreadSafetyMode.PUBLICATION) { try { diff --git a/android/measure/src/main/java/sh/measure/android/utils/DebugProvider.kt b/android/measure/src/main/java/sh/measure/android/utils/DebugProvider.kt index 29b95c191..07db3e2c3 100644 --- a/android/measure/src/main/java/sh/measure/android/utils/DebugProvider.kt +++ b/android/measure/src/main/java/sh/measure/android/utils/DebugProvider.kt @@ -9,13 +9,9 @@ internal interface DebugProvider { } internal class DefaultDebugProvider : DebugProvider { - override fun getNativeHeapSize(): Long { - return Debug.getNativeHeapSize() - } + override fun getNativeHeapSize(): Long = Debug.getNativeHeapSize() - override fun getNativeHeapFreeSize(): Long { - return Debug.getNativeHeapFreeSize() - } + override fun getNativeHeapFreeSize(): Long = Debug.getNativeHeapFreeSize() override fun populateMemoryInfo(memoryInfo: Debug.MemoryInfo) { Debug.getMemoryInfo(memoryInfo) diff --git a/android/measure/src/main/java/sh/measure/android/utils/IdProvider.kt b/android/measure/src/main/java/sh/measure/android/utils/IdProvider.kt index dd4c56d64..a39794452 100644 --- a/android/measure/src/main/java/sh/measure/android/utils/IdProvider.kt +++ b/android/measure/src/main/java/sh/measure/android/utils/IdProvider.kt @@ -26,9 +26,7 @@ internal interface IdProvider { } internal class IdProviderImpl(private val randomizer: Randomizer) : IdProvider { - override fun uuid(): String { - return UUID.randomUUID().toString() - } + override fun uuid(): String = UUID.randomUUID().toString() override fun spanId(): String { val result = CharArray(16) diff --git a/android/measure/src/main/java/sh/measure/android/utils/JsonElementExtensions.kt b/android/measure/src/main/java/sh/measure/android/utils/JsonElementExtensions.kt index 6e355702e..e813a1f1d 100644 --- a/android/measure/src/main/java/sh/measure/android/utils/JsonElementExtensions.kt +++ b/android/measure/src/main/java/sh/measure/android/utils/JsonElementExtensions.kt @@ -27,9 +27,7 @@ private fun Any?.toJsonElement(): JsonElement = when (this) { else -> error("Can't serialize unknown type: $this") } -internal fun JsonObject.toNativeObject(): Map { - return this.map { (key, value) -> key to value.toNativeObject() }.toMap() -} +internal fun JsonObject.toNativeObject(): Map = this.map { (key, value) -> key to value.toNativeObject() }.toMap() internal fun Map<*, *>.toJsonElement(): JsonObject { val map = this.map { (key, value) -> @@ -39,13 +37,9 @@ internal fun Map<*, *>.toJsonElement(): JsonObject { return JsonObject(map.toMap()) } -private fun Iterable<*>.toJsonElement(): JsonArray { - return JsonArray(this.map { it.toJsonElement() }) -} +private fun Iterable<*>.toJsonElement(): JsonArray = JsonArray(this.map { it.toJsonElement() }) -private fun Array<*>.toJsonElement(): JsonArray { - return JsonArray(this.map { it.toJsonElement() }) -} +private fun Array<*>.toJsonElement(): JsonArray = JsonArray(this.map { it.toJsonElement() }) private fun JsonElement.toNativeObject(): Any? = when (this) { JsonNull -> null diff --git a/android/measure/src/main/java/sh/measure/android/utils/LocaleProvider.kt b/android/measure/src/main/java/sh/measure/android/utils/LocaleProvider.kt index e69bcf9b0..d221edaed 100644 --- a/android/measure/src/main/java/sh/measure/android/utils/LocaleProvider.kt +++ b/android/measure/src/main/java/sh/measure/android/utils/LocaleProvider.kt @@ -7,7 +7,5 @@ internal interface LocaleProvider { } internal class LocaleProviderImpl : LocaleProvider { - override fun getLocale(): String { - return Locale.getDefault().toLanguageTag() - } + override fun getLocale(): String = Locale.getDefault().toLanguageTag() } diff --git a/android/measure/src/main/java/sh/measure/android/utils/ManifestReaderImpl.kt b/android/measure/src/main/java/sh/measure/android/utils/ManifestReaderImpl.kt index 632e55748..330ca3a24 100644 --- a/android/measure/src/main/java/sh/measure/android/utils/ManifestReaderImpl.kt +++ b/android/measure/src/main/java/sh/measure/android/utils/ManifestReaderImpl.kt @@ -12,8 +12,7 @@ internal interface ManifestReader { fun load(): ManifestMetadata? } -internal class ManifestReaderImpl(private val context: Context, private val logger: Logger) : - ManifestReader { +internal class ManifestReaderImpl(private val context: Context, private val logger: Logger) : ManifestReader { private val measureUrlKey = "sh.measure.android.API_URL" private val measureApiKey = "sh.measure.android.API_KEY" @@ -34,18 +33,16 @@ internal class ManifestReaderImpl(private val context: Context, private val logg ) } - private fun getMetadataBundle(): Bundle? { - return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - context.packageManager.getApplicationInfo( - context.packageName, - PackageManager.ApplicationInfoFlags.of(PackageManager.GET_META_DATA.toLong()), - ).metaData - } else { - context.packageManager.getApplicationInfo( - context.packageName, - PackageManager.GET_META_DATA, - ).metaData - } + private fun getMetadataBundle(): Bundle? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + context.packageManager.getApplicationInfo( + context.packageName, + PackageManager.ApplicationInfoFlags.of(PackageManager.GET_META_DATA.toLong()), + ).metaData + } else { + context.packageManager.getApplicationInfo( + context.packageName, + PackageManager.GET_META_DATA, + ).metaData } } diff --git a/android/measure/src/main/java/sh/measure/android/utils/OsSysConfProvider.kt b/android/measure/src/main/java/sh/measure/android/utils/OsSysConfProvider.kt index 2ac252a40..8f11613cc 100644 --- a/android/measure/src/main/java/sh/measure/android/utils/OsSysConfProvider.kt +++ b/android/measure/src/main/java/sh/measure/android/utils/OsSysConfProvider.kt @@ -7,7 +7,5 @@ internal interface OsSysConfProvider { } internal class OsSysConfProviderImpl : OsSysConfProvider { - override fun get(name: Int): Long { - return Os.sysconf(name) - } + override fun get(name: Int): Long = Os.sysconf(name) } diff --git a/android/measure/src/main/java/sh/measure/android/utils/Permissions.kt b/android/measure/src/main/java/sh/measure/android/utils/Permissions.kt index c43d20376..e5be5dcf8 100644 --- a/android/measure/src/main/java/sh/measure/android/utils/Permissions.kt +++ b/android/measure/src/main/java/sh/measure/android/utils/Permissions.kt @@ -4,24 +4,20 @@ import android.content.Context import android.content.pm.PackageManager import androidx.core.content.PermissionChecker -internal fun hasPermission(context: Context, permission: String): Boolean { - return PermissionChecker.checkSelfPermission( - context, - permission, - ) == PermissionChecker.PERMISSION_GRANTED -} +internal fun hasPermission(context: Context, permission: String): Boolean = PermissionChecker.checkSelfPermission( + context, + permission, +) == PermissionChecker.PERMISSION_GRANTED /** * Checks if the [permission] is declared in the manifest. */ -internal fun isPermissionDeclared(context: Context, permission: String): Boolean { - return try { - val packageInfo = context.packageManager.getPackageInfo( - context.packageName, - PackageManager.GET_PERMISSIONS, - ) - packageInfo.requestedPermissions?.contains(permission) ?: false - } catch (e: PackageManager.NameNotFoundException) { - false - } +internal fun isPermissionDeclared(context: Context, permission: String): Boolean = try { + val packageInfo = context.packageManager.getPackageInfo( + context.packageName, + PackageManager.GET_PERMISSIONS, + ) + packageInfo.requestedPermissions?.contains(permission) ?: false +} catch (e: PackageManager.NameNotFoundException) { + false } diff --git a/android/measure/src/main/java/sh/measure/android/utils/PidProvider.kt b/android/measure/src/main/java/sh/measure/android/utils/PidProvider.kt index 05421328b..993c0dbec 100644 --- a/android/measure/src/main/java/sh/measure/android/utils/PidProvider.kt +++ b/android/measure/src/main/java/sh/measure/android/utils/PidProvider.kt @@ -7,7 +7,5 @@ internal interface PidProvider { } internal class PidProviderImpl : PidProvider { - override fun getPid(): Int { - return Process.myPid() - } + override fun getPid(): Int = Process.myPid() } diff --git a/android/measure/src/main/java/sh/measure/android/utils/ProcProvider.kt b/android/measure/src/main/java/sh/measure/android/utils/ProcProvider.kt index c3044c3b0..6abb62c4a 100644 --- a/android/measure/src/main/java/sh/measure/android/utils/ProcProvider.kt +++ b/android/measure/src/main/java/sh/measure/android/utils/ProcProvider.kt @@ -8,11 +8,7 @@ internal interface ProcProvider { } internal class ProcProviderImpl : ProcProvider { - override fun getStatFile(pid: Int): File { - return File("/proc/$pid/stat") - } + override fun getStatFile(pid: Int): File = File("/proc/$pid/stat") - override fun getStatmFile(pid: Int): File { - return File("/proc/$pid/statm") - } + override fun getStatmFile(pid: Int): File = File("/proc/$pid/statm") } diff --git a/android/measure/src/main/java/sh/measure/android/utils/ProcessInfoProvider.kt b/android/measure/src/main/java/sh/measure/android/utils/ProcessInfoProvider.kt index 61c6de77e..2e84cd9c6 100644 --- a/android/measure/src/main/java/sh/measure/android/utils/ProcessInfoProvider.kt +++ b/android/measure/src/main/java/sh/measure/android/utils/ProcessInfoProvider.kt @@ -27,9 +27,7 @@ internal class ProcessInfoProviderImpl : ProcessInfoProvider { return processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND } - override fun getPid(): Int { - return Process.myPid() - } + override fun getPid(): Int = Process.myPid() override fun getProcessImportance(): Int { val processInfo = ActivityManager.RunningAppProcessInfo() diff --git a/android/measure/src/main/java/sh/measure/android/utils/Randomizer.kt b/android/measure/src/main/java/sh/measure/android/utils/Randomizer.kt index 269da4e77..c4c68b14f 100644 --- a/android/measure/src/main/java/sh/measure/android/utils/Randomizer.kt +++ b/android/measure/src/main/java/sh/measure/android/utils/Randomizer.kt @@ -17,11 +17,7 @@ internal interface Randomizer { internal class RandomizerImpl : Randomizer { private val random: Random by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { Random() } - override fun random(): Double { - return Math.random() - } + override fun random(): Double = Math.random() - override fun nextLong(): Long { - return random.nextLong() - } + override fun nextLong(): Long = random.nextLong() } diff --git a/android/measure/src/main/java/sh/measure/android/utils/ResumedActivityProvider.kt b/android/measure/src/main/java/sh/measure/android/utils/ResumedActivityProvider.kt index e8955a6ad..39e607dfb 100644 --- a/android/measure/src/main/java/sh/measure/android/utils/ResumedActivityProvider.kt +++ b/android/measure/src/main/java/sh/measure/android/utils/ResumedActivityProvider.kt @@ -18,16 +18,15 @@ internal interface ResumedActivityProvider { * Implementation of [ResumedActivityProvider] that keeps a WeakReference to the resumed activity. */ internal class ResumedActivityProviderImpl(private val application: Application) : - ResumedActivityProvider, ActivityLifecycleAdapter { + ResumedActivityProvider, + ActivityLifecycleAdapter { private var resumedActivity: WeakReference? = null override fun register() { application.registerActivityLifecycleCallbacks(this) } - override fun getResumedActivity(): Activity? { - return resumedActivity?.get() - } + override fun getResumedActivity(): Activity? = resumedActivity?.get() override fun unregister() { resumedActivity?.clear() diff --git a/android/measure/src/main/java/sh/measure/android/utils/RuntimeProvider.kt b/android/measure/src/main/java/sh/measure/android/utils/RuntimeProvider.kt index 0ac71fee8..ec42da0a6 100644 --- a/android/measure/src/main/java/sh/measure/android/utils/RuntimeProvider.kt +++ b/android/measure/src/main/java/sh/measure/android/utils/RuntimeProvider.kt @@ -7,15 +7,9 @@ internal interface RuntimeProvider { } internal class DefaultRuntimeProvider : RuntimeProvider { - override fun maxMemory(): Long { - return Runtime.getRuntime().maxMemory() - } + override fun maxMemory(): Long = Runtime.getRuntime().maxMemory() - override fun totalMemory(): Long { - return Runtime.getRuntime().totalMemory() - } + override fun totalMemory(): Long = Runtime.getRuntime().totalMemory() - override fun freeMemory(): Long { - return Runtime.getRuntime().freeMemory() - } + override fun freeMemory(): Long = Runtime.getRuntime().freeMemory() } diff --git a/android/measure/src/main/java/sh/measure/android/utils/StringUtils.kt b/android/measure/src/main/java/sh/measure/android/utils/StringUtils.kt index bf00e9e73..bff7951d6 100644 --- a/android/measure/src/main/java/sh/measure/android/utils/StringUtils.kt +++ b/android/measure/src/main/java/sh/measure/android/utils/StringUtils.kt @@ -6,6 +6,4 @@ package sh.measure.android.utils * * @return `true` if the string is in lowercase, `false` otherwise. */ -internal fun String.isLowerCase(): Boolean { - return this.all { it.isDigit() || it.isLowerCase() } -} +internal fun String.isLowerCase(): Boolean = this.all { it.isDigit() || it.isLowerCase() } diff --git a/android/measure/src/main/java/sh/measure/android/utils/Telephony.kt b/android/measure/src/main/java/sh/measure/android/utils/Telephony.kt index d3b0b77f1..548f2e960 100644 --- a/android/measure/src/main/java/sh/measure/android/utils/Telephony.kt +++ b/android/measure/src/main/java/sh/measure/android/utils/Telephony.kt @@ -9,32 +9,28 @@ import android.telephony.TelephonyManager import androidx.annotation.RequiresPermission import sh.measure.android.networkchange.NetworkGeneration -internal fun hasPhoneStatePermission(context: Context): Boolean { - return when { - hasPermission(context, READ_PHONE_STATE) -> { - true - } +internal fun hasPhoneStatePermission(context: Context): Boolean = when { + hasPermission(context, READ_PHONE_STATE) -> { + true + } - Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU -> { - hasPermission(context, READ_BASIC_PHONE_STATE) - } + Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU -> { + hasPermission(context, READ_BASIC_PHONE_STATE) + } - else -> { - false - } + else -> { + false } } @Suppress("DEPRECATION") @SuppressLint("InlinedApi") @RequiresPermission(anyOf = [READ_PHONE_STATE, READ_BASIC_PHONE_STATE]) -internal fun TelephonyManager.getNetworkGeneration(): String? { - return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { - internalNetworkGeneration(this.networkType) - } else { - val networkType = this.dataNetworkType - internalNetworkGeneration(networkType) - } +internal fun TelephonyManager.getNetworkGeneration(): String? = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { + internalNetworkGeneration(this.networkType) +} else { + val networkType = this.dataNetworkType + internalNetworkGeneration(networkType) } private fun internalNetworkGeneration(networkType: Int): String? { diff --git a/android/measure/src/main/java/sh/measure/android/utils/TextViewUtils.kt b/android/measure/src/main/java/sh/measure/android/utils/TextViewUtils.kt index 345dad36e..77585dc47 100644 --- a/android/measure/src/main/java/sh/measure/android/utils/TextViewUtils.kt +++ b/android/measure/src/main/java/sh/measure/android/utils/TextViewUtils.kt @@ -10,17 +10,11 @@ import android.widget.TextView * * @return true if the input type of this [TextView] is sensitive. */ -internal fun TextView.isSensitiveInputType(): Boolean { - return isPasswordInputType() || isVisiblePasswordInputType() || isEmailInputType() || isPhoneInputType() -} +internal fun TextView.isSensitiveInputType(): Boolean = isPasswordInputType() || isVisiblePasswordInputType() || isEmailInputType() || isPhoneInputType() -private fun TextView.isEmailInputType(): Boolean { - return inputType == InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS -} +private fun TextView.isEmailInputType(): Boolean = inputType == InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS -private fun TextView.isPhoneInputType(): Boolean { - return inputType == InputType.TYPE_CLASS_TEXT or InputType.TYPE_CLASS_PHONE -} +private fun TextView.isPhoneInputType(): Boolean = inputType == InputType.TYPE_CLASS_TEXT or InputType.TYPE_CLASS_PHONE // Copied from [TextView.isPasswordInputType] as it is hidden from public API. private fun TextView.isPasswordInputType(): Boolean { diff --git a/android/measure/src/main/java/sh/measure/android/utils/TimeProvider.kt b/android/measure/src/main/java/sh/measure/android/utils/TimeProvider.kt index 0a0d9b428..f21d90e3b 100644 --- a/android/measure/src/main/java/sh/measure/android/utils/TimeProvider.kt +++ b/android/measure/src/main/java/sh/measure/android/utils/TimeProvider.kt @@ -37,9 +37,7 @@ internal class AndroidTimeProvider(private val systemClock: SystemClock) : TimeP override val elapsedRealtime get() = systemClock.monotonicTimeSinceBoot() - override fun now(): Long { - return anchoredEpochTime + (systemClock.monotonicTimeSinceBoot() - anchoredElapsedRealtime) - } + override fun now(): Long = anchoredEpochTime + (systemClock.monotonicTimeSinceBoot() - anchoredElapsedRealtime) } private val simpleDateFormat by lazy(LazyThreadSafetyMode.NONE) { @@ -57,16 +55,14 @@ private val dateTimeFormatter by lazy(LazyThreadSafetyMode.NONE) { } } -internal fun Long.iso8601Timestamp(): String { - return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - val formatter = dateTimeFormatter - val instant = Instant.ofEpochMilli(this) - formatter.format(instant) - } else { - val calendar: Calendar = - Calendar.getInstance(TimeZone.getTimeZone(TimeZone.getDefault().id)) - calendar.timeInMillis = this - simpleDateFormat.timeZone = TimeZone.getTimeZone("UTC") - simpleDateFormat.format(calendar.time) - } +internal fun Long.iso8601Timestamp(): String = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val formatter = dateTimeFormatter + val instant = Instant.ofEpochMilli(this) + formatter.format(instant) +} else { + val calendar: Calendar = + Calendar.getInstance(TimeZone.getTimeZone(TimeZone.getDefault().id)) + calendar.timeInMillis = this + simpleDateFormat.timeZone = TimeZone.getTimeZone("UTC") + simpleDateFormat.format(calendar.time) } diff --git a/android/measure/src/test/java/sh/measure/android/appexit/AppExitCollectorTest.kt b/android/measure/src/test/java/sh/measure/android/appexit/AppExitCollectorTest.kt index 7909f0efe..ca8547c13 100644 --- a/android/measure/src/test/java/sh/measure/android/appexit/AppExitCollectorTest.kt +++ b/android/measure/src/test/java/sh/measure/android/appexit/AppExitCollectorTest.kt @@ -216,12 +216,11 @@ class AppExitCollectorTest { createdAt: Long = 98765, appVersion: String = "1.0.0", appBuild: String = "1000", - ) = - AppExitCollector.Session( - id = sessionId, - pid = pid, - createdAt = createdAt, - appVersion = appVersion, - appBuild = appBuild, - ) + ) = AppExitCollector.Session( + id = sessionId, + pid = pid, + createdAt = createdAt, + appVersion = appVersion, + appBuild = appBuild, + ) } diff --git a/android/measure/src/test/java/sh/measure/android/appexit/AppExitProviderImplTest.kt b/android/measure/src/test/java/sh/measure/android/appexit/AppExitProviderImplTest.kt index d9405bd28..c40a234d1 100644 --- a/android/measure/src/test/java/sh/measure/android/appexit/AppExitProviderImplTest.kt +++ b/android/measure/src/test/java/sh/measure/android/appexit/AppExitProviderImplTest.kt @@ -109,13 +109,11 @@ class AppExitProviderImplTest { pid: Int, reason: Int, importance: Int, - ): ApplicationExitInfo { - return mock(ApplicationExitInfo::class.java).apply { - `when`(this.pid).thenReturn(pid) - `when`(this.reason).thenReturn(reason) - `when`(this.importance).thenReturn(importance) - `when`(this.processName).thenReturn("com.example.app") - `when`(this.timestamp).thenReturn(1234567890L) - } + ): ApplicationExitInfo = mock(ApplicationExitInfo::class.java).apply { + `when`(this.pid).thenReturn(pid) + `when`(this.reason).thenReturn(reason) + `when`(this.importance).thenReturn(importance) + `when`(this.processName).thenReturn("com.example.app") + `when`(this.timestamp).thenReturn(1234567890L) } } diff --git a/android/measure/src/test/java/sh/measure/android/bugreport/BugReportCollectorImplTest.kt b/android/measure/src/test/java/sh/measure/android/bugreport/BugReportCollectorImplTest.kt index 83a401126..2f57d7e03 100644 --- a/android/measure/src/test/java/sh/measure/android/bugreport/BugReportCollectorImplTest.kt +++ b/android/measure/src/test/java/sh/measure/android/bugreport/BugReportCollectorImplTest.kt @@ -186,11 +186,9 @@ class BugReportCollectorImplTest { } } - private fun createTestIntent(clipData: ClipData? = null, singleUri: Uri? = null): Intent { - return Intent().apply { - this.clipData = clipData - this.data = singleUri - } + private fun createTestIntent(clipData: ClipData? = null, singleUri: Uri? = null): Intent = Intent().apply { + this.clipData = clipData + this.data = singleUri } private fun createTestFiles(count: Int = 2): List { diff --git a/android/measure/src/test/java/sh/measure/android/events/InternalSignalCollectorTest.kt b/android/measure/src/test/java/sh/measure/android/events/InternalSignalCollectorTest.kt index 8f050aaa5..29deb8890 100644 --- a/android/measure/src/test/java/sh/measure/android/events/InternalSignalCollectorTest.kt +++ b/android/measure/src/test/java/sh/measure/android/events/InternalSignalCollectorTest.kt @@ -568,20 +568,18 @@ class InternalSignalCollectorTest { return destination } - private fun parseJsonElement(element: JsonElement): Any? { - return when (element) { - is JsonObject -> jsonToMap(element) - is JsonArray -> element.map { parseJsonElement(it) } - is JsonPrimitive -> when { - element.isString -> element.content - element.booleanOrNull != null -> element.boolean - element.intOrNull != null -> element.int - element.longOrNull != null -> element.long - element.doubleOrNull != null -> element.double - else -> null - } - - JsonNull -> null + private fun parseJsonElement(element: JsonElement): Any? = when (element) { + is JsonObject -> jsonToMap(element) + is JsonArray -> element.map { parseJsonElement(it) } + is JsonPrimitive -> when { + element.isString -> element.content + element.booleanOrNull != null -> element.boolean + element.intOrNull != null -> element.int + element.longOrNull != null -> element.long + element.doubleOrNull != null -> element.double + else -> null } + + JsonNull -> null } } diff --git a/android/measure/src/test/java/sh/measure/android/exporter/ExporterTest.kt b/android/measure/src/test/java/sh/measure/android/exporter/ExporterTest.kt index 4648a4598..80ce1e378 100644 --- a/android/measure/src/test/java/sh/measure/android/exporter/ExporterTest.kt +++ b/android/measure/src/test/java/sh/measure/android/exporter/ExporterTest.kt @@ -297,20 +297,17 @@ internal class ExporterTest { } } - private fun queryAllSpans(): Cursor { - return database.writableDatabase.query( - SpansTable.TABLE_NAME, - null, - null, - null, - null, - null, - null, - ) - } + private fun queryAllSpans(): Cursor = database.writableDatabase.query( + SpansTable.TABLE_NAME, + null, + null, + null, + null, + null, + null, + ) - private fun getPathForAttachment(attachment1: AttachmentEntity) = - "$rootDir/measure/${attachment1.id}" + private fun getPathForAttachment(attachment1: AttachmentEntity) = "$rootDir/measure/${attachment1.id}" private fun insertAttachmentToStorage(attachment1: AttachmentEntity) { fileStorage.writeAttachment(attachment1.id, "content".toByteArray()) diff --git a/android/measure/src/test/java/sh/measure/android/exporter/MultipartDataFactoryTest.kt b/android/measure/src/test/java/sh/measure/android/exporter/MultipartDataFactoryTest.kt index b55e6cccf..a29bf31b9 100644 --- a/android/measure/src/test/java/sh/measure/android/exporter/MultipartDataFactoryTest.kt +++ b/android/measure/src/test/java/sh/measure/android/exporter/MultipartDataFactoryTest.kt @@ -26,9 +26,7 @@ class MultipartDataFactoryTest { @Test fun `createFromEventPacket with serializedData returns FormField`() { - fun EventPacket.expectedSerializedValue(): String { - return "{\"id\":\"$eventId\",\"session_id\":\"$sessionId\",\"user_triggered\":$userTriggered,\"timestamp\":\"$timestamp\",\"type\":\"${type.value}\",\"${type.value}\":$serializedData,\"attachments\":$serializedAttachments,\"attribute\":$serializedAttributes,\"user_defined_attribute\":$serializedUserDefinedAttributes}" - } + fun EventPacket.expectedSerializedValue(): String = "{\"id\":\"$eventId\",\"session_id\":\"$sessionId\",\"user_triggered\":$userTriggered,\"timestamp\":\"$timestamp\",\"type\":\"${type.value}\",\"${type.value}\":$serializedData,\"attachments\":$serializedAttachments,\"attribute\":$serializedAttributes,\"user_defined_attribute\":$serializedUserDefinedAttributes}" // Given val eventEntity = @@ -47,9 +45,7 @@ class MultipartDataFactoryTest { @Test fun `createFromEventPacket with filePath returns FormField`() { - fun EventPacket.expectedSerializedValue(): String { - return "{\"id\":\"$eventId\",\"session_id\":\"$sessionId\",\"user_triggered\":$userTriggered,\"timestamp\":\"$timestamp\",\"type\":\"${type.value}\",\"${type.value}\":${getFakeFileContent()},\"attachments\":$serializedAttachments,\"attribute\":$serializedAttributes,\"user_defined_attribute\":$serializedUserDefinedAttributes}" - } + fun EventPacket.expectedSerializedValue(): String = "{\"id\":\"$eventId\",\"session_id\":\"$sessionId\",\"user_triggered\":$userTriggered,\"timestamp\":\"$timestamp\",\"type\":\"${type.value}\",\"${type.value}\":${getFakeFileContent()},\"attachments\":$serializedAttachments,\"attribute\":$serializedAttributes,\"user_defined_attribute\":$serializedUserDefinedAttributes}" val eventEntity = TestData.getEventEntity( eventId = "event-id", @@ -121,9 +117,7 @@ class MultipartDataFactoryTest { val startTime: Long = 1000 val endTime: Long = 5000 val checkpoint = TestData.getCheckpoint() - fun expectedSerializedValue(): String { - return "{\"name\":\"span-name\",\"trace_id\":\"trace-id\",\"span_id\":\"span-id\",\"parent_id\":\"parent-id\",\"session_id\":\"session-id\",\"start_time\":\"${startTime.iso8601Timestamp()}\",\"end_time\":\"${endTime.iso8601Timestamp()}\",\"duration\":4000,\"status\":1,\"attributes\":{\"key\":\"value\"},\"user_defined_attribute\":{\"user_key\":\"user_value\"},\"checkpoints\":[{\"name\":\"${checkpoint.name}\",\"timestamp\":\"${checkpoint.timestamp.iso8601Timestamp()}\"}]}" - } + fun expectedSerializedValue(): String = "{\"name\":\"span-name\",\"trace_id\":\"trace-id\",\"span_id\":\"span-id\",\"parent_id\":\"parent-id\",\"session_id\":\"session-id\",\"start_time\":\"${startTime.iso8601Timestamp()}\",\"end_time\":\"${endTime.iso8601Timestamp()}\",\"duration\":4000,\"status\":1,\"attributes\":{\"key\":\"value\"},\"user_defined_attribute\":{\"user_key\":\"user_value\"},\"checkpoints\":[{\"name\":\"${checkpoint.name}\",\"timestamp\":\"${checkpoint.timestamp.iso8601Timestamp()}\"}]}" // Given val attributes = mapOf("key" to "value") @@ -154,9 +148,7 @@ class MultipartDataFactoryTest { val startTime: Long = 1000 val endTime: Long = 5000 val checkpoint = TestData.getCheckpoint() - fun expectedSerializedValue(): String { - return "{\"name\":\"span-name\",\"trace_id\":\"trace-id\",\"span_id\":\"span-id\",\"parent_id\":null,\"session_id\":\"session-id\",\"start_time\":\"${startTime.iso8601Timestamp()}\",\"end_time\":\"${endTime.iso8601Timestamp()}\",\"duration\":4000,\"status\":1,\"attributes\":{\"key\":\"value\"},\"user_defined_attribute\":{\"user_key\":\"user_value\"},\"checkpoints\":[{\"name\":\"${checkpoint.name}\",\"timestamp\":\"${checkpoint.timestamp.iso8601Timestamp()}\"}]}" - } + fun expectedSerializedValue(): String = "{\"name\":\"span-name\",\"trace_id\":\"trace-id\",\"span_id\":\"span-id\",\"parent_id\":null,\"session_id\":\"session-id\",\"start_time\":\"${startTime.iso8601Timestamp()}\",\"end_time\":\"${endTime.iso8601Timestamp()}\",\"duration\":4000,\"status\":1,\"attributes\":{\"key\":\"value\"},\"user_defined_attribute\":{\"user_key\":\"user_value\"},\"checkpoints\":[{\"name\":\"${checkpoint.name}\",\"timestamp\":\"${checkpoint.timestamp.iso8601Timestamp()}\"}]}" // Given val attributes = mapOf("key" to "value") @@ -183,11 +175,7 @@ class MultipartDataFactoryTest { assertEquals(expectedSerializedValue(), formField.value) } - private fun getFakeFileContent(): String { - return "lorem ipsum dolor sit amet" - } + private fun getFakeFileContent(): String = "lorem ipsum dolor sit amet" - private fun InputStream.readAsString(): String { - return bufferedReader().use { it.readText() } - } + private fun InputStream.readAsString(): String = bufferedReader().use { it.readText() } } diff --git a/android/measure/src/test/java/sh/measure/android/fakes/FakeAppExitProvider.kt b/android/measure/src/test/java/sh/measure/android/fakes/FakeAppExitProvider.kt index a1b0408a7..90443fc2a 100644 --- a/android/measure/src/test/java/sh/measure/android/fakes/FakeAppExitProvider.kt +++ b/android/measure/src/test/java/sh/measure/android/fakes/FakeAppExitProvider.kt @@ -14,7 +14,5 @@ internal class FakeAppExitProvider : AppExitProvider { ), ) - override fun get(): Map { - return appExits - } + override fun get(): Map = appExits } diff --git a/android/measure/src/test/java/sh/measure/android/fakes/FakeConfigProvider.kt b/android/measure/src/test/java/sh/measure/android/fakes/FakeConfigProvider.kt index f78aa1e70..0dbd2b085 100644 --- a/android/measure/src/test/java/sh/measure/android/fakes/FakeConfigProvider.kt +++ b/android/measure/src/test/java/sh/measure/android/fakes/FakeConfigProvider.kt @@ -55,19 +55,13 @@ internal class FakeConfigProvider : ConfigProvider { var shouldTrackHttpBody = true - override fun shouldTrackHttpBody(url: String, contentType: String?): Boolean { - return shouldTrackHttpBody - } + override fun shouldTrackHttpBody(url: String, contentType: String?): Boolean = shouldTrackHttpBody var shouldTrackHttpUrl = true - override fun shouldTrackHttpUrl(url: String): Boolean { - return shouldTrackHttpUrl - } + override fun shouldTrackHttpUrl(url: String): Boolean = shouldTrackHttpUrl - override fun shouldTrackHttpHeader(key: String): Boolean { - return !httpHeadersBlocklist.any { key.contains(it, ignoreCase = true) } - } + override fun shouldTrackHttpHeader(key: String): Boolean = !httpHeadersBlocklist.any { key.contains(it, ignoreCase = true) } override fun setMeasureUrl(url: String) { // no-op diff --git a/android/measure/src/test/java/sh/measure/android/fakes/FakeDebugProvider.kt b/android/measure/src/test/java/sh/measure/android/fakes/FakeDebugProvider.kt index 0bf72add9..d3e2b824f 100644 --- a/android/measure/src/test/java/sh/measure/android/fakes/FakeDebugProvider.kt +++ b/android/measure/src/test/java/sh/measure/android/fakes/FakeDebugProvider.kt @@ -4,13 +4,9 @@ import android.os.Debug.MemoryInfo import sh.measure.android.utils.DebugProvider internal class FakeDebugProvider : DebugProvider { - override fun getNativeHeapSize(): Long { - return 100L - } + override fun getNativeHeapSize(): Long = 100L - override fun getNativeHeapFreeSize(): Long { - return 100L - } + override fun getNativeHeapFreeSize(): Long = 100L override fun populateMemoryInfo(memoryInfo: MemoryInfo) { memoryInfo.dalvikPss = 100 diff --git a/android/measure/src/test/java/sh/measure/android/fakes/FakeIdProvider.kt b/android/measure/src/test/java/sh/measure/android/fakes/FakeIdProvider.kt index f12658ed0..ee91566e9 100644 --- a/android/measure/src/test/java/sh/measure/android/fakes/FakeIdProvider.kt +++ b/android/measure/src/test/java/sh/measure/android/fakes/FakeIdProvider.kt @@ -3,15 +3,9 @@ package sh.measure.android.fakes import sh.measure.android.utils.IdProvider internal class FakeIdProvider(var id: String = "fake-id") : IdProvider { - override fun uuid(): String { - return id - } + override fun uuid(): String = id - override fun spanId(): String { - return id - } + override fun spanId(): String = id - override fun traceId(): String { - return id - } + override fun traceId(): String = id } diff --git a/android/measure/src/test/java/sh/measure/android/fakes/FakeLocaleProvider.kt b/android/measure/src/test/java/sh/measure/android/fakes/FakeLocaleProvider.kt index 1a7422575..327b60d0f 100644 --- a/android/measure/src/test/java/sh/measure/android/fakes/FakeLocaleProvider.kt +++ b/android/measure/src/test/java/sh/measure/android/fakes/FakeLocaleProvider.kt @@ -3,7 +3,5 @@ package sh.measure.android.fakes import sh.measure.android.utils.LocaleProvider internal class FakeLocaleProvider(private val locale: String = "en-US") : LocaleProvider { - override fun getLocale(): String { - return locale - } + override fun getLocale(): String = locale } diff --git a/android/measure/src/test/java/sh/measure/android/fakes/FakeMemoryReader.kt b/android/measure/src/test/java/sh/measure/android/fakes/FakeMemoryReader.kt index 952548b07..a5a1003cd 100644 --- a/android/measure/src/test/java/sh/measure/android/fakes/FakeMemoryReader.kt +++ b/android/measure/src/test/java/sh/measure/android/fakes/FakeMemoryReader.kt @@ -11,31 +11,17 @@ internal class FakeMemoryReader( private val nativeTotalHeapSize: Long = 600, private val nativeFreeHeapSize: Long = 250, ) : MemoryReader { - override fun maxHeapSize(): Long { - return maxHeapSize - } + override fun maxHeapSize(): Long = maxHeapSize - override fun totalHeapSize(): Long { - return totalHeapSize - } + override fun totalHeapSize(): Long = totalHeapSize - override fun freeHeapSize(): Long { - return freeHeapSize - } + override fun freeHeapSize(): Long = freeHeapSize - override fun totalPss(): Int { - return totalPss - } + override fun totalPss(): Int = totalPss - override fun rss(): Long { - return rss - } + override fun rss(): Long = rss - override fun nativeTotalHeapSize(): Long { - return nativeTotalHeapSize - } + override fun nativeTotalHeapSize(): Long = nativeTotalHeapSize - override fun nativeFreeHeapSize(): Long { - return nativeFreeHeapSize - } + override fun nativeFreeHeapSize(): Long = nativeFreeHeapSize } diff --git a/android/measure/src/test/java/sh/measure/android/fakes/FakeNetworkInfoProvider.kt b/android/measure/src/test/java/sh/measure/android/fakes/FakeNetworkInfoProvider.kt index 73e1321bc..a6358726b 100644 --- a/android/measure/src/test/java/sh/measure/android/fakes/FakeNetworkInfoProvider.kt +++ b/android/measure/src/test/java/sh/measure/android/fakes/FakeNetworkInfoProvider.kt @@ -5,15 +5,9 @@ import sh.measure.android.networkchange.NetworkGeneration import sh.measure.android.networkchange.NetworkType internal class FakeNetworkInfoProvider : InitialNetworkStateProvider { - override fun getNetworkGeneration(networkType: String?): String { - return NetworkGeneration.FIFTH_GEN - } + override fun getNetworkGeneration(networkType: String?): String = NetworkGeneration.FIFTH_GEN - override fun getNetworkType(): String { - return NetworkType.CELLULAR - } + override fun getNetworkType(): String = NetworkType.CELLULAR - override fun getNetworkProvider(networkType: String?): String { - return "Android" - } + override fun getNetworkProvider(networkType: String?): String = "Android" } diff --git a/android/measure/src/test/java/sh/measure/android/fakes/FakePackageInfoProvider.kt b/android/measure/src/test/java/sh/measure/android/fakes/FakePackageInfoProvider.kt index 7b9ec7149..ed99bb391 100644 --- a/android/measure/src/test/java/sh/measure/android/fakes/FakePackageInfoProvider.kt +++ b/android/measure/src/test/java/sh/measure/android/fakes/FakePackageInfoProvider.kt @@ -5,7 +5,5 @@ import sh.measure.android.utils.PackageInfoProvider internal class FakePackageInfoProvider : PackageInfoProvider { override var appVersion: String? = "app-version" - override fun getVersionCode(): String { - return "1000" - } + override fun getVersionCode(): String = "1000" } diff --git a/android/measure/src/test/java/sh/measure/android/fakes/FakeProcProvider.kt b/android/measure/src/test/java/sh/measure/android/fakes/FakeProcProvider.kt index c35fb91ae..a7b81c7ab 100644 --- a/android/measure/src/test/java/sh/measure/android/fakes/FakeProcProvider.kt +++ b/android/measure/src/test/java/sh/measure/android/fakes/FakeProcProvider.kt @@ -6,13 +6,9 @@ import java.io.File internal class FakeProcProvider : ProcProvider { internal val rss = 5000L - override fun getStatFile(pid: Int): File { - return createDummyProcStatFile() - } + override fun getStatFile(pid: Int): File = createDummyProcStatFile() - override fun getStatmFile(pid: Int): File { - return createDummyProcStatmFile() - } + override fun getStatmFile(pid: Int): File = createDummyProcStatmFile() /** * utime: 500 @@ -21,20 +17,16 @@ internal class FakeProcProvider : ProcProvider { * cstime: 200 * start_time: 5835385 */ - private fun createDummyProcStatFile(): File { - return File.createTempFile("stat", null).apply { - writeText( - "15354 (.measure.sample) R 1274 1274 0 0 -1 4194624 16399 0 0 0 500 600 100 200 30 10 24 0 5835385 15334526976 31865 18446744073709551615 434698489856 434698501984 548727546288 0 0 0 4612 1 1073775864 0 0 0 17 7 0 0 0 0 0 434698502144 434698503416 434785861632 548727550460 548727550559 548727550559 548727554014 0", - ) - } + private fun createDummyProcStatFile(): File = File.createTempFile("stat", null).apply { + writeText( + "15354 (.measure.sample) R 1274 1274 0 0 -1 4194624 16399 0 0 0 500 600 100 200 30 10 24 0 5835385 15334526976 31865 18446744073709551615 434698489856 434698501984 548727546288 0 0 0 4612 1 1073775864 0 0 0 17 7 0 0 0 0 0 434698502144 434698503416 434785861632 548727550460 548727550559 548727550559 548727554014 0", + ) } /** * The second value in this file corresponds to resident set size pages. */ - private fun createDummyProcStatmFile(): File { - return File.createTempFile("statm", "").apply { - writeText("100000 $rss 2000 1000 500 0 0") - } + private fun createDummyProcStatmFile(): File = File.createTempFile("statm", "").apply { + writeText("100000 $rss 2000 1000 500 0 0") } } diff --git a/android/measure/src/test/java/sh/measure/android/fakes/FakeProcessInfoProvider.kt b/android/measure/src/test/java/sh/measure/android/fakes/FakeProcessInfoProvider.kt index c417d4a2c..e22f18eb3 100644 --- a/android/measure/src/test/java/sh/measure/android/fakes/FakeProcessInfoProvider.kt +++ b/android/measure/src/test/java/sh/measure/android/fakes/FakeProcessInfoProvider.kt @@ -6,15 +6,9 @@ import sh.measure.android.utils.ProcessInfoProvider internal class FakeProcessInfoProvider(var id: Int = 0) : ProcessInfoProvider { @Suppress("MemberVisibilityCanBePrivate") var foregroundProcess = true - override fun isForegroundProcess(): Boolean { - return foregroundProcess - } + override fun isForegroundProcess(): Boolean = foregroundProcess - override fun getPid(): Int { - return id - } + override fun getPid(): Int = id - override fun getProcessImportance(): Int { - return RunningAppProcessInfo.IMPORTANCE_FOREGROUND - } + override fun getProcessImportance(): Int = RunningAppProcessInfo.IMPORTANCE_FOREGROUND } diff --git a/android/measure/src/test/java/sh/measure/android/fakes/FakeRandomizer.kt b/android/measure/src/test/java/sh/measure/android/fakes/FakeRandomizer.kt index 047c99433..af7005a8c 100644 --- a/android/measure/src/test/java/sh/measure/android/fakes/FakeRandomizer.kt +++ b/android/measure/src/test/java/sh/measure/android/fakes/FakeRandomizer.kt @@ -11,11 +11,7 @@ internal class FakeRandomizer : Randomizer { var randomLong: Long = 100L - override fun random(): Double { - return randomDouble - } + override fun random(): Double = randomDouble - override fun nextLong(): Long { - return randomLong - } + override fun nextLong(): Long = randomLong } diff --git a/android/measure/src/test/java/sh/measure/android/fakes/FakeSessionManager.kt b/android/measure/src/test/java/sh/measure/android/fakes/FakeSessionManager.kt index 2ae22c7bb..a7a24a188 100644 --- a/android/measure/src/test/java/sh/measure/android/fakes/FakeSessionManager.kt +++ b/android/measure/src/test/java/sh/measure/android/fakes/FakeSessionManager.kt @@ -13,9 +13,7 @@ internal class FakeSessionManager : SessionManager { // no-op } - override fun getSessionId(): String { - return "fake-session-id" - } + override fun getSessionId(): String = "fake-session-id" override fun markCrashedSession(sessionId: String) { crashedSession = sessionId diff --git a/android/measure/src/test/java/sh/measure/android/fakes/FakeTraceSampler.kt b/android/measure/src/test/java/sh/measure/android/fakes/FakeTraceSampler.kt index 59b9c0515..738b34858 100644 --- a/android/measure/src/test/java/sh/measure/android/fakes/FakeTraceSampler.kt +++ b/android/measure/src/test/java/sh/measure/android/fakes/FakeTraceSampler.kt @@ -5,9 +5,7 @@ import sh.measure.android.tracing.TraceSampler internal class FakeTraceSampler : TraceSampler { private var isSampled: Boolean = true - override fun shouldSample(): Boolean { - return isSampled - } + override fun shouldSample(): Boolean = isSampled fun setSampled(isSampled: Boolean) { this.isSampled = isSampled diff --git a/android/measure/src/test/java/sh/measure/android/fakes/ImmediateExecutorService.kt b/android/measure/src/test/java/sh/measure/android/fakes/ImmediateExecutorService.kt index e76741244..a13535bbe 100644 --- a/android/measure/src/test/java/sh/measure/android/fakes/ImmediateExecutorService.kt +++ b/android/measure/src/test/java/sh/measure/android/fakes/ImmediateExecutorService.kt @@ -10,31 +10,26 @@ import java.util.concurrent.TimeUnit /** * A [MeasureExecutorService] which executes all tasks immediately for tests. */ -internal class ImmediateExecutorService(private val resolvableFuture: ResolvableFuture) : - MeasureExecutorService { +internal class ImmediateExecutorService(private val resolvableFuture: ResolvableFuture) : MeasureExecutorService { @Suppress("UNCHECKED_CAST") - override fun submit(callable: Callable): Future { - return try { - val result = callable.call() - (resolvableFuture as ResolvableFuture).set(result) - resolvableFuture - } catch (e: Exception) { - (resolvableFuture as ResolvableFuture).setException(e) - resolvableFuture - } + override fun submit(callable: Callable): Future = try { + val result = callable.call() + (resolvableFuture as ResolvableFuture).set(result) + resolvableFuture + } catch (e: Exception) { + (resolvableFuture as ResolvableFuture).setException(e) + resolvableFuture } @Suppress("UNCHECKED_CAST") - override fun schedule(callable: Callable, delayMillis: Long): Future { - return try { - val result = callable.call() - (resolvableFuture as ResolvableFuture).set(result) - resolvableFuture - } catch (e: Exception) { - (resolvableFuture as ResolvableFuture).setException(e) - resolvableFuture - } + override fun schedule(callable: Callable, delayMillis: Long): Future = try { + val result = callable.call() + (resolvableFuture as ResolvableFuture).set(result) + resolvableFuture + } catch (e: Exception) { + (resolvableFuture as ResolvableFuture).setException(e) + resolvableFuture } override fun scheduleAtFixedRate( diff --git a/android/measure/src/test/java/sh/measure/android/fakes/TestData.kt b/android/measure/src/test/java/sh/measure/android/fakes/TestData.kt index 61cafef22..49832b02b 100644 --- a/android/measure/src/test/java/sh/measure/android/fakes/TestData.kt +++ b/android/measure/src/test/java/sh/measure/android/fakes/TestData.kt @@ -56,89 +56,83 @@ internal object TestData { handled: Boolean = true, thread: Thread = Thread.currentThread(), foreground: Boolean = true, - ): ExceptionData { - return ExceptionFactory.createMeasureException( - exception, - handled, - thread, - foreground, - ) - } + ): ExceptionData = ExceptionFactory.createMeasureException( + exception, + handled, + thread, + foreground, + ) fun getUnObfuscatedFlutterExceptionData( handled: Boolean = false, foreground: Boolean = true, - ): ExceptionData { - return ExceptionData( - exceptions = listOf( - ExceptionUnit( - type = null, - message = null, - frames = listOf( - Frame( - class_name = "_MyAppState", - method_name = "_throwException", - file_name = "main.dart", - line_num = 84, - col_num = 5, - module_name = "package:measure_flutter_example/", - frame_index = 0, - ), - Frame( - class_name = "_InkResponseState", - method_name = "handleTap", - file_name = "ink_well.dart", - line_num = 1176, - col_num = 21, - module_name = "package:flutter/src/material/", - frame_index = 1, - ), - Frame( - class_name = null, - method_name = "_invoke1", - file_name = "hooks.dart", - line_num = 330, - col_num = 10, - module_name = "dart:ui/", - frame_index = 2, - ), + ): ExceptionData = ExceptionData( + exceptions = listOf( + ExceptionUnit( + type = null, + message = null, + frames = listOf( + Frame( + class_name = "_MyAppState", + method_name = "_throwException", + file_name = "main.dart", + line_num = 84, + col_num = 5, + module_name = "package:measure_flutter_example/", + frame_index = 0, + ), + Frame( + class_name = "_InkResponseState", + method_name = "handleTap", + file_name = "ink_well.dart", + line_num = 1176, + col_num = 21, + module_name = "package:flutter/src/material/", + frame_index = 1, + ), + Frame( + class_name = null, + method_name = "_invoke1", + file_name = "hooks.dart", + line_num = 330, + col_num = 10, + module_name = "dart:ui/", + frame_index = 2, ), ), ), - handled = handled, - threads = listOf(), - foreground = foreground, - ) - } + ), + handled = handled, + threads = listOf(), + foreground = foreground, + ) fun getObfuscatedFlutterExceptionData( handled: Boolean = false, foreground: Boolean = true, - ): ExceptionData { - return ExceptionData( - exceptions = listOf( - ExceptionUnit( - type = null, - message = null, - frames = listOf( - Frame( - frame_index = 0, - binary_address = "0x7af7026000", - instruction_address = "0x7af71c4903", - ), - Frame( - frame_index = 1, - binary_address = "0x7af7026000", - instruction_address = "0x7af71c48cf", - ), + ): ExceptionData = ExceptionData( + exceptions = listOf( + ExceptionUnit( + type = null, + message = null, + frames = listOf( + Frame( + frame_index = 0, + binary_address = "0x7af7026000", + instruction_address = "0x7af71c4903", + ), + Frame( + frame_index = 1, + binary_address = "0x7af7026000", + instruction_address = "0x7af71c48cf", ), ), ), - handled = handled, - threads = listOf(), - foreground = foreground, - ) - } + ), + handled = handled, + threads = listOf(), + foreground = foreground, + ) fun getClickData( target: String = "target", @@ -149,9 +143,7 @@ internal object TestData { y: Float = 50F, touchDownTime: Long = 987549876L, touchUpTime: Long = 234567609L, - ): ClickData { - return ClickData(target, targetId, width, height, x, y, touchDownTime, touchUpTime) - } + ): ClickData = ClickData(target, targetId, width, height, x, y, touchDownTime, touchUpTime) fun T.toEvent( id: String = "event-id", @@ -162,19 +154,17 @@ internal object TestData { attributes: MutableMap = mutableMapOf(), userTriggered: Boolean = false, userDefinedAttributes: Map = emptyMap(), - ): Event { - return Event( - id = id, - timestamp = timestamp, - data = this, - type = type, - sessionId = sessionId, - attachments = attachments, - attributes = attributes, - userTriggered = userTriggered, - userDefinedAttributes = userDefinedAttributes, - ) - } + ): Event = Event( + id = id, + timestamp = timestamp, + data = this, + type = type, + sessionId = sessionId, + attachments = attachments, + attributes = attributes, + userTriggered = userTriggered, + userDefinedAttributes = userDefinedAttributes, + ) fun getLongClickData( target: String = "target", @@ -185,9 +175,7 @@ internal object TestData { y: Float = 50F, touchDownTime: Long = 987549876L, touchUpTime: Long = 234567609L, - ): LongClickData { - return LongClickData(target, targetId, width, height, x, y, touchDownTime, touchUpTime) - } + ): LongClickData = LongClickData(target, targetId, width, height, x, y, touchDownTime, touchUpTime) fun getScrollData( target: String = "target", @@ -199,33 +187,25 @@ internal object TestData { direction: String = "left", touchDownTime: Long = 987549876L, touchUpTime: Long = 234567609L, - ): ScrollData { - return ScrollData( - target, targetId, x, y, endX, endY, direction, touchDownTime, touchUpTime, - ) - } + ): ScrollData = ScrollData( + target, targetId, x, y, endX, endY, direction, touchDownTime, touchUpTime, + ) fun getActivityLifecycleData( type: String = ActivityLifecycleType.CREATED, className: String = "Activity", intent: String? = null, savedInstanceState: Boolean = false, - ): ActivityLifecycleData { - return ActivityLifecycleData(type, className, intent, savedInstanceState) - } + ): ActivityLifecycleData = ActivityLifecycleData(type, className, intent, savedInstanceState) fun getFragmentLifecycleData( type: String = FragmentLifecycleType.ATTACHED, className: String = "Fragment", parentActivity: String = "Activity", tag: String? = null, - ): FragmentLifecycleData { - return FragmentLifecycleData(type, className, parentActivity, tag) - } + ): FragmentLifecycleData = FragmentLifecycleData(type, className, parentActivity, tag) - fun getApplicationLifecycleData(type: String = AppLifecycleType.FOREGROUND): ApplicationLifecycleData { - return ApplicationLifecycleData(type) - } + fun getApplicationLifecycleData(type: String = AppLifecycleType.FOREGROUND): ApplicationLifecycleData = ApplicationLifecycleData(type) fun getColdLaunchData( processStartUptime: Long = 100, @@ -235,17 +215,15 @@ internal object TestData { launchedActivity: String = "launched_activity", hasSavedState: Boolean = true, intentData: String = "intent_data", - ): ColdLaunchData { - return ColdLaunchData( - processStartUptime, - processStartRequestedUptime, - contentProviderAttachUptime, - onNextDrawUptime, - launchedActivity, - hasSavedState, - intentData, - ) - } + ): ColdLaunchData = ColdLaunchData( + processStartUptime, + processStartRequestedUptime, + contentProviderAttachUptime, + onNextDrawUptime, + launchedActivity, + hasSavedState, + intentData, + ) fun getWarmLaunchData( processStartUptime: Long = 100, @@ -257,19 +235,17 @@ internal object TestData { hasSavedState: Boolean = true, intentData: String = "intent_data", isLukewarm: Boolean = false, - ): WarmLaunchData { - return WarmLaunchData( - processStartUptime, - processStartRequestedUptime, - contentProviderAttachUptime, - appVisibleUptime, - onNextDrawUptime, - launchedActivity, - hasSavedState, - intentData, - isLukewarm, - ) - } + ): WarmLaunchData = WarmLaunchData( + processStartUptime, + processStartRequestedUptime, + contentProviderAttachUptime, + appVisibleUptime, + onNextDrawUptime, + launchedActivity, + hasSavedState, + intentData, + isLukewarm, + ) fun getHotLaunchData( appVisibleUptime: Long = 100, @@ -277,15 +253,13 @@ internal object TestData { launchedActivity: String = "launched_activity", hasSavedState: Boolean = true, intentData: String = "intent_data", - ): HotLaunchData { - return HotLaunchData( - appVisibleUptime, - onNextDrawUptime, - launchedActivity, - hasSavedState, - intentData, - ) - } + ): HotLaunchData = HotLaunchData( + appVisibleUptime, + onNextDrawUptime, + launchedActivity, + hasSavedState, + intentData, + ) fun getNetworkChangeData( previousNetworkType: String = "cellular", @@ -293,15 +267,13 @@ internal object TestData { previousNetworkGeneration: String = "2g", networkGeneration: String = NetworkGeneration.UNKNOWN, networkProvider: String = "t-mobile", - ): NetworkChangeData { - return NetworkChangeData( - previousNetworkType, - networkType, - previousNetworkGeneration, - networkGeneration, - networkProvider, - ) - } + ): NetworkChangeData = NetworkChangeData( + previousNetworkType, + networkType, + previousNetworkGeneration, + networkGeneration, + networkProvider, + ) fun getHttpData( url: String = "url", @@ -316,22 +288,20 @@ internal object TestData { requestBody: String? = "request-body", responseBody: String? = "response-body", client: String = "client", - ): HttpData { - return HttpData( - url, - method, - statusCode, - startTime, - endTime, - failureReason, - failureDescription, - requestHeaders, - responseHeaders, - requestBody, - responseBody, - client, - ) - } + ): HttpData = HttpData( + url, + method, + statusCode, + startTime, + endTime, + failureReason, + failureDescription, + requestHeaders, + responseHeaders, + requestBody, + responseBody, + client, + ) fun getMemoryUsageData( javaMaxHeap: Long = 100, @@ -342,24 +312,20 @@ internal object TestData { nativeTotalHeap: Long = 600, nativeFreeHeap: Long = 700, interval: Long = 800, - ): MemoryUsageData { - return MemoryUsageData( - javaMaxHeap, - javaTotalHeap, - javaFreeHeap, - totalPss, - rss, - nativeTotalHeap, - nativeFreeHeap, - interval, - ) - } + ): MemoryUsageData = MemoryUsageData( + javaMaxHeap, + javaTotalHeap, + javaFreeHeap, + totalPss, + rss, + nativeTotalHeap, + nativeFreeHeap, + interval, + ) fun getTrimMemoryData( level: String = "TRIM_MEMORY_UI_HIDDEN", - ): TrimMemoryData { - return TrimMemoryData(level) - } + ): TrimMemoryData = TrimMemoryData(level) fun getCpuUsageData( numCores: Int = 4, @@ -372,61 +338,53 @@ internal object TestData { stime: Long = 9876L, interval: Long = 1000, percentageUsage: Double = 0.0, - ): CpuUsageData { - return CpuUsageData( - numCores, - clockSpeed, - startTime, - uptime, - utime, - cutime, - cstime, - stime, - interval, - percentageUsage, - ) - } - - fun getEventPacket(eventEntity: EventEntity): EventPacket { - return EventPacket( - eventId = eventEntity.id, - type = eventEntity.type, - timestamp = eventEntity.timestamp, - sessionId = eventEntity.sessionId, - userTriggered = eventEntity.userTriggered, - serializedData = eventEntity.serializedData, - serializedAttributes = eventEntity.serializedAttributes ?: "", - serializedAttachments = eventEntity.serializedAttachments, - serializedDataFilePath = eventEntity.filePath, - serializedUserDefinedAttributes = eventEntity.serializedUserDefAttributes, - ) - } + ): CpuUsageData = CpuUsageData( + numCores, + clockSpeed, + startTime, + uptime, + utime, + cutime, + cstime, + stime, + interval, + percentageUsage, + ) + + fun getEventPacket(eventEntity: EventEntity): EventPacket = EventPacket( + eventId = eventEntity.id, + type = eventEntity.type, + timestamp = eventEntity.timestamp, + sessionId = eventEntity.sessionId, + userTriggered = eventEntity.userTriggered, + serializedData = eventEntity.serializedData, + serializedAttributes = eventEntity.serializedAttributes ?: "", + serializedAttachments = eventEntity.serializedAttachments, + serializedDataFilePath = eventEntity.filePath, + serializedUserDefinedAttributes = eventEntity.serializedUserDefAttributes, + ) fun getAttachment( type: String = "type", name: String = "name", path: String? = "path", bytes: ByteArray? = null, - ): Attachment { - return Attachment( - type = type, - name = name, - path = path, - bytes = bytes, - ) - } + ): Attachment = Attachment( + type = type, + name = name, + path = path, + bytes = bytes, + ) fun getAttachmentEntity( id: String = "attachment-id", type: String = "type", name: String = "name", - ): AttachmentEntity { - return AttachmentEntity( - id = id, - type = type, - name = name, - ) - } + ): AttachmentEntity = AttachmentEntity( + id = id, + type = type, + name = name, + ) fun getEventEntity( eventId: String = "event-id", @@ -441,22 +399,20 @@ internal object TestData { filePath: String? = null, attachmentEntities: List = emptyList(), serializedUserDefAttributes: String? = null, - ): EventEntity { - return EventEntity( - id = eventId, - type = type, - timestamp = timestamp, - sessionId = sessionId, - userTriggered = userTriggered, - attachmentsSize = attachmentSize, - serializedData = serializedData, - serializedAttributes = serializedAttributes, - serializedAttachments = serializedAttachments, - attachmentEntities = attachmentEntities, - filePath = filePath, - serializedUserDefAttributes = serializedUserDefAttributes, - ) - } + ): EventEntity = EventEntity( + id = eventId, + type = type, + timestamp = timestamp, + sessionId = sessionId, + userTriggered = userTriggered, + attachmentsSize = attachmentSize, + serializedData = serializedData, + serializedAttributes = serializedAttributes, + serializedAttachments = serializedAttachments, + attachmentEntities = attachmentEntities, + filePath = filePath, + serializedUserDefAttributes = serializedUserDefAttributes, + ) fun getSessionEntity( id: String = "session-id", @@ -467,39 +423,33 @@ internal object TestData { supportsAppExit: Boolean = false, appVersion: String? = "1.0.0", appBuild: String? = "100", - ): SessionEntity { - return SessionEntity( - sessionId = id, - pid = pid, - createdAt = createdAt, - needsReporting = needsReporting, - crashed = crashed, - supportsAppExit = supportsAppExit, - appVersion = appVersion, - appBuild = appBuild, - ) - } + ): SessionEntity = SessionEntity( + sessionId = id, + pid = pid, + createdAt = createdAt, + needsReporting = needsReporting, + crashed = crashed, + supportsAppExit = supportsAppExit, + appVersion = appVersion, + appBuild = appBuild, + ) fun getEventBatchEntity( batchId: String = "batch-id", eventIds: List = emptyList(), spanIds: List = emptyList(), createdAt: Long = 987654321L, - ): BatchEntity { - return BatchEntity( - batchId = batchId, - eventIds = eventIds, - spanIds = spanIds, - createdAt = createdAt, - ) - } + ): BatchEntity = BatchEntity( + batchId = batchId, + eventIds = eventIds, + spanIds = spanIds, + createdAt = createdAt, + ) fun getAttachmentPacket( id: String = "attachment-id", filePath: String = "/path/to/attachment.png", - ): AttachmentPacket { - return AttachmentPacket(id = id, filePath = filePath) - } + ): AttachmentPacket = AttachmentPacket(id = id, filePath = filePath) fun getAppExit( reasonId: Int = 1, @@ -509,21 +459,17 @@ internal object TestData { processName: String = "process-name", appExitTimeMs: Long = 987654321L, pid: String = "123", - ): AppExit { - return AppExit( - reasonId = reasonId, - reason = reason, - importance = importance, - trace = trace, - process_name = processName, - app_exit_time_ms = appExitTimeMs, - pid = pid, - ) - } - - fun getScreenViewData(): ScreenViewData { - return ScreenViewData(name = "screen-name") - } + ): AppExit = AppExit( + reasonId = reasonId, + reason = reason, + importance = importance, + trace = trace, + process_name = processName, + app_exit_time_ms = appExitTimeMs, + pid = pid, + ) + + fun getScreenViewData(): ScreenViewData = ScreenViewData(name = "screen-name") fun getSpanData( name: String = "span-name", @@ -540,24 +486,22 @@ internal object TestData { userDefinedAttrs: Map = emptyMap(), checkpoints: MutableList = mutableListOf(), isSampled: Boolean = true, - ): SpanData { - return SpanData( - name = name, - traceId = traceId, - spanId = spanId, - parentId = parentId, - sessionId = sessionId, - startTime = startTime, - endTime = endTime, - duration = duration, - status = status, - hasEnded = hasEnded, - attributes = attributes, - userDefinedAttrs = userDefinedAttrs, - checkpoints = checkpoints, - isSampled = isSampled, - ) - } + ): SpanData = SpanData( + name = name, + traceId = traceId, + spanId = spanId, + parentId = parentId, + sessionId = sessionId, + startTime = startTime, + endTime = endTime, + duration = duration, + status = status, + hasEnded = hasEnded, + attributes = attributes, + userDefinedAttrs = userDefinedAttrs, + checkpoints = checkpoints, + isSampled = isSampled, + ) fun getSpan( logger: Logger, @@ -570,20 +514,18 @@ internal object TestData { sessionId: String = "session-id", startTime: Long = 987654321L, isSampled: Boolean = true, - ): MsrSpan { - return MsrSpan( - logger, - timeProvider, - spanProcessor, - isSampled, - name, - spanId, - traceId, - parentId, - sessionId, - startTime, - ) - } + ): MsrSpan = MsrSpan( + logger, + timeProvider, + spanProcessor, + isSampled, + name, + spanId, + traceId, + parentId, + sessionId, + startTime, + ) fun getSpanEntity( name: String = "span-name", @@ -599,57 +541,47 @@ internal object TestData { attributes: Map = emptyMap(), userDefinedAttrs: Map = emptyMap(), checkpoints: MutableList = mutableListOf(), - ): SpanEntity { - return getSpanData( - name = name, - traceId = traceId, - spanId = spanId, - parentId = parentId, - sessionId = sessionId, - startTime = startTime, - endTime = endTime, - duration = duration, - status = status, - hasEnded = hasEnded, - attributes = attributes, - userDefinedAttrs = userDefinedAttrs, - checkpoints = checkpoints, - ).toSpanEntity() - } - - fun getSpanPacket(spanEntity: SpanEntity): SpanPacket { - return SpanPacket( - name = spanEntity.name, - traceId = spanEntity.traceId, - spanId = spanEntity.spanId, - parentId = spanEntity.parentId, - sessionId = spanEntity.sessionId, - startTime = spanEntity.startTime.iso8601Timestamp(), - endTime = spanEntity.endTime.iso8601Timestamp(), - duration = spanEntity.duration, - status = spanEntity.status.value, - serializedAttributes = spanEntity.serializedAttributes, - serializedCheckpoints = spanEntity.serializedCheckpoints, - serializedUserDefAttrs = spanEntity.serializedUserDefinedAttrs, - ) - } - - fun getCheckpoint(): Checkpoint { - return Checkpoint( - name = "name", - timestamp = 98765432L, - ) - } - - fun getBugReportData(): BugReportData { - return BugReportData("Bug report description") - } + ): SpanEntity = getSpanData( + name = name, + traceId = traceId, + spanId = spanId, + parentId = parentId, + sessionId = sessionId, + startTime = startTime, + endTime = endTime, + duration = duration, + status = status, + hasEnded = hasEnded, + attributes = attributes, + userDefinedAttrs = userDefinedAttrs, + checkpoints = checkpoints, + ).toSpanEntity() + + fun getSpanPacket(spanEntity: SpanEntity): SpanPacket = SpanPacket( + name = spanEntity.name, + traceId = spanEntity.traceId, + spanId = spanEntity.spanId, + parentId = spanEntity.parentId, + sessionId = spanEntity.sessionId, + startTime = spanEntity.startTime.iso8601Timestamp(), + endTime = spanEntity.endTime.iso8601Timestamp(), + duration = spanEntity.duration, + status = spanEntity.status.value, + serializedAttributes = spanEntity.serializedAttributes, + serializedCheckpoints = spanEntity.serializedCheckpoints, + serializedUserDefAttrs = spanEntity.serializedUserDefinedAttrs, + ) + + fun getCheckpoint(): Checkpoint = Checkpoint( + name = "name", + timestamp = 98765432L, + ) + + fun getBugReportData(): BugReportData = BugReportData("Bug report description") fun getMsrAttachment( name: String = "attachment", content: ByteArray = "content".toByteArray(), type: String = AttachmentType.SCREENSHOT, - ): MsrAttachment { - return MsrAttachment(name, bytes = content, type = type) - } + ): MsrAttachment = MsrAttachment(name, bytes = content, type = type) } diff --git a/android/measure/src/test/java/sh/measure/android/performance/CpuUsageCollectorTest.kt b/android/measure/src/test/java/sh/measure/android/performance/CpuUsageCollectorTest.kt index 7a6e39abc..895497618 100644 --- a/android/measure/src/test/java/sh/measure/android/performance/CpuUsageCollectorTest.kt +++ b/android/measure/src/test/java/sh/measure/android/performance/CpuUsageCollectorTest.kt @@ -233,11 +233,9 @@ internal class CpuUsageCollectorTest { cuTime: Long = 100, csTime: Long = 200, startTime: Long = 5835385, - ): File { - return File.createTempFile("stat", null).apply { - writeText( - "15354 (.measure.sample) R 1274 1274 0 0 -1 4194624 16399 0 0 0 $utime $stime $cuTime $csTime 30 10 24 0 $startTime 15334526976 31865 18446744073709551615 434698489856 434698501984 548727546288 0 0 0 4612 1 1073775864 0 0 0 17 7 0 0 0 0 0 434698502144 434698503416 434785861632 548727550460 548727550559 548727550559 548727554014 0", - ) - } + ): File = File.createTempFile("stat", null).apply { + writeText( + "15354 (.measure.sample) R 1274 1274 0 0 -1 4194624 16399 0 0 0 $utime $stime $cuTime $csTime 30 10 24 0 $startTime 15334526976 31865 18446744073709551615 434698489856 434698501984 548727546288 0 0 0 4612 1 1073775864 0 0 0 17 7 0 0 0 0 0 434698502144 434698503416 434785861632 548727550460 548727550559 548727550559 548727554014 0", + ) } } diff --git a/android/measure/src/test/java/sh/measure/android/storage/DatabaseTest.kt b/android/measure/src/test/java/sh/measure/android/storage/DatabaseTest.kt index 73cb91e77..fb3559019 100644 --- a/android/measure/src/test/java/sh/measure/android/storage/DatabaseTest.kt +++ b/android/measure/src/test/java/sh/measure/android/storage/DatabaseTest.kt @@ -1202,41 +1202,35 @@ class DatabaseTest { assertNull(session?.appBuild) } - private fun queryAllEvents(db: SQLiteDatabase): Cursor { - return db.query( - EventTable.TABLE_NAME, - null, - null, - null, - null, - null, - null, - ) - } - - private fun queryAllSpans(db: SQLiteDatabase): Cursor { - return db.query( - SpansTable.TABLE_NAME, - null, - null, - null, - null, - null, - null, - ) - } - - private fun queryAllAttachments(db: SQLiteDatabase): Cursor { - return db.query( - AttachmentTable.TABLE_NAME, - null, - null, - null, - null, - null, - null, - ) - } + private fun queryAllEvents(db: SQLiteDatabase): Cursor = db.query( + EventTable.TABLE_NAME, + null, + null, + null, + null, + null, + null, + ) + + private fun queryAllSpans(db: SQLiteDatabase): Cursor = db.query( + SpansTable.TABLE_NAME, + null, + null, + null, + null, + null, + null, + ) + + private fun queryAllAttachments(db: SQLiteDatabase): Cursor = db.query( + AttachmentTable.TABLE_NAME, + null, + null, + null, + null, + null, + null, + ) private fun queryAllBatches(): Cursor { val db = database.writableDatabase @@ -1277,17 +1271,15 @@ class DatabaseTest { ) } - private fun queryAttachmentsForEvent(db: SQLiteDatabase, eventId: String): Cursor { - return db.query( - AttachmentTable.TABLE_NAME, - null, - "${AttachmentTable.COL_EVENT_ID} = ?", - arrayOf(eventId), - null, - null, - null, - ) - } + private fun queryAttachmentsForEvent(db: SQLiteDatabase, eventId: String): Cursor = db.query( + AttachmentTable.TABLE_NAME, + null, + "${AttachmentTable.COL_EVENT_ID} = ?", + arrayOf(eventId), + null, + null, + null, + ) /** * Asserts that the event in the cursor matches the expected event. diff --git a/android/measure/src/test/java/sh/measure/android/storage/SignalStoreTest.kt b/android/measure/src/test/java/sh/measure/android/storage/SignalStoreTest.kt index 3c7d79a2e..ba308ef69 100644 --- a/android/measure/src/test/java/sh/measure/android/storage/SignalStoreTest.kt +++ b/android/measure/src/test/java/sh/measure/android/storage/SignalStoreTest.kt @@ -484,7 +484,5 @@ internal class SignalStoreTest { assertEquals(1, spansCaptor.firstValue.size) } - private fun getAttachmentContent(): String { - return "lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." - } + private fun getAttachmentContent(): String = "lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." } diff --git a/android/measure/src/test/java/sh/measure/android/storage/TestDatabaseHelper.kt b/android/measure/src/test/java/sh/measure/android/storage/TestDatabaseHelper.kt index 9b4cddefa..55d19b0ab 100644 --- a/android/measure/src/test/java/sh/measure/android/storage/TestDatabaseHelper.kt +++ b/android/measure/src/test/java/sh/measure/android/storage/TestDatabaseHelper.kt @@ -92,11 +92,7 @@ object TestDatabaseHelper { this.insertOrThrow(EventsBatchTable.TABLE_NAME, null, values) } - fun SQLiteDatabase.getBatchesTable(): Cursor { - return rawQuery("SELECT * FROM batches", null) - } + fun SQLiteDatabase.getBatchesTable(): Cursor = rawQuery("SELECT * FROM batches", null) - fun SQLiteDatabase.queryTableInfo(tableName: String): Cursor { - return rawQuery("PRAGMA table_info($tableName)", null) - } + fun SQLiteDatabase.queryTableInfo(tableName: String): Cursor = rawQuery("PRAGMA table_info($tableName)", null) } diff --git a/android/measure/src/test/java/sh/measure/android/utils/FakeTraceSampler.kt b/android/measure/src/test/java/sh/measure/android/utils/FakeTraceSampler.kt index 7b57c54f1..c878535e1 100644 --- a/android/measure/src/test/java/sh/measure/android/utils/FakeTraceSampler.kt +++ b/android/measure/src/test/java/sh/measure/android/utils/FakeTraceSampler.kt @@ -3,7 +3,5 @@ package sh.measure.android.utils import sh.measure.android.tracing.TraceSampler class FakeTraceSampler : TraceSampler { - override fun shouldSample(): Boolean { - return true - } + override fun shouldSample(): Boolean = true } diff --git a/android/measure/src/test/java/sh/measure/android/utils/TestClock.kt b/android/measure/src/test/java/sh/measure/android/utils/TestClock.kt index 9313ede6d..a2c700b94 100644 --- a/android/measure/src/test/java/sh/measure/android/utils/TestClock.kt +++ b/android/measure/src/test/java/sh/measure/android/utils/TestClock.kt @@ -3,8 +3,7 @@ package sh.measure.android.utils import java.time.Duration import java.util.concurrent.TimeUnit -internal class TestClock private constructor(private var currentEpochMillis: Long) : - SystemClock { +internal class TestClock private constructor(private var currentEpochMillis: Long) : SystemClock { fun setTime(time: Long) { this.currentEpochMillis = time } @@ -13,13 +12,9 @@ internal class TestClock private constructor(private var currentEpochMillis: Lon advance(duration.toMillis(), TimeUnit.MILLISECONDS) } - override fun epochTime(): Long { - return currentEpochMillis - } + override fun epochTime(): Long = currentEpochMillis - override fun monotonicTimeSinceBoot(): Long { - return currentEpochMillis - } + override fun monotonicTimeSinceBoot(): Long = currentEpochMillis private fun advance(duration: Long, unit: TimeUnit) { currentEpochMillis += unit.toMillis(duration) @@ -27,8 +22,6 @@ internal class TestClock private constructor(private var currentEpochMillis: Lon companion object { // Default time set to Wed Oct 25 2023 18:20:15 GMT+0530 - fun create(timeInMillis: Long = 1698238215): TestClock { - return TestClock(timeInMillis) - } + fun create(timeInMillis: Long = 1698238215): TestClock = TestClock(timeInMillis) } } diff --git a/android/measure/src/test/java/sh/measure/android/utils/TestTracer.kt b/android/measure/src/test/java/sh/measure/android/utils/TestTracer.kt index 30bdefe52..6dad6a327 100644 --- a/android/measure/src/test/java/sh/measure/android/utils/TestTracer.kt +++ b/android/measure/src/test/java/sh/measure/android/utils/TestTracer.kt @@ -21,23 +21,17 @@ internal class TestTracer( private val traceSampler = FakeTraceSampler() private val spanProcessor = MsrSpanProcessor(logger, signalProcessor, listOf(), configProvider) - override fun spanBuilder(name: String): SpanBuilder { - return MsrSpanBuilder( - name, - spanProcessor = spanProcessor, - timeProvider = timeProvider, - idProvider = idProvider, - sessionManager = sessionManager, - traceSampler = traceSampler, - logger = logger, - ) - } + override fun spanBuilder(name: String): SpanBuilder = MsrSpanBuilder( + name, + spanProcessor = spanProcessor, + timeProvider = timeProvider, + idProvider = idProvider, + sessionManager = sessionManager, + traceSampler = traceSampler, + logger = logger, + ) - override fun getTraceParentHeaderValue(span: Span): String { - return "00-${span.traceId}-${span.spanId}-${0}" - } + override fun getTraceParentHeaderValue(span: Span): String = "00-${span.traceId}-${span.spanId}-${0}" - override fun getTraceParentHeaderKey(): String { - return "traceparent" - } + override fun getTraceParentHeaderKey(): String = "traceparent" } diff --git a/docs/sdk-integration-guide.md b/docs/sdk-integration-guide.md index 1c8cac92a..fefb6e4b1 100644 --- a/docs/sdk-integration-guide.md +++ b/docs/sdk-integration-guide.md @@ -37,9 +37,9 @@ in later steps. | Name | Version | |-----------------------|-----------------| -| Android Gradle Plugin | `7.4` | +| Android Gradle Plugin | `8.6.0` | | Min SDK | `21` (Lollipop) | -| Target SDK | `31` | +| Target SDK | `35` |