From c9e376466d445be156ee1996fea75f5bc7c06fc6 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Tue, 12 Sep 2017 22:16:59 +0200 Subject: [PATCH] fix various crashes --- Habitica/res/layout-w320dp/party_member.xml | 1 + Habitica/res/layout/activity_main.xml | 1 + Habitica/res/layout/avatar_category.xml | 1 - Habitica/res/layout/challenge_item.xml | 1 + Habitica/res/layout/party_member.xml | 1 + Habitica/res/layout/profile_gear_tablerow.xml | 3 +- Habitica/res/layout/tavern_chat_item.xml | 5 ++- .../habitica/HabiticaBaseApplication.java | 3 ++ .../android/habitica/api/ApiService.java | 4 +-- .../android/habitica/data/ApiClient.java | 4 +-- .../habitica/data/SocialRepository.java | 2 +- .../data/implementation/ApiClientImpl.java | 4 +-- .../implementation/SocialRepositoryImpl.java | 2 +- .../implementation/UserRepositoryImpl.java | 2 -- .../habitica/helpers/RemoteConfigManager.java | 4 ++- .../habitica/helpers/TaskFilterHelper.java | 4 +-- .../android/habitica/models/tasks/Task.java | 11 +++--- .../receivers/NotificationPublisher.java | 2 +- .../ui/activities/TaskFormActivity.java | 14 +++++--- .../ui/adapter/social/AchievementAdapter.java | 2 +- .../social/ChallengesListViewAdapter.java | 5 +-- .../PartyMemberRecyclerViewAdapter.java | 6 ++-- .../PublicGuildsRecyclerViewAdapter.java | 2 +- .../ChallengeTasksRecyclerViewAdapter.java | 2 +- .../tasks/DailiesRecyclerViewHolder.java | 4 +-- .../ui/fragments/skills/SkillsFragment.java | 3 ++ .../ui/fragments/social/ChatListFragment.java | 4 ++- .../social/InboxMessageListFragment.java | 4 ++- .../ChallengeDetailDialogHolder.java | 3 ++ .../ChallengeTasksRecyclerViewFragment.java | 4 ++- .../tasks/TaskRecyclerViewFragment.java | 6 ++-- .../ui/fragments/tasks/TasksFragment.java | 34 ++++++------------- .../tasks/ChecklistedViewHolder.java | 3 ++ .../ui/viewHolders/tasks/DailyViewHolder.java | 8 ++--- .../viewHolders/tasks/RewardViewHolder.java | 3 ++ .../yesterdailies/YesterdailyDialog.java | 3 +- .../habitica/widget/TaskListFactory.java | 14 ++------ 37 files changed, 94 insertions(+), 85 deletions(-) diff --git a/Habitica/res/layout-w320dp/party_member.xml b/Habitica/res/layout-w320dp/party_member.xml index 12b658a15..c77470a1b 100644 --- a/Habitica/res/layout-w320dp/party_member.xml +++ b/Habitica/res/layout-w320dp/party_member.xml @@ -72,6 +72,7 @@ android:layout_margin="5dp" android:ellipsize="middle" android:lines="1" + android:singleLine="true" android:text="class" android:textColor="@color/white" /> diff --git a/Habitica/res/layout/activity_main.xml b/Habitica/res/layout/activity_main.xml index 974b1d421..96ab21a1f 100644 --- a/Habitica/res/layout/activity_main.xml +++ b/Habitica/res/layout/activity_main.xml @@ -59,6 +59,7 @@ android:layout_centerVertical="true" android:ellipsize="end" android:maxLines="1" + android:singleLine="true" style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title" tools:text="Habitica"/> diff --git a/Habitica/res/layout/avatar_category.xml b/Habitica/res/layout/avatar_category.xml index 00ba40347..d610d4b8d 100644 --- a/Habitica/res/layout/avatar_category.xml +++ b/Habitica/res/layout/avatar_category.xml @@ -7,7 +7,6 @@ android:textAllCaps="true" android:paddingTop="8dp" android:textColor="@color/white_50_alpha" - android:ellipsize="marquee" android:layout_width="70dp" android:layout_height="70dp" android:gravity="center" diff --git a/Habitica/res/layout/challenge_item.xml b/Habitica/res/layout/challenge_item.xml index 8e5a1ccbb..8f9b5bac7 100644 --- a/Habitica/res/layout/challenge_item.xml +++ b/Habitica/res/layout/challenge_item.xml @@ -48,6 +48,7 @@ android:layout_gravity="center" android:ellipsize="middle" android:lines="1" + android:singleLine="true" tools:text="0" android:textColor="@color/gem_icon_color" android:textSize="12sp" diff --git a/Habitica/res/layout/party_member.xml b/Habitica/res/layout/party_member.xml index a0cb29ceb..b12013ee4 100644 --- a/Habitica/res/layout/party_member.xml +++ b/Habitica/res/layout/party_member.xml @@ -73,6 +73,7 @@ android:layout_margin="5dp" android:ellipsize="middle" android:lines="1" + android:singleLine="true" tools:text="class" android:textColor="@color/white" /> diff --git a/Habitica/res/layout/profile_gear_tablerow.xml b/Habitica/res/layout/profile_gear_tablerow.xml index f4acb571e..bf0469e32 100644 --- a/Habitica/res/layout/profile_gear_tablerow.xml +++ b/Habitica/res/layout/profile_gear_tablerow.xml @@ -17,7 +17,8 @@ android:id="@+id/tableRowTextView1" android:layout_width="wrap_content" android:layout_height="wrap_content" - + android:singleLine="true" + android:lines="1" android:textSize="@dimen/abc_text_size_subhead_material" android:ellipsize="end" /> diff --git a/Habitica/res/layout/tavern_chat_item.xml b/Habitica/res/layout/tavern_chat_item.xml index fbde8f71c..760bb2f45 100644 --- a/Habitica/res/layout/tavern_chat_item.xml +++ b/Habitica/res/layout/tavern_chat_item.xml @@ -37,6 +37,7 @@ android:layout_margin="5dp" android:ellipsize="middle" android:lines="1" + android:singleLine="true" tools:text="Username" /> @@ -102,6 +103,8 @@ android:layout_height="wrap_content" android:layout_gravity="center|right" android:layout_marginRight="8dp" - android:ellipsize="end" /> + android:singleLine="true" + android:lines="1" + android:ellipsize="end"/> \ No newline at end of file diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaBaseApplication.java b/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaBaseApplication.java index 202a52ae1..957713f8f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaBaseApplication.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaBaseApplication.java @@ -15,6 +15,7 @@ import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.multidex.MultiDexApplication; +import android.support.v7.app.AppCompatDelegate; import android.util.Log; import com.amplitude.api.Amplitude; @@ -125,6 +126,8 @@ public abstract class HabiticaBaseApplication extends MultiDexApplication { createBillingAndCheckout(); HabiticaIconsHelper.init(this); + AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); + if (!BuildConfig.DEBUG) { try { Amplitude.getInstance().initialize(this, getString(R.string.amplitude_app_id)).enableForegroundTracking(this); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.java b/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.java index ede1bc177..75ffa285c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.java @@ -179,7 +179,7 @@ public interface ApiService { Observable> disableClasses(); @POST("user/mark-pms-read") - Observable> markPrivateMessagesRead(); + Observable>> markPrivateMessagesRead(); @@ -276,7 +276,7 @@ public interface ApiService { //Push notifications @POST("user/push-devices") - Observable> addPushDevice(@Body Map pushDeviceData); + Observable>> addPushDevice(@Body Map pushDeviceData); @DELETE("user/push-devices/{regId}") Observable> deletePushDevice(@Path("regId") String regId); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.java index a596df004..a7c859538 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.java @@ -127,7 +127,7 @@ public interface ApiClient { Observable disableClasses(); - Observable markPrivateMessagesRead(); + Observable> markPrivateMessagesRead(); /* Group API */ @@ -190,7 +190,7 @@ public interface ApiClient { Observable fetchShopInventory(String identifier); //Push notifications - Observable addPushDevice(Map pushDeviceData); + Observable> addPushDevice(Map pushDeviceData); Observable deletePushDevice(String regId); 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 45498d9ec..b3c5eedcf 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 @@ -57,7 +57,7 @@ public interface SocialRepository extends BaseRepository { Observable getMember(String userId); - Observable markPrivateMessagesRead(User user); + Observable> markPrivateMessagesRead(User user); Observable> getUserGroups(); 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 a7e278ac8..176bd9651 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 @@ -636,7 +636,7 @@ public class ApiClientImpl implements Action1, ApiClient { } @Override - public Observable markPrivateMessagesRead() { + public Observable> markPrivateMessagesRead() { return apiService.markPrivateMessagesRead().compose(configureApiCallObserver()); } @@ -786,7 +786,7 @@ public class ApiClientImpl implements Action1, ApiClient { } @Override - public Observable addPushDevice(Map pushDeviceData) { + public Observable> addPushDevice(Map pushDeviceData) { return apiService.addPushDevice(pushDeviceData).compose(configureApiCallObserver()); } 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 1a44b8afc..0334fee48 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 @@ -210,7 +210,7 @@ public class SocialRepositoryImpl extends BaseRepositoryImpl markPrivateMessagesRead(User user) { + public Observable> markPrivateMessagesRead(User user) { return apiClient.markPrivateMessagesRead() .doOnNext(aVoid -> localRepository.executeTransaction(realm -> user.getInbox().setNewMessages(0))); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.java index d5dca4f3a..651bee102 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.java @@ -33,7 +33,6 @@ import rx.Observable; public class UserRepositoryImpl extends BaseRepositoryImpl implements UserRepository { - private final Context context; private Date lastSync; private String userId; @@ -42,7 +41,6 @@ public class UserRepositoryImpl extends BaseRepositoryImpl public UserRepositoryImpl(UserLocalRepository localRepository, ApiClient apiClient, Context context, String userId, TaskRepository taskRepository) { super(localRepository, apiClient); this.taskRepository = taskRepository; - this.context = context; this.userId = userId; } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/RemoteConfigManager.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/RemoteConfigManager.java index 069136e74..2e9ea2bea 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/RemoteConfigManager.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/RemoteConfigManager.java @@ -53,7 +53,9 @@ public class RemoteConfigManager { try { JSONObject obj = new JSONObject(storedPreferences); enableRepeatbles = obj.getBoolean("enableRepeatables"); - enableNewShops = obj.getBoolean("enableNewShops"); + if (obj.has("enableNewShops")) { + enableNewShops = obj.getBoolean("enableNewShops"); + } } catch (JSONException e) { e.printStackTrace(); } 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 8b54dbceb..eb5bfb569 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 @@ -81,12 +81,12 @@ public class TaskFilterHelper { switch (activeFilter) { case Task.FILTER_ACTIVE: if (task.type.equals(Task.TYPE_DAILY)) { - return task.isDisplayedActive(0); + return task.isDisplayedActive(); } else { return !task.completed; } case Task.FILTER_GRAY: - return task.completed || !task.isDisplayedActive(0); + return task.completed || !task.isDisplayedActive(); case Task.FILTER_WEAK: return task.value < 0; case Task.FILTER_STRONG: diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/Task.java b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/Task.java index 409ee8ec0..8fdde8dff 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/Task.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/Task.java @@ -450,13 +450,12 @@ public class Task extends RealmObject implements Parcelable { return R.color.blue_10; } - public Boolean checkIfDue(int offset) { + public Boolean checkIfDue() { if (this.getCompleted()) { return true; } Calendar today = new GregorianCalendar(); - today.add(Calendar.HOUR, -offset); Calendar startDate = new GregorianCalendar(); Calendar startDateAtMidnight; @@ -489,15 +488,15 @@ public class Task extends RealmObject implements Parcelable { } } - public Boolean isDisplayedActive(int offset) { + public Boolean isDisplayedActive() { if (this.isDue != null && !this.completed) { return this.isDue; } - return this.checkIfDue(offset) && !this.completed; + return this.checkIfDue() && !this.completed; } - public Boolean isChecklistDisplayActive(int offset) { - return this.isDisplayedActive(offset) && (this.checklist.size() != this.getCompletedChecklistCount()); + public Boolean isChecklistDisplayActive() { + return this.isDisplayedActive() && (this.checklist.size() != this.getCompletedChecklistCount()); } @Nullable diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/NotificationPublisher.java b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/NotificationPublisher.java index f660fda52..2d3d4290e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/NotificationPublisher.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/NotificationPublisher.java @@ -49,7 +49,7 @@ public class NotificationPublisher extends WakefulBroadcastReceiver { taskRepository.getTasks(Task.TYPE_DAILY, userId).subscribe(dailies -> { boolean showNotifications = false; for (Task task : dailies) { - if (task.checkIfDue(0)) { + if (task.checkIfDue()) { showNotifications = true; break; } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.java index d53ed959b..949c6e54f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.java @@ -82,6 +82,8 @@ import butterknife.BindView; import butterknife.OnClick; import io.realm.RealmList; +import static android.widget.AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL; + public class TaskFormActivity extends BaseActivity implements AdapterView.OnItemSelectedListener { public static final String TASK_ID_KEY = "taskId"; public static final String USER_ID_KEY = "userId"; @@ -770,7 +772,6 @@ public class TaskFormActivity extends BaseActivity implements AdapterView.OnItem } private void changeEmojiKeyboardIcon(Boolean keyboardOpened) { - if (keyboardOpened) { emojiToggle0.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.ic_keyboard_grey600_24dp)); emojiToggle1.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.ic_keyboard_grey600_24dp)); @@ -825,6 +826,7 @@ public class TaskFormActivity extends BaseActivity implements AdapterView.OnItem remindersRecyclerView.setLayoutManager(new WrapContentRecyclerViewLayoutManager(this)); + ItemTouchHelper.Callback callback = new SimpleItemTouchHelperCallback(remindersAdapter); ItemTouchHelper mItemTouchHelper = new ItemTouchHelper(callback); mItemTouchHelper.attachToRecyclerView(remindersRecyclerView); @@ -941,8 +943,7 @@ public class TaskFormActivity extends BaseActivity implements AdapterView.OnItem this.frequencyContainer.addView(dayRow); } - if (this.task != null) { - + if (this.task != null && this.task.isValid()) { if (this.dailyFrequencySpinner.getSelectedItemPosition() == 0) { int offset = firstDayOfTheWeekHelper.getDailyTaskFormOffset(); this.weekdayCheckboxes.get(offset).setChecked(this.task.getRepeat().getM()); @@ -1098,8 +1099,12 @@ public class TaskFormActivity extends BaseActivity implements AdapterView.OnItem } taskRepository.executeTransaction(realm -> { - task.text = text; + try { + task.text = text; + task.notes = MarkdownParser.parseCompiled(taskNotes.getText()); + } catch (IllegalArgumentException ignored) { + } if (checklistAdapter != null) { if (checklistAdapter.getCheckListItems() != null) { RealmList newChecklist = new RealmList<>(); @@ -1121,7 +1126,6 @@ public class TaskFormActivity extends BaseActivity implements AdapterView.OnItem taskTags.addAll(selectedTags); task.setTags(taskTags); - task.notes = MarkdownParser.parseCompiled(taskNotes.getText()); if (taskDifficultySpinner.getSelectedItemPosition() == 0) { task.setPriority((float) 0.1); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/AchievementAdapter.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/AchievementAdapter.java index 9b970bac8..6719abe85 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/AchievementAdapter.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/AchievementAdapter.java @@ -132,7 +132,7 @@ public class AchievementAdapter extends RecyclerView.Adapter userClickedEvents.onNext(user.getId())); + if (itemView != null) { + itemView.setClickable(true); + itemView.setOnClickListener(view -> userClickedEvents.onNext(user.getId())); + } } } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/PublicGuildsRecyclerViewAdapter.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/PublicGuildsRecyclerViewAdapter.java index 08ac9b133..d8ecf4a1f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/PublicGuildsRecyclerViewAdapter.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/PublicGuildsRecyclerViewAdapter.java @@ -86,7 +86,7 @@ public class PublicGuildsRecyclerViewAdapter extends RealmRecyclerViewAdapter { - public int dailyResetOffset; public DailiesRecyclerViewHolder(@Nullable OrderedRealmCollection data, boolean autoUpdate, int layoutResource, int dailyResetOffset, TaskFilterHelper taskFilterHelper) { super(data, autoUpdate, layoutResource, taskFilterHelper); - this.dailyResetOffset = dailyResetOffset; } @Override public DailyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - return new DailyViewHolder(getContentView(parent), dailyResetOffset); + return new DailyViewHolder(getContentView(parent)); } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillsFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillsFragment.java index 32c489503..4092e80b8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillsFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillsFragment.java @@ -176,6 +176,9 @@ public class SkillsFragment extends BaseMainFragment { } private void useSkill(Skill skill, @Nullable String taskId) { + if (skill == null) { + return; + } displayProgressDialog(); Observable observable; if (taskId != null) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatListFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatListFragment.java index 559122263..665dd0c78 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatListFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatListFragment.java @@ -274,7 +274,9 @@ public class ChatListFragment extends BaseFragment implements SwipeRefreshLayout if (chatText.length() > 0) { chatEditText.setText(null); socialRepository.postGroupChat(groupId, chatText).subscribe(postChatMessageResult -> { - recyclerView.scrollToPosition(0); + if (recyclerView != null) { + recyclerView.scrollToPosition(0); + } }, RxErrorHandler.handleEmptyError()); } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.java index fe81e8348..9a3e29a80 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.java @@ -182,7 +182,9 @@ public class InboxMessageListFragment extends BaseMainFragment if (chatText.length() > 0) { chatEditText.setText(null); socialRepository.postPrivateMessage(replyToUserUUID, chatText).subscribe(postChatMessageResult -> { - recyclerView.scrollToPosition(0); + if (recyclerView != null) { + recyclerView.scrollToPosition(0); + } }, RxErrorHandler.handleEmptyError()); } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeDetailDialogHolder.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeDetailDialogHolder.java index 1120aff93..2271bddc2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeDetailDialogHolder.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeDetailDialogHolder.java @@ -80,6 +80,9 @@ public class ChallengeDetailDialogHolder { } public static void showDialog(Activity activity, ChallengeRepository challengeRepository, Challenge challenge, Action1 challengeLeftAction) { + if (activity == null) { + return; + } View dialogLayout = activity.getLayoutInflater().inflate(R.layout.dialog_challenge_detail, null); ChallengeDetailDialogHolder challengeDetailDialogHolder = new ChallengeDetailDialogHolder(dialogLayout, activity); 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 50c317909..81f7a10ae 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 @@ -78,7 +78,9 @@ public class ChallengeTasksRecyclerViewFragment extends BaseFragment { public void setInnerAdapter() { this.recyclerAdapter = new ChallengeTasksRecyclerViewAdapter(null, 0, getContext(), userID, null, true, true); - this.recyclerAdapter.setDailyResetOffset(user.getPreferences().getDayStart()); + if (user != null && user.getPreferences() != null) { + this.recyclerAdapter.setDailyResetOffset(user.getPreferences().getDayStart()); + } 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 7f7d4655a..a960e5c24 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 @@ -221,8 +221,10 @@ public class TaskRecyclerViewFragment extends BaseFragment implements View.OnCli if (swipeRefreshLayout != null) { swipeRefreshLayout.setEnabled(true); } - - viewHolder.itemView.setBackgroundColor(Color.WHITE); + + if (viewHolder != null) { + viewHolder.itemView.setBackgroundColor(Color.WHITE); + } if (mFromPosition != null) { taskRepository.updateTaskPosition(viewHolder.getAdapterPosition()) .subscribe(taskPositions -> { 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 8920eb82f..99efb4b27 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 @@ -7,7 +7,6 @@ import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; -import android.util.SparseArray; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -30,8 +29,6 @@ import com.habitrpg.android.habitica.models.tasks.Task; import com.habitrpg.android.habitica.models.user.User; import com.habitrpg.android.habitica.ui.activities.MainActivity; import com.habitrpg.android.habitica.ui.activities.TaskFormActivity; -import com.habitrpg.android.habitica.ui.adapter.tasks.DailiesRecyclerViewHolder; -import com.habitrpg.android.habitica.ui.adapter.tasks.TaskRecyclerViewAdapter; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; import com.habitrpg.android.habitica.ui.views.tasks.TaskFilterDialog; import com.roughike.bottombar.BottomBarTab; @@ -42,6 +39,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Locale; +import java.util.Map; +import java.util.WeakHashMap; import javax.inject.Inject; @@ -57,7 +56,7 @@ public class TasksFragment extends BaseMainFragment { TagRepository tagRepository; MenuItem refreshItem; FloatingActionMenu floatingMenu; - SparseArray viewFragmentsDictionary = new SparseArray<>(); + Map viewFragmentsDictionary = new WeakHashMap<>(); private boolean displayingTaskForm; @Nullable @@ -127,10 +126,11 @@ public class TasksFragment extends BaseMainFragment { } private boolean onFloatingMenuLongClicked(View view) { - int currentType = viewPager.getCurrentItem(); - TaskRecyclerViewFragment currentFragment = viewFragmentsDictionary.get(currentType); - String className = currentFragment.getClassName(); - openNewTaskActivity(className); + TaskRecyclerViewFragment currentFragment = getActiveFragment(); + if (currentFragment != null) { + String className = currentFragment.getClassName(); + openNewTaskActivity(className); + } return true; } @@ -181,10 +181,10 @@ public class TasksFragment extends BaseMainFragment { return; } int activePos = viewPager.getCurrentItem(); - if (activePos >= 1 && viewFragmentsDictionary.get(activePos-1).recyclerAdapter != null) { + if (activePos >= 1 && viewFragmentsDictionary.get(activePos-1) != null && activePos >= 1 && viewFragmentsDictionary.get(activePos-1).recyclerAdapter != null) { viewFragmentsDictionary.get(activePos-1).recyclerAdapter.filter(); } - if (activePos < viewPager.getAdapter().getCount()-1 && viewFragmentsDictionary.get(activePos+1).recyclerAdapter != null) { + if (activePos < viewPager.getAdapter().getCount()-1 && viewFragmentsDictionary.get(activePos+1) != null && viewFragmentsDictionary.get(activePos+1).recyclerAdapter != null) { viewFragmentsDictionary.get(activePos+1).recyclerAdapter.filter(); } if (getActiveFragment() != null) { @@ -341,19 +341,6 @@ public class TasksFragment extends BaseMainFragment { //region Events public void updateUserData(User user) { super.updateUserData(user); - if (this.user != null) { - for (int index = 0; index < viewFragmentsDictionary.size(); index++) { - TaskRecyclerViewFragment fragment = viewFragmentsDictionary.get(index); - if (fragment != null) { - TaskRecyclerViewAdapter adapter = fragment.recyclerAdapter; - if (adapter.getClass().equals(DailiesRecyclerViewHolder.class)) { - final DailiesRecyclerViewHolder dailyAdapter = (DailiesRecyclerViewHolder) fragment.recyclerAdapter; - dailyAdapter.dailyResetOffset = this.user.getPreferences().getDayStart(); - } - //AsyncTask.execute(() -> adapter.loadContent(true)); - } - } - } } private void openNewTaskActivity(String type) { @@ -382,6 +369,7 @@ public class TasksFragment extends BaseMainFragment { @Nullable private TaskRecyclerViewFragment getActiveFragment() { + return viewFragmentsDictionary.get(viewPager.getCurrentItem()); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/ChecklistedViewHolder.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/ChecklistedViewHolder.java index 68583f885..c8c8c009f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/ChecklistedViewHolder.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/ChecklistedViewHolder.java @@ -146,6 +146,9 @@ public abstract class ChecklistedViewHolder extends BaseTaskViewHolder implement @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (buttonView.equals(checkbox)) { + if (!task.isValid()) { + return; + } if (isChecked != task.getCompleted()) { TaskCheckedCommand event = new TaskCheckedCommand(); event.Task = task; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/DailyViewHolder.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/DailyViewHolder.java index d430a6bc7..c45b0543f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/DailyViewHolder.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/DailyViewHolder.java @@ -10,19 +10,17 @@ import butterknife.BindView; public class DailyViewHolder extends ChecklistedViewHolder { - private final int dailyResetOffset; @BindView(R.id.streakTextView) TextView streakTextView; - public DailyViewHolder(View itemView, int dailyResetOffset) { + public DailyViewHolder(View itemView) { super(itemView); - this.dailyResetOffset = dailyResetOffset; } @Override public void bindHolder(Task newTask, int position) { super.bindHolder(newTask, position); - if (this.task.isChecklistDisplayActive(dailyResetOffset)) { + if (this.task.isChecklistDisplayActive()) { this.checklistIndicatorWrapper.setBackgroundResource(this.task.getLightTaskColor()); } else { this.checklistIndicatorWrapper.setBackgroundColor(this.taskGray); @@ -31,7 +29,7 @@ public class DailyViewHolder extends ChecklistedViewHolder { @Override public Boolean shouldDisplayAsActive() { - return this.task.isDisplayedActive(this.dailyResetOffset); + return this.task.isDisplayedActive(); } @Override diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/RewardViewHolder.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/RewardViewHolder.java index d6329bbb6..84abded41 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/RewardViewHolder.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/RewardViewHolder.java @@ -62,6 +62,9 @@ public class RewardViewHolder extends BaseTaskViewHolder { @Override public void onClick(View v) { + if (!task.isValid()) { + return; + } if (task.specialTag != null && task.specialTag.equals("item")) { ItemDetailDialog dialog = new ItemDetailDialog(context); dialog.setTitle(task.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 f27ddd998..669332f4c 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 @@ -8,7 +8,6 @@ import android.support.annotation.NonNull; import android.view.LayoutInflater; import android.view.View; import android.widget.CheckBox; -import android.widget.CompoundButton; import android.widget.LinearLayout; import android.widget.TextView; @@ -90,7 +89,7 @@ public class YesterdailyDialog extends AlertDialog { } private void configureTaskView(View taskView, Task task) { - boolean completed = !task.isDisplayedActive(0); + boolean completed = !task.isDisplayedActive(); CheckBox checkbox = (CheckBox) taskView.findViewById(R.id.checkBox); View checkboxHolder = taskView.findViewById(R.id.checkBoxHolder); checkbox.setChecked(completed); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListFactory.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListFactory.java index 3591ed34d..597883d00 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListFactory.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListFactory.java @@ -39,7 +39,6 @@ public abstract class TaskListFactory implements RemoteViewsService.RemoteViewsF TaskRepository taskRepository; @Inject UserRepository userRepository; - private Integer customDayStart; private int listItemResId; private int listItemTextResId; private String taskType; @@ -58,16 +57,7 @@ public abstract class TaskListFactory implements RemoteViewsService.RemoteViewsF if (userID == null) { HabiticaApplication.getComponent().inject(this); } - - if (customDayStart == null) { - userRepository.getUser(userID) - .subscribe(habitRPGUser -> { - customDayStart = habitRPGUser.getPreferences().getDayStart(); - this.loadData(); - }, RxErrorHandler.handleEmptyError()); - } else { - this.loadData(); - } + this.loadData(); } private void loadData() { @@ -75,7 +65,7 @@ public abstract class TaskListFactory implements RemoteViewsService.RemoteViewsF mainHandler.post(() -> taskRepository.getTasks(taskType, userID) .first() .flatMap(Observable::from) - .filter(task -> (task.type.equals(Task.TYPE_TODO) && !task.completed) || task.isDisplayedActive(customDayStart)) + .filter(task -> (task.type.equals(Task.TYPE_TODO) && !task.completed) || task.isDisplayedActive()) .toList() .flatMap(tasks -> taskRepository.getTaskCopies(tasks)) .subscribeOn(AndroidSchedulers.mainThread())