Skip to content

Commit 6f96605

Browse files
committed
Add observers for event trigger count for each event
- need to measure the cost of LiveData per event - remove the `modifyPos` logic - remove redundant calls to notify data change for adapter - remove book-keeping work on event list and let observer callback handle the list - refactor field names to remove hungarian notation Signed-off-by: Arka Prava Basu <[email protected]>
1 parent 0293988 commit 6f96605

File tree

12 files changed

+120
-122
lines changed

12 files changed

+120
-122
lines changed

src/androidTest/java/org/havenapp/main/database/migration/RoomMigrationTest.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,11 @@ class RoomMigrationTest {
4444
val event = migratedDb.getEventDAO().getAllEvent()[0]
4545
val eventTrigger = migratedDb.getEventTriggerDAO().getAllEventTriggers()[0]
4646

47-
assertEquals(dateToTimestamp(event.mStartTime)?.toInt(), 123)
47+
assertEquals(dateToTimestamp(event.startTime)?.toInt(), 123)
4848

49-
assertEquals(dateToTimestamp(eventTrigger.mTime)?.toInt(), 124)
50-
assertEquals(eventTrigger.mPath, "abcabd")
51-
assertEquals(eventTrigger.mType, 1)
49+
assertEquals(dateToTimestamp(eventTrigger.time)?.toInt(), 124)
50+
assertEquals(eventTrigger.path, "abcabd")
51+
assertEquals(eventTrigger.type, 1)
5252
}
5353

5454
@After

src/main/java/org/havenapp/main/ListActivity.java

Lines changed: 31 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
package org.havenapp.main;
1919

20-
import android.annotation.SuppressLint;
2120
import android.app.ProgressDialog;
2221
import android.arch.lifecycle.LiveData;
2322
import android.arch.lifecycle.Observer;
@@ -66,12 +65,12 @@
6665
import org.havenapp.main.ui.EventAdapter;
6766
import org.havenapp.main.ui.PPAppIntro;
6867

69-
import java.text.SimpleDateFormat;
7068
import java.util.ArrayList;
71-
import java.util.Date;
7269
import java.util.List;
7370
import java.util.StringTokenizer;
7471

