Permalink
Browse files

Try using a new custom font: Barlow

Includes the sketch theme generated using the Material Sketch plugin
  • Loading branch information...
chrisbanes committed Jul 11, 2018
1 parent 315b1d9 commit 42d066781f6ede9897aab8df343f8fbbd0557a17
Showing with 328 additions and 34 deletions.
  1. +4 −0 app/src/main/AndroidManifest.xml
  2. +3 −2 app/src/main/java/app/tivi/ui/databinding/TiviBindingAdapters.kt
  3. +31 −0 app/src/main/java/app/tivi/ui/text/TextUtils.kt
  4. +22 −0 app/src/main/res/font/barlow_300.xml
  5. +22 −0 app/src/main/res/font/barlow_400.xml
  6. +22 −0 app/src/main/res/font/barlow_500.xml
  7. +1 −1 app/src/main/res/layout/fragment_episode_details.xml
  8. +1 −1 app/src/main/res/layout/fragment_library.xml
  9. +1 −1 app/src/main/res/layout/view_holder_details_badge.xml
  10. +1 −1 app/src/main/res/layout/view_holder_details_related_item.xml
  11. +1 −1 app/src/main/res/layout/view_holder_details_summary.xml
  12. +3 −3 app/src/main/res/layout/view_holder_details_title.xml
  13. +1 −1 app/src/main/res/layout/view_holder_empty_state.xml
  14. +1 −1 app/src/main/res/layout/view_holder_ep_details_first_aired_item.xml
  15. +1 −1 app/src/main/res/layout/view_holder_ep_details_summary.xml
  16. +1 −1 app/src/main/res/layout/view_holder_ep_details_watch_item.xml
  17. +2 −2 app/src/main/res/layout/view_holder_header.xml
  18. +1 −1 app/src/main/res/layout/view_holder_library_filter_item.xml
  19. +1 −1 app/src/main/res/layout/view_holder_library_followed_item.xml
  20. +1 −1 app/src/main/res/layout/view_holder_poster_grid_item.xml
  21. +1 −1 app/src/main/res/layout/view_holder_season_episode_item.xml
  22. +1 −1 app/src/main/res/layout/view_holder_season_header.xml
  23. +33 −0 app/src/main/res/values/font_certs.xml
  24. +24 −0 app/src/main/res/values/preloaded_fonts.xml
  25. +4 −9 app/src/main/res/values/styles.xml
  26. +106 −0 app/src/main/res/values/styles_typography.xml
  27. +38 −4 app/src/main/res/values/themes.xml
  28. BIN art/theme-baseline.sketch
@@ -52,6 +52,10 @@
android:name="io.fabric.ApiKey"
android:value="${fabric-api-key}" />

<meta-data
android:name="preloaded_fonts"
android:resource="@array/preloaded_fonts" />

</application>

</manifest>
@@ -36,6 +36,7 @@ import app.tivi.tmdb.TmdbImageUrlProvider
import app.tivi.ui.GenreStringer
import app.tivi.ui.MaxLinesToggleClickListener
import app.tivi.ui.glide.GlideApp
import app.tivi.ui.text.textAppearanceSpanForAttribute
import app.tivi.util.ScrimUtil

