Browse Source

Added loading data for 'todo' and 'done' tabs

sirekanyan 8 năm trước cách đây
mục cha
commit
f52482d6dc

+ 9 - 2
app/src/main/java/me/vadik/knigopis/Endpoint.kt

@@ -3,6 +3,7 @@ package me.vadik.knigopis
 import me.vadik.knigopis.model.Book
 import me.vadik.knigopis.model.Credentials
 import me.vadik.knigopis.model.User
+import me.vadik.knigopis.model.Wish
 import retrofit2.Call
 import retrofit2.http.GET
 import retrofit2.http.Query
@@ -12,9 +13,15 @@ interface Endpoint {
   @GET("/user/get-credentials")
   fun getCredentials(@Query("token") token: String): Call<Credentials>
 
+  @GET("books")
+  fun getBooks(@Query("access-token") accessToken: String): Call<List<Book>>
+
+  @GET("wishes")
+  fun getWishes(@Query("access-token") accessToken: String): Call<List<Wish>>
+
   @GET("users/latest")
-  fun latestUsers(): Call<Map<String, User>>
+  fun getLatestUsers(): Call<Map<String, User>>
 
   @GET("books/latest-notes")
-  fun latestBooksWithNotes(): Call<Map<String, Book>>
+  fun getLatestBooksWithNotes(): Call<Map<String, Book>>
 }

+ 87 - 31
app/src/main/java/me/vadik/knigopis/MainActivity.kt

@@ -8,12 +8,16 @@ import android.support.v7.widget.LinearLayoutManager
 import android.support.v7.widget.RecyclerView
 import android.support.v7.widget.Toolbar
 import android.view.MenuItem
-import me.vadik.knigopis.CurrentTab.DONE_TAB
-import me.vadik.knigopis.CurrentTab.HOME_TAB
+import android.view.View
+import me.vadik.knigopis.CurrentTab.*
+import me.vadik.knigopis.adapters.BooksAdapter
+import me.vadik.knigopis.adapters.UsersAdapter
+import me.vadik.knigopis.adapters.WishesAdapter
 import me.vadik.knigopis.auth.KAuth
 import me.vadik.knigopis.auth.KAuthImpl
 import me.vadik.knigopis.model.Book
 import me.vadik.knigopis.model.User
+import me.vadik.knigopis.model.Wish
 import retrofit2.Call
 import retrofit2.Callback
 import retrofit2.Response
@@ -25,40 +29,25 @@ class MainActivity : AppCompatActivity() {
   private val api by lazy { app().retrofit.create(Endpoint::class.java) }
   private val auth by lazy { KAuthImpl(applicationContext, api) as KAuth }
   private val users = mutableListOf<User>()
-  private val adapter = UsersAdapter(users)
+  private val books = mutableListOf<Book>()
+  private val wishes = mutableListOf<Wish>()
+  private val usersAdapter = UsersAdapter(users)
+  private val booksAdapter = BooksAdapter(books)
+  private val wishesAdapter = WishesAdapter(wishes)
+  private lateinit var usersRecyclerView: RecyclerView
+  private lateinit var booksRecyclerView: RecyclerView
+  private lateinit var wishesRecyclerView: RecyclerView
   private lateinit var loginOption: MenuItem
   private lateinit var currentTab: CurrentTab
 
   override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)
     setContentView(R.layout.activity_main)
+    usersRecyclerView = initRecyclerView(findView(R.id.users_recycler_view), usersAdapter)
+    booksRecyclerView = initRecyclerView(findView(R.id.books_recycler_view), booksAdapter)
+    wishesRecyclerView = initRecyclerView(findView(R.id.wishes_recycler_view), wishesAdapter)
     initNavigationView(findView(R.id.navigation))
-    initRecyclerView(findView(R.id.recycler_view))
     initToolbar(findView(R.id.toolbar))
