diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileNameFragment.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileNameFragment.java index e6c65c8429..8d0392dfdb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileNameFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileNameFragment.java @@ -5,6 +5,7 @@ import android.text.Editable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.inputmethod.EditorInfo; import android.widget.EditText; import android.widget.Toast; @@ -56,6 +57,8 @@ public class EditProfileNameFragment extends Fragment { this.givenName.setText(Recipient.self().getProfileName().getGivenName()); this.familyName.setText(Recipient.self().getProfileName().getFamilyName()); + viewModel.onGivenNameLengthChanged(this.givenName.getText().length()); + view.findViewById(R.id.toolbar) .setNavigationOnClickListener(v -> Navigation.findNavController(view) .popBackStack()); @@ -63,7 +66,10 @@ public class EditProfileNameFragment extends Fragment { EditTextUtil.addGraphemeClusterLimitFilter(givenName, NAME_MAX_GLYPHS); EditTextUtil.addGraphemeClusterLimitFilter(familyName, NAME_MAX_GLYPHS); - this.givenName.addTextChangedListener(new AfterTextChanged(EditProfileNameFragment::trimFieldToMaxByteLength)); + this.givenName.addTextChangedListener(new AfterTextChanged(s -> { + trimFieldToMaxByteLength(s); + viewModel.onGivenNameLengthChanged(s.length()); + })); this.familyName.addTextChangedListener(new AfterTextChanged(EditProfileNameFragment::trimFieldToMaxByteLength)); saveButton.setOnClickListener(v -> viewModel.onSaveClicked(requireContext(), @@ -80,19 +86,34 @@ public class EditProfileNameFragment extends Fragment { private void presentSaveState(@NonNull EditProfileNameViewModel.SaveState state) { switch (state) { + case DISABLED: + saveButton.setClickable(false); + saveButton.setAlpha(0.5f); + setEditTextEnabled(givenName, true); + setEditTextEnabled(familyName, true); + break; case IDLE: saveButton.setClickable(true); saveButton.setIndeterminateProgressMode(false); saveButton.setProgress(0); + saveButton.setAlpha(1); + setEditTextEnabled(givenName, true); + setEditTextEnabled(familyName, true); break; case IN_PROGRESS: saveButton.setClickable(false); saveButton.setIndeterminateProgressMode(true); saveButton.setProgress(50); + saveButton.setAlpha(1); + setEditTextEnabled(givenName, false); + setEditTextEnabled(familyName, false); break; case DONE: saveButton.setClickable(false); Navigation.findNavController(requireView()).popBackStack(); + saveButton.setAlpha(1); + setEditTextEnabled(givenName, false); + setEditTextEnabled(familyName, false); break; } } @@ -114,4 +135,15 @@ public class EditProfileNameFragment extends Fragment { s.delete(trimmedLength, s.length()); } } + + private static void setEditTextEnabled(@NonNull EditText text, boolean enabled) { + text.setEnabled(enabled); + text.setFocusable(enabled); + if (enabled) { + text.setInputType(EditorInfo.TYPE_TEXT_VARIATION_PERSON_NAME); + } else { + text.clearFocus(); + text.setInputType(EditorInfo.TYPE_NULL); + } + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileNameViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileNameViewModel.java index 5c80cd576b..fa85f859ed 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileNameViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileNameViewModel.java @@ -22,6 +22,14 @@ public final class EditProfileNameViewModel extends ViewModel { this.events = new SingleLiveEvent<>(); } + void onGivenNameLengthChanged(int length) { + if (length <= 0) { + saveState.setValue(SaveState.DISABLED); + } else { + saveState.setValue(SaveState.IDLE); + } + } + @NonNull LiveData getSaveState() { return saveState; } @@ -46,7 +54,7 @@ public final class EditProfileNameViewModel extends ViewModel { } enum SaveState { - IDLE, IN_PROGRESS, DONE + IDLE, IN_PROGRESS, DONE, DISABLED } enum Event {