diff --git a/app/src/main/java/it/unisannio/ding/ids/wedroid/app/data/dao/WListDao.java b/app/src/main/java/it/unisannio/ding/ids/wedroid/app/data/dao/WListDao.java new file mode 100644 index 0000000..be9e2e4 --- /dev/null +++ b/app/src/main/java/it/unisannio/ding/ids/wedroid/app/data/dao/WListDao.java @@ -0,0 +1,27 @@ +package it.unisannio.ding.ids.wedroid.app.data.dao; + +import androidx.lifecycle.LiveData; +import androidx.room.Dao; +import androidx.room.Delete; +import androidx.room.Insert; +import androidx.room.OnConflictStrategy; +import androidx.room.Query; + +import java.util.List; + +//import io.reactivex.Completable; +import it.unisannio.ding.ids.wedroid.app.data.entity.WList; + +@Dao +public interface WListDao { + + @Query("SELECT * from wlist_table ORDER BY title ASC") + LiveData> getAllWList(); + + @Insert(onConflict = OnConflictStrategy.REPLACE) + /**Completable**/ void insert(WList wList); + + @Delete + void delete(WList wList); + +} diff --git a/app/src/main/java/it/unisannio/ding/ids/wedroid/app/data/database/WListDatabase.java b/app/src/main/java/it/unisannio/ding/ids/wedroid/app/data/database/WListDatabase.java new file mode 100644 index 0000000..9fbd5e6 --- /dev/null +++ b/app/src/main/java/it/unisannio/ding/ids/wedroid/app/data/database/WListDatabase.java @@ -0,0 +1,31 @@ +package it.unisannio.ding.ids.wedroid.app.data.database; + +import android.content.Context; + +import androidx.room.Database; +import androidx.room.Room; +import androidx.room.RoomDatabase; + +import it.unisannio.ding.ids.wedroid.app.data.dao.WListDao; +import it.unisannio.ding.ids.wedroid.app.data.entity.WList; + +@Database(entities = WList.class, version = 1, exportSchema = false) +public abstract class WListDatabase extends RoomDatabase { + private static volatile WListDatabase INSTANCE; + public abstract WListDao wListDao(); + + public static WListDatabase getDatabase(Context context) { + if (INSTANCE != null) + return INSTANCE; + synchronized (WListDatabase.class) { + INSTANCE = Room.databaseBuilder( + context.getApplicationContext(), + WListDatabase.class, + "wlist_database" + ).build(); + + return INSTANCE; + } + } + +} diff --git a/app/src/main/java/it/unisannio/ding/ids/wedroid/app/data/entity/WList.kt b/app/src/main/java/it/unisannio/ding/ids/wedroid/app/data/entity/WList.kt new file mode 100644 index 0000000..07786f7 --- /dev/null +++ b/app/src/main/java/it/unisannio/ding/ids/wedroid/app/data/entity/WList.kt @@ -0,0 +1,15 @@ +package it.unisannio.ding.ids.wedroid.app.data.entity + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "wlist_table") +data class WList( + @PrimaryKey @ColumnInfo(name = "id") val id: String, + @ColumnInfo(name = "title") val title: String = "" +) + +fun it.unisannio.ding.ids.wedroid.wrapper.entity.WList.convert(): WList { + return WList(this.id, this.title) +} \ No newline at end of file diff --git a/app/src/main/java/it/unisannio/ding/ids/wedroid/app/data/repository/WListRepository.kt b/app/src/main/java/it/unisannio/ding/ids/wedroid/app/data/repository/WListRepository.kt new file mode 100644 index 0000000..1c2fa4a --- /dev/null +++ b/app/src/main/java/it/unisannio/ding/ids/wedroid/app/data/repository/WListRepository.kt @@ -0,0 +1,80 @@ +package it.unisannio.ding.ids.wedroid.app.data.repository + +import android.util.Log +import it.unisannio.ding.ids.wedroid.app.data.dao.WListDao +import it.unisannio.ding.ids.wedroid.app.data.entity.WList +import it.unisannio.ding.ids.wedroid.app.data.entity.convert +import it.unisannio.ding.ids.wedroid.app.util.PreferenceReader +import it.unisannio.ding.ids.wedroid.wrapper.api.ListService +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response + +class WListRepository( + private val dao: WListDao, + private val service: ListService, + private val reader: PreferenceReader +) { + val allWLists by lazy{ + dao.getAllWList() + } + + init { + synchronize() + } + + fun synchronize() { + service.getAllList(reader.boardId) + .enqueue(object : + Callback> { + override fun onFailure( + call: Call>, + t: Throwable + ) = logNetworkError(t.message) + + override fun onResponse( + call: Call>, + response: Response> + ) { + CoroutineScope(Dispatchers.IO).launch { + synchronizeCallback(response) + } + } + }) + } + + private suspend fun synchronizeCallback( + response: Response>) + { + if (!response.isSuccessful) { + logNetworkError("${response.code()} ${response.message()}") + return + } + + val wLists = (response.body() ?: return) + .map { it.convert() } + + addNewWListToDb(wLists) + removeOldWListsFromDb(wLists) + } + + private suspend fun addNewWListToDb(wLists: Collection) { + wLists.forEach { + dao.insert(it) + } + } + + private suspend fun removeOldWListsFromDb(wLists: Collection) { + allWLists.value?.minus(wLists) + ?.forEach { + dao.delete(it) + } + } + + private fun logNetworkError(message: String?) { + Log.e("RETROFIT", message) + } +} \ No newline at end of file diff --git a/app/src/main/java/it/unisannio/ding/ids/wedroid/app/util/PreferenceReader.java b/app/src/main/java/it/unisannio/ding/ids/wedroid/app/util/PreferenceReader.java new file mode 100644 index 0000000..f5cfece --- /dev/null +++ b/app/src/main/java/it/unisannio/ding/ids/wedroid/app/util/PreferenceReader.java @@ -0,0 +1,8 @@ +package it.unisannio.ding.ids.wedroid.app.util; + +public interface PreferenceReader { + String getBaseUrl(); + String getUserId(); + String getToken(); + String getBoardId(); +} diff --git a/app/src/main/java/it/unisannio/ding/ids/wedroid/app/util/PreferenceWriter.java b/app/src/main/java/it/unisannio/ding/ids/wedroid/app/util/PreferenceWriter.java new file mode 100644 index 0000000..2043f53 --- /dev/null +++ b/app/src/main/java/it/unisannio/ding/ids/wedroid/app/util/PreferenceWriter.java @@ -0,0 +1,8 @@ +package it.unisannio.ding.ids.wedroid.app.util; + +public interface PreferenceWriter { + void setBaseUrl(String baseUrl); + void setUserId(String userId); + void setToken(String token); + void setBoardId(String boardId); +} diff --git a/app/src/main/java/it/unisannio/ding/ids/wedroid/app/util/ServicesFactory.kt b/app/src/main/java/it/unisannio/ding/ids/wedroid/app/util/ServicesFactory.kt new file mode 100644 index 0000000..457a197 --- /dev/null +++ b/app/src/main/java/it/unisannio/ding/ids/wedroid/app/util/ServicesFactory.kt @@ -0,0 +1,78 @@ +package it.unisannio.ding.ids.wedroid.app.util + +import it.unisannio.ding.ids.wedroid.wrapper.api.* +import okhttp3.OkHttpClient +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory + +class ServicesFactory( + reader: PreferenceReader +) { + private val retrofit: Retrofit + + init { + val httpClient = OkHttpClient.Builder() + .addInterceptor { + val request = it.request().newBuilder() + .addHeader("Authorization", "Bearer ${reader.token}") + .addHeader("Accept", "application/json") + .addHeader("Content-type", "application/json") + .build() + + it.proceed(request) + }.build() + + retrofit = Retrofit.Builder() + .baseUrl(reader.baseUrl) + .addConverterFactory(GsonConverterFactory.create()) + .client(httpClient) + .build() + } + + val boardService by lazy { + retrofit.create(BoardService::class.java) + } + + val cardCommentService by lazy { + retrofit.create(CardCommentService::class.java) + } + + val cardService by lazy { + retrofit.create(CardService::class.java) + } + + val checklistService by lazy { + retrofit.create(ChecklistService::class.java) + } + + val listService by lazy { + retrofit.create(ListService::class.java) + } + + val swimlanesService by lazy { + retrofit.create(SwimlanesService::class.java) + } + + val userService by lazy { + retrofit.create(UserService::class.java) + } + + companion object { + @Volatile + private var INSTANCE: ServicesFactory? = null + + fun getInstance(reader: PreferenceReader): ServicesFactory { + val tempInstance = INSTANCE + + if (tempInstance != null) + return tempInstance + + synchronized(this) { + val instance = ServicesFactory(reader) + INSTANCE = instance + return instance + } + } + } +} + diff --git a/app/src/main/java/it/unisannio/ding/ids/wedroid/app/util/SharedPreferenceHelper.kt b/app/src/main/java/it/unisannio/ding/ids/wedroid/app/util/SharedPreferenceHelper.kt new file mode 100644 index 0000000..4ee1c06 --- /dev/null +++ b/app/src/main/java/it/unisannio/ding/ids/wedroid/app/util/SharedPreferenceHelper.kt @@ -0,0 +1,44 @@ +package it.unisannio.ding.ids.wedroid.app.util + +import android.content.Context + +class SharedPreferenceHelper(context : Context) : PreferenceReader, PreferenceWriter { + private val sp = context.getSharedPreferences("userinfo", Context.MODE_PRIVATE) + + override fun getBaseUrl(): String? { + return sp.getString("url", "") + } + + override fun getUserId(): String? { + return sp.getString("id", "") + } + + override fun getToken(): String? { + return sp.getString("token", "") + } + + override fun setBaseUrl(baseUrl: String?) { + val editor = sp.edit() + editor.putString("url", baseUrl).apply() + + } + + override fun setUserId(userId: String?) { + val editor = sp.edit() + editor.putString("id", userId).apply() + } + + override fun setToken(token: String?) { + val editor = sp.edit() + editor.putString("token", token).apply() + } + + override fun getBoardId(): String? { + return sp.getString("boardId", "") + } + + override fun setBoardId(token: String?) { + val editor = sp.edit() + editor.putString("boardId", token).apply() + } +} \ No newline at end of file