Skip to content

Instantly share code, notes, and snippets.

@autrilla
Created March 27, 2016 22:19
Show Gist options
  • Select an option

  • Save autrilla/9c3dd2dad7974db271e6 to your computer and use it in GitHub Desktop.

Select an option

Save autrilla/9c3dd2dad7974db271e6 to your computer and use it in GitHub Desktop.
package com.favega.farmnet
import android.app.Activity
import android.support.design.widget.Snackbar
import android.support.v7.widget.CardView
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.Button
import android.widget.CheckBox
import android.widget.EditText
import android.widget.TextView
import butterknife.bindView
import retrofit2.adapter.rxjava.HttpException
import rx.android.schedulers.AndroidSchedulers
import rx.schedulers.Schedulers
import java.net.UnknownHostException
class TemperatureProbeAdapter(val probes: MutableList<TemperatureProbe>,
val temperatureProbeService: FarmnetTemperatureProbeService,
val activity: Activity) :
RecyclerView.Adapter<TemperatureProbeAdapter.TemperatureProbeCard>() {
inner class TemperatureProbeCard(val card: CardView) : RecyclerView.ViewHolder(card) {
private val serialNumberView: TextView by bindView(R.id.temperature_probe_serial_number)
private val temperatureView: TextView by bindView(R.id.temperature_probe_temperature)
private val alarmCheckbox : CheckBox by bindView(R.id.temperature_probe_alarm_enabled)
private val alarmLowView: EditText by bindView(R.id.alarm_low)
private val alarmHighView: EditText by bindView(R.id.alarm_high)
val save : Button by bindView(R.id.temperature_probe_save)
init {
save.setOnClickListener { save(this) }
}
var serialNumber : String
get() = serialNumberView.text.toString()
set(value) { serialNumberView.text = value }
var temperature : Float?
get() = temperatureView.text.toString().toFloat()
set(value) {
if (value != null)
temperatureView.text = "%.2f °C".format(value)
else
temperatureView.text = "-"
}
var alarmEnabled: Boolean
get() = alarmCheckbox.isChecked
set(value) { alarmCheckbox.isChecked = value }
var alarmLow : Float?
get() = alarmLowView.text.toString().toFloat()
set(value) { if (value != null) alarmLowView.setText(value.toString()) }
var alarmHigh : Float?
get() = alarmHighView.text.toString().toFloat()
set(value) { if (value != null) alarmHighView.setText(value.toString()) }
}
override fun getItemCount(): Int {
return probes.size
}
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): TemperatureProbeCard? {
val v = LayoutInflater.from(parent?.context)
.inflate(R.layout.temperature_probe_card, parent, false)
return TemperatureProbeCard(v as CardView)
}
override fun onBindViewHolder(card: TemperatureProbeCard?, position: Int) {
val probe = probes[position]
card!!.serialNumber = probe.serialNumber
card.temperature = probe.temperature?.temperature
card.alarmEnabled = probe.alarm != null
card.alarmLow = probe.alarm?.lowerLimit
card.alarmHigh = probe.alarm?.upperLimit
}
fun save(card: TemperatureProbeCard) {
if (card.alarmEnabled) {
val alarm = FarmnetTemperatureProbeService.TemperatureAlarm(card.alarmHigh!!,
card.alarmLow!!)
temperatureProbeService.createAlarm(card.serialNumber, alarm)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({}, {
if (it is HttpException && it.code() == 409) {
// There was an alarm already, so PUT instead of POST
temperatureProbeService.updateAlarm(card.serialNumber, alarm)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({}, { showErrorSavingSnackbar() },
{ showSavedSnackbar() })
} else if (it is UnknownHostException) {
showErrorNoInternet()
} else {
showErrorSavingSnackbar()
}
}, { showSavedSnackbar() })
} else {
temperatureProbeService.deleteAlarm(card.serialNumber)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({}, {
if (it is HttpException && it.code() == 404)
showSavedSnackbar()
else
showErrorSavingSnackbar()
}, { showSavedSnackbar() })
}
}
fun showErrorNoInternet() {
Snackbar.make(activity.findViewById(android.R.id.content)!!,
activity.getString(R.string.error_no_internet), Snackbar.LENGTH_LONG).show()
}
fun showErrorSavingSnackbar() {
Snackbar.make(activity.findViewById(android.R.id.content)!!,
activity.getString(R.string.error_saving), Snackbar.LENGTH_LONG).show()
}
fun showSavedSnackbar() {
Snackbar.make(activity.findViewById(android.R.id.content)!!,
activity.getString(R.string.saved), Snackbar.LENGTH_LONG).show()
}
class TemperatureProbe(val serialNumber: String,
val alarm: FarmnetTemperatureProbeService.TemperatureAlarm?,
val temperature: FarmnetTemperatureProbeService.TemperatureMeasurement?)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment