/**
* Copyright 2014-present Liquid Data Intelligence S.A.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.lqd.sdk.model;
import android.content.Context;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.Date;
import java.util.HashMap;
import io.lqd.sdk.LQLog;
import io.lqd.sdk.LiquidTools;
public class LQUser extends LQModel {
private static final long serialVersionUID = 1582937331182018907L;
private static final String[] RESERVED_KEYS = {"unique_id", "identified"};
private String mIdentifier;
private boolean mIdentified;
private HashMap<String, Object> mAttributes = new HashMap<String, Object>();
public LQUser(String identifier) {
this(identifier, new HashMap<String,Object>());
}
public LQUser(String identifier, boolean identified) {
this(identifier, new HashMap<String,Object>(), identified);
}
public LQUser(String identifier, HashMap<String, Object> attributes) {
this(identifier, attributes, true);
}
public LQUser(String identifier, HashMap<String, Object> attributes, boolean identified) {
mIdentifier = identifier;
mAttributes = attributes;
this.setIdentified(identified);
attributesCheck();
}
// Attributes
public String getIdentifier() {
return mIdentifier;
}
public String setIdentifierForPrefs(String identifier){
mIdentifier = identifier;
return mIdentifier;
}
public boolean isIdentified() {
return mIdentified;
}
public void setIdentified(boolean mAutoIdentified) {
this.mIdentified = mAutoIdentified;
}
@Override
public boolean equals(Object o) {
return (o instanceof LQUser) && ( this.toJSON().toString().equals(((LQUser) o).toJSON().toString()));
}
public void clearCustomAttributes() {
setAttributes(new HashMap<String, Object>());
}
public HashMap<String, Object> getAttributes() {
return new HashMap<String, Object>(mAttributes);
}
public void setAttributes(HashMap<String, Object> attributes) {
mAttributes = attributes;
attributesCheck();
}
public Object setAttribute(String key, Object attribute) {
return mAttributes.put(key, attribute);
}
public Object attributeForKey(String key) {
return mAttributes.get(key);
}
// JSON
public JSONObject toJSON() {
JSONObject json = new JSONObject();
try {
if(mAttributes != null) {
for(String key : mAttributes.keySet()) {
if(mAttributes.get(key) instanceof Date) {
json.put(key, LiquidTools.dateToString((Date) mAttributes.get(key)));
} else {
json.put(key, mAttributes.get(key));
}
}
}
json.put("unique_id", mIdentifier);
json.put("identified", mIdentified);
return json;
} catch (JSONException e) {
LQLog.error("LQUser toJSON: " + e.getMessage());
}
return null;
}
public static LQModel fromJSON(JSONObject jsonObject) {
try {
String unique_id = jsonObject.getString("unique_id");
boolean identified = jsonObject.getBoolean("identified");
HashMap<String, Object> attrs = attributesFromJSON(jsonObject, RESERVED_KEYS);
return new LQUser(unique_id, attrs, identified);
} catch (JSONException e) {
LQLog.infoVerbose("New user, identifying now...");
return new LQUser(LQModel.newIdentifier(), false);
}
}
protected void attributesCheck() {
if(mAttributes == null) {
mAttributes = new HashMap<String, Object>();
}
}
@Override
public void save(Context context, String path) {
super.save(context, path + ".user");
}
public static LQUser load(Context context, String path) {
return (LQUser) fromJSON(retriveFromFile(context, path));
}
}