From 160e4c55e5c6c863c885cf1eda633f41e3aa0e4b Mon Sep 17 00:00:00 2001 From: Umberto Furno Date: Sat, 28 Dec 2019 18:17:10 +0100 Subject: [PATCH 01/17] Dep --- app/build.gradle | 41 ++++++++++++++++++++++++++++++++++++++++- build.gradle | 11 ++++++++++- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c0fc443..0df9fce 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,6 +4,8 @@ apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: 'kotlin-kapt' + android { compileSdkVersion 29 buildToolsVersion "29.0.2" @@ -21,15 +23,52 @@ android { proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } + packagingOptions { + exclude 'META-INF/atomicfu.kotlin_module' + } } dependencies { - implementation project(':wrapper') + // standard implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.core:core-ktx:1.1.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'com.google.android.material:material:1.0.0' + // wrapper + implementation project(':wrapper') + // retrofit + implementation "com.squareup.retrofit2:retrofit:2.6.2" + implementation "com.squareup.retrofit2:converter-gson:2.6.2" + // room database + implementation "androidx.room:room-runtime:$rootProject.roomVersion" + implementation "androidx.room:room-ktx:$rootProject.roomVersion" + kapt "androidx.room:room-compiler:$rootProject.roomVersion" + // lifecycle components + implementation "androidx.lifecycle:lifecycle-extensions:$rootProject.archLifecycleVersion" + //noinspection LifecycleAnnotationProcessorWithJava8 + kapt "androidx.lifecycle:lifecycle-compiler:$rootProject.archLifecycleVersion" + // ViewModel Kotlin support + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$rootProject.archLifecycleVersion" + // Coroutines + api "org.jetbrains.kotlinx:kotlinx-coroutines-android:$rootProject.coroutines" + // UI + implementation "com.google.android.material:material:$rootProject.materialVersion" + implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0" + + + // TESTING testImplementation 'junit:junit:4.12' + testImplementation "io.mockk:mockk:1.9.3" + testImplementation "com.squareup.okhttp3:mockwebserver:4.2.1" androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' + + implementation "com.squareup.retrofit2:retrofit:2.6.2" + implementation "com.squareup.retrofit2:converter-gson:2.6.2" + + androidTestImplementation "androidx.room:room-testing:$rootProject.roomVersion" + androidTestImplementation "androidx.arch.core:core-testing:$rootProject.androidxArchVersion" + androidTestImplementation "androidx.arch.core:core-testing:$rootProject.coreTestingVersion" + } diff --git a/build.gradle b/build.gradle index f4ed563..7dd7b0c 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.5.2' + classpath 'com.android.tools.build:gradle:3.5.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -23,6 +23,15 @@ allprojects { } } +ext { + roomVersion = '2.2.3' + archLifecycleVersion = '2.2.0-rc03' + androidxArchVersion = '2.1.0' + coreTestingVersion = "2.1.0" + coroutines = '1.3.2' + materialVersion = "1.0.0" +} + task clean(type: Delete) { delete rootProject.buildDir } -- 2.40.1 From fda86e1f108d6e2c7afe76acc421c426a38fdf48 Mon Sep 17 00:00:00 2001 From: Umberto Furno Date: Sat, 28 Dec 2019 19:09:40 +0100 Subject: [PATCH 02/17] Add util and persistence --- .../ids/wedroid/app/data/dao/WListDao.java | 27 +++++++ .../app/data/database/WListDatabase.java | 31 +++++++ .../ding/ids/wedroid/app/data/entity/WList.kt | 15 ++++ .../app/data/repository/WListRepository.kt | 80 +++++++++++++++++++ .../wedroid/app/util/PreferenceReader.java | 8 ++ .../wedroid/app/util/PreferenceWriter.java | 8 ++ .../ids/wedroid/app/util/ServicesFactory.kt | 78 ++++++++++++++++++ .../app/util/SharedPreferenceHelper.kt | 44 ++++++++++ 8 files changed, 291 insertions(+) create mode 100644 app/src/main/java/it/unisannio/ding/ids/wedroid/app/data/dao/WListDao.java create mode 100644 app/src/main/java/it/unisannio/ding/ids/wedroid/app/data/database/WListDatabase.java create mode 100644 app/src/main/java/it/unisannio/ding/ids/wedroid/app/data/entity/WList.kt create mode 100644 app/src/main/java/it/unisannio/ding/ids/wedroid/app/data/repository/WListRepository.kt create mode 100644 app/src/main/java/it/unisannio/ding/ids/wedroid/app/util/PreferenceReader.java create mode 100644 app/src/main/java/it/unisannio/ding/ids/wedroid/app/util/PreferenceWriter.java create mode 100644 app/src/main/java/it/unisannio/ding/ids/wedroid/app/util/ServicesFactory.kt create mode 100644 app/src/main/java/it/unisannio/ding/ids/wedroid/app/util/SharedPreferenceHelper.kt 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 -- 2.40.1 From baced120f905ba0752e277ec726bde9f2d4b8e59 Mon Sep 17 00:00:00 2001 From: Umberto Furno Date: Sun, 29 Dec 2019 19:06:12 +0100 Subject: [PATCH 03/17] Add view Board and WLists v1 --- app/src/main/AndroidManifest.xml | 13 ++- .../ding/ids/wedroid/app/DriverActivity.java | 46 +++++++++ .../wedroid/app/view/BoardViewActivity.java | 66 +++++++++++++ .../wedroid/app/view/WListsListActivity.java | 48 +++++++++ .../app/view/adapter/WListsAdapter.java | 99 +++++++++++++++++++ .../app/viewModel/WListsListViewModel.java | 40 ++++++++ .../main/res/layout/activity_board_view.xml | 35 +++++++ app/src/main/res/layout/activity_main.xml | 36 +++++-- .../main/res/layout/activity_wlists_view.xml | 20 ++++ .../res/layout/wlist_recyclerview_item.xml | 12 +++ app/src/main/res/values/dimens.xml | 3 + app/src/main/res/values/styles.xml | 10 ++ 12 files changed, 419 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/it/unisannio/ding/ids/wedroid/app/DriverActivity.java create mode 100644 app/src/main/java/it/unisannio/ding/ids/wedroid/app/view/BoardViewActivity.java create mode 100644 app/src/main/java/it/unisannio/ding/ids/wedroid/app/view/WListsListActivity.java create mode 100644 app/src/main/java/it/unisannio/ding/ids/wedroid/app/view/adapter/WListsAdapter.java create mode 100644 app/src/main/java/it/unisannio/ding/ids/wedroid/app/viewModel/WListsListViewModel.java create mode 100644 app/src/main/res/layout/activity_board_view.xml create mode 100644 app/src/main/res/layout/activity_wlists_view.xml create mode 100644 app/src/main/res/layout/wlist_recyclerview_item.xml create mode 100644 app/src/main/res/values/dimens.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 253fb67..b493584 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,21 +1,30 @@ + + + - + android:theme="@style/AppTheme" + tools:ignore="GoogleAppIndexingWarning"> + + + \ No newline at end of file diff --git a/app/src/main/java/it/unisannio/ding/ids/wedroid/app/DriverActivity.java b/app/src/main/java/it/unisannio/ding/ids/wedroid/app/DriverActivity.java new file mode 100644 index 0000000..94011c4 --- /dev/null +++ b/app/src/main/java/it/unisannio/ding/ids/wedroid/app/DriverActivity.java @@ -0,0 +1,46 @@ +package it.unisannio.ding.ids.wedroid.app; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +import it.unisannio.ding.ids.wedroid.app.util.SharedPreferenceHelper; +import it.unisannio.ding.ids.wedroid.app.view.BoardViewActivity; + +public class DriverActivity extends AppCompatActivity { + + SharedPreferenceHelper sharedPreferences; + EditText idBoard; + Button send; + + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + sharedPreferences = new SharedPreferenceHelper(this); + + String baseUrl = sharedPreferences.getBaseUrl(); + String token = sharedPreferences.getToken(); + String userId = sharedPreferences.getUserId(); + + sharedPreferences.setBaseUrl("https://board.norangeb.it/"); + sharedPreferences.setToken("4waGrVlk0fkLhiQRDgN_rkbIamp4IyB6mThS0IpKbPx"); + sharedPreferences.setUserId(""); + + idBoard = findViewById(R.id.idBoard); + + send= findViewById(R.id.send); + send.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent i = new Intent(getApplicationContext(), BoardViewActivity.class); + i.putExtra("idBoard", idBoard.getText().toString()); + startActivity(i); + } + }); + } +} diff --git a/app/src/main/java/it/unisannio/ding/ids/wedroid/app/view/BoardViewActivity.java b/app/src/main/java/it/unisannio/ding/ids/wedroid/app/view/BoardViewActivity.java new file mode 100644 index 0000000..a25cdc5 --- /dev/null +++ b/app/src/main/java/it/unisannio/ding/ids/wedroid/app/view/BoardViewActivity.java @@ -0,0 +1,66 @@ +package it.unisannio.ding.ids.wedroid.app.view; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +import it.unisannio.ding.ids.wedroid.app.R; +import it.unisannio.ding.ids.wedroid.app.util.ServicesFactory; +import it.unisannio.ding.ids.wedroid.app.util.SharedPreferenceHelper; +import it.unisannio.ding.ids.wedroid.wrapper.entity.Board; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +public class BoardViewActivity extends AppCompatActivity { + + TextView boardTitle; + Button getLists; + SharedPreferenceHelper sp; + ServicesFactory service; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_board_view); + + Intent i = getIntent(); + final String idBoard= i.getStringExtra("idBoard"); + boardTitle = findViewById(R.id.title_board); + getLists = findViewById(R.id.getLists); + + sp = new SharedPreferenceHelper(this); + sp.setBoardId(idBoard); + + initializeUI(idBoard); + + getLists.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent i = new Intent(getApplicationContext(), WListsListActivity.class); + i.putExtra("idBoard", idBoard); + startActivity(i); + } + }); + } + + private void initializeUI(String idBoard) { + service = new ServicesFactory(sp); + service.getBoardService().getBoard(idBoard).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + boardTitle.setText(boardTitle.getText().toString() + response.body().getTitle()); + } + + @Override + public void onFailure(Call call, Throwable t) { + boardTitle.setText(t.toString()); + } + }); + } +} diff --git a/app/src/main/java/it/unisannio/ding/ids/wedroid/app/view/WListsListActivity.java b/app/src/main/java/it/unisannio/ding/ids/wedroid/app/view/WListsListActivity.java new file mode 100644 index 0000000..5ae01d7 --- /dev/null +++ b/app/src/main/java/it/unisannio/ding/ids/wedroid/app/view/WListsListActivity.java @@ -0,0 +1,48 @@ +package it.unisannio.ding.ids.wedroid.app.view; + +import android.os.Bundle; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.List; + +import it.unisannio.ding.ids.wedroid.app.R; +import it.unisannio.ding.ids.wedroid.app.data.entity.WList; +import it.unisannio.ding.ids.wedroid.app.util.PreferenceReader; +import it.unisannio.ding.ids.wedroid.app.util.SharedPreferenceHelper; +import it.unisannio.ding.ids.wedroid.app.view.adapter.WListsAdapter; +import it.unisannio.ding.ids.wedroid.app.viewModel.WListsListViewModel; + +public class WListsListActivity extends AppCompatActivity { + + private WListsListViewModel viewModel; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_wlists_view); + + PreferenceReader reader =new SharedPreferenceHelper(this); + + RecyclerView recyclerView = findViewById(R.id.recyclerviewWList); + final WListsAdapter adapter = new WListsAdapter(this); + recyclerView.setAdapter(adapter); + recyclerView.setLayoutManager(new LinearLayoutManager(this)); + //linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); + //recyclerView.setHasFixedSize(true); + + viewModel = new ViewModelProvider(this).get(WListsListViewModel.class); + + viewModel.getAllWLists().observe(this, new Observer>() { + @Override + public void onChanged(List wLists) { + adapter.setWLists(wLists); + } + }); + } +} diff --git a/app/src/main/java/it/unisannio/ding/ids/wedroid/app/view/adapter/WListsAdapter.java b/app/src/main/java/it/unisannio/ding/ids/wedroid/app/view/adapter/WListsAdapter.java new file mode 100644 index 0000000..11dd361 --- /dev/null +++ b/app/src/main/java/it/unisannio/ding/ids/wedroid/app/view/adapter/WListsAdapter.java @@ -0,0 +1,99 @@ +package it.unisannio.ding.ids.wedroid.app.view.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.List; + +import it.unisannio.ding.ids.wedroid.app.R; +import it.unisannio.ding.ids.wedroid.app.data.entity.WList; + +public class WListsAdapter extends RecyclerView.Adapter { + + private final LayoutInflater mInflater; + private List mWLists; // Cached copy of words + public WListsAdapter(Context context) { mInflater = LayoutInflater.from(context); } + + class WListViewHolder extends RecyclerView.ViewHolder{ + private final TextView wListItemView; + private WListViewHolder(View itemView){ + super(itemView); + wListItemView= itemView.findViewById(R.id.wListTitle); + } + } + + @NonNull + @Override + public WListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View itemView = mInflater.inflate(R.layout.wlist_recyclerview_item, parent, false); + return new WListViewHolder(itemView); + } + + @Override + public void onBindViewHolder(@NonNull WListViewHolder holder, int position) { + if (mWLists != null) { + WList current = mWLists.get(position); + holder.wListItemView.setText(current.getTitle()); + } else { + // Covers the case of data not being ready yet. + holder.wListItemView.setText("No wList"); + } + } + + @Override + public int getItemCount() { + if (mWLists != null) + return mWLists.size(); + else return 0; + } + + public void setWLists(List wList){ + mWLists = wList; + notifyDataSetChanged(); + } + +} + +/** Vecchia versione + private List wLists; + private Context context; + + public WListsAdapter(Context context, List wLists){ + this.wLists = wLists; + this.context = context; + } + + public class WListViewHolder extends RecyclerView.ViewHolder { + private TextView title; + public WListViewHolder(View itemView) { + super(itemView); + title = (TextView) itemView.findViewById(R.id.zWListTitle); + } + } + + @NonNull + @Override + public WListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View itemView = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.z_wlist_recycle_item, parent, false); + return new WListViewHolder(itemView); + } + + @Override + public void onBindViewHolder(@NonNull WListViewHolder holder, int position) { + WList wList = wLists.get(position); + holder.title.setText(wList.getTitle()); + + } + + @Override + public int getItemCount() { + return 0; + } + **/ diff --git a/app/src/main/java/it/unisannio/ding/ids/wedroid/app/viewModel/WListsListViewModel.java b/app/src/main/java/it/unisannio/ding/ids/wedroid/app/viewModel/WListsListViewModel.java new file mode 100644 index 0000000..651aea3 --- /dev/null +++ b/app/src/main/java/it/unisannio/ding/ids/wedroid/app/viewModel/WListsListViewModel.java @@ -0,0 +1,40 @@ +package it.unisannio.ding.ids.wedroid.app.viewModel; + +import android.app.Application; + +import androidx.annotation.NonNull; +import androidx.lifecycle.AndroidViewModel; +import androidx.lifecycle.LiveData; + +import java.util.List; + +import it.unisannio.ding.ids.wedroid.app.data.database.WListDatabase; +import it.unisannio.ding.ids.wedroid.app.data.entity.WList; +import it.unisannio.ding.ids.wedroid.app.data.repository.WListRepository; +import it.unisannio.ding.ids.wedroid.app.util.PreferenceReader; +import it.unisannio.ding.ids.wedroid.app.util.ServicesFactory; +import it.unisannio.ding.ids.wedroid.app.util.SharedPreferenceHelper; + + +public class WListsListViewModel extends AndroidViewModel { + private WListRepository wListRepository; + private LiveData> allWLists; + + public WListsListViewModel(@NonNull Application application) { + super(application); + PreferenceReader reader = new SharedPreferenceHelper(application); + wListRepository = new WListRepository( + WListDatabase.getDatabase(application).wListDao(), + ServicesFactory.Companion.getInstance(reader).getListService(), + reader); + allWLists = wListRepository.getAllWLists(); + } + + public LiveData> getAllWLists(){ + return allWLists; + } + + public void refresh() { + wListRepository.synchronize(); + } +} diff --git a/app/src/main/res/layout/activity_board_view.xml b/app/src/main/res/layout/activity_board_view.xml new file mode 100644 index 0000000..8d379e7 --- /dev/null +++ b/app/src/main/res/layout/activity_board_view.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + +