From d6973d905da18a608b038692d82679746c3356b7 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Fri, 28 Sep 2018 17:20:21 +0200 Subject: [PATCH] Make it easier to confirm usernames --- Habitica/AndroidManifest.xml | 2 +- Habitica/res/drawable/badge_circle.xml | 13 +++ Habitica/res/layout/drawer_main.xml | 68 +++++++++--- .../res/layout/preference_child_summary.xml | 42 +++++++ .../layout/preference_child_summary_error.xml | 43 +++++++ Habitica/res/values/strings.xml | 10 ++ Habitica/res/xml/preferences_fragment.xml | 105 ++++++++++++------ .../habitica/HabiticaBaseApplication.kt | 1 + .../android/habitica/models/user/Flags.java | 9 ++ .../habitica/ui/activities/MainActivity.kt | 30 +---- .../ui/fragments/NavigationDrawerFragment.kt | 21 ++++ .../AuthenticationPreferenceFragment.kt | 18 +++ .../preferences/PreferencesFragment.kt | 22 +++- 13 files changed, 304 insertions(+), 80 deletions(-) create mode 100644 Habitica/res/drawable/badge_circle.xml create mode 100644 Habitica/res/layout/preference_child_summary.xml create mode 100644 Habitica/res/layout/preference_child_summary_error.xml diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index e850ac4f9..29e6f910c 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -2,7 +2,7 @@ diff --git a/Habitica/res/drawable/badge_circle.xml b/Habitica/res/drawable/badge_circle.xml new file mode 100644 index 000000000..5b8a552fe --- /dev/null +++ b/Habitica/res/drawable/badge_circle.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/Habitica/res/layout/drawer_main.xml b/Habitica/res/layout/drawer_main.xml index 23859a725..2073d4f51 100644 --- a/Habitica/res/layout/drawer_main.xml +++ b/Habitica/res/layout/drawer_main.xml @@ -40,21 +40,61 @@ tools:text="Habitica" style="@style/Body1" android:textColor="@color/white"/> + + + + + + + + - - + + + + + + + + + + \ No newline at end of file diff --git a/Habitica/res/layout/preference_child_summary_error.xml b/Habitica/res/layout/preference_child_summary_error.xml new file mode 100644 index 000000000..54fe852e3 --- /dev/null +++ b/Habitica/res/layout/preference_child_summary_error.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index 7b4deb4df..9ca3cc961 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -814,4 +814,14 @@ Latest Check In Total Checkins Two-Handed + It’s time to set your username! + Your display name hasn’t changed but your old login name will now be your public username used for invitations, chat @mentions, and messaging. + If you’d like to learn more about this change, visit our wiki. + Confirm Username + Usernames should conform to our Terms of Service and Community Guidelines. If you didn’t previously set a login name, your username was auto-generated. + Are you sure you want to confirm your current username? + Confirming your username will make it public for invitations, @mentions and messaging. You can change your username from settings at any time. + Cancel + Confirm Username + Username not confirmed diff --git a/Habitica/res/xml/preferences_fragment.xml b/Habitica/res/xml/preferences_fragment.xml index c2db2c775..3d2e9d9eb 100644 --- a/Habitica/res/xml/preferences_fragment.xml +++ b/Habitica/res/xml/preferences_fragment.xml @@ -10,56 +10,71 @@ + android:key="profile" + android:layout="@layout/preference_child_summary"> + android:title="@string/display_name" + android:layout="@layout/preference_child_summary" /> + android:title="@string/photo_url" + android:layout="@layout/preference_child_summary" /> + android:title="@string/about" + android:layout="@layout/preference_child_summary" /> + app:key="authentication" + android:layout="@layout/preference_child_summary"> + android:shouldDisableView="false" + android:layout="@layout/preference_child_summary" /> + + android:shouldDisableView="false" + android:layout="@layout/preference_child_summary"/> + android:shouldDisableView="false" + android:layout="@layout/preference_child_summary"/> + android:key="reset_account" + android:layout="@layout/preference_child_summary" /> + android:key="delete_account" + android:layout="@layout/preference_child_summary" /> + android:key="api" + android:layout="@layout/preference_child_summary"> + android:summary="@string/SP_userID_summary" + android:layout="@layout/preference_child_summary"/> + android:summary="@string/SP_APIToken_summary" + android:layout="@layout/preference_child_summary"/> + android:summary="@string/SP_user_qr_code" + android:layout="@layout/preference_child_summary"/> + tools:title="Change Class" + android:layout="@layout/preference_child_summary"/> + app:key="fixCharacterValues" + android:layout="@layout/preference_child_summary"/> + android:summary="@string/logout_description" + android:layout="@layout/preference_child_summary"/> @@ -95,20 +115,24 @@ android:key="@string/pref_first_day_of_the_week_key" android:entries="@array/weekdays" android:entryValues="@array/weekdayValues" - android:summary="@string/pref_first_day_of_the_week_summary"/> + android:summary="@string/pref_first_day_of_the_week_summary" + android:layout="@layout/preference_child_summary"/> + android:summary="@string/Language_summary" + android:layout="@layout/preference_child_summary"/> + android:summary="@string/AudioTheme_summary" + android:layout="@layout/preference_child_summary"/> @@ -118,12 +142,14 @@ + android:title="@string/pref_reminder_checkbox" + android:layout="@layout/preference_child_summary"/> + android:title="@string/pref_reminder_picker" + android:layout="@layout/preference_child_summary" /> @@ -133,7 +159,7 @@ + android:layout="@layout/preference_child_summary" /> @@ -143,54 +169,64 @@ + android:title="@string/pref_push_notifications_checkbox" + android:layout="@layout/preference_child_summary"/> + android:summary="@string/push_notifications_sum" + android:layout="@layout/preference_child_summary"> + android:title="@string/preference_push_you_won_challenge" + android:layout="@layout/preference_child_summary"/> + android:title="@string/preference_push_received_a_private_message" + android:layout="@layout/preference_child_summary"/> + android:title="@string/preference_push_gifted_gems" + android:layout="@layout/preference_child_summary"/> + android:title="@string/preference_push_gifted_subscription" + android:layout="@layout/preference_child_summary"/> + android:title="@string/preference_push_invited_to_party" + android:layout="@layout/preference_child_summary"/> + android:title="@string/preference_push_invited_to_guild" + android:layout="@layout/preference_child_summary"/> + android:title="@string/preference_push_your_quest_has_begun" + android:layout="@layout/preference_child_summary"/> + android:title="@string/preference_push_invited_to_quest" + android:layout="@layout/preference_child_summary"/> @@ -202,7 +238,8 @@ + android:key="reload_content" + android:layout="@layout/preference_child_summary"/> \ No newline at end of file diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaBaseApplication.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaBaseApplication.kt index 0ea919444..ae4222bf9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaBaseApplication.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaBaseApplication.kt @@ -118,6 +118,7 @@ abstract class HabiticaBaseApplication : MultiDexApplication() { .build() Instabug.setWelcomeMessageState(WelcomeMessage.State.DISABLED) Instabug.setUserAttribute("", lazyApiHelper.hostConfig.user) + BugReporting.setShakingThreshold(450) BugReporting.setPromptOptionsEnabled(PromptOption.BUG, PromptOption.FEEDBACK) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Flags.java b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Flags.java index fb6f3076a..77e3eb1ff 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Flags.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/Flags.java @@ -25,6 +25,7 @@ public class Flags extends RealmObject { private boolean armoireOpened; private boolean armoireEmpty; private boolean communityGuidelinesAccepted; + private boolean verifiedUsername; public List getTutorial() { return tutorial; @@ -129,4 +130,12 @@ public class Flags extends RealmObject { public void setCommunityGuidelinesAccepted(boolean communityGuidelinesAccepted) { this.communityGuidelinesAccepted = communityGuidelinesAccepted; } + + public boolean isVerifiedUsername() { + return verifiedUsername; + } + + public void setVerifiedUsername(boolean verifiedUsername) { + this.verifiedUsername = verifiedUsername; + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt index 22d237a91..8a4da9f76 100755 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt @@ -398,34 +398,14 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { displayDeathDialogIfNeeded() YesterdailyDialog.showDialogIfNeeded(this, user?.id, userRepository, taskRepository) - displayNewInboxMessagesBadge() + drawerFragment?.setMessagesCount(this.user?.inbox?.newMessages ?: 0) + if (remoteConfigManager.enableChangeUsername()) { + drawerFragment?.setSettingsCount(if (this.user?.flags?.isVerifiedUsername != true) 1 else 0 ) + } + } } - private fun displayNewInboxMessagesBadge() { - /*int numberOfUnreadPms = this.user.getInbox().getNewMessages(); - IDrawerItem newInboxItem; - - if (numberOfUnreadPms <= 0) { - newInboxItem = new PrimaryDrawerItem() - .withName(this.getString(R.string.sidebar_inbox)) - .withIdentifier(MainDrawerBuilder.INSTANCE.getSIDEBAR_INBOX()); - } else { - String numberOfUnreadPmsLabel = String.valueOf(numberOfUnreadPms); - BadgeStyle badgeStyle = new BadgeStyle() - .withTextColor(Color.WHITE) - .withColorRes(R.color.md_red_700); - - newInboxItem = new PrimaryDrawerItem() - .withName(this.getString(R.string.sidebar_inbox)) - .withIdentifier(MainDrawerBuilder.INSTANCE.getSIDEBAR_INBOX()) - .withBadge(numberOfUnreadPmsLabel) - .withBadgeStyle(badgeStyle); - } - if (this.drawerFragment != null) { - this.drawer.updateItemAtPosition(newInboxItem, this.drawer.getPosition(MainDrawerBuilder.INSTANCE.getSIDEBAR_INBOX())); - }*/ - } private fun updateSidebar() { drawerFragment?.setUsername(user?.profile?.name) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt index fb575fe6d..0cb054204 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt @@ -112,6 +112,9 @@ class NavigationDrawerFragment : DialogFragment() { adapter.backgroundTintColor = questContent.colors?.darkColor ?: 0 + messagesBadge.visibility = View.GONE + settingsBadge.visibility = View.GONE + /* Reenable this once the boss art can be displayed correctly. val preferences = context?.getSharedPreferences("collapsible_sections", 0) @@ -366,6 +369,24 @@ class NavigationDrawerFragment : DialogFragment() { outState.putInt(STATE_SELECTED_POSITION, mCurrentSelectedPosition) } + fun setMessagesCount(unreadMessages: Int) { + if (unreadMessages == 0) { + messagesBadge.visibility = View.GONE + } else { + messagesBadge.visibility = View.VISIBLE + messagesBadge.text = unreadMessages.toString() + } + } + + fun setSettingsCount(count: Int) { + if (count == 0) { + settingsBadge.visibility = View.GONE + } else { + settingsBadge.visibility = View.VISIBLE + settingsBadge.text = count.toString() + } + } + companion object { const val SIDEBAR_TASKS = "tasks" diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AuthenticationPreferenceFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AuthenticationPreferenceFragment.kt index bdea0efff..4faecb5e4 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AuthenticationPreferenceFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AuthenticationPreferenceFragment.kt @@ -47,6 +47,7 @@ class AuthenticationPreferenceFragment: BasePreferencesFragment() { if (configManager.enableChangeUsername()) { findPreference("login_name").title = context?.getString(R.string.username) + findPreference("confirm_username").isVisible = user?.flags?.isVerifiedUsername != true } } @@ -66,6 +67,7 @@ class AuthenticationPreferenceFragment: BasePreferencesFragment() { override fun onPreferenceTreeClick(preference: Preference): Boolean { when (preference.key) { "login_name" -> showLoginNameDialog() + "confirm_username" -> showConfirmUsernameDialog() "email" -> showEmailDialog() "change_password" -> showChangePasswordDialog() "subscription_status" -> { @@ -198,6 +200,22 @@ class AuthenticationPreferenceFragment: BasePreferencesFragment() { } } + private fun showConfirmUsernameDialog() { + context.notNull { context -> + val dialog = AlertDialog.Builder(context) + .setTitle(R.string.confirm_username_title) + .setMessage(R.string.confirm_username_description) + .setPositiveButton(R.string.confirm) { thisDialog, _ -> + thisDialog.dismiss() + userRepository.updateLoginName(user?.authentication?.localAuthentication?.username ?: "") + .subscribe(Consumer { }, RxErrorHandler.handleEmptyError()) + } + .setNegativeButton(R.string.cancel) { thisDialog, _ -> thisDialog.dismiss() } + .create() + dialog.show() + } + } + private fun resetAccount() { @Suppress("DEPRECATION") val dialog = ProgressDialog.show(context, context?.getString(R.string.resetting_account), null, true) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.kt index 938bd2cca..599f5a89c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.kt @@ -15,10 +15,7 @@ import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.extensions.notNull -import com.habitrpg.android.habitica.helpers.LanguageHelper -import com.habitrpg.android.habitica.helpers.RxErrorHandler -import com.habitrpg.android.habitica.helpers.SoundManager -import com.habitrpg.android.habitica.helpers.TaskAlarmManager +import com.habitrpg.android.habitica.helpers.* import com.habitrpg.android.habitica.helpers.notifications.PushNotificationManager import com.habitrpg.android.habitica.models.ContentResult import com.habitrpg.android.habitica.models.user.User @@ -38,6 +35,8 @@ class PreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnShare lateinit var soundManager: SoundManager @Inject lateinit var pushNotificationManager: PushNotificationManager + @Inject + lateinit var configManager: RemoteConfigManager private var timePreference: TimePreference? = null private var pushNotificationsPreference: PreferenceScreen? = null @@ -54,12 +53,12 @@ class PreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnShare } override fun setupPreferences() { - timePreference = findPreference("reminder_time") as TimePreference + timePreference = findPreference("reminder_time") as? TimePreference val useReminder = preferenceManager.sharedPreferences.getBoolean("use_reminder", false) timePreference?.isEnabled = useReminder - pushNotificationsPreference = findPreference("pushNotifications") as PreferenceScreen + pushNotificationsPreference = findPreference("pushNotifications") as? PreferenceScreen val userPushNotifications = preferenceManager.sharedPreferences.getBoolean("usePushNotifications", true) pushNotificationsPreference?.isEnabled = userPushNotifications @@ -246,5 +245,16 @@ class PreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnShare val cdsTimePreference = findPreference("cds_time") as? TimePreference cdsTimePreference?.text = user?.preferences?.dayStart.toString() + ":00" findPreference("dailyDueDefaultView").setDefaultValue(user?.preferences?.dailyDueDefaultView) + + if (configManager.enableChangeUsername()) { + val preference = findPreference("authentication") + if (user?.flags?.isVerifiedUsername == true) { + preference.layoutResource = R.layout.preference_child_summary + preference.summary = context?.getString(R.string.authentication_summary) + } else { + preference.layoutResource = R.layout.preference_child_summary_error + preference.summary = context?.getString(R.string.username_not_confirmed) + } + } } }