72+
import kotlin.Pair;
73+
7574
import static org.havenapp.main.database.DbConstantsKt.DB_INIT_END;
7675
import static org.havenapp.main.database.DbConstantsKt.DB_INIT_START;
7776
import static org.havenapp.main.database.DbConstantsKt.DB_INIT_STATUS;
@@ -86,27 +85,40 @@ public class ListActivity extends AppCompatActivity {
8685
private PreferenceManager preferences;
8786
private IResourceManager resourceManager;
8887

89-
private int modifyPos = -1;
90-
9188
private int REQUEST_CODE_INTRO = 1001;
9289

9390
private LiveData<List<Event>> eventListLD;
9491

9592
private Observer<List<Event>> eventListObserver = events -> {
9693
if (events != null) {
9794
setEventListToRecyclerView(events);
95+
observeEvents(events);
9896
}
9997
};
10098

10199
private Observer<Integer> eventCountObserver = count -> {
102100
if (count != null && count > events.size()) {
103-
fetchEventList();
104101
showNonEmptyState();
105102
} else if (count != null && count == 0) {
106103
showEmptyState();
107104
}
108105
};
109106

107+
private Observer<Pair<Long, Integer>> eventTriggerCountObserver = pair -> {
108+
if (pair != null && adapter != null && events != null) {
109+
int pos = -1;
110+
for (int i = 0; i < events.size(); i++) {
111+
if (events.get(i).getId().equals(pair.getFirst())) {
112+
pos = i;
113+
break;
114+
}
115+
}
116+
if (pos != -1) {
117+
adapter.notifyItemChanged(pos);
118+
}
119+
}
120+
};
121+
110122
private BroadcastReceiver dbBroadcastReceiver = new BroadcastReceiver() {
111123
@Override
112124
public void onReceive(Context context, Intent intent) {
@@ -144,9 +156,6 @@ protected void onCreate(Bundle savedInstanceState) {
144156
LinearLayoutManager llm = new LinearLayoutManager(this);
145157
recyclerView.setLayoutManager(llm);
146158

147-
if (savedInstanceState != null)
148-
modifyPos = savedInstanceState.getInt("modify");
149-
150159

151160
// Handling swipe to delete
152161
ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@@ -160,12 +169,8 @@ public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHol
160169
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
161170
//Remove swiped item from list and notify the RecyclerView
162171

163-
final int position = viewHolder.getAdapterPosition();
164172
final Event event = events.get(viewHolder.getAdapterPosition());
165-
166-
deleteEvent(event, position);
167-
168-
173+
deleteEvent(event);
169174
}
170175

171176
};
@@ -212,7 +217,6 @@ private void initializeRecyclerViewComponents() {
212217

213218
Intent i = new Intent(ListActivity.this, EventActivity.class);
214219
i.putExtra("eventid", events.get(position).getId());
215-
modifyPos = position;
216220

217221
startActivity(i);
218222
});
@@ -228,6 +232,14 @@ private void setEventListToRecyclerView(@NonNull List<Event> events) {
228232
adapter.setEvents(events);
229233
}
230234

235+
private void observeEvents(@NonNull List<Event> events) {
236+
for (Event event: events) {
237+
if (event.getEventTriggersCountLD() == null)
238+
continue;
239+
event.getEventTriggersCountLD().observe(this, eventTriggerCountObserver);
240+
}
241+
}
242+
231243
private void fetchEventList() {
232244
try {
233245
eventListLD = HavenEventDB.getDatabase(this).getEventDAO().getAllEventDesc();
@@ -247,14 +259,12 @@ private void showNonEmptyState() {
247259
findViewById(R.id.empty_view).setVisibility(View.GONE);
248260
}
249261

250-
private void deleteEvent (final Event event, final int position)
262+
private void deleteEvent(final Event event)
251263
{
252-
new EventDeleteAsync(() -> onEventDeleted(event, position)).execute(event);
253-
events.remove(position);
254-
adapter.notifyItemRemoved(position);
264+
new EventDeleteAsync(() -> onEventDeleted(event)).execute(event);
255265
}
256266

257-
private void onEventDeleted(Event event, int position) {
267+
private void onEventDeleted(Event event) {
258268
Snackbar.make(recyclerView, resourceManager.getString(R.string.event_deleted), Snackbar.LENGTH_SHORT)
259269
.setAction(resourceManager.getString(R.string.undo),
260270
v -> new EventInsertAsync(eventId -> {
@@ -275,36 +285,11 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
275285
}
276286
}
277287

278-
@Override
279-
protected void onSaveInstanceState(Bundle outState) {
280-
super.onSaveInstanceState(outState);
281-
282-
outState.putInt("modify", modifyPos);
283-
}
284-
285-
@Override
286-
protected void onRestoreInstanceState(Bundle savedInstanceState) {
287-
super.onRestoreInstanceState(savedInstanceState);
288-
289-
modifyPos = savedInstanceState.getInt("modify");
290-
}
291-
292288
@Override
293289
protected void onResume() {
294290
super.onResume();
295-
296291
resourceManager = new ResourceManager(this);
297292
HavenEventDB.getDatabase(this).getEventDAO().count().observe(this, eventCountObserver);
298-
299-
if (modifyPos != -1) {
300-
//Event.set(modifyPos, Event.listAll(Event.class).get(modifyPos));
301-
adapter.notifyItemChanged(modifyPos);
302-
}
303-
}
304-
305-
@SuppressLint("SimpleDateFormat")
306-
public static String getDateFormat(long date) {
307-
return new SimpleDateFormat("dd MMM yyyy").format(new Date(date));
308293
}
309294

310295
private void showOnboarding()
@@ -350,9 +335,7 @@ protected void onDestroy() {
350335

351336
private void removeAllEvents()
352337
{
353-
final List<Event> removedEvents = new ArrayList<Event>(events);
354-
events.clear();
355-
adapter.notifyDataSetChanged();
338+
final List<Event> removedEvents = new ArrayList<>(events);
356339
new EventDeleteAllAsync(() -> onAllEventsRemoved(removedEvents)).execute(removedEvents);
357340
}
358341

src/main/java/org/havenapp/main/PreferenceManager.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -351,11 +351,11 @@ public int getHeartbeatNotificationTimeMs () {
351351
}
352352

353353
/**
354-
* Set the {@link org.havenapp.main.model.Event#mStartTime} for the ongoing event.
354+
* Set the {@link org.havenapp.main.model.Event#startTime} for the ongoing event.
355355
* Sets a string with the format {@link Utils#DATE_TIME_PATTERN}
356356
* representing current date and time for the key {@link #CURRENT_EVENT_START_TIME}.
357357
*
358-
* @param startTime the {@link org.havenapp.main.model.Event#mStartTime} for an
358+
* @param startTime the {@link org.havenapp.main.model.Event#startTime} for an
359359
* {@link org.havenapp.main.model.Event}
360360
*/
361361
public void setCurrentSession(Date startTime) {
@@ -364,7 +364,7 @@ public void setCurrentSession(Date startTime) {
364364
}
365365

366366
/**
367-
* Get the {@link org.havenapp.main.model.Event#mStartTime} for the ongoing event.
367+
* Get the {@link org.havenapp.main.model.Event#startTime} for the ongoing event.
368368
*
369369
* @return the string corresponding to pref key {@link #CURRENT_EVENT_START_TIME}.
370370
* Default value is unknown_session.

src/main/java/org/havenapp/main/dao/EventTriggerDAO.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,8 @@ interface EventTriggerDAO {
3232
fun getEventTriggerListAsync(eventId: Long?) : LiveData<MutableList<EventTrigger>>
3333

3434
@Query("SELECT * FROM EVENT_TRIGGER")
35-
fun getAllEventTriggers() : MutableList<EventTrigger> // todo remove this for now
35+
fun getAllEventTriggers() : MutableList<EventTrigger>
36+
37+
@Query("SELECT COUNT(*) FROM EVENT_TRIGGER WHERE M_EVENT_ID = :eventId")
38+
fun getEventTriggerListCountAsync(eventId: Long?) : LiveData<Int>
3639
}
Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.havenapp.main.model
22

3+
import android.arch.lifecycle.LiveData
4+
import android.arch.lifecycle.Transformations
35
import android.arch.persistence.room.ColumnInfo
46
import android.arch.persistence.room.Entity
57
import android.arch.persistence.room.Ignore
@@ -16,39 +18,49 @@ class Event {
1618
@PrimaryKey(autoGenerate = true)
1719
@ColumnInfo(name = "ID")
1820
var id : Long? = null
19-
get() = field
21+
set(value) {
22+
if (value == null) return
23+
field = value
24+
eventTriggerCountLD = Transformations.map(HavenApp.getDataBaseInstance().getEventTriggerDAO()
25+
.getEventTriggerListCountAsync(field)) {
26+
Pair(field!!, it)
27+
}
28+
}
2029

2130
@ColumnInfo(name = "M_START_TIME")
22-
var mStartTime : Date? = Date()
31+
var startTime : Date? = Date()
32+
33+
@Ignore
34+
private var eventTriggers : MutableList<EventTrigger> = mutableListOf()
2335

2436
@Ignore
25-
private var mEventTriggers : MutableList<EventTrigger> = mutableListOf()
37+
private var eventTriggerCountLD: LiveData<Pair<Long, Int>>? = null
2638

2739
fun addEventTrigger(eventTrigger: EventTrigger) {
28-
mEventTriggers.add(eventTrigger)
29-
eventTrigger.mEventId = id
40+
eventTriggers.add(eventTrigger)
41+
eventTrigger.eventId = id
3042
}
3143

3244
/**
3345
* Get the list of event triggers associated with this event.
3446
* <p>
35-
* When [mEventTriggers] is empty this method performs a blocking db lookup.
47+
* When [eventTriggers] is empty this method performs a blocking db lookup.
3648
*/
3749
fun getEventTriggers() : MutableList<EventTrigger> {
3850

39-
if (mEventTriggers.size == 0) {
51+
if (eventTriggers.size == 0) {
4052
val eventTriggers = HavenApp.getDataBaseInstance().getEventTriggerDAO().getEventTriggerList(id)
41-
mEventTriggers.addAll(eventTriggers)
53+
this.eventTriggers.addAll(eventTriggers)
4254
}
4355

44-
return mEventTriggers
56+
return eventTriggers
4557
}
4658

47-
fun getEventTriggerCount(): Int {
48-
if (mEventTriggers.size == 0) {
49-
return getEventTriggers().size
50-
}
59+
fun getEventTriggersCountLD(): LiveData<Pair<Long, Int>>? {
60+
return eventTriggerCountLD
61+
}
5162

52-
return mEventTriggers.size
63+
fun getEventTriggerCount(): Int {
64+
return eventTriggerCountLD?.value?.second ?: 0
5365
}
54-
}
66+
}

src/main/java/org/havenapp/main/model/EventTrigger.kt

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -62,25 +62,24 @@ class EventTrigger {
6262
@PrimaryKey(autoGenerate = true)
6363
@ColumnInfo(name = "ID")
6464
var id : Long? = null
65-
get() = field
6665

6766
@ColumnInfo(name = "M_TYPE")
68-
var mType: Int? = 0
67+
var type: Int? = 0
6968

7069
// Trigger time
7170
@ColumnInfo(name = "M_TIME")
72-
var mTime: Date? = Date()
71+
var time: Date? = Date()
7372

7473
@ColumnInfo(name = "M_EVENT_ID")
75-
var mEventId: Long? = 0
74+
var eventId: Long? = 0
7675

7776
@ColumnInfo(name = "M_PATH")
78-
var mPath: String? = null
77+
var path: String? = null
7978

8079
fun getStringType(resourceManager: IResourceManager): String {
8180
var sType = ""
8281

83-
sType = when (mType) {
82+
sType = when (type) {
8483
ACCELEROMETER -> resourceManager.getString(R.string.sensor_accel)
8584
LIGHT -> resourceManager.getString(R.string.sensor_light)
8685
CAMERA -> resourceManager.getString(R.string.sensor_camera)
@@ -98,7 +97,7 @@ class EventTrigger {
9897
fun getMimeType(): String? {
9998
var mimeType: String? = ""
10099

101-
mimeType = when (mType) {
100+
mimeType = when (type) {
102101
CAMERA -> "image/*"
103102
MICROPHONE -> "audio/*"
104103
CAMERA_VIDEO -> "video/*"
@@ -107,4 +106,4 @@ class EventTrigger {
107106

108107
return mimeType
109108
}
110-
}
109+
}

src/main/java/org/havenapp/main/service/MonitorService.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ public synchronized void alert(int alertType, String path) {
300300
mLastEvent.setId(eventId);
301301
doNotification = true;
302302
// set current event start date in prefs
303-
mPrefs.setCurrentSession(mLastEvent.getMStartTime());
303+
mPrefs.setCurrentSession(mLastEvent.getStartTime());
304304
}
305305
else if (mPrefs.getNotificationTimeMs() == 0)
306306
{
@@ -318,8 +318,8 @@ else if (mPrefs.getNotificationTimeMs() > 0 && mLastNotification != null)
318318
}
319319

320320
EventTrigger eventTrigger = new EventTrigger();
321-
eventTrigger.setMType(alertType);
322-
eventTrigger.setMPath(path);
321+
eventTrigger.setType(alertType);
322+
eventTrigger.setPath(path);
323323

324324
mLastEvent.addEventTrigger(eventTrigger);
325325

@@ -353,13 +353,13 @@ else if (mPrefs.getNotificationTimeMs() > 0 && mLastNotification != null)
353353
recips.add(st.nextToken());
354354

355355
String attachment = null;
356-
if (eventTrigger.getMType() == EventTrigger.CAMERA) {
357-
attachment = eventTrigger.getMPath();
358-
} else if (eventTrigger.getMType() == EventTrigger.MICROPHONE) {
359-
attachment = eventTrigger.getMPath();
356+
if (eventTrigger.getType() == EventTrigger.CAMERA) {
357+
attachment = eventTrigger.getPath();
358+
} else if (eventTrigger.getType() == EventTrigger.MICROPHONE) {
359+
attachment = eventTrigger.getPath();
360360
}
361-
else if (eventTrigger.getMType() == EventTrigger.CAMERA_VIDEO) {
362-
attachment = eventTrigger.getMPath();
361+
else if (eventTrigger.getType() == EventTrigger.CAMERA_VIDEO) {
362+
attachment = eventTrigger.getPath();
363363
}
364364

365365
sender.sendMessage(recips, alertMessage.toString(), attachment);

0 commit comments

Comments
 (0)