Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save seoft/7b6db60bdd724a5b935d02d1cb85f4c2 to your computer and use it in GitHub Desktop.
Save seoft/7b6db60bdd724a5b935d02d1cb85f4c2 to your computer and use it in GitHub Desktop.
package kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.ui.sub
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.view.View
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.SerialDisposable
import io.reactivex.schedulers.Schedulers
import kotlinx.android.synthetic.main.activity_sub.*
import kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.BuildConfig
import kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.R
import kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.data.BookRepo
import kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.data.api.createGsonFactory
import kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.data.api.createOkHttpFactory
import kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.data.api.createWebService
import kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.ui.ActivityHelper
import kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.util.get
import kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.util.setupActionBar
import kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.util.toast
import java.util.concurrent.TimeUnit
// ref
// https://blog.mindorks.com/understanding-rxjava-timer-delay-and-interval-operators
// https://brunch.co.kr/@tilltue/49
class SubActivity : ActivityHelper() {
val TAG = "SubActivity"
val DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
val SEARCH_MAINTAIN_DELAY = 300L
override val layoutResourceId = R.layout.activity_sub
lateinit var vm: SubVM
lateinit var rvBooks: RecyclerView
private lateinit var adapter: BookAdapter
private lateinit var lm: LinearLayoutManager
var serialDisposable = SerialDisposable()
lateinit var keyword: String
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_sub)
vm = ViewModelProviders.of(
this, SubVM(
BookRepo(
createWebService(
createOkHttpFactory(),
createGsonFactory(DATE_FORMAT),
BuildConfig.BASE_URL
), BuildConfig.AUTH_KEY
)
).create()
).get(SubVM::class.java)
initToolbar()
initRecyclerView()
initObservalble()
keyword = intent.getStringExtra(ID_KEYWORD)
vm.addData(keyword)
}
private fun initObservalble() {
vm.doRefresh.observe(this, Observer {
// vm.page -1 >> -1 : for offset +1 in addData's callback method
adapter.notifyItemRangeChanged((vm.page - 1) * vm.COUNT_PER_PAGE, vm.refreshCount)
})
vm.doEmptyData.observe(this, Observer {
"검색결과가 없습니다".toast()
setResult(Activity.RESULT_CANCELED)
finish()
})
vm.doFail.observe(this, Observer {
"인터넷 연결을 확인해주세요".toast()
setResult(Activity.RESULT_CANCELED)
finish()
})
vm.doFailParse.observe(this, Observer {
"알맞지 않은 양식이 들어왔습니다".toast()
})
vm.isLoading.observe(this, Observer {
pbLoading.visibility = if (it) View.VISIBLE
else View.INVISIBLE
})
}
private fun initRecyclerView() {
adapter = BookAdapter(vm.books, {
val intent = Intent().apply {
putExtra(ID_BOOK, it)
}
setResult(Activity.RESULT_OK, intent)
finish()
}, {
keyword = it
val disposable = Observable
.timer(SEARCH_MAINTAIN_DELAY, TimeUnit.MILLISECONDS)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
adapter.notifyItemRangeRemoved(1, vm.books.size - 1)
vm.clearBooks()
vm.addData(keyword)
}
serialDisposable.set(disposable)
})
lm = LinearLayoutManager(this)
rvBooks = findViewById(R.id.rvBooks)
rvBooks.layoutManager = lm
rvBooks.adapter = adapter
rvBooks.addItemDecoration(
DividerItemDecoration(
applicationContext,
DividerItemDecoration.VERTICAL
)
)
rvBooks.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
if (!vm.isLoading.get() && !rvBooks.canScrollVertically(1) && dy > 0)
vm.addData(keyword)
}
})
}
private fun initToolbar() {
setupActionBar(R.id.toolbar) {
setDisplayShowTitleEnabled(true)
setDisplayHomeAsUpEnabled(true)
setHomeAsUpIndicator(R.drawable.ic_arrow_back_black)
}
}
companion object {
const val ID_KEYWORD = "ID_KEYWORD"
const val ID_BOOK = "ID_BOOK"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment