From 98541abf2df6310d6dd9df90024bec05f7cb1efd Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Wed, 19 Apr 2017 15:02:42 +0200 Subject: [PATCH] Fix various crashes --- Habitica/res/layout/activity_main.xml | 7 +++++-- .../habitica/helpers/TaskFilterHelper.java | 7 +++++-- .../habitica/ui/activities/LoginActivity.java | 2 +- .../habitica/ui/activities/SetupActivity.java | 2 +- .../ui/adapter/setup/TaskSetupAdapter.java | 7 +++++-- .../social/ChallengesListViewAdapter.java | 13 ++++++------- .../tasks/SortableTasksRecyclerViewAdapter.java | 2 +- .../customization/AvatarOverviewFragment.java | 2 +- .../inventory/items/ItemRecyclerFragment.java | 5 +++-- .../ChallengeTasksRecyclerViewFragment.java | 2 +- .../tasks/TaskRecyclerViewFragment.java | 12 ++++++++---- .../ui/fragments/tasks/TasksFragment.java | 7 +++++-- .../habitica/ui/helpers/MarkdownParser.java | 16 ++++++++++++++-- .../ui/views/tasks/TaskFilterDialog.java | 3 +++ 14 files changed, 59 insertions(+), 28 deletions(-) diff --git a/Habitica/res/layout/activity_main.xml b/Habitica/res/layout/activity_main.xml index e2f0a05b5..6342c53bc 100644 --- a/Habitica/res/layout/activity_main.xml +++ b/Habitica/res/layout/activity_main.xml @@ -72,9 +72,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:layout_gravity="bottom|center" + android:layout_gravity="bottom|center_horizontal" android:layout_alignParentBottom="true" - app:layout_behavior="com.habitrpg.android.habitica.ui.helpers.FloatingActionMenuBehavior"> + app:layout_behavior="com.habitrpg.android.habitica.ui.helpers.FloatingActionMenuBehavior" + android:padding="0dp"> diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TaskFilterHelper.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TaskFilterHelper.java index 70c73b007..39629ee8c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TaskFilterHelper.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TaskFilterHelper.java @@ -25,11 +25,11 @@ public class TaskFilterHelper { this.tagsId.add(tags); } - public int howMany(String type) { + public int howMany(@Nullable String type) { return this.tagsId.size() + (isTaskFilterActive(type) ? 1 : 0); } - private boolean isTaskFilterActive(String type) { + private boolean isTaskFilterActive(@Nullable String type) { if (activeFilters.get(type) == null) { return false; } @@ -53,6 +53,9 @@ public class TaskFilterHelper { } public List filter(List tasks) { + if (tasks.size() == 0) { + return tasks; + } List filtered = new ArrayList<>(); String activeFilter = null; if (activeFilters != null && activeFilters.size() > 0) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java index 115c56d40..853c321c1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java @@ -350,7 +350,7 @@ public class LoginActivity extends BaseActivity if (requestCode == FacebookSdk.getCallbackRequestCodeOffset()) { //This is necessary because the regular login callback is not called for some reason AccessToken accessToken = AccessToken.getCurrentAccessToken(); - if (accessToken.getToken() != null) { + if (accessToken != null && accessToken.getToken() != null) { apiClient.connectSocial("facebook", accessToken.getUserId(), accessToken.getToken()) .subscribe(LoginActivity.this, throwable -> hideProgress()); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.java index 427e52b79..9056b8c2e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.java @@ -298,6 +298,6 @@ public class SetupActivity extends BaseActivity implements ViewPager.OnPageChang } private boolean isLastPage() { - return this.pager.getCurrentItem() == this.pager.getAdapter().getCount()-1; + return this.pager == null || this.pager.getCurrentItem() == this.pager.getAdapter().getCount() - 1; } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/setup/TaskSetupAdapter.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/setup/TaskSetupAdapter.java index 1ba90e523..f97980460 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/setup/TaskSetupAdapter.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/setup/TaskSetupAdapter.java @@ -3,6 +3,7 @@ package com.habitrpg.android.habitica.ui.adapter.setup; import android.content.Context; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; +import android.support.graphics.drawable.VectorDrawableCompat; import android.support.v4.content.ContextCompat; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; @@ -70,8 +71,10 @@ public class TaskSetupAdapter extends RecyclerView.Adapter - { + this.challenges = $.filter(challengesSource, arg -> { boolean showChallenge = $.find(filterOptions.showByGroups, g -> g.id.contains(arg.groupId)).isPresent(); boolean showByOwnership = true; if(filterOptions.showOwned == filterOptions.notOwned && this.user != null){ if (filterOptions.showOwned) { - showByOwnership = Objects.equals(arg.leaderId, this.user.getId()); + showByOwnership = arg.leaderId.equals(this.user.getId()); } else { - showByOwnership = !Objects.equals(arg.leaderId, this.user.getId()); + showByOwnership = !arg.leaderId.equals(this.user.getId()); } } @@ -164,11 +163,11 @@ public class ChallengesListViewAdapter extends RecyclerView.Adapter ownedPets; + @Nullable public HabitRPGUser user; LinearLayoutManager layoutManager = null; @@ -156,7 +157,7 @@ public class ItemRecyclerFragment extends BaseFragment { @Override public void onResume() { - if (this.isHatching != null && this.isHatching) { + if (this.isHatching != null && this.isHatching && getDialog().getWindow() != null) { ViewGroup.LayoutParams params = getDialog().getWindow().getAttributes(); params.width = ViewGroup.LayoutParams.MATCH_PARENT; params.height = ViewGroup.LayoutParams.MATCH_PARENT; @@ -202,7 +203,7 @@ public class ItemRecyclerFragment extends BaseFragment { } if (this.itemType.equals("special")) { - if (user.getPurchased() != null && user.getPurchased().getPlan().isActive()) { + if (user != null && user.getPurchased() != null && user.getPurchased().getPlan().isActive()) { Item mysterItem = SpecialItem.makeMysteryItem(getContext()); mysterItem.setOwned(user.getPurchased().getPlan().mysteryItems.size()); items.add(mysterItem); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeTasksRecyclerViewFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeTasksRecyclerViewFragment.java index afb0c2e97..0cc1fbb4e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeTasksRecyclerViewFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeTasksRecyclerViewFragment.java @@ -88,7 +88,7 @@ public class ChallengeTasksRecyclerViewFragment extends BaseFragment { public void setInnerAdapter() { this.recyclerAdapter = new ChallengeTasksRecyclerViewAdapter(null, 0, getContext(), userID, null); - if (tasksOnInitialize.size() != 0 && recyclerAdapter != null && recyclerAdapter.getItemCount() == 0) { + if (tasksOnInitialize != null && tasksOnInitialize.size() != 0 && recyclerAdapter != null && recyclerAdapter.getItemCount() == 0) { recyclerAdapter.setTasks(tasksOnInitialize); } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.java index cc5357638..bd997a18c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.java @@ -197,7 +197,9 @@ public class TaskRecyclerViewFragment extends BaseFragment implements View.OnCli if (viewHolder != null) { viewHolder.itemView.setBackgroundColor(Color.LTGRAY); } - swipeRefreshLayout.setEnabled(false); + if (swipeRefreshLayout != null) { + swipeRefreshLayout.setEnabled(false); + } } public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { @@ -220,8 +222,10 @@ public class TaskRecyclerViewFragment extends BaseFragment implements View.OnCli @Override public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { super.clearView(recyclerView, viewHolder); - swipeRefreshLayout.setEnabled(true); - + if (swipeRefreshLayout != null) { + swipeRefreshLayout.setEnabled(true); + } + viewHolder.itemView.setBackgroundColor(Color.WHITE); if (mFromPosition != null) { ((ItemTouchHelperDropCallback) recyclerAdapter).onDrop(mFromPosition, viewHolder.getAdapterPosition()); @@ -256,7 +260,7 @@ public class TaskRecyclerViewFragment extends BaseFragment implements View.OnCli @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); - if (newState == RecyclerView.SCROLL_STATE_IDLE) { + if (newState == RecyclerView.SCROLL_STATE_IDLE && swipeRefreshLayout != null) { swipeRefreshLayout.setEnabled(((MainActivity)getActivity()).isAppBarExpanded()); } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java index d147a705d..4908b9448 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java @@ -170,7 +170,9 @@ public class TasksFragment extends BaseMainFragment { dialog.setActiveTags(taskFilterHelper.getTags()); if (getActiveFragment() != null) { String taskType = getActiveFragment().classType; - dialog.setTaskType(taskType, taskFilterHelper.getActiveFilter(taskType)); + if (taskType != null) { + dialog.setTaskType(taskType, taskFilterHelper.getActiveFilter(taskType)); + } } dialog.setListener((activeTaskFilter, activeTags) -> { int activePos = viewPager.getCurrentItem(); @@ -472,7 +474,8 @@ public class TasksFragment extends BaseMainFragment { private int indexForTaskType(String taskType) { if (taskType != null) { for (int index = 0; index < viewFragmentsDictionary.size(); index++) { - if (taskType.equals(viewFragmentsDictionary.get(index).getClassName())) { + TaskRecyclerViewFragment fragment = viewFragmentsDictionary.get(index); + if (fragment != null && taskType.equals(fragment.getClassName())) { return index; } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/MarkdownParser.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/MarkdownParser.java index 13cad0186..bcf970b2a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/MarkdownParser.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/MarkdownParser.java @@ -4,14 +4,17 @@ import com.commonsware.cwac.anddown.AndDown; import net.pherth.android.emoji_library.EmojiParser; +import android.support.annotation.Nullable; import android.text.Html; +import static android.text.Html.FROM_HTML_MODE_LEGACY; + /** * @author data5tream */ public class MarkdownParser { - static AndDown processor = new AndDown(); + private static AndDown processor = new AndDown(); /** * Parses formatted markdown and returns it as styled CharSequence @@ -20,7 +23,15 @@ public class MarkdownParser { * @return Stylized CharSequence */ public static CharSequence parseMarkdown(String input) { - CharSequence output = Html.fromHtml(processor.markdownToHtml(EmojiParser.parseEmojis(input.trim()))); + if (input == null) { + return ""; + } + CharSequence output; + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { + output = Html.fromHtml(processor.markdownToHtml(EmojiParser.parseEmojis(input.trim())), FROM_HTML_MODE_LEGACY); + } else { + output = Html.fromHtml(processor.markdownToHtml(EmojiParser.parseEmojis(input.trim()))); + } if (output.length() >= 2) output = output.subSequence(0, output.length() - 2); return output; } @@ -31,6 +42,7 @@ public class MarkdownParser { * @param input Stylized CharSequence * @return Markdown formatted String */ + @Nullable public static String parseCompiled(CharSequence input) { return EmojiParser.convertToCheatCode(input.toString()); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/TaskFilterDialog.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/TaskFilterDialog.java index f9b9d72b4..ff7f9002e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/TaskFilterDialog.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/TaskFilterDialog.java @@ -238,6 +238,9 @@ public class TaskFilterDialog extends AlertDialog implements RadioGroup.OnChecke @Override public void onTextChanged(CharSequence s, int start, int before, int count) { + if (index >= tags.size()) { + return; + } Tag tag = tags.get(index); tag.setName(s.toString()); if (createdTags.containsKey(tag.getId())) {