Author: Adam Pioterek <adam.pioterek@protonmail.ch>
timetable full and departure-based & icons day-night colour
app/src/main/java/ml/adamsprogs/bimba/StopActivity.kt | 116 app/src/main/java/ml/adamsprogs/bimba/models/DeparturesAdapter.kt | 22 app/src/main/res/drawable/ic_departure_timetable.xml | 16 app/src/main/res/drawable/ic_full_timetable.xml | 5 app/src/main/res/drawable/ic_timetable_departure.xml | 12 app/src/main/res/drawable/ic_timetable_full.xml | 5 | 2 app/src/main/res/menu/menu_stop.xml | 2 app/src/main/res/values/strings.xml | 1
diff --git a/app/src/main/java/ml/adamsprogs/bimba/StopActivity.kt b/app/src/main/java/ml/adamsprogs/bimba/StopActivity.kt index bfcc9eab8ed77ebf76163f409d4555ae4cbd0ccc..fec00e38ef21786cd40a5b42f300e898b136793b 100644 --- a/app/src/main/java/ml/adamsprogs/bimba/StopActivity.kt +++ b/app/src/main/java/ml/adamsprogs/bimba/StopActivity.kt @@ -8,23 +8,25 @@ import android.support.v4.app.* import android.support.v4.view.ViewPager import android.os.Bundle import android.support.v4.content.res.ResourcesCompat +import android.support.v4.view.PagerAdapter import android.view.* import ml.adamsprogs.bimba.models.* import android.support.v7.widget.* import java.util.* +import kotlin.collections.ArrayList +import kotlin.collections.HashMap class StopActivity : AppCompatActivity() { //todo refresh private lateinit var stopId: String - private var departures: HashMap<String, ArrayList<Departure>>? = null private var timetableType = "departure" - private val rolledDepartures = HashMap<String, ArrayList<Departure>>() private var sectionsPagerAdapter: SectionsPagerAdapter? = null private var viewPager: ViewPager? = null + private lateinit var timetable: Timetable - override fun onCreate(savedInstanceState: Bundle?) { + override fun onCreate(savedInstanceState: Bundle?) { //todo select current mode super.onCreate(savedInstanceState) setContentView(R.layout.activity_stop) stopId = intent.getStringExtra("stop") @@ -36,29 +38,15 @@ /*todo when Internet connection exists -> download vm else -> timetable */ - val timetable = Timetable(this) + timetable = Timetable(this) supportActionBar?.title = timetable.getStopName(stopId) ?: "Stop" - departures = timetable.getStopDepartures(stopId) - - 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) viewPager = findViewById(R.id.container) as ViewPager - viewPager!!.adapter = sectionsPagerAdapter + val tabLayout = findViewById(R.id.tabs) as TabLayout - val tabLayout = findViewById(R.id.tabs) as TabLayout + sectionsPagerAdapter = SectionsPagerAdapter(supportFragmentManager, createDepartures()) + viewPager!!.adapter = sectionsPagerAdapter viewPager!!.addOnPageChangeListener(TabLayout.TabLayoutOnPageChangeListener(tabLayout)) tabLayout.addOnTabSelectedListener(TabLayout.ViewPagerOnTabSelectedListener(viewPager)) @@ -68,7 +56,46 @@ Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show() //todo favourites } + } + fun createDepartures(): HashMap<String, ArrayList<Departure>> { + val departures = timetable.getStopDepartures(stopId) + val moreDepartures = timetable.getStopDepartures(stopId) + val rolledDepartures = HashMap<String, ArrayList<Departure>>() + + for ((_, tomorrowDepartures) in moreDepartures!!) { + tomorrowDepartures.forEach{it.tomorrow = true} + } + + for ((mode, _) in departures!!) { + rolledDepartures[mode] = (departures[mode] as ArrayList<Departure> + + moreDepartures[mode] as ArrayList<Departure>) as ArrayList<Departure> + rolledDepartures[mode] = filterDepartures(rolledDepartures[mode]) + } + + return rolledDepartures + } + + fun filterDepartures(departures: List<Departure>?): ArrayList<Departure> { + val filtered = ArrayList<Departure>() + val lines = HashMap<String, Int>() + val now = Calendar.getInstance() + 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] + if (now.before(time) && lineExistedTimes ?: 0 < 3) { + lineExistedTimes = (lineExistedTimes ?: 0) + 1 + lines[departure.line] = lineExistedTimes + filtered.add(departure) + } + } + return filtered } @@ -80,16 +107,18 @@ override fun onOptionsItemSelected(item: MenuItem): Boolean { val id = item.itemId - if (id == R.id.action_change_type) { if (timetableType == "departure") { timetableType = "full" - item.icon = (ResourcesCompat.getDrawable(resources, R.drawable.ic_departure_timetable, null)) + item.icon = (ResourcesCompat.getDrawable(resources, R.drawable.ic_timetable_departure, this.theme)) + sectionsPagerAdapter?.changeDepartures(timetable.getStopDepartures(stopId)!!) + sectionsPagerAdapter?.notifyDataSetChanged() } else { timetableType = "departure" - item.icon = (ResourcesCompat.getDrawable(resources, R.drawable.ic_full_timetable, null)) + item.icon = (ResourcesCompat.getDrawable(resources, R.drawable.ic_timetable_full, this.theme)) + sectionsPagerAdapter?.changeDepartures(createDepartures()) + sectionsPagerAdapter?.notifyDataSetChanged() } - //todo change type return true } @@ -106,35 +135,12 @@ val layoutManager = LinearLayoutManager(activity) val departuresList: RecyclerView = rootView.findViewById(R.id.departuresList) as RecyclerView val dividerItemDecoration = DividerItemDecoration(departuresList.context, layoutManager.orientation) departuresList.addItemDecoration(dividerItemDecoration) - val adapter = DeparturesAdapter(activity, - filterDepartures(arguments.getStringArrayList("departures").map { fromString(it) })) + val adapter = DeparturesAdapter(activity, arguments.getStringArrayList("departures").map { fromString(it) }) departuresList.adapter = adapter departuresList.layoutManager = layoutManager return rootView } - fun filterDepartures(departures: List<Departure>): List<Departure> { - val filtered = ArrayList<Departure>() - val lines = HashMap<String, Int>() - val now = Calendar.getInstance() - 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] - if (now.before(time) && lineExistedTimes ?: 0 < 3) { - lineExistedTimes = (lineExistedTimes ?: 0) + 1 - lines[departure.line] = lineExistedTimes - filtered.add(departure) - } - } - return filtered - } - companion object { private val ARG_SECTION_NUMBER = "section_number" @@ -152,7 +158,11 @@ } } } - inner class SectionsPagerAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm) { + inner class SectionsPagerAdapter(fm: FragmentManager, var departures: HashMap<String, ArrayList<Departure>>) : FragmentStatePagerAdapter(fm) { + + override fun getItemPosition(obj: Any?): Int { + return PagerAdapter.POSITION_NONE + } override fun getItem(position: Int): Fragment { var mode: String? = null @@ -161,7 +171,11 @@ 0 -> mode = "workdays" 1 -> mode = "saturdays" 2 -> mode = "sundays" } - return PlaceholderFragment.newInstance(position + 1, stopId, rolledDepartures[mode]) + return PlaceholderFragment.newInstance(position + 1, stopId, departures[mode]) + } + + fun changeDepartures(departures: HashMap<String, ArrayList<Departure>>) { + this.departures = departures } override fun getCount() = 3 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 2c183b1ad57c541c08e9c7c0946d2eab627ac270..e899fc8cb3079e7e3c13c5be30c5beb1f787383b 100644 --- a/app/src/main/java/ml/adamsprogs/bimba/models/DeparturesAdapter.kt +++ b/app/src/main/java/ml/adamsprogs/bimba/models/DeparturesAdapter.kt @@ -27,28 +27,26 @@ if (departure.tomorrow) departureTime.add(Calendar.DAY_OF_MONTH, 1) val departureIn = (departureTime.timeInMillis - now.timeInMillis) / (1000 * 60) - val departureTimeShown: String - val timeString: Int + val timeString: String - if (departureIn > 60) { - timeString = R.string.departure_at - departureTimeShown = departure.time - } else { - timeString = R.string.departure_in - departureTimeShown = "$departureIn" - } + if (departureIn > 60 || departureIn < 0) + timeString = context.getString(R.string.departure_at, departure.time) + else if (departureIn > 0) + timeString = context.getString(R.string.departure_in, departureIn.toString()) + else + timeString = context.getString(R.string.now) val line = holder?.lineTextView line?.text = departure.line val time = holder?.timeTextView - time?.text = context.getString(timeString, departureTimeShown) + time?.text = timeString val direction = holder?.directionTextView direction?.text = context.getString(R.string.departure_to, departure.direction) val icon = holder?.typeIcon if (departure.vm) - icon?.setImageDrawable(ResourcesCompat.getDrawable(context.resources, R.drawable.ic_vm, null)) + icon?.setImageDrawable(ResourcesCompat.getDrawable(context.resources, R.drawable.ic_departure_vm, context.theme)) else - icon?.setImageDrawable(ResourcesCompat.getDrawable(context.resources, R.drawable.ic_departure_timetable, null)) + icon?.setImageDrawable(ResourcesCompat.getDrawable(context.resources, R.drawable.ic_departure_timetable, context.theme)) } 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 index 3d00295ba557febf30a9d23490f04458d5510443..3a193ca963bada05c9c0f3e0b6bc3270fc00d5c5 100644 --- a/app/src/main/res/drawable/ic_departure_timetable.xml +++ b/app/src/main/res/drawable/ic_departure_timetable.xml @@ -1,12 +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"> + android:width="24dp" + android:height="24dp" + android:viewportHeight="24.0" + android:viewportWidth="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"/> + android:fillColor="?attr/editTextColor" + 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" /> <path - android:pathData="m17,12h-5v5h5z" - android:fillColor="#000000"/> + android:fillColor="?attr/editTextColor" + android:pathData="m17,12h-5v5h5z" /> </vector> diff --git a/app/src/main/res/drawable/ic_departure_vm.xml b/app/src/main/res/drawable/ic_departure_vm.xml new file mode 100644 index 0000000000000000000000000000000000000000..8f8d66ee3262b481adf6dfbf7cad5c1db0160410 --- /dev/null +++ b/app/src/main/res/drawable/ic_departure_vm.xml @@ -0,0 +1,9 @@ +<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="M12,4C9.11,4 6.6,5.639 5.35,8.039C2.34,8.359 -0,10.91 0,14C0,17.31 2.69,20 6,20L19,20C21.76,20 24,17.76 24,15C24,12.36 21.95,10.219 19.35,10.039C18.67,6.589 15.64,4 12,4zM4.404,10.652L5.922,10.652L7.418,15.643L8.922,10.652L10.443,10.652L8.133,17.289L6.707,17.289L4.404,10.652zM11.072,10.652L12.859,10.652L14.563,15.465L16.258,10.652L18.055,10.652L18.055,17.289L16.682,17.289L16.682,15.475L16.818,12.344L15.027,17.289L14.09,17.289L12.303,12.348L12.439,15.475L12.439,17.289L11.072,17.289L11.072,10.652z" + android:fillColor="?attr/editTextColor" /> +</vector> diff --git a/app/src/main/res/drawable/ic_full_timetable.xml b/app/src/main/res/drawable/ic_full_timetable.xml deleted file mode 100644 index 078cd98aefc97e2083345c046c3263359cee5a1a..0000000000000000000000000000000000000000 --- a/app/src/main/res/drawable/ic_full_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/drawable/ic_timetable_departure.xml b/app/src/main/res/drawable/ic_timetable_departure.xml new file mode 100644 index 0000000000000000000000000000000000000000..ebb06922c12d84759b046b70104492d6f3e1d33d --- /dev/null +++ b/app/src/main/res/drawable/ic_timetable_departure.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="?attr/editTextColor"/> + <path + android:pathData="m17,12h-5v5h5z" + android:fillColor="?attr/editTextColor"/> +</vector> diff --git a/app/src/main/res/drawable/ic_timetable_full.xml b/app/src/main/res/drawable/ic_timetable_full.xml new file mode 100644 index 0000000000000000000000000000000000000000..0a5efef40e3814fb86d4b7371569c69de23d7e2a --- /dev/null +++ b/app/src/main/res/drawable/ic_timetable_full.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="?attr/editTextColor" 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_vm.xml b/app/src/main/res/drawable/ic_vm.xml deleted file mode 100644 index 6f0f48dfea25593fe7200f6c46a62146bd730449..0000000000000000000000000000000000000000 --- a/app/src/main/res/drawable/ic_vm.xml +++ /dev/null @@ -1,9 +0,0 @@ -<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="M12,4C9.11,4 6.6,5.639 5.35,8.039C2.34,8.359 -0,10.91 0,14C0,17.31 2.69,20 6,20L19,20C21.76,20 24,17.76 24,15C24,12.36 21.95,10.219 19.35,10.039C18.67,6.589 15.64,4 12,4zM4.404,10.652L5.922,10.652L7.418,15.643L8.922,10.652L10.443,10.652L8.133,17.289L6.707,17.289L4.404,10.652zM11.072,10.652L12.859,10.652L14.563,15.465L16.258,10.652L18.055,10.652L18.055,17.289L16.682,17.289L16.682,15.475L16.818,12.344L15.027,17.289L14.09,17.289L12.303,12.348L12.439,15.475L12.439,17.289L11.072,17.289L11.072,10.652z" - android:fillColor="#000000"/> -</vector> diff --git a/app/src/main/res/menu/menu_stop.xml b/app/src/main/res/menu/menu_stop.xml index 6a45cee41c223f4c6e93ea85bc4b0f28afd3d97d..b6a44d35ffee8bde31c57b994a4b54b58eeca51a 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_full_timetable" + android:icon="@drawable/ic_timetable_full" app:showAsAction="always" /> </menu> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 54b6e3bedc3affa2cc01ff48b8811d78aa25f21a..20ab2a24fb33ddcc4ee2667bac4d46107eccabd2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -20,4 +20,5 @@
No connectivity – can’t update timetable <string name="timetable_up_to_date">Timetable is up-to-date</string> <string name="validity_failed">Downloaded timetable is corrupted – can’t update</string> <string name="error_try_later">Error. Try again later</string> + <string name="now">Now</string> </resources>