Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -119,11 +119,10 @@ class AboutUtilInstrumentedTest {
*/
@Test
fun testGetCommunityList() {
println("Testing getCommunityList...")

var wikimediaClicked = false
var shareClicked = false
val context = InstrumentationRegistry.getInstrumentation().targetContext
var extractedItems: List<ScribeItem> = emptyList()

composeTestRule.setContent {
CompositionLocalProvider(LocalContext provides context) {
Expand All @@ -133,46 +132,31 @@ class AboutUtilInstrumentedTest {
onShareScribeClick = { shareClicked = true },
context = context,
)

// Test list is not empty.
assertThat(communityList.items).isNotEmpty()
assertThat(communityList.items).hasSize(3)

// Test each item has required fields.
communityList.items.forEach { item ->
assertThat(item).isInstanceOf(ScribeItem.ExternalLinkItem::class.java)
val linkItem = item as ScribeItem.ExternalLinkItem

assertThat(linkItem.leadingIcon).isNotNull()
assertThat(linkItem.title).isNotNull()
assertThat(linkItem.trailingIcon).isNotNull()
assertThat(linkItem.onClick).isNotNull()
}

// Test specific items.
val githubItem = communityList.items[0] as ScribeItem.ExternalLinkItem
assertThat(githubItem.leadingIcon).isEqualTo(R.drawable.github_logo)
assertThat(githubItem.title).isEqualTo(R.string.i18n_app_about_community_github)

val shareItem = communityList.items[1] as ScribeItem.ExternalLinkItem
assertThat(shareItem.leadingIcon).isEqualTo(R.drawable.share_icon)
assertThat(shareItem.title).isEqualTo(R.string.i18n_app_about_community_share_scribe)

val wikimediaItem = communityList.items[2] as ScribeItem.ExternalLinkItem
assertThat(wikimediaItem.leadingIcon).isEqualTo(R.drawable.wikimedia_logo_black)
assertThat(wikimediaItem.title).isEqualTo(R.string.i18n_app_about_community_wikimedia)

// Test onClick callbacks.
shareItem.onClick()
wikimediaItem.onClick()
extractedItems = communityList.items
}
}

// Verify callbacks were triggered.
composeTestRule.waitForIdle()
assertThat(extractedItems).hasSize(4)

val githubItem = extractedItems[0] as ScribeItem.ExternalLinkItem
val websiteItem = extractedItems[1] as ScribeItem.ExternalLinkItem
val shareItem = extractedItems[2] as ScribeItem.ExternalLinkItem
val wikimediaItem = extractedItems[3] as ScribeItem.ExternalLinkItem

assertThat(githubItem.leadingIcon).isEqualTo(R.drawable.github_logo)

assertThat(websiteItem.leadingIcon).isEqualTo(R.drawable.globe)
assertThat(websiteItem.title).isEqualTo(R.string.i18n_app_about_community_visit_website)

assertThat(shareItem.leadingIcon).isEqualTo(R.drawable.share_icon)
assertThat(wikimediaItem.leadingIcon).isEqualTo(R.drawable.wikimedia_logo_black)

shareItem.onClick()
wikimediaItem.onClick()

assertThat(shareClicked).isTrue()
assertThat(wikimediaClicked).isTrue()

println("getCommunityList test passed!")
}

/**
Expand All @@ -187,6 +171,7 @@ class AboutUtilInstrumentedTest {
var mailClicked = false
var resetHintsClicked = false
val context = InstrumentationRegistry.getInstrumentation().targetContext
var extractedItems: List<ScribeItem> = emptyList()

composeTestRule.setContent {
CompositionLocalProvider(LocalContext provides context) {
Expand All @@ -197,42 +182,46 @@ class AboutUtilInstrumentedTest {
onResetHintsClick = { resetHintsClicked = true },
context = context,
)

// Test list is not empty.
assertThat(feedbackList.items).isNotEmpty()
assertThat(feedbackList.items).hasSize(5)

// Test each item has required fields.
feedbackList.items.forEach { item ->
assertThat(item).isInstanceOf(ScribeItem.ExternalLinkItem::class.java)
val linkItem = item as ScribeItem.ExternalLinkItem

assertThat(linkItem.leadingIcon).isNotNull()
assertThat(linkItem.title).isNotNull()
assertThat(linkItem.trailingIcon).isNotNull()
assertThat(linkItem.onClick).isNotNull()
}

// Test specific items.
val rateItem = feedbackList.items[0] as ScribeItem.ExternalLinkItem
assertThat(rateItem.leadingIcon).isEqualTo(R.drawable.star)
assertThat(rateItem.title).isEqualTo(R.string.i18n_app_about_feedback_rate_scribe)

val mailItem = feedbackList.items[2] as ScribeItem.ExternalLinkItem
assertThat(mailItem.leadingIcon).isEqualTo(R.drawable.mail_icon)
assertThat(mailItem.title).isEqualTo(R.string.i18n_app_about_feedback_send_email)

val hintsItem = feedbackList.items[4] as ScribeItem.ExternalLinkItem
assertThat(hintsItem.leadingIcon).isEqualTo(R.drawable.light_bulb_icon)
assertThat(hintsItem.title).isEqualTo(R.string.i18n_app_about_feedback_reset_app_hints)

// Test onClick callbacks.
rateItem.onClick()
mailItem.onClick()
hintsItem.onClick()
extractedItems = feedbackList.items
}
}

// Wait for composition to settle
composeTestRule.waitForIdle()

// Test list is not empty.
assertThat(extractedItems).isNotEmpty()
assertThat(extractedItems).hasSize(5)

// Test each item has required fields.
extractedItems.forEach { item ->
assertThat(item).isInstanceOf(ScribeItem.ExternalLinkItem::class.java)
val linkItem = item as ScribeItem.ExternalLinkItem

assertThat(linkItem.leadingIcon).isNotNull()
assertThat(linkItem.title).isNotNull()
assertThat(linkItem.trailingIcon).isNotNull()
assertThat(linkItem.onClick).isNotNull()
}

// Test specific items.
val rateItem = extractedItems[0] as ScribeItem.ExternalLinkItem
assertThat(rateItem.leadingIcon).isEqualTo(R.drawable.star)
assertThat(rateItem.title).isEqualTo(R.string.i18n_app_about_feedback_rate_scribe)

val mailItem = extractedItems[2] as ScribeItem.ExternalLinkItem
assertThat(mailItem.leadingIcon).isEqualTo(R.drawable.mail_icon)
assertThat(mailItem.title).isEqualTo(R.string.i18n_app_about_feedback_send_email)

val hintsItem = extractedItems[4] as ScribeItem.ExternalLinkItem
assertThat(hintsItem.leadingIcon).isEqualTo(R.drawable.light_bulb_icon)
assertThat(hintsItem.title).isEqualTo(R.string.i18n_app_about_feedback_reset_app_hints)

// Test onClick callbacks OUTSIDE of setContent
rateItem.onClick()
mailItem.onClick()
hintsItem.onClick()

// Verify callbacks were triggered.
assertThat(rateClicked).isTrue()
assertThat(mailClicked).isTrue()
Expand All @@ -251,48 +240,48 @@ class AboutUtilInstrumentedTest {

var privacyPolicyClicked = false
var thirdPartyLicensesClicked = false
val context = InstrumentationRegistry.getInstrumentation().targetContext
var extractedItems: List<ScribeItem> = emptyList()

composeTestRule.setContent {
CompositionLocalProvider(LocalContext provides context) {
val legalList =
AboutUtil.getLegalListItems(
onPrivacyPolicyClick = { privacyPolicyClicked = true },
onThirdPartyLicensesClick = { thirdPartyLicensesClicked = true },
)
val legalList =
AboutUtil.getLegalListItems(
onPrivacyPolicyClick = { privacyPolicyClicked = true },
onThirdPartyLicensesClick = { thirdPartyLicensesClicked = true },
)
extractedItems = legalList.items
}

// Test list is not empty.
assertThat(legalList.items).isNotEmpty()
assertThat(legalList.items).hasSize(2)

// Test each item has required fields.
legalList.items.forEach { item ->
assertThat(item).isInstanceOf(ScribeItem.ExternalLinkItem::class.java)
val linkItem = item as ScribeItem.ExternalLinkItem

assertThat(linkItem.leadingIcon).isNotNull()
assertThat(linkItem.title).isNotNull()
assertThat(linkItem.trailingIcon).isNotNull()
assertThat(linkItem.onClick).isNotNull()
}

// Test specific items.
val privacyItem = legalList.items[0] as ScribeItem.ExternalLinkItem
assertThat(privacyItem.leadingIcon).isEqualTo(R.drawable.shield_lock)
assertThat(privacyItem.title).isEqualTo(R.string.i18n__global_privacy_policy)
assertThat(privacyItem.trailingIcon).isEqualTo(R.drawable.right_arrow)

val licenseItem = legalList.items[1] as ScribeItem.ExternalLinkItem
assertThat(licenseItem.leadingIcon).isEqualTo(R.drawable.license_icon)
assertThat(licenseItem.title).isEqualTo(R.string.i18n_app_about_legal_third_party)
assertThat(licenseItem.trailingIcon).isEqualTo(R.drawable.right_arrow)

// Test onClick callbacks.
privacyItem.onClick()
licenseItem.onClick()
}
composeTestRule.waitForIdle()

// Test list is not empty.
assertThat(extractedItems).isNotEmpty()
assertThat(extractedItems).hasSize(2)

// Test each item has required fields.
extractedItems.forEach { item ->
assertThat(item).isInstanceOf(ScribeItem.ExternalLinkItem::class.java)
val linkItem = item as ScribeItem.ExternalLinkItem

assertThat(linkItem.leadingIcon).isNotNull()
assertThat(linkItem.title).isNotNull()
assertThat(linkItem.trailingIcon).isNotNull()
assertThat(linkItem.onClick).isNotNull()
}

// Test specific items.
val privacyItem = extractedItems[0] as ScribeItem.ExternalLinkItem
assertThat(privacyItem.leadingIcon).isEqualTo(R.drawable.shield_lock)
assertThat(privacyItem.title).isEqualTo(R.string.i18n__global_privacy_policy)
assertThat(privacyItem.trailingIcon).isEqualTo(R.drawable.right_arrow)

val licenseItem = extractedItems[1] as ScribeItem.ExternalLinkItem
assertThat(licenseItem.leadingIcon).isEqualTo(R.drawable.license_icon)
assertThat(licenseItem.title).isEqualTo(R.string.i18n_app_about_legal_third_party)
assertThat(licenseItem.trailingIcon).isEqualTo(R.drawable.right_arrow)

privacyItem.onClick()
licenseItem.onClick()

// Verify callbacks were triggered.
assertThat(privacyPolicyClicked).isTrue()
assertThat(thirdPartyLicensesClicked).isTrue()
Expand Down
14 changes: 13 additions & 1 deletion app/src/main/java/be/scri/ui/screens/about/AboutUtil.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import android.content.Intent
import android.net.Uri
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.core.net.toUri
import be.scri.R
import be.scri.activities.MainActivity
import be.scri.helpers.ui.RatingHelper
Expand All @@ -23,6 +24,7 @@ object ExternalLinks {
const val GITHUB_RELEASES = "$GITHUB_SCRIBE/releases/"
const val MATRIX = "https://matrix.to/%23/%23scribe_community:matrix.org"
const val MASTODON = "https://wikis.world/@scribe"
const val SCRIBE_WEBSITE = "https://scri.be"
}

/**
Expand All @@ -45,7 +47,17 @@ fun buildCommunityList(
trailingIcon = R.drawable.external_link,
url = ExternalLinks.GITHUB_SCRIBE,
onClick = {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(ExternalLinks.GITHUB_SCRIBE))
val intent = Intent(Intent.ACTION_VIEW, ExternalLinks.GITHUB_SCRIBE.toUri())
context.startActivity(intent)
},
),
ScribeItem.ExternalLinkItem(
leadingIcon = R.drawable.globe,
title = R.string.i18n_app_about_community_visit_website,
trailingIcon = R.drawable.external_link,
url = ExternalLinks.SCRIBE_WEBSITE,
onClick = {
val intent = Intent(Intent.ACTION_VIEW, ExternalLinks.SCRIBE_WEBSITE.toUri())
context.startActivity(intent)
},
),
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/res/values-ar/string.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
<string name="i18n.app.about.community.share_conjugate">شارك تصريف Scribe</string>
<string name="i18n.app.about.community.share_scribe">شارك Scribe</string>
<string name="i18n.app.about.community.title">المجتمع</string>
<string name="i18n.app.about.community.view_apps">عرض جميع تطبيقات Scribe</string>
<string name="i18n.app.about.community.visit_website">قم بزيارة موقع Scribe الإلكتروني</string>
<string name="i18n.app.about.community.wikimedia">ويكيميديا و Scribe</string>
<string name="i18n.app.about.community.wikimedia.caption">كيف نعمل معًا</string>
<string name="i18n.app.about.community.wikimedia.text_1">لن يكون Scribe ممكنًا بدون مساهمات لا حصر لها من مساهمي ويكيميديا في العديد من المشاريع التي يدعمونها. على وجه التحديد، يستخدم Scribe بيانات من مجتمع بيانات ويكيدا المعجمية، بالإضافة إلى بيانات من ويكيبديا لكل لغة يدعمها Scribe.</string>
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/res/values-bn/string.xml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
<string name="i18n.app.about.community.share_conjugate">Scribe Conjugate শেয়ার করুন</string>
<string name="i18n.app.about.community.share_scribe">Scribe শেয়ার করুন</string>
<string name="i18n.app.about.community.title">সম্প্রদায়</string>
<string name="i18n.app.about.community.view_apps">সব Scribe অ্যাপ গুলো দেখুন</string>
<string name="i18n.app.about.community.visit_website">Scribe ওয়েবসাইটটি দেখুন</string>
<string name="i18n.app.about.community.wikimedia">Wikimedia এবং Scribe</string>
<string name="i18n.app.about.community.wikimedia.caption">আমরা কিভাবে একসাথে কাজ করি</string>
<string name="i18n.app.about.community.wikimedia.text_1">Scribe সম্ভব হত না যদি না বহু Wikimedia সহযোগীর অবদান এবং তাদের সমর্থিত প্রকল্পগুলো না থাকত। বিশেষ করে Scribe, Wikidata এর লেক্সিকোগ্রাফিক্যাল তথ্যের ব্যবহার করে এবং Scribe দ্বারা সমর্থিত প্রতিটি ভাষার জন্য Wikipedia এর তথ্য ব্যবহার করে।</string>
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/res/values-de/string.xml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
<string name="i18n.app.about.community.share_conjugate">Scribe Conjugate teilen</string>
<string name="i18n.app.about.community.share_scribe">Scribe teilen</string>
<string name="i18n.app.about.community.title">Community</string>
<string name="i18n.app.about.community.view_apps">Alle Scribe Apps anzeigen</string>
<string name="i18n.app.about.community.visit_website">Besuchen Sie die Scribe-Website</string>
<string name="i18n.app.about.community.wikimedia">Wikimedia und Scribe</string>
<string name="i18n.app.about.community.wikimedia.caption">Wie wir zusammenarbeiten</string>
<string name="i18n.app.about.community.wikimedia.text_1">Scribe wäre ohne die etlichen Mitwirkungen von Wikimedia Mitwirkenden, den Projekten, die sie unterstützen, gegenüber, nicht möglich. Scribe benutzt Daten der Lexikografischen Datencommunity in Wikidata, sowie solche von Wikipedia für jede von Scribe unterstützte Sprache.</string>
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/res/values-es/string.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
<string name="i18n.app.about.community.share_conjugate">Compartir Scribe Conjugate</string>
<string name="i18n.app.about.community.share_scribe">Compartir Scribe</string>
<string name="i18n.app.about.community.title">Comunidad</string>
<string name="i18n.app.about.community.view_apps">Ver todas las aplicaciones de Scribe</string>
<string name="i18n.app.about.community.visit_website">Visita el sitio web de Scribe</string>
<string name="i18n.app.about.community.wikimedia">Wikimedia y Scribe</string>
<string name="i18n.app.about.community.wikimedia.caption">¿Cómo funcionan juntos?</string>
<string name="i18n.app.about.community.wikimedia.text_1">Scribe no sería posible sin las innumerables contribuciones de los colaboradores de Wikimedia a los numerosos proyectos que apoya. Scribe utiliza datos de la comunidad de datos lexicográficos de Wikidata, así como datos de Wikipedia para cada idioma que Scribe admite.</string>
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/res/values-fr/string.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
<string name="i18n.app.about.community.share_conjugate">Partager Scribe Conjugaison</string>
<string name="i18n.app.about.community.share_scribe">Partager Scribe</string>
<string name="i18n.app.about.community.title">Communauté</string>
<string name="i18n.app.about.community.view_apps">Voir toutes les applications Scribe</string>
<string name="i18n.app.about.community.visit_website">Visitez le site web de Scribe</string>
<string name="i18n.app.about.community.wikimedia">Wikimedia et Scribe</string>
<string name="i18n.app.about.community.wikimedia.caption">Comment nous travaillons ensemble</string>
<string name="i18n.app.about.community.wikimedia.text_1">Scribe ne pourrait pas exister sans les nombreuses contributions des contributeurs de Wikimedia aux nombreux projets qu\'ils soutiennent. Scribe utilise les données de la communauté de données lexicographiques Wikidata, ainsi que les données de Wikipédia pour chaque langue prise en charge par Scribe.</string>
Expand Down
Loading
Loading