Skip to content

Commit

Permalink
feat: error alert design updated to Material 3
Browse files Browse the repository at this point in the history
feat: focus "To" field in Trip planner after entering
  • Loading branch information
magicsk committed Sep 1, 2022
1 parent 8ff6b2b commit d929cd8
Show file tree
Hide file tree
Showing 12 changed files with 138 additions and 69 deletions.
5 changes: 4 additions & 1 deletion app/src/main/java/eu/magicsk/transi/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,15 @@ import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.NavigationUiSaveStateControl
import androidx.navigation.ui.setupWithNavController
import com.google.android.material.color.MaterialColors
import com.google.gson.Gson
import dagger.hilt.android.AndroidEntryPoint
import eu.magicsk.transi.data.remote.responses.StopsJSON
import eu.magicsk.transi.data.remote.responses.StopsJSONItem
import eu.magicsk.transi.databinding.ActivityMainBinding
import eu.magicsk.transi.util.UpdateAlert
import eu.magicsk.transi.view_models.MainViewModel
import eu.magicsk.transi.view_models.ReleaseInfoViewModel
import eu.magicsk.transi.view_models.StopsListVersionViewModel
Expand Down Expand Up @@ -148,12 +150,13 @@ class MainActivity : AppCompatActivity() {
}


@OptIn(NavigationUiSaveStateControl::class)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val versionName = BuildConfig.VERSION_NAME
releaseInfoViewModel.releaseInfo.observe(this) { releaseInfo ->
val version = releaseInfo?.tag_name
if (versionName != version && !version.isNullOrEmpty()) {
if (versionName != version.toString().replace("v", "") && !version.isNullOrEmpty()) {
val updateAlert = UpdateAlert(
version.toString().replace("v", ""),
releaseInfo.body,
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/eu/magicsk/transi/MainFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ class MainFragment : Fragment() {
override fun onResume() {
super.onResume()
connectionHandler.removeCallbacksAndMessages(null)
if (!tableAdapter.connected) {
if (!tableAdapter.connected && !tableAdapter.connecting) {
tableAdapter.ioConnect(selected.id)
}
}
Expand Down
42 changes: 32 additions & 10 deletions app/src/main/java/eu/magicsk/transi/TripPlannerFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,17 @@ package eu.magicsk.transi

import android.app.DatePickerDialog
import android.app.TimePickerDialog
import android.content.Context
import android.location.Location
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.os.Parcelable
import android.text.format.DateFormat
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.inputmethod.InputMethodManager
import android.widget.LinearLayout
import android.widget.ProgressBar
import android.widget.Toast
Expand All @@ -24,8 +28,8 @@ import eu.magicsk.transi.adapters.TripPlannerAdapter
import eu.magicsk.transi.data.models.SelectedTrip
import eu.magicsk.transi.data.remote.responses.StopsJSON
import eu.magicsk.transi.databinding.FragmentTripPlannerBinding
import eu.magicsk.transi.util.ErrorAlert
import eu.magicsk.transi.util.Trip
import eu.magicsk.transi.util.simpleErrorAlert
import eu.magicsk.transi.util.tripPlannerJsonParser
import eu.magicsk.transi.view_models.MainViewModel
import eu.magicsk.transi.view_models.TripPlannerViewModel
Expand Down Expand Up @@ -95,7 +99,12 @@ class TripPlannerFragment : Fragment() {
if (selectedTrip.to != "") {
activity?.findViewById<ProgressBar>(R.id.progressBar_ic)?.isVisible = true
if ((to == "" || from == "") || (to == "0" && from == "0")) {
activity?.let { simpleErrorAlert(it, getString(R.string.ops), getString(R.string.error400)) }
activity?.runOnUiThread {
ErrorAlert(getString(R.string.ops), getString(R.string.error400)).show(
parentFragmentManager,
"error"
)
}
} else {
if ((to == "0" || from == "0") && actualLocation == null) {
waitingForLocation = true
Expand All @@ -119,17 +128,23 @@ class TripPlannerFragment : Fragment() {
format
)
} else {
activity?.let { simpleErrorAlert(it, getString(R.string.ops), getString(R.string.error400)) }
activity?.runOnUiThread {
ErrorAlert(getString(R.string.ops), getString(R.string.error400)).show(
parentFragmentManager,
"error"
)
}
}
}
}
}

private fun openTypeAhead(typeAheadFragment: TypeAheadFragment) {
// if (navController.backQueue.size > 2) navController.popBackStack()
val supportFragmentManager = activity?.supportFragmentManager
if ((supportFragmentManager?.backStackEntryCount ?: 0) > 0) supportFragmentManager?.popBackStack("tripTypeAhead", 1)
binding.TripPlannerList.visibility = View.GONE
binding.tripSearchFragmentLayout.visibility = View.VISIBLE
activity?.supportFragmentManager?.beginTransaction()?.apply {
supportFragmentManager?.beginTransaction()?.apply {
replace(R.id.tripSearchFragmentLayout, typeAheadFragment).addToBackStack("tripTypeAhead").commit()
}
}
Expand All @@ -142,7 +157,7 @@ class TripPlannerFragment : Fragment() {
activity?.findViewById<LinearLayout>(R.id.progressBar_bg)?.isVisible = false
activity?.findViewById<ProgressBar>(R.id.progressBar_ic)?.isVisible = false
println(trip)
val parsedTrip = tripPlannerJsonParser(trip, it, requireContext())
val parsedTrip = tripPlannerJsonParser(trip, parentFragmentManager, requireContext())
if (parsedTrip != null) {
if (loadingMore) {
loadingMore = false
Expand Down Expand Up @@ -198,8 +213,17 @@ class TripPlannerFragment : Fragment() {
activity?.window?.statusBarColor = MaterialColors.getColor(view, R.attr.colorMyBackground)
if (selectedTrip.from != it?.value && it != null) {
editTextFrom.setText(it.name)
getTrip(from = it.value)
tripPlannerAdapter.setFromTo(newFrom = it.name)
if (editTextTo.text.isNullOrEmpty()) {
Handler(Looper.getMainLooper()).postDelayed({
editTextTo.requestFocus()
}, 200)
} else {
val im: InputMethodManager? =
activity?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager?
im?.hideSoftInputFromWindow(view.windowToken, 0)
getTrip(from = it.value)
}
}

}
Expand Down Expand Up @@ -276,7 +300,7 @@ class TripPlannerFragment : Fragment() {
requireContext(),
null,
selectedTripCalendar.get(Calendar.YEAR),
selectedTripCalendar.get(Calendar.MONTH) + 1,
selectedTripCalendar.get(Calendar.MONTH),
selectedTripCalendar.get(Calendar.DAY_OF_MONTH)
)
datePickerDialog.datePicker.minDate = System.currentTimeMillis() - 86400000
Expand Down Expand Up @@ -358,12 +382,10 @@ class TripPlannerFragment : Fragment() {
listState = savedInstanceState?.getParcelable("tripPlannerAdapter")
val thar = savedInstanceState?.getParcelableArray("tripHolder") as? Array<Trip>
tripHolder = thar?.toMutableList() ?: tripHolder
println(tripHolder.size)
selectedTrip = savedInstanceState?.getSerializable("selectedTrip") as? SelectedTrip ?: selectedTrip
}

override fun onResume() {
println("resume")
super.onResume()
if (tripHolder.isNotEmpty()) {
tripPlannerAdapter.addItems(tripHolder)
Expand Down
3 changes: 2 additions & 1 deletion app/src/main/java/eu/magicsk/transi/TypeAheadFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ class TypeAheadFragment : Fragment() {
"editText" -> {
mainViewModel.setSelectedStop(stop)
activity?.supportFragmentManager?.popBackStack("typeAhead", 1)
hideVirtualInput(view)
}
"editTextFrom" -> {
tripPlannerViewModel.setSelectedFromStop(stop)
Expand All @@ -75,11 +76,11 @@ class TypeAheadFragment : Fragment() {
"editTextTo" -> {
tripPlannerViewModel.setSelectedToStop(stop)
activity?.supportFragmentManager?.popBackStack("tripTypeAhead", 1)
hideVirtualInput(view)
}
}

}
hideVirtualInput(view)
}

private fun onButtonItemClick(view: View, pos: Int) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ class MHDTableAdapter : RecyclerView.Adapter<MHDTableAdapter.MHDTableViewHolder>
private var updateTimeStamp = 0L
private val filterHandler = Handler(Looper.getMainLooper())
var connected = false
var connecting = false

private fun getStopById(id: Int): StopsJSONItem? {
stopList.let {
Expand Down Expand Up @@ -102,6 +103,7 @@ class MHDTableAdapter : RecyclerView.Adapter<MHDTableAdapter.MHDTableViewHolder>
}

fun ioConnect(stopId: Int) {
connecting = true
actualStopId = stopId
ioDisconnect()
println("connecting")
Expand All @@ -120,6 +122,7 @@ class MHDTableAdapter : RecyclerView.Adapter<MHDTableAdapter.MHDTableViewHolder>
val connectInfo = activity.findViewById<TextView>(R.id.MHDTableListConnectInfo)
socket
.on(Socket.EVENT_CONNECTING) {
connecting = true
filterHandler.removeCallbacksAndMessages(null)
filterHandler.postDelayed({
activity.runOnUiThread {
Expand All @@ -129,6 +132,7 @@ class MHDTableAdapter : RecyclerView.Adapter<MHDTableAdapter.MHDTableViewHolder>
}, 100)
}
.on(Socket.EVENT_CONNECT) {
connecting = false
connected = true
println("connected")
activity.runOnUiThread {
Expand All @@ -137,6 +141,7 @@ class MHDTableAdapter : RecyclerView.Adapter<MHDTableAdapter.MHDTableViewHolder>
}
}
.on(Socket.EVENT_DISCONNECT) {
connecting = false
filterHandler.removeCallbacksAndMessages(null)
filterHandler.postDelayed({
connected = false
Expand All @@ -148,6 +153,7 @@ class MHDTableAdapter : RecyclerView.Adapter<MHDTableAdapter.MHDTableViewHolder>
}, 100)
}
.on(Socket.EVENT_RECONNECTING) {
connecting = true
filterHandler.removeCallbacksAndMessages(null)
filterHandler.postDelayed({
activity.runOnUiThread {
Expand All @@ -157,6 +163,7 @@ class MHDTableAdapter : RecyclerView.Adapter<MHDTableAdapter.MHDTableViewHolder>
}, 100)
}
.on(Socket.EVENT_RECONNECT) {
connecting = false
filterHandler.removeCallbacksAndMessages(null)
filterHandler.postDelayed({
connected = true
Expand Down Expand Up @@ -184,7 +191,7 @@ class MHDTableAdapter : RecyclerView.Adapter<MHDTableAdapter.MHDTableViewHolder>
} catch (_: JSONException) {
}
if (mhdTable.sortedTabs.size > 1) {
connectInfo?.visibility = View.GONE
connectInfo.visibility = View.GONE
} else {
connectInfo.visibility = View.VISIBLE
connectInfo.text = activity.getString(R.string.noDepartures)
Expand Down
51 changes: 39 additions & 12 deletions app/src/main/java/eu/magicsk/transi/util/ErrorAlert.kt
Original file line number Diff line number Diff line change
@@ -1,15 +1,42 @@
package eu.magicsk.transi.util

import android.app.Activity
import android.app.AlertDialog

fun simpleErrorAlert(activity: Activity, title: String, message: String) {
val errorAlertBuilder = AlertDialog.Builder(activity)
errorAlertBuilder.setTitle(title)
.setPositiveButton("OK") { dialog, _ ->
dialog.cancel()
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.DialogFragment
import eu.magicsk.transi.R
import eu.magicsk.transi.databinding.AlertBinding

class ErrorAlert(private val title: String, private val message: String) : DialogFragment() {
private var _binding: AlertBinding? = null
private val binding get() = _binding!!

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
dialog!!.window?.setBackgroundDrawableResource(R.drawable.round_shape)
_binding = AlertBinding.inflate(inflater, container, false)
return binding.root
}

override fun onStart() {
super.onStart()
val width = (resources.displayMetrics.widthPixels * 0.875).toInt()
dialog!!.window?.setLayout(width, ViewGroup.LayoutParams.WRAP_CONTENT)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.apply {
AlertTitle.text = title
AlertText.text = message
AlertConfirmButton.setOnClickListener {
dismiss()
}
}
val errorAlert = errorAlertBuilder.create()
errorAlert.setMessage(message)
errorAlert.show()
}
}

override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package eu.magicsk.transi.util

import android.app.Activity
import android.content.Context
import android.os.Parcelable
import androidx.fragment.app.FragmentManager
import eu.magicsk.transi.R
import kotlinx.parcelize.Parcelize
import org.json.JSONArray
Expand Down Expand Up @@ -49,7 +49,7 @@ data class TripDA(
val stop: TripStop,
) : Parcelable, Serializable

fun tripPlannerJsonParser(data: JSONObject, activity: Activity, context: Context): MutableList<Trip>? {
fun tripPlannerJsonParser(data: JSONObject, fragmentManager: FragmentManager, context: Context): MutableList<Trip>? {
val timeFormat = DateTimeFormatter.ofPattern("HH:mm")
val inputFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
try {
Expand Down Expand Up @@ -191,12 +191,12 @@ fun tripPlannerJsonParser(data: JSONObject, activity: Activity, context: Context
}
return trips
} else {
simpleErrorAlert(activity, context.getString(R.string.ops), context.getString(R.string.error404))
ErrorAlert(context.getString(R.string.ops), context.getString(R.string.error404)).show(fragmentManager, "error")
return null
}
} catch (e: JSONException) {
ErrorAlert(context.getString(R.string.ops), context.getString(R.string.unknownError)).show(fragmentManager, "error")
println(e)
simpleErrorAlert(activity, context.getString(R.string.ops), context.getString(R.string.unknownError))
return null
}
}
Loading

0 comments on commit d929cd8

Please sign in to comment.