Skip to content

Instantly share code, notes, and snippets.

View lordcodes's full-sized avatar
⌨️
Coding

Andrew Lord lordcodes

⌨️
Coding
View GitHub Profile
@lordcodes
lordcodes / TeamActivity.kt
Created March 1, 2020 20:05
Code for the article: "The power of lazy properties in Kotlin"
class TeamActivity : FragmentActivity() {
private val viewModel: TeamViewModel by bindViewModel()
}
@lordcodes
lordcodes / ComponentActivityExt.kt
Created March 1, 2020 20:04
Code for the article: "The power of lazy properties in Kotlin"
inline fun <reified ViewModelT : ViewModel> ComponentActivity.bindViewModel() =
bindViewModel(ViewModelT::class, viewModelFactoryProvider)
@PublishedApi
internal fun <ViewModelT : ViewModel> ComponentActivity.bindViewModel(
viewModelType: KClass<ViewModelT>
): Lazy<ViewModelT> = lazy {
ViewModelProvider(this).get(viewModelType.java)
}
@lordcodes
lordcodes / TeamRepository.kt
Created March 1, 2020 20:03
Code for the article: "The power of lazy properties in Kotlin"
class TeamRepository(appSchedulers: AppSchedulers) {
private val viewState by lazy(::createViewStateLiveData)
private fun createViewStateLiveData(): LiveData<ViewState> =
teamRepository.teamMembersStream()
.map(::mapPresentingState)
.onErrorReturn(::mapErrorState)
.startWith(ViewState.Loading)
.subscribeOn(appSchedulers.io)
.observeOn(appSchedulers.main)
@lordcodes
lordcodes / FilesActivity.kt
Created March 1, 2020 20:02
Code for the article: "The power of lazy properties in Kotlin"
private val bindingController by lazy {
FilesBindingController(viewModel::onFileOpened)
}
@lordcodes
lordcodes / AttachmentUploader.kt
Created February 25, 2020 20:22
Code for the article: "Uploading a file with progress in Kotlin"
uploader.uploadAttachment(request.filename, request.file, request.mimeType)
.subscribeOn(appRxSchedulers.io)
.observeOn(appRxSchedulers.main)
.subscribeBy(
onError = { error ->
// Display error alert
},
onComplete = {
// Display completed Snackbar
},
@lordcodes
lordcodes / AttachmentUploader.kt
Created February 25, 2020 20:21
Code for the article: "Uploading a file with progress in Kotlin"
fun uploadAttachment(
filename: String, file: File, mimeType: String
): Observable<AttachmentUploadRemoteResult> {
val progressEmitter = PublishSubject.create<Double>()
val uploadRequest = createUploadRequest(
filename, file, mimeType, progressEmitter
)
val uploadResult = uploadRequest
.map<AttachmentUploadRemoteResult> {
@lordcodes
lordcodes / AttachmentUploader.kt
Created February 25, 2020 20:21
Code for the article: "Uploading a file with progress in Kotlin"
private fun createUploadRequest(
filename: String,
file: File,
mimeType: String,
progressEmitter: PublishSubject<Double>
): Single<AttachmentUploadedRemoteDto> {
val requestBody = createUploadRequestBody(file, mimeType, progressEmitter)
return remoteApi.attachFile(
filename = filename.toPlainTextBody(),
mimeType = mimeType.toPlainTextBody(),
@lordcodes
lordcodes / AttachmentUploader.kt
Created February 25, 2020 20:20
Code for the article: "Uploading a file with progress in Kotlin"
private fun createUploadRequestBody(
file: File,
mimeType: String,
progressEmitter: PublishSubject<Double>
): RequestBody {
val fileRequestBody = file.asRequestBody(mimeType.toMediaType())
return CountingRequestBody(fileRequestBody) { bytesWritten, contentLength ->
val progress = 1.0 * bytesWritten / contentLength
progressEmitter.onNext(progress)
@lordcodes
lordcodes / CountingRequestResult.kt
Created February 25, 2020 20:19
Code for the article: "Uploading a file with progress in Kotlin"
sealed class CountingRequestResult<ResultT> {
data class Progress<ResultT>(
val progressFraction: Double
) : CountingRequestResult<ResultT>()
data class Completed<ResultT>(
val result: ResultT
) : CountingRequestResult<ResultT>()
}
@lordcodes
lordcodes / CountingRequestBody.kt
Created February 25, 2020 20:19
Code for the article: "Uploading a file with progress in Kotlin"
class CountingRequestBody(...) : RequestBody() {
...
@Throws(IOException::class)
override fun writeTo(sink: BufferedSink) {
val countingSink = CountingSink(sink, this, onProgressUpdate)
val bufferedSink = countingSink.buffer()
requestBody.writeTo(bufferedSink)