ref: 62e0c1d69f4e7d1d4557870d82cf5fc18af85534
app/src/main/java/ml/adamsprogs/bimba/search/ResultsActivity.kt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
package ml.adamsprogs.bimba.search import android.annotation.SuppressLint import android.content.Context import android.content.Intent import android.location.Location import android.location.LocationListener import android.location.LocationManager import android.os.Bundle import android.util.Log import android.view.View import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import androidx.recyclerview.widget.LinearLayoutManager import com.google.openlocationcode.OpenLocationCode import kotlinx.coroutines.* import ml.adamsprogs.bimba.departures.DeparturesActivity import ml.adamsprogs.bimba.api.* import ml.adamsprogs.bimba.databinding.ActivityResultsBinding import java.io.InputStream @SuppressLint("MissingPermission") class ResultsActivity : AppCompatActivity(), LocationListener { enum class Mode { MODE_LOCATION, MODE_SEARCH } private var _binding: ActivityResultsBinding? = null private val binding get() = _binding!! private lateinit var adapter: BimbaResultsAdapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) _binding = ActivityResultsBinding.inflate(layoutInflater) setContentView(binding.root) binding.resultsRecycler.layoutManager = LinearLayoutManager(this) adapter = BimbaResultsAdapter(layoutInflater, this, listOf()) { when (it) { is Stop -> { val intent = Intent(this, DeparturesActivity::class.java).apply { putExtra("code", it.code) putExtra("name", it.name) // todo line, date, etc } startActivity(intent) } is Line -> { TODO("start line graph actvity") } } } binding.resultsRecycler.adapter = adapter setSupportActionBar(binding.topAppBar) WindowCompat.setDecorFitsSystemWindows(window, false) when (intent.extras?.get("mode")) { Mode.MODE_LOCATION -> { supportActionBar?.title = "Stops nearby" locate() } Mode.MODE_SEARCH -> { val query = intent.extras?.getString("query")!! supportActionBar?.title = "Results for ‘$query’" getItemsByQuery(query) } } } private fun locate() { // todo also on back to this activity (onRestart?) val locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 5000, 10f, this ) } override fun onLocationChanged(location: Location) { val code = OpenLocationCode.encode(location.latitude, location.longitude) val locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager locationManager.removeUpdates(this) getItemsByLocation(code) } override fun onDestroy() { // todo also on hide this activity (onPause?) super.onDestroy() val locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager locationManager.removeUpdates(this) } private fun getItemsByQuery(query: String) { MainScope().launch { val itemsStream = queryItems(query) updateItems(unmarshallItemResponse(itemsStream)) Log.v("RESPONSE", "getItemsByQuery") } } private fun getItemsByLocation(plusCode: String) { MainScope().launch { val itemsStream = locateItems(plusCode) updateItems(unmarshallItemResponse(itemsStream)) Log.v("RESPONSE", "getItemsByLocation") } } private fun updateItems(items: List<Item>) { binding.resultsProgress.visibility = View.GONE binding.resultsRecycler.visibility = View.VISIBLE adapter.update(items) } private suspend fun unmarshallItemResponse(stream: InputStream): List<Item> { return withContext(Dispatchers.IO) { when (val response = ItemsResponse.unmarshall(stream)) { is ItemsSuccess -> { return@withContext response.items } else -> { TODO("Error response") } } } } } |