blob: 0fea3a6a513767f5b516a5dd604314b8f8950c73 [file] [log] [blame]
/**
* Simperium integration with WordPress.com
* Currently used with Notifications
*/
package org.wordpress.android.ui.notifications.utils;
import android.content.Context;
import com.simperium.Simperium;
import com.simperium.client.Bucket;
import com.simperium.client.BucketNameInvalid;
import com.simperium.client.BucketObject;
import com.simperium.client.BucketObjectMissingException;
import com.simperium.client.Query;
import com.simperium.client.User;
import org.wordpress.android.BuildConfig;
import org.wordpress.android.models.Note;
import org.wordpress.android.ui.notifications.NotificationEvents;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.StringUtils;
import de.greenrobot.event.EventBus;
public class SimperiumUtils {
private static final String NOTE_TIMESTAMP = "timestamp";
private static final String META_BUCKET_NAME = "meta";
private static final String META_LAST_SEEN = "last_seen";
private static Simperium mSimperium;
private static Bucket<Note> mNotesBucket;
private static Bucket<BucketObject> mMetaBucket;
public static Bucket<Note> getNotesBucket() {
return mNotesBucket;
}
public static Bucket<BucketObject> getMetaBucket() {
return mMetaBucket;
}
public static synchronized Simperium configureSimperium(final Context context, String token) {
// Create a new instance of Simperium if it doesn't exist yet.
// In any case, authorize the user.
if (mSimperium == null) {
mSimperium = Simperium.newClient(BuildConfig.SIMPERIUM_APP_NAME,
BuildConfig.SIMPERIUM_APP_SECRET, context);
try {
mNotesBucket = mSimperium.bucket(new Note.Schema());
mMetaBucket = mSimperium.bucket(META_BUCKET_NAME);
mSimperium.setUserStatusChangeListener(new User.StatusChangeListener() {
@Override
public void onUserStatusChange(User.Status status) {
switch (status) {
case AUTHORIZED:
startBuckets();
break;
case NOT_AUTHORIZED:
mNotesBucket.stop();
mMetaBucket.stop();
EventBus.getDefault().post(new NotificationEvents.SimperiumNotAuthorized());
break;
default:
AppLog.d(AppLog.T.SIMPERIUM, "User not authorized yet");
break;
}
}
});
} catch (BucketNameInvalid e) {
AppLog.e(AppLog.T.SIMPERIUM, e.getMessage());
}
}
authorizeUser(mSimperium, token);
return mSimperium;
}
private static void authorizeUser(Simperium simperium, String token) {
User user = simperium.getUser();
String tokenFormat = "WPCC/%s/%s";
String wpccToken = String.format(tokenFormat, BuildConfig.SIMPERIUM_APP_SECRET, StringUtils.notNullStr(token));
user.setAccessToken(wpccToken);
// we'll assume the user is AUTHORIZED, and catch NOT_AUTHORIZED if something goes wrong.
user.setStatus(User.Status.AUTHORIZED);
}
public static boolean isUserAuthorized() {
return mSimperium != null &&
mSimperium.getUser() != null &&
mSimperium.getUser().getStatus() == User.Status.AUTHORIZED;
}
public static boolean isUserNotAuthorized() {
return mSimperium != null &&
mSimperium.getUser() != null &&
mSimperium.getUser().getStatus() == User.Status.NOT_AUTHORIZED;
}
public static void startBuckets() {
if (mNotesBucket != null) {
mNotesBucket.start();
}
if (mMetaBucket != null) {
mMetaBucket.start();
}
}
public static void resetBucketsAndDeauthorize() {
if (mNotesBucket != null) {
mNotesBucket.reset();
mNotesBucket = null;
}
if (mMetaBucket != null) {
mMetaBucket.reset();
mMetaBucket = null;
}
// Reset user status
if (mSimperium != null) {
mSimperium.getUser().setStatus(User.Status.UNKNOWN);
mSimperium = null;
}
}
// Returns true if we have unread notes with a timestamp greater than last_seen timestamp in the meta bucket
public static boolean hasUnreadNotes() {
if (getNotesBucket() == null || getMetaBucket() == null) return false;
try {
BucketObject meta = getMetaBucket().get(META_BUCKET_NAME);
if (meta != null && meta.getProperty(META_LAST_SEEN) instanceof Integer) {
Integer lastSeenTimestamp = (Integer)meta.getProperty(META_LAST_SEEN);
Query<Note> query = new Query<>(getNotesBucket());
query.where(Note.Schema.UNREAD_INDEX, Query.ComparisonType.EQUAL_TO, true);
query.where(Note.Schema.TIMESTAMP_INDEX, Query.ComparisonType.GREATER_THAN, lastSeenTimestamp);
return query.execute().getCount() > 0;
}
} catch (BucketObjectMissingException e) {
return false;
}
return false;
}
// Updates the 'last_seen' field in the meta bucket with the latest note's timestamp
public static boolean updateLastSeenTime() {
if (getNotesBucket() == null || getMetaBucket() == null) return false;
Query<Note> query = new Query<>(getNotesBucket());
query.order(NOTE_TIMESTAMP, Query.SortType.DESCENDING);
query.limit(1);
Bucket.ObjectCursor<Note> cursor = query.execute();
if (cursor.moveToFirst()) {
long latestNoteTimestamp = cursor.getObject().getTimestamp();
try {
BucketObject meta = getMetaBucket().get(META_BUCKET_NAME);
if (meta.getProperty(META_LAST_SEEN) instanceof Integer) {
int lastSeen = (int)meta.getProperty(META_LAST_SEEN);
if (lastSeen != latestNoteTimestamp) {
meta.setProperty(META_LAST_SEEN, latestNoteTimestamp);
meta.save();
return true;
}
}
} catch (BucketObjectMissingException e) {
AppLog.e(AppLog.T.NOTIFS, "Meta bucket not found.");
}
}
return false;
}
}