/*
* Copyright (c) 2012 Socialize Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.socialize.notifications;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import com.socialize.config.SocializeConfig;
import com.socialize.entity.User;
import com.socialize.log.SocializeLogger;
import com.socialize.util.StringUtils;
/**
* @author Jason Polites
*
*/
public class NotificationRegistrationState {
private static final String PREFERENCES = "SocializeNotificationState";
public static final long DEFAULT_SOCIALIZE_NOTIFICATION_TIMEOUT = 24 * 60 * 60 * 1000; // 1 day
public static final long DEFAULT_GCM_TIMEOUT = -1; // Don't check again
private String c2DMRegistrationId;
private long registeredUserId;
private long pendingC2DMRequestTime = 0L;
private long pendingSocializeRequestTime = 0L;
private long lastC2DMRegistrationTime = 0L;
private long lastSocializeRegistrationTime = 0L;
private String lastGCMSenderID = null;
private String lastCustomGCMSenderId = null;
private SocializeLogger logger;
private SocializeConfig config;
private boolean loaded = false;
public boolean isRegisteredSocialize(Context context, User user) {
load(context);
long timeout = config.getLongProperty(SocializeConfig.SOCIALIZE_NOTIFICATIONS_INTERVAL, DEFAULT_SOCIALIZE_NOTIFICATION_TIMEOUT);
long timeSinceLast = (System.currentTimeMillis() - lastSocializeRegistrationTime);
if(registeredUserId != user.getId() || (timeSinceLast > timeout && timeout >= 0)) {
return false;
}
return true;
}
public boolean isRegisteredC2DM(Context context) {
load(context);
if(StringUtils.isEmpty(lastGCMSenderID)) {
return false;
}
else if(!lastGCMSenderID.equals(config.getProperty(SocializeConfig.SOCIALIZE_GCM_SENDER_ID, ""))) {
return false;
}
if(lastCustomGCMSenderId != null && !lastCustomGCMSenderId.equals(config.getProperty(SocializeConfig.SOCIALIZE_CUSTOM_GCM_SENDER_ID, ""))) {
// Does not match ID
return false;
}
long timeout = config.getLongProperty(SocializeConfig.GCM_REGISTRATION_INTERVAL, DEFAULT_GCM_TIMEOUT);
long timeSinceLast = (System.currentTimeMillis() - lastC2DMRegistrationTime);
return !(StringUtils.isEmpty(c2DMRegistrationId) || (timeSinceLast > timeout && timeout >= 0));
}
public void setRegisteredSocialize(User user) {
this.registeredUserId = user.getId();
this.pendingSocializeRequestTime = 0;
this.lastSocializeRegistrationTime = System.currentTimeMillis();
}
public String getC2DMRegistrationId() {
return c2DMRegistrationId;
}
public void setC2DMRegistrationId(String c2dmRegistrationId) {
this.c2DMRegistrationId = c2dmRegistrationId;
this.lastC2DMRegistrationTime = System.currentTimeMillis();
this.pendingC2DMRequestTime = 0;
}
public boolean isSocializeRegistrationPending() {
return (System.currentTimeMillis() - pendingSocializeRequestTime) < 30000; // Allow 30 seconds
}
public boolean isC2dmPending() {
return (System.currentTimeMillis() - pendingC2DMRequestTime) < 30000; // Allow 30 seconds
}
public void setC2dmPendingRequestTime(long time) {
this.pendingC2DMRequestTime = time;
}
public void setPendingSocializeRequestTime(long pendingSocializeRequestTime) {
this.pendingSocializeRequestTime = pendingSocializeRequestTime;
}
public void reload(Context context) {
loaded = false;
load(context);
}
public void load(Context context) {
if(!loaded) {
SharedPreferences prefs = context.getSharedPreferences(PREFERENCES, Context.MODE_PRIVATE);
c2DMRegistrationId = prefs.getString("c2DMRegistrationId", null);
registeredUserId = prefs.getLong("registeredUserId", -1L);
pendingC2DMRequestTime = prefs.getLong("pendingC2DMRequestTime", 0);
pendingSocializeRequestTime = prefs.getLong("pendingSocializeRequestTime", 0);
lastC2DMRegistrationTime = prefs.getLong("lastC2DMRegistrationTime", 0);
lastSocializeRegistrationTime = prefs.getLong("lastSocializeRegistrationTime", 0);
lastGCMSenderID = prefs.getString("lastGCMSenderID", "");
lastCustomGCMSenderId = prefs.getString("lastCustomGCMSenderId", "");
if(logger != null && logger.isDebugEnabled()) {
logger.debug("Loaded notification state with registration id [" +
c2DMRegistrationId +
"], user id [" +
registeredUserId +
"]");
}
}
loaded = true;
}
public void save(Context context) {
if(logger != null && logger.isDebugEnabled()) {
logger.debug("Saving notification state with registration id [" +
c2DMRegistrationId +
"], user id [" +
registeredUserId +
"]");
}
SharedPreferences prefs = context.getSharedPreferences(PREFERENCES, Context.MODE_PRIVATE);
Editor editor = prefs.edit();
editor.putString("c2DMRegistrationId", c2DMRegistrationId);
editor.putLong("registeredUserId", registeredUserId);
editor.putLong("pendingC2DMRequestTime", pendingC2DMRequestTime);
editor.putLong("pendingSocializeRequestTime", pendingSocializeRequestTime);
editor.putLong("lastC2DMRegistrationTime", lastC2DMRegistrationTime);
editor.putLong("lastSocializeRegistrationTime", lastSocializeRegistrationTime);
editor.putString("lastGCMSenderID", config.getProperty(SocializeConfig.SOCIALIZE_GCM_SENDER_ID, ""));
editor.putString("lastCustomGCMSenderId", config.getProperty(SocializeConfig.SOCIALIZE_CUSTOM_GCM_SENDER_ID, ""));
editor.commit();
}
public void setLogger(SocializeLogger logger) {
this.logger = logger;
}
public void setConfig(SocializeConfig config) {
this.config = config;
}
}