Skip to content

Commit

Permalink
Remove db lookups in main thread in EventActivity
Browse files Browse the repository at this point in the history
Signed-off-by: Arka Prava Basu <arkaprava94@gmail.com>
  • Loading branch information
archie94 committed Sep 2, 2018
1 parent e19cf29 commit 57da23b
Show file tree
Hide file tree
Showing 5 changed files with 108 additions and 50 deletions.
3 changes: 3 additions & 0 deletions src/main/java/org/havenapp/main/dao/EventDAO.kt
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ interface EventDAO {
@Query("SELECT * FROM EVENT WHERE ID = :id")
fun findById(id: Long?) : Event

@Query("SELECT * FROM EVENT WHERE ID = :id")
fun findByIdAsync(id: Long?) : LiveData<Event>

@Query("SELECT * FROM EVENT ORDER BY ID")
fun getAllEvent() : List<Event>

Expand Down
4 changes: 4 additions & 0 deletions src/main/java/org/havenapp/main/dao/EventTriggerDAO.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.havenapp.main.dao

import android.arch.lifecycle.LiveData
import android.arch.persistence.room.*
import org.havenapp.main.model.EventTrigger

Expand All @@ -24,6 +25,9 @@ interface EventTriggerDAO {
@Query("SELECT * FROM EVENT_TRIGGER WHERE M_EVENT_ID = :eventId")
fun getEventTriggerList(eventId: Long?) : MutableList<EventTrigger>

@Query("SELECT * FROM EVENT_TRIGGER WHERE M_EVENT_ID = :eventId")
fun getEventTriggerListAsync(eventId: Long?) : LiveData<MutableList<EventTrigger>>

@Query("SELECT * FROM EVENT_TRIGGER")
fun getAllEventTriggers() : MutableList<EventTrigger> // todo remove this for now
}
18 changes: 17 additions & 1 deletion src/main/java/org/havenapp/main/model/Event.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.havenapp.main.model

import android.arch.lifecycle.LiveData
import android.arch.lifecycle.Transformations
import android.arch.persistence.room.ColumnInfo
import android.arch.persistence.room.Entity
import android.arch.persistence.room.Ignore
Expand Down Expand Up @@ -30,7 +32,9 @@ class Event {
}

/**
* Get the list of event triggers associated with this event
* Get the list of event triggers associated with this event.
* <p>
* When [mEventTriggers] is empty this method performs a blocking db lookup.
*/
fun getEventTriggers() : MutableList<EventTrigger> {

Expand All @@ -42,6 +46,18 @@ class Event {
return mEventTriggers
}

/**
* Perform a db lookup for event triggers corresponding to this event.
* Unlike [getEventTriggers] this method performs a non blocking db lookup and
* returns a lifecycle aware data holder for list of [EventTrigger]s
*/
fun getEventTriggersAsync(): LiveData<MutableList<EventTrigger>> {
return Transformations.map(HavenApp.dataBaseInstance.getEventTriggerDAO().getEventTriggerListAsync(id)) {
mEventTriggers = it
it
}
}

fun getEventTriggerCount(): Int {
if (mEventTriggers.size == 0) {
return getEventTriggers().size
Expand Down
124 changes: 77 additions & 47 deletions src/main/java/org/havenapp/main/ui/EventActivity.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package org.havenapp.main.ui;

import android.arch.lifecycle.Observer;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.StrictMode;
import android.support.annotation.NonNull;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.content.FileProvider;
Expand Down Expand Up @@ -42,6 +44,18 @@ public class EventActivity extends AppCompatActivity implements EventTriggerAdap
private ArrayList<Uri> eventTriggerImagePaths;
private final static String AUTHORITY = "org.havenapp.main.fileprovider";

private Observer<Event> eventObserver = event -> {
if (event != null) {
onEventFetched(event);
}
};

private Observer<List<EventTrigger>> eventTriggerListObserver = eventTriggerList -> {
if (eventTriggerList != null) {
onEventTriggerListFetched(eventTriggerList);
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {

Expand All @@ -59,56 +73,13 @@ protected void onCreate(Bundle savedInstanceState) {

if (eventId != -1) {

mEvent = HavenEventDB.getDatabase(this).getEventDAO().findById(eventId);
eventTriggerList = mEvent.getEventTriggers();
mRecyclerView = findViewById(R.id.event_trigger_list);

setTitle(mEvent.getMStartTime().toLocaleString());

mAdapter = new EventTriggerAdapter(this, eventTriggerList,
resourceManager, this);
setUpRecyclerView();

setEventTriggerImagePaths(eventTriggerList);

LinearLayoutManager llm = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(llm);
mRecyclerView.setAdapter(mAdapter);
HavenEventDB.getDatabase(this).getEventDAO().findByIdAsync(eventId)
.observe(this, eventObserver);

FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {

shareEvent();
}
});

// Handling swipe to delete
ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {

@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}

@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
//Remove swiped item from list and notify the RecyclerView

final int position = viewHolder.getAdapterPosition();
final EventTrigger eventTrigger = eventTriggerList
.get(viewHolder.getAdapterPosition());

deleteEventTrigger (eventTrigger, position);


}

};


ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleCallback);
itemTouchHelper.attachToRecyclerView(mRecyclerView);
fab.setOnClickListener(view -> shareEvent());

}
else
Expand All @@ -126,6 +97,65 @@ public boolean onOptionsItemSelected(MenuItem item) {
}
}

/**
* On event fetched update {@link #mEvent} and fetch corresponding event triggers,
* set Activity title
*/
private void onEventFetched(@NonNull Event event) {
mEvent = event;
mEvent.getEventTriggersAsync().observe(this, eventTriggerListObserver);
setTitle(mEvent.getMStartTime().toLocaleString());
}

/**
* On event trigger list fetched for {@link #mEvent} update {@link #eventTriggerList},
* {@link #eventTriggerImagePaths} and {@link #mAdapter} data set
*/
private void onEventTriggerListFetched(@NonNull List<EventTrigger> eventTriggerList) {
this.eventTriggerList = eventTriggerList;
setEventTriggerImagePaths(eventTriggerList);
mAdapter.setEventTriggers(eventTriggerList);
}

private void setUpRecyclerView() {
mRecyclerView = findViewById(R.id.event_trigger_list);

mAdapter = new EventTriggerAdapter(this, eventTriggerList,
resourceManager, this);

LinearLayoutManager llm = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(llm);
mRecyclerView.setAdapter(mAdapter);

// Handling swipe to delete
ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(0,
ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {

@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
RecyclerView.ViewHolder target) {
return false;
}

@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
//Remove swiped item from list and notify the RecyclerView

final int position = viewHolder.getAdapterPosition();
final EventTrigger eventTrigger = eventTriggerList
.get(viewHolder.getAdapterPosition());

deleteEventTrigger (eventTrigger, position);


}

};

ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleCallback);
itemTouchHelper.attachToRecyclerView(mRecyclerView);
}

private void deleteEventTrigger (final EventTrigger eventTrigger, final int position)
{

Expand Down
9 changes: 7 additions & 2 deletions src/main/java/org/havenapp/main/ui/EventTriggerAdapter.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,15 +41,20 @@ public class EventTriggerAdapter extends RecyclerView.Adapter<EventTriggerAdapte

private final static String AUTHORITY = "org.havenapp.main.fileprovider";

public EventTriggerAdapter(Context context, List<EventTrigger> eventTriggers,
IResourceManager resourceManager, EventTriggerClickListener eventTriggerClickListener) {
EventTriggerAdapter(Context context, @NonNull List<EventTrigger> eventTriggers,
IResourceManager resourceManager, EventTriggerClickListener eventTriggerClickListener) {
this.context = context;
this.resourceManager = resourceManager;
this.eventTriggers = eventTriggers;
this.eventTriggerClickListener = eventTriggerClickListener;
}

void setEventTriggers(@NonNull List<EventTrigger> eventTriggers) {
this.eventTriggers = eventTriggers;
notifyDataSetChanged();
}

@NonNull
@Override
public EventTriggerVH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_event, parent, false);
Expand Down

0 comments on commit 57da23b

Please sign in to comment.