From 8654e038f6fa571205137bbfca87de9d1d5e63f7 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Fri, 15 Apr 2016 14:00:53 +0200 Subject: [PATCH] handle class selection correctly --- Habitica/res/values/strings.xml | 1 + .../habitica/ui/AvatarWithBarsViewModel.java | 2 +- .../ui/activities/ClassSelectionActivity.java | 78 ++++++++++++++++--- .../habitica/ui/activities/MainActivity.java | 16 ++-- .../ui/fragments/PreferencesFragment.java | 24 ++---- .../habitrpgwrapper/lib/api/ApiService.java | 3 + 6 files changed, 84 insertions(+), 40 deletions(-) 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);