@BindingAdapter("tmdbPosterPath", "tmdbImageUrlProvider")
@@ -135,12 +136,12 @@ fun foregroundScrim(view: View, color: Int) {
@BindingAdapter("showTitle")
fun showTitle(view: TextView, show: TiviShow) {
view.text = buildSpannedString {
inSpans(TypefaceSpan("sans-serif-medium")) {
inSpans(textAppearanceSpanForAttribute(view.context, R.attr.textAppearanceHeadline6)) {
append(show.title)
}
show.firstAired?.also { firstAired ->
append(" ")
inSpans(TextAppearanceSpan(view.context, R.style.TextAppearance_Tivi_ShowTitle_Date)) {
inSpans(textAppearanceSpanForAttribute(view.context, R.attr.textAppearanceCaption)) {
append("(")
append(firstAired.year.toString())
append(")")
@@ -0,0 +1,31 @@
/*
* Copyright 2018 Google, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package app.tivi.ui.text

import android.content.Context
import android.text.style.TextAppearanceSpan
import android.util.TypedValue

private val typedValue = TypedValue()

fun textAppearanceSpanForAttribute(context: Context, attr: Int): TextAppearanceSpan {
if (context.theme.resolveAttribute(attr, typedValue, true)) {
return TextAppearanceSpan(context, typedValue.resourceId)
} else {
throw IllegalArgumentException("TextAppearance theme attribute can not be resolved")
}
}
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright 2018 Google, Inc.
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->

<font-family xmlns:app="http://schemas.android.com/apk/res-auto"
app:fontProviderAuthority="com.google.android.gms.fonts"
app:fontProviderCerts="@array/com_google_android_gms_fonts_certs"
app:fontProviderPackage="com.google.android.gms"
app:fontProviderQuery="name=Barlow&amp;weight300" />
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright 2018 Google, Inc.
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->

<font-family xmlns:app="http://schemas.android.com/apk/res-auto"
app:fontProviderAuthority="com.google.android.gms.fonts"
app:fontProviderCerts="@array/com_google_android_gms_fonts_certs"
app:fontProviderPackage="com.google.android.gms"
app:fontProviderQuery="name=Barlow&amp;weight=400" />
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright 2018 Google, Inc.
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->

<font-family xmlns:app="http://schemas.android.com/apk/res-auto"
app:fontProviderAuthority="com.google.android.gms.fonts"
app:fontProviderCerts="@array/com_google_android_gms_fonts_certs"
app:fontProviderPackage="com.google.android.gms"
app:fontProviderQuery="name=Barlow&amp;weight=500" />
@@ -58,7 +58,7 @@
android:elevation="4dp"
android:ellipsize="end"
android:text="@{episode.title}"
android:textAppearance="@style/TextAppearance.AppCompat.Title"
android:textAppearance="?attr/textAppearanceHeadline6"
android:theme="@style/ThemeOverlay.AppCompat.Dark"
app:layout_constraintBottom_toBottomOf="@+id/ep_details_fanart"
app:layout_constraintEnd_toStartOf="@+id/ep_details_fab"
@@ -48,7 +48,7 @@
android:background="?attr/selectableItemBackgroundBorderless"
android:gravity="center_vertical"
android:text="@{state.filter.labelResource != 0 ? context.getString(state.filter.labelResource) : @string/library_title}"
android:textAppearance="@style/TextAppearance.AppCompat.Title" />
android:textAppearance="?attr/textAppearanceHeadline6" />

</android.support.v7.widget.Toolbar>

@@ -64,7 +64,7 @@
android:ellipsize="end"
android:gravity="center"
android:text="@{label}"
android:textAppearance="@style/TextAppearance.AppCompat.Body2"
android:textAppearance="?attr/textAppearanceBody2"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
@@ -57,7 +57,7 @@
android:gravity="center"
android:padding="8dp"
android:text="@{tiviShow.title}"
android:textAppearance="@style/TextAppearance.AppCompat.Body2"
android:textAppearance="?attr/textAppearanceBody2"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
@@ -40,7 +40,7 @@
android:layout_height="wrap_content"
android:ellipsize="end"
android:text="@{summary}"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
android:textAppearance="?attr/textAppearanceBody2"
app:maxLinesToggle="@{@integer/details_summary_collapsed_lines}"
tools:text="@sample/shows.txt" />

@@ -52,7 +52,7 @@
android:layout_marginStart="96dp"
android:ellipsize="end"
android:text="@{title}"
android:textAppearance="@style/TextAppearance.AppCompat.Title"
android:textAppearance="?attr/textAppearanceHeadline6"
app:layout_constraintBottom_toTopOf="@+id/details_subtitle"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
@@ -67,7 +67,7 @@
android:layout_marginTop="4dp"
android:ellipsize="end"
android:text="@{subtitle}"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
android:textAppearance="?attr/textAppearanceBody1"
app:layout_constraintBottom_toTopOf="@+id/details_categories"
app:layout_constraintEnd_toEndOf="@+id/details_title"
app:layout_constraintStart_toStartOf="@+id/details_title"
@@ -82,7 +82,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:ellipsize="end"
android:textAppearance="@style/TextAppearance.AppCompat.Caption"
android:textAppearance="?attr/textAppearanceCaption"
app:genreContentDescriptionString="@{genres}"
app:genreString="@{genres}"
app:layout_constraintBottom_toBottomOf="parent"
@@ -57,7 +57,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{message ?? @string/empty_prompt}"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:textAppearance="?attr/textAppearanceBody2"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
@@ -43,7 +43,7 @@
android:layout_marginStart="16dp"
android:ellipsize="end"
android:text="@{@string/first_aired(dateTimeFormatter.format(episode.firstAired))}"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
android:textAppearance="?attr/textAppearanceBody1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
@@ -33,7 +33,7 @@
android:ellipsize="end"
android:padding="16dp"
android:text="@{episode.summary}"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
android:textAppearance="?attr/textAppearanceBody1"
app:maxLinesToggle="@{@integer/details_summary_collapsed_lines}"
tools:text="@sample/episode_summary.txt" />

@@ -44,7 +44,7 @@
android:layout_marginStart="16dp"
android:ellipsize="end"
android:text="@{dateTimeFormatter.format(watch.watchedAt)}"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
android:textAppearance="?attr/textAppearanceBody1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/watch_ic_sync"
app:layout_constraintStart_toStartOf="parent"
@@ -51,7 +51,7 @@
android:layout_marginStart="@dimen/header_margin"
android:gravity="center_vertical"
android:text="@{title}"
android:textAppearance="@style/TextAppearance.AppCompat.Body2"
android:textAppearance="?attr/textAppearanceSubtitle1"
tools:text="Popular" />

<TextView
@@ -65,7 +65,7 @@
android:onClick="@{buttonClickListener}"
android:text="@{buttonTitle != 0 ? context.getString(buttonTitle) : @string/header_more}"
android:textAllCaps="true"
android:textAppearance="@style/TextAppearance.AppCompat.Body2"
android:textAppearance="?attr/textAppearanceButton"
android:textColor="@color/colorAccent"
app:visibleIfNotNull="@{buttonClickListener}" />

@@ -58,7 +58,7 @@
android:layout_marginStart="16dp"
android:gravity="center_vertical"
android:text="@{filter.labelResource}"
android:textAppearance="@style/TextAppearance.AppCompat.Body2"
android:textAppearance="?attr/textAppearanceBody2"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/filter_icon"
app:layout_constraintStart_toStartOf="parent"
@@ -74,7 +74,7 @@
android:layout_margin="16dp"
android:gravity="center_vertical"
app:showTitle="@{tiviShow}"
android:textAppearance="@style/TextAppearance.AppCompat.Title"
android:textAppearance="?attr/textAppearanceHeadline6"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/show_poster"
app:layout_constraintTop_toTopOf="parent"
@@ -67,7 +67,7 @@
android:gravity="center"
android:padding="8dp"
android:text="@{tiviShow.title}"
android:textAppearance="@style/TextAppearance.AppCompat.Body2"
android:textAppearance="?attr/textAppearanceBody2"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
@@ -44,7 +44,7 @@
android:layout_marginStart="16dp"
android:gravity="center_vertical"
android:text="@{episodeWithWatches.episode.title}"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
android:textAppearance="?attr/textAppearanceBody1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/episode_watches_pending"
app:layout_constraintStart_toStartOf="parent"
@@ -39,7 +39,7 @@
android:layout_marginStart="@dimen/header_margin"
android:gravity="center_vertical"
android:text="@{season.title}"
android:textAppearance="@style/TextAppearance.AppCompat.Body2"
android:textAppearance="?attr/textAppearanceBody2"
tools:text="Season 01" />

</FrameLayout>
@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright 2018 Google, Inc.
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->

<resources>
<array name="com_google_android_gms_fonts_certs">
<item>@array/com_google_android_gms_fonts_certs_dev</item>
<item>@array/com_google_android_gms_fonts_certs_prod</item>
</array>
<string-array name="com_google_android_gms_fonts_certs_dev">
<item>
MIIEqDCCA5CgAwIBAgIJANWFuGx90071MA0GCSqGSIb3DQEBBAUAMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAeFw0wODA0MTUyMzM2NTZaFw0zNTA5MDEyMzM2NTZaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBANbOLggKv+IxTdGNs8/TGFy0PTP6DHThvbbR24kT9ixcOd9W+EaBPWW+wPPKQmsHxajtWjmQwWfna8mZuSeJS48LIgAZlKkpFeVyxW0qMBujb8X8ETrWy550NaFtI6t9+u7hZeTfHwqNvacKhp1RbE6dBRGWynwMVX8XW8N1+UjFaq6GCJukT4qmpN2afb8sCjUigq0GuMwYXrFVee74bQgLHWGJwPmvmLHC69EH6kWr22ijx4OKXlSIx2xT1AsSHee70w5iDBiK4aph27yH3TxkXy9V89TDdexAcKk/cVHYNnDBapcavl7y0RiQ4biu8ymM8Ga/nmzhRKya6G0cGw8CAQOjgfwwgfkwHQYDVR0OBBYEFI0cxb6VTEM8YYY6FbBMvAPyT+CyMIHJBgNVHSMEgcEwgb6AFI0cxb6VTEM8YYY6FbBMvAPyT+CyoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJANWFuGx90071MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADggEBABnTDPEF+3iSP0wNfdIjIz1AlnrPzgAIHVvXxunW7SBrDhEglQZBbKJEk5kT0mtKoOD1JMrSu1xuTKEBahWRbqHsXclaXjoBADb0kkjVEJu/Lh5hgYZnOjvlba8Ld7HCKePCVePoTJBdI4fvugnL8TsgK05aIskyY0hKI9L8KfqfGTl1lzOv2KoWD0KWwtAWPoGChZxmQ+nBli+gwYMzM1vAkP+aayLe0a1EQimlOalO762r0GXO0ks+UeXde2Z4e+8S/pf7pITEI/tP+MxJTALw9QUWEv9lKTk+jkbqxbsh8nfBUapfKqYn0eidpwq2AzVp3juYl7//fKnaPhJD9gs=
</item>
</string-array>
<string-array name="com_google_android_gms_fonts_certs_prod">
<item>
MIIEQzCCAyugAwIBAgIJAMLgh0ZkSjCNMA0GCSqGSIb3DQEBBAUAMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDAeFw0wODA4MjEyMzEzMzRaFw0zNjAxMDcyMzEzMzRaMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBAKtWLgDYO6IIrgqWbxJOKdoR8qtW0I9Y4sypEwPpt1TTcvZApxsdyxMJZ2JORland2qSGT2y5b+3JKkedxiLDmpHpDsz2WCbdxgxRczfey5YZnTJ4VZbH0xqWVW/8lGmPav5xVwnIiJS6HXk+BVKZF+JcWjAsb/GEuq/eFdpuzSqeYTcfi6idkyugwfYwXFU1+5fZKUaRKYCwkkFQVfcAs1fXA5V+++FGfvjJ/CxURaSxaBvGdGDhfXE28LWuT9ozCl5xw4Yq5OGazvV24mZVSoOO0yZ31j7kYvtwYK6NeADwbSxDdJEqO4k//0zOHKrUiGYXtqw/A0LFFtqoZKFjnkCAQOjgdkwgdYwHQYDVR0OBBYEFMd9jMIhF1Ylmn/Tgt9r45jk14alMIGmBgNVHSMEgZ4wgZuAFMd9jMIhF1Ylmn/Tgt9r45jk14aloXikdjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLR29vZ2xlIEluYy4xEDAOBgNVBAsTB0FuZHJvaWQxEDAOBgNVBAMTB0FuZHJvaWSCCQDC4IdGZEowjTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA4IBAQBt0lLO74UwLDYKqs6Tm8/yzKkEu116FmH4rkaymUIE0P9KaMftGlMexFlaYjzmB2OxZyl6euNXEsQH8gjwyxCUKRJNexBiGcCEyj6z+a1fuHHvkiaai+KL8W1EyNmgjmyy8AW7P+LLlkR+ho5zEHatRbM/YAnqGcFh5iZBqpknHf1SKMXFh4dd239FJ1jWYfbMDMy3NS5CTMQ2XFI1MvcyUTdZPErjQfTbQe3aDQsQcafEQPD+nqActifKZ0Np0IS9L9kR/wbNvyz6ENwPiTrjV2KRkEjH78ZMcUQXg0L3BYHJ3lc69Vs5Ddf9uUGGMYldX3WfMBEmh/9iFBDAaTCK
</item>
</string-array>
</resources>
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright 2018 Google, Inc.
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->

<resources>
<array name="preloaded_fonts" translatable="false">
<item>@font/barlow_300</item>
<item>@font/barlow_400</item>
<item>@font/barlow_500</item>
</array>
</resources>
Oops, something went wrong.

0 comments on commit 42d0667

Please sign in to comment.