package
com.droidcon.kotlinapplication
import
android.app.DatePickerDialog
import
android.os.Bundle
import
kotlinx.coroutines.GlobalScope
import
android.view.View
import
android.widget.Button
import
android.widget.EditText
import
android.widget.ProgressBar
import
okhttp3.OkHttpClient
import
okhttp3.Request
import
android.widget.TextView
import
android.widget.Toast
import
androidx.appcompat.app.AppCompatActivity
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.launch
import
kotlinx.coroutines.withContext
import
org.jsoup.Jsoup
import
java.text.SimpleDateFormat
import
java.util.Calendar
import
java.util.Date
class
MainActivity : AppCompatActivity() {
private
lateinit var trainStatusTV: TextView
private
lateinit var getTrainStatusBtn: Button
private
lateinit var trainNumberEdt: EditText
private
lateinit var loadingPB: ProgressBar
private
lateinit var dateTV: TextView
private
var mYear =
0
private
var mMonth =
0
private
var mDay =
0
private
var formattedDate =
""
override fun onCreate(savedInstanceState: Bundle?) {
super
.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
trainStatusTV = findViewById(R.id.idTVTrainStatus)
getTrainStatusBtn = findViewById(R.id.btnView)
trainNumberEdt = findViewById(R.id.idEdtTrainNumber)
loadingPB = findViewById(R.id.idPBLoading)
dateTV = findViewById(R.id.idTVDate)
getTrainStatusBtn.setOnClickListener(View.OnClickListener {
if
(!trainNumberEdt.getText().toString().isEmpty() && dateTV.getText()
.toString() !=
"Select Date"
) {
checkTrainStatus(trainNumberEdt.getText().toString(), formattedDate)
}
else
{
Toast.makeText(
this
@MainActivity
,
"Please enter the train number as well as date.."
,
Toast.LENGTH_SHORT
).show()
}
})
dateTV.setOnClickListener {
pickDate()
}
}
private
fun pickDate() {
val c = Calendar.getInstance()
mYear = c[Calendar.YEAR]
mMonth = c[Calendar.MONTH]
mDay = c[Calendar.DAY_OF_MONTH]
val datePickerDialog = DatePickerDialog(
this
,
{ view, year, monthOfYear, dayOfMonth ->
val dateFormat = dayOfMonth.toString() +
"-"
+ (monthOfYear +
1
) +
"-"
+ year
val inputDateFormat = SimpleDateFormat(
"dd-MM-yyyy"
)
val outputDateFormat = SimpleDateFormat(
"yyyyMMdd"
)
var inputDate: Date? =
null
try
{
inputDate = inputDateFormat.parse(dateFormat)
val outputDateStr = outputDateFormat.format(inputDate)
formattedDate = outputDateStr
}
catch
(e: Exception) {
e.printStackTrace()
}
dateTV.text = dayOfMonth.toString() +
"-"
+ (monthOfYear +
1
) +
"-"
+ year
}, mYear, mMonth, mDay
)
datePickerDialog.show()
}
fun checkTrainStatus(trainNumber: String, date: String) {
loadingPB.visibility = View.VISIBLE
GlobalScope.launch(Dispatchers.IO) {
try
{
val client = OkHttpClient()
val request = Request.Builder().url(url).build()
val response = client.newCall(request).execute()
val responseBody = response.body?.string()
val trainStatus = parseTrainStatus(responseBody)
withContext(Dispatchers.Main) {
loadingPB.visibility = View.GONE
trainStatusTV.text = trainStatus
}
}
catch
(e: Exception) {
e.printStackTrace()
withContext(Dispatchers.Main) {
loadingPB.visibility = View.GONE
trainStatusTV.text =
"Please enter a valid train number.."
}
}
}
}
private
fun parseTrainStatus(responseBody: String?): String {
val document = Jsoup.parse(responseBody)
val cardHeaderElement = document.select(
"div.card-header"
).first()
if
(cardHeaderElement !=
null
) {
cardHeaderElement.select(
"small"
).remove()
cardHeaderElement.select(
"a"
).remove()
return
cardHeaderElement.text()
}
else
{
return
"Please enter a valid train number.."
}
}
}