Author: Adam Pioterek <adam.pioterek@protonmail.ch>
rolling timetable over day boundary
app/src/main/java/ml/adamsprogs/bimba/StopActivity.kt | 94 app/src/main/java/ml/adamsprogs/bimba/TimetableDownloader.kt | 2 app/src/main/java/ml/adamsprogs/bimba/models/Departure.kt | 12 app/src/main/java/ml/adamsprogs/bimba/models/DeparturesAdapter.kt | 5 app/src/main/res/drawable/ic_departure_timetable.xml | 12 | 0 app/src/main/res/menu/menu_stop.xml | 2
diff --git a/app/src/main/java/ml/adamsprogs/bimba/StopActivity.kt b/app/src/main/java/ml/adamsprogs/bimba/StopActivity.kt index 21063fe7c436594f6e88ce8213fa0896b081357e..bfcc9eab8ed77ebf76163f409d4555ae4cbd0ccc 100644 --- a/app/src/main/java/ml/adamsprogs/bimba/StopActivity.kt +++ b/app/src/main/java/ml/adamsprogs/bimba/StopActivity.kt @@ -1,53 +1,27 @@ package ml.adamsprogs.bimba -import android.support.design.widget.TabLayout -import android.support.design.widget.FloatingActionButton -import android.support.design.widget.Snackbar +import android.support.design.widget.* import android.support.v7.app.AppCompatActivity import android.support.v7.widget.Toolbar -import android.support.v4.app.Fragment -import android.support.v4.app.FragmentManager -import android.support.v4.app.FragmentPagerAdapter +import android.support.v4.app.* import android.support.v4.view.ViewPager import android.os.Bundle import android.support.v4.content.res.ResourcesCompat -import android.view.LayoutInflater -import android.view.Menu -import android.view.MenuItem -import android.view.View -import android.view.ViewGroup +import android.view.* -import ml.adamsprogs.bimba.models.Departure -import ml.adamsprogs.bimba.models.Timetable -import android.support.v7.widget.LinearLayoutManager -import android.support.v7.widget.RecyclerView -import ml.adamsprogs.bimba.models.DeparturesAdapter -import ml.adamsprogs.bimba.models.fromString -import android.support.v7.widget.DividerItemDecoration -import android.util.Log +import ml.adamsprogs.bimba.models.* +import android.support.v7.widget.* import java.util.* -class StopActivity : AppCompatActivity() { +class StopActivity : AppCompatActivity() { //todo refresh private lateinit var stopId: String private var departures: HashMap<String, ArrayList<Departure>>? = null - private var timetableType = "timetable" - - /** - * The [android.support.v4.view.PagerAdapter] that will provide - * fragments for each of the sections. We use a - * [FragmentPagerAdapter] derivative, which will keep every - * loaded fragment in memory. If this becomes too memory intensive, it - * may be best to switch to a - * [android.support.v4.app.FragmentStatePagerAdapter]. - */ + private var timetableType = "departure" + private val rolledDepartures = HashMap<String, ArrayList<Departure>>() private var sectionsPagerAdapter: SectionsPagerAdapter? = null - - /** - * The [ViewPager] that will host the section contents. - */ private var viewPager: ViewPager? = null override fun onCreate(savedInstanceState: Bundle?) { @@ -65,7 +39,18 @@ */ val timetable = Timetable(this) supportActionBar?.title = timetable.getStopName(stopId) ?: "Stop" departures = timetable.getStopDepartures(stopId) - //todo if departures == null -> … + + val moreDepartures = timetable.getStopDepartures(stopId) + + for ((_, departures) in moreDepartures!!) { + departures.forEach{it.tomorrow = true} + } + + for ((mode, _) in departures!!) { + rolledDepartures[mode] = (departures!![mode] as ArrayList<Departure> + + moreDepartures[mode] as ArrayList<Departure>) as ArrayList<Departure> + } + sectionsPagerAdapter = SectionsPagerAdapter(supportFragmentManager) @@ -97,13 +82,12 @@ val id = item.itemId if (id == R.id.action_change_type) { - if(timetableType == "timetable") { - timetableType = "vm" - item.icon = (ResourcesCompat.getDrawable(resources, R.drawable.ic_vm, null)) - } - else { - timetableType = "timetable" - item.icon = (ResourcesCompat.getDrawable(resources, R.drawable.ic_timetable, null)) + if (timetableType == "departure") { + timetableType = "full" + item.icon = (ResourcesCompat.getDrawable(resources, R.drawable.ic_departure_timetable, null)) + } else { + timetableType = "departure" + item.icon = (ResourcesCompat.getDrawable(resources, R.drawable.ic_full_timetable, null)) } //todo change type return true @@ -112,9 +96,6 @@ return super.onOptionsItemSelected(item) } - /** - * A placeholder fragment containing a simple view. - */ class PlaceholderFragment : Fragment() { override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, @@ -132,7 +113,7 @@ departuresList.layoutManager = layoutManager return rootView } - fun filterDepartures(departures: List<Departure>): List<Departure> { //todo and tomorrow + fun filterDepartures(departures: List<Departure>): List<Departure> { val filtered = ArrayList<Departure>() val lines = HashMap<String, Int>() val now = Calendar.getInstance() @@ -140,13 +121,14 @@ for (departure in departures) { val time = Calendar.getInstance() time.set(Calendar.HOUR_OF_DAY, Integer.parseInt(departure.time.split(":")[0])) time.set(Calendar.MINUTE, Integer.parseInt(departure.time.split(":")[1])) + time.set(Calendar.SECOND, 0) + time.set(Calendar.MILLISECOND, 0) + if (departure.tomorrow) + time.add(Calendar.DAY_OF_MONTH, 1) var lineExistedTimes = lines[departure.line] - Log.i("Filter", "line: ${departure.line} existed $lineExistedTimes times") if (now.before(time) && lineExistedTimes ?: 0 < 3) { - Log.i("Filter", "less than 3 so adding") lineExistedTimes = (lineExistedTimes ?: 0) + 1 lines[departure.line] = lineExistedTimes - Log.i("Filter", "and increment so now existed ${lines[departure.line]} times") filtered.add(departure) } } @@ -154,16 +136,8 @@ return filtered } companion object { - /** - * The fragment argument representing the section number for this - * fragment. - */ private val ARG_SECTION_NUMBER = "section_number" - /** - * Returns a new instance of this fragment for the given section - * number. - */ fun newInstance(sectionNumber: Int, stopId: String, departures: ArrayList<Departure>?): PlaceholderFragment { val fragment = PlaceholderFragment() val args = Bundle() @@ -178,10 +152,6 @@ } } } - /** - * A [FragmentPagerAdapter] that returns a fragment corresponding to - * one of the sections/tabs/pages. - */ inner class SectionsPagerAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm) { override fun getItem(position: Int): Fragment { @@ -191,7 +161,7 @@ 0 -> mode = "workdays" 1 -> mode = "saturdays" 2 -> mode = "sundays" } - return PlaceholderFragment.newInstance(position + 1, stopId, departures?.get(mode)) + return PlaceholderFragment.newInstance(position + 1, stopId, rolledDepartures[mode]) } override fun getCount() = 3 diff --git a/app/src/main/java/ml/adamsprogs/bimba/TimetableDownloader.kt b/app/src/main/java/ml/adamsprogs/bimba/TimetableDownloader.kt index a39ebacecf238e3ff98cc59a3f0acfb6fb2ce697..b7187dcc8a173bb5893a41b4d6bbdbc31299adc7 100644 --- a/app/src/main/java/ml/adamsprogs/bimba/TimetableDownloader.kt +++ b/app/src/main/java/ml/adamsprogs/bimba/TimetableDownloader.kt @@ -89,7 +89,7 @@ val md = MessageDigest.getInstance("SHA-512") var hex = "" try { val out = FileOutputStream(file) - val buf = ByteArray(1024) //todo bigger? + val buf = ByteArray(5 * 1024) var lenSum = 0.0f var len = 42 while (len > 0) { diff --git a/app/src/main/java/ml/adamsprogs/bimba/models/Departure.kt b/app/src/main/java/ml/adamsprogs/bimba/models/Departure.kt index a4563e113ae9b9044d10753ddcf2aaec3f936e74..d3ba92039a371047e48002649b1412bf4a038997 100644 --- a/app/src/main/java/ml/adamsprogs/bimba/models/Departure.kt +++ b/app/src/main/java/ml/adamsprogs/bimba/models/Departure.kt @@ -2,13 +2,15 @@ package ml.adamsprogs.bimba.models fun fromString(string: String): Departure { val array = string.split("|") - return Departure(array[0], array[1], array[2], array[3] == "1", array[4], array[5]) + return Departure(array[0], array[1], array[2], array[3] == "1", array[4], array[5], + array[6] == "true", array[7] == "true") } data class Departure(val line: String, val mode: String, val time: String, val lowFloor: Boolean, - val modification: String?, val direction: String) { - val vm = false //todo - override fun toString():String { - return "$line|$mode|$time|$lowFloor|$modification|$direction|$vm" + val modification: String?, val direction: String, val vm: Boolean = false, + var tomorrow: Boolean = false) { + + override fun toString(): String { + return "$line|$mode|$time|$lowFloor|$modification|$direction|$vm|$tomorrow" } } \ No newline at end of file diff --git a/app/src/main/java/ml/adamsprogs/bimba/models/DeparturesAdapter.kt b/app/src/main/java/ml/adamsprogs/bimba/models/DeparturesAdapter.kt index c251efcdc44d6f75f9f37e1560021d3603538d01..2c183b1ad57c541c08e9c7c0946d2eab627ac270 100644 --- a/app/src/main/java/ml/adamsprogs/bimba/models/DeparturesAdapter.kt +++ b/app/src/main/java/ml/adamsprogs/bimba/models/DeparturesAdapter.kt @@ -23,6 +23,9 @@ val now = Calendar.getInstance() val departureTime = Calendar.getInstance() departureTime.set(Calendar.HOUR_OF_DAY, Integer.parseInt(departure.time.split(":")[0])) departureTime.set(Calendar.MINUTE, Integer.parseInt(departure.time.split(":")[1])) + if (departure.tomorrow) + departureTime.add(Calendar.DAY_OF_MONTH, 1) + val departureIn = (departureTime.timeInMillis - now.timeInMillis) / (1000 * 60) val departureTimeShown: String val timeString: Int @@ -45,7 +48,7 @@ val icon = holder?.typeIcon if (departure.vm) icon?.setImageDrawable(ResourcesCompat.getDrawable(context.resources, R.drawable.ic_vm, null)) else - icon?.setImageDrawable(ResourcesCompat.getDrawable(context.resources, R.drawable.ic_timetable, null)) + icon?.setImageDrawable(ResourcesCompat.getDrawable(context.resources, R.drawable.ic_departure_timetable, null)) } override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder { diff --git a/app/src/main/res/drawable/ic_departure_timetable.xml b/app/src/main/res/drawable/ic_departure_timetable.xml new file mode 100644 index 0000000000000000000000000000000000000000..3d00295ba557febf30a9d23490f04458d5510443 --- /dev/null +++ b/app/src/main/res/drawable/ic_departure_timetable.xml @@ -0,0 +1,12 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:pathData="M19,3C12,2.48 12,2.482 5,3 3.89,3 3.01,3.9 3.01,5L3,19c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5C21,3.9 20.1,3 19,3ZM19,19L5,19L5,8h14z" + android:fillColor="#000000"/> + <path + android:pathData="m17,12h-5v5h5z" + android:fillColor="#000000"/> +</vector> diff --git a/app/src/main/res/drawable/ic_full_timetable.xml b/app/src/main/res/drawable/ic_full_timetable.xml new file mode 100644 index 0000000000000000000000000000000000000000..078cd98aefc97e2083345c046c3263359cee5a1a --- /dev/null +++ b/app/src/main/res/drawable/ic_full_timetable.xml @@ -0,0 +1,5 @@ +<vector android:autoMirrored="true" android:height="24dp" + android:viewportHeight="24.0" android:viewportWidth="24.0" + android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> + <path android:fillColor="#000000" android:pathData="M17,10L7,10v2L17,12ZM19,3C12,2.48 12,2.482 5,3 3.89,3 3.01,3.9 3.01,5L3,19c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5C21,3.9 20.1,3 19,3ZM19,19L5,19L5,8L19,8ZM14,14L7,14v2h7z"/> +</vector> diff --git a/app/src/main/res/drawable/ic_timetable.xml b/app/src/main/res/drawable/ic_timetable.xml deleted file mode 100644 index 078cd98aefc97e2083345c046c3263359cee5a1a..0000000000000000000000000000000000000000 --- a/app/src/main/res/drawable/ic_timetable.xml +++ /dev/null @@ -1,5 +0,0 @@ -<vector android:autoMirrored="true" android:height="24dp" - android:viewportHeight="24.0" android:viewportWidth="24.0" - android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> - <path android:fillColor="#000000" android:pathData="M17,10L7,10v2L17,12ZM19,3C12,2.48 12,2.482 5,3 3.89,3 3.01,3.9 3.01,5L3,19c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5C21,3.9 20.1,3 19,3ZM19,19L5,19L5,8L19,8ZM14,14L7,14v2h7z"/> -</vector> diff --git a/app/src/main/res/menu/menu_stop.xml b/app/src/main/res/menu/menu_stop.xml index 91de776b6cce0eb0f4cc4fd7f8d524a5c3c28a8f..6a45cee41c223f4c6e93ea85bc4b0f28afd3d97d 100644 --- a/app/src/main/res/menu/menu_stop.xml +++ b/app/src/main/res/menu/menu_stop.xml @@ -6,6 +6,6 @@- android:id="@+id/action_change_type" android:orderInCategory="100" android:title="@string/action_change_type" - android:icon="@drawable/ic_timetable" + android:icon="@drawable/ic_full_timetable" app:showAsAction="always" /> </menu>