diff --git a/NOTICE b/NOTICE index 2235e692f..2b7cf5314 100644 --- a/NOTICE +++ b/NOTICE @@ -9,6 +9,7 @@ This product includes software licensed under the 'Apache License Version 2.0' l - Byte Buddy Gradle plugin - Core (https://developer.android.com/jetpack/androidx/releases/core#1.15.0) - Kotlin Stdlib (https://kotlinlang.org/) + - Lifecycle Process (https://developer.android.com/jetpack/androidx/releases/lifecycle#2.8.7) - OpenTelemetry Java (https://github.com/open-telemetry/opentelemetry-java) - OpenTelemetry Java Contrib (https://github.com/open-telemetry/opentelemetry-java-contrib) - OpenTelemetry Semantic Conventions Java (https://github.com/open-telemetry/semantic-conventions-java) diff --git a/android-api/src/main/java/co/elastic/otel/android/api/internal/MetricFlusher.kt b/android-api/src/main/java/co/elastic/otel/android/api/internal/MetricFlusher.kt new file mode 100644 index 000000000..8a956523a --- /dev/null +++ b/android-api/src/main/java/co/elastic/otel/android/api/internal/MetricFlusher.kt @@ -0,0 +1,7 @@ +package co.elastic.otel.android.api.internal + +import io.opentelemetry.sdk.common.CompletableResultCode + +interface MetricFlusher { + fun flushMetrics(): CompletableResultCode +} \ No newline at end of file diff --git a/android-plugin/build.gradle.kts b/android-plugin/build.gradle.kts index fc73d14a7..2f3a53c77 100644 --- a/android-plugin/build.gradle.kts +++ b/android-plugin/build.gradle.kts @@ -1,7 +1,7 @@ plugins { id("elastic.java-library") id("java-gradle-plugin") - id("com.github.gmazzo.buildconfig") version "3.1.0" + alias(libs.plugins.buildconfig) } dependencies { @@ -22,8 +22,8 @@ licensesConfig { gradlePlugin { plugins { - create("androidOtelPlugin") { - id = "co.elastic.otel.android" + create("elasticAndroidAgent") { + id = "co.elastic.otel.android.agent" implementationClass = "co.elastic.otel.android.plugin.ApmAndroidAgentPlugin" displayName = "Elastic OTel Android Agent" description = project.description diff --git a/android-plugin/src/main/java/co/elastic/otel/android/plugin/ApmAndroidAgentPlugin.kt b/android-plugin/src/main/java/co/elastic/otel/android/plugin/ApmAndroidAgentPlugin.kt index c1b078e62..83d2f1c59 100644 --- a/android-plugin/src/main/java/co/elastic/otel/android/plugin/ApmAndroidAgentPlugin.kt +++ b/android-plugin/src/main/java/co/elastic/otel/android/plugin/ApmAndroidAgentPlugin.kt @@ -18,8 +18,8 @@ */ package co.elastic.otel.android.plugin -import co.elastic.apm.generated.BuildConfig import co.elastic.otel.android.common.internal.logging.Elog +import co.elastic.otel.android.generated.BuildConfig import co.elastic.otel.android.plugin.logging.GradleLoggerFactory import net.bytebuddy.build.gradle.android.ByteBuddyAndroidPlugin import org.gradle.api.Plugin diff --git a/android-sdk/build.gradle.kts b/android-sdk/build.gradle.kts index b15b46aba..4a9c8ed00 100644 --- a/android-sdk/build.gradle.kts +++ b/android-sdk/build.gradle.kts @@ -27,6 +27,7 @@ licensesConfig { dependencies { api(project(":android-api")) + api(project(":instrumentation:api")) implementation(libs.stagemonitor.configuration) implementation(project(":android-common")) implementation(libs.opentelemetry.exporter.otlp) diff --git a/android-sdk/src/main/java/co/elastic/otel/android/ElasticApmAgent.kt b/android-sdk/src/main/java/co/elastic/otel/android/ElasticApmAgent.kt index 893eec928..b8cf014b1 100644 --- a/android-sdk/src/main/java/co/elastic/otel/android/ElasticApmAgent.kt +++ b/android-sdk/src/main/java/co/elastic/otel/android/ElasticApmAgent.kt @@ -35,6 +35,7 @@ import co.elastic.otel.android.internal.features.conditionaldrop.ConditionalDrop import co.elastic.otel.android.internal.features.diskbuffering.DiskBufferingConfiguration import co.elastic.otel.android.internal.features.diskbuffering.DiskBufferingManager import co.elastic.otel.android.internal.features.exportergate.ExporterGateManager +import co.elastic.otel.android.internal.features.instrumentation.InstrumentationManager import co.elastic.otel.android.internal.features.sessionmanager.SessionIdGenerator import co.elastic.otel.android.internal.features.sessionmanager.SessionManager import co.elastic.otel.android.internal.features.sessionmanager.samplerate.SampleRateManager @@ -47,15 +48,17 @@ import co.elastic.otel.android.logging.LoggingPolicy import io.opentelemetry.api.OpenTelemetry import java.util.UUID +@Suppress("CanBeParameter") class ElasticApmAgent private constructor( configuration: Configuration, - sampleRateManager: SampleRateManager, + private val sampleRateManager: SampleRateManager, private val serviceManager: ServiceManager, private val exporterGateManager: ExporterGateManager, private val diskBufferingManager: DiskBufferingManager, private val apmServerConnectivityManager: ApmServerConnectivityManager, private val elasticClockManager: ElasticClockManager, private val centralConfigurationManager: CentralConfigurationManager, + private val instrumentationManager: InstrumentationManager, private val sessionManager: SessionManager ) : ManagedElasticOtelAgent(configuration) { private val openTelemetry = configuration.openTelemetrySdk @@ -67,6 +70,7 @@ class ElasticApmAgent private constructor( sampleRateManager.initialize() sessionManager.initialize() exporterGateManager.initialize() + instrumentationManager.initialize(this) } override fun getOpenTelemetry(): OpenTelemetry { @@ -262,6 +266,7 @@ class ElasticApmAgent private constructor( apmServerConnectivityManager, elasticClockManager, centralConfigurationManager, + InstrumentationManager.create(application), sessionManager ) } diff --git a/android-sdk/src/main/java/co/elastic/otel/android/internal/api/ManagedElasticOtelAgent.kt b/android-sdk/src/main/java/co/elastic/otel/android/internal/api/ManagedElasticOtelAgent.kt index ca1ab9210..7cb87bfac 100644 --- a/android-sdk/src/main/java/co/elastic/otel/android/internal/api/ManagedElasticOtelAgent.kt +++ b/android-sdk/src/main/java/co/elastic/otel/android/internal/api/ManagedElasticOtelAgent.kt @@ -19,17 +19,23 @@ package co.elastic.otel.android.internal.api import co.elastic.otel.android.api.ElasticOtelAgent +import co.elastic.otel.android.api.internal.MetricFlusher import io.opentelemetry.sdk.OpenTelemetrySdk +import io.opentelemetry.sdk.common.CompletableResultCode abstract class ManagedElasticOtelAgent( private val configuration: Configuration -) : ElasticOtelAgent { +) : ElasticOtelAgent, MetricFlusher { final override fun close() { onClose() configuration.openTelemetrySdk.close() } + override fun flushMetrics(): CompletableResultCode { + return configuration.openTelemetrySdk.sdkMeterProvider.forceFlush() + } + protected abstract fun onClose() data class Configuration( diff --git a/android-sdk/src/main/java/co/elastic/otel/android/internal/features/instrumentation/InstrumentationManager.kt b/android-sdk/src/main/java/co/elastic/otel/android/internal/features/instrumentation/InstrumentationManager.kt new file mode 100644 index 000000000..987c99436 --- /dev/null +++ b/android-sdk/src/main/java/co/elastic/otel/android/internal/features/instrumentation/InstrumentationManager.kt @@ -0,0 +1,45 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package co.elastic.otel.android.internal.features.instrumentation + +import android.app.Application +import co.elastic.otel.android.api.ElasticOtelAgent +import co.elastic.otel.android.instrumentation.internal.Instrumentation +import java.util.ServiceLoader + +internal class InstrumentationManager( + private val application: Application, + private val instrumentations: List +) { + + companion object { + internal fun create(application: Application): InstrumentationManager { + return InstrumentationManager( + application, + ServiceLoader.load(Instrumentation::class.java).toList() + ) + } + } + + fun initialize(agent: ElasticOtelAgent) { + instrumentations.forEach { + it.install(application, agent) + } + } +} \ No newline at end of file diff --git a/android-sdk/src/main/java/co/elastic/otel/android/internal/opentelemetry/ElasticOpenTelemetryBuilder.kt b/android-sdk/src/main/java/co/elastic/otel/android/internal/opentelemetry/ElasticOpenTelemetryBuilder.kt index b2a10c932..fd0809c95 100644 --- a/android-sdk/src/main/java/co/elastic/otel/android/internal/opentelemetry/ElasticOpenTelemetryBuilder.kt +++ b/android-sdk/src/main/java/co/elastic/otel/android/internal/opentelemetry/ElasticOpenTelemetryBuilder.kt @@ -132,7 +132,7 @@ abstract class ElasticOpenTelemetryBuilder { return this as B } - internal open fun setProcessorFactory(value: ProcessorFactory): B { + fun setProcessorFactory(value: ProcessorFactory): B { checkNotBuilt() processorFactory = value return this as B diff --git a/android-test/app/build.gradle.kts b/android-test/app/build.gradle.kts deleted file mode 100644 index 4bfab1288..000000000 --- a/android-test/app/build.gradle.kts +++ /dev/null @@ -1,62 +0,0 @@ -plugins { - alias(rootLibs.plugins.androidApp) - alias(rootLibs.plugins.kotlin.android) - id("co.elastic.otel.android") -} - -android { - namespace = "co.elastic.apm.android.test" - compileSdk = rootProject.extra["androidCompileSdk"] as Int - val agentVersion = rootProject.extra["agentVersion"] as String - testOptions { - unitTests { - isIncludeAndroidResources = true - all { - it.systemProperty("agentVersion", agentVersion) - } - } - animationsDisabled = true - } - defaultConfig { - applicationId = "co.elastic.apm.android.test" - minSdk = rootProject.extra["androidMinSdk"] as Int - targetSdk = rootProject.extra["androidCompileSdk"] as Int - versionCode = 5 - versionName = "1.0" - - testInstrumentationRunner = "co.elastic.apm.android.test.base.TestRunner" - } - buildFeatures { - buildConfig = true - } - - buildTypes { - release { - isMinifyEnabled = false - proguardFiles("proguard-rules.pro") - } - } - val jvmCompatibility = rootProject.extra["jvmCompatibility"] as JavaVersion - compileOptions { - sourceCompatibility = jvmCompatibility - targetCompatibility = jvmCompatibility - isCoreLibraryDesugaringEnabled = true - } - kotlinOptions { - jvmTarget = jvmCompatibility.toString() - } -} - -dependencies { - implementation(libs.appCompat) - implementation(libs.espresso.idlingResource) - implementation(libs.fragmentTesting) - coreLibraryDesugaring(libs.coreLib) - testImplementation(libs.openTelemetry.exporter) - testImplementation(libs.robolectric) - testImplementation(libs.mockito) - testImplementation(libs.mockWebServer) - androidTestImplementation(libs.espresso.core) - androidTestImplementation(libs.espresso.contrib) - androidTestImplementation(libs.mockWebServer) -} \ No newline at end of file diff --git a/android-test/app/src/androidTest/java/co/elastic/apm/android/test/CoroutineInstrumentationTest.java b/android-test/app/src/androidTest/java/co/elastic/apm/android/test/CoroutineInstrumentationTest.java deleted file mode 100644 index f1cb80283..000000000 --- a/android-test/app/src/androidTest/java/co/elastic/apm/android/test/CoroutineInstrumentationTest.java +++ /dev/null @@ -1,42 +0,0 @@ -package co.elastic.apm.android.test; - -import androidx.test.filters.LargeTest; - -import org.junit.Ignore; -import org.junit.Test; - -import java.util.List; - -import co.elastic.apm.android.test.activities.CoroutineActivity; -import co.elastic.apm.android.test.base.ActivityEspressoTest; -import co.elastic.apm.android.test.common.spans.Spans; -import io.opentelemetry.sdk.trace.data.SpanData; - -@Ignore("Not yet implemented") -@LargeTest -public class CoroutineInstrumentationTest extends ActivityEspressoTest { - - @Test - public void onCreation_whenCoroutineGetsLaunched_propagateCurrentSpanContext() { - List spans = getRecordedSpans(7); - - SpanData onCreateSpan = spans.get(0); - SpanData myCoroutineSpan = spans.get(1); - - Spans.verify(onCreateSpan) - .hasNoParent(); - - Spans.verify(myCoroutineSpan) - .isNamed("My span inside a coroutine") - .isDirectChildOf(onCreateSpan); - } - - private List getRecordedSpans(int i) { - return null; - } - - @Override - protected Class getActivityClass() { - return CoroutineActivity.class; - } -} diff --git a/android-test/app/src/androidTest/java/co/elastic/apm/android/test/base/ActivityEspressoTest.java b/android-test/app/src/androidTest/java/co/elastic/apm/android/test/base/ActivityEspressoTest.java deleted file mode 100644 index 24c98d952..000000000 --- a/android-test/app/src/androidTest/java/co/elastic/apm/android/test/base/ActivityEspressoTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package co.elastic.apm.android.test.base; - -import android.app.Activity; - -import androidx.test.core.app.ActivityScenario; -import androidx.test.espresso.IdlingRegistry; -import androidx.test.espresso.IdlingResource; - -import org.junit.After; -import org.junit.Before; - -import co.elastic.apm.android.test.activities.espresso.IdlingResourceProvider; - -public abstract class ActivityEspressoTest { - private IdlingResource idlingResource; - protected T activity; - - @Before - public void activitySetUp() { - onBefore(); - try (ActivityScenario scenario = ActivityScenario.launch(getActivityClass())) { - scenario.onActivity(activity -> { - if (activity instanceof IdlingResourceProvider) { - idlingResource = ((IdlingResourceProvider) activity).getIdlingResource(); - IdlingRegistry.getInstance().register(idlingResource); - } - this.activity = activity; - onActivity(activity); - }); - } - } - - protected void onActivity(T activity) { - - } - - protected void onBefore() { - - } - - protected void onAfter() { - - } - - @After - public void cleanUp() { - onAfter(); - if (idlingResource != null) { - IdlingRegistry.getInstance().unregister(idlingResource); - idlingResource = null; - } - } - - protected abstract Class getActivityClass(); -} diff --git a/android-test/app/src/androidTest/java/co/elastic/apm/android/test/base/TestRunner.java b/android-test/app/src/androidTest/java/co/elastic/apm/android/test/base/TestRunner.java deleted file mode 100644 index f2e7c64ed..000000000 --- a/android-test/app/src/androidTest/java/co/elastic/apm/android/test/base/TestRunner.java +++ /dev/null @@ -1,16 +0,0 @@ -package co.elastic.apm.android.test.base; - -import android.app.Application; -import android.content.Context; - -import androidx.test.runner.AndroidJUnitRunner; - -public class TestRunner extends AndroidJUnitRunner { - public static Application application; - - @Override - public Application newApplication(ClassLoader cl, String className, Context context) throws ClassNotFoundException, IllegalAccessException, InstantiationException { - application = super.newApplication(cl, className, context); - return application; - } -} diff --git a/android-test/app/src/androidTest/java/co/elastic/apm/android/test/okhttp/NetworkCallingActivityTest.java b/android-test/app/src/androidTest/java/co/elastic/apm/android/test/okhttp/NetworkCallingActivityTest.java deleted file mode 100644 index b39a70821..000000000 --- a/android-test/app/src/androidTest/java/co/elastic/apm/android/test/okhttp/NetworkCallingActivityTest.java +++ /dev/null @@ -1,183 +0,0 @@ -package co.elastic.apm.android.test.okhttp; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.fail; - -import androidx.annotation.NonNull; - -import org.junit.After; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; - -import java.io.IOException; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicReference; -import java.util.function.Consumer; - -import okhttp3.Call; -import okhttp3.Callback; -import okhttp3.HttpUrl; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; -import okhttp3.mockwebserver.MockResponse; -import okhttp3.mockwebserver.MockWebServer; -import okhttp3.mockwebserver.RecordedRequest; - -@Ignore("Not yet implemented.") -public class NetworkCallingActivityTest { - private OkHttpClient.Builder clientBuilder; - private MockWebServer webServer; - - @Before - public void setUp() { - webServer = new MockWebServer(); - try { - webServer.start(); - clientBuilder = new OkHttpClient.Builder(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @After - public void tearDown() { - try { - webServer.shutdown(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Test - public void whenOtherOkhttpInterceptorsAreSet_propagateParentContext() throws InterruptedException { - clientBuilder.addInterceptor(chain -> { - Request request = chain.request(); - return chain.proceed(request.newBuilder().addHeader("MY-HEADER", "My header value").build()); - }); - -// Span span = ElasticTracers.androidActivity().spanBuilder("Http parent span").startSpan(); -// try (Scope ignored = span.makeCurrent()) { -// executeSuccessfulHttpCall(200, "{}", Collections.emptyMap()); -// } -// span.end(); - - RecordedRequest recordedRequest = webServer.takeRequest(1, TimeUnit.SECONDS); - - assertNotNull(recordedRequest.getHeader("MY-HEADER")); - assertNotNull(recordedRequest.getHeader("traceparent")); - } - - @Test - public void verifyHttpSpanStructure_whenSucceeded() { - Map responseHeaders = new HashMap<>(); - responseHeaders.put("Content-Length", "2"); - executeSuccessfulHttpCall(200, "{}", responseHeaders); - -// List spans = getRecordedSpans(1); -// SpanData httpSpan = spans.get(0); - -// Spans.verify(httpSpan) -// .isNamed("HTTP") -// .isOfKind(SpanKind.CLIENT); - } - - @Test - public void verifyHttpSpanStructure_whenReceivingHttpError() { - executeSuccessfulHttpCall(500); - -// List spans = getRecordedSpans(1); -// SpanData httpSpan = spans.get(0); - -// Spans.verifyFailed(httpSpan) -// .isNamed("HTTP") -// .isOfKind(SpanKind.CLIENT); - } - - @Test - public void verifyHttpSpanStructure_whenFailed() { - executeFailedHttpCall(); - -// List spans = getRecordedSpans(1); -// SpanData httpSpan = spans.get(0); - -// Spans.verifyFailed(httpSpan) -// .isNamed("HTTP") -// .isOfKind(SpanKind.CLIENT) -// .hasAmountOfRecordedExceptions(1); - } - - @Test - public void whenHttpInstrumentationIsDisabled_doNotSendAnyOkHttpSpans() { -// ElasticApmConfiguration configuration = ElasticApmConfiguration.builder().setInstrumentationConfiguration(InstrumentationConfiguration.builder() -// .enableHttpTracing(false) -// .build()).build(); -// overrideAgentConfiguration(configuration); - - executeSuccessfulHttpCall(200); - -// getRecordedSpans(0); - } - - private void executeSuccessfulHttpCall(int responseCode) { - executeSuccessfulHttpCall(responseCode, "{}", Collections.emptyMap()); - } - - private void executeSuccessfulHttpCall(int responseCode, String responseBody, Map responseHeaders) { - MockResponse mockResponse = new MockResponse().setResponseCode(responseCode).setBody(responseBody); - responseHeaders.forEach(mockResponse::addHeader); - webServer.enqueue(mockResponse); - AtomicReference responseStr = new AtomicReference<>(""); - try { - executeHttpCall(new Request.Builder().url(webServer.url("/")).build(), response -> { - try { - responseStr.set(response.body().string()); - } catch (IOException e) { - fail(e.getMessage()); - } - }); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - assertEquals("{}", responseStr.get()); - } - - private void executeFailedHttpCall() { - HttpUrl url = webServer.url("/"); - try { - webServer.shutdown(); - } catch (IOException e) { - throw new RuntimeException(e); - } - - try { - executeHttpCall(new Request.Builder().url(url).build(), response -> { - }); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } - - private void executeHttpCall(Request request, Consumer responseConsumer) throws InterruptedException { - CountDownLatch latch = new CountDownLatch(1); - clientBuilder.build().newCall(request).enqueue(new Callback() { - @Override - public void onFailure(@NonNull Call call, @NonNull IOException e) { - latch.countDown(); - } - - @Override - public void onResponse(@NonNull Call call, @NonNull Response response) { - responseConsumer.accept(response); - latch.countDown(); - } - }); - latch.await(1, TimeUnit.SECONDS); - } -} \ No newline at end of file diff --git a/android-test/app/src/main/AndroidManifest.xml b/android-test/app/src/main/AndroidManifest.xml deleted file mode 100644 index 125c72fca..000000000 --- a/android-test/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/android-test/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/android-test/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d114..000000000 --- a/android-test/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/android-test/app/src/main/res/drawable/ic_launcher_background.xml b/android-test/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9cb..000000000 --- a/android-test/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android-test/app/src/main/res/layout/fragment_generic_layout.xml b/android-test/app/src/main/res/layout/fragment_generic_layout.xml deleted file mode 100644 index 77d9ef65f..000000000 --- a/android-test/app/src/main/res/layout/fragment_generic_layout.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/android-test/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/android-test/app/src/main/res/mipmap-hdpi/ic_launcher.webp deleted file mode 100644 index c209e78ec..000000000 Binary files a/android-test/app/src/main/res/mipmap-hdpi/ic_launcher.webp and /dev/null differ diff --git a/android-test/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/android-test/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp deleted file mode 100644 index b2dfe3d1b..000000000 Binary files a/android-test/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp and /dev/null differ diff --git a/android-test/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/android-test/app/src/main/res/mipmap-mdpi/ic_launcher.webp deleted file mode 100644 index 4f0f1d64e..000000000 Binary files a/android-test/app/src/main/res/mipmap-mdpi/ic_launcher.webp and /dev/null differ diff --git a/android-test/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/android-test/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp deleted file mode 100644 index 62b611da0..000000000 Binary files a/android-test/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp and /dev/null differ diff --git a/android-test/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/android-test/app/src/main/res/mipmap-xhdpi/ic_launcher.webp deleted file mode 100644 index 948a3070f..000000000 Binary files a/android-test/app/src/main/res/mipmap-xhdpi/ic_launcher.webp and /dev/null differ diff --git a/android-test/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/android-test/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp deleted file mode 100644 index 1b9a6956b..000000000 Binary files a/android-test/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp and /dev/null differ diff --git a/android-test/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/android-test/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp deleted file mode 100644 index 28d4b77f9..000000000 Binary files a/android-test/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp and /dev/null differ diff --git a/android-test/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/android-test/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp deleted file mode 100644 index 9287f5083..000000000 Binary files a/android-test/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp and /dev/null differ diff --git a/android-test/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/android-test/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp deleted file mode 100644 index aa7d6427e..000000000 Binary files a/android-test/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp and /dev/null differ diff --git a/android-test/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/android-test/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp deleted file mode 100644 index 9126ae37c..000000000 Binary files a/android-test/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp and /dev/null differ diff --git a/android-test/app/src/main/res/values/colors.xml b/android-test/app/src/main/res/values/colors.xml deleted file mode 100644 index f8c6127d3..000000000 --- a/android-test/app/src/main/res/values/colors.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - #FFBB86FC - #FF6200EE - #FF3700B3 - #FF03DAC5 - #FF018786 - #FF000000 - #FFFFFFFF - \ No newline at end of file diff --git a/android-test/app/src/main/res/values/strings.xml b/android-test/app/src/main/res/values/strings.xml deleted file mode 100644 index c138a0ab9..000000000 --- a/android-test/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - android-test - \ No newline at end of file diff --git a/android-test/app/src/main/res/values/themes.xml b/android-test/app/src/main/res/values/themes.xml deleted file mode 100644 index 33fb7cc4b..000000000 --- a/android-test/app/src/main/res/values/themes.xml +++ /dev/null @@ -1,4 +0,0 @@ - - -