-    api.latestUsers().enqueue(object : Callback<Map<String, User>> {
-      override fun onResponse(call: Call<Map<String, User>>?, response: Response<Map<String, User>>?) {
-        users.clear()
-        response?.body()?.values?.forEach { user ->
-          users.add(user)
-          adapter.notifyItemInserted(0)
-        }
-      }
-
-      override fun onFailure(call: Call<Map<String, User>>?, t: Throwable?) {
-        log("cannot load users", t)
-      }
-    })
-    api.latestBooksWithNotes().enqueue(object : Callback<Map<String, Book>> {
-      override fun onResponse(call: Call<Map<String, Book>>?, response: Response<Map<String, Book>>?) {
-        response?.body()?.values?.forEach { book ->
-          logw(book.notes)
-        }
-      }
-
-      override fun onFailure(call: Call<Map<String, Book>>?, t: Throwable?) {
-        log("cannot load latest books with notes", t)
-      }
-    })
   }
 
   override fun onStart() {
@@ -80,17 +69,18 @@ class MainActivity : AppCompatActivity() {
   }
 
   private fun initNavigationView(navigation: BottomNavigationView) {
-    currentTab = if (auth.isAuthorized()) DONE_TAB else HOME_TAB
+    setCurrentTab(if (auth.isAuthorized()) DONE_TAB else HOME_TAB)
     navigation.selectedItemId = currentTab.itemId
     navigation.setOnNavigationItemSelectedListener { item ->
-      currentTab = CurrentTab.getByItemId(item.itemId)
+      setCurrentTab(CurrentTab.getByItemId(item.itemId))
       true
     }
   }
 
-  private fun initRecyclerView(recyclerView: RecyclerView) {
+  private fun initRecyclerView(recyclerView: RecyclerView, adapter: RecyclerView.Adapter<*>): RecyclerView {
     recyclerView.adapter = adapter
     recyclerView.layoutManager = LinearLayoutManager(this)
+    return recyclerView
   }
 
   private fun initToolbar(toolbar: Toolbar) {
@@ -122,4 +112,70 @@ class MainActivity : AppCompatActivity() {
       loginOption.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS)
     }
   }
+
+  private fun setCurrentTab(tab: CurrentTab) {
+    currentTab = tab
+    when (tab) {
+      HOME_TAB -> refreshHomeTab()
+      DONE_TAB -> refreshDoneTab()
+      TODO_TAB -> refreshTodoTab()
+    }
+  }
+
+  private fun refreshHomeTab() {
+    usersRecyclerView.visibility = View.VISIBLE
+    booksRecyclerView.visibility = View.GONE
+    wishesRecyclerView.visibility = View.GONE
+    api.getLatestUsers().enqueue(object : Callback<Map<String, User>> {
+      override fun onResponse(call: Call<Map<String, User>>?, response: Response<Map<String, User>>?) {
+        users.clear()
+        response?.body()?.values?.forEach { user ->
+          users.add(user)
+        }
+        usersAdapter.notifyDataSetChanged()
+      }
+
+      override fun onFailure(call: Call<Map<String, User>>?, t: Throwable?) {
+        logError("cannot load users", t)
+      }
+    })
+  }
+
+  private fun refreshDoneTab() {
+    usersRecyclerView.visibility = View.GONE
+    booksRecyclerView.visibility = View.VISIBLE
+    wishesRecyclerView.visibility = View.GONE
+    api.getBooks(auth.getAccessToken()).enqueue(object : Callback<List<Book>> {
+      override fun onResponse(call: Call<List<Book>>?, response: Response<List<Book>>?) {
+        books.clear()
+        response?.body()?.forEach { book ->
+          books.add(book)
+        }
+        usersAdapter.notifyDataSetChanged()
+      }
+
+      override fun onFailure(call: Call<List<Book>>?, t: Throwable?) {
+        logError("cannot load books", t)
+      }
+    })
+  }
+
+  private fun refreshTodoTab() {
+    usersRecyclerView.visibility = View.GONE
+    booksRecyclerView.visibility = View.GONE
+    wishesRecyclerView.visibility = View.VISIBLE
+    api.getWishes(auth.getAccessToken()).enqueue(object : Callback<List<Wish>> {
+      override fun onResponse(call: Call<List<Wish>>?, response: Response<List<Wish>>?) {
+        wishes.clear()
+        response?.body()?.forEach { wish ->
+          wishes.add(wish)
+        }
+        wishesAdapter.notifyDataSetChanged()
+      }
+
+      override fun onFailure(call: Call<List<Wish>>?, t: Throwable?) {
+        logError("cannot load wishes", t)
+      }
+    })
+  }
 }

+ 0 - 10
app/src/main/java/me/vadik/knigopis/UserViewHolder.kt

@@ -1,10 +0,0 @@
-package me.vadik.knigopis
-
-import android.support.v7.widget.RecyclerView.ViewHolder
-import android.view.View
-import android.widget.TextView
-
-class UserViewHolder(rootView: View) : ViewHolder(rootView) {
-  val userName: TextView = rootView.findViewById(R.id.user_name)
-  val bookCount: TextView = rootView.findViewById(R.id.book_count)
-}

