mirror of
https://github.com/sudoxnym/habitica-android.git
synced 2026-08-02 04:00:52 +00:00
fix buying customizations
This commit is contained in:
parent
7086d30cc6
commit
3f55878786
7 changed files with 83 additions and 38 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue