From 22b1e542cbf3bb4da35bc0d5b2ce92400856c20c Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Mon, 6 Jul 2015 19:20:52 +0200 Subject: [PATCH] load task and user data from database --- .../android/habitica/MainActivity.java | 84 ++++++++++--------- .../adapter/HabitItemRecyclerViewAdapter.java | 42 ++++++++-- .../lib/HabitRPGInteractor.java | 2 - .../lib/models/HabitRPGUser.java | 17 ++-- 4 files changed, 94 insertions(+), 51 deletions(-) diff --git a/Habitica/src/com/habitrpg/android/habitica/MainActivity.java b/Habitica/src/com/habitrpg/android/habitica/MainActivity.java index f43ecc672..4d76b6fee 100644 --- a/Habitica/src/com/habitrpg/android/habitica/MainActivity.java +++ b/Habitica/src/com/habitrpg/android/habitica/MainActivity.java @@ -32,8 +32,11 @@ import com.instabug.wrapper.support.activity.InstabugAppCompatActivity; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; import com.magicmicky.habitrpgwrapper.lib.models.Tag; import com.magicmicky.habitrpgwrapper.lib.models.TaskDirectionData; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.Daily; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Habit; import com.magicmicky.habitrpgwrapper.lib.models.tasks.HabitItem; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.Reward; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.ToDo; import com.mikepenz.materialdrawer.Drawer; import com.mikepenz.materialdrawer.DrawerBuilder; import com.mikepenz.materialdrawer.model.DividerDrawerItem; @@ -41,7 +44,11 @@ import com.mikepenz.materialdrawer.model.PrimaryDrawerItem; import com.mikepenz.materialdrawer.model.SecondaryDrawerItem; import com.mikepenz.materialdrawer.model.SectionDrawerItem; import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem; +import com.raizlabs.android.dbflow.runtime.FlowContentObserver; +import com.raizlabs.android.dbflow.sql.builder.Condition; import com.raizlabs.android.dbflow.sql.language.Select; +import com.raizlabs.android.dbflow.structure.BaseModel; +import com.raizlabs.android.dbflow.structure.Model; import java.util.ArrayList; import java.util.HashMap; @@ -55,7 +62,8 @@ import retrofit.RetrofitError; import retrofit.client.Response; public class MainActivity extends InstabugAppCompatActivity implements OnTaskCreationListener, HabitRPGUserCallback.OnUserReceived, - TaskScoringCallback.OnTaskScored, TaskCreationCallback.OnHabitCreated, TaskUpdateCallback.OnHabitUpdated, TaskDeletionCallback.OnTaskDeleted, Callback { + TaskScoringCallback.OnTaskScored, TaskCreationCallback.OnHabitCreated, TaskUpdateCallback.OnHabitUpdated, TaskDeletionCallback.OnTaskDeleted, Callback, + FlowContentObserver.OnSpecificModelStateChangedListener { static final int ABOUT = 12; //region View Elements @@ -82,6 +90,8 @@ public class MainActivity extends InstabugAppCompatActivity implements OnTaskCre AvatarWithBarsViewModel avatarInHeader; + FlowContentObserver observer; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -215,9 +225,15 @@ public class MainActivity extends InstabugAppCompatActivity implements OnTaskCre }); materialViewPager.getViewPager().setCurrentItem(0); + User = new Select().from(HabitRPGUser.class).where(Condition.column("id").eq(hostConfig.getUser())).querySingle(); + this.observer = new FlowContentObserver(); + this.observer.registerForContentChanges(this.getApplicationContext(), HabitRPGUser.class); - List users = new Select().from(Habit.class).queryList(); - Log.d("MainActivity", users.toString()); + this.observer.addSpecificModelChangeListener(this); + + this.loadTaskLists(); + FillTagFilterDrawer(); + updateHeader(); } @Override @@ -229,7 +245,13 @@ public class MainActivity extends InstabugAppCompatActivity implements OnTaskCre mAPIHelper.retrieveUser(new HabitRPGUserCallback(this)); } - public void FillTasks() + @Override + protected void onDestroy() { + this.observer.unregisterForContentChanges(this.getApplicationContext()); + super.onDestroy(); + } + + public void loadTaskLists() { android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager(); @@ -243,23 +265,24 @@ public class MainActivity extends InstabugAppCompatActivity implements OnTaskCre RecyclerViewFragment fragment; String fragmentkey = "Recycler$" + position; + final android.content.Context context = getApplicationContext(); switch (position) { case 0: layoutOfType = R.layout.habit_item_card; - fragment = RecyclerViewFragment.newInstance(new HabitItemRecyclerViewAdapter(User.getHabits(), layoutOfType, HabitItemRecyclerViewAdapter.HabitViewHolder.class), fragmentkey); + fragment = RecyclerViewFragment.newInstance(new HabitItemRecyclerViewAdapter(Habit.class, layoutOfType, HabitItemRecyclerViewAdapter.HabitViewHolder.class, context), fragmentkey); break; case 1: layoutOfType = R.layout.daily_item_card; - fragment = RecyclerViewFragment.newInstance(new HabitItemRecyclerViewAdapter(User.getDailys(), layoutOfType, HabitItemRecyclerViewAdapter.DailyViewHolder.class), fragmentkey); + fragment = RecyclerViewFragment.newInstance(new HabitItemRecyclerViewAdapter(Daily.class, layoutOfType, HabitItemRecyclerViewAdapter.DailyViewHolder.class, context), fragmentkey); break; case 3: layoutOfType = R.layout.reward_item_card; - fragment = RecyclerViewFragment.newInstance(new HabitItemRecyclerViewAdapter(User.getRewards(), layoutOfType, HabitItemRecyclerViewAdapter.RewardViewHolder.class), fragmentkey); + fragment = RecyclerViewFragment.newInstance(new HabitItemRecyclerViewAdapter(Reward.class, layoutOfType, HabitItemRecyclerViewAdapter.RewardViewHolder.class, context), fragmentkey); break; default: layoutOfType = R.layout.todo_item_card; - fragment = RecyclerViewFragment.newInstance(new HabitItemRecyclerViewAdapter(User.getTodos(), layoutOfType, HabitItemRecyclerViewAdapter.TodoViewHolder.class), fragmentkey); + fragment = RecyclerViewFragment.newInstance(new HabitItemRecyclerViewAdapter(ToDo.class, layoutOfType, HabitItemRecyclerViewAdapter.TodoViewHolder.class, context), fragmentkey); } // ViewFragmentsDictionary.put(position, fragment); @@ -369,40 +392,19 @@ public class MainActivity extends InstabugAppCompatActivity implements OnTaskCre avatarInHeader.UpdateData(User); } - @Override - public void onUserReceived(HabitRPGUser user) { - TaskList.clear(); - - User = user; - - if(user == null) - return; - + private void updateHeader() { + updateUserAvatars(); toolbar.setTitle(User.getProfile().getName() + " - Lv" + User.getStats().getLvl()); - TaskList.addAll(User.getHabits()); - TaskList.addAll(User.getDailys()); - TaskList.addAll(User.getTodos()); - TaskList.addAll(User.getRewards()); + android.support.v7.app.ActionBarDrawerToggle actionBarDrawerToggle = drawer.getActionBarDrawerToggle(); - new Handler().postDelayed(new Runnable() { - @Override - public void run() { + if (actionBarDrawerToggle != null) { + actionBarDrawerToggle.setDrawerIndicatorEnabled(true); + } + } - FillTasks(); - - updateUserAvatars(); - - android.support.v7.app.ActionBarDrawerToggle actionBarDrawerToggle = drawer.getActionBarDrawerToggle(); - - if (actionBarDrawerToggle != null) { - actionBarDrawerToggle.setDrawerIndicatorEnabled(true); - } - - - FillTagFilterDrawer(); - } - }, 100); + @Override + public void onUserReceived(HabitRPGUser user) { } @Override @@ -469,4 +471,10 @@ public class MainActivity extends InstabugAppCompatActivity implements OnTaskCre public void onTaskScoringFailed() { } + + @Override + public void onModelStateChanged(Class aClass, BaseModel.Action action, String s, String s1) { + User = new Select().from(HabitRPGUser.class).where(Condition.column("id").eq(hostConfig.getUser())).querySingle(); + updateHeader(); + } } \ No newline at end of file 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 bede53a8f..8ad402b1d 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/adapter/HabitItemRecyclerViewAdapter.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/adapter/HabitItemRecyclerViewAdapter.java @@ -1,5 +1,6 @@ package com.habitrpg.android.habitica.ui.adapter; +import android.content.Context; import android.databinding.DataBindingUtil; import android.support.v7.widget.CardView; import android.support.v7.widget.RecyclerView; @@ -22,6 +23,10 @@ import com.magicmicky.habitrpgwrapper.lib.models.tasks.Habit; import com.magicmicky.habitrpgwrapper.lib.models.tasks.HabitItem; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Reward; import com.magicmicky.habitrpgwrapper.lib.models.tasks.ToDo; +import com.raizlabs.android.dbflow.runtime.FlowContentObserver; +import com.raizlabs.android.dbflow.sql.language.Select; +import com.raizlabs.android.dbflow.structure.BaseModel; +import com.raizlabs.android.dbflow.structure.Model; import java.util.List; @@ -29,23 +34,41 @@ import butterknife.ButterKnife; import butterknife.InjectView; public class HabitItemRecyclerViewAdapter - extends RecyclerView.Adapter { + extends RecyclerView.Adapter + implements FlowContentObserver.OnSpecificModelStateChangedListener { int layoutResource; private Class> viewHolderClass; List contents; + Class taskClass; + FlowContentObserver observer; + Context context; static final int TYPE_HEADER = 0; static final int TYPE_CELL = 1; - public HabitItemRecyclerViewAdapter(List contents, int layoutResource, Class> viewHolderClass) { - this.contents = contents; + public HabitItemRecyclerViewAdapter(Class newTaskClass, int layoutResource, Class> viewHolderClass, Context newContext) { + + this.context = newContext; + this.taskClass = newTaskClass; + this.loadContent(); + + observer = new FlowContentObserver(); + observer.registerForContentChanges(this.context, this.taskClass); + + observer.addSpecificModelChangeListener(this); this.layoutResource = layoutResource; this.viewHolderClass = viewHolderClass; } + @Override + public void onViewDetachedFromWindow(ViewHolder holder) { + this.observer.unregisterForContentChanges(this.context); + super.onViewDetachedFromWindow(holder); + } + @Override public int getItemViewType(int position) { switch (position) { @@ -77,10 +100,8 @@ public class HabitItemRecyclerViewAdapter case "HabitViewHolder": return new HabitItemRecyclerViewAdapter.HabitViewHolder(view); case "DailyViewHolder": - return new HabitItemRecyclerViewAdapter.DailyViewHolder(view); case "TodoViewHolder": - return new HabitItemRecyclerViewAdapter.TodoViewHolder(view); case "RewardViewHolder": @@ -98,6 +119,12 @@ public class HabitItemRecyclerViewAdapter holder.bindHolder(item, position); } + @Override + public void onModelStateChanged(Class aClass, BaseModel.Action action, String s, String s1) { + //TODO: Not load all content every time something changed + this.loadContent(); + } + public abstract class ViewHolder extends RecyclerView.ViewHolder { @InjectView(R.id.card_view) @@ -231,4 +258,9 @@ public class HabitItemRecyclerViewAdapter binding.setReward(habitItem); } } + + public void loadContent() { + this.contents = new Select().from(this.taskClass).queryList(); + notifyDataSetChanged(); + } } diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/HabitRPGInteractor.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/HabitRPGInteractor.java index 69caa56fd..bec2ec51b 100644 --- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/HabitRPGInteractor.java +++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/HabitRPGInteractor.java @@ -60,8 +60,6 @@ public class HabitRPGInteractor { } }).registerTypeAdapter(Tags.class, new TagsAdapter().nullSafe()).create(); - Log.d("AASDASDASD", gson.toString()); - RestAdapter adapter = new RestAdapter.Builder() .setEndpoint(server.toString()) .setRequestInterceptor(requestInterceptor) diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java index 97a580855..474c4db65 100644 --- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java +++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java @@ -100,10 +100,6 @@ public class HabitRPGUser extends BaseModel { this.habits = habits; } - public List getTags() { - return tags; - } - public void setTags(List tags) { this.tags = tags; } @@ -158,7 +154,7 @@ public class HabitRPGUser extends BaseModel { .queryList(); } return dailys; -} + } @OneToMany(methods = {OneToMany.Method.SAVE, OneToMany.Method.DELETE}, variableName = "todos") public List getTodos() { @@ -170,7 +166,6 @@ public class HabitRPGUser extends BaseModel { return todos; } - @OneToMany(methods = {OneToMany.Method.SAVE, OneToMany.Method.DELETE}, variableName = "rewards") public List getRewards() { if(rewards == null) { @@ -181,4 +176,14 @@ public class HabitRPGUser extends BaseModel { return rewards; } + @OneToMany(methods = {OneToMany.Method.SAVE, OneToMany.Method.DELETE}, variableName = "rewards") + public List getTags() { + if(tags == null) { + tags = new Select() + .from(Tag.class) + .queryList(); + } + return tags; + } + }