Skip to content

Commit

Permalink
Fix offset searching, tweak strings/layouts
Browse files Browse the repository at this point in the history
  • Loading branch information
anticobalt committed Aug 28, 2019
1 parent 8793d17 commit 728ebab
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 11 deletions.
2 changes: 1 addition & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
</activity>
<activity
android:name=".activity.TimeZoneActivity"
android:label="Time Zones"
android:label="All Time Zones"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="portrait" />
<activity
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ import musubidevs.android.greenwich.R
import musubidevs.android.greenwich.item.TimeZoneItem
import musubidevs.android.greenwich.layout.TimeZoneCardMargin
import musubidevs.android.greenwich.model.UtcOffset
import musubidevs.android.greenwich.model.UtcOffset.Companion.minusSign
import musubidevs.android.greenwich.model.UtcOffset.Companion.plusSign
import org.joda.time.DateTimeZone

class TimeZoneActivity : CyaneaAppCompatActivity(), ItemFilterListener<TimeZoneItem> {
Expand All @@ -42,7 +44,8 @@ class TimeZoneActivity : CyaneaAppCompatActivity(), ItemFilterListener<TimeZoneI
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.search, menu)

(menu.findItem(R.id.search).actionView as SearchView).setOnQueryTextListener(object :
val search = (menu.findItem(R.id.search).actionView as SearchView)
search.setOnQueryTextListener(object :
SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String?): Boolean {
fastItemAdapter.filter(query)
Expand All @@ -54,6 +57,7 @@ class TimeZoneActivity : CyaneaAppCompatActivity(), ItemFilterListener<TimeZoneI
return true
}
})
search.queryHint = getString(R.string.time_zone_search_hint)

return super.onCreateOptionsMenu(menu)
}
Expand Down Expand Up @@ -85,12 +89,13 @@ class TimeZoneActivity : CyaneaAppCompatActivity(), ItemFilterListener<TimeZoneI
timeZoneRecycler.adapter = fastItemAdapter
fastItemAdapter.itemFilter.filterPredicate =
{ item: TimeZoneItem, constraint: CharSequence? ->
// Filter regions that contain query or offsets whose hour
val constraintLower = constraint.toString().toLowerCase()
val region = item.region.toLowerCase()
// https://stackoverflow.com/a/4030936
val offset = item.utcOffset.replace("\\D+", "")
region.contains(constraintLower) || offset.startsWith(constraintLower)
val offset = item.utcOffset.replaceFirst("[A-z]+".toRegex(), "")
region.contains(constraintLower) || matchesOffset(constraintLower, offset)
}

fastItemAdapter.itemFilter.itemFilterListener = this

val items = intent.getParcelableArrayListExtra<TimeZoneItem>(
Expand All @@ -99,6 +104,32 @@ class TimeZoneActivity : CyaneaAppCompatActivity(), ItemFilterListener<TimeZoneI
fastItemAdapter.add(items)
}

/**
* @param query Any string
* @param offset String in form +13:45, -13, -3, etc
*/
private fun matchesOffset(query: String, offset: String) : Boolean {
var signedQuery = query.replace('-', minusSign)
if (minusSign !in signedQuery && plusSign !in signedQuery) signedQuery = "$plusSign$query"

return when {
// If searching by sign, match all that have that sign
(signedQuery == plusSign.toString() || signedQuery == minusSign.toString()) ->
offset.startsWith(signedQuery)

// If searching by minutes, match all that are NOT on the hour
// and whose minutes component starts with query
query.startsWith(":") ->
':' in offset && offset.split(":")[1].startsWith(query.removePrefix(":"))

// If searching by hour, match hour exactly (e.g. query=1 matches +1:30, not +11:30)
':' !in signedQuery -> offset.split(":")[0].endsWith(signedQuery)

// If ':' in middle of query, match lazily
else -> offset.startsWith(signedQuery)
}
}

override fun itemsFiltered(constraint: CharSequence?, results: List<TimeZoneItem>?) {
// Implementation not required
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,15 @@ import kotlin.math.abs
*/
class UtcOffset(private val hours: Int, private val minutes: Int) {
companion object {
const val minusSign = ''
const val plusSign = '+'
const val plusMinusSign = '±'

fun default(): UtcOffset {
return from(DateTimeZone.getDefault())
}

fun from(dateTimeZone: DateTimeZone) : UtcOffset {
fun from(dateTimeZone: DateTimeZone): UtcOffset {
val instant = DateTime.now(dateTimeZone)
val offsetMillis = dateTimeZone.getOffset(instant).toLong()
val offsetHours = TimeUnit.MILLISECONDS.toHours(offsetMillis).toInt()
Expand All @@ -33,13 +37,13 @@ class UtcOffset(private val hours: Int, private val minutes: Int) {
}

override fun toString(): String {
if (hours == 0 && minutes == 0) return "UTC±0"
if (hours == 0 && minutes == 0) return "UTC${plusMinusSign}0"

var res = "UTC"
res += if (hours > 0 && minutes >= 0) {
"+"
plusSign
} else {
""
minusSign
}
res += abs(hours).toString()
if (minutes != 0) {
Expand Down
4 changes: 2 additions & 2 deletions app/src/main/res/layout/list_item_time_zone.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,15 @@
android:layout_height="match_parent"
android:textColor="?defaultTextColor"
android:fontFamily="@font/open_sans"
android:layout_weight="4" />
android:layout_weight="7" />

<TextView
android:id="@+id/offsetView"
android:layout_width="0dp"
android:layout_height="match_parent"
android:textColor="?defaultTextColor"
android:fontFamily="@font/open_sans"
android:layout_weight="1" />
android:layout_weight="2" />

</LinearLayout>

Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,5 @@
<string name="time_zone_reference">Time Zones</string>
<string name="search">Search</string>
<string name="themes">Themes</string>
<string name="time_zone_search_hint">Search by ID or offset…</string>
</resources>

0 comments on commit 728ebab

Please sign in to comment.