From 83ecebeddba8e5005a8f275ec4f19297faa43102 Mon Sep 17 00:00:00 2001 From: Aditya Date: Thu, 14 Mar 2019 21:03:31 +0530 Subject: [PATCH] fix: editprofile discard changes dialog shown on back press Fixes Issue #1292. The behaviour for up button has been replicated for the back button. So now if changes are made in the EditProfileFragment and the back button or the up button is pressed, an AlertDialog is displayed which warns the user of the unsaved changes --- .../openevent/general/MainActivity.kt | 14 ++++++ .../general/auth/EditProfileFragment.kt | 44 ++++++++++++------- app/src/main/res/values/strings.xml | 5 +++ 3 files changed, 46 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/org/fossasia/openevent/general/MainActivity.kt b/app/src/main/java/org/fossasia/openevent/general/MainActivity.kt index ce5c03745a..b46e974064 100644 --- a/app/src/main/java/org/fossasia/openevent/general/MainActivity.kt +++ b/app/src/main/java/org/fossasia/openevent/general/MainActivity.kt @@ -10,6 +10,7 @@ import com.google.android.material.snackbar.Snackbar import kotlinx.android.synthetic.main.activity_main.navigation import kotlinx.android.synthetic.main.activity_main.navigationAuth import kotlinx.android.synthetic.main.activity_main.mainFragmentCoordinatorLayout +import org.fossasia.openevent.general.auth.EditProfileFragment import org.fossasia.openevent.general.search.RC_CREDENTIALS_READ import org.fossasia.openevent.general.search.RC_CREDENTIALS_SAVE import org.fossasia.openevent.general.search.SmartAuthViewModel @@ -68,10 +69,23 @@ class MainActivity : AppCompatActivity() { } R.id.orderCompletedFragment -> navController.popBackStack(R.id.eventDetailsFragment, false) R.id.welcomeFragment -> finish() + R.id.editProfileFragment -> { + + // Calls the handleBackPress method in EditProfileFragment + val hostFragment = supportFragmentManager.findFragmentById(R.id.frameContainer) as? NavHostFragment + (hostFragment?.childFragmentManager?.fragments?.get(0) as? EditProfileFragment)?.handleBackPress() + } else -> super.onBackPressed() } } + /** + * Called by EditProfileFragment to go to previous fragment + */ + fun onSuperBackPressed() { + super.onBackPressed() + } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { if (requestCode == RC_CREDENTIALS_READ || requestCode == RC_CREDENTIALS_SAVE) SmartAuthViewModel().onActivityResult(requestCode, resultCode, data, this) diff --git a/app/src/main/java/org/fossasia/openevent/general/auth/EditProfileFragment.kt b/app/src/main/java/org/fossasia/openevent/general/auth/EditProfileFragment.kt index 94add3d047..ab3323c787 100644 --- a/app/src/main/java/org/fossasia/openevent/general/auth/EditProfileFragment.kt +++ b/app/src/main/java/org/fossasia/openevent/general/auth/EditProfileFragment.kt @@ -28,6 +28,7 @@ import kotlinx.android.synthetic.main.fragment_edit_profile.view.lastName import kotlinx.android.synthetic.main.fragment_edit_profile.view.profilePhoto import kotlinx.android.synthetic.main.fragment_edit_profile.view.progressBar import org.fossasia.openevent.general.CircleTransform +import org.fossasia.openevent.general.MainActivity import org.fossasia.openevent.general.R import org.fossasia.openevent.general.utils.Utils.hideSoftKeyboard import org.fossasia.openevent.general.utils.Utils.requireDrawable @@ -121,7 +122,8 @@ class EditProfileFragment : Fragment() { .observe(viewLifecycleOwner, Observer { Snackbar.make(rootView.editProfileCoordinatorLayout, it, Snackbar.LENGTH_LONG).show() if (it == USER_UPDATED) { - activity?.onBackPressed() + val thisActivity = activity + if (thisActivity is MainActivity) thisActivity.onSuperBackPressed() } }) @@ -169,22 +171,7 @@ class EditProfileFragment : Fragment() { override fun onOptionsItemSelected(item: MenuItem): Boolean { return when (item.itemId) { android.R.id.home -> { - if (!avatarUpdated && rootView.lastName.text.toString() == userLastName && - rootView.firstName.text.toString() == userFirstName) { - activity?.onBackPressed() - } else { - hideSoftKeyboard(context, rootView) - val dialog = AlertDialog.Builder(context) - dialog.setMessage("Your changes have not been saved") - dialog.setNegativeButton("Discard") { _, _ -> - activity?.onBackPressed() - } - dialog.setPositiveButton("Save") { _, _ -> - editProfileViewModel.updateProfile(encodedImage, rootView.firstName.text.toString(), - rootView.lastName.text.toString()) - } - dialog.create().show() - } + handleBackPress() true } else -> super.onOptionsItemSelected(item) @@ -219,6 +206,29 @@ class EditProfileFragment : Fragment() { } } + /** + * Handles back press when up button or back button is pressed + */ + fun handleBackPress() { + val thisActivity = activity + if (!avatarUpdated && rootView.lastName.text.toString() == userLastName && + rootView.firstName.text.toString() == userFirstName ) { + if(thisActivity is MainActivity) thisActivity.onSuperBackPressed() + } else { + hideSoftKeyboard(context, rootView) + val dialog = AlertDialog.Builder(context) + dialog.setMessage(getString(R.string.changes_not_saved)) + dialog.setNegativeButton(getString(R.string.discard)) { _, _ -> + if(thisActivity is MainActivity) thisActivity.onSuperBackPressed() + } + dialog.setPositiveButton(getString(R.string.save)) { _, _ -> + editProfileViewModel.updateProfile(encodedImage, rootView.firstName.text.toString(), + rootView.lastName.text.toString()) + } + dialog.create().show() + } + } + override fun onDestroyView() { val activity = activity as? AppCompatActivity activity?.supportActionBar?.setDisplayHomeAsUpEnabled(false) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index eebe14fdb3..79dacb8e88 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -66,6 +66,11 @@ Welcome back! Update + + Your changes have not been saved + Discard + Save + eventyay