Skip to content
This repository was archived by the owner on Jan 10, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions WorkManagerSample/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'dagger.hilt.android.plugin'

android {
compileSdkVersion build_versions.compile_sdk
Expand Down Expand Up @@ -66,6 +68,11 @@ dependencies {
implementation deps.retrofit.gson
implementation deps.okhttp_logging_interceptor
implementation deps.glide.runtime
implementation deps.hilt.dagger_hilt_android
kapt deps.hilt.hilt_compiler
implementation deps.hilt.hilt_work
kapt deps.hilt.androidx_hilt_compiler
implementation deps.app_startup

testImplementation deps.junit
androidTestImplementation deps.atsl.ext_junit
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,25 @@ package com.example.background

import android.app.Application
import android.util.Log
import androidx.hilt.work.HiltWorkerFactory
import androidx.work.Configuration
import androidx.work.WorkManager
import com.example.background.workers.RenameWorkerFactory
import dagger.hilt.android.HiltAndroidApp
import java.util.concurrent.Executors
import javax.inject.Inject

/**
* The [Application]. Responsible for initializing [WorkManager] in [Log.VERBOSE] mode.
*/
@HiltAndroidApp
class App : Application(), Configuration.Provider {

@Inject lateinit var workerFactory: HiltWorkerFactory

override fun getWorkManagerConfiguration() =
Configuration.Builder()
.setWorkerFactory(RenameWorkerFactory())
.setWorkerFactory(workerFactory)
.setMinimumLoggingLevel(Log.VERBOSE)
.build()
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,13 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.work.WorkInfo
import com.bumptech.glide.Glide
import com.example.background.databinding.ActivityFilterBinding
import dagger.hilt.android.AndroidEntryPoint

/** The [android.app.Activity] where the user picks filters to be applied on an image. */
@AndroidEntryPoint
class FilterActivity : AppCompatActivity() {

private val viewModel: FilterViewModel by viewModels { FilterViewModelFactory(application) }
private val viewModel: FilterViewModel by viewModels()
private var outputImageUri: Uri? = null

override fun onCreate(savedInstanceState: Bundle?) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,22 @@

package com.example.background

import android.app.Application
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.map
import androidx.work.WorkInfo
import androidx.work.WorkManager
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject

/**
* A [ViewModel] for [FilterActivity].
*
* Keeps track of pending image filter operations.
*/
class FilterViewModel(application: Application) : ViewModel() {
@HiltViewModel
class FilterViewModel @Inject constructor(
private val workManager: WorkManager
) : ViewModel() {

private val workManager = WorkManager.getInstance(application)
//private val workManager = WorkManager.getInstance(application)

internal val workInfo =
workManager.getWorkInfosByTagLiveData(Constants.TAG_OUTPUT)
Expand All @@ -43,7 +44,7 @@ class FilterViewModel(application: Application) : ViewModel() {
workManager.cancelUniqueWork(Constants.IMAGE_MANIPULATION_WORK_NAME)
}
}

/*
class FilterViewModelFactory(private val application: Application) : ViewModelProvider.Factory {

override fun <T : ViewModel?> create(modelClass: Class<T>): T {
Expand All @@ -53,4 +54,4 @@ class FilterViewModelFactory(private val application: Application) : ViewModelPr
throw IllegalArgumentException("Unknown ViewModel class")
}
}
}
}*/
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,15 @@ import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import com.example.background.databinding.ActivitySelectBinding
import com.google.android.material.snackbar.Snackbar
import dagger.hilt.android.AndroidEntryPoint
import java.util.ArrayList

/**
* Helps select an image for the [FilterActivity] and handles permission requests.
*
* There are two sources for the images: [MediaStore] and [StockImages].
*/
@AndroidEntryPoint
class SelectImageActivity : AppCompatActivity() {

private var permissionRequestCount = 0
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.example.background.di

import android.content.Context
import android.util.Log
import androidx.startup.Initializer
import androidx.work.Configuration
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
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
object WorkManagerInitModule : Initializer<WorkManager> {
@Provides
@Singleton
override fun create(@ApplicationContext context: Context): WorkManager {
val configuration = Configuration.Builder().build()
WorkManager.initialize(context, configuration)
Log.d("Hilt Init", "WorkManager initialized by Hilt this time")
return WorkManager.getInstance(context)
}

override fun dependencies(): List<Class<out Initializer<*>>> {
return emptyList()
}
}
1 change: 1 addition & 0 deletions WorkManagerSample/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ buildscript {

dependencies {
classpath "com.android.tools.build:gradle:${versions.android_gradle_plugin}"
classpath deps.hilt.hilt_gradle_plugin
classpath deps.kotlin.plugin
classpath deps.benchmark_gradle
}
Expand Down
6 changes: 6 additions & 0 deletions WorkManagerSample/lib/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@

apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'dagger.hilt.android.plugin'

android {
compileSdkVersion build_versions.compile_sdk
Expand Down Expand Up @@ -53,6 +55,10 @@ dependencies {
implementation deps.retrofit.gson
implementation deps.okhttp_logging_interceptor
implementation deps.glide.runtime
implementation deps.hilt.hilt_common
implementation deps.hilt.dagger_hilt_android
implementation deps.hilt.hilt_work
kapt deps.hilt.hilt_compiler

testImplementation deps.junit

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,22 @@ package com.example.background.workers
import android.content.Context
import android.util.Log
import androidx.annotation.VisibleForTesting
import androidx.hilt.work.HiltWorker
import androidx.work.CoroutineWorker
import androidx.work.WorkerParameters
import com.example.background.Constants
import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import java.io.File

/** Clears temporary files. */
class CleanupWorker(appContext: Context, workerParams: WorkerParameters) :
@HiltWorker
class CleanupWorker @AssistedInject constructor(
@Assisted appContext: Context,
@Assisted workerParams: WorkerParameters
) :
CoroutineWorker(appContext, workerParams) {

@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,20 +23,27 @@ import android.net.Uri
import android.provider.MediaStore
import android.provider.MediaStore.Images.Media
import android.util.Log
import androidx.hilt.work.HiltWorker
import androidx.work.CoroutineWorker
import androidx.work.Data
import androidx.work.ForegroundInfo
import androidx.work.WorkerParameters
import com.example.background.Constants
import com.example.background.library.R
import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale

/**
* Saves an output image to the [MediaStore].
*/
class SaveImageToGalleryWorker(appContext: Context, workerParams: WorkerParameters) :
@HiltWorker
class SaveImageToGalleryWorker @AssistedInject constructor(
@Assisted appContext: Context,
@Assisted workerParams: WorkerParameters
) :
CoroutineWorker(appContext, workerParams) {

override suspend fun doWork(): Result {
Expand Down Expand Up @@ -70,8 +77,11 @@ class SaveImageToGalleryWorker(appContext: Context, workerParams: WorkerParamete

override suspend fun getForegroundInfo(): ForegroundInfo {
return ForegroundInfo(
NOTIFICATION_ID, createNotification(applicationContext, id,
applicationContext.getString(R.string.notification_title_saving_image)))
NOTIFICATION_ID, createNotification(
applicationContext, id,
applicationContext.getString(R.string.notification_title_saving_image)
)
)
}

companion object {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,24 @@ import android.content.Context
import android.net.Uri
import android.util.Log
import android.widget.Toast
import androidx.hilt.work.HiltWorker
import androidx.work.Data
import androidx.work.Worker
import androidx.work.WorkerParameters
import androidx.work.workDataOf
import com.example.background.Constants
import com.example.background.imgur.ImgurApi
import dagger.assisted.Assisted
import dagger.assisted.AssistedInject

/**
* Uploads an image to Imgur using the [ImgurApi].
*/
class UploadWorker(appContext: Context, workerParams: WorkerParameters) :
@HiltWorker
class UploadWorker @AssistedInject constructor(
@Assisted appContext: Context,
@Assisted workerParams: WorkerParameters
) :
Worker(appContext, workerParams) {

override fun doWork(): Result {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,30 +16,31 @@

package com.example.background.workers.filters

import android.app.NotificationManager
import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.net.Uri
import android.util.Log
import androidx.annotation.VisibleForTesting
import androidx.work.*
import androidx.work.CoroutineWorker
import androidx.work.ForegroundInfo
import androidx.work.WorkerParameters
import androidx.work.workDataOf
import com.example.background.Constants
import com.example.background.library.R
import com.example.background.workers.createNotification
import java.io.File
import java.io.FileNotFoundException
import java.io.FileOutputStream
import java.io.IOException
import java.io.InputStream
import java.util.UUID
import java.io.*
import java.util.*

abstract class BaseFilterWorker(context: Context, parameters: WorkerParameters) :
abstract class BaseFilterWorker(
context: Context,
parameters: WorkerParameters
) :
CoroutineWorker(context, parameters) {

override suspend fun doWork(): Result {
val resourceUri = inputData.getString(Constants.KEY_IMAGE_URI) ?:
throw IllegalArgumentException("Invalid input uri")
val resourceUri = inputData.getString(Constants.KEY_IMAGE_URI)
?: throw IllegalArgumentException("Invalid input uri")
return try {
val inputStream = inputStreamFor(applicationContext, resourceUri)
val bitmap = BitmapFactory.decodeStream(inputStream)
Expand Down Expand Up @@ -95,13 +96,18 @@ abstract class BaseFilterWorker(context: Context, parameters: WorkerParameters)
* Create ForegroundInfo required to run a Worker in a foreground service.
*/
override suspend fun getForegroundInfo(): ForegroundInfo {
return ForegroundInfo(NOTIFICATION_ID, createNotification(applicationContext, id,
applicationContext.getString(R.string.notification_title_filtering_image)))
return ForegroundInfo(
NOTIFICATION_ID, createNotification(
applicationContext, id,
applicationContext.getString(R.string.notification_title_filtering_image)
)
)
}

companion object {
const val TAG = "BaseFilterWorker"
const val ASSET_PREFIX = "file:///android_asset/"

// For a real world app you might want to use a different id for each Notification.
const val NOTIFICATION_ID = 1

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,16 @@ import android.renderscript.Allocation
import android.renderscript.Element
import android.renderscript.RenderScript
import android.renderscript.ScriptIntrinsicBlur
import androidx.hilt.work.HiltWorker
import androidx.work.WorkerParameters
import dagger.assisted.Assisted
import dagger.assisted.AssistedInject

class BlurEffectFilterWorker(context: Context, parameters: WorkerParameters) :
@HiltWorker
class BlurEffectFilterWorker @AssistedInject constructor(
@Assisted context: Context,
@Assisted parameters: WorkerParameters
) :
BaseFilterWorker(context, parameters) {

override fun applyFilter(input: Bitmap): Bitmap {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,17 @@ import android.content.Context
import android.graphics.Bitmap
import android.renderscript.Allocation
import android.renderscript.RenderScript
import androidx.hilt.work.HiltWorker
import androidx.work.WorkerParameters
import com.example.background.ScriptC_grayscale
import dagger.assisted.Assisted
import dagger.assisted.AssistedInject

class GrayScaleFilterWorker(context: Context, parameters: WorkerParameters) :
@HiltWorker
class GrayScaleFilterWorker @AssistedInject constructor(
@Assisted context: Context,
@Assisted parameters: WorkerParameters
) :
BaseFilterWorker(context, parameters) {

override fun applyFilter(input: Bitmap): Bitmap {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,17 @@ import android.content.Context
import android.graphics.Bitmap
import android.renderscript.Allocation
import android.renderscript.RenderScript
import androidx.hilt.work.HiltWorker
import androidx.work.WorkerParameters
import com.example.background.ScriptC_waterColorEffect
import dagger.assisted.Assisted
import dagger.assisted.AssistedInject

class WaterColorFilterWorker(context: Context, parameters: WorkerParameters) :
@HiltWorker
class WaterColorFilterWorker @AssistedInject constructor(
@Assisted context: Context,
@Assisted parameters: WorkerParameters
) :
BaseFilterWorker(context, parameters) {

override fun applyFilter(input: Bitmap): Bitmap {
Expand Down
Loading