Skip to content

Commit

Permalink
fix(session tracker): Optimised session tracker to spend less time an…
Browse files Browse the repository at this point in the history
…d memory for getting content activity. Also added synchronise block to avoid the issue casing by potential multi threads.
  • Loading branch information
YYChen01988 committed May 3, 2023
1 parent 4a4650d commit 9be31cb
Showing 1 changed file with 20 additions and 26 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,20 @@
import androidx.annotation.VisibleForTesting;

import java.io.File;
import java.util.Collection;
import java.util.ArrayDeque;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.atomic.AtomicLong;

class SessionTracker extends BaseObservable {

private static final int DEFAULT_TIMEOUT_MS = 30000;

private final Collection<String>
foregroundActivities = new ConcurrentLinkedQueue<>();
private final ArrayDeque<String>
foregroundActivities = new ArrayDeque<>();
private final long timeoutMs;

private final ImmutableConfig configuration;
Expand Down Expand Up @@ -133,7 +132,7 @@ boolean resumeSession() {
private void notifySessionStartObserver(final Session session) {
final String startedAt = DateUtils.toIso8601(session.getStartedAt());
updateState(new StateEvent.StartSession(session.getId(), startedAt,
session.getHandledCount(), session.getUnhandledCount()));
session.getHandledCount(), session.getUnhandledCount()));
}

/**
Expand Down Expand Up @@ -359,22 +358,23 @@ void onActivityStopped(String activityName) {
void updateForegroundTracker(String activityName, boolean activityStarting, long nowMs) {
if (activityStarting) {
long noActivityRunningForMs = nowMs - lastExitedForegroundMs.get();

//FUTURE:SM Race condition between isEmpty and put
if (foregroundActivities.isEmpty()) {
lastEnteredForegroundMs.set(nowMs);

if (noActivityRunningForMs >= timeoutMs
&& configuration.getAutoTrackSessions()) {
startNewSession(new Date(), client.getUser(), true);
synchronized (foregroundActivities) {
if (foregroundActivities.isEmpty()) {
lastEnteredForegroundMs.set(nowMs);

if (noActivityRunningForMs >= timeoutMs
&& configuration.getAutoTrackSessions()) {
startNewSession(new Date(), client.getUser(), true);
}
}
foregroundActivities.add(activityName);
}
foregroundActivities.add(activityName);
} else {
foregroundActivities.remove(activityName);

if (foregroundActivities.isEmpty()) {
lastExitedForegroundMs.set(nowMs);
synchronized (foregroundActivities) {
foregroundActivities.removeLastOccurrence(activityName);
if (foregroundActivities.isEmpty()) {
lastExitedForegroundMs.set(nowMs);
}
}
}
client.getContextState().setAutomaticContext(getContextActivity());
Expand All @@ -398,14 +398,8 @@ long getLastEnteredForegroundMs() {

@Nullable
String getContextActivity() {
if (foregroundActivities.isEmpty()) {
return null;
} else {
// linked hash set retains order of added activity and ensures uniqueness
// therefore obtain the most recently added
int size = foregroundActivities.size();
String[] activities = foregroundActivities.toArray(new String[size]);
return activities[size - 1];
synchronized (foregroundActivities) {
return foregroundActivities.peekLast();
}
}
}

0 comments on commit 9be31cb

Please sign in to comment.