Populates the change email, username, about me, and photo URL
settings forms with the user's current data.
Also, prevent SettingsFormBottomSheet from appearing blank during configuration changes by retaining the instance.
Introduce SettingsFormBottomSheet to host any ConfigurableFormScreen (ChangePassword, ChangeEmail, ChangeUsername, ChangeDisplayName, AboutMe, PhotoUrl)
Replace all legacy ValidatingEditText + HabiticaAlertDialog flows with Compose screens in a full-screen bottom sheet
Wire each show…Dialog() in AccountPreferencesFragment to instantiate the sheet, assign its content lambda, invoke existing repository calls (e.g. updatePassword, updateEmail, etc.), dismiss the sheet, and update preference summaries via configurePreference(...)
Preserve keyboard dismissal, viewModel.saveTokens, and “forgot password” callbacks exactly as before
Add FieldConfig and FormScreenConfig data models
Implement ConfigurableFormScreen and ComponentTextInput to render any settings screen with AndroidView inputs, styling, and validation
Refactor ChangePasswordScreen to use the new generic form instead of its bespoke implementation
Preserve existing theming, padding, and error behavior across all screens
- Wrap initial fragment transaction in if (savedInstanceState == null) so if the activity recreates (theme or system UI changes), fragments don’t stack
- Change password button always in purple 400
- Fix styling of change password
- Use the existing textinputlayout (textbox) behavior
- Show error when changing password (without closing the sheet)
- Use transparent white nav bar on API token bottom sheet on day/light mode
- Match password reset screen textbox styling
- Update styling of the explanation text to match designs
- Don't disable change password button field for now
- Transparent white bottom nav bar when on light mode
- Light mode password input text box colors
Replaces the simple copy functionality for the API token with a
bottom sheet that displays the token and provides information about
its security implications.
This change helps with user awareness
regarding the sensitive nature of the API token and promotes
responsible handling of this credential.
• Moved the top spacer into the Column’s padding(top = 16.dp)
• Removed the unnecessary Row—placed the IconButton directly with bottom padding
• Dropped all fixed .height(...) modifiers so fields and the button scale with system font size
- Treat sendInvites() result as List<InviteResponse>
- Branch on InviteResponse.UserInvite vs EmailInvite
- Use isNullOrEmpty() to drive success/failure state transitions
- InviteResponseDeserializer added
- Retain loading > success/failure > content state flow with delays
- In logout(), set PushNotificationManager.user and refreshedToken before calling removePushDeviceUsingStoredToken()
- Add clearUser() to null out in-memory user and remove saved DEVICE_TOKEN_PREFERENCE_KEY
- Invoke clearUser() after database reset to prevent stray notifications post-logout