Author: Adam Pioterek <adam.pioterek@protonmail.ch>
populating suggestions from db
app/src/main/java/ml/adamsprogs/bimba/MainActivity.kt | 57 ++++------ app/src/main/java/ml/adamsprogs/bimba/Timetable.kt | 73 +++++++++++++ app/src/main/res/values/strings.xml | 2
diff --git a/app/src/main/java/ml/adamsprogs/bimba/MainActivity.kt b/app/src/main/java/ml/adamsprogs/bimba/MainActivity.kt index 42cd26a4bc007e08e93d6228a3234fe667b0acd9..ed34be718fdb15b1e24211e90959d629ddb09513 100644 --- a/app/src/main/java/ml/adamsprogs/bimba/MainActivity.kt +++ b/app/src/main/java/ml/adamsprogs/bimba/MainActivity.kt @@ -8,19 +8,25 @@ import android.support.design.widget.Snackbar import android.support.v7.app.AppCompatActivity import android.support.v7.app.AppCompatDelegate import android.text.Html +import android.view.View import android.widget.Toast import com.arlib.floatingsearchview.FloatingSearchView import com.arlib.floatingsearchview.suggestions.model.SearchSuggestion +import kotlin.concurrent.thread class MainActivity : AppCompatActivity(), MessageReceiver.OnTimetableDownloadListener { lateinit var listener: MessageReceiver.OnTimetableDownloadListener lateinit var receiver: MessageReceiver + lateinit var layout: View + lateinit var timetable: Timetable + var stops: ArrayList<Timetable.Suggestion>? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_AUTO) + layout = findViewById(R.id.main_layout) val context = this as Context listener = this @@ -31,16 +37,26 @@ registerReceiver(receiver, filter) receiver.addOnTimetableDownloadListener(listener) startService(Intent(context, TimetableDownloader::class.java)) - val stops = listOf(Suggestion("Kołłątaja\n610 -> Dębiec"), Suggestion("Dębiecka\n610 -> Górczyn")) //todo get from db + timetable = Timetable(this) + stops = timetable.getStops() val searchView = findViewById(R.id.search_view) as FloatingSearchView + + if (stops == null) { + //todo something more direct and create pull-to-refresh + Snackbar.make(layout, getString(R.string.no_timetable), Snackbar.LENGTH_LONG).show() + return + } searchView.setOnQueryChangeListener({ _, newQuery -> - searchView.swapSuggestions(stops.filter { deAccent(it.body.split("\n")[0]).contains(newQuery, true) }) + thread { + val newStops = stops!!.filter { deAccent(it.body.split("\n")[0]).contains(newQuery, true) } + runOnUiThread { searchView.swapSuggestions (newStops)} + } }) searchView.setOnSearchListener(object : FloatingSearchView.OnSearchListener { override fun onSuggestionClicked(searchSuggestion: SearchSuggestion) { - Toast.makeText(context, "clicked "+ searchSuggestion.body, Toast.LENGTH_SHORT).show() + Toast.makeText(context, "clicked "+ (searchSuggestion as Timetable.Suggestion).id, Toast.LENGTH_SHORT).show() //todo to next screen } override fun onSearchAction(query: String) { @@ -48,7 +64,7 @@ } }) searchView.setOnBindSuggestionCallback { _, _, textView, item, _ -> - val suggestion = item as Suggestion + val suggestion = item as Timetable.Suggestion val text = suggestion.body.split("\n") val t = "<small><font color=\"#a0a0a0\">" + text[1] + "</font></small>" if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { @@ -82,35 +98,8 @@ return result } override fun onTimetableDownload() { - val layout = findViewById(R.id.main_layout) - Snackbar.make(layout, "New timetable downloaded", Snackbar.LENGTH_LONG).show() - } - - class Suggestion(text: String) : SearchSuggestion { - private val body: String = text - - constructor(parcel: Parcel) : this(parcel.readString()) - - override fun describeContents(): Int { - TODO("not implemented") - } - - override fun writeToParcel(dest: Parcel?, flags: Int) { - TODO("not implemented") - } - - override fun getBody(): String { - return body - } - - companion object CREATOR : Parcelable.Creator<Suggestion> { - override fun createFromParcel(parcel: Parcel): Suggestion { - return Suggestion(parcel) - } - - override fun newArray(size: Int): Array<Suggestion?> { - return arrayOfNulls(size) - } - } + timetable.refresh() + stops = timetable.getStops() + Snackbar.make(layout, getString(R.string.timetable_downloaded), Snackbar.LENGTH_LONG).show() } } diff --git a/app/src/main/java/ml/adamsprogs/bimba/Timetable.kt b/app/src/main/java/ml/adamsprogs/bimba/Timetable.kt new file mode 100644 index 0000000000000000000000000000000000000000..09359756979a700f4b5d635ba8d8d51d8395b63c --- /dev/null +++ b/app/src/main/java/ml/adamsprogs/bimba/Timetable.kt @@ -0,0 +1,73 @@ +package ml.adamsprogs.bimba + +import android.content.Context +import android.database.sqlite.SQLiteCantOpenDatabaseException +import android.database.sqlite.SQLiteDatabase +import android.os.Parcel +import android.os.Parcelable +import com.arlib.floatingsearchview.suggestions.model.SearchSuggestion +import java.io.File + +class Timetable() { + var db: SQLiteDatabase? = null + lateinit var context: Context + + constructor(context: Context) : this() { + this.context = context + readDbFile() + } + + fun refresh() { + readDbFile() + } + + private fun readDbFile() { + try { + db = SQLiteDatabase.openDatabase(File(context.filesDir, "new_timetable.db").path, + null, SQLiteDatabase.OPEN_READONLY) + } catch(e: SQLiteCantOpenDatabaseException) { + db = null + } + } + + fun getStops(): ArrayList<Suggestion>? { + if (db == null) + return null + val cursor = db!!.rawQuery("select name ||char(10)|| headsigns as suggestion, id from stops" + + " join nodes on(stops.symbol = nodes.symbol);", null) + val stops = ArrayList<Suggestion>() + while (cursor.moveToNext()) + stops.add(Suggestion(cursor.getString(0), cursor.getString(1))) + cursor.close() + return stops + } + + class Suggestion(text: String, val id: String) : SearchSuggestion { + private val body: String = text + + constructor(parcel: Parcel) : this(parcel.readString(), parcel.readString()) + + override fun describeContents(): Int { + TODO("not implemented") + } + + override fun writeToParcel(dest: Parcel?, flags: Int) { + dest?.writeString(body) + dest?.writeString(id) + } + + override fun getBody(): String { + return body + } + + companion object CREATOR : Parcelable.Creator<Suggestion> { + override fun createFromParcel(parcel: Parcel): Suggestion { + return Suggestion(parcel) + } + + override fun newArray(size: Int): Array<Suggestion?> { + return arrayOfNulls(size) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5df9e14f375d2313ff096b3bca75c24106517d2a..fe6ece5dfd656228837d8e0a13569a97b33699bd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,5 @@ <resources> <string name="app_name">Bimba</string> + <string name="no_timetable">No timetable found. Connect to the Internet and wait for a timetable to be downloaded</string> + <string name="timetable_downloaded">New timetable downloaded</string> </resources> diff --git a/research/timetable.db.xz b/research/timetable.db.xz new file mode 100644 index 0000000000000000000000000000000000000000..a31038b42c82ca61c77af8629de0cfe1f1da28e3 Binary files /dev/null and b/research/timetable.db.xz differ