diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml
index 2adc5f858..8b95d4ebb 100644
--- a/Habitica/res/values/strings.xml
+++ b/Habitica/res/values/strings.xml
@@ -328,5 +328,6 @@ To start, which parts of your life do you want to improve?
Change your class
Change your class and refund your attribute points for 3 gems.
Enable Class System
+ Changing Class
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarWithBarsViewModel.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarWithBarsViewModel.java
index 20b888291..510504630 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarWithBarsViewModel.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarWithBarsViewModel.java
@@ -92,7 +92,7 @@ public class AvatarWithBarsViewModel implements View.OnClickListener {
mpBar.valueBarLayout.setVisibility((stats.get_class() == null || stats.getLvl() < 10 || user.getPreferences().getDisableClasses()) ? View.GONE : View.VISIBLE);
- if (user.getPreferences().getDisableClasses() || !user.getFlags().getClassSelected()) {
+ if (user.getPreferences() != null && user.getFlags() != null && (user.getPreferences().getDisableClasses() || !user.getFlags().getClassSelected())) {
lvlText.setText(context.getString(R.string.user_level, user.getStats().getLvl()));
lvlText.setCompoundDrawables(null, null, null, null);
} else {
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ClassSelectionActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ClassSelectionActivity.java
index fad6e05ba..49ef3b30f 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ClassSelectionActivity.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ClassSelectionActivity.java
@@ -1,5 +1,6 @@
package com.habitrpg.android.habitica.ui.activities;
+import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
@@ -7,7 +8,11 @@ import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView;
+import com.habitrpg.android.habitica.APIHelper;
+import com.habitrpg.android.habitica.HabiticaApplication;
import com.habitrpg.android.habitica.R;
+import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback;
+import com.habitrpg.android.habitica.callbacks.MergeUserCallback;
import com.habitrpg.android.habitica.userpicture.UserPicture;
import com.magicmicky.habitrpgwrapper.lib.models.Gear;
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
@@ -16,12 +21,20 @@ import com.magicmicky.habitrpgwrapper.lib.models.Items;
import com.magicmicky.habitrpgwrapper.lib.models.Outfit;
import com.magicmicky.habitrpgwrapper.lib.models.Preferences;
+import java.util.HashMap;
+import java.util.Map;
+
import butterknife.Bind;
import butterknife.OnClick;
+import retrofit.Callback;
+import retrofit.RetrofitError;
+import retrofit.client.Response;
-public class ClassSelectionActivity extends BaseActivity {
+public class ClassSelectionActivity extends BaseActivity implements Callback {
Boolean isInitialSelection;
+ Boolean classWasUnset = false;
+ Boolean shouldFinish = false;
@Bind(R.id.healerImageView)
ImageView healerImageView;
@@ -32,6 +45,10 @@ public class ClassSelectionActivity extends BaseActivity {
@Bind(R.id.warriorImageView)
ImageView warriorImageView;
+ APIHelper apiHelper;
+
+ ProgressDialog progressDialog;
+
@Override
protected int getLayoutResId() {
return R.layout.activity_class_selection;
@@ -41,6 +58,8 @@ public class ClassSelectionActivity extends BaseActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ this.apiHelper = HabiticaApplication.ApiHelper;
+
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
isInitialSelection = bundle.getBoolean("isInitialSelection");
@@ -96,6 +115,10 @@ public class ClassSelectionActivity extends BaseActivity {
UserPicture warriorUserPicture = new UserPicture(this);
warriorUserPicture.setUser(warrior);
warriorUserPicture.setPictureOn(warriorImageView);
+
+ if (!isInitialSelection) {
+ apiHelper.apiService.changeClass(this);
+ }
}
public HabitRPGUser makeUser(Preferences preferences, Outfit outfit) {
@@ -129,34 +152,69 @@ public class ClassSelectionActivity extends BaseActivity {
@OnClick(R.id.optOutWrapper)
public void optOutSelected() {
+ if (!this.isInitialSelection && !this.classWasUnset) {
+ return;
+ }
AlertDialog alert = new AlertDialog.Builder(this)
.setTitle(getString(R.string.opt_out_confirmation))
.setNegativeButton(getString(R.string.dialog_go_back), (dialog, which) -> {
dialog.dismiss();
})
.setPositiveButton(getString(R.string.opt_out_class), (dialog, which) -> {
- Intent intent = new Intent();
- intent.putExtra("optedOut", true);
- setResult(MainActivity.SELECT_CLASS_RESULT, intent);
- finish();
+ optOutOfClasses();
}).create();
alert.show();
}
private void displayConfirmationDialogForClass(String className, String classIdentifier) {
+ if (!this.isInitialSelection && !this.classWasUnset) {
+ return;
+ }
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle(getString(R.string.class_confirmation, className))
.setNegativeButton(getString(R.string.dialog_go_back), (dialog, which) -> {
dialog.dismiss();
})
.setPositiveButton(getString(R.string.choose_class), (dialog, which) -> {
-
- Intent intent = new Intent();
- intent.putExtra("selectedClass", classIdentifier);
- setResult(MainActivity.SELECT_CLASS_RESULT, intent);
- finish();
+ selectClass(classIdentifier);
});
AlertDialog alert = builder.create();
alert.show();
}
+
+ private void optOutOfClasses() {
+ shouldFinish = true;
+ this.displayProgressDialog();
+ Map updateData = new HashMap<>();
+ updateData.put("preferences.disableClasses", true);
+ updateData.put("flags.classSelected", true);
+ apiHelper.apiService.updateUser(updateData, this);
+ }
+
+ private void selectClass(String selectedClass) {
+ shouldFinish = true;
+ this.displayProgressDialog();
+ apiHelper.apiService.changeClass(selectedClass, this);
+ }
+
+ @Override
+ public void success(HabitRPGUser habitRPGUser, Response response) {
+ this.classWasUnset = true;
+ if (shouldFinish) {
+ if (progressDialog != null) {
+ progressDialog.dismiss();
+ }
+ setResult(MainActivity.SELECT_CLASS_RESULT);
+ finish();
+ }
+ }
+
+ @Override
+ public void failure(RetrofitError error) {
+ shouldFinish = false;
+ }
+
+ private void displayProgressDialog() {
+ progressDialog = ProgressDialog.show(this, getString(R.string.changing_class_progress), null, true);
+ }
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java
index a5bb12ea9..34b51ed0f 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java
@@ -572,6 +572,10 @@ public class MainActivity extends BaseActivity implements HabitRPGUserCallback.O
});
accountHeader.updateProfile(profile);
+ if (user.getPreferences() == null || user.getFlags() == null) {
+ return;
+ }
+
IDrawerItem item = drawer.getDrawerItem(MainDrawerBuilder.SIDEBAR_SKILLS);
if (user.getPreferences().getDisableClasses() || !user.getFlags().getClassSelected()) {
if (item != null) {
@@ -638,16 +642,8 @@ public class MainActivity extends BaseActivity implements HabitRPGUserCallback.O
super.onActivityResult(requestCode, resultCode, data);
checkout.onActivityResult(requestCode, resultCode, data);
if (resultCode == SELECT_CLASS_RESULT) {
- if (data.getBooleanExtra("optedOut", false)) {
- Map updateData = new HashMap<>();
- updateData.put("preferences.disableClasses", true);
- updateData.put("flags.classSelected", true);
- mAPIHelper.apiService.updateUser(updateData, new HabitRPGUserCallback(this));
- } else {
- String selectedClass = data.getStringExtra("selectedClass");
- if (selectedClass != null) {
- mAPIHelper.apiService.changeClass(selectedClass, new MergeUserCallback(this, this.user));
- }
+ if (this.mAPIHelper != null) {
+ this.mAPIHelper.retrieveUser(new HabitRPGUserCallback(this));
}
}
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/PreferencesFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/PreferencesFragment.java
index bba6b603d..4b3ac21d8 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/PreferencesFragment.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/PreferencesFragment.java
@@ -81,24 +81,6 @@ public class PreferencesFragment extends BasePreferencesFragment implements
super.onPause();
}
- @Override
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- if (resultCode == MainActivity.SELECT_CLASS_RESULT) {
- if (data.getBooleanExtra("optedOut", false)) {
- Map updateData = new HashMap<>();
- updateData.put("preferences.disableClasses", true);
- updateData.put("flags.classSelected", true);
- apiHelper.apiService.updateUser(updateData, this);
- } else {
- String selectedClass = data.getStringExtra("selectedClass");
- if (selectedClass != null) {
- apiHelper.apiService.changeClass(selectedClass, this);
- }
- }
- }
- }
-
private TransactionListener userTransactionListener = new TransactionListener() {
@Override
public void onResultReceived(HabitRPGUser habitRPGUser) {
@@ -131,7 +113,11 @@ public class PreferencesFragment extends BasePreferencesFragment implements
bundle.putString("hairColor", user.getPreferences().getHair().getColor());
bundle.putInt("hairMustache", user.getPreferences().getHair().getMustache());
bundle.putInt("hairBeard", user.getPreferences().getHair().getBeard());
- bundle.putBoolean("isInitialSelection", false);
+ if (!user.getFlags().getClassSelected()) {
+ bundle.putBoolean("isInitialSelection", true);
+ } else {
+ bundle.putBoolean("isInitialSelection", false);
+ }
Intent intent = new Intent(getActivity(), ClassSelectionActivity.class);
intent.putExtras(bundle);
diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java
index 0f62583fe..4c36103de 100644
--- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java
+++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java
@@ -121,6 +121,9 @@ public interface ApiService {
@POST("/user/class/cast/{skill}")
void useSkill(@Path("skill") String skillName, @Query("targetType") String targetType, Callback habitRPGUserCallback);
+ @POST("/user/class/change")
+ void changeClass(Callback cb);
+
@POST("/user/class/change")
void changeClass(@Query("class") String className, Callback cb);