Skip to content
Open
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 @@ -38,7 +38,12 @@ class AppLanguageSelectionViewModel @Inject constructor(
): List<AppLanguageItemViewModel> {
return when (asyncResultAppLanguageListData) {
is AsyncResult.Success -> {
asyncResultAppLanguageListData.value.map {
val sortedLanguages = asyncResultAppLanguageListData.value.sortedWith(
compareBy<OppiaLanguage> { it != OppiaLanguage.ENGLISH }
.thenBy { appLanguageResourceHandler.computeLocalizedDisplayName(it) }
)

sortedLanguages.map {
AppLanguageItemViewModel(
it,
appLanguageResourceHandler.computeLocalizedDisplayName(it),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,12 @@ class AudioLanguageSelectionViewModel @Inject constructor(

/** The list of [AudioLanguageItemViewModel]s which can be bound to a recycler view. */
val recyclerViewAudioLanguageList: List<AudioLanguageItemViewModel> by lazy {
AudioLanguage.values().filter { it !in IGNORED_AUDIO_LANGUAGES }.map(::createItemViewModel)
val languages = AudioLanguage.values().filter { it !in IGNORED_AUDIO_LANGUAGES }
val sortedLanguages = languages.sortedWith(
compareBy<AudioLanguage> { it != AudioLanguage.ENGLISH_AUDIO_LANGUAGE }
.thenBy { appLanguageResourceHandler.computeLocalizedDisplayName(it) }
)
sortedLanguages.map(::createItemViewModel)
}

/** Sets the list of audio languages supported by the app based on [OppiaLanguage]. */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@ import android.content.Context
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.recyclerview.widget.RecyclerView
import androidx.test.core.app.ActivityScenario.launch
import androidx.test.core.app.ApplicationProvider
import androidx.test.espresso.Espresso.onData
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.contrib.RecyclerViewActions.scrollToPosition
import androidx.test.espresso.matcher.RootMatchers.withDecorView
import androidx.test.espresso.matcher.ViewMatchers
import androidx.test.espresso.matcher.ViewMatchers.isChecked
Expand Down Expand Up @@ -123,8 +125,8 @@ import javax.inject.Singleton
class AppLanguageFragmentTest {

private companion object {
private const val ENGLISH_BUTTON_INDEX = 1
private const val KISWAHILI_BUTTON_INDEX = 4
private const val ENGLISH_BUTTON_INDEX = 0
private const val KISWAHILI_BUTTON_INDEX = 1
private const val PORTUGUESE_BUTTON_INDEX = 3

private val BRAZIL_PORTUGUESE_LOCALE = Locale("pt", "BR")
Expand Down Expand Up @@ -239,6 +241,74 @@ class AppLanguageFragmentTest {
}
}

@Test
fun testAppLanguage_englishIsFirstThenAlphabetical() {
setUpTestWithOnboardingV2Disabled()
launch<AppLanguageActivity>(createAppLanguageActivityIntent(OppiaLanguage.ENGLISH)).use {
testCoroutineDispatchers.runCurrent()

onView(withId(R.id.language_recycler_view))
.perform(scrollToPosition<RecyclerView.ViewHolder>(0))
onView(
atPositionOnView(
recyclerViewId = R.id.language_recycler_view,
position = 0,
targetViewId = R.id.language_text_view
)
).check(matches(withText("English")))

onView(withId(R.id.language_recycler_view))
.perform(scrollToPosition<RecyclerView.ViewHolder>(1))
onView(
atPositionOnView(
recyclerViewId = R.id.language_recycler_view,
position = 1,
targetViewId = R.id.language_text_view
)
).check(matches(withText("Kiswahili")))

onView(withId(R.id.language_recycler_view))
.perform(scrollToPosition<RecyclerView.ViewHolder>(2))
onView(
atPositionOnView(
recyclerViewId = R.id.language_recycler_view,
position = 2,
targetViewId = R.id.language_text_view
)
).check(matches(withText("Naijá")))

onView(withId(R.id.language_recycler_view))
.perform(scrollToPosition<RecyclerView.ViewHolder>(3))
onView(
atPositionOnView(
recyclerViewId = R.id.language_recycler_view,
position = 3,
targetViewId = R.id.language_text_view
)
).check(matches(withText("Português")))

onView(withId(R.id.language_recycler_view))
.perform(scrollToPosition<RecyclerView.ViewHolder>(4))
onView(
atPositionOnView(
recyclerViewId = R.id.language_recycler_view,
position = 4,
targetViewId = R.id.language_text_view
)
).check(matches(withText("العربية")))

onView(withId(R.id.language_recycler_view))
.perform(scrollToPosition<RecyclerView.ViewHolder>(5))
onView(
atPositionOnView(
recyclerViewId = R.id.language_recycler_view,
position = 5,
targetViewId = R.id.language_text_view
)
).check(matches(withText("हिन्दी")))
}
}

@Test
fun testFragment_fragmentLoaded_verifyCorrectArgumentsPassed() {
setUpTestWithOnboardingV2Disabled()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package org.oppia.android.app.options
import android.app.Application
import android.content.Context
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.RecyclerView
import androidx.test.core.app.ActivityScenario
import androidx.test.core.app.ActivityScenario.launch
import androidx.test.core.app.ApplicationProvider
Expand All @@ -12,6 +13,7 @@ import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.action.ViewActions.pressBack
import androidx.test.espresso.assertion.ViewAssertions.doesNotExist
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.contrib.RecyclerViewActions.scrollToPosition
import androidx.test.espresso.intent.Intents
import androidx.test.espresso.intent.Intents.intended
import androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent
Expand Down Expand Up @@ -133,8 +135,8 @@ import javax.inject.Singleton
class AudioLanguageFragmentTest {
private companion object {
private const val ENGLISH_BUTTON_INDEX = 0
private const val NIGERIAN_PIDGIN_BUTTON_INDEX = 1
private const val PORTUGUESE_BUTTON_INDEX = 2
private const val NIGERIAN_PIDGIN_BUTTON_INDEX = 4
}

@get:Rule
Expand Down Expand Up @@ -247,6 +249,64 @@ class AudioLanguageFragmentTest {
}
}

@Test
fun testAudioLanguage_englishIsFirstThenAlphabetical() {
initializeTestApplicationComponent(enableOnboardingFlowV2 = false)
launchActivityWithLanguage(ENGLISH_AUDIO_LANGUAGE).use {
testCoroutineDispatchers.runCurrent()

onView(withId(R.id.audio_language_recycler_view))
.perform(scrollToPosition<RecyclerView.ViewHolder>(0))
onView(
atPositionOnView(
recyclerViewId = R.id.audio_language_recycler_view,
position = 0,
targetViewId = R.id.language_text_view
)
).check(matches(withText("English")))

onView(withId(R.id.audio_language_recycler_view))
.perform(scrollToPosition<RecyclerView.ViewHolder>(1))
onView(
atPositionOnView(
recyclerViewId = R.id.audio_language_recycler_view,
position = 1,
targetViewId = R.id.language_text_view
)
).check(matches(withText("Naijá")))

onView(withId(R.id.audio_language_recycler_view))
.perform(scrollToPosition<RecyclerView.ViewHolder>(2))
onView(
atPositionOnView(
recyclerViewId = R.id.audio_language_recycler_view,
position = 2,
targetViewId = R.id.language_text_view
)
).check(matches(withText("Português")))

onView(withId(R.id.audio_language_recycler_view))
.perform(scrollToPosition<RecyclerView.ViewHolder>(3))
onView(
atPositionOnView(
recyclerViewId = R.id.audio_language_recycler_view,
position = 3,
targetViewId = R.id.language_text_view
)
).check(matches(withText("العربية")))

onView(withId(R.id.audio_language_recycler_view))
.perform(scrollToPosition<RecyclerView.ViewHolder>(4))
onView(
atPositionOnView(
recyclerViewId = R.id.audio_language_recycler_view,
position = 4,
targetViewId = R.id.language_text_view
)
).check(matches(withText("हिन्दी")))
}
}

@Test
fun testAudioLanguage_onboardingV2Enabled_allViewsAreDisplayed() {
launchV2FlowWithLanguage(ENGLISH_AUDIO_LANGUAGE, LEARNER_INTRO_SCREEN).use {
Expand Down
Loading