From 69948af1d103a44ee99f4044e0c02d196e9e04a2 Mon Sep 17 00:00:00 2001 From: Agrebennicov Date: Tue, 1 Apr 2025 11:58:05 +0300 Subject: [PATCH] Add how to reproduce to the demo app --- app/build.gradle | 10 ++++++++ app/src/main/AndroidManifest.xml | 6 +++++ app/src/main/java/com/exponea/example/App.kt | 15 ++++++++++- .../exponea/example/test/ContentWorkerUtil.kt | 18 +++++++++++++ .../com/exponea/example/test/TestModule.kt | 25 +++++++++++++++++++ .../java/com/exponea/example/test/TestRepo.kt | 13 ++++++++++ .../com/exponea/example/test/TestWorker.kt | 23 +++++++++++++++++ .../example/view/AuthenticationActivity.kt | 11 +++++++- build.gradle | 1 + 9 files changed, 120 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/exponea/example/test/ContentWorkerUtil.kt create mode 100644 app/src/main/java/com/exponea/example/test/TestModule.kt create mode 100644 app/src/main/java/com/exponea/example/test/TestRepo.kt create mode 100644 app/src/main/java/com/exponea/example/test/TestWorker.kt diff --git a/app/build.gradle b/app/build.gradle index 04563127..f5ca4529 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,5 +1,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' +apply plugin: 'dagger.hilt.android.plugin' +apply plugin: 'kotlin-kapt' if (getGradle().getStartParameter().getTaskRequests().toString().toLowerCase().contains("gms")) { apply plugin: 'com.google.gms.google-services' @@ -57,6 +59,9 @@ android { dimension = "messagingService" } } + kapt { + correctErrorTypes = true + } } dependencies { @@ -67,11 +72,16 @@ dependencies { implementation 'androidx.preference:preference-ktx:1.2.0' implementation 'androidx.navigation:navigation-fragment-ktx:2.5.3' implementation 'androidx.navigation:navigation-ui-ktx:2.5.3' + implementation 'androidx.hilt:hilt-common:1.2.0' + implementation 'androidx.work:work-runtime-ktx:2.10.0' + implementation 'androidx.hilt:hilt-work:1.2.0' gmsImplementation 'com.google.firebase:firebase-messaging:23.1.0' hmsImplementation 'com.huawei.agconnect:agconnect-core:1.7.3.302' hmsImplementation 'com.huawei.hms:push:6.11.0.300' implementation 'com.squareup.okhttp3:okhttp:4.12.0' implementation 'com.google.code.gson:gson:2.10.1' + implementation "com.google.dagger:hilt-android:2.51.1" + kapt "com.google.dagger:hilt-android-compiler:2.51.1" implementation project(path: ':sdk') } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 10053e08..581183c5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -56,5 +56,11 @@ android:name="ExponeaAuthProvider" android:value="com.exponea.example.services.ExampleAuthProvider" /> + + diff --git a/app/src/main/java/com/exponea/example/App.kt b/app/src/main/java/com/exponea/example/App.kt index cf9f3c56..fa289ffe 100644 --- a/app/src/main/java/com/exponea/example/App.kt +++ b/app/src/main/java/com/exponea/example/App.kt @@ -1,9 +1,17 @@ package com.exponea.example import android.app.Application +import androidx.hilt.work.HiltWorkerFactory +import androidx.work.Configuration import com.exponea.example.managers.RegisteredIdManager +import dagger.hilt.android.HiltAndroidApp +import javax.inject.Inject + +@HiltAndroidApp +class App : Application(), Configuration.Provider { + @Inject + lateinit var workerFactory: HiltWorkerFactory -class App : Application() { companion object { lateinit var instance: App } @@ -19,4 +27,9 @@ class App : Application() { // Create our RegisteredIDManager to get the registered ID. registeredIdManager = RegisteredIdManager(this) } + + override val workManagerConfiguration: Configuration + get() = Configuration.Builder() + .setWorkerFactory(workerFactory) + .build() } diff --git a/app/src/main/java/com/exponea/example/test/ContentWorkerUtil.kt b/app/src/main/java/com/exponea/example/test/ContentWorkerUtil.kt new file mode 100644 index 00000000..26bf6b1d --- /dev/null +++ b/app/src/main/java/com/exponea/example/test/ContentWorkerUtil.kt @@ -0,0 +1,18 @@ +package com.exponea.example.test + +import androidx.work.ExistingWorkPolicy +import androidx.work.OneTimeWorkRequest +import androidx.work.WorkManager + +class TestWorkerUtil(private val workManager: WorkManager) { + + fun startWork() { + workManager.beginUniqueWork( + "testWorkerJobId", + ExistingWorkPolicy.KEEP, + OneTimeWorkRequest + .Builder(TestWorker::class.java) + .build() + ).enqueue() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/exponea/example/test/TestModule.kt b/app/src/main/java/com/exponea/example/test/TestModule.kt new file mode 100644 index 00000000..1fc5fd9f --- /dev/null +++ b/app/src/main/java/com/exponea/example/test/TestModule.kt @@ -0,0 +1,25 @@ +package com.exponea.example.test + + +import android.content.Context +import androidx.work.WorkManager +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent + +@Module +@InstallIn(SingletonComponent::class) +class TestModule { + @Provides + fun provideWorkManager( + @ApplicationContext context: Context, + ): WorkManager = WorkManager.getInstance(context) + + @Provides + fun provideContentWorkerUtil(workManager: WorkManager) = TestWorkerUtil(workManager) + + @Provides + fun provideTestRepo() = TestRepo() +} diff --git a/app/src/main/java/com/exponea/example/test/TestRepo.kt b/app/src/main/java/com/exponea/example/test/TestRepo.kt new file mode 100644 index 00000000..682d6e1a --- /dev/null +++ b/app/src/main/java/com/exponea/example/test/TestRepo.kt @@ -0,0 +1,13 @@ +package com.exponea.example.test + +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.withContext + +class TestRepo { + suspend fun fetchData() { + withContext(Dispatchers.IO) { + delay(2000L) + } + } +} diff --git a/app/src/main/java/com/exponea/example/test/TestWorker.kt b/app/src/main/java/com/exponea/example/test/TestWorker.kt new file mode 100644 index 00000000..eb68f699 --- /dev/null +++ b/app/src/main/java/com/exponea/example/test/TestWorker.kt @@ -0,0 +1,23 @@ +package com.exponea.example.test + +import android.content.Context +import androidx.hilt.work.HiltWorker +import androidx.work.CoroutineWorker +import androidx.work.WorkerParameters +import dagger.assisted.Assisted +import dagger.assisted.AssistedInject + +@HiltWorker +class TestWorker @AssistedInject constructor( + @Assisted val appContext: Context, + @Assisted val workerParams: WorkerParameters, + private val testRepo: TestRepo +) : CoroutineWorker(appContext, workerParams) { + + override suspend fun doWork(): Result { + println("### Test worker do work") + testRepo.fetchData() + println("### Test worker job complete") + return Result.success() + } +} diff --git a/app/src/main/java/com/exponea/example/view/AuthenticationActivity.kt b/app/src/main/java/com/exponea/example/view/AuthenticationActivity.kt index 94e553d9..4c8be71c 100644 --- a/app/src/main/java/com/exponea/example/view/AuthenticationActivity.kt +++ b/app/src/main/java/com/exponea/example/view/AuthenticationActivity.kt @@ -8,6 +8,7 @@ import androidx.appcompat.app.AppCompatActivity import com.exponea.example.App import com.exponea.example.databinding.ActivityAuthenticationBinding import com.exponea.example.managers.CustomerTokenStorage +import com.exponea.example.test.TestWorkerUtil import com.exponea.example.utils.isVaildUrl import com.exponea.example.utils.isValid import com.exponea.example.utils.onTextChanged @@ -15,7 +16,10 @@ import com.exponea.sdk.Exponea import com.exponea.sdk.models.ExponeaConfiguration import com.exponea.sdk.models.ExponeaConfiguration.TokenFrequency.EVERY_LAUNCH import com.exponea.sdk.models.FlushMode +import dagger.hilt.android.AndroidEntryPoint +import javax.inject.Inject +@AndroidEntryPoint class AuthenticationActivity : AppCompatActivity() { var projectToken = "" @@ -26,6 +30,9 @@ class AuthenticationActivity : AppCompatActivity() { private lateinit var viewBinding: ActivityAuthenticationBinding + @Inject + lateinit var testWorkerUtil: TestWorkerUtil + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) viewBinding = ActivityAuthenticationBinding.inflate(layoutInflater) @@ -47,9 +54,11 @@ class AuthenticationActivity : AppCompatActivity() { viewBinding.button.setOnClickListener { if (!viewBinding.editTextProjectToken.isValid() || !viewBinding.editTextAuthCode.isValid() || - !viewBinding.editTextApiUrl.isVaildUrl()) { + !viewBinding.editTextApiUrl.isVaildUrl() + ) { Toast.makeText(this, "Empty field", Toast.LENGTH_SHORT).show() } else { + testWorkerUtil.startWork() initSdk() } } diff --git a/build.gradle b/build.gradle index 76be826a..64f00f9b 100644 --- a/build.gradle +++ b/build.gradle @@ -32,6 +32,7 @@ buildscript { plugins { // version must match used kotlin, find full version: https://github.com/google/ksp/releases id 'com.google.devtools.ksp' version "$kotlin_version-1.0.13" apply false + id("com.google.dagger.hilt.android") version "2.51.1" apply false } apply plugin: 'io.codearte.nexus-staging'