Skip to content

Commit 2079400

Browse files
committed
add workmanager
1 parent de56016 commit 2079400

5 files changed

Lines changed: 104 additions & 8 deletions

File tree

127 KB
Binary file not shown.

app/build.gradle

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,20 +42,20 @@ dependencies {
4242
implementation "com.squareup.retrofit2:converter-scalars:2.5.0"
4343
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
4444
implementation "androidx.recyclerview:recyclerview:1.2.1"
45-
implementation "androidx.room:room-runtime:2.4.0"
45+
implementation "androidx.room:room-runtime:2.4.1"
4646
implementation 'androidx.work:work-runtime:2.7.1'
4747
implementation 'androidx.work:work-runtime-ktx:2.7.1'
4848
implementation 'androidx.activity:activity-ktx:1.4.0'
4949
implementation 'androidx.fragment:fragment-ktx:1.4.0'
5050
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2"
5151
implementation "androidx.viewpager2:viewpager2:1.0.0"
52-
kapt "androidx.room:room-compiler:2.4.0"
52+
kapt "androidx.room:room-compiler:2.4.1"
5353

5454

5555
implementation 'androidx.core:core-ktx:1.7.0'
56-
implementation 'androidx.appcompat:appcompat:1.4.0'
57-
implementation 'com.google.android.material:material:1.4.0'
58-
implementation 'androidx.constraintlayout:constraintlayout:2.1.2'
56+
implementation 'androidx.appcompat:appcompat:1.4.1'
57+
implementation 'com.google.android.material:material:1.5.0'
58+
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
5959
testImplementation 'junit:junit:4.+'
6060
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
6161
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.example.cftandroidtestwork
2+
3+
import android.content.Context
4+
import android.util.Log
5+
import androidx.work.Worker
6+
import androidx.work.WorkerParameters
7+
import com.example.cftandroidtestwork.data.database.RoomRepository
8+
import com.example.cftandroidtestwork.data.database.entity.CurrencyRoomItem
9+
import com.example.cftandroidtestwork.data.internet.CurrencyInternetRepository
10+
import com.example.cftandroidtestwork.data.json.CurrentCurrency
11+
import com.example.cftandroidtestwork.data.json.CurrentCurrencyWithListValuteAndName
12+
import com.example.cftandroidtestwork.data.json.ValuteAndName
13+
import kotlinx.serialization.decodeFromString
14+
import kotlinx.serialization.json.Json
15+
import java.lang.Exception
16+
17+
class CurrencyWorkManager(private val context: Context, params: WorkerParameters,private var url: String): Worker(context, params) {
18+
override fun doWork(): Result {
19+
Log.d("TAG", "TAG")
20+
CurrencyInternetRepository.initialize()
21+
RoomRepository.initialize(context)
22+
val currencyInternetRepository = CurrencyInternetRepository.get()
23+
val roomRepository = RoomRepository.get()
24+
var data = ""
25+
var temp = CurrentCurrency()
26+
try {
27+
data = currencyInternetRepository.getRequestFromUrl(url)
28+
}
29+
catch (e: Exception){
30+
return Result.retry()
31+
}
32+
try{
33+
temp = Json.decodeFromString(data)
34+
}
35+
catch (e:Exception){
36+
return Result.retry()
37+
}
38+
val result = CurrentCurrencyWithListValuteAndName()
39+
if (temp.valutes != null){
40+
result.apply {
41+
Date = temp.Date
42+
PreviousDate = temp.PreviousDate
43+
PreviousURL = temp.PreviousURL
44+
Timestamp = temp.Timestamp
45+
valutes = mutableListOf()
46+
val strings = temp.valutes?.keys
47+
strings?.forEach {
48+
(valutes as MutableList<ValuteAndName>).add(ValuteAndName(it, temp.valutes!![it]!!))
49+
}
50+
}
51+
}
52+
else {
53+
return Result.retry()
54+
}
55+
val saveResult = CurrencyRoomItem()
56+
saveResult.apply {
57+
Date = java.sql.Date(System.currentTimeMillis()).toString()
58+
PreviousDate = result.PreviousDate
59+
PreviousURL = result.PreviousURL
60+
Timestamp = result.Timestamp
61+
valutes = result.valutes
62+
}
63+
if (saveResult.valutes != null){
64+
roomRepository.setItem(saveResult)
65+
}
66+
return Result.success()
67+
}
68+
}

app/src/main/java/com/example/cftandroidtestwork/MainActivity.kt

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ package com.example.cftandroidtestwork
22

33
import androidx.appcompat.app.AppCompatActivity
44
import android.os.Bundle
5+
import android.util.Log
6+
import androidx.work.*
57
import com.example.cftandroidtestwork.data.contract.HasCustomTitle
68
import com.example.cftandroidtestwork.data.contract.Navigator
79
import com.example.cftandroidtestwork.databinding.ActivityMainBinding
8-
import com.example.cftandroidtestwork.views.currencylist.CurrencyList
910
import com.google.android.material.tabs.TabLayoutMediator
11+
import java.util.concurrent.TimeUnit
1012

1113

1214
val tabsArray = listOf("Валюты", "Конвертер")
@@ -29,10 +31,38 @@ class MainActivity : AppCompatActivity(), Navigator {
2931
TabLayoutMediator(tabLayout, viewPager) { tab, position ->
3032
tab.text = tabsArray[position]
3133
}.attach()
34+
if (!isWorkSchedule("myWork")) {
35+
Log.d("TAG", "ЗАДАЧА СОЗДАНА")
36+
val constraints = Constraints.Builder()
37+
.setRequiredNetworkType(NetworkType.CONNECTED)
38+
.build()
39+
val work = PeriodicWorkRequest
40+
.Builder(CurrencyWorkManager::class.java, 15, TimeUnit.MINUTES)
41+
.addTag("myWork")
42+
.setConstraints(constraints)
43+
.build()
44+
WorkManager.getInstance(this.applicationContext)
45+
.enqueueUniquePeriodicWork("myWork", ExistingPeriodicWorkPolicy.REPLACE, work)
46+
}
3247
}
3348
override fun updateUi(id: Int) {
3449
val fragment = supportFragmentManager.findFragmentByTag("f$id")
3550
if (fragment is HasCustomTitle) supportActionBar?.title = fragment.getTitle()
3651
else supportActionBar?.title = "------"
3752
}
53+
54+
private fun isWorkSchedule(tag: String): Boolean{
55+
val instance = WorkManager.getInstance(this.applicationContext)
56+
val statuses = instance.getWorkInfosByTag(tag)
57+
var running = false
58+
val workInfoList = statuses.get()
59+
for (workInfo in workInfoList){
60+
val state = workInfo.state
61+
running = (state == WorkInfo.State.RUNNING || state == WorkInfo.State.ENQUEUED ||
62+
state == WorkInfo.State.FAILED|| state == WorkInfo.State.BLOCKED
63+
|| state == WorkInfo.State.CANCELLED || state == WorkInfo.State.SUCCEEDED)
64+
if (running) return true
65+
}
66+
return running
67+
}
3868
}

app/src/main/java/com/example/cftandroidtestwork/WorkerThread.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ class WorkerThread(private val liveData: MutableLiveData<CurrentCurrencyWithList
5757
val item = roomRepository.getItem()
5858
if (item == null || item.valutes == null) loadInternet(url)
5959
else{
60-
Log.d("TAG", "ROOM")
6160
val result = CurrentCurrencyWithListValuteAndName()
6261
result.apply {
6362
Date = item.Date
@@ -70,7 +69,6 @@ class WorkerThread(private val liveData: MutableLiveData<CurrentCurrencyWithList
7069
}
7170
}
7271
fun loadInternet(url: String){
73-
Log.d("TAG", "INTERNET")
7472
val data:String? = try {
7573
currencyInternetRepository.getRequestFromUrl(url)
7674
} catch (e: Exception){

0 commit comments

Comments
 (0)