├── app ├── .gitignore ├── src │ ├── main │ │ ├── res │ │ │ ├── values │ │ │ │ ├── strings.xml │ │ │ │ ├── colors.xml │ │ │ │ └── themes.xml │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.webp │ │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.webp │ │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.webp │ │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.webp │ │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.webp │ │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ ├── values-night │ │ │ │ └── themes.xml │ │ │ ├── drawable-v24 │ │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── layout │ │ │ │ └── activity_main.xml │ │ │ └── drawable │ │ │ │ └── ic_launcher_background.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── ameen │ │ │ │ └── workmanagerexample │ │ │ │ ├── WorkStatusSingleton.kt │ │ │ │ ├── worker │ │ │ │ ├── SimpleWorker.kt │ │ │ │ └── SimpleWorkerRetry.kt │ │ │ │ ├── chain │ │ │ │ ├── FirstChainWorker.kt │ │ │ │ ├── ThirdChainWorker.kt │ │ │ │ └── SecondChainWorker.kt │ │ │ │ └── MainActivity.kt │ │ └── AndroidManifest.xml │ ├── test │ │ └── java │ │ │ └── com │ │ │ └── ameen │ │ │ └── workmanagerexample │ │ │ └── ExampleUnitTest.kt │ └── androidTest │ │ └── java │ │ └── com │ │ └── ameen │ │ └── workmanagerexample │ │ └── worker │ │ ├── SimpleWorkerRetryTest.kt │ │ └── SimpleWorkerTest.kt ├── proguard-rules.pro └── build.gradle ├── .idea ├── .gitignore ├── compiler.xml ├── vcs.xml ├── misc.xml └── gradle.xml ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .gitignore ├── README.md ├── settings.gradle ├── gradle.properties ├── .circleci └── config.yml ├── gradlew.bat └── gradlew /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | WorkManagerExample 3 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AmeenAhmed1/WorkManagerExample/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AmeenAhmed1/WorkManagerExample/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AmeenAhmed1/WorkManagerExample/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AmeenAhmed1/WorkManagerExample/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AmeenAhmed1/WorkManagerExample/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AmeenAhmed1/WorkManagerExample/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AmeenAhmed1/WorkManagerExample/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AmeenAhmed1/WorkManagerExample/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AmeenAhmed1/WorkManagerExample/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AmeenAhmed1/WorkManagerExample/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AmeenAhmed1/WorkManagerExample/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/ameen/workmanagerexample/WorkStatusSingleton.kt: -------------------------------------------------------------------------------- 1 | package com.ameen.workmanagerexample 2 | 3 | object WorkStatusSingleton { 4 | var workStatus: Boolean = false 5 | var workStatusMessage: String = "" 6 | var workRetryCount: Int = 0 7 | } -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon Mar 07 13:55:27 EET 2022 2 | distributionBase=GRADLE_USER_HOME 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip 4 | distributionPath=wrapper/dists 5 | zipStorePath=wrapper/dists 6 | zipStoreBase=GRADLE_USER_HOME 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | local.properties 16 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WorkManager use-case. 2 | WorkManager use-case Examples. 3 | 4 | ### A simple project to demonstrate the user of WorkManager Jetpack Lib it includes how to use the API includes: 5 | - Worker constrains. 6 | - Single worker *[OneTime or Periodic]*. 7 | - Single worker with *Retry-BackOff Criteria*. 8 | - Complex workers use-case *[Single Chain, Group Chain and, Multiple Chain]*. 9 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | gradlePluginPortal() 4 | google() 5 | mavenCentral() 6 | } 7 | } 8 | dependencyResolutionManagement { 9 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 10 | repositories { 11 | google() 12 | mavenCentral() 13 | } 14 | } 15 | rootProject.name = "WorkManagerExample" 16 | include ':app' 17 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFBB86FC 4 | #FF6200EE 5 | #FF3700B3 6 | #FF03DAC5 7 | #FF018786 8 | #FF000000 9 | #FFFFFFFF 10 | -------------------------------------------------------------------------------- /app/src/test/java/com/ameen/workmanagerexample/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package com.ameen.workmanagerexample 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/java/com/ameen/workmanagerexample/worker/SimpleWorker.kt: -------------------------------------------------------------------------------- 1 | package com.ameen.workmanagerexample.worker 2 | 3 | import android.content.Context 4 | import androidx.work.Worker 5 | import androidx.work.WorkerParameters 6 | import com.ameen.workmanagerexample.WorkStatusSingleton 7 | 8 | class SimpleWorker(context: Context, parameters: WorkerParameters) : Worker(context, parameters) { 9 | 10 | override fun doWork(): Result { 11 | Thread.sleep(500) 12 | WorkStatusSingleton.workStatus = true 13 | WorkStatusSingleton.workStatusMessage = inputData.getString("WORK_DATA").toString() 14 | return Result.success() 15 | } 16 | } -------------------------------------------------------------------------------- /app/src/main/java/com/ameen/workmanagerexample/worker/SimpleWorkerRetry.kt: -------------------------------------------------------------------------------- 1 | package com.ameen.workmanagerexample.worker 2 | 3 | import android.content.Context 4 | import androidx.work.Worker 5 | import androidx.work.WorkerParameters 6 | import com.ameen.workmanagerexample.WorkStatusSingleton 7 | 8 | class SimpleWorkerRetry(context: Context, parameters: WorkerParameters) : 9 | Worker(context, parameters) { 10 | 11 | override fun doWork(): Result { 12 | return if (WorkStatusSingleton.workRetryCount < 3) { 13 | WorkStatusSingleton.workRetryCount++ 14 | Result.retry() 15 | } else 16 | Result.success() 17 | } 18 | } -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 12 | 13 | 14 | 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/ameen/workmanagerexample/chain/FirstChainWorker.kt: -------------------------------------------------------------------------------- 1 | package com.ameen.workmanagerexample.chain 2 | 3 | import android.content.Context 4 | import android.util.Log 5 | import androidx.work.Worker 6 | import androidx.work.WorkerParameters 7 | 8 | class FirstChainWorker(context: Context, parameters: WorkerParameters) : 9 | Worker(context, parameters) { 10 | 11 | private val TAG = "ChainWorker" 12 | 13 | override fun doWork(): Result { 14 | val success = inputData.getBoolean("isSuccess", false) 15 | 16 | Log.i(TAG, "doWork: OnFirstChainWorker") 17 | 18 | return if (success) Result.success() 19 | else Result.failure() 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/ameen/workmanagerexample/chain/ThirdChainWorker.kt: -------------------------------------------------------------------------------- 1 | package com.ameen.workmanagerexample.chain 2 | 3 | import android.content.Context 4 | import android.util.Log 5 | import androidx.work.Worker 6 | import androidx.work.WorkerParameters 7 | 8 | class ThirdChainWorker(context: Context, parameters: WorkerParameters) : 9 | Worker(context, parameters) { 10 | 11 | private val TAG = "ChainWorker" 12 | 13 | override fun doWork(): Result { 14 | val success = inputData.getBoolean("isSuccess", false) 15 | 16 | Log.i(TAG, "doWork: OnThirdChainWorker") 17 | 18 | return if (success) Result.success() 19 | else Result.failure() 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/ameen/workmanagerexample/chain/SecondChainWorker.kt: -------------------------------------------------------------------------------- 1 | package com.ameen.workmanagerexample.chain 2 | 3 | import android.content.Context 4 | import android.util.Log 5 | import androidx.work.Worker 6 | import androidx.work.WorkerParameters 7 | 8 | class SecondChainWorker(context: Context, parameters: WorkerParameters) : 9 | Worker(context, parameters) { 10 | 11 | private val TAG = "ChainWorker" 12 | 13 | override fun doWork(): Result { 14 | val success = inputData.getBoolean("isSuccess", false) 15 | 16 | Log.i(TAG, "doWork: OnSecondChainWorker") 17 | 18 | return if (success) Result.success() 19 | else Result.failure() 20 | } 21 | } -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 19 | 20 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 12 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/values-night/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/ameen/workmanagerexample/worker/SimpleWorkerRetryTest.kt: -------------------------------------------------------------------------------- 1 | package com.ameen.workmanagerexample.worker 2 | 3 | import android.content.Context 4 | import androidx.test.core.app.ApplicationProvider 5 | import androidx.test.ext.junit.runners.AndroidJUnit4 6 | import androidx.work.ListenableWorker 7 | import androidx.work.testing.TestWorkerBuilder 8 | import org.junit.Assert 9 | import org.junit.Before 10 | import org.junit.Test 11 | import org.junit.runner.RunWith 12 | import java.util.concurrent.Executor 13 | import java.util.concurrent.Executors 14 | 15 | @RunWith(AndroidJUnit4::class) 16 | class SimpleWorkerRetryTest { 17 | 18 | private lateinit var context: Context 19 | private lateinit var executor: Executor 20 | 21 | @Before 22 | fun setUp() { 23 | context = ApplicationProvider.getApplicationContext() 24 | executor = Executors.newSingleThreadExecutor() 25 | } 26 | 27 | @Test 28 | fun testSimpleWork_StartWorker_And_Return_Result_Retry() { 29 | 30 | val worker = TestWorkerBuilder( 31 | context = context, 32 | executor = executor 33 | ).build() 34 | 35 | val result = worker.doWork() 36 | Assert.assertEquals(ListenableWorker.Result.retry(), result) 37 | } 38 | } -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | # AndroidX package structure to make it clearer which packages are bundled with the 15 | # Android operating system, and which are packaged with your app"s APK 16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 17 | android.useAndroidX=true 18 | # Kotlin code style for this project: "official" or "obsolete": 19 | kotlin.code.style=official 20 | # Enables namespacing of each library's R class so that its R class includes only the 21 | # resources declared in the library itself and none from the library's dependencies, 22 | # thereby reducing the size of the R class for that library 23 | android.nonTransitiveRClass=true -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.android.application' 3 | id 'org.jetbrains.kotlin.android' 4 | } 5 | 6 | android { 7 | compileSdk 32 8 | 9 | defaultConfig { 10 | applicationId "com.ameen.workmanagerexample" 11 | minSdk 26 12 | targetSdk 32 13 | versionCode 1 14 | versionName "1.0" 15 | 16 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 17 | } 18 | 19 | buildTypes { 20 | release { 21 | minifyEnabled false 22 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 23 | } 24 | } 25 | compileOptions { 26 | sourceCompatibility JavaVersion.VERSION_1_8 27 | targetCompatibility JavaVersion.VERSION_1_8 28 | } 29 | kotlinOptions { 30 | jvmTarget = '1.8' 31 | } 32 | buildFeatures { 33 | viewBinding true 34 | } 35 | } 36 | 37 | dependencies { 38 | 39 | implementation 'androidx.core:core-ktx:1.7.0' 40 | implementation 'androidx.appcompat:appcompat:1.4.1' 41 | implementation 'com.google.android.material:material:1.5.0' 42 | implementation 'androidx.constraintlayout:constraintlayout:2.1.3' 43 | testImplementation 'junit:junit:4.13.2' 44 | androidTestImplementation 'androidx.test.ext:junit:1.1.3' 45 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' 46 | 47 | implementation "androidx.work:work-runtime:2.7.1" 48 | implementation "androidx.work:work-runtime-ktx:2.7.1" 49 | androidTestImplementation("androidx.work:work-testing:2.7.1") 50 | 51 | 52 | } -------------------------------------------------------------------------------- /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2.1 2 | 3 | config_docker: &config_docker 4 | docker: 5 | - image: cimg/android:2021.10.2 6 | resource_class: large 7 | working_directory: ~/code 8 | 9 | config_android: &config_env 10 | environment: 11 | JAVA_HOME: "/usr/lib/jvm/java-11-openjdk-amd64" 12 | JAVA_TOOL_OPTIONS: "-Xmx4096m -XX:+UseParallelGC" 13 | GRADLE_OPTS: "-Dorg.gradle.daemon=true -Dorg.gradle.workers.max=2 -Dkotlin.incremental=true -Dkotlin.compiler.execution.strategy=in-process" 14 | TERM: dumb 15 | 16 | 17 | filter_master_only: &filter_master_only 18 | filters: 19 | branches: 20 | only: master, dev 21 | 22 | 23 | jobs: 24 | job_run_tests: 25 | <<: *config_docker 26 | <<: *config_env 27 | steps: 28 | - checkout 29 | - run: 30 | name: Run Tests 31 | command: ./gradlew test 32 | - run: 33 | name: Save test results (html page, see Artifacts) 34 | command: | 35 | mkdir -p test-results/html/ 36 | find . -type d -regex ".*/*reports/tests" -exec cp -avr {} test-results/html/ \; 37 | when: always 38 | - run: 39 | name: Save test results (xml results, see Tests) 40 | command: | 41 | mkdir -p test-results/xml/ 42 | find . -type f -regex ".*/*test-results/.*xml" -exec cp {} test-results/xml/ \; 43 | when: always 44 | - store_test_results: 45 | path: test-results 46 | - store_artifacts: 47 | path: test-results 48 | destination: reports/ 49 | 50 | workflows: 51 | version: 2 52 | 53 | # run tests on every commits to master 54 | run-tests-only: 55 | jobs: 56 | - job_run_tests -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/ameen/workmanagerexample/worker/SimpleWorkerTest.kt: -------------------------------------------------------------------------------- 1 | package com.ameen.workmanagerexample.worker 2 | 3 | import android.content.Context 4 | import androidx.test.core.app.ApplicationProvider 5 | import androidx.test.ext.junit.runners.AndroidJUnit4 6 | import androidx.work.ListenableWorker 7 | import androidx.work.testing.TestWorkerBuilder 8 | import androidx.work.workDataOf 9 | import com.ameen.workmanagerexample.chain.FirstChainWorker 10 | import org.hamcrest.MatcherAssert 11 | import org.hamcrest.Matchers 12 | import org.junit.Assert.assertEquals 13 | import org.junit.Before 14 | import org.junit.Test 15 | import org.junit.runner.RunWith 16 | import java.util.concurrent.Executor 17 | import java.util.concurrent.Executors 18 | 19 | @RunWith(AndroidJUnit4::class) 20 | class SimpleWorkerTest { 21 | 22 | private lateinit var context: Context 23 | private lateinit var executor: Executor 24 | 25 | @Before 26 | fun setUp() { 27 | context = ApplicationProvider.getApplicationContext() 28 | executor = Executors.newSingleThreadExecutor() 29 | } 30 | 31 | @Test 32 | fun testSimpleWork_StartWorker_And_Return_Result_Success() { 33 | 34 | val worker = TestWorkerBuilder( 35 | context = context, 36 | executor = executor 37 | ).build() 38 | 39 | val result = worker.doWork() 40 | assertEquals(ListenableWorker.Result.success(), result) 41 | } 42 | 43 | @Test 44 | fun testWorker_If_InputData_True_Return_Success() { 45 | val worker = TestWorkerBuilder( 46 | context = context, 47 | executor = executor, 48 | inputData = workDataOf("isSuccess" to true) 49 | ).build() 50 | 51 | val result = worker.doWork() 52 | MatcherAssert.assertThat(result, Matchers.`is`(ListenableWorker.Result.success())) 53 | } 54 | 55 | 56 | @Test 57 | fun testWorker_If_InputData_False_Return_Fail() { 58 | val worker = TestWorkerBuilder( 59 | context = context, 60 | executor = executor, 61 | inputData = workDataOf("isSuccess" to false) 62 | ).build() 63 | 64 | val result = worker.doWork() 65 | MatcherAssert.assertThat(result, Matchers.`is`(ListenableWorker.Result.failure())) 66 | } 67 | } -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 |