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())) {