diff --git a/Habitica/res/layout/activity_prefs.xml b/Habitica/res/layout/activity_prefs.xml
index 4bb3134f1..eec261ce6 100644
--- a/Habitica/res/layout/activity_prefs.xml
+++ b/Habitica/res/layout/activity_prefs.xml
@@ -1,25 +1,11 @@
-
-
-
-
-
-
-
+ tools:context=".ui.activities.PrefsActivity"
+ android:orientation="vertical">
+
-
+
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml
index c47ae8e90..17e735fd0 100644
--- a/Habitica/res/values/strings.xml
+++ b/Habitica/res/values/strings.xml
@@ -62,7 +62,6 @@
Logout
Log out of your account
- Check your account details
Account Details
Welcome
@@ -676,4 +675,14 @@
Enter the email address you used to register your Habitica account.
If we have your email on file, instructions for setting a new password have been sent to your email.
OK
+ Profile
+ Edit your public profile.
+ Display Name
+ Photo URL
+ Login Name
+ About
+ App Settings
+ Authentication
+ Change your authentication options.
+ Change Password
diff --git a/Habitica/res/xml/preferences_fragment.xml b/Habitica/res/xml/preferences_fragment.xml
index c417dfd00..9cc6783ce 100644
--- a/Habitica/res/xml/preferences_fragment.xml
+++ b/Habitica/res/xml/preferences_fragment.xml
@@ -1,36 +1,65 @@
+
+
+
+
+
+
-
-
-
+ android:key="authentication"
+ android:title="@string/authentication"
+ android:summary="@string/authentication_summary"
+ app:key="authentication">
+ android:shouldDisableView="false" />
+ android:shouldDisableView="false"/>
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+ tools:title="Change Class"/>
+
+
+
+
+
+ android:summary="@string/pref_first_day_of_the_week_summary"/>
+ android:summary="@string/Language_summary"/>
+ android:summary="@string/AudioTheme_summary"/>
-
-
-
+ android:summary="@string/push_notifications_sum">
@@ -197,8 +209,7 @@
+ android:key="reload_content"/>
\ No newline at end of file
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java
index 93cf604c7..9d9ea52d2 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java
@@ -57,8 +57,10 @@ import com.habitrpg.android.habitica.ui.fragments.inventory.stable.MountDetailRe
import com.habitrpg.android.habitica.ui.fragments.inventory.stable.PetDetailRecyclerFragment;
import com.habitrpg.android.habitica.ui.fragments.inventory.stable.StableFragment;
import com.habitrpg.android.habitica.ui.fragments.inventory.stable.StableRecyclerFragment;
-import com.habitrpg.android.habitica.ui.fragments.preferences.AccountDetailsFragment;
+import com.habitrpg.android.habitica.ui.fragments.preferences.APIPreferenceFragment;
+import com.habitrpg.android.habitica.ui.fragments.preferences.AuthenticationPreferenceFragment;
import com.habitrpg.android.habitica.ui.fragments.preferences.PreferencesFragment;
+import com.habitrpg.android.habitica.ui.fragments.preferences.ProfilePreferencesFragment;
import com.habitrpg.android.habitica.ui.fragments.setup.AvatarSetupFragment;
import com.habitrpg.android.habitica.ui.fragments.setup.IntroFragment;
import com.habitrpg.android.habitica.ui.fragments.setup.TaskSetupFragment;
@@ -262,11 +264,8 @@ public interface AppComponent {
void inject(HabiticaFirebaseMessagingService habiticaFirebaseMessagingService);
- void inject(AccountDetailsFragment accountDetailsFragment);
-
void inject(BaseWidgetProvider baseWidgetProvider);
-
void inject(NotificationPublisher notificationPublisher);
void inject(CreateChallengeActivity createChallengeActivity);
@@ -282,4 +281,10 @@ public interface AppComponent {
void inject(PurchaseDialog purchaseDialog);
void inject(@NotNull FixCharacterValuesActivity fixCharacterValuesActivity);
+
+ void inject(@NotNull AuthenticationPreferenceFragment authenticationPreferenceFragment);
+
+ void inject(@NotNull ProfilePreferencesFragment profilePreferencesFragment);
+
+ void inject(@NotNull APIPreferenceFragment apiPreferenceFragment);
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PrefsActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PrefsActivity.java
deleted file mode 100644
index 88e4b6399..000000000
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PrefsActivity.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package com.habitrpg.android.habitica.ui.activities;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.os.Bundle;
-import android.preference.PreferenceManager;
-import android.support.v7.preference.PreferenceFragmentCompat;
-import android.support.v7.preference.PreferenceScreen;
-import android.support.v7.widget.Toolbar;
-
-import com.habitrpg.android.habitica.BuildConfig;
-import com.habitrpg.android.habitica.api.HostConfig;
-import com.habitrpg.android.habitica.R;
-import com.habitrpg.android.habitica.components.AppComponent;
-import com.habitrpg.android.habitica.ui.fragments.preferences.AccountDetailsFragment;
-import com.habitrpg.android.habitica.ui.fragments.preferences.PreferencesFragment;
-import com.habitrpg.android.habitica.ui.fragments.preferences.PushNotificationsPreferencesFragment;
-
-import butterknife.BindView;
-
-public class PrefsActivity extends BaseActivity implements
- PreferenceFragmentCompat.OnPreferenceStartScreenCallback {
-
- @BindView(R.id.toolbar)
- Toolbar toolbar;
-
- // TODO:
- // This method should be moved to HabiticaApplication
- public static HostConfig fromContext(Context ctx) {
- SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx);
- HostConfig config;
- String httpPort = BuildConfig.PORT;
- String address = BuildConfig.DEBUG ? BuildConfig.BASE_URL : ctx.getString(R.string.base_url);
- String api = prefs.getString(ctx.getString(R.string.SP_APIToken), null);
- String userID = prefs.getString(ctx.getString(R.string.SP_userID), null);
- config = new HostConfig(address, httpPort, api, userID);
- return config;
- }
-
- @Override
- protected int getLayoutResId() {
- return R.layout.activity_prefs;
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- setupToolbar(toolbar);
-
- getSupportFragmentManager().beginTransaction()
- .add(R.id.fragment_container, new PreferencesFragment())
- .commit();
- }
-
- @Override
- protected void injectActivity(AppComponent component) {
- component.inject(this);
- }
-
- @Override
- public boolean onSupportNavigateUp() {
- if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
- onBackPressed();
- return true;
- }
- return super.onSupportNavigateUp();
- }
-
- @Override
- public boolean onPreferenceStartScreen(PreferenceFragmentCompat preferenceFragment,
- PreferenceScreen preferenceScreen) {
- PreferenceFragmentCompat fragment = createNextPage(preferenceScreen);
- if (fragment != null) {
- Bundle arguments = new Bundle();
- arguments.putString(PreferenceFragmentCompat.ARG_PREFERENCE_ROOT, preferenceScreen.getKey());
- fragment.setArguments(arguments);
- getSupportFragmentManager().beginTransaction()
- .replace(R.id.fragment_container, fragment)
- .addToBackStack(null)
- .commit();
- return true;
- }
- return false;
- }
-
- private PreferenceFragmentCompat createNextPage(PreferenceScreen preferenceScreen) {
- PreferenceFragmentCompat fragment = null;
- if (preferenceScreen.getKey().equals("accountDetails")) {
- fragment = new AccountDetailsFragment();
- }
-
- if (preferenceScreen.getKey().equals("pushNotifications")) {
- fragment = new PushNotificationsPreferencesFragment();
- }
- return fragment;
- }
-}
-
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PrefsActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PrefsActivity.kt
new file mode 100644
index 000000000..2a4afc149
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PrefsActivity.kt
@@ -0,0 +1,72 @@
+package com.habitrpg.android.habitica.ui.activities
+
+import android.os.Bundle
+import android.support.v7.preference.PreferenceFragmentCompat
+import android.support.v7.preference.PreferenceScreen
+import android.support.v7.widget.Toolbar
+
+import com.habitrpg.android.habitica.R
+import com.habitrpg.android.habitica.components.AppComponent
+import com.habitrpg.android.habitica.ui.fragments.preferences.PreferencesFragment
+import com.habitrpg.android.habitica.ui.fragments.preferences.PushNotificationsPreferencesFragment
+
+import butterknife.BindView
+import com.habitrpg.android.habitica.ui.fragments.preferences.APIPreferenceFragment
+import com.habitrpg.android.habitica.ui.fragments.preferences.AuthenticationPreferenceFragment
+import com.habitrpg.android.habitica.ui.fragments.preferences.ProfilePreferencesFragment
+
+class PrefsActivity : BaseActivity(), PreferenceFragmentCompat.OnPreferenceStartScreenCallback {
+
+ @BindView(R.id.toolbar)
+ lateinit var toolbar: Toolbar
+
+ override fun getLayoutResId(): Int = R.layout.activity_prefs
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ setupToolbar(toolbar)
+
+ supportFragmentManager.beginTransaction()
+ .add(R.id.fragment_container, PreferencesFragment())
+ .commit()
+ }
+
+ override fun injectActivity(component: AppComponent) {
+ component.inject(this)
+ }
+
+ override fun onSupportNavigateUp(): Boolean {
+ if (supportFragmentManager.backStackEntryCount > 0) {
+ onBackPressed()
+ return true
+ }
+ return super.onSupportNavigateUp()
+ }
+
+ override fun onPreferenceStartScreen(preferenceFragment: PreferenceFragmentCompat,
+ preferenceScreen: PreferenceScreen): Boolean {
+ val fragment = createNextPage(preferenceScreen)
+ if (fragment != null) {
+ val arguments = Bundle()
+ arguments.putString(PreferenceFragmentCompat.ARG_PREFERENCE_ROOT, preferenceScreen.key)
+ fragment.arguments = arguments
+ supportFragmentManager.beginTransaction()
+ .replace(R.id.fragment_container, fragment)
+ .addToBackStack(null)
+ .commit()
+ return true
+ }
+ return false
+ }
+
+ private fun createNextPage(preferenceScreen: PreferenceScreen): PreferenceFragmentCompat? =
+ when (preferenceScreen.key) {
+ "profile" -> ProfilePreferencesFragment()
+ "authentication" -> AuthenticationPreferenceFragment()
+ "api" -> APIPreferenceFragment()
+ "pushNotifications" -> PushNotificationsPreferencesFragment()
+ else -> null
+ }
+}
+
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/APIPreferenceFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/APIPreferenceFragment.kt
new file mode 100644
index 000000000..f8fcfdb86
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/APIPreferenceFragment.kt
@@ -0,0 +1,52 @@
+package com.habitrpg.android.habitica.ui.fragments.preferences
+
+import android.content.ClipData
+import android.content.ClipboardManager
+import android.content.Context
+import android.content.SharedPreferences
+import android.os.Bundle
+import android.support.v7.preference.Preference
+import android.widget.Toast
+import com.habitrpg.android.habitica.HabiticaBaseApplication
+import com.habitrpg.android.habitica.R
+import com.habitrpg.android.habitica.events.commands.OpenGemPurchaseFragmentCommand
+import com.habitrpg.android.habitica.helpers.QrCodeManager
+import org.greenrobot.eventbus.EventBus
+import java.util.*
+
+class APIPreferenceFragment: BasePreferencesFragment() {
+ private val apiPreferences: List
+ get() = Arrays.asList(getString(R.string.SP_APIToken), getString(R.string.SP_userID))
+
+ lateinit private var qrCodeManager: QrCodeManager
+
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ HabiticaBaseApplication.getComponent().inject(this)
+
+ qrCodeManager = QrCodeManager(userRepository, this.context)
+
+ super.onCreate(savedInstanceState)
+ }
+
+ override fun onPreferenceTreeClick(preference: Preference): Boolean {
+ when (preference.key) {
+ "SP_user_qr_code" -> qrCodeManager.showDialogue()
+ else -> {
+ val clipMan = activity.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
+ clipMan.primaryClip = ClipData.newPlainText(preference.key, preference.summary)
+ Toast.makeText(activity, "Copied " + preference.key + " to clipboard.", Toast.LENGTH_SHORT).show()
+ }
+ }
+ return super.onPreferenceTreeClick(preference)
+ }
+
+ override fun setupPreferences() {
+ for ((key, value) in preferenceScreen.sharedPreferences.all) {
+ if (apiPreferences.contains(key) && value != null) {
+ findPreference(key).summary = value.toString()
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AccountDetailsFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AccountDetailsFragment.java
deleted file mode 100644
index d69016e31..000000000
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AccountDetailsFragment.java
+++ /dev/null
@@ -1,169 +0,0 @@
-package com.habitrpg.android.habitica.ui.fragments.preferences;
-
-import android.app.ProgressDialog;
-import android.content.ClipData;
-import android.content.ClipboardManager;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.os.Bundle;
-import android.support.v4.content.ContextCompat;
-import android.support.v7.app.AlertDialog;
-import android.support.v7.preference.Preference;
-import android.widget.EditText;
-import android.widget.LinearLayout;
-import android.widget.Toast;
-
-import com.habitrpg.android.habitica.HabiticaApplication;
-import com.habitrpg.android.habitica.HabiticaBaseApplication;
-import com.habitrpg.android.habitica.R;
-import com.habitrpg.android.habitica.data.UserRepository;
-import com.habitrpg.android.habitica.events.commands.OpenGemPurchaseFragmentCommand;
-import com.habitrpg.android.habitica.helpers.QrCodeManager;
-import com.habitrpg.android.habitica.helpers.RxErrorHandler;
-import com.habitrpg.android.habitica.models.user.User;
-import com.habitrpg.android.habitica.models.user.SubscriptionPlan;
-import com.habitrpg.android.habitica.ui.views.subscriptions.SubscriptionDetailsView;
-
-import org.greenrobot.eventbus.EventBus;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import javax.inject.Inject;
-
-public class AccountDetailsFragment extends BasePreferencesFragment {
-
- @Inject
- UserRepository userRepository;
-
- private QrCodeManager qrCodeManager;
- private User user;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- HabiticaBaseApplication.getComponent().inject(this);
-
- String userID = getPreferenceManager().getSharedPreferences().getString(getContext().getString(R.string.SP_userID), null);
- if (userID != null) {
- userRepository.getUser(userID).subscribe(this::setUser, RxErrorHandler.handleEmptyError());
- }
- }
-
- @Override
- public void onDestroy() {
- userRepository.close();
- super.onDestroy();
- }
-
- public void setUser(User user) {
- this.user = user;
- }
-
- @Override
- protected void setupPreferences() {
- for (Map.Entry preference : getPreferenceScreen().getSharedPreferences().getAll().entrySet()) {
- String key = preference.getKey();
- if (getAccountDetailsPreferences().contains(key) && preference.getValue() != null) {
- findPreference(key).setSummary(preference.getValue().toString());
- }
- }
-
- qrCodeManager = new QrCodeManager(userRepository, this.getContext());
- }
-
- protected List getAccountDetailsPreferences() {
- return Arrays.asList(getString(R.string.SP_username), getString(R.string.SP_email),
- getString(R.string.SP_APIToken), getString(R.string.SP_userID), getString(R.string.SP_user_qr_code));
- }
-
- @Override
- public boolean onPreferenceTreeClick(Preference preference) {
- if (preference.getKey().equals("SP_user_qr_code")) {
- qrCodeManager.showDialogue();
- } else if (preference.getKey().equals("subscription_status")) {
- if (user != null && user.getPurchased() != null && user.getPurchased().getPlan() != null) {
- SubscriptionPlan plan = user.getPurchased().getPlan();
- if (plan.isActive()) {
- showSubscriptionStatusDialog();
- return super.onPreferenceTreeClick(preference);
- }
- }
- EventBus.getDefault().post(new OpenGemPurchaseFragmentCommand());
- } else if ("reset_account".equals(preference.getKey())) {
- showAccountResetConfirmation();
- } else if ("delete_account".equals(preference.getKey())) {
- showAccountDeleteConfirmation();
- } else {
- ClipboardManager clipMan = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
- clipMan.setPrimaryClip(ClipData.newPlainText(preference.getKey(), preference.getSummary()));
- Toast.makeText(getActivity(), "Copied " + preference.getKey() + " to clipboard.", Toast.LENGTH_SHORT).show();
- }
- return super.onPreferenceTreeClick(preference);
- }
-
- private void showAccountDeleteConfirmation() {
- final EditText input = new EditText(getContext());
- LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
- LinearLayout.LayoutParams.MATCH_PARENT,
- LinearLayout.LayoutParams.MATCH_PARENT);
- input.setLayoutParams(lp);
- AlertDialog dialog = new AlertDialog.Builder(getContext())
- .setTitle(R.string.delete_account)
- .setMessage(R.string.delete_account_description)
- .setPositiveButton(R.string.delete_account_confirmation, ((thisDialog, which) -> {
- thisDialog.dismiss();
- deleteAccount(input.getText().toString());
- }))
- .setNegativeButton(R.string.nevermind, ((thisDialog, which) -> thisDialog.dismiss()))
- .create();
- dialog.setOnShowListener(arg0 -> dialog.getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(ContextCompat.getColor(getContext(), R.color.red_10)));
- dialog.setView(input);
- dialog.show();
- }
-
- private void deleteAccount(String password) {
- ProgressDialog dialog = ProgressDialog.show(getContext(), getContext().getString(R.string.deleting_account), null, true);
- userRepository.deleteAccount(password).subscribe(user -> {
- HabiticaApplication.logout(getContext());
- getActivity().finish();
- }, throwable -> {
- dialog.dismiss();
- RxErrorHandler.reportError(throwable);
- });
- }
-
- private void showAccountResetConfirmation() {
- AlertDialog dialog = new AlertDialog.Builder(getContext())
- .setTitle(R.string.reset_account)
- .setMessage(R.string.reset_account_description)
- .setPositiveButton(R.string.reset_account_confirmation, ((thisDialog, which) -> {
- thisDialog.dismiss();
- resetAccount();
- }))
- .setNegativeButton(R.string.nevermind, ((thisDialog, which) -> thisDialog.dismiss()))
- .create();
- dialog.setOnShowListener(arg0 -> dialog.getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(ContextCompat.getColor(getContext(), R.color.red_10)));
- dialog.show();
- }
-
- private void resetAccount() {
- ProgressDialog dialog = ProgressDialog.show(getContext(), getContext().getString(R.string.resetting_account), null, true);
- userRepository.resetAccount().subscribe(user -> dialog.dismiss(), throwable -> {
- dialog.dismiss();
- RxErrorHandler.reportError(throwable);
- });
- }
-
- private void showSubscriptionStatusDialog() {
- SubscriptionDetailsView view = new SubscriptionDetailsView(getContext());
- view.setPlan(user.getPurchased().getPlan());
- final AlertDialog dialog = new AlertDialog.Builder(getContext())
- .setView(view)
- .setTitle(R.string.subscription_status)
- .setPositiveButton(R.string.close, (dialogInterface, i) -> dialogInterface.dismiss()).create();
- dialog.show();
- }
-}
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
new file mode 100644
index 000000000..6065e0cbc
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AuthenticationPreferenceFragment.kt
@@ -0,0 +1,145 @@
+package com.habitrpg.android.habitica.ui.fragments.preferences
+
+import android.app.ProgressDialog
+import android.content.ClipData
+import android.content.ClipboardManager
+import android.content.Context
+import android.content.DialogInterface
+import android.content.SharedPreferences
+import android.os.Bundle
+import android.support.v4.content.ContextCompat
+import android.support.v7.app.AlertDialog
+import android.support.v7.preference.EditTextPreference
+import android.support.v7.preference.Preference
+import android.support.v7.preference.PreferenceCategory
+import android.widget.EditText
+import android.widget.LinearLayout
+import android.widget.Toast
+import com.habitrpg.android.habitica.HabiticaApplication
+import com.habitrpg.android.habitica.HabiticaBaseApplication
+import com.habitrpg.android.habitica.R
+import com.habitrpg.android.habitica.events.commands.OpenGemPurchaseFragmentCommand
+import com.habitrpg.android.habitica.helpers.QrCodeManager
+import com.habitrpg.android.habitica.helpers.RxErrorHandler
+import com.habitrpg.android.habitica.models.user.User
+import com.habitrpg.android.habitica.ui.views.subscriptions.SubscriptionDetailsView
+import org.greenrobot.eventbus.EventBus
+import rx.Observable
+import rx.functions.Action1
+
+class AuthenticationPreferenceFragment: BasePreferencesFragment() {
+
+ override var user: User? = null
+ set(value) {
+ field = value
+ updateUserFields()
+ }
+
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ HabiticaBaseApplication.getComponent().inject(this)
+ super.onCreate(savedInstanceState)
+ }
+
+ private fun updateUserFields() {
+ configurePreference(findPreference("display_name"), user?.profile?.name)
+ configurePreference(findPreference("photo_url"), user?.profile?.imageUrl)
+ configurePreference(findPreference("about"), user?.profile?.blurb)
+ }
+
+ private fun configurePreference(preference: Preference?, value: String?) {
+ val editPreference = preference as? EditTextPreference
+ editPreference?.text = value
+ preference?.summary = value
+ }
+
+ override fun setupPreferences() {
+ updateUserFields()
+ }
+
+ override fun onPreferenceTreeClick(preference: Preference): Boolean {
+ when (preference.key) {
+ "subscription_status" -> {
+ if (user != null && user!!.purchased != null && user!!.purchased.plan != null) {
+ val plan = user!!.purchased.plan
+ if (plan.isActive) {
+ showSubscriptionStatusDialog()
+ return super.onPreferenceTreeClick(preference)
+ }
+ }
+ EventBus.getDefault().post(OpenGemPurchaseFragmentCommand())
+ }
+ "reset_account" -> showAccountResetConfirmation()
+ "delete_account" -> showAccountDeleteConfirmation()
+ else -> {
+ val clipMan = activity.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
+ clipMan.primaryClip = ClipData.newPlainText(preference.key, preference.summary)
+ Toast.makeText(activity, "Copied " + preference.key + " to clipboard.", Toast.LENGTH_SHORT).show()
+ }
+ }
+ return super.onPreferenceTreeClick(preference)
+ }
+
+ private fun showAccountDeleteConfirmation() {
+ val input = EditText(context)
+ val lp = LinearLayout.LayoutParams(
+ LinearLayout.LayoutParams.MATCH_PARENT,
+ LinearLayout.LayoutParams.MATCH_PARENT)
+ input.layoutParams = lp
+ val dialog = AlertDialog.Builder(context)
+ .setTitle(R.string.delete_account)
+ .setMessage(R.string.delete_account_description)
+ .setPositiveButton(R.string.delete_account_confirmation) { thisDialog, _ ->
+ thisDialog.dismiss()
+ deleteAccount(input.text.toString())
+ }
+ .setNegativeButton(R.string.nevermind) { thisDialog, _ -> thisDialog.dismiss() }
+ .create()
+ dialog.setOnShowListener { _ -> dialog.getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(ContextCompat.getColor(context, R.color.red_10)) }
+ dialog.setView(input)
+ dialog.show()
+ }
+
+ private fun deleteAccount(password: String) {
+ val dialog = ProgressDialog.show(context, context.getString(R.string.deleting_account), null, true)
+ userRepository.deleteAccount(password).subscribe({ _ ->
+ HabiticaApplication.logout(context)
+ activity.finish()
+ }) { throwable ->
+ dialog.dismiss()
+ RxErrorHandler.reportError(throwable)
+ }
+ }
+
+ private fun showAccountResetConfirmation() {
+ val dialog = AlertDialog.Builder(context)
+ .setTitle(R.string.reset_account)
+ .setMessage(R.string.reset_account_description)
+ .setPositiveButton(R.string.reset_account_confirmation) { thisDialog, _ ->
+ thisDialog.dismiss()
+ resetAccount()
+ }
+ .setNegativeButton(R.string.nevermind) { thisDialog, _ -> thisDialog.dismiss() }
+ .create()
+ dialog.setOnShowListener { _ -> dialog.getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(ContextCompat.getColor(context, R.color.red_10)) }
+ dialog.show()
+ }
+
+ private fun resetAccount() {
+ val dialog = ProgressDialog.show(context, context.getString(R.string.resetting_account), null, true)
+ userRepository.resetAccount().subscribe({ _ -> dialog.dismiss() }) { throwable ->
+ dialog.dismiss()
+ RxErrorHandler.reportError(throwable)
+ }
+ }
+
+ private fun showSubscriptionStatusDialog() {
+ val view = SubscriptionDetailsView(context)
+ view.setPlan(user?.purchased?.plan)
+ val dialog = AlertDialog.Builder(context)
+ .setView(view)
+ .setTitle(R.string.subscription_status)
+ .setPositiveButton(R.string.close) { dialogInterface, _ -> dialogInterface.dismiss() }.create()
+ dialog.show()
+ }
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/BasePreferencesFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/BasePreferencesFragment.java
deleted file mode 100644
index 56ecddf5b..000000000
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/BasePreferencesFragment.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.habitrpg.android.habitica.ui.fragments.preferences;
-
-import android.os.Bundle;
-import android.support.v7.preference.PreferenceFragmentCompat;
-
-import com.habitrpg.android.habitica.R;
-
-public abstract class BasePreferencesFragment extends PreferenceFragmentCompat {
-
- @Override
- public void onCreatePreferences(Bundle bundle, String rootKey) {
- setPreferencesFromResource(R.xml.preferences_fragment, rootKey);
- setupPreferences();
- }
-
- protected abstract void setupPreferences();
-
-}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/BasePreferencesFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/BasePreferencesFragment.kt
new file mode 100644
index 000000000..eabe1b180
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/BasePreferencesFragment.kt
@@ -0,0 +1,48 @@
+package com.habitrpg.android.habitica.ui.fragments.preferences
+
+import android.content.SharedPreferences
+import android.os.Bundle
+import android.support.v7.preference.PreferenceFragmentCompat
+import com.habitrpg.android.habitica.HabiticaBaseApplication
+
+import com.habitrpg.android.habitica.R
+import com.habitrpg.android.habitica.data.UserRepository
+import com.habitrpg.android.habitica.helpers.QrCodeManager
+import com.habitrpg.android.habitica.helpers.RxErrorHandler
+import com.habitrpg.android.habitica.models.user.User
+import com.habitrpg.android.habitica.modules.AppModule
+import rx.functions.Action1
+import java.util.*
+import javax.inject.Inject
+import javax.inject.Named
+
+abstract class BasePreferencesFragment : PreferenceFragmentCompat() {
+
+ @Inject
+ lateinit var userRepository: UserRepository
+ @field:[Inject Named(AppModule.NAMED_USER_ID)]
+ lateinit var userId: String
+
+ internal open var user: User? = null
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ userRepository.getUser(userId).first().subscribe(Action1 {
+ this.user = it
+ }, RxErrorHandler.handleEmptyError())
+ }
+
+ override fun onDestroy() {
+ userRepository.close()
+ super.onDestroy()
+ }
+
+ override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
+ setPreferencesFromResource(R.xml.preferences_fragment, rootKey)
+ setupPreferences()
+ }
+
+ protected abstract fun setupPreferences()
+
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java
index 229ada7a2..98f706884 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.java
@@ -57,9 +57,9 @@ public class PreferencesFragment extends BasePreferencesFragment implements
@Override
public void onCreate(Bundle savedInstanceState) {
+ HabiticaBaseApplication.getComponent().inject(this);
super.onCreate(savedInstanceState);
- HabiticaBaseApplication.getComponent().inject(this);
context = getActivity();
String userID = getPreferenceManager().getSharedPreferences().getString(context.getString(R.string.SP_userID), null);
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/ProfilePreferencesFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/ProfilePreferencesFragment.kt
new file mode 100644
index 000000000..d1ea4d57f
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/ProfilePreferencesFragment.kt
@@ -0,0 +1,66 @@
+package com.habitrpg.android.habitica.ui.fragments.preferences
+
+import android.content.SharedPreferences
+import android.os.Bundle
+import android.support.v7.preference.EditTextPreference
+import android.support.v7.preference.Preference
+import android.support.v7.preference.PreferenceCategory
+import com.habitrpg.android.habitica.HabiticaBaseApplication
+import com.habitrpg.android.habitica.helpers.RxErrorHandler
+import com.habitrpg.android.habitica.models.user.User
+import rx.Observable
+import rx.functions.Action1
+
+class ProfilePreferencesFragment: BasePreferencesFragment(), SharedPreferences.OnSharedPreferenceChangeListener {
+
+ override var user: User? = null
+ set(value) {
+ field = value
+ updateUserFields()
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ HabiticaBaseApplication.getComponent().inject(this)
+ super.onCreate(savedInstanceState)
+ }
+
+ override fun onResume() {
+ super.onResume()
+ preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(this)
+
+ }
+
+ override fun onPause() {
+ preferenceManager.sharedPreferences.unregisterOnSharedPreferenceChangeListener(this)
+ super.onPause()
+ }
+
+ private fun updateUserFields() {
+ configurePreference(findPreference("display_name"), user?.profile?.name)
+ configurePreference(findPreference("photo_url"), user?.profile?.imageUrl)
+ configurePreference(findPreference("about"), user?.profile?.blurb)
+ }
+
+ private fun configurePreference(preference: Preference?, value: String?) {
+ val editPreference = preference as? EditTextPreference
+ editPreference?.text = value
+ preference?.summary = value
+ }
+
+ override fun setupPreferences() {
+ updateUserFields()
+ }
+
+ override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
+ val profileCategory = findPreference("profile") as? PreferenceCategory
+ configurePreference(profileCategory?.findPreference(key), sharedPreferences?.getString(key, ""))
+ val observable: Observable? = when (key) {
+ "display_name" -> userRepository.updateUser(user, "profile.name", sharedPreferences?.getString(key, ""))
+ "photo_url" -> userRepository.updateUser(user, "profile.photo", sharedPreferences?.getString(key, ""))
+ "about" -> userRepository.updateUser(user, "profile.blurb", sharedPreferences?.getString(key, ""))
+ else -> null
+ }
+ observable?.subscribe(Action1 {}, RxErrorHandler.handleEmptyError())
+ }
+
+}
\ No newline at end of file