Skip to content

Commit f3be5b5

Browse files
authored
Merge pull request #39 from SoftwareEngineeringDaily/develop
v1.0.3
2 parents 7828dd2 + ac1e0c2 commit f3be5b5

21 files changed

+213
-60
lines changed

.stickler.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
linters:
2+
ktlint:
3+
android: true
4+
fixer: true
5+
fixers:
6+
enable: true

app/build.gradle

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ android {
2020
applicationId "com.koalatea.sedaily"
2121
minSdkVersion 21
2222
targetSdkVersion 29
23-
versionCode 18
24-
versionName "1.0.2"
23+
versionCode 19
24+
versionName "1.0.3"
2525
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
2626
}
2727

@@ -141,6 +141,9 @@ dependencies {
141141
// Timber
142142
implementation 'com.jakewharton.timber:timber:4.7.1'
143143

144+
// Custom Tabs
145+
implementation 'androidx.browser:browser:1.0.0'
146+
144147
// Testing
145148
testImplementation 'junit:junit:4.12'
146149
androidTestImplementation 'androidx.test:runner:1.2.0'

app/src/main/java/com/koalatea/sedaily/database/model/Comment.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ data class Comment(
1111
val author: Author,
1212
val rootEntity: String,
1313
val content: String,
14-
val mentions: List<String>?,
1514
val deleted: Boolean?,
1615
val dateCreated: String,
1716
val score: Int?,

app/src/main/java/com/koalatea/sedaily/feature/bookmarks/BookmarksFragment.kt

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ class BookmarksFragment : BaseFragment() {
6262
epoxyRecyclerView.setController(this)
6363
}
6464

65+
bookmarksSwipeRefreshLayout.setOnRefreshListener {
66+
viewModel.fetchBookmarks()
67+
}
68+
6569
viewModel.bookmarksResource.observe(this, Observer { resource ->
6670
when (resource) {
6771
is Resource.Loading -> {
@@ -94,18 +98,18 @@ class BookmarksFragment : BaseFragment() {
9498

9599
private fun showLoading() {
96100
emptyStateContainer.visibility = View.GONE
97-
epoxyRecyclerView.visibility = View.GONE
101+
bookmarksSwipeRefreshLayout.visibility = View.GONE
98102

99-
progressBar.visibility = View.VISIBLE
103+
bookmarksSwipeRefreshLayout.isRefreshing = true
100104
}
101105

102106
private fun hideLoading() {
103-
progressBar.visibility = View.GONE
107+
bookmarksSwipeRefreshLayout.isRefreshing = false
104108
}
105109

106110
private fun showLoginEmptyState() {
107-
epoxyRecyclerView.visibility = View.GONE
108-
progressBar.visibility = View.GONE
111+
bookmarksSwipeRefreshLayout.visibility = View.GONE
112+
bookmarksSwipeRefreshLayout.isRefreshing = false
109113

110114
emptyStateContainer.textView.text = getString(R.string.login_to_manage_bookmarks)
111115
emptyStateContainer.visibility = View.VISIBLE
@@ -115,9 +119,9 @@ class BookmarksFragment : BaseFragment() {
115119
bookmarksEpoxyController?.setData(episodes)
116120

117121
emptyStateContainer.visibility = View.GONE
118-
progressBar.visibility = View.GONE
122+
bookmarksSwipeRefreshLayout.isRefreshing = false
119123

120-
epoxyRecyclerView.visibility = View.VISIBLE
124+
bookmarksSwipeRefreshLayout.visibility = View.VISIBLE
121125
}
122126

123127
}

app/src/main/java/com/koalatea/sedaily/feature/commentList/CommentsFragment.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ class CommentsFragment : BaseFragment() {
5151
commentsEpoxyController = CommentsEpoxyController(
5252
replyClickListener = { comment ->
5353
viewModel.replyTo(comment)
54+
},
55+
upVoteClickListener = { comment ->
56+
viewModel.upVoteComment(comment)
5457
}
5558
).apply {
5659
epoxyRecyclerView.setController(this)
@@ -73,6 +76,21 @@ class CommentsFragment : BaseFragment() {
7376
viewModel.cancelReply()
7477
}
7578

79+
viewModel.commentVoteLiveData.observe(this, Observer { it.getContentIfNotHandled()?.let { resource ->
80+
when (resource) {
81+
is Resource.RequireLogin -> showPromptLoginDialog()
82+
is Resource.Success -> {
83+
viewModel.reloadComments(entityId)
84+
}
85+
is Resource.Error -> {
86+
hideLoading()
87+
88+
if (resource.isConnected) acknowledgeGenericError() else acknowledgeConnectionError()
89+
}
90+
}
91+
}
92+
})
93+
7694
viewModel.commentsResource.observe(this, Observer { resource ->
7795
when (resource) {
7896
is Resource.Loading -> {

app/src/main/java/com/koalatea/sedaily/feature/commentList/CommentsViewModel.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ class CommentsViewModel(
2626
val replyToCommentLiveData: LiveData<Comment?>
2727
get() = _replyToCommentLiveData
2828

29+
private val _commentVoteLiveData = MutableLiveData<Event<Resource<Boolean>>>()
30+
val commentVoteLiveData: LiveData<Event<Resource<Boolean>>>
31+
get() = _commentVoteLiveData
32+
2933
private val _addCommentLiveData = MutableLiveData<Event<Resource<Boolean>>>()
3034
val addCommentLiveData: LiveData<Event<Resource<Boolean>>>
3135
get() = _addCommentLiveData
@@ -42,6 +46,16 @@ class CommentsViewModel(
4246
entityIdLiveData.value = entityId
4347
}
4448

49+
@MainThread
50+
fun upVoteComment(comment: Comment) = viewModelScope.launch {
51+
with(_commentVoteLiveData) {
52+
postValue(Event(Resource.Loading))
53+
54+
val resource = commentsRepository.upVoteComment(comment._id)
55+
postValue(Event(resource))
56+
}
57+
}
58+
4559
@MainThread
4660
fun addComment(comment: String) = viewModelScope.launch {
4761
if (comment.isBlank()) return@launch

app/src/main/java/com/koalatea/sedaily/feature/commentList/epoxy/BaseCommentEpoxyModelWithHolder.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ abstract class BaseCommentEpoxyModelWithHolder<Holder: BaseCommentHolder> : Epox
2121
@EpoxyAttribute lateinit var authorName: String
2222
@EpoxyAttribute lateinit var comment: String
2323
@EpoxyAttribute var date: Date? = null
24+
@EpoxyAttribute var score: Int? = 0
25+
@EpoxyAttribute var upvoted: Boolean = false
2426

2527
@CallSuper
2628
override fun bind(holder: Holder) {
@@ -43,7 +45,6 @@ abstract class BaseCommentEpoxyModelWithHolder<Holder: BaseCommentHolder> : Epox
4345
holder.dateTextView.visibility = View.GONE
4446
}
4547
}
46-
4748
}
4849

4950
abstract class BaseCommentHolder : KotlinEpoxyHolder() {

app/src/main/java/com/koalatea/sedaily/feature/commentList/epoxy/CommentEpoxyModelWithHolder.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,21 @@ import com.koalatea.sedaily.R
99
abstract class CommentEpoxyModelWithHolder : BaseCommentEpoxyModelWithHolder<CommentHolder>() {
1010

1111
@EpoxyAttribute lateinit var replyClickListener: () -> Unit
12+
@EpoxyAttribute lateinit var upVoteClickListener: () -> Unit
1213

1314
override fun bind(holder: CommentHolder) {
1415
super.bind(holder)
1516

1617
holder.replayButton.setOnClickListener { replyClickListener() }
18+
holder.upVoteButton.setOnClickListener { upVoteClickListener() }
19+
holder.upVoteButton.isSelected = upvoted
20+
holder.upVoteButton.text = score?.let {
21+
if (it > 0) { it.toString() } else { "" }
22+
} ?: ""
1723
}
18-
1924
}
2025

2126
class CommentHolder : BaseCommentHolder() {
2227
val replayButton by bind<Button>(R.id.replyButton)
23-
}
28+
val upVoteButton by bind<Button>(R.id.commentUpvoteButton)
29+
}

app/src/main/java/com/koalatea/sedaily/feature/commentList/epoxy/CommentsEpoxyController.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import com.airbnb.epoxy.TypedEpoxyController
44
import com.koalatea.sedaily.database.model.Comment
55

66
class CommentsEpoxyController(
7-
private val replyClickListener: (comment: Comment) -> Unit
7+
private val replyClickListener: (comment: Comment) -> Unit,
8+
private val upVoteClickListener: (comment: Comment) -> Unit
89
) : TypedEpoxyController<List<Comment>>() {
910

1011
override fun buildModels(comments: List<Comment>) {
@@ -17,7 +18,10 @@ class CommentsEpoxyController(
1718
authorName(comment.author.name ?: comment.author.username)
1819
comment(comment.content)
1920
date(comment.utcDateCreated)
21+
score(comment.score)
2022
replyClickListener { replyClickListener(comment) }
23+
upVoteClickListener { upVoteClickListener(comment) }
24+
upvoted(comment?.upvoted ?: false)
2125
}
2226

2327
comment.replies?.forEach { reply ->
@@ -29,9 +33,12 @@ class CommentsEpoxyController(
2933
authorName(reply.author.name ?: comment.author.username)
3034
comment(reply.content)
3135
date(reply.utcDateCreated)
36+
upVoteClickListener { upVoteClickListener(reply) }
37+
upvoted(reply?.upvoted ?: false)
38+
score(reply.score)
3239
}
3340
}
3441
}
3542
}
3643

37-
}
44+
}
Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,26 @@
11
package com.koalatea.sedaily.feature.commentList.epoxy
22

3+
import android.widget.Button
4+
import com.airbnb.epoxy.EpoxyAttribute
35
import com.airbnb.epoxy.EpoxyModelClass
46
import com.koalatea.sedaily.R
57

68
@EpoxyModelClass(layout = R.layout.view_holder_reply)
7-
abstract class ReplyEpoxyModelWithHolder : BaseCommentEpoxyModelWithHolder<ReplyHolder>()
9+
abstract class ReplyEpoxyModelWithHolder : BaseCommentEpoxyModelWithHolder<ReplyHolder>() {
810

9-
class ReplyHolder : BaseCommentHolder()
11+
@EpoxyAttribute lateinit var upVoteClickListener: () -> Unit
12+
13+
override fun bind(holder: ReplyHolder) {
14+
super.bind(holder)
15+
16+
holder.upVoteButton.setOnClickListener { upVoteClickListener() }
17+
holder.upVoteButton.isSelected = upvoted
18+
holder.upVoteButton.text = score?.let {
19+
if (it > 0) { it.toString() } else { "" }
20+
} ?: ""
21+
}
22+
}
23+
24+
class ReplyHolder : BaseCommentHolder() {
25+
val upVoteButton by bind<Button>(R.id.replyUpvoteButton)
26+
}

0 commit comments

Comments
 (0)