Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 11 additions & 15 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -62,16 +62,18 @@ dependencies {

implementation "com.google.code.gson:gson:$gson"

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.2.1'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.2.1'
implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
androidTestImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.2.1'

implementation "com.squareup.retrofit2:converter-gson:$retrofit"

implementation "com.google.dagger:dagger-android:$dagger2"
implementation "com.google.dagger:dagger-android-support:$dagger2"
kapt "com.google.dagger:dagger-android-processor:$dagger2"
kapt "com.google.dagger:dagger-compiler:$dagger2"

implementation "com.squareup.retrofit2:adapter-rxjava2:$retrofit"
implementation "com.squareup.retrofit2:converter-gson:$retrofit"
implementation "io.reactivex.rxjava2:rxjava:$rxjava2"
implementation "io.reactivex.rxjava2:rxandroid:$rxandroid"

implementation "androidx.legacy:legacy-support-v4:$androidx_core"
implementation "androidx.appcompat:appcompat:$androidx_appcompat"
implementation "androidx.recyclerview:recyclerview:$androidx_core"
Expand All @@ -85,10 +87,11 @@ dependencies {

implementation "androidx.lifecycle:lifecycle-extensions:$android_arch"
kapt "androidx.lifecycle:lifecycle-compiler:$android_arch"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0-alpha01"

implementation "androidx.room:room-runtime:$room"
implementation "androidx.room:room-ktx:$room"
kapt "androidx.room:room-compiler:$room"
implementation "androidx.room:room-rxjava2:$room"

implementation "com.github.bumptech.glide:glide:$glide"
kapt "com.github.bumptech.glide:compiler:$glide"
Expand All @@ -103,12 +106,7 @@ dependencies {
testImplementation "org.mockito:mockito-core:$mockito"
testImplementation "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
testImplementation "org.assertj:assertj-core:$assertj"

implementation "com.uber.autodispose:autodispose-android:$uber_autodispose"
implementation "com.uber.autodispose:autodispose-lifecycle:$uber_autodispose"
implementation "com.uber.autodispose:autodispose-lifecycle-jdk8:$uber_autodispose"
implementation "com.uber.autodispose:autodispose-lifecycle-ktx:$uber_autodispose"
implementation "com.uber.autodispose:autodispose-android-archcomponents:$uber_autodispose"
testImplementation "androidx.arch.core:core-testing:$android_arch"

// Testing-only dependencies
androidTestImplementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
Expand All @@ -121,13 +119,11 @@ dependencies {
androidTestImplementation "androidx.test.espresso:espresso-contrib:$espresso"
androidTestImplementation "androidx.test.espresso.idling:idling-concurrent:3.1.1"

androidTestImplementation "com.squareup.rx.idler:rx2-idler:$rxidler"
androidTestImplementation "com.squareup.okhttp3:mockwebserver:$mockwebserver"
androidTestImplementation "org.jetbrains.kotlin:kotlin-reflect:1.3.21"
androidTestImplementation "org.jetbrains.kotlin:kotlin-reflect:1.3.30"

kaptAndroidTest "com.google.dagger:dagger-android-processor:$dagger2"
kaptAndroidTest "com.google.dagger:dagger-compiler:$dagger2"

}

repositories {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ package com.balch.auctionbrowser
import androidx.test.platform.app.InstrumentationRegistry

open class BaseTest {
protected val app by lazy { InstrumentationRegistry.getInstrumentation().targetContext.applicationContext as TestAuctionApplication }

fun getJson(jsonFile : String) : String {
val ctx = InstrumentationRegistry.getInstrumentation().context
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@ import androidx.test.espresso.matcher.ViewMatchers.isAssignableFrom
import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.ext.junit.rules.activityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import com.balch.auctionbrowser.dagger.TestApplicationComponent
import okhttp3.mockwebserver.MockResponse
import okhttp3.mockwebserver.MockWebServer
Expand All @@ -66,8 +65,6 @@ import javax.inject.Inject
@RunWith(AndroidJUnit4::class)
class MainActivityTest : BaseTest() {

val app by lazy { InstrumentationRegistry.getInstrumentation().targetContext.applicationContext as TestAuctionApplication }

@Inject
lateinit var mockWebServer: MockWebServer

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,23 +24,12 @@ package com.balch.auctionbrowser.runner

import android.app.Application
import android.content.Context
import android.os.Bundle
import androidx.test.runner.AndroidJUnitRunner
import com.balch.auctionbrowser.TestAuctionApplication
import com.squareup.rx2.idler.Rx2Idler
import io.reactivex.plugins.RxJavaPlugins
import kotlin.reflect.jvm.jvmName

class AuctionTestRunner : AndroidJUnitRunner() {

override fun onCreate(arguments: Bundle) {
super.onCreate(arguments)

RxJavaPlugins.setInitIoSchedulerHandler(
Rx2Idler.create("RxJava 2.x Computation Scheduler"))

}

override fun newApplication(cl: ClassLoader?, className: String?, context: Context?): Application {
return super.newApplication(cl, TestAuctionApplication::class.jvmName, context)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,6 @@ class AuctionDataSourceFactory(

val source = MutableLiveData<AuctionDataSource>()

override fun create(): DataSource<Long, Auction> {
val source = AuctionDataSource(context, searchQuery, sortColumn)
this.source.postValue(source)
return source
}
override fun create(): DataSource<Long, Auction> =
AuctionDataSource(context, searchQuery, sortColumn).also { source.postValue(it) }
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,30 +30,22 @@ import com.balch.auctionbrowser.R
import com.balch.auctionbrowser.auction.model.Auction
import com.balch.auctionbrowser.base.NetworkState
import com.balch.auctionbrowser.dagger.ActivityScope
import io.reactivex.Observable
import io.reactivex.subjects.PublishSubject
import javax.inject.Inject

typealias AuctionHandler = (Auction) -> Unit

@ActivityScope
class AuctionAdapter @Inject constructor() :
PagedListAdapter<Auction, RecyclerView.ViewHolder>(diffCallback) {

// public properties
val onClickAuction: Observable<Auction>
get() = clickAuctionSubject

val onClickNote: Observable<Auction>
get() = clickNoteSubject

// backing for exposing user initiated events to Activity
private val clickAuctionSubject: PublishSubject<Auction> = PublishSubject.create<Auction>()
private val clickNoteSubject: PublishSubject<Auction> = PublishSubject.create<Auction>()
var onClickAuction: AuctionHandler? = null
var onClickNote: AuctionHandler? = null

private var networkState: NetworkState? = null

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return when (viewType) {
R.layout.item_auction_list -> AuctionViewHolder(parent, clickAuctionSubject, clickNoteSubject)
R.layout.item_auction_list -> AuctionViewHolder(parent, onClickAuction, onClickNote)
R.layout.network_state_item -> NetworkStateItemViewHolder.create(parent)
else -> throw IllegalArgumentException("unknown view type $viewType")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
*
*/

package com.balch.auctionbrowser.auction;
package com.balch.auctionbrowser.auction

import android.content.Context
import androidx.lifecycle.MutableLiveData
Expand All @@ -31,6 +31,7 @@ import com.balch.auctionbrowser.auction.model.EBayRepository
import com.balch.auctionbrowser.base.NetworkState
import com.balch.auctionbrowser.ext.component
import com.balch.auctionbrowser.note.NotesRepository
import kotlinx.coroutines.runBlocking
import timber.log.Timber
import javax.inject.Inject

Expand All @@ -53,14 +54,14 @@ class AuctionDataSource constructor(

override fun loadInitial(params: LoadInitialParams<Long>,
callback: LoadInitialCallback<Long, Auction>) {

val auctionData = loadAuctions(1)
callback.onResult(auctionData.auctions, null,
if (auctionData.totalPages > 1) 2 else null)
if (auctionData.totalPages > 1) 2 else null)
}

override fun loadBefore(params: LoadParams<Long>,
callback: LoadCallback<Long, Auction>) {

}

override fun loadAfter(params: LoadParams<Long>,
Expand All @@ -70,27 +71,24 @@ class AuctionDataSource constructor(
if (auctionData.totalPages > params.key) params.key + 1 else null)
}

private fun loadAuctions(page:Long): AuctionData {
try {
networkState.postValue(NetworkState.LOADING)

val auctionData = auctionRepository.getAuctions(searchText, page, AUCTION_FETCH_COUNT, sortColumn)
.flatMap { auctionData ->
notesRepository.getNotes(auctionData.auctions).toSingle(mutableMapOf())
.map { notes ->
auctionData.auctions.forEach { it.note = notes[it.itemId] }
auctionData
}
}
.blockingGet()
private fun loadAuctions(page:Long) : AuctionData {
networkState.postValue(NetworkState.LOADING)

lateinit var auctionData: AuctionData
try {
runBlocking {
auctionData = auctionRepository.getAuctions(searchText, page, AUCTION_FETCH_COUNT, sortColumn)
val notes = notesRepository.getNotes(auctionData.auctions)
auctionData.auctions.forEach { it.note = notes[it.itemId] }
}
networkState.postValue(NetworkState.LOADED)
return auctionData
} catch (ex: Throwable) {
Timber.e(ex, "Error in .getAuctions()")
Timber.e(ex)
networkState.postValue(NetworkState(NetworkState.Status.FAILED,
ex.message ?: "Unknown Error"))
return AuctionData()
auctionData = AuctionData()
}

return auctionData
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,6 @@ import com.balch.auctionbrowser.ext.loadUrl
import com.balch.auctionbrowser.ext.toLongDateTimeString
import com.balch.auctionbrowser.note.Note
import com.bumptech.glide.request.RequestOptions
import io.reactivex.Observable
import io.reactivex.subjects.PublishSubject
import kotlinx.android.synthetic.main.dialog_auction_detai.*

class AuctionDetailDialog : androidx.fragment.app.DialogFragment() {
Expand All @@ -58,17 +56,11 @@ class AuctionDetailDialog : androidx.fragment.app.DialogFragment() {
}
}

val onSaveNote: Observable<String>
get() = saveNoteSubject

val onClearNote: Observable<Unit>
get() = clearNoteSubject
var onSaveNote: ((String) -> Unit)? = null
var onClearNote: (() -> Unit)? = null

private val noteEditText: EditText by lazy { dialog.auction_detail_note }

private val saveNoteSubject: PublishSubject<String> = PublishSubject.create()
private val clearNoteSubject: PublishSubject<Unit> = PublishSubject.create()

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return AlertDialog.Builder(context!!)
.setView(inflate(dialog_auction_detai))
Expand Down Expand Up @@ -109,13 +101,13 @@ class AuctionDetailDialog : androidx.fragment.app.DialogFragment() {
val saveButton = dialog.member_detail_button_save
val clearButton = dialog.member_detail_button_clear
if (enableSaveButtons) {
saveButton.setOnClickListener { _ ->
saveNoteSubject.onNext(noteEditText.text.toString())
saveButton.setOnClickListener {
onSaveNote?.invoke(noteEditText.text.toString())
dismiss()
}

clearButton.setOnClickListener { _ ->
clearNoteSubject.onNext(Unit)
clearButton.setOnClickListener {
onClearNote?.invoke()
dismiss()
}
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,6 @@

import com.balch.auctionbrowser.MainActivity;
import com.balch.auctionbrowser.dagger.ActivityScope;
import com.uber.autodispose.android.lifecycle.AndroidLifecycleScopeProvider;
import com.uber.autodispose.lifecycle.LifecycleScopeProvider;

import dagger.Binds;
import dagger.Module;
Expand Down Expand Up @@ -61,11 +59,4 @@ static AuctionViewModel providesAuctionViewModel(MainActivity activity,
return ViewModelProviders.of(activity, factory).get(AuctionViewModel.class);
}

@Provides
@ActivityScope
static LifecycleScopeProvider<?> providesScopeProvider(MainActivity activity) {
return AndroidLifecycleScopeProvider.from(activity);
}


}
Loading