Skip to content

Commit

Permalink
Fixes oppia#4294 : Added Profile delete message with AlertDialog (opp…
Browse files Browse the repository at this point in the history
…ia#5577)

Fixes oppia#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
<!-- Please tick the relevant boxes by putting an "x" in them. -->
- [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 <[email protected]>
  • Loading branch information
theayushyadav11 and adhiamboperes authored Dec 3, 2024
1 parent 9646af6 commit 242fef4
Show file tree
Hide file tree
Showing 7 changed files with 216 additions and 109 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
@@ -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
}
}
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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
)
}
}
)
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -347,7 +347,9 @@
<string name="profile_edit_delete_dialog_message">All progress will be deleted and cannot be recovered.</string>
<string name="profile_edit_delete_dialog_positive">Delete</string>
<string name="profile_edit_delete_dialog_negative">Cancel</string>
<string name="profile_edit_delete_successful_message">Profile deleted successfully.</string>
<string name="profile_edit_allow_download_heading">Allow Download Access</string>
<string name="profile_edit_delete_success_dialog_positive_button">OK</string>
<string name="profile_edit_allow_download_sub">User is able to download and delete content without Administrator password</string>
<!-- ProfilePictureActivity -->
<string name="profile_picture_activity_title">Profile Picture</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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 {
Expand Down
Loading

0 comments on commit 242fef4

Please sign in to comment.