diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index 12380ffe0..b354309c0 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -2,8 +2,8 @@ diff --git a/Habitica/res/values/strings.constants.xml b/Habitica/res/values/strings.constants.xml index f0165b571..d7fa147da 100644 --- a/Habitica/res/values/strings.constants.xml +++ b/Habitica/res/values/strings.constants.xml @@ -6,7 +6,7 @@ APIToken Username E-mail - https://habitica.com + https://habitrpg-staging.herokuapp.com ACCEPT_PARTY_INVITE diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/BaseRepository.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/BaseRepository.java index 2b96acc8f..9d93ff24c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/BaseRepository.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/BaseRepository.java @@ -10,4 +10,6 @@ public interface BaseRepository { T getUnmanagedCopy(T object); List getUnmanagedCopy(List list); + + boolean isClosed(); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/SocialRepository.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/SocialRepository.java index 1841059fd..45498d9ec 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/SocialRepository.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/SocialRepository.java @@ -1,5 +1,6 @@ package com.habitrpg.android.habitica.data; +import com.habitrpg.android.habitica.models.AchievementResult; import com.habitrpg.android.habitica.models.inventory.Quest; import com.habitrpg.android.habitica.models.members.Member; import com.habitrpg.android.habitica.models.responses.PostChatMessageResult; @@ -72,4 +73,6 @@ public interface SocialRepository extends BaseRepository { Observable rejectGroupInvite(String groupId); Observable forceStartQuest(Group party); + + Observable getMemberAchievements(String userId); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.java index 0908a9c76..2a950147a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.java @@ -7,6 +7,7 @@ import android.util.Log; import com.amplitude.api.Amplitude; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.google.gson.JsonSyntaxException; import com.google.gson.reflect.TypeToken; import com.habitrpg.android.habitica.BuildConfig; import com.habitrpg.android.habitica.HabiticaBaseApplication; @@ -117,7 +118,6 @@ import okhttp3.ResponseBody; import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Converter; import retrofit2.HttpException; -import retrofit2.Response; import retrofit2.Retrofit; import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; @@ -157,6 +157,7 @@ public class ApiClientImpl implements Action1, ApiClient { .doOnError(this); private AlertDialog displayedAlert; private String languageCode; + private String lastAPICallURL; //private OnHabitsAPIResult mResultListener; //private HostConfig mConfig; @@ -194,8 +195,10 @@ public class ApiClientImpl implements Action1, ApiClient { if (userAgent != null) { builder = builder.header("user-agent", userAgent); } + builder = builder.addHeader("Authorization", "Basic " + BuildConfig.STAGING_KEY); Request request = builder.method(original.method(), original.body()) .build(); + lastAPICallURL = original.url().toString(); return chain.proceed(request); }) .build(); @@ -326,18 +329,23 @@ public class ApiClientImpl implements Action1, ApiClient { } else { showConnectionProblemDialog(R.string.internal_error_api); } + } else if (JsonSyntaxException.class.isAssignableFrom(throwableClass)) { + crashlyticsProxy.log("Json Error: " + lastAPICallURL + ", " + throwable.getMessage()); } else { crashlyticsProxy.logException(throwable); } } public ErrorResponse getErrorResponse(HttpException error) { - Response response = error.response(); + ResponseBody errorResponse = error.response().errorBody(); + if (errorResponse == null) { + return new ErrorResponse(); + } Converter errorConverter = gsonConverter .responseBodyConverter(ErrorResponse.class, new Annotation[0], retrofitAdapter); try { - return (ErrorResponse) errorConverter.convert(response.errorBody()); + return (ErrorResponse) errorConverter.convert(errorResponse); } catch (IOException e) { return new ErrorResponse(); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/BaseRepositoryImpl.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/BaseRepositoryImpl.java index 6c9b2d207..cc131f29a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/BaseRepositoryImpl.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/BaseRepositoryImpl.java @@ -27,6 +27,11 @@ public abstract class BaseRepositoryImpl implemen return localRepository.getUnmanagedCopy(list); } + @Override + public boolean isClosed() { + return localRepository.isClosed(); + } + @Override public T getUnmanagedCopy(T object) { return localRepository.getUnmanagedCopy(object); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.java index 538d48be8..1a44b8afc 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.java @@ -4,6 +4,7 @@ import com.habitrpg.android.habitica.data.ApiClient; import com.habitrpg.android.habitica.data.SocialRepository; import com.habitrpg.android.habitica.data.local.SocialLocalRepository; import com.habitrpg.android.habitica.helpers.RxErrorHandler; +import com.habitrpg.android.habitica.models.AchievementResult; import com.habitrpg.android.habitica.models.inventory.Quest; import com.habitrpg.android.habitica.models.members.Member; import com.habitrpg.android.habitica.models.responses.PostChatMessageResult; @@ -18,8 +19,6 @@ import java.util.Map; import io.realm.RealmResults; import rx.Observable; -import rx.functions.Action1; -import rx.functions.Func2; public class SocialRepositoryImpl extends BaseRepositoryImpl implements SocialRepository { @@ -55,11 +54,17 @@ public class SocialRepositoryImpl extends BaseRepositoryImpl flagMessage(ChatMessage chatMessage) { + if (chatMessage.id == null) { + return Observable.just(null); + } return apiClient.flagMessage(chatMessage.groupId, chatMessage.id); } @Override public Observable likeMessage(ChatMessage chatMessage) { + if (chatMessage.id == null) { + return Observable.just(null); + } boolean liked = chatMessage.userLikesMessage(userId); localRepository.likeMessage(chatMessage, userId, !liked); return apiClient.likeMessage(chatMessage.groupId, chatMessage.id) @@ -115,7 +120,7 @@ public class SocialRepositoryImpl extends BaseRepositoryImpl leaveGroup(String id) { return apiClient.leaveGroup(id) - .flatMap(aVoid -> localRepository.getGroup(id)) + .flatMap(aVoid -> localRepository.getGroup(id).first()) .doOnNext(group -> localRepository.executeTransaction(realm -> group.isMember = false)); } @@ -198,6 +203,9 @@ public class SocialRepositoryImpl extends BaseRepositoryImpl getMember(String userId) { + if (userId == null) { + return Observable.just(null); + } return apiClient.getMember(userId); } @@ -251,4 +259,12 @@ public class SocialRepositoryImpl extends BaseRepositoryImpl localRepository.setQuestActivity(party, true)); } + + @Override + public Observable getMemberAchievements(String userId) { + if (userId == null) { + return Observable.just(null); + } + return apiClient.getMemberAchievements(userId); + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/BaseLocalRepository.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/BaseLocalRepository.java index b59a10fcc..dc5b45979 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/BaseLocalRepository.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/BaseLocalRepository.java @@ -22,4 +22,6 @@ public interface BaseLocalRepository { void save(List objects); void save(T object); + + boolean isClosed(); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmBaseLocalRepository.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmBaseLocalRepository.java index c6cdd7e84..f51757ff7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmBaseLocalRepository.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmBaseLocalRepository.java @@ -45,6 +45,11 @@ abstract class RealmBaseLocalRepository implements BaseLocalRepository { realm.executeTransactionAsync(realm1 -> realm1.insertOrUpdate(object)); } + @Override + public boolean isClosed() { + return realm.isClosed(); + } + @Override public void save(List objects) { realm.executeTransactionAsync(realm1 -> realm1.insertOrUpdate(objects)); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmInventoryLocalRepository.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmInventoryLocalRepository.java index 0fc2f50e2..4ead386e7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmInventoryLocalRepository.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmInventoryLocalRepository.java @@ -265,14 +265,14 @@ public class RealmInventoryLocalRepository extends RealmContentLocalRepository i @Override public void decrementMysteryItemCount(User user) { SpecialItem item = realm.where(SpecialItem.class).equalTo("isMysteryItem", true).findFirst(); - if (item.isValid()) { - realm.executeTransactionAsync(realm1 -> { - item.setOwned(item.getOwned()-1); - if (user.getPurchased() != null && user.getPurchased().getPlan() != null) { - user.getPurchased().getPlan().mysteryItemCount -= 1; - } - }); - } + realm.executeTransactionAsync(realm1 -> { + if (item != null && item.isValid()) { + item.setOwned(item.getOwned() - 1); + } + if (user.isValid() && user.getPurchased() != null && user.getPurchased().getPlan() != null) { + user.getPurchased().getPlan().mysteryItemCount -= 1; + } + }); } @Override diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmSocialLocalRepository.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmSocialLocalRepository.java index e439dec73..4bc98b15c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmSocialLocalRepository.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmSocialLocalRepository.java @@ -46,7 +46,7 @@ public class RealmSocialLocalRepository extends RealmBaseLocalRepository impleme public Observable getGroup(String id) { return realm.where(Group.class) .equalTo("id", id) - .findAllAsync() + .findAll() .asObservable() .filter(group -> group.isLoaded() && group.isValid() && !group.isEmpty()) .map(groups -> groups.first()); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/RxErrorHandler.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/RxErrorHandler.java index 6654b8739..627995a6c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/RxErrorHandler.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/RxErrorHandler.java @@ -9,6 +9,7 @@ import java.io.IOException; import cz.msebera.android.httpclient.HttpException; import rx.functions.Action1; +import rx.plugins.RxJavaHooks; public class RxErrorHandler { @@ -18,6 +19,8 @@ public class RxErrorHandler { public static void init(CrashlyticsProxy crashlyticsProxy) { instance = new RxErrorHandler(); instance.crashlyticsProxy = crashlyticsProxy; + + RxJavaHooks.setOnError(handleEmptyError()); } public static Action1 handleEmptyError() { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/members/Member.java b/Habitica/src/main/java/com/habitrpg/android/habitica/models/members/Member.java index 081fd80df..edc39f162 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/members/Member.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/members/Member.java @@ -2,6 +2,7 @@ package com.habitrpg.android.habitica.models.members; import android.text.TextUtils; +import com.google.gson.annotations.SerializedName; import com.habitrpg.android.habitica.models.Avatar; import com.habitrpg.android.habitica.models.social.UserParty; import com.habitrpg.android.habitica.models.user.Buffs; @@ -24,6 +25,7 @@ public class Member extends RealmObject implements Avatar { @PrimaryKey + @SerializedName("_id") private String id; private Stats stats; private Inbox inbox; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/proxy/CrashlyticsProxy.java b/Habitica/src/main/java/com/habitrpg/android/habitica/proxy/CrashlyticsProxy.java index bb4924587..00e4e9064 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/proxy/CrashlyticsProxy.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/proxy/CrashlyticsProxy.java @@ -15,4 +15,6 @@ public interface CrashlyticsProxy { void setUserName(String name); void fabricLogE(String s1, String s2, Exception e); + + void log(String msg); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/proxy/implementation/EmptyCrashlyticsProxy.java b/Habitica/src/main/java/com/habitrpg/android/habitica/proxy/implementation/EmptyCrashlyticsProxy.java index 3e41eae53..66bd74a1e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/proxy/implementation/EmptyCrashlyticsProxy.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/proxy/implementation/EmptyCrashlyticsProxy.java @@ -35,4 +35,9 @@ public class EmptyCrashlyticsProxy implements CrashlyticsProxy { public void fabricLogE(String s1, String s2, Exception e) { //pass } + + @Override + public void log(String msg) { + //pass + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/CreateChallengeActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/CreateChallengeActivity.java index e09fdac28..8cf3975ae 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/CreateChallengeActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/CreateChallengeActivity.java @@ -441,7 +441,11 @@ public class CreateChallengeActivity extends BaseActivity { checkPrizeAndMinimumForTavern(); - challengeRepository.getChallengeTasks(challengeId).subscribe(tasks -> tasks.tasks.forEach((s, task) -> addOrUpdateTaskInList(task)), RxErrorHandler.handleEmptyError(), () -> { + challengeRepository.getChallengeTasks(challengeId).subscribe(tasks -> { + for (Task task : tasks.tasks.values()) { + addOrUpdateTaskInList(task); + } + }, RxErrorHandler.handleEmptyError(), () -> { // activate editMode to track taskChanges editMode = true; }); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.java index c6393e8a5..29bdbbe0c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.java @@ -253,7 +253,7 @@ public class FullProfileActivity extends BaseActivity { //mountsTamedCount.setText(String.valueOf(user.getMountsTamedCount())); // Load the members achievements now - apiClient.getMemberAchievements(this.userId).subscribe(this::fillAchievements, RxErrorHandler.handleEmptyError()); + socialRepository.getMemberAchievements(this.userId).subscribe(this::fillAchievements, RxErrorHandler.handleEmptyError()); } // endregion @@ -261,6 +261,9 @@ public class FullProfileActivity extends BaseActivity { // region Attributes private void fillAchievements(AchievementResult achievements) { + if (achievements == null) { + return; + } List items = new ArrayList<>(); fillAchievements(achievements.basic, items); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/SubscriptionFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/SubscriptionFragment.java index 3b05c54d6..5fd81338b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/SubscriptionFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/SubscriptionFragment.java @@ -294,6 +294,10 @@ public class SubscriptionFragment extends BaseFragment implements GemPurchaseAct } } + if (this.subscriptionDetailsView == null) { + return; + } + if (isSubscribed) { this.subscriptionDetailsView.setVisibility(View.VISIBLE); this.subscriptionDetailsView.setPlan(plan); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxFragment.java index 9ce380d33..f4003b30b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxFragment.java @@ -186,7 +186,9 @@ public class InboxFragment extends BaseMainFragment public void onUserReceived(User user) { this.user = user; - swipeRefreshLayout.setRefreshing(false); + if (swipeRefreshLayout != null) { + swipeRefreshLayout.setRefreshing(false); + } } @Override diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/QuestDetailFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/QuestDetailFragment.java index 374b9171e..1c4f75674 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/QuestDetailFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/QuestDetailFragment.java @@ -114,7 +114,11 @@ public class QuestDetailFragment extends BaseMainFragment { party = group; quest = group.quest; setQuestParticipants(group.quest.participants); - socialRepository.getMember(quest.leader).first().subscribe(member -> questLeaderView.setText(getContext().getString(R.string.quest_leader_header, member.getDisplayName())), RxErrorHandler.handleEmptyError()); + socialRepository.getMember(quest.leader).first().subscribe(member -> { + if (getContext() != null && questLeaderView != null) { + questLeaderView.setText(getContext().getString(R.string.quest_leader_header, member.getDisplayName())); + } + }, RxErrorHandler.handleEmptyError()); if (questLeaderResponseWrapper != null) { if (showParticipatantButtons()) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.java index d95387e1b..2bb1110bd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.java @@ -134,7 +134,11 @@ public class PartyDetailFragment extends BaseFragment { if (refreshLayout != null) { refreshLayout.setRefreshing(false); } - }, throwable -> refreshLayout.setRefreshing(false)); + }, throwable -> { + if (refreshLayout != null) { + refreshLayout.setRefreshing(false); + } + }); } private void updateParty(Group party) { @@ -191,7 +195,7 @@ public class PartyDetailFragment extends BaseFragment { } private void updateQuestContent(QuestContent questContent) { - if (questTitleView == null) { + if (questTitleView == null && questContent.isManaged()) { return; } questTitleView.setText(questContent.getText()); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/yesterdailies/YesterdailyDialog.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/yesterdailies/YesterdailyDialog.java index 70fa6f6a3..f27ddd998 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/yesterdailies/YesterdailyDialog.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/yesterdailies/YesterdailyDialog.java @@ -112,6 +112,7 @@ public class YesterdailyDialog extends AlertDialog { if (userRepository != null && userId != null) { Observable.just(null) .delay(500, TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread()) + .filter(aVoid -> !userRepository.isClosed()) .flatMap(aVoid -> userRepository.getUser(userId)) .first() .filter(user -> user != null && user.getNeedsCron() != null && user.getNeedsCron()) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/MemberSerialization.java b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/MemberSerialization.java index 1574502cf..1af06472a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/MemberSerialization.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/MemberSerialization.java @@ -30,6 +30,7 @@ public class MemberSerialization implements JsonDeserializer { Member member = realm.where(Member.class).equalTo("id", id).findFirst(); if (member == null) { member = new Member(); + member.setId(id); } else { member = realm.copyFromRealm(member); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/TaskListDeserializer.java b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/TaskListDeserializer.java index ab26f9f56..395572f4a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/TaskListDeserializer.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/TaskListDeserializer.java @@ -7,6 +7,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; +import com.google.gson.internal.LinkedTreeMap; import com.habitrpg.android.habitica.models.tasks.Task; import com.habitrpg.android.habitica.models.tasks.TaskList; @@ -24,10 +25,14 @@ public class TaskListDeserializer implements JsonDeserializer { Map taskMap = new HashMap<>(); for (JsonElement e : json.getAsJsonArray()) { - Task task = ctx.deserialize(e, Task.class); - //Workaround, since gson doesn't call setter methods - task.setId(task.getId()); - taskMap.put(task.getId(), task); + try { + Task task = ctx.deserialize(e, Task.class); + //Workaround, since gson doesn't call setter methods + task.setId(task.getId()); + taskMap.put(task.getId(), task); + } catch (ClassCastException ignored) { + + } } tasks.tasks = taskMap; diff --git a/Habitica/src/release/java/com/habitrpg/android/habitica/proxy/CrashlyticsProxyImpl.java b/Habitica/src/release/java/com/habitrpg/android/habitica/proxy/CrashlyticsProxyImpl.java index 9f2a62ff3..cc985d4cb 100644 --- a/Habitica/src/release/java/com/habitrpg/android/habitica/proxy/CrashlyticsProxyImpl.java +++ b/Habitica/src/release/java/com/habitrpg/android/habitica/proxy/CrashlyticsProxyImpl.java @@ -47,4 +47,9 @@ public class CrashlyticsProxyImpl implements CrashlyticsProxy { public void fabricLogE(String s1, String s2, Exception e) { Fabric.getLogger().e(s1,s2,e); } + + @Override + public void log(String msg) { + Crashlytics.getInstance().log(msg); + } } diff --git a/gradle.properties b/gradle.properties index 3fcfe5803..6c5180d38 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.configureondemand=true org.gradle.daemon=true -org.gradle.jvmargs=-Xmx2048m \ No newline at end of file +org.gradle.jvmargs=-Xmx6656M \ No newline at end of file