From 4ace930c32ee60600df32a3939ea7ab33f00e423 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Sun, 29 Nov 2015 16:08:35 +0100 Subject: [PATCH 01/11] Fix freezing after loading user. --- .../adapter/HabitItemRecyclerViewAdapter.java | 51 ++++++++----------- .../habitica/ui/fragments/AboutFragment.java | 1 - .../habitica/ui/fragments/TasksFragment.java | 14 ++--- 3 files changed, 29 insertions(+), 37 deletions(-) diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/adapter/HabitItemRecyclerViewAdapter.java b/Habitica/src/com/habitrpg/android/habitica/ui/adapter/HabitItemRecyclerViewAdapter.java index 78f73031d..2c415232b 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/adapter/HabitItemRecyclerViewAdapter.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/adapter/HabitItemRecyclerViewAdapter.java @@ -60,7 +60,7 @@ import de.greenrobot.event.EventBus; public class HabitItemRecyclerViewAdapter extends RecyclerView.Adapter - implements FlowContentObserver.OnModelStateChangedListener, IReceiveNewEntries { + implements IReceiveNewEntries { public interface IAdditionalEntries { @@ -74,7 +74,6 @@ public class HabitItemRecyclerViewAdapter String taskType; private ObservableArrayList filteredObservableContent; private ObservableArrayList observableContent; - FlowContentObserver observer; Context context; public int dailyResetOffset; @@ -99,10 +98,6 @@ public class HabitItemRecyclerViewAdapter this.loadContent(); - observer = new FlowContentObserver(); - observer.registerForContentChanges(this.context, Task.class); - observer.addModelChangeListener(this); - this.layoutResource = layoutResource; this.viewHolderClass = viewHolderClass; @@ -163,12 +158,6 @@ public class HabitItemRecyclerViewAdapter this.parentAdapter = parentAdapter; } - @Override - public void onViewDetachedFromWindow(ViewHolder holder) { - this.observer.unregisterForContentChanges(this.context); - super.onViewDetachedFromWindow(holder); - } - @Override public int getItemViewType(int position) { switch (position) { @@ -229,22 +218,6 @@ public class HabitItemRecyclerViewAdapter // todo use debounce - private Handler handler = new Handler(); - private Runnable reloadContentRunable = new Runnable() { - @Override - public void run() { - Log.d("Reload Content", ""); - loadContent(true); - } - }; - - - @Override - public void onModelStateChanged(Class aClass, BaseModel.Action action) { - handler.removeCallbacks(reloadContentRunable); - handler.postDelayed(reloadContentRunable, 200); - } - // region ViewHolders public abstract class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { @@ -602,6 +575,25 @@ public class HabitItemRecyclerViewAdapter // endregion + public void loadContent(HabitRPGUser user) { + Log.d("setting content", this.taskType); + this.observableContent = new ObservableArrayList<>(); + if (this.taskType.equals(Task.TYPE_HABIT)) { + this.observableContent.addAll(user.getHabits()); + } else if (this.taskType.equals(Task.TYPE_DAILY)) { + this.observableContent.addAll(user.getDailys()); + } else if (this.taskType.equals(Task.TYPE_TODO)) { + this.observableContent.addAll(user.getTodos()); + } else if (this.taskType.equals(Task.TYPE_REWARD)) { + this.observableContent.addAll(user.getRewards()); + } + if (additionalEntries != null) { + additionalEntries.GetAdditionalEntries(HabitItemRecyclerViewAdapter.this); + } + filter(); + notifyDataSetChanged(); + } + public void loadContent() { this.loadContent(false); } @@ -609,7 +601,7 @@ public class HabitItemRecyclerViewAdapter public void loadContent(boolean forced) { if (this.observableContent == null || forced) { - + Log.d("Loading content", this.taskType); this.observableContent = new ObservableArrayList<>(); new Select().from(Task.class) .where(Condition.column("type").eq(this.taskType)) @@ -630,7 +622,6 @@ public class HabitItemRecyclerViewAdapter additionalEntries.GetAdditionalEntries(HabitItemRecyclerViewAdapter.this); } filter(); - notifyDataSetChanged(); } @Override diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/AboutFragment.java b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/AboutFragment.java index 4496aa07c..eff056f1c 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/AboutFragment.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/AboutFragment.java @@ -86,7 +86,6 @@ public class AboutFragment extends Fragment { emailIntent.setType("text/plain"); emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{"mobile@habitica.com"}); emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject); - emailIntent.putExtra(Intent.EXTRA_TEXT, "MESSAGE"); startActivity(Intent.createChooser(emailIntent, "Send mail...")); } } diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/TasksFragment.java b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/TasksFragment.java index 4903f01d8..371802d0f 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/TasksFragment.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/TasksFragment.java @@ -159,7 +159,7 @@ public class TasksFragment extends BaseFragment implements TaskScoringCallback.O loadTaskLists(); if (user != null) { - FillTagFilterDrawer(user.getTags()); + fillTagFilterDrawer(user.getTags()); } return v; @@ -327,11 +327,14 @@ public class TasksFragment extends BaseFragment implements TaskScoringCallback.O public void updateUserData(HabitRPGUser user) { super.updateUserData(user); if (refreshItem != null) { - refreshItem.getActionView().clearAnimation(); + View actionView = refreshItem.getActionView(); + if (actionView != null) { + actionView.clearAnimation(); + } refreshItem.setActionView(null); } if (this.user != null) { - FillTagFilterDrawer(user.getTags()); + fillTagFilterDrawer(user.getTags()); TaskRecyclerViewFragment fragment = ViewFragmentsDictionary.get(2); if (fragment != null) { HabitItemRecyclerViewAdapter adapter = (HabitItemRecyclerViewAdapter) fragment.mAdapter; @@ -393,7 +396,7 @@ public class TasksFragment extends BaseFragment implements TaskScoringCallback.O mAPIHelper.apiService.createTag(t, new Callback>() { @Override public void success(List tags, Response response) { - FillTagFilterDrawer(tags); + fillTagFilterDrawer(tags); } @Override @@ -612,7 +615,7 @@ public class TasksFragment extends BaseFragment implements TaskScoringCallback.O } - public void FillTagFilterDrawer(List tagList) { + public void fillTagFilterDrawer(List tagList) { filterDrawer.removeAllItems(); filterDrawer.addItems( new SectionDrawerItem().withName("Filter by Tag"), @@ -623,7 +626,6 @@ public class TasksFragment extends BaseFragment implements TaskScoringCallback.O filterDrawer.addItem(new SwitchDrawerItem() .withName(t.getName()) .withTag(t) - .withDescription("" + t.getTasks().size()) .withOnCheckedChangeListener(this) ); } From 2ba2ce3350fd1688564b6fa4fff324c1aa685619 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Sun, 29 Nov 2015 17:12:35 +0100 Subject: [PATCH 02/11] default to all days checked when creating task. Fixes #62 --- .../src/com/habitrpg/android/habitica/TaskFormActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Habitica/src/com/habitrpg/android/habitica/TaskFormActivity.java b/Habitica/src/com/habitrpg/android/habitica/TaskFormActivity.java index 4a90c2544..bedb86b24 100644 --- a/Habitica/src/com/habitrpg/android/habitica/TaskFormActivity.java +++ b/Habitica/src/com/habitrpg/android/habitica/TaskFormActivity.java @@ -148,6 +148,7 @@ public class TaskFormActivity extends AppCompatActivity implements AdapterView.O View weekdayRow = getLayoutInflater().inflate(R.layout.row_checklist, null); TextView tv = (TextView) weekdayRow.findViewById(R.id.label); CheckBox checkbox = (CheckBox) weekdayRow.findViewById(R.id.checkbox); + checkbox.setChecked(true); this.weekdayCheckboxes.add(checkbox); tv.setText(weekdays[i]); this.frequencyContainer.addView(weekdayRow); @@ -327,7 +328,6 @@ public class TaskFormActivity extends AppCompatActivity implements AdapterView.O public void onBackPressed() { this.prepareSave(); finish(); - super.onBackPressed(); } private TransactionListener> tagsSearchingListener = new TransactionListener>() { From 1fb1139eaa2887dc5be4b88c1c217bf6c3db8580 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Sun, 29 Nov 2015 17:13:15 +0100 Subject: [PATCH 03/11] better feedback when updating tasks. --- .../habitica/callbacks/HabitRPGUserCallback.java | 3 --- .../ui/adapter/HabitItemRecyclerViewAdapter.java | 15 +++++++++++++-- .../habitica/ui/fragments/TasksFragment.java | 1 - 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/Habitica/src/com/habitrpg/android/habitica/callbacks/HabitRPGUserCallback.java b/Habitica/src/com/habitrpg/android/habitica/callbacks/HabitRPGUserCallback.java index c03346a90..8b4e2d213 100644 --- a/Habitica/src/com/habitrpg/android/habitica/callbacks/HabitRPGUserCallback.java +++ b/Habitica/src/com/habitrpg/android/habitica/callbacks/HabitRPGUserCallback.java @@ -22,7 +22,6 @@ public class HabitRPGUserCallback implements Callback { @Override public void success(HabitRPGUser habitRPGUser, Response response) { - Log.d("db", "saving"); habitRPGUser.async().save(); @@ -33,8 +32,6 @@ public class HabitRPGUserCallback implements Callback { public void failure(RetrofitError error) { Crashlytics.getInstance().core.logException(error); - Log.w("OMG", "user failed!" + error.getMessage()); - mCallback.onUserFail(); } diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/adapter/HabitItemRecyclerViewAdapter.java b/Habitica/src/com/habitrpg/android/habitica/ui/adapter/HabitItemRecyclerViewAdapter.java index 2c415232b..a1ee46f74 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/adapter/HabitItemRecyclerViewAdapter.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/adapter/HabitItemRecyclerViewAdapter.java @@ -115,14 +115,15 @@ public class HabitItemRecyclerViewAdapter if(evnt.completed && evnt.Task.getType().equals("todo")){ // remove from the list observableContent.remove(evnt.Task); - filter(); } + this.updateTask(evnt.Task); + filter(); } public void onEvent(TaskUpdatedEvent evnt) { if (!taskType.equals(evnt.task.getType())) return; - + this.updateTask(evnt.task); filter(); } @@ -134,6 +135,16 @@ public class HabitItemRecyclerViewAdapter filter(); } + private void updateTask(Task task) { + int i; + for(i = 0; i < this.observableContent.size(); ++i) { + if (observableContent.get(i).getId().equals(task.getId())) { + break; + } + } + observableContent.set(i, task); + } + private void filter() { if (this.tagsHelper.howMany() == 0) { filteredObservableContent = observableContent; diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/TasksFragment.java b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/TasksFragment.java index 371802d0f..6e3611801 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/TasksFragment.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/TasksFragment.java @@ -488,7 +488,6 @@ public class TasksFragment extends BaseFragment implements TaskScoringCallback.O public void onEvent(final TaskSaveEvent event) { Task task = (Task) event.task; - Log.d("tags", "Task saving"); if (event.created) { this.mAPIHelper.createNewTask(task, new TaskCreationCallback()); updateTags(event.task.getTags()); From 259e725602d2d4bb8eeb20bf28f728e477974b90 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Sun, 29 Nov 2015 17:34:04 +0100 Subject: [PATCH 04/11] correct daily checklist rendering --- Habitica/res/layout/daily_item_card.xml | 2 +- .../com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Habitica/res/layout/daily_item_card.xml b/Habitica/res/layout/daily_item_card.xml index eb27ca79c..41152c3de 100644 --- a/Habitica/res/layout/daily_item_card.xml +++ b/Habitica/res/layout/daily_item_card.xml @@ -75,7 +75,7 @@ android:id="@+id/checklistIndicatorWrapper" android:layout_width="@dimen/checklist_wrapper_width" android:layout_height="match_parent" - app:backgroundColor="@{daily.isChecklistDisplayActive(offset) ? @color/task_gray : daily.getLightTaskColor}" + app:backgroundColor="@{daily.isChecklistDisplayActive(offset) ? daily.getLightTaskColor : @color/task_gray}" android:visibility="@{daily.checklist.size > 0 ? View.VISIBLE : View.GONE}" android:gravity="center" android:layout_alignParentTop="true" diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java index be3ca7fd0..ddb177f7d 100644 --- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java +++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java @@ -482,6 +482,6 @@ public class Task extends BaseModel { } public Boolean isChecklistDisplayActive(int offset) { - return this.isDisplayedActive(offset) || (this.checklist.size() != this.getCompletedChecklistCount()); + return this.isDisplayedActive(offset) && (this.checklist.size() != this.getCompletedChecklistCount()); } } From 65df55f57e478b01e01aab244c3721b677c856fc Mon Sep 17 00:00:00 2001 From: Negue Date: Sun, 29 Nov 2015 21:10:32 +0100 Subject: [PATCH 05/11] [#19] Purchase Gems now working :) --- Habitica/build.gradle | 2 +- Habitica/res/layout/fragment_gem_purchase.xml | 16 ++- .../habitrpg/android/habitica/APIHelper.java | 26 ++++- .../android/habitica/HabiticaApplication.java | 33 ++---- .../habitica/HabiticaPurchaseVerifier.java | 44 ++++++++ .../android/habitica/LoginActivity.java | 8 +- .../android/habitica/MainActivity.java | 42 ++++++-- .../habitica/events/BoughtGemsEvent.java | 12 +++ .../OpenGemPurchaseFragmentCommand.java | 7 ++ .../habitica/ui/AvatarWithBarsViewModel.java | 27 ++++- .../habitica/ui/MainDrawerBuilder.java | 14 +-- .../ui/fragments/GemsPurchaseFragment.java | 102 ++++++++++++++---- .../lib/api/InAppPurchasesApiService.java | 17 +++ .../habitrpgwrapper/lib/api/Server.java | 30 ++++-- .../lib/models/PurchaseValidationRequest.java | 9 ++ .../lib/models/PurchaseValidationResult.java | 6 ++ .../lib/models/Transaction.java | 8 ++ 17 files changed, 325 insertions(+), 78 deletions(-) create mode 100644 Habitica/src/com/habitrpg/android/habitica/HabiticaPurchaseVerifier.java create mode 100644 Habitica/src/com/habitrpg/android/habitica/events/BoughtGemsEvent.java create mode 100644 Habitica/src/com/habitrpg/android/habitica/events/commands/OpenGemPurchaseFragmentCommand.java create mode 100644 Habitica/src/com/magicmicky/habitrpgwrapper/lib/api/InAppPurchasesApiService.java create mode 100644 Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/PurchaseValidationRequest.java create mode 100644 Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/PurchaseValidationResult.java create mode 100644 Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/Transaction.java diff --git a/Habitica/build.gradle b/Habitica/build.gradle index f5fcf8509..ee762421c 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -88,7 +88,7 @@ dependencies { compile 'de.greenrobot:eventbus:2.4.0' // IAP Handling / Verification - compile 'org.solovyev.android:checkout:0.7.4@aar' + compile 'org.solovyev.android:checkout:0.7.5@aar' compile 'com.facebook.android:facebook-android-sdk:4.7.0' //Material Dialogs diff --git a/Habitica/res/layout/fragment_gem_purchase.xml b/Habitica/res/layout/fragment_gem_purchase.xml index c4fc54f2a..acf89a30f 100644 --- a/Habitica/res/layout/fragment_gem_purchase.xml +++ b/Habitica/res/layout/fragment_gem_purchase.xml @@ -3,10 +3,22 @@ android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> + + + +