From 95359dfbc5ad8dc2032ecced7f4a3b36bcfc4e2a Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Fri, 7 Apr 2017 11:47:06 +0200 Subject: [PATCH] fix various crashes --- .../callbacks/HabitRPGUserCallback.java | 9 +- .../habitica/callbacks/MergeUserCallback.java | 8 +- .../habitica/helpers/UserStatComputer.java | 52 ++++---- .../activities/ChallengeDetailActivity.java | 8 +- .../ui/activities/FullProfileActivity.java | 20 +-- .../ui/fragments/BaseMainFragment.java | 14 +- .../customization/AvatarOverviewFragment.java | 10 +- .../ChallegeDetailDialogHolder.java | 73 +++++------ .../ChallegeFilterDialogHolder.java | 43 +++---- .../challenges/ChallengeListFragment.java | 9 +- .../ui/fragments/tasks/TasksFragment.java | 120 ++++++++++-------- 11 files changed, 191 insertions(+), 175 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/callbacks/HabitRPGUserCallback.java b/Habitica/src/main/java/com/habitrpg/android/habitica/callbacks/HabitRPGUserCallback.java index 0fd313e8c..d64ec0869 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/callbacks/HabitRPGUserCallback.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/callbacks/HabitRPGUserCallback.java @@ -2,6 +2,8 @@ package com.habitrpg.android.habitica.callbacks; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; +import android.support.annotation.Nullable; + import rx.functions.Action1; /** @@ -10,9 +12,10 @@ import rx.functions.Action1; */ public class HabitRPGUserCallback implements Action1 { + @Nullable public final OnUserReceived callBack; - public HabitRPGUserCallback(OnUserReceived callback) { + public HabitRPGUserCallback(@Nullable OnUserReceived callback) { this.callBack = callback; } @@ -20,7 +23,9 @@ public class HabitRPGUserCallback implements Action1 { public void call(HabitRPGUser habitRPGUser) { // Negue: once everything is refactored to DbFlowTaskLocalRepository, this will be removed habitRPGUser.async().save(); - callBack.onUserReceived(habitRPGUser); + if (callBack != null) { + callBack.onUserReceived(habitRPGUser); + } } public interface OnUserReceived { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/callbacks/MergeUserCallback.java b/Habitica/src/main/java/com/habitrpg/android/habitica/callbacks/MergeUserCallback.java index 88ed95642..77b94372f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/callbacks/MergeUserCallback.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/callbacks/MergeUserCallback.java @@ -2,12 +2,14 @@ package com.habitrpg.android.habitica.callbacks; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; +import android.support.annotation.Nullable; + public class MergeUserCallback extends HabitRPGUserCallback { private HabitRPGUser user; - public MergeUserCallback(HabitRPGUserCallback.OnUserReceived callback, HabitRPGUser user) { + public MergeUserCallback(@Nullable HabitRPGUserCallback.OnUserReceived callback, HabitRPGUser user) { super(callback); this.user = user; } @@ -29,6 +31,8 @@ public class MergeUserCallback extends HabitRPGUserCallback { this.user.async().save(); - callBack.onUserReceived(this.user); + if (callBack != null) { + callBack.onUserReceived(this.user); + } } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/UserStatComputer.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/UserStatComputer.java index 54806670a..ee5ad0137 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/UserStatComputer.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/UserStatComputer.java @@ -7,10 +7,6 @@ import com.magicmicky.habitrpgwrapper.lib.models.tasks.ItemData; import java.util.ArrayList; import java.util.List; -/** - * Created by krh12 on 3/31/2017. - */ - public class UserStatComputer { // @TODO: Not really sure if this is correct @@ -35,7 +31,7 @@ public class UserStatComputer { } public List computeClassBonus (List itemDataList, HabitRPGUser user) { - List skillRows = new ArrayList(); + List skillRows = new ArrayList<>(); float strAttributes = 0; float intAttributes = 0; @@ -62,16 +58,16 @@ public class UserStatComputer { StringBuilder sb = new StringBuilder(); if (str_ != 0) { - sb.append("STR " + str_ + ", "); + sb.append("STR ").append(str_).append(", "); } if (int_ != 0) { - sb.append("INT " + int_ + ", "); + sb.append("INT ").append(int_).append(", "); } if (con_ != 0) { - sb.append("CON " + con_ + ", "); + sb.append("CON ").append(con_).append(", "); } if (per_ != 0) { - sb.append("PER " + per_ + ", "); + sb.append("PER ").append(per_).append(", "); } // remove the last comma @@ -102,27 +98,29 @@ public class UserStatComputer { if (!userClassMatchesGearClass && !userClassMatchesGearSpecialClass) classBonus = 0; - if (itemClass.isEmpty()) { + if (itemClass == null || itemClass.isEmpty()) { itemClass = itemSpecialClass; } - switch (itemClass) { - case "rogue": - strClassBonus = str_ * classBonus; - perClassBonus = per_ * classBonus; - break; - case "healer": - conClassBonus = con_ * classBonus; - intClassBonus = int_ * classBonus; - break; - case "warrior": - strClassBonus = str_ * classBonus; - conClassBonus = con_ * classBonus; - break; - case "wizard": - intClassBonus = int_ * classBonus; - perClassBonus = per_ * classBonus; - break; + if (itemClass != null) { + switch (itemClass) { + case "rogue": + strClassBonus = str_ * classBonus; + perClassBonus = per_ * classBonus; + break; + case "healer": + conClassBonus = con_ * classBonus; + intClassBonus = int_ * classBonus; + break; + case "warrior": + strClassBonus = str_ * classBonus; + conClassBonus = con_ * classBonus; + break; + case "wizard": + intClassBonus = int_ * classBonus; + perClassBonus = per_ * classBonus; + break; + } } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeDetailActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeDetailActivity.java index a82e1f13a..432ed6b27 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeDetailActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeDetailActivity.java @@ -319,16 +319,18 @@ public class ChallengeDetailActivity extends BaseActivity { public void bind(Challenge challenge) { this.challenge = challenge; - challengeName.setText(EmojiParser.parseEmojis(challenge.name)); + if (challengeName != null) { + challengeName.setText(EmojiParser.parseEmojis(challenge.name)); + } challengeDescription.setText(MarkdownParser.parseMarkdown(challenge.description)); - memberCountTextView.setText(challenge.memberCount + ""); + memberCountTextView.setText(String.valueOf(challenge.memberCount)); if (challenge.prize == 0) { gem_prize_layout.setVisibility(View.GONE); } else { gem_prize_layout.setVisibility(View.VISIBLE); - gemPrizeTextView.setText(challenge.prize + ""); + gemPrizeTextView.setText(String.valueOf(challenge.prize)); } } 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 549cd1909..7ac50259f 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 @@ -382,19 +382,21 @@ public class FullProfileActivity extends BaseActivity { UserStatComputer userStatComputer = new UserStatComputer(); List statsRows = userStatComputer.computeClassBonus(itemDataList, user); - // @TODO: MAke this dynamic by iterating over rows and check type? - UserStatComputer.EquipmentRow equipmentRow = (UserStatComputer.EquipmentRow) statsRows.get(0); - addEquipmentRow(equipmentTableLayout, equipmentRow.gearKey, equipmentRow.text, equipmentRow.stats); + for (UserStatComputer.StatsRow row : statsRows) { + if (row.getClass().equals(UserStatComputer.EquipmentRow.class)) { + UserStatComputer.EquipmentRow equipmentRow = (UserStatComputer.EquipmentRow) row; + addEquipmentRow(equipmentTableLayout, equipmentRow.gearKey, equipmentRow.text, equipmentRow.stats); + } else if (row.getClass().equals(UserStatComputer.AttributeRow.class)) { + UserStatComputer.AttributeRow attributeRow2 = (UserStatComputer.AttributeRow) row; + addAttributeRow(getString(attributeRow2.labelId), attributeRow2.strVal, attributeRow2.intVal, attributeRow2.conVal, attributeRow2.perVal, attributeRow2.roundDown, attributeRow2.isSummary); + } + } stopAndHideProgress(equipmentProgress); equipmentTableLayout.setVisibility(View.VISIBLE); - // @TOOD: We could probably remove the excess parameters - thank you classes - UserStatComputer.AttributeRow attributeRow1 = (UserStatComputer.AttributeRow) statsRows.get(1); - addAttributeRow(getString(attributeRow1.labelId) + ": ", attributeRow1.strVal, attributeRow1.intVal, attributeRow1.conVal, attributeRow1.perVal, attributeRow1.roundDown, attributeRow1.isSummary); - - UserStatComputer.AttributeRow attributeRow2 = (UserStatComputer.AttributeRow) statsRows.get(2); - addAttributeRow(getString(attributeRow2.labelId), attributeRow2.strVal, attributeRow2.intVal, attributeRow2.conVal, attributeRow2.perVal, attributeRow2.roundDown, attributeRow2.isSummary); + stopAndHideProgress(attributesProgress); + attributesTableLayout.setVisibility(View.VISIBLE); } public void gotCostume(List obj) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.java index 9a55fe401..2184a05c9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.java @@ -16,6 +16,7 @@ import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; import com.raizlabs.android.dbflow.sql.builder.Condition; import com.raizlabs.android.dbflow.sql.language.Select; import com.roughike.bottombar.BottomBar; +import com.squareup.haha.perflib.Main; import javax.inject.Inject; @@ -23,8 +24,11 @@ public abstract class BaseMainFragment extends BaseFragment { @Inject public ApiClient apiClient; + @Nullable public MainActivity activity; + @Nullable public TabLayout tabLayout; + @Nullable public BottomBar bottomNavigation; public ViewGroup floatingMenuWrapper; public boolean usesTabLayout; @@ -43,11 +47,11 @@ public abstract class BaseMainFragment extends BaseFragment { this.user = user; } - public void setTabLayout(TabLayout tabLayout) { + public void setTabLayout(@Nullable TabLayout tabLayout) { this.tabLayout = tabLayout; } - public void setBottomNavigation(BottomBar bottomNavigation) { + public void setBottomNavigation(@Nullable BottomBar bottomNavigation) { this.bottomNavigation = bottomNavigation; } @@ -55,7 +59,7 @@ public abstract class BaseMainFragment extends BaseFragment { this.floatingMenuWrapper = view; } - public void setActivity(MainActivity activity) { + public void setActivity(@Nullable MainActivity activity) { this.activity = activity; } @@ -68,10 +72,8 @@ public abstract class BaseMainFragment extends BaseFragment { public void onAttach(Context context) { super.onAttach(context); - try { + if (getActivity().getClass().equals(MainActivity.class)) { this.activity = (MainActivity) getActivity(); - } catch (ClassCastException ex) { - } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarOverviewFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarOverviewFragment.java index 1dcd18a25..8f9a1b4ba 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarOverviewFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarOverviewFragment.java @@ -109,14 +109,18 @@ public class AvatarOverviewFragment extends BaseMainFragment implements AdapterV AvatarCustomizationFragment fragment = new AvatarCustomizationFragment(); fragment.type = type; fragment.category = category; - activity.displayFragment(fragment); + if (activity != null) { + activity.displayFragment(fragment); + } } @Override public void updateUserData(HabitRPGUser user) { super.updateUserData(user); - viewBinding.setPreferences(user.getPreferences()); - this.setSize(user.getPreferences().getSize()); + if (user != null) { + viewBinding.setPreferences(user.getPreferences()); + this.setSize(user.getPreferences().getSize()); + } } private void setSize(String size) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallegeDetailDialogHolder.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallegeDetailDialogHolder.java index 1c536ddd2..7e9e39590 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallegeDetailDialogHolder.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallegeDetailDialogHolder.java @@ -70,6 +70,7 @@ public class ChallegeDetailDialogHolder { private AlertDialog dialog; private ApiClient apiClient; + @Nullable private HabitRPGUser user; private Challenge challenge; private Action1 challengeJoinedAction; @@ -94,7 +95,7 @@ public class ChallegeDetailDialogHolder { challegeDetailDialogHolder.bind(builder.show(), apiClient, user, challenge, challengeJoinedAction, challengeLeftAction); } - public void bind(AlertDialog dialog, ApiClient apiClient, HabitRPGUser user, Challenge challenge, + public void bind(AlertDialog dialog, ApiClient apiClient, @Nullable HabitRPGUser user, Challenge challenge, Action1 challengeJoinedAction, Action1 challengeLeftAction) { this.dialog = dialog; this.apiClient = apiClient; @@ -106,15 +107,15 @@ public class ChallegeDetailDialogHolder { changeViewsByChallenge(challenge); } - public void changeViewsByChallenge(Challenge challenge) { + private void changeViewsByChallenge(Challenge challenge) { setJoined(challenge.user_id != null && !challenge.user_id.isEmpty()); challengeName.setText(EmojiParser.parseEmojis(challenge.name)); challengeDescription.setText(MarkdownParser.parseMarkdown(challenge.description)); challengeLeader.setText(challenge.leaderName); - gem_amount.setText(challenge.prize + ""); - member_count.setText(challenge.memberCount + ""); + gem_amount.setText(String.valueOf(challenge.prize)); + member_count.setText(String.valueOf(challenge.memberCount)); apiClient.getChallengeTasks(challenge.id) .subscribe(taskList -> { @@ -163,7 +164,7 @@ public class ChallegeDetailDialogHolder { } private void addHabits(ArrayList habits) { - LinearLayout taskGroup = (LinearLayout) context.getLayoutInflater().inflate(R.layout.dialog_challenge_detail_task_group, null); + LinearLayout taskGroup = (LinearLayout) context.getLayoutInflater().inflate(R.layout.dialog_challenge_detail_task_group, task_group_layout); TextView groupName = (TextView) taskGroup.findViewById(R.id.task_group_name); LinearLayout tasks_layout = (LinearLayout) taskGroup.findViewById(R.id.tasks_layout); @@ -174,7 +175,7 @@ public class ChallegeDetailDialogHolder { for (int i = 0; i < size; i++) { Task task = habits.get(i); - View habitEntry = context.getLayoutInflater().inflate(R.layout.dialog_challenge_detail_habit, null); + View habitEntry = context.getLayoutInflater().inflate(R.layout.dialog_challenge_detail_habit, tasks_layout); TextView habitTitle = (TextView) habitEntry.findViewById(R.id.habit_title); ImageView plusImg = (ImageView) habitEntry.findViewById(task.up ? R.id.plus_img_tinted : R.id.plus_img); ImageView minusImg = (ImageView) habitEntry.findViewById(task.down ? R.id.minus_img_tinted : R.id.minus_img); @@ -184,25 +185,22 @@ public class ChallegeDetailDialogHolder { habitTitle.setText(EmojiParser.parseEmojis(task.text)); - tasks_layout.addView(habitEntry); } - - task_group_layout.addView(taskGroup); } - private void addDailys(ArrayList dailys) { - LinearLayout taskGroup = (LinearLayout) context.getLayoutInflater().inflate(R.layout.dialog_challenge_detail_task_group, null); + private void addDailys(ArrayList dailies) { + LinearLayout taskGroup = (LinearLayout) context.getLayoutInflater().inflate(R.layout.dialog_challenge_detail_task_group, task_group_layout); TextView groupName = (TextView) taskGroup.findViewById(R.id.task_group_name); LinearLayout tasks_layout = (LinearLayout) taskGroup.findViewById(R.id.tasks_layout); - int size = dailys.size(); - groupName.setText(dailys.size() + " " + ChallengesListViewAdapter.ChallengeViewHolder.getLabelByTypeAndCount(context, Challenge.TASK_ORDER_DAILYS, size)); + int size = dailies.size(); + groupName.setText(dailies.size() + " " + ChallengesListViewAdapter.ChallengeViewHolder.getLabelByTypeAndCount(context, Challenge.TASK_ORDER_DAILYS, size)); for (int i = 0; i < size; i++) { - Task task = dailys.get(i); + Task task = dailies.get(i); - View entry = context.getLayoutInflater().inflate(R.layout.dialog_challenge_detail_daily, null); + View entry = context.getLayoutInflater().inflate(R.layout.dialog_challenge_detail_daily, tasks_layout); TextView title = (TextView) entry.findViewById(R.id.daily_title); title.setText(EmojiParser.parseEmojis(task.text)); @@ -212,17 +210,14 @@ public class ChallegeDetailDialogHolder { checklistIndicatorWrapper.setVisibility(View.VISIBLE); TextView checkListAllTextView = (TextView) entry.findViewById(R.id.checkListAllTextView); - checkListAllTextView.setText(task.checklist.size() + ""); + checkListAllTextView.setText(String.valueOf(task.checklist.size())); } - tasks_layout.addView(entry); } - - task_group_layout.addView(taskGroup); } private void addTodos(ArrayList todos) { - LinearLayout taskGroup = (LinearLayout) context.getLayoutInflater().inflate(R.layout.dialog_challenge_detail_task_group, null); + LinearLayout taskGroup = (LinearLayout) context.getLayoutInflater().inflate(R.layout.dialog_challenge_detail_task_group, task_group_layout); TextView groupName = (TextView) taskGroup.findViewById(R.id.task_group_name); LinearLayout tasks_layout = (LinearLayout) taskGroup.findViewById(R.id.tasks_layout); @@ -233,27 +228,23 @@ public class ChallegeDetailDialogHolder { for (int i = 0; i < size; i++) { Task task = todos.get(i); - View entry = context.getLayoutInflater().inflate(R.layout.dialog_challenge_detail_todo, null); + View entry = context.getLayoutInflater().inflate(R.layout.dialog_challenge_detail_todo, tasks_layout); TextView title = (TextView) entry.findViewById(R.id.todo_title); title.setText(EmojiParser.parseEmojis(task.text)); - tasks_layout.addView(entry); - if (task.checklist != null && !task.checklist.isEmpty()) { View checklistIndicatorWrapper = entry.findViewById(R.id.checklistIndicatorWrapper); checklistIndicatorWrapper.setVisibility(View.VISIBLE); TextView checkListAllTextView = (TextView) entry.findViewById(R.id.checkListAllTextView); - checkListAllTextView.setText(task.checklist.size() + ""); + checkListAllTextView.setText(String.valueOf(task.checklist.size())); } } - - task_group_layout.addView(taskGroup); } private void addRewards(ArrayList rewards) { - LinearLayout taskGroup = (LinearLayout) context.getLayoutInflater().inflate(R.layout.dialog_challenge_detail_task_group, null); + LinearLayout taskGroup = (LinearLayout) context.getLayoutInflater().inflate(R.layout.dialog_challenge_detail_task_group, task_group_layout); TextView groupName = (TextView) taskGroup.findViewById(R.id.task_group_name); LinearLayout tasks_layout = (LinearLayout) taskGroup.findViewById(R.id.tasks_layout); @@ -264,17 +255,13 @@ public class ChallegeDetailDialogHolder { for (int i = 0; i < size; i++) { Task task = rewards.get(i); - View entry = context.getLayoutInflater().inflate(R.layout.dialog_challenge_detail_reward, null); + View entry = context.getLayoutInflater().inflate(R.layout.dialog_challenge_detail_reward, tasks_layout); TextView title = (TextView) entry.findViewById(R.id.reward_title); title.setText(EmojiParser.parseEmojis(task.text)); - - tasks_layout.addView(entry); } - - task_group_layout.addView(taskGroup); } - public void setJoined(boolean joined) { + private void setJoined(boolean joined) { joinedHeader.setVisibility(joined ? View.VISIBLE : View.GONE); leaveButton.setVisibility(joined ? View.VISIBLE : View.GONE); @@ -283,12 +270,12 @@ public class ChallegeDetailDialogHolder { } @OnClick(R.id.challenge_leader) - public void openLeaderProfile() { + void openLeaderProfile() { EventBus.getDefault().post(new OpenFullProfileCommand(challenge.leaderId)); } @OnClick(R.id.challenge_go_to_btn) - public void openChallengeActivity() { + void openChallengeActivity() { Bundle bundle = new Bundle(); bundle.putString(ChallengeDetailActivity.CHALLENGE_ID, challenge.id); @@ -300,10 +287,12 @@ public class ChallegeDetailDialogHolder { } @OnClick(R.id.challenge_join_btn) - public void joinChallenge() { + void joinChallenge() { this.apiClient.joinChallenge(challenge.id) .subscribe(challenge -> { - challenge.user_id = this.user.getId(); + if (this.user != null) { + challenge.user_id = this.user.getId(); + } challenge.async().save(); if (challengeJoinedAction != null) { @@ -316,7 +305,7 @@ public class ChallegeDetailDialogHolder { } @OnClick(R.id.challenge_leave_btn) - public void leaveChallenge() { + void leaveChallenge() { new AlertDialog.Builder(context) .setTitle(context.getString(R.string.challenge_leave_title)) .setMessage(String.format(context.getString(R.string.challenge_leave_text), challenge.name)) @@ -327,7 +316,9 @@ public class ChallegeDetailDialogHolder { challenge.user_id = null; challenge.async().save(); - this.user.resetChallengeList(); + if (this.user != null) { + this.user.resetChallengeList(); + } if (challengeLeftAction != null) { challengeLeftAction.call(challenge); @@ -335,9 +326,7 @@ public class ChallegeDetailDialogHolder { this.dialog.dismiss(); }, throwable -> { - }))).setNegativeButton(context.getString(R.string.no), (dialog, which) -> { - dialog.dismiss(); - }).show(); + }))).setNegativeButton(context.getString(R.string.no), (dialog, which) -> dialog.dismiss()).show(); } // refactor as an UseCase later - see ChallengeDetailActivity diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallegeFilterDialogHolder.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallegeFilterDialogHolder.java index c18cd208a..5ae39542c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallegeFilterDialogHolder.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallegeFilterDialogHolder.java @@ -1,20 +1,19 @@ package com.habitrpg.android.habitica.ui.fragments.social.challenges; +import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.ui.adapter.social.challenges.ChallengesFilterRecyclerViewAdapter; +import com.magicmicky.habitrpgwrapper.lib.models.Challenge; +import com.magicmicky.habitrpgwrapper.lib.models.Group; + import android.app.Activity; import android.app.AlertDialog; +import android.support.annotation.Nullable; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.Button; import android.widget.CheckBox; -import com.habitrpg.android.habitica.R; -import com.habitrpg.android.habitica.ui.adapter.social.challenges.ChallengesFilterRecyclerViewAdapter; -import com.magicmicky.habitrpgwrapper.lib.api.ApiClient; -import com.magicmicky.habitrpgwrapper.lib.models.Challenge; -import com.magicmicky.habitrpgwrapper.lib.models.Group; -import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; - import java.util.Collection; import java.util.HashMap; import java.util.List; @@ -45,8 +44,6 @@ class ChallegeFilterDialogHolder { CheckBox checkboxNotOwned; private AlertDialog dialog; - private ApiClient apiClient; - private HabitRPGUser user; private List challengesViewed; private ChallengeFilterOptions currentFilter; private Action1 selectedGroupsCallback; @@ -54,14 +51,14 @@ class ChallegeFilterDialogHolder { private ChallengesFilterRecyclerViewAdapter adapter; - protected ChallegeFilterDialogHolder(View view, Activity context) { + private ChallegeFilterDialogHolder(View view, Activity context) { this.context = context; ButterKnife.bind(this, view); } - public static void showDialog(Activity activity, ApiClient apiClient, HabitRPGUser user, List challengesViewed, - ChallengeFilterOptions currentFilter, - Action1 selectedGroupsCallback) { + static void showDialog(Activity activity, List challengesViewed, + ChallengeFilterOptions currentFilter, + Action1 selectedGroupsCallback) { View dialogLayout = activity.getLayoutInflater().inflate(R.layout.dialog_challenge_filter, null); ChallegeFilterDialogHolder challegeFilterDialogHolder = new ChallegeFilterDialogHolder(dialogLayout, activity); @@ -69,15 +66,13 @@ class ChallegeFilterDialogHolder { AlertDialog.Builder builder = new AlertDialog.Builder(activity) .setView(dialogLayout); - challegeFilterDialogHolder.bind(builder.show(), apiClient, user, challengesViewed, currentFilter, selectedGroupsCallback); + challegeFilterDialogHolder.bind(builder.show(), challengesViewed, currentFilter, selectedGroupsCallback); } - public void bind(AlertDialog dialog, ApiClient apiClient, HabitRPGUser user, List challengesViewed, + public void bind(AlertDialog dialog, List challengesViewed, ChallengeFilterOptions currentFilter, Action1 selectedGroupsCallback) { this.dialog = dialog; - this.apiClient = apiClient; - this.user = user; this.challengesViewed = challengesViewed; this.currentFilter = currentFilter; this.selectedGroupsCallback = selectedGroupsCallback; @@ -101,24 +96,24 @@ class ChallegeFilterDialogHolder { this.groupRecyclerView.setAdapter(adapter); } - private Collection getGroups(List challenges){ + private Collection getGroups(@Nullable List challenges){ HashMap groupMap = new HashMap<>(); - for (Challenge c : challenges) { - if(!groupMap.containsKey(c.groupName)){ + if (challenges != null) { + challenges.stream().filter(c -> !groupMap.containsKey(c.groupName)).forEach(c -> { Group g = new Group(); g.id = c.groupId; g.name = c.groupName; groupMap.put(c.groupName, g); - } + }); } return groupMap.values(); } @OnClick(R.id.challenge_filter_button_done) - public void doneClicked() { + void doneClicked() { ChallengeFilterOptions options = new ChallengeFilterOptions(); options.showByGroups = this.adapter.getCheckedEntries(); options.showOwned = checkboxOwned.isChecked(); @@ -130,12 +125,12 @@ class ChallegeFilterDialogHolder { @OnClick(R.id.challenge_filter_button_all) - public void allClicked() { + void allClicked() { this.adapter.selectAll(); } @OnClick(R.id.challenge_filter_button_none) - public void noneClicked() { + void noneClicked() { this.adapter.deSelectAll(); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeListFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeListFragment.java index 83152dc7b..0f0abbcb5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeListFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeListFragment.java @@ -124,8 +124,7 @@ public class ChallengeListFragment extends BaseMainFragment implements SwipeRefr challengeFilterLayout.setVisibility(withFilter?View.VISIBLE:View.GONE); challengeFilterLayout.setClickable(true); - challengeFilterLayout.setOnClickListener(view -> ChallegeFilterDialogHolder.showDialog(HabiticaApplication.currentActivity, this.apiClient, - HabiticaApplication.User, currentChallengesInView, lastFilterOptions, filterOptions -> { + challengeFilterLayout.setOnClickListener(view -> ChallegeFilterDialogHolder.showDialog(HabiticaApplication.currentActivity, currentChallengesInView, lastFilterOptions, filterOptions -> { challengeAdapter.setFilterByGroups(filterOptions); this.lastFilterOptions = filterOptions; })); @@ -164,7 +163,7 @@ public class ChallengeListFragment extends BaseMainFragment implements SwipeRefr Where query = new Select().from(Challenge.class).where(Condition.column("name").isNotNull()); - if (viewUserChallengesOnly) { + if (viewUserChallengesOnly && user != null) { query = query.and(Condition.column("user_id").is(user.getId())); } @@ -200,7 +199,9 @@ public class ChallengeListFragment extends BaseMainFragment implements SwipeRefr } private void fetchOnlineChallenges() { - refreshCallback.call(); + if (refreshCallback != null) { + refreshCallback.call(); + } } public void addItem(Challenge challenge) { 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 e1765804c..730561ce2 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 @@ -1,27 +1,5 @@ package com.habitrpg.android.habitica.ui.fragments.tasks; -import android.app.Activity; -import android.content.Intent; -import android.os.AsyncTask; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.design.widget.CoordinatorLayout; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentPagerAdapter; -import android.support.v4.view.GravityCompat; -import android.support.v4.view.MenuItemCompat; -import android.support.v4.view.ViewPager; -import android.util.SparseArray; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.FrameLayout; -import android.widget.RelativeLayout; -import android.widget.TextView; - import com.github.clans.fab.FloatingActionButton; import com.github.clans.fab.FloatingActionMenu; import com.habitrpg.android.habitica.HabiticaApplication; @@ -45,9 +23,28 @@ import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; import org.greenrobot.eventbus.Subscribe; -import java.util.HashMap; +import android.app.Activity; +import android.content.Intent; +import android.os.AsyncTask; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentPagerAdapter; +import android.support.v4.view.GravityCompat; +import android.support.v4.view.MenuItemCompat; +import android.support.v4.view.ViewPager; +import android.util.SparseArray; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.RelativeLayout; +import android.widget.TextView; + import java.util.Locale; -import java.util.Map; +import java.util.Objects; import javax.inject.Inject; @@ -64,6 +61,7 @@ public class TasksFragment extends BaseMainFragment { SparseArray viewFragmentsDictionary = new SparseArray<>(); private boolean displayingTaskForm; + @Nullable private TextView filterCountTextView; public void setActivity(MainActivity activity) { @@ -83,7 +81,7 @@ public class TasksFragment extends BaseMainFragment { viewPager = (ViewPager) v.findViewById(R.id.view_pager); View view = inflater.inflate(R.layout.floating_menu_tasks, floatingMenuWrapper, true); - if (view.getClass() == FloatingActionMenu.class) { + if (Objects.equals(view.getClass(), FloatingActionMenu.class)) { floatingMenu = (FloatingActionMenu) view; } else { ViewGroup frame = (ViewGroup) view; @@ -99,21 +97,25 @@ public class TasksFragment extends BaseMainFragment { reward_fab.setOnClickListener(v1 -> openNewTaskActivity("reward")); floatingMenu.setOnMenuButtonLongClickListener(this::onFloatingMenuLongClicked); - this.activity.unlockDrawer(GravityCompat.END); + if (this.activity != null) { + this.activity.unlockDrawer(GravityCompat.END); + } loadTaskLists(); - bottomNavigation.setOnTabSelectListener(tabId -> { - if (tabId == R.id.tab_habits) { - viewPager.setCurrentItem(0); - } else if (tabId == R.id.tab_dailies) { - viewPager.setCurrentItem(1); - } else if (tabId == R.id.tab_todos) { - viewPager.setCurrentItem(2); - } else if (tabId == R.id.tab_rewards) { - viewPager.setCurrentItem(3); - } - }); + if (bottomNavigation != null) { + bottomNavigation.setOnTabSelectListener(tabId -> { + if (tabId == R.id.tab_habits) { + viewPager.setCurrentItem(0); + } else if (tabId == R.id.tab_dailies) { + viewPager.setCurrentItem(1); + } else if (tabId == R.id.tab_todos) { + viewPager.setCurrentItem(2); + } else if (tabId == R.id.tab_rewards) { + viewPager.setCurrentItem(3); + } + }); + } return v; } @@ -164,8 +166,10 @@ public class TasksFragment extends BaseMainFragment { dialog.setTags(user.getTags()); } dialog.setActiveTags(taskFilterHelper.getTags()); - String taskType = getActiveFragment().classType; - dialog.setTaskType(taskType, taskFilterHelper.getActiveFilter(taskType)); + if (getActiveFragment() != null) { + String taskType = getActiveFragment().classType; + dialog.setTaskType(taskType, taskFilterHelper.getActiveFilter(taskType)); + } dialog.setListener((activeTaskFilter, activeTags) -> { int activePos = viewPager.getCurrentItem(); if (activePos >= 1) { @@ -182,7 +186,9 @@ public class TasksFragment extends BaseMainFragment { } public void refresh() { - getActiveFragment().onRefresh(); + if (getActiveFragment() != null) { + getActiveFragment().onRefresh(); + } } public void loadTaskLists() { @@ -229,15 +235,17 @@ public class TasksFragment extends BaseMainFragment { @Override public CharSequence getPageTitle(int position) { - switch (position) { - case 0: - return activity.getString(R.string.habits); - case 1: - return activity.getString(R.string.dailies); - case 2: - return activity.getString(R.string.todos); - case 3: - return activity.getString(R.string.rewards); + if (activity != null) { + switch (position) { + case 0: + return activity.getString(R.string.habits); + case 1: + return activity.getString(R.string.dailies); + case 2: + return activity.getString(R.string.todos); + case 3: + return activity.getString(R.string.rewards); + } } return ""; } @@ -251,7 +259,9 @@ public class TasksFragment extends BaseMainFragment { @Override public void onPageSelected(int position) { - bottomNavigation.selectTabAtPosition(position); + if (bottomNavigation != null) { + bottomNavigation.selectTabAtPosition(position); + } updateFilterIcon(); } @@ -263,6 +273,9 @@ public class TasksFragment extends BaseMainFragment { } private void updateFilterIcon() { + if (filterCountTextView == null) { + return; + } int filterCount = 0; if (getActiveFragment() != null) { filterCount = taskFilterHelper.howMany(getActiveFragment().classType); @@ -322,7 +335,9 @@ public class TasksFragment extends BaseMainFragment { @Subscribe public void onEvent(RefreshUserCommand event) { - getActiveFragment().onRefresh(); + if (getActiveFragment() != null) { + getActiveFragment().onRefresh(); + } } @Nullable @@ -369,7 +384,6 @@ public class TasksFragment extends BaseMainFragment { @Override public void onDestroyView() { - this.activity.lockDrawer(GravityCompat.END); super.onDestroyView(); } @@ -397,7 +411,7 @@ public class TasksFragment extends BaseMainFragment { private void switchToTaskTab(String taskType) { for (int index = 0; index < viewFragmentsDictionary.size(); index++) { - if (viewFragmentsDictionary.get(index).getClassName().equals(taskType)) { + if (viewFragmentsDictionary.get(index).getClassName().equals(taskType) && viewPager != null) { viewPager.setCurrentItem(index); } }