AboutScreen: Smaller Brand Icon + New Badges section (links to contact me) + New "What's new" option (sends user to the latest release page).

This commit is contained in:
acclorite 2024-07-23 15:24:52 +03:00
parent ebc1a83f4f
commit ae6596f237
12 changed files with 335 additions and 25 deletions

View file

@ -0,0 +1,15 @@
package ua.acclorite.book_story.domain.model
import androidx.annotation.DrawableRes
import androidx.annotation.StringRes
import androidx.compose.runtime.Immutable
import androidx.compose.ui.graphics.vector.ImageVector
@Immutable
data class Badge(
val id: String,
val imageVector: ImageVector?,
@DrawableRes val drawable: Int?,
@StringRes val contentDescription: Int,
val url: String?
)

View file

@ -1,10 +1,13 @@
package ua.acclorite.book_story.domain.util package ua.acclorite.book_story.domain.util
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Person
import androidx.compose.ui.text.font.Font import androidx.compose.ui.text.font.Font
import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import ua.acclorite.book_story.R import ua.acclorite.book_story.R
import ua.acclorite.book_story.domain.model.Badge
import ua.acclorite.book_story.domain.model.Book import ua.acclorite.book_story.domain.model.Book
import ua.acclorite.book_story.domain.model.Category import ua.acclorite.book_story.domain.model.Category
import ua.acclorite.book_story.domain.model.Credit import ua.acclorite.book_story.domain.model.Credit
@ -110,6 +113,45 @@ object Constants {
), ),
) )
// About Badges
val ABOUT_BADGES = listOf(
Badge(
id = "x",
drawable = R.drawable.x_logo,
imageVector = null,
contentDescription = R.string.x_content_desc,
url = "https://www.x.com/acclorite"
),
Badge(
id = "reddit",
drawable = R.drawable.reddit,
imageVector = null,
contentDescription = R.string.reddit_content_desc,
url = "https://www.reddit.com/user/Acclorite/"
),
Badge(
id = "tryzub",
drawable = R.drawable.tryzub,
imageVector = null,
contentDescription = R.string.tryzub_content_desc,
url = null
),
Badge(
id = "github_project",
drawable = R.drawable.github,
imageVector = null,
contentDescription = R.string.github_project_content_desc,
url = "https://www.github.com/Acclorite/book-story"
),
Badge(
id = "github_profile",
drawable = null,
imageVector = Icons.Default.Person,
contentDescription = R.string.github_profile_content_desc,
url = "https://www.github.com/Acclorite"
),
)
// Fonts for Reader // Fonts for Reader
val FONTS = listOf( val FONTS = listOf(
FontWithName( FontWithName(

View file

@ -1,5 +1,6 @@
package ua.acclorite.book_story.presentation.components package ua.acclorite.book_story.presentation.components
import androidx.annotation.DrawableRes
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton import androidx.compose.material3.IconButton
@ -13,10 +14,20 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.focusProperties import androidx.compose.ui.focus.focusProperties
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
/** /**
* Custom Icon Button. Can be disabled after click, so user can't press button fast 2 or 3 times. * Custom Icon Button.
* Can be disabled after click, so user can't press button fast 2 or 3 times.
*
* @param modifier [Modifier].
* @param icon ImageVector Icon.
* @param contentDescription Content description (tooltip text).
* @param disableOnClick Whether button disables after first click.
* @param enabled Whether button enabled.
* @param color Color of the Icon.
* @param onClick OnClick callback.
*/ */
@Composable @Composable
fun CustomIconButton( fun CustomIconButton(
@ -51,3 +62,49 @@ fun CustomIconButton(
} }
} }
} }
/**
* Custom Icon Button.
* Can be disabled after click, so user can't press button fast 2 or 3 times.
*
* @param modifier [Modifier].
* @param icon Drawable Icon.
* @param contentDescription Content description (tooltip text).
* @param disableOnClick Whether button disables after first click.
* @param enabled Whether button enabled.
* @param color Color of the Icon.
* @param onClick OnClick callback.
*/
@Composable
fun CustomIconButton(
modifier: Modifier = Modifier,
@DrawableRes icon: Int,
@StringRes contentDescription: Int,
disableOnClick: Boolean,
enabled: Boolean = true,
color: Color = LocalContentColor.current,
onClick: () -> Unit
) {
var isClicked by remember { mutableStateOf(false) }
CustomTooltip(text = stringResource(id = contentDescription)) {
IconButton(
enabled = enabled && !isClicked,
modifier = Modifier.focusProperties {
canFocus = false
},
onClick = {
if (disableOnClick) {
isClicked = true
}
onClick()
}
) {
Icon(
painter = painterResource(id = icon),
modifier = modifier,
contentDescription = stringResource(id = contentDescription),
tint = color
)
}
}
}

View file

@ -40,6 +40,7 @@ import ua.acclorite.book_story.presentation.data.LocalNavigator
import ua.acclorite.book_story.presentation.data.Screen import ua.acclorite.book_story.presentation.data.Screen
import ua.acclorite.book_story.presentation.screens.about.components.AboutItem import ua.acclorite.book_story.presentation.screens.about.components.AboutItem
import ua.acclorite.book_story.presentation.screens.about.components.AboutUpdateDialog import ua.acclorite.book_story.presentation.screens.about.components.AboutUpdateDialog
import ua.acclorite.book_story.presentation.screens.about.components.badges.AboutBadges
import ua.acclorite.book_story.presentation.screens.about.data.AboutEvent import ua.acclorite.book_story.presentation.screens.about.data.AboutEvent
import ua.acclorite.book_story.presentation.screens.about.data.AboutState import ua.acclorite.book_story.presentation.screens.about.data.AboutState
import ua.acclorite.book_story.presentation.screens.about.data.AboutViewModel import ua.acclorite.book_story.presentation.screens.about.data.AboutViewModel
@ -117,7 +118,7 @@ private fun AboutScreen(
contentDescription = stringResource(id = R.string.app_icon_content_desc), contentDescription = stringResource(id = R.string.app_icon_content_desc),
modifier = Modifier modifier = Modifier
.padding(14.dp) .padding(14.dp)
.size(160.dp), .size(120.dp),
tint = MaterialTheme.colorScheme.onSurfaceVariant tint = MaterialTheme.colorScheme.onSurfaceVariant
) )
} }
@ -190,12 +191,12 @@ private fun AboutScreen(
item { item {
AboutItem( AboutItem(
title = stringResource(id = R.string.project_page_option), title = stringResource(id = R.string.whats_new_option),
description = null description = null
) { ) {
onEvent( onEvent(
AboutEvent.OnNavigateToBrowserPage( AboutEvent.OnNavigateToBrowserPage(
context.getString(R.string.project_page), context.getString(R.string.releases_page),
context, context,
noAppsFound = { noAppsFound = {
Toast.makeText( Toast.makeText(
@ -253,19 +254,8 @@ private fun AboutScreen(
} }
item { item {
AboutItem( AboutBadges(onEvent = onEvent)
title = stringResource(id = R.string.slava_ukraini_option), }
description = null
) {
Toast.makeText(
context,
context.getString(R.string.slava_ukraini_option_desc),
Toast.LENGTH_SHORT
).show()
}
}
item { Spacer(modifier = Modifier.height(48.dp)) }
} }
} }
} }

View file

@ -0,0 +1,43 @@
package ua.acclorite.book_story.presentation.screens.about.components.badges
import androidx.compose.foundation.layout.size
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import ua.acclorite.book_story.domain.model.Badge
import ua.acclorite.book_story.presentation.components.CustomIconButton
/**
* About Badge Item.
*
* @param badge [Badge].
* @param onClick OnClick callback.
*/
@Composable
fun AboutBadgeItem(
badge: Badge,
onClick: () -> Unit
) {
if (badge.imageVector == null && badge.drawable != null) {
CustomIconButton(
modifier = Modifier.size(22.dp),
icon = badge.drawable,
contentDescription = badge.contentDescription,
disableOnClick = false,
color = MaterialTheme.colorScheme.primary
) {
onClick()
}
} else if (badge.imageVector != null && badge.drawable == null) {
CustomIconButton(
modifier = Modifier.size(22.dp),
icon = badge.imageVector,
contentDescription = badge.contentDescription,
disableOnClick = false,
color = MaterialTheme.colorScheme.primary
) {
onClick()
}
}
}

View file

@ -0,0 +1,77 @@
package ua.acclorite.book_story.presentation.screens.about.components.badges
import android.widget.Toast
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import ua.acclorite.book_story.R
import ua.acclorite.book_story.domain.util.Constants
import ua.acclorite.book_story.presentation.components.customItems
import ua.acclorite.book_story.presentation.screens.about.data.AboutEvent
/**
* About Badges.
* Links all ways to contact me.
*
* @param onEvent [AboutEvent] callback.
* @param verticalPadding Vertical item padding.
*/
@Composable
fun AboutBadges(
onEvent: (AboutEvent) -> Unit,
verticalPadding: Dp = 18.dp
) {
val context = LocalContext.current
Box(
modifier = Modifier.fillMaxWidth(),
contentAlignment = Alignment.Center
) {
LazyRow(
Modifier
.padding(horizontal = 18.dp, vertical = verticalPadding),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(13.dp)
) {
customItems(Constants.ABOUT_BADGES, key = { it.id }) { badge ->
AboutBadgeItem(badge = badge) {
when (badge.id) {
"tryzub" -> {
Toast.makeText(
context,
context.getString(R.string.slava_ukraini),
Toast.LENGTH_SHORT
).show()
}
else -> {
badge.url?.let {
onEvent(
AboutEvent.OnNavigateToBrowserPage(
it,
context,
noAppsFound = {
Toast.makeText(
context,
context.getString(R.string.error_no_browser),
Toast.LENGTH_SHORT
).show()
}
)
)
}
}
}
}
}
}
}
}

View file

@ -0,0 +1,14 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:height="24dp"
android:viewportHeight="1024"
android:viewportWidth="1024"
android:width="24dp">
<path
android:fillColor="#e8eaed"
android:fillType="evenOdd"
android:pathData="M512,0C229.1,0 0,229.1 0,512C0,738.6 146.6,929.9 350.1,997.8C375.7,1002.2 385.3,986.9 385.3,973.4C385.3,961.3 384.6,921 384.6,878.1C256,901.8 222.7,846.7 212.5,817.9C206.7,803.2 181.8,757.8 160,745.6C142.1,736 116.5,712.3 159.4,711.7C199.7,711 228.5,748.8 238.1,764.2C284.2,841.6 357.8,819.8 387.2,806.4C391.7,773.1 405.1,750.7 419.8,737.9C305.9,725.1 186.9,681 186.9,485.1C186.9,429.4 206.7,383.4 239.4,347.5C234.2,334.7 216.3,282.2 244.5,211.8C244.5,211.8 287.4,198.4 385.3,264.3C426.2,252.8 469.8,247 513.3,247C556.8,247 600.3,252.8 641.3,264.3C739.2,197.8 782.1,211.8 782.1,211.8C810.2,282.2 792.3,334.7 787.2,347.5C819.8,383.4 839.7,428.8 839.7,485.1C839.7,681.6 720,725.1 606.1,737.9C624.6,753.9 640.6,784.6 640.6,832.6C640.6,901.1 640,956.2 640,973.4C640,986.9 649.6,1002.9 675.2,997.8C877.4,929.9 1024,737.9 1024,512C1024,229.1 794.9,0 512,0Z"
tools:ignore="VectorPath" />
</vector>

View file

@ -0,0 +1,45 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:height="24dp"
android:viewportHeight="256"
android:viewportWidth="256"
android:width="24dp">
<path
android:fillColor="#e8eaed"
android:fillType="nonZero"
android:pathData="M111.07,140.52c0,-6.98 -5.69,-12.67 -12.67,-12.67c-6.98,0 -12.67,5.69 -12.67,12.67c0,6.98 5.66,12.6 12.67,12.67C105.38,153.19 111.07,147.5 111.07,140.52z"
android:strokeColor="#00000000"
android:strokeLineCap="butt"
android:strokeLineJoin="miter"
android:strokeWidth="2.81" />
<path
android:fillColor="#e8eaed"
android:fillType="nonZero"
android:pathData="M154.26,170.73c-7.7,5.5 -17,8.2 -26.43,7.7c-9.43,0.44 -18.7,-2.39 -26.31,-7.95c-1.29,-1.04 -3.08,-1.04 -4.34,0c-1.45,1.19 -1.67,3.36 -0.47,4.81c8.99,6.76 19.99,10.22 31.24,9.75c11.25,0.47 22.26,-2.99 31.24,-9.75l0,0.5c1.38,-1.35 1.41,-3.61 0.06,-5C157.9,169.41 155.64,169.38 154.26,170.73z"
android:strokeColor="#00000000"
android:strokeLineCap="butt"
android:strokeLineJoin="miter"
android:strokeWidth="2.81" />
<path
android:fillColor="#e8eaed"
android:fillType="nonZero"
android:pathData="M156.93,128.29c-6.98,0 -12.67,5.69 -12.67,12.67c0,6.98 5.69,12.67 12.67,12.67l-0.1,0.47c0.22,0 0.41,0 0.63,0c6.98,-0.28 12.41,-6.16 12.13,-13.14C169.6,133.99 163.91,128.29 156.93,128.29z"
android:strokeColor="#00000000"
android:strokeLineCap="butt"
android:strokeLineJoin="miter"
android:strokeWidth="2.81" />
<path
android:fillColor="#e8eaed"
android:fillType="nonZero"
android:pathData="M127.86,1.41C58.02,1.41 1.41,58.02 1.41,127.86c0,69.84 56.61,126.45 126.45,126.45c69.84,0 126.45,-56.61 126.45,-126.45C254.31,58.02 197.69,1.41 127.86,1.41zM201.97,144.67c0.13,1.85 0.13,3.71 0,5.56c0,28.35 -33,51.36 -73.71,51.36s-73.71,-23.04 -73.71,-51.36c-0.13,-1.85 -0.13,-3.71 0,-5.56c-1.85,-0.82 -3.52,-1.98 -4.97,-3.33c-7.45,-6.98 -7.79,-18.67 -0.82,-26.09c6.98,-7.45 18.67,-7.79 26.09,-0.82c14.58,-9.87 31.71,-15.28 49.32,-15.56l9.33,-43.88c0,-0.03 0,-0.03 0,-0.06c0.47,-2.14 2.58,-3.46 4.68,-2.99l30.99,6.19c1.98,-3.46 5.56,-5.79 9.55,-6.19c6.95,-0.76 13.17,4.27 13.92,11.22s-4.27,13.17 -11.22,13.92c-6.95,0.76 -13.17,-4.27 -13.92,-11.22l-27.06,-5.69l-8.2,39.45c17.38,0.38 34.29,5.75 48.69,15.56c3.27,-3.11 7.57,-4.97 12.1,-5.12c10.21,-0.35 18.77,7.61 19.14,17.79C212.31,134.96 208.32,141.5 201.97,144.67z"
android:strokeColor="#00000000"
android:strokeLineCap="butt"
android:strokeLineJoin="miter"
android:strokeWidth="2.81"
tools:ignore="VectorPath" />
</vector>

View file

@ -0,0 +1,13 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:height="39.867767dp"
android:viewportHeight="402"
android:viewportWidth="242"
android:width="24dp">
<path
android:fillColor="#e8eaed"
android:pathData="m121,1c-9.32,10.58 -15,24.42 -15,39.62 0.55,33.37 4.64,66.7 5,100 0.74,31.1 -8.58,60.3 -19.92,88.8 -3.78,7.87 -7.86,15.57 -11.95,23.29l-12,-2.42c-10.83,-2.16 -17.87,-12.69 -15.7,-23.52 1.89,-9.47 10.23,-16.1 19.53,-16.1l4.38,0.47l-9.77,-81.6c-3.19,-36.3 -21.93,-68.2 -49.5,-88.9 -4.74,-3.56 -9.77,-6.82 -15,-9.69v289.7h66.88c5,27.1 19.94,50.8 40.94,67 4.99,3.44 9.18,7.98 12.19,13.28 3,-5.3 7.19,-9.84 12.19,-13.28 21,-16.24 35.94,-39.89 40.94,-67h66.88v-289.7c-5.23,2.87 -10.26,6.13 -15,9.69 -27.6,20.73 -46.3,52.6 -49.5,88.9l-9.77,81.6l4.38,-0.47c9.3,0.04 17.64,6.62 19.53,16.1 2.16,10.83 -4.88,21.35 -15.7,23.52l-12,2.42c-4.09,-7.71 -8.18,-15.41 -11.95,-23.29 -11.35,-28.48 -20.67,-57.68 -19.93,-88.8 0.36,-33.4 4.45,-66.7 5,-100 0,-15.2 -5.68,-29 -15,-39.62zM21,72.7c12.94,15.19 21.63,34.1 24.2,54.93l8,67.3c-10.25,5.1 -18,14.46 -20.94,25.79h-11.33v-148zM221,72.7v148h-11.33c-2.92,-11.32 -10.69,-20.68 -20.94,-25.79l8,-67.3c2.59,-20.81 11.28,-39.74 24.2,-54.94zM121,208c5.37,17.57 12.76,34.3 21.95,49.78 -8.74,2.65 -16.34,7.81 -21.95,14.76 -5.61,-6.95 -13.21,-12.1 -21.95,-14.77 9.19,-15.51 16.58,-32.2 21.95,-49.77zM21,240.74h11.33c3.57,13.81 14.35,24.71 28,28.52l9.61,2.19c-2.57,9.32 -3.98,19.1 -3.98,29.3h-45v-60zM209.7,240.74h11.33v60h-45c0,-10.14 -1.41,-19.97 -3.98,-29.3l9.61,-2.19c13.7,-3.81 24.47,-14.72 28,-28.52zM89.5,276.04c12.13,1.71 21.48,12.1 21.48,24.69h-25c0,-8.57 1.27,-16.84 3.52,-24.69zM152.47,276.04c2.25,7.85 3.52,16.1 3.52,24.69h-25c0,-12.61 9.35,-22.98 21.48,-24.69zM88.27,320.74h22.73v42.1c-11,-11.55 -19,-26 -22.73,-42.1zM131,320.74h22.73c-3.68,16.1 -11.7,30.57 -22.73,42.1v-42.1z"
tools:ignore="VectorPath" />
</vector>

View file

@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="21.68dp"
android:viewportHeight="271"
android:viewportWidth="300"
android:width="24dp">
<path
android:fillColor="#e8eaed"
android:pathData="m236,0h46l-101,115 118,156h-92.6l-72.5,-94.8 -83,94.8h-46l107,-123 -113,-148h94.9l65.5,86.6zM219.9,244h25.5l-165,-218h-27.4z" />
</vector>

View file

@ -293,12 +293,11 @@
<string name="app_version_option_desc_1">Book\'s Story v%1$s</string> <string name="app_version_option_desc_1">Book\'s Story v%1$s</string>
<string name="app_version_option_desc_2">Натисніть, щоб перевірити на оновлення</string> <string name="app_version_option_desc_2">Натисніть, щоб перевірити на оновлення</string>
<string name="report_bug_option">Повідомити про помилку</string> <string name="report_bug_option">Повідомити про помилку</string>
<string name="project_page_option">Сторінка проєкта</string> <string name="whats_new_option">Що нового</string>
<string name="support_option">Підтримати мою роботу</string> <string name="support_option">Підтримати мою роботу</string>
<string name="licenses_option">Ліцензії з відкритим кодом</string> <string name="licenses_option">Ліцензії з відкритим кодом</string>
<string name="credits_option">Заслуги</string> <string name="credits_option">Заслуги</string>
<string name="slava_ukraini_option">Слава Україні!</string> <string name="slava_ukraini">Слава Україні!</string>
<string name="slava_ukraini_option_desc">Героям Слава! 🇺🇦🐉</string>
<!-- Credits --> <!-- Credits -->
<string name="credits_design">Дизайн</string> <string name="credits_design">Дизайн</string>
@ -485,5 +484,8 @@
<string name="reset_start_content_desc">Скинути початковий посібник</string> <string name="reset_start_content_desc">Скинути початковий посібник</string>
<string name="exit_editing_content_desc">Вийти з режиму редагування</string> <string name="exit_editing_content_desc">Вийти з режиму редагування</string>
<string name="open_in_web_content_desc">Відкрити в браузері</string> <string name="open_in_web_content_desc">Відкрити в браузері</string>
<string name="tryzub_content_desc">Тризуб</string>
<string name="github_project_content_desc">GitHub Проєкт</string>
<string name="github_profile_content_desc">GitHub Профіль</string>
</resources> </resources>

View file

@ -20,9 +20,6 @@
<string name="issues_page" translatable="false"> <string name="issues_page" translatable="false">
https://www.github.com/Acclorite/book-story/issues https://www.github.com/Acclorite/book-story/issues
</string> </string>
<string name="project_page" translatable="false">
https://www.github.com/Acclorite/book-story
</string>
<string name="support_page" translatable="false"> <string name="support_page" translatable="false">
https://www.buymeacoffee.com/acclorite https://www.buymeacoffee.com/acclorite
</string> </string>
@ -311,12 +308,11 @@
<string name="app_version_option_desc_1">Book\'s Story v%1$s</string> <string name="app_version_option_desc_1">Book\'s Story v%1$s</string>
<string name="app_version_option_desc_2">Click to check for updates</string> <string name="app_version_option_desc_2">Click to check for updates</string>
<string name="report_bug_option">Report a bug</string> <string name="report_bug_option">Report a bug</string>
<string name="project_page_option">Project\'s page</string> <string name="whats_new_option">What\'s new</string>
<string name="support_option">Support my work</string> <string name="support_option">Support my work</string>
<string name="licenses_option">Open source licenses</string> <string name="licenses_option">Open source licenses</string>
<string name="credits_option">Credits</string> <string name="credits_option">Credits</string>
<string name="slava_ukraini_option">Slava Ukraini!</string> <string name="slava_ukraini">Slava Ukraini!</string>
<string name="slava_ukraini_option_desc">Heroyam Slava! 🇺🇦🐉</string>
<!-- Credits --> <!-- Credits -->
<string name="credits_design">Design</string> <string name="credits_design">Design</string>
@ -504,5 +500,10 @@
<string name="reset_start_content_desc">Reset start guide</string> <string name="reset_start_content_desc">Reset start guide</string>
<string name="exit_editing_content_desc">Exit editing mode</string> <string name="exit_editing_content_desc">Exit editing mode</string>
<string name="open_in_web_content_desc">Open in web</string> <string name="open_in_web_content_desc">Open in web</string>
<string name="x_content_desc" translatable="false">X</string>
<string name="reddit_content_desc" translatable="false">Reddit</string>
<string name="tryzub_content_desc">Tryzub</string>
<string name="github_project_content_desc">GitHub Project</string>
<string name="github_profile_content_desc">GitHub Profile</string>
</resources> </resources>