From 242fef45634ae1b54703d9357230fcadc95a24d4 Mon Sep 17 00:00:00 2001
From: Ayush Yadav <143514610+theayushyadav11@users.noreply.github.com>
Date: Tue, 3 Dec 2024 07:00:32 +0530
Subject: [PATCH] Fixes #4294 : Added Profile delete message with AlertDialog
(#5577)
Fixes #4294 : This pull request introduces a new feature to notify users
when a profile is successfully deleted. It includes the creation of a
new dialog fragment, updates to existing fragments to integrate this new
feature, and necessary string resources.
### New Feature Implementation:
*
[`app/src/main/java/org/oppia/android/app/settings/profile/ProfileDeleteSuccessDialogFragment.kt`](diffhunk://#diff-2203d0609a904e5e457efadd299665f9c28d3f8bb4f8ef9d3479d872cd80a246R1-R62):
Created a new `DeleteProfileSuccessDialogFragment` class to notify users
after a profile is successfully deleted.
### Integration with Existing Components:
*
[`app/src/main/java/org/oppia/android/app/fragment/FragmentComponentImpl.kt`](diffhunk://#diff-9de2bd314b90b27a64b5f0198a1e117d1401aca4c3bf6d41efdf0c0927d39b3cR66):
Added import and injection for `DeleteProfileSuccessDialogFragment`.
[[1]](diffhunk://#diff-9de2bd314b90b27a64b5f0198a1e117d1401aca4c3bf6d41efdf0c0927d39b3cR66)
[[2]](diffhunk://#diff-9de2bd314b90b27a64b5f0198a1e117d1401aca4c3bf6d41efdf0c0927d39b3cR132)
*
[`app/src/main/java/org/oppia/android/app/settings/profile/ProfileEditFragmentPresenter.kt`](diffhunk://#diff-12a41502c6dc988ca4dee178dfe871257b0be385b3453ed5aaef6bf16611c90fL154-R157):
Updated to show the new `DeleteProfileSuccessDialogFragment` upon
successful profile deletion.
### String Resources:
*
[`app/src/main/res/values/strings.xml`](diffhunk://#diff-5e01f7d37a66e4ca03deefc205d8e7008661cdd0284a05aaba1858e6b7bf9103R348):
Added a new string resource for the profile deletion success message.
### Test File Exemptions:
*
[`scripts/assets/test_file_exemptions.textproto`](diffhunk://#diff-6ed782dd71126d847e7bac39eca30f830be55b72aa10b7e944612f2463003e24R2093-R2096):
Added an exemption for the new `ProfileDeleteSuccessDialogFragment`.
### Video Demo
https://github.com/user-attachments/assets/d3a71f37-b6e5-43cb-b411-76af5f56042b
### Video Demo on Tablet
https://github.com/user-attachments/assets/04c0912e-3dd2-45c8-bc3b-0025887394da
## Essential Checklist
- [x] The PR title and explanation each start with "Fix #bugnum: " (If
this PR fixes part of an issue, prefix the title with "Fix part of
#bugnum: ...".)
- [x] Any changes to
[scripts/assets](https://github.com/oppia/oppia-android/tree/develop/scripts/assets)
files have their rationale included in the PR explanation.
- [x] The PR follows the [style
guide](https://github.com/oppia/oppia-android/wiki/Coding-style-guide).
- [x] The PR does not contain any unnecessary code changes from Android
Studio
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#undo-unnecessary-changes)).
- [x] The PR is made from a branch that's **not** called "develop" and
is up-to-date with "develop".
- [x] The PR is **assigned** to the appropriate reviewers
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#clarification-regarding-assignees-and-reviewers-section)).
---------
Co-authored-by: Adhiambo Peres <59600948+adhiamboperes@users.noreply.github.com>
---
.../app/fragment/FragmentComponentImpl.kt | 2 +
.../ProfileDeleteSuccessDialogFragment.kt | 61 +++++
.../profile/ProfileEditFragmentPresenter.kt | 17 +-
app/src/main/res/values/strings.xml | 2 +
.../profile/ProfileEditActivityTest.kt | 8 +
.../profile/ProfileEditFragmentTest.kt | 231 ++++++++++--------
scripts/assets/test_file_exemptions.textproto | 4 +
7 files changed, 216 insertions(+), 109 deletions(-)
create mode 100644 app/src/main/java/org/oppia/android/app/settings/profile/ProfileDeleteSuccessDialogFragment.kt
diff --git a/app/src/main/java/org/oppia/android/app/fragment/FragmentComponentImpl.kt b/app/src/main/java/org/oppia/android/app/fragment/FragmentComponentImpl.kt
index 9a861937346..cab45a1b1b6 100644
--- a/app/src/main/java/org/oppia/android/app/fragment/FragmentComponentImpl.kt
+++ b/app/src/main/java/org/oppia/android/app/fragment/FragmentComponentImpl.kt
@@ -63,6 +63,7 @@ import org.oppia.android.app.profile.ResetPinDialogFragment
import org.oppia.android.app.profileprogress.ProfilePictureEditDialogFragment
import org.oppia.android.app.profileprogress.ProfileProgressFragment
import org.oppia.android.app.resumelesson.ResumeLessonFragment
+import org.oppia.android.app.settings.profile.ProfileDeleteSuccessDialogFragment
import org.oppia.android.app.settings.profile.ProfileEditDeletionDialogFragment
import org.oppia.android.app.settings.profile.ProfileEditFragment
import org.oppia.android.app.settings.profile.ProfileListFragment
@@ -128,6 +129,7 @@ interface FragmentComponentImpl : FragmentComponent, ViewComponentBuilderInjecto
fun inject(cellularAudioDialogFragment: CellularAudioDialogFragment)
fun inject(completedStoryListFragment: CompletedStoryListFragment)
fun inject(conceptCardFragment: ConceptCardFragment)
+ fun inject(profileDeleteSuccessDialogFragment: ProfileDeleteSuccessDialogFragment)
fun inject(developerOptionsFragment: DeveloperOptionsFragment)
fun inject(downloadsTabFragment: DownloadsTabFragment)
fun inject(dragDropTestFragment: DragDropTestFragment)
diff --git a/app/src/main/java/org/oppia/android/app/settings/profile/ProfileDeleteSuccessDialogFragment.kt b/app/src/main/java/org/oppia/android/app/settings/profile/ProfileDeleteSuccessDialogFragment.kt
new file mode 100644
index 00000000000..cf8aa01e941
--- /dev/null
+++ b/app/src/main/java/org/oppia/android/app/settings/profile/ProfileDeleteSuccessDialogFragment.kt
@@ -0,0 +1,61 @@
+package org.oppia.android.app.settings.profile
+
+import android.app.Dialog
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import androidx.appcompat.app.AlertDialog
+import androidx.fragment.app.DialogFragment
+import org.oppia.android.R
+import org.oppia.android.app.administratorcontrols.AdministratorControlsActivity
+import org.oppia.android.app.fragment.FragmentComponentImpl
+import org.oppia.android.app.fragment.InjectableDialogFragment
+import org.oppia.android.app.translation.AppLanguageResourceHandler
+import javax.inject.Inject
+
+/** [DialogFragment] that notifies the user after a profile is successfully deleted. */
+class ProfileDeleteSuccessDialogFragment : InjectableDialogFragment() {
+ @Inject
+ lateinit var resourceHandler: AppLanguageResourceHandler
+
+ companion object {
+ /** Tag for [ProfileDeleteSuccessDialogFragment]. */
+ const val DELETE_PROFILE_SUCCESS_DIALOG_FRAGMENT_TAG = "DELETE_PROFILE_SUCCESS_DIALOG_FRAGMENT"
+
+ /** Returns a new instance of [ProfileDeleteSuccessDialogFragment]. */
+ fun createNewInstance(): ProfileDeleteSuccessDialogFragment =
+ ProfileDeleteSuccessDialogFragment()
+ }
+
+ override fun onAttach(context: Context) {
+ super.onAttach(context)
+ (fragmentComponent as FragmentComponentImpl).inject(this)
+ }
+
+ override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+ val alertDialog =
+ AlertDialog
+ .Builder(requireContext(), R.style.OppiaAlertDialogTheme)
+ .apply {
+ setMessage(
+ resourceHandler.getStringInLocale(R.string.profile_edit_delete_successful_message),
+ )
+ setPositiveButton(
+ resourceHandler
+ .getStringInLocale(R.string.profile_edit_delete_success_dialog_positive_button),
+ ) { _, _ ->
+ if (requireContext().resources.getBoolean(R.bool.isTablet)) {
+ val intent = Intent(requireContext(), AdministratorControlsActivity::class.java)
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
+ startActivity(intent)
+ } else {
+ val intent = Intent(requireContext(), ProfileListActivity::class.java)
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
+ startActivity(intent)
+ }
+ }
+ }.create()
+ alertDialog.setCanceledOnTouchOutside(true)
+ return alertDialog
+ }
+}
diff --git a/app/src/main/java/org/oppia/android/app/settings/profile/ProfileEditFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/settings/profile/ProfileEditFragmentPresenter.kt
index c5df7aa5439..6b3cd984335 100644
--- a/app/src/main/java/org/oppia/android/app/settings/profile/ProfileEditFragmentPresenter.kt
+++ b/app/src/main/java/org/oppia/android/app/settings/profile/ProfileEditFragmentPresenter.kt
@@ -1,13 +1,11 @@
package org.oppia.android.app.settings.profile
-import android.content.Intent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
-import org.oppia.android.R
import org.oppia.android.app.administratorcontrols.AdministratorControlsActivity
import org.oppia.android.app.administratorcontrols.ProfileEditDeletionDialogListener
import org.oppia.android.app.devoptions.markchapterscompleted.MarkChaptersCompletedActivity
@@ -151,16 +149,11 @@ class ProfileEditFragmentPresenter @Inject constructor(
fragment,
Observer {
if (it is AsyncResult.Success) {
- if (fragment.requireContext().resources.getBoolean(R.bool.isTablet)) {
- val intent =
- Intent(fragment.requireContext(), AdministratorControlsActivity::class.java)
- intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
- fragment.startActivity(intent)
- } else {
- val intent = Intent(fragment.requireContext(), ProfileListActivity::class.java)
- intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
- fragment.startActivity(intent)
- }
+ ProfileDeleteSuccessDialogFragment.createNewInstance()
+ .showNow(
+ fragment.childFragmentManager,
+ ProfileDeleteSuccessDialogFragment.DELETE_PROFILE_SUCCESS_DIALOG_FRAGMENT_TAG
+ )
}
}
)
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 0c43c5e2c26..48ed440dcf6 100755
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -347,7 +347,9 @@
All progress will be deleted and cannot be recovered.
Delete
Cancel
+ Profile deleted successfully.
Allow Download Access
+ OK
User is able to download and delete content without Administrator password
Profile Picture
diff --git a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileEditActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileEditActivityTest.kt
index d63a296f378..59751b29705 100644
--- a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileEditActivityTest.kt
+++ b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileEditActivityTest.kt
@@ -244,6 +244,10 @@ class ProfileEditActivityTest {
.inRoot(isDialog())
.perform(click())
testCoroutineDispatchers.runCurrent()
+ onView(withText(R.string.profile_edit_delete_success_dialog_positive_button))
+ .inRoot(isDialog())
+ .perform(click())
+ testCoroutineDispatchers.runCurrent()
if (context.resources.getBoolean(R.bool.isTablet)) {
intended(hasComponent(AdministratorControlsActivity::class.java.name))
} else {
@@ -266,6 +270,10 @@ class ProfileEditActivityTest {
.inRoot(isDialog())
.perform(click())
testCoroutineDispatchers.runCurrent()
+ onView(withText(R.string.profile_edit_delete_success_dialog_positive_button))
+ .inRoot(isDialog())
+ .perform(click())
+ testCoroutineDispatchers.runCurrent()
if (context.resources.getBoolean(R.bool.isTablet)) {
intended(hasComponent(AdministratorControlsActivity::class.java.name))
} else {
diff --git a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileEditFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileEditFragmentTest.kt
index b6ae6b60b22..326627850b7 100644
--- a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileEditFragmentTest.kt
+++ b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileEditFragmentTest.kt
@@ -125,7 +125,6 @@ import javax.inject.Singleton
@LooperMode(LooperMode.Mode.PAUSED)
@Config(application = ProfileEditFragmentTest.TestApplication::class, qualifiers = "port-xxhdpi")
class ProfileEditFragmentTest {
-
@get:Rule
val initializeDefaultLocaleRule = InitializeDefaultLocaleRule()
@@ -167,49 +166,68 @@ class ProfileEditFragmentTest {
}
@Test
- fun testProfileEdit_startWithUserProfile_clickProfileDeletionButton_checkOpensDeletionDialog() {
+ fun testProfileEdit_clickProfileDeletion_checkOpensDeletionDialog_checkOpensSuccessDialog() {
launchFragmentTestActivity(internalProfileId = 1).use {
onView(withId(R.id.profile_delete_button)).perform(click())
onView(withText(R.string.profile_edit_delete_dialog_message))
- .inRoot(isDialog()).check(matches(isDisplayed()))
+ .inRoot(isDialog())
+ .check(matches(isDisplayed()))
+ onView(withText(R.string.profile_edit_delete_dialog_positive)).perform(click())
+ testCoroutineDispatchers.runCurrent()
+ onView(withText(R.string.profile_edit_delete_successful_message))
+ .inRoot(isDialog())
+ .check(matches(isCompletelyDisplayed()))
}
}
@Test
@Config(qualifiers = "land")
- fun testProfileEdit_configChange_startWithUserProfile_clickDelete_checkOpensDeletionDialog() {
+ fun testProfileEdit_configChange_clickDelete_checkOpensDeletionDialog_checkOpensSuccessDialog() {
launchFragmentTestActivity(internalProfileId = 1).use {
onView(isRoot()).perform(orientationLandscape())
onView(withId(R.id.profile_delete_button)).perform(scrollTo()).perform(click())
testCoroutineDispatchers.runCurrent()
onView(withText(R.string.profile_edit_delete_dialog_message))
- .inRoot(isDialog()).check(matches(isDisplayed()))
+ .inRoot(isDialog())
+ .check(matches(isDisplayed()))
+ onView(withText(R.string.profile_edit_delete_dialog_positive)).perform(click())
+ testCoroutineDispatchers.runCurrent()
+ onView(withText(R.string.profile_edit_delete_successful_message))
+ .inRoot(isDialog())
+ .check(matches(isDisplayed()))
}
}
@Test
@Config(qualifiers = "land")
- fun testProfileEdit_startWithUserProfile_clickDelete_configChange_checkDeletionDialogIsVisible() {
+ fun testProfileEdit_clickDelete_landscapeMode_checkOpensDeletionDialog() {
launchFragmentTestActivity(internalProfileId = 1).use {
onView(withId(R.id.profile_delete_button)).perform(scrollTo()).perform(click())
onView(isRoot()).perform(orientationLandscape())
testCoroutineDispatchers.runCurrent()
onView(withText(R.string.profile_edit_delete_dialog_message))
- .inRoot(isDialog()).check(matches(isCompletelyDisplayed()))
+ .inRoot(isDialog())
+ .check(matches(isDisplayed()))
+ onView(withText(R.string.profile_edit_delete_dialog_positive)).perform(click())
+ testCoroutineDispatchers.runCurrent()
+ onView(withText(R.string.profile_edit_delete_successful_message))
+ .inRoot(isDialog())
+ .check(matches(isCompletelyDisplayed()))
}
}
@Test
fun testProfileEdit_startWithUserHasDownloadAccess_downloadsDisabled_switchIsNotDisplayed() {
TestPlatformParameterModule.forceEnableDownloadsSupport(false)
- profileManagementController.addProfile(
- name = "James",
- pin = "123",
- avatarImagePath = null,
- allowDownloadAccess = true,
- colorRgb = -10710042,
- isAdmin = false
- ).toLiveData()
+ profileManagementController
+ .addProfile(
+ name = "James",
+ pin = "123",
+ avatarImagePath = null,
+ allowDownloadAccess = true,
+ colorRgb = -10710042,
+ isAdmin = false,
+ ).toLiveData()
launchFragmentTestActivity(internalProfileId = 4).use {
onView(withId(R.id.profile_edit_allow_download_container)).check(matches(not(isDisplayed())))
}
@@ -226,14 +244,15 @@ class ProfileEditFragmentTest {
@Test
fun testProfileEdit_startWithUserHasDownloadAccess_downloadsEnabled_checkSwitchIsChecked() {
TestPlatformParameterModule.forceEnableDownloadsSupport(true)
- profileManagementController.addProfile(
- name = "James",
- pin = "123",
- avatarImagePath = null,
- allowDownloadAccess = true,
- colorRgb = -10710042,
- isAdmin = false
- ).toLiveData()
+ profileManagementController
+ .addProfile(
+ name = "James",
+ pin = "123",
+ avatarImagePath = null,
+ allowDownloadAccess = true,
+ colorRgb = -10710042,
+ isAdmin = false,
+ ).toLiveData()
launchFragmentTestActivity(internalProfileId = 4).use {
onView(withId(R.id.profile_edit_allow_download_switch)).check(matches(isChecked()))
}
@@ -243,14 +262,15 @@ class ProfileEditFragmentTest {
@Config(qualifiers = "land")
fun testProfileEdit_configChange_userHasDownloadAccess_downloadsEnabled_checkSwitchIsChecked() {
TestPlatformParameterModule.forceEnableDownloadsSupport(true)
- val addProfileProvider = profileManagementController.addProfile(
- name = "James",
- pin = "123",
- avatarImagePath = null,
- allowDownloadAccess = true,
- colorRgb = -10710042,
- isAdmin = false
- )
+ val addProfileProvider =
+ profileManagementController.addProfile(
+ name = "James",
+ pin = "123",
+ avatarImagePath = null,
+ allowDownloadAccess = true,
+ colorRgb = -10710042,
+ isAdmin = false,
+ )
monitorFactory.waitForNextSuccessfulResult(addProfileProvider)
launchFragmentTestActivity(internalProfileId = 4).use {
onView(isRoot()).perform(orientationLandscape())
@@ -261,14 +281,15 @@ class ProfileEditFragmentTest {
@Test
fun testProfileEdit_userHasDownloadAccess_downloadsEnabled_clickAllowDownloads_checkChanged() {
TestPlatformParameterModule.forceEnableDownloadsSupport(true)
- profileManagementController.addProfile(
- name = "James",
- pin = "123",
- avatarImagePath = null,
- allowDownloadAccess = true,
- colorRgb = -10710042,
- isAdmin = false
- ).toLiveData()
+ profileManagementController
+ .addProfile(
+ name = "James",
+ pin = "123",
+ avatarImagePath = null,
+ allowDownloadAccess = true,
+ colorRgb = -10710042,
+ isAdmin = false,
+ ).toLiveData()
launchFragmentTestActivity(internalProfileId = 4).use {
onView(withId(R.id.profile_edit_allow_download_switch)).check(matches(isChecked()))
onView(withId(R.id.profile_edit_allow_download_container)).perform(click())
@@ -279,14 +300,15 @@ class ProfileEditFragmentTest {
@Test
fun testProfileEdit_userDoesNotHaveDownloadAccess_downloadsEnabled_switchIsNotClickable() {
TestPlatformParameterModule.forceEnableDownloadsSupport(true)
- profileManagementController.addProfile(
- name = "James",
- pin = "123",
- avatarImagePath = null,
- allowDownloadAccess = false,
- colorRgb = -10710042,
- isAdmin = false
- ).toLiveData()
+ profileManagementController
+ .addProfile(
+ name = "James",
+ pin = "123",
+ avatarImagePath = null,
+ allowDownloadAccess = false,
+ colorRgb = -10710042,
+ isAdmin = false,
+ ).toLiveData()
launchFragmentTestActivity(internalProfileId = 4).use {
onView(withId(R.id.profile_edit_allow_download_switch)).check(matches(not(isClickable())))
}
@@ -295,14 +317,15 @@ class ProfileEditFragmentTest {
@Test
fun testProfileEdit_userHasDownloadAccess_downloadsEnabled_switchContainerIsFocusable() {
TestPlatformParameterModule.forceEnableDownloadsSupport(true)
- profileManagementController.addProfile(
- name = "James",
- pin = "123",
- avatarImagePath = null,
- allowDownloadAccess = true,
- colorRgb = -10710042,
- isAdmin = false
- ).toLiveData()
+ profileManagementController
+ .addProfile(
+ name = "James",
+ pin = "123",
+ avatarImagePath = null,
+ allowDownloadAccess = true,
+ colorRgb = -10710042,
+ isAdmin = false,
+ ).toLiveData()
launchFragmentTestActivity(internalProfileId = 4).use {
onView(withId(R.id.profile_edit_allow_download_container)).check(matches(isFocusable()))
}
@@ -311,14 +334,15 @@ class ProfileEditFragmentTest {
@Test
fun testProfileEdit_startWithUserHasDownloadAccess_downloadsEnabled_switchContainerIsDisplayed() {
TestPlatformParameterModule.forceEnableDownloadsSupport(true)
- profileManagementController.addProfile(
- name = "James",
- pin = "123",
- avatarImagePath = null,
- allowDownloadAccess = true,
- colorRgb = -10710042,
- isAdmin = false
- ).toLiveData()
+ profileManagementController
+ .addProfile(
+ name = "James",
+ pin = "123",
+ avatarImagePath = null,
+ allowDownloadAccess = true,
+ colorRgb = -10710042,
+ isAdmin = false,
+ ).toLiveData()
launchFragmentTestActivity(internalProfileId = 4).use {
onView(withId(R.id.profile_edit_allow_download_container)).check(matches(isDisplayed()))
}
@@ -365,11 +389,13 @@ class ProfileEditFragmentTest {
launchFragmentTestActivity(internalProfileId = 0).use {
onView(withId(R.id.profile_mark_chapters_for_completion_button)).perform(click())
- val args = MarkChaptersCompletedActivityParams.newBuilder().apply {
- this.internalProfileId = 0
- this.showConfirmationNotice = true
- }
- .build()
+ val args =
+ MarkChaptersCompletedActivityParams
+ .newBuilder()
+ .apply {
+ this.internalProfileId = 0
+ this.showConfirmationNotice = true
+ }.build()
intended(hasComponent(MarkChaptersCompletedActivity::class.java.name))
intended(hasProtoExtra(MARK_CHAPTERS_COMPLETED_ACTIVITY_PARAMS, args))
}
@@ -428,10 +454,11 @@ class ProfileEditFragmentTest {
fun testProfileEdit_featureOn_hasSwitchingPermission_enableLanguageSwitchingIsOn() {
TestPlatformParameterModule.forceEnableFastLanguageSwitchingInLesson(true)
- val updateLangProvider = profileManagementController.updateEnableInLessonQuickLanguageSwitching(
- profileId = ProfileId.newBuilder().apply { internalId = 0 }.build(),
- allowInLessonQuickLanguageSwitching = true
- )
+ val updateLangProvider =
+ profileManagementController.updateEnableInLessonQuickLanguageSwitching(
+ profileId = ProfileId.newBuilder().apply { internalId = 0 }.build(),
+ allowInLessonQuickLanguageSwitching = true,
+ )
monitorFactory.waitForNextSuccessfulResult(updateLangProvider)
// With the permission to switch languages, the setting should be on by default.
@@ -450,7 +477,7 @@ class ProfileEditFragmentTest {
// The user should not have permission to switch languages (since the switch wasn't toggled).
val profileProvider =
profileManagementController.getProfile(
- ProfileId.newBuilder().apply { internalId = 0 }.build()
+ ProfileId.newBuilder().apply { internalId = 0 }.build(),
)
val profile = monitorFactory.waitForNextSuccessfulResult(profileProvider)
@@ -470,7 +497,7 @@ class ProfileEditFragmentTest {
// The user should have permission to switch languages (since the switch was toggled).
val profileProvider =
profileManagementController.getProfile(
- ProfileId.newBuilder().apply { internalId = 0 }.build()
+ ProfileId.newBuilder().apply { internalId = 0 }.build(),
)
val profile = monitorFactory.waitForNextSuccessfulResult(profileProvider)
assertThat(profile.allowInLessonQuickLanguageSwitching).isTrue()
@@ -481,22 +508,26 @@ class ProfileEditFragmentTest {
launchFragmentTestActivity(internalProfileId = 1).use { scenario ->
scenario.onActivity { activity ->
- val activityArgs = activity.intent.getProtoExtra(
- ProfileEditActivity.PROFILE_EDIT_ACTIVITY_PARAMS_KEY,
- ProfileEditActivityParams.getDefaultInstance()
- )
+ val activityArgs =
+ activity.intent.getProtoExtra(
+ ProfileEditActivity.PROFILE_EDIT_ACTIVITY_PARAMS_KEY,
+ ProfileEditActivityParams.getDefaultInstance(),
+ )
val isMultipane = activityArgs?.isMultipane ?: false
- val fragment = activity.supportFragmentManager
- .findFragmentById(R.id.profile_edit_fragment_placeholder) as ProfileEditFragment
-
- val arguments = checkNotNull(fragment.arguments) {
- "Expected variables to be passed to ProfileEditFragment"
- }
- val args = arguments.getProto(
- ProfileEditFragment.PROFILE_EDIT_FRAGMENT_ARGUMENTS_KEY,
- ProfileEditFragmentArguments.getDefaultInstance()
- )
+ val fragment =
+ activity.supportFragmentManager
+ .findFragmentById(R.id.profile_edit_fragment_placeholder) as ProfileEditFragment
+
+ val arguments =
+ checkNotNull(fragment.arguments) {
+ "Expected variables to be passed to ProfileEditFragment"
+ }
+ val args =
+ arguments.getProto(
+ ProfileEditFragment.PROFILE_EDIT_FRAGMENT_ARGUMENTS_KEY,
+ ProfileEditFragmentArguments.getDefaultInstance(),
+ )
val receivedInternalProfileId = args.internalProfileId
val receivedIsMultipane = args.isMultipane
@@ -508,7 +539,7 @@ class ProfileEditFragmentTest {
private fun launchFragmentTestActivity(internalProfileId: Int) =
launch(
- createProfileEditFragmentTestActivity(context, internalProfileId)
+ createProfileEditFragmentTestActivity(context, internalProfileId),
).also { testCoroutineDispatchers.runCurrent() }
@Singleton
@@ -539,10 +570,9 @@ class ProfileEditFragmentTest {
SyncStatusModule::class, MetricLogSchedulerModule::class, TestingBuildFlavorModule::class,
ActivityRouterModule::class,
CpuPerformanceSnapshotterModule::class, ExplorationProgressModule::class,
- TestAuthenticationModule::class
- ]
+ TestAuthenticationModule::class,
+ ],
)
-
interface TestApplicationComponent : ApplicationComponent {
@Component.Builder
interface Builder : ApplicationComponent.Builder {
@@ -552,9 +582,13 @@ class ProfileEditFragmentTest {
fun inject(profileEditFragmentTest: ProfileEditFragmentTest)
}
- class TestApplication : Application(), ActivityComponentFactory, ApplicationInjectorProvider {
+ class TestApplication :
+ Application(),
+ ActivityComponentFactory,
+ ApplicationInjectorProvider {
private val component: TestApplicationComponent by lazy {
- DaggerProfileEditFragmentTest_TestApplicationComponent.builder()
+ DaggerProfileEditFragmentTest_TestApplicationComponent
+ .builder()
.setApplication(this)
.build() as TestApplicationComponent
}
@@ -562,9 +596,12 @@ class ProfileEditFragmentTest {
fun inject(profileEditFragmentTest: ProfileEditFragmentTest) =
component.inject(profileEditFragmentTest)
- override fun createActivityComponent(activity: AppCompatActivity): ActivityComponent {
- return component.getActivityComponentBuilderProvider().get().setActivity(activity).build()
- }
+ override fun createActivityComponent(activity: AppCompatActivity): ActivityComponent =
+ component
+ .getActivityComponentBuilderProvider()
+ .get()
+ .setActivity(activity)
+ .build()
override fun getApplicationInjector(): ApplicationInjector = component
}
diff --git a/scripts/assets/test_file_exemptions.textproto b/scripts/assets/test_file_exemptions.textproto
index 08f1cf99f8e..c358c7d68a4 100644
--- a/scripts/assets/test_file_exemptions.textproto
+++ b/scripts/assets/test_file_exemptions.textproto
@@ -2086,6 +2086,10 @@ test_file_exemption {
exempted_file_path: "app/src/main/java/org/oppia/android/app/settings/profile/ProfileEditActivity.kt"
source_file_is_incompatible_with_code_coverage: true
}
+test_file_exemption {
+ exempted_file_path: "app/src/main/java/org/oppia/android/app/settings/profile/ProfileDeleteSuccessDialogFragment.kt"
+ test_file_not_required: true
+}
test_file_exemption {
exempted_file_path: "app/src/main/java/org/oppia/android/app/settings/profile/ProfileEditActivityPresenter.kt"
test_file_not_required: true