5 Commits 0b7fabdd82 ... eaae6c835b

Author SHA1 Message Date
  Adam Pioterek eaae6c835b remove some todos 5 years ago
  Adam Pioterek af2053702a less search results flickering 5 years ago
  Adam Pioterek d1d19f5f49 empty search results 5 years ago
  Adam Pioterek 5403ab021b i18n — po 5 years ago
  Adam Pioterek fef235342e loading sheds 5 years ago

+ 2 - 2
app/build.gradle

@@ -30,9 +30,9 @@ dependencies {
     implementation 'androidx.appcompat:appcompat:1.0.2'
     implementation 'androidx.cardview:cardview:1.0.0'
     implementation 'androidx.vectordrawable:vectordrawable:1.0.1'
-    implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2'
+    implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha3'
 
-    implementation 'com.google.android.material:material:1.1.0-alpha01'
+    implementation 'com.google.android.material:material:1.1.0-alpha02'
 
     implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
     implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:0.27.0-eap13'

+ 0 - 1
app/src/main/java/ml/adamsprogs/bimba/ProviderProxy.kt

@@ -15,7 +15,6 @@ import ml.adamsprogs.bimba.models.suggestions.StopSuggestion
 import java.util.*
 import kotlin.collections.HashMap
 
-//todo make singleton
 class ProviderProxy(context: Context? = null) {
     private val vmClient = VmClient.getVmClient()
     private var timetable: Timetable = Timetable.getTimetable(context)

+ 45 - 39
app/src/main/java/ml/adamsprogs/bimba/activities/DashActivity.kt

@@ -2,31 +2,43 @@ package ml.adamsprogs.bimba.activities
 
 import android.annotation.SuppressLint
 import android.app.Activity
-import android.content.*
-import android.os.*
+import android.content.Context
+import android.content.DialogInterface
+import android.content.Intent
+import android.content.IntentFilter
+import android.os.Bundle
 import android.preference.PreferenceManager.getDefaultSharedPreferences
 import android.text.Editable
-import androidx.appcompat.app.*
 import android.text.TextWatcher
-import android.view.*
+import android.view.ActionMode
+import android.view.Menu
+import android.view.MenuItem
+import android.view.View
 import android.view.inputmethod.InputMethodManager
-import kotlin.collections.ArrayList
-import kotlinx.android.synthetic.main.activity_dash.*
-import java.util.*
-import java.text.*
-
-import ml.adamsprogs.bimba.models.*
-import ml.adamsprogs.bimba.*
-import ml.adamsprogs.bimba.datasources.*
-import ml.adamsprogs.bimba.models.suggestions.*
-import ml.adamsprogs.bimba.models.adapters.*
-import ml.adamsprogs.bimba.collections.*
-
+import androidx.appcompat.app.AlertDialog
+import androidx.appcompat.app.AppCompatActivity
 import com.google.android.material.navigation.NavigationView
 import com.google.android.material.snackbar.Snackbar
 import com.mancj.materialsearchbar.MaterialSearchBar
 import com.mancj.materialsearchbar.MaterialSearchBar.BUTTON_BACK
 import com.mancj.materialsearchbar.MaterialSearchBar.BUTTON_NAVIGATION
+import kotlinx.android.synthetic.main.activity_dash.*
+import ml.adamsprogs.bimba.*
+import ml.adamsprogs.bimba.collections.FavouriteStorage
+import ml.adamsprogs.bimba.datasources.TimetableDownloader
+import ml.adamsprogs.bimba.datasources.VmService
+import ml.adamsprogs.bimba.models.Departure
+import ml.adamsprogs.bimba.models.Plate
+import ml.adamsprogs.bimba.models.Timetable
+import ml.adamsprogs.bimba.models.adapters.FavouritesAdapter
+import ml.adamsprogs.bimba.models.adapters.SuggestionsAdapter
+import ml.adamsprogs.bimba.models.suggestions.EmptySuggestion
+import ml.adamsprogs.bimba.models.suggestions.GtfsSuggestion
+import ml.adamsprogs.bimba.models.suggestions.LineSuggestion
+import ml.adamsprogs.bimba.models.suggestions.StopSuggestion
+import java.text.DateFormat
+import java.util.*
+import kotlin.collections.ArrayList
 
 class DashActivity : AppCompatActivity(), MessageReceiver.OnTimetableDownloadListener,
         FavouritesAdapter.OnMenuItemClickListener, FavouritesAdapter.ViewHolder.OnClickListener, ProviderProxy.OnDeparturesReadyListener, SuggestionsAdapter.OnSuggestionClickListener {
@@ -61,8 +73,6 @@ class DashActivity : AppCompatActivity(), MessageReceiver.OnTimetableDownloadLis
         timetable = Timetable.getTimetable()
         NetworkStateReceiver.init(this)
 
-        getSuggestions()
-
         prepareFavourites()
 
         prepareListeners()
@@ -97,16 +107,7 @@ class DashActivity : AppCompatActivity(), MessageReceiver.OnTimetableDownloadLis
         searchView.addTextChangeListener(object : TextWatcher {
             override fun afterTextChanged(s: Editable?) {
                 if (searchView.isSearchEnabled) {
-                    searchView.clearSuggestions()
-                    searchView.updateLastSuggestions(listOf<GtfsSuggestion>())
-                    providerProxy.getSuggestions(s.toString()) { suggestions ->
-                        suggestions.forEach {
-                            if (it.name.contains(s as CharSequence, true)) {
-                                suggestionsAdapter.addSuggestion(it)
-                            }
-                        }
-                        searchView.showSuggestionsList()
-                    }
+                    getSuggestions(s.toString())
                 }
             }
 
@@ -137,13 +138,26 @@ class DashActivity : AppCompatActivity(), MessageReceiver.OnTimetableDownloadLis
             }
 
             override fun onSearchConfirmed(text: CharSequence?) {
-                // todo re-search
-                println("OnSearchConfirmed")
+                getSuggestions(text as String)
             }
 
         })
     }
 
+    private fun getSuggestions(query: String = "") {
+        providerProxy.getSuggestions(query) { suggestions ->
+            if (!suggestionsAdapter.equals(suggestions)) {
+                if (suggestions.isEmpty()) {
+                    suggestionsAdapter.clearSuggestions()
+                    suggestionsAdapter.addSuggestion(EmptySuggestion())
+                } else {
+                    suggestionsAdapter.updateSuggestions(suggestions)
+                }
+                searchView.showSuggestionsList()
+            }
+        }
+    }
+
     override fun onSuggestionClickListener(suggestion: GtfsSuggestion) {
         val imm = context.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
         var view = (context as DashActivity).currentFocus
@@ -269,14 +283,6 @@ class DashActivity : AppCompatActivity(), MessageReceiver.OnTimetableDownloadLis
         showError(drawer_layout, code, this)
     }
 
-    private fun getSuggestions() {
-        providerProxy.getSuggestions { suggestions ->
-            suggestions.forEach {
-                suggestionsAdapter.addSuggestion(it)
-            }
-        }
-    }
-
     private fun prepareListeners() {
         val filter = IntentFilter(TimetableDownloader.ACTION_DOWNLOADED)
         filter.addAction(VmService.ACTION_READY)
@@ -324,7 +330,7 @@ class DashActivity : AppCompatActivity(), MessageReceiver.OnTimetableDownloadLis
         Snackbar.make(findViewById(R.id.drawer_layout), message, Snackbar.LENGTH_LONG).show()
         if (result == TimetableDownloader.RESULT_FINISHED) {
             timetable = Timetable.getTimetable(this, true)
-            getSuggestions()
+            getSuggestions(searchView.text)
             showValidityInDrawer()
         }
     }

+ 1 - 0
app/src/main/java/ml/adamsprogs/bimba/activities/StopSpecifyActivity.kt

@@ -25,6 +25,7 @@ class StopSpecifyActivity : AppCompatActivity() {
         val name = intent.getStringExtra(EXTRA_STOP_NAME)
         val providerProxy = ProviderProxy(this)
         providerProxy.getSheds(name) {
+            progressBar.visibility = View.GONE
             val layoutManager = androidx.recyclerview.widget.LinearLayoutManager(this)
             val departuresList: androidx.recyclerview.widget.RecyclerView = list_view
 

+ 19 - 5
app/src/main/java/ml/adamsprogs/bimba/models/adapters/SuggestionsAdapter.kt

@@ -12,13 +12,12 @@ import android.widget.TextView
 import androidx.core.content.ContextCompat.getColor
 import ml.adamsprogs.bimba.R
 import ml.adamsprogs.bimba.getDrawable
+import ml.adamsprogs.bimba.models.suggestions.EmptySuggestion
 import ml.adamsprogs.bimba.models.suggestions.GtfsSuggestion
 import ml.adamsprogs.bimba.models.suggestions.LineSuggestion
 import ml.adamsprogs.bimba.models.suggestions.StopSuggestion
 import com.mancj.materialsearchbar.adapter.SuggestionsAdapter as SearchBarSuggestionsAdapter
 
-// todo on click ripple
-
 class SuggestionsAdapter(inflater: LayoutInflater, private val onSuggestionClickListener: OnSuggestionClickListener, private val context: Context) :
         SearchBarSuggestionsAdapter<GtfsSuggestion, SuggestionsAdapter.ViewHolder>(inflater) {
     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
@@ -33,10 +32,10 @@ class SuggestionsAdapter(inflater: LayoutInflater, private val onSuggestionClick
             onSuggestionClickListener.onSuggestionClickListener(suggestion)
         }
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-            holder.text.text = Html.fromHtml(suggestion.getBody(), Html.FROM_HTML_MODE_LEGACY)
+            holder.text.text = Html.fromHtml(suggestion.getBody(context), Html.FROM_HTML_MODE_LEGACY)
         } else {
             @Suppress("DEPRECATION")
-            holder.text.text = Html.fromHtml(suggestion.getBody())
+            holder.text.text = Html.fromHtml(suggestion.getBody(context))
         }
 
         holder.text.setTextColor(getColor(context, R.color.textDark))
@@ -59,8 +58,14 @@ class SuggestionsAdapter(inflater: LayoutInflater, private val onSuggestionClick
 
     }
 
+    fun updateSuggestions(newSuggestions: List<GtfsSuggestion>) {
+        suggestions = newSuggestions
+        suggestions_clone = suggestions
+        notifyDataSetChanged()
+    }
+
     operator fun contains(suggestion: GtfsSuggestion): Boolean {
-        return suggestion in suggestions || suggestion in suggestions_clone
+        return suggestion in suggestions //|| suggestion in suggestions_clone
     }
 
     inner class ViewHolder(itemView: View) : androidx.recyclerview.widget.RecyclerView.ViewHolder(itemView) {
@@ -72,4 +77,13 @@ class SuggestionsAdapter(inflater: LayoutInflater, private val onSuggestionClick
     interface OnSuggestionClickListener {
         fun onSuggestionClickListener(suggestion: GtfsSuggestion)
     }
+
+    fun equals(other: List<GtfsSuggestion>): Boolean {
+        if ((suggestions.containsAll(other) and other.containsAll(suggestions)))
+            return true
+        if (other.isEmpty())
+            if ((suggestions.isEmpty()) or (suggestions[0] is EmptySuggestion))
+                return true
+        return false
+    }
 }

+ 37 - 0
app/src/main/java/ml/adamsprogs/bimba/models/suggestions/EmptySuggestion.kt

@@ -0,0 +1,37 @@
+package ml.adamsprogs.bimba.models.suggestions
+
+import android.content.Context
+import ml.adamsprogs.bimba.R
+
+class EmptySuggestion : GtfsSuggestion("Empty") {
+    override fun equals(other: Any?): Boolean {
+        return other != null && other is EmptySuggestion
+    }
+
+    override fun getIcon(): Int {
+        return R.drawable.ic_error_outline
+    }
+
+    override fun getColour(): Int {
+        return 0xffffff
+    }
+
+    override fun getBgColour(): Int {
+        return 0x000000
+    }
+
+    override fun getBody(context: Context): String {
+        return context.getString(R.string.nothing_found)
+    }
+
+    override fun compareTo(other: GtfsSuggestion): Int {
+        return if (other is EmptySuggestion)
+            0
+        else
+            -1
+    }
+
+    override fun hashCode(): Int {
+        return name.hashCode()
+    }
+}

+ 7 - 1
app/src/main/java/ml/adamsprogs/bimba/models/suggestions/GtfsSuggestion.kt

@@ -1,5 +1,7 @@
 package ml.adamsprogs.bimba.models.suggestions
 
+import android.content.Context
+
 abstract class GtfsSuggestion(val name: String) : Comparable<GtfsSuggestion> {
     abstract fun getIcon(): Int
 
@@ -7,5 +9,9 @@ abstract class GtfsSuggestion(val name: String) : Comparable<GtfsSuggestion> {
 
     abstract fun getBgColour(): Int
 
-    abstract fun getBody(): String
+    abstract fun getBody(context: Context): String
+
+    abstract override fun equals(other: Any?): Boolean
+
+    abstract override fun hashCode(): Int
 }

+ 2 - 1
app/src/main/java/ml/adamsprogs/bimba/models/suggestions/LineSuggestion.kt

@@ -1,5 +1,6 @@
 package ml.adamsprogs.bimba.models.suggestions
 
+import android.content.Context
 import ml.adamsprogs.bimba.R
 import ml.adamsprogs.bimba.models.gtfs.Route
 
@@ -12,7 +13,7 @@ class LineSuggestion(name: String, private val route: Route) : GtfsSuggestion(na
         }
     }
 
-    override fun getBody(): String {
+    override fun getBody(context: Context): String {
         return name
     }
 

+ 2 - 1
app/src/main/java/ml/adamsprogs/bimba/models/suggestions/StopSuggestion.kt

@@ -1,10 +1,11 @@
 package ml.adamsprogs.bimba.models.suggestions
 
+import android.content.Context
 import ml.adamsprogs.bimba.R
 
 class StopSuggestion(name: String, val zone: String) : GtfsSuggestion(name) {
 
-    override fun getBody(): String {
+    override fun getBody(context: Context): String {
         return name
     }
 

+ 0 - 0
app/src/main/res/drawable/ic_error_outline.xml


Some files were not shown because too many files changed in this diff