+ 31 - 0
app/src/main/java/me/vadik/knigopis/adapters/BooksAdapter.kt

@@ -0,0 +1,31 @@
+package me.vadik.knigopis.adapters
+
+import android.support.v7.widget.RecyclerView
+import android.view.View
+import me.vadik.knigopis.adapters.BooksAdapter.BookViewHolder
+import android.view.ViewGroup
+import android.widget.TextView
+import me.vadik.knigopis.R
+import me.vadik.knigopis.inflate
+import me.vadik.knigopis.model.Book
+
+class BooksAdapter(private val books: List<Book>) : RecyclerView.Adapter<BookViewHolder>() {
+
+  class BookViewHolder(rootView: View) : RecyclerView.ViewHolder(rootView) {
+    val title: TextView = rootView.findViewById(R.id.book_title)
+    val author: TextView = rootView.findViewById(R.id.book_author)
+    val date: TextView = rootView.findViewById(R.id.book_read_date)
+  }
+
+  override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
+      BookViewHolder(parent.inflate(R.layout.book))
+
+  override fun onBindViewHolder(holder: BookViewHolder, position: Int) {
+    val book = books[position]
+    holder.title.text = book.title
+    holder.author.text = book.author
+    holder.date.text = book.createdAt
+  }
+
+  override fun getItemCount() = books.size
+}

+ 11 - 1
app/src/main/java/me/vadik/knigopis/UsersAdapter.kt → app/src/main/java/me/vadik/knigopis/adapters/UsersAdapter.kt

@@ -1,11 +1,21 @@
-package me.vadik.knigopis
+package me.vadik.knigopis.adapters
 
 import android.support.v7.widget.RecyclerView
+import android.view.View
 import android.view.ViewGroup
+import android.widget.TextView
+import me.vadik.knigopis.R
+import me.vadik.knigopis.adapters.UsersAdapter.UserViewHolder
+import me.vadik.knigopis.inflate
 import me.vadik.knigopis.model.User
 
 class UsersAdapter(private val users: List<User>) : RecyclerView.Adapter<UserViewHolder>() {
 
+  class UserViewHolder(rootView: View) : RecyclerView.ViewHolder(rootView) {
+    val userName: TextView = rootView.findViewById(R.id.user_name)
+    val bookCount: TextView = rootView.findViewById(R.id.book_count)
+  }
+
   override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
       UserViewHolder(parent.inflate(R.layout.user))
 

+ 31 - 0
app/src/main/java/me/vadik/knigopis/adapters/WishesAdapter.kt

@@ -0,0 +1,31 @@
+package me.vadik.knigopis.adapters
+
+import android.support.v7.widget.RecyclerView
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import me.vadik.knigopis.R
+import me.vadik.knigopis.adapters.WishesAdapter.WishViewHolder
+import me.vadik.knigopis.inflate
+import me.vadik.knigopis.model.Wish
+
+class WishesAdapter(private val wishes: List<Wish>) : RecyclerView.Adapter<WishViewHolder>() {
+
+  class WishViewHolder(rootView: View) : RecyclerView.ViewHolder(rootView) {
+    val title: TextView = rootView.findViewById(R.id.book_title)
+    val author: TextView = rootView.findViewById(R.id.book_author)
+    val date: TextView = rootView.findViewById(R.id.book_read_date)
+  }
+
+  override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
+      WishViewHolder(parent.inflate(R.layout.book))
+
+  override fun onBindViewHolder(holder: WishViewHolder, position: Int) {
+    val wish = wishes[position]
+    holder.title.text = wish.title
+    holder.author.text = wish.author
+    holder.date.text = wish.priority.toString()
+  }
+
+  override fun getItemCount() = wishes.size
+}

+ 5 - 2
app/src/main/java/me/vadik/knigopis/auth/KAuth.kt

@@ -3,7 +3,7 @@ package me.vadik.knigopis.auth
 import android.content.Context
 import android.content.Intent
 import me.vadik.knigopis.Endpoint
-import me.vadik.knigopis.log
+import me.vadik.knigopis.logError
 import me.vadik.knigopis.model.Credentials
 import retrofit2.Call
 import retrofit2.Callback
@@ -17,6 +17,7 @@ private const val ACCESS_TOKEN_KEY = "access_token"
 
 interface KAuth {
   fun isAuthorized(): Boolean
+  fun getAccessToken(): String
   fun getTokenRequest(): Intent
   fun saveTokenResponse(data: Intent)
   fun requestAccessToken(onSuccess: () -> Unit)
@@ -32,6 +33,8 @@ class KAuthImpl(
 
   override fun isAuthorized() = preferences.contains(ACCESS_TOKEN_KEY)
 
+  override fun getAccessToken(): String = preferences.getString(ACCESS_TOKEN_KEY, "")
+
   override fun getTokenRequest(): Intent {
     return Intent(context, UloginAuthActivity::class.java)
         .putExtra(UloginAuthActivity.FIELDS, arrayOf(TOKEN_KEY))
@@ -52,7 +55,7 @@ class KAuthImpl(
         }
 
         override fun onFailure(call: Call<Credentials>?, t: Throwable?) {
-          log("cannot get credentials", t)
+          logError("cannot get credentials", t)
         }
       })
     }

+ 2 - 2
app/src/main/java/me/vadik/knigopis/extensions.kt

@@ -14,9 +14,9 @@ fun Activity.app() = application as App
 
 fun <T : View> Activity.findView(@IdRes id: Int): T = findViewById(id)
 
-fun logw(message: String) = Log.w(TAG, message)
+fun logWarn(message: String) = Log.w(TAG, message)
 
-fun log(message: String, throwable: Throwable?) = Log.e(TAG, message, throwable)
+fun logError(message: String, throwable: Throwable?) = Log.e(TAG, message, throwable)
 
 fun ViewGroup.inflate(@LayoutRes layout: Int): View =
     LayoutInflater.from(context).inflate(layout, this, false)

+ 12 - 0
app/src/main/java/me/vadik/knigopis/model/Wish.kt

@@ -0,0 +1,12 @@
+package me.vadik.knigopis.model
+
+class Wish(
+    val id: String,
+    val userId: String,
+    val createdAt: String,
+    val updatedAt: String,
+    val title: String,
+    val author: String,
+    val priority: Int,
+    val notes: String
+)

+ 21 - 2
app/src/main/res/layout/activity_main.xml

@@ -23,11 +23,30 @@
     </android.support.design.widget.AppBarLayout>
 
     <android.support.v7.widget.RecyclerView
-        android:id="@+id/recycler_view"
+        android:id="@+id/users_recycler_view"
         android:layout_width="match_parent"
         android:layout_height="0dp"
         android:layout_weight="1"
-        tools:listitem="@layout/user"/>
+        android:visibility="gone"
+        tools:listitem="@layout/user"
+        tools:visibility="visible"/>
+
+    <android.support.v7.widget.RecyclerView
+        android:id="@+id/books_recycler_view"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1"
+        android:visibility="gone"
+        tools:listitem="@layout/book"
+        tools:visibility="visible"/>
+
+    <android.support.v7.widget.RecyclerView
+        android:id="@+id/wishes_recycler_view"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1"
+        android:visibility="gone"
+        tools:listitem="@layout/book"/>
 
     <android.support.design.widget.BottomNavigationView
         android:id="@+id/navigation"

+ 45 - 0
app/src/main/res/layout/book.xml

@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="72dp"
+    android:orientation="horizontal"
+    android:paddingLeft="16dp"
+    android:paddingRight="16dp">
+
+    <LinearLayout
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:layout_weight="1"
+        android:orientation="vertical">
+
+        <TextView
+            android:id="@+id/book_title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textColor="@android:color/primary_text_light"
+            android:textSize="16sp"
+            tools:text="Мастер и Маргарита"/>
+
+        <TextView
+            android:id="@+id/book_author"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textColor="@android:color/tertiary_text_light"
+            android:textSize="14sp"
+            tools:text="Михаил Булгаков"/>
+
+    </LinearLayout>
+
+    <TextView
+        android:id="@+id/book_read_date"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:textColor="@android:color/tertiary_text_light"
+        android:textSize="14sp"
+        tools:text="2011-08"/>
+
+</LinearLayout>

+ 2 - 1
app/src/main/res/layout/user.xml

@@ -3,7 +3,8 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
-    android:layout_height="wrap_content">
+    android:layout_height="wrap_content"
+    android:orientation="horizontal">
 
     <TextView
         android:id="@+id/user_name"