fix buying customizations

This commit is contained in:
Phillip Thelen 2017-04-27 21:05:52 +02:00
parent 7086d30cc6
commit 3f55878786
7 changed files with 83 additions and 38 deletions

View file

@ -3,7 +3,10 @@ package com.habitrpg.android.habitica.data;
import android.support.annotation.Nullable;
import com.habitrpg.android.habitica.models.Skill;
import com.habitrpg.android.habitica.models.inventory.Customization;
import com.habitrpg.android.habitica.models.inventory.CustomizationSet;
import com.habitrpg.android.habitica.models.responses.SkillResponse;
import com.habitrpg.android.habitica.models.responses.UnlockResponse;
import com.habitrpg.android.habitica.models.user.User;
import java.util.List;
@ -40,4 +43,7 @@ public interface UserRepository extends BaseRepository {
Observable<User> disableClasses();
Observable<User> changeClass(String selectedClass);
Observable<UnlockResponse> unlockPath(User user, Customization customization);
Observable<UnlockResponse> unlockPath(User user, CustomizationSet set);
}

View file

@ -6,8 +6,10 @@ import com.habitrpg.android.habitica.data.local.UserLocalRepository;
import com.habitrpg.android.habitica.helpers.ReactiveErrorHandler;
import com.habitrpg.android.habitica.models.Skill;
import com.habitrpg.android.habitica.models.TutorialStep;
import com.habitrpg.android.habitica.models.inventory.Customization;
import com.habitrpg.android.habitica.models.inventory.CustomizationSet;
import com.habitrpg.android.habitica.models.responses.SkillResponse;
import com.habitrpg.android.habitica.models.tasks.RemindersItem;
import com.habitrpg.android.habitica.models.responses.UnlockResponse;
import com.habitrpg.android.habitica.models.user.User;
import java.util.Date;
@ -139,6 +141,40 @@ public class UserRepositoryImpl extends BaseRepositoryImpl<UserLocalRepository>
return changeClass(selectedClass);
}
@Override
public Observable<UnlockResponse> unlockPath(User user, Customization customization) {
return apiClient.unlockPath(customization.getPath())
.doOnNext(unlockResponse -> {
User copiedUser = localRepository.getUnmanagedCopy(user);
copiedUser.setPreferences(unlockResponse.preferences);
copiedUser.setPurchased(unlockResponse.purchased);
copiedUser.setItems(unlockResponse.items);
copiedUser.setBalance(copiedUser.getBalance()-customization.getPrice()/4.0);
localRepository.saveUser(copiedUser);
});
}
@Override
public Observable<UnlockResponse> unlockPath(User user, CustomizationSet set) {
String path = "";
for (Customization customization : set.customizations) {
path = path + "," + customization.getPath();
}
if (path.length() == 0) {
return Observable.empty();
}
path = path.substring(1);
return apiClient.unlockPath(path)
.doOnNext(unlockResponse -> {
User copiedUser = localRepository.getUnmanagedCopy(user);
copiedUser.setPreferences(unlockResponse.preferences);
copiedUser.setPurchased(unlockResponse.purchased);
copiedUser.setItems(unlockResponse.items);
copiedUser.setBalance(copiedUser.getBalance()-set.price/4.0);
localRepository.saveUser(copiedUser);
});
}
private User mergeUser(User oldUser, User newUser) {
User copiedUser = localRepository.getUnmanagedCopy(oldUser);
if (newUser.getItems() != null) {

View file

@ -1,5 +1,7 @@
package com.habitrpg.android.habitica.models.inventory;
import java.util.List;
/**
* Created by viirus on 19/01/16.
*/
@ -10,4 +12,5 @@ public class CustomizationSet {
public Integer price;
public boolean hasPurchasable;
public List<Customization> customizations;
}

View file

@ -4,6 +4,7 @@ import com.habitrpg.android.habitica.models.inventory.Customization;
import java.util.List;
import io.realm.RealmList;
import io.realm.RealmObject;
import io.realm.annotations.Ignore;
import io.realm.annotations.PrimaryKey;
@ -13,8 +14,7 @@ public class Purchases extends RealmObject {
@PrimaryKey
private String userId;
@Ignore
public List<Customization> customizations;
public RealmList<Customization> customizations;
User user;
private SubscriptionPlan plan;
@ -22,7 +22,7 @@ public class Purchases extends RealmObject {
return customizations;
}
public void setCustomizations(List<Customization> customizations) {
public void setCustomizations(RealmList<Customization> customizations) {
this.customizations = customizations;
}

View file

@ -25,6 +25,8 @@ import com.habitrpg.android.habitica.ui.menu.MainDrawerBuilder;
import org.greenrobot.eventbus.EventBus;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -43,6 +45,8 @@ public class CustomizationRecyclerViewAdapter extends RecyclerView.Adapter<Recyc
private String activeCustomization;
private PublishSubject<Customization> selectCustomizationEvents = PublishSubject.create();
private PublishSubject<Customization> unlockCustomizationEvents = PublishSubject.create();
private PublishSubject<CustomizationSet> unlockSetEvents = PublishSubject.create();
public void updateOwnership(List<String> ownedCustomizations) {
int position = 0;
@ -146,6 +150,14 @@ public class CustomizationRecyclerViewAdapter extends RecyclerView.Adapter<Recyc
return selectCustomizationEvents.asObservable();
}
public Observable<Customization> getUnlockCustomizationEvents() {
return unlockCustomizationEvents.asObservable();
}
public Observable<CustomizationSet> getUnlockSetEvents() {
return unlockSetEvents.asObservable();
}
class CustomizationViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
@BindView(R.id.card_view)
@ -164,7 +176,7 @@ public class CustomizationRecyclerViewAdapter extends RecyclerView.Adapter<Recyc
Context context;
public CustomizationViewHolder(View itemView) {
CustomizationViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
@ -211,16 +223,11 @@ public class CustomizationRecyclerViewAdapter extends RecyclerView.Adapter<Recyc
EventBus.getDefault().post(event);
return;
}
UnlockPathCommand event = new UnlockPathCommand();
event.path = customization.getPath();
event.balanceDiff = customization.getPrice() / 4;
EventBus.getDefault().post(event);
unlockCustomizationEvents.onNext(customization);
})
.setTitle(context.getString(R.string.purchase_customization))
.setView(dialogContent)
.setNegativeButton(R.string.reward_dialog_dismiss, (dialog1, which) -> {
dialog1.dismiss();
}).create();
.setNegativeButton(R.string.reward_dialog_dismiss, (dialog1, which) -> dialog1.dismiss()).create();
dialog.show();
return;
}
@ -242,7 +249,7 @@ public class CustomizationRecyclerViewAdapter extends RecyclerView.Adapter<Recyc
Context context;
private CustomizationSet set;
public SectionViewHolder(View itemView) {
SectionViewHolder(View itemView) {
super(itemView);
context = itemView.getContext();
ButterKnife.bind(this, itemView);
@ -275,26 +282,20 @@ public class CustomizationRecyclerViewAdapter extends RecyclerView.Adapter<Recyc
EventBus.getDefault().post(event);
return;
}
UnlockPathCommand event = new UnlockPathCommand();
String path = "";
set.customizations = new ArrayList<>();
for (Object obj : customizationList) {
if (obj.getClass().equals(Customization.class)) {
if (Customization.class.isAssignableFrom(obj.getClass())) {
Customization customization = (Customization) obj;
if (!customization.isUsable() && customization.getCustomizationSet() != null && customization.getCustomizationSet().equals(set.identifier)) {
path = path + "," + customization.getPath();
set.customizations.add(customization);
}
}
}
path = path.substring(1);
event.path = path;
event.balanceDiff = set.price / 4;
EventBus.getDefault().post(event);
unlockSetEvents.onNext(set);
})
.setTitle(context.getString(R.string.purchase_set_title, set.text))
.setView(dialogContent)
.setNegativeButton(R.string.reward_dialog_dismiss, (dialog1, which) -> {
dialog1.dismiss();
}).create();
.setNegativeButton(R.string.reward_dialog_dismiss, (dialog1, which) -> dialog1.dismiss()).create();
dialog.show();
}
}

View file

@ -59,6 +59,12 @@ public class AvatarCustomizationFragment extends BaseMainFragment {
return userRepository.updateUser(user, updatePath, customization.getIdentifier());
})
.subscribe(user1 -> {}, ReactiveErrorHandler.handleEmptyError()));
compositeSubscription.add(adapter.getUnlockCustomizationEvents()
.flatMap(customization -> userRepository.unlockPath(user, customization))
.subscribe(unlockResponse -> {}, ReactiveErrorHandler.handleEmptyError()));
compositeSubscription.add(adapter.getUnlockSetEvents()
.flatMap(set -> userRepository.unlockPath(user, set))
.subscribe(unlockResponse -> {}, ReactiveErrorHandler.handleEmptyError()));
layoutManager = new GridLayoutManager(activity, 2);
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {

View file

@ -8,10 +8,6 @@ import com.google.gson.JsonParseException;
import com.habitrpg.android.habitica.models.inventory.Customization;
import com.habitrpg.android.habitica.models.user.Purchases;
import com.habitrpg.android.habitica.models.user.SubscriptionPlan;
import com.raizlabs.android.dbflow.runtime.TransactionManager;
import com.raizlabs.android.dbflow.runtime.transaction.process.ProcessModelInfo;
import com.raizlabs.android.dbflow.runtime.transaction.process.SaveModelTransaction;
import com.raizlabs.android.dbflow.sql.language.Select;
import java.lang.reflect.Type;
import java.util.ArrayList;
@ -19,22 +15,22 @@ import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* Created by viirus on 14/01/16.
*/
import io.realm.Realm;
import io.realm.RealmList;
public class PurchasedDeserializer implements JsonDeserializer<Purchases> {
@Override
public Purchases deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject object = json.getAsJsonObject();
List<Customization> customizations = new ArrayList<Customization>();
RealmList<Customization> customizations = new RealmList<>();
Purchases purchases = new Purchases();
List<Customization> existingCustomizations;
try {
// TODO: fix this
existingCustomizations = new ArrayList<>();
Realm realm = Realm.getDefaultInstance();
existingCustomizations = realm.copyFromRealm(realm.where(Customization.class).findAll());
realm.close();
} catch (RuntimeException e) {
//Tests don't have a database
existingCustomizations = new ArrayList<>();
@ -72,9 +68,6 @@ public class PurchasedDeserializer implements JsonDeserializer<Purchases> {
}
}
// TODO: fix this
//TransactionManager.getInstance().addTransaction(new SaveModelTransaction<>(ProcessModelInfo.withModels(customizations)));
purchases.customizations = customizations;
purchases.setPlan(context.deserialize(object.get("plan"), SubscriptionPlan.class));