/*
* Copyright (c) 2016 Google Inc.
*
* 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 com.google.samples.apps.iosched.sync.userdata.util;
import com.google.gson.annotations.SerializedName;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* Represents all User specific data that can be synchronized on Google Drive App Data.
*/
public class UserData {
/** JSON Attribute name of the GCM Key value. */
public static final String JSON_ATTRIBUTE_GCM_KEY = "gcm_key";
/** JSON Attribute name of the viewed videos values. */
public static final String JSON_ATTRIBUTE_VIEWED_VIDEOS = "viewed_videos";
/** JSON Attribute name of the starred sessions values. */
public static final String JSON_ATTRIBUTE_STARRED_SESSIONS = "starred_sessions";
/** JSON Attribute name of the feedback submitted for sessions values. */
public static final String JSON_ATTRIBUTE_FEEDBACK_SUBMITTED_SESSIONS = "feedback_submitted_sessions";
/**
* Used to track whether a session is currently in a user's schedule and the timestamp for when
* it was last added or removed.
*/
public static class StarredSession {
// TODO: make members public. See b/28321953.
private boolean inSchedule;
private long timestamp;
public StarredSession(final boolean inSchedule, final long timestamp) {
this.inSchedule = inSchedule;
this.timestamp = timestamp;
}
public boolean isInSchedule() {
return inSchedule;
}
public long getTimestamp() {
return timestamp;
}
public void setTimestamp(final long timestamp) {
this.timestamp = timestamp;
}
/**
* Indicates whether this is equal to another object. Auto-generated by Intellij.
*/
@Override
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
final StarredSession that = (StarredSession) o;
if (inSchedule != that.inSchedule) {
return false;
}
return timestamp == that.timestamp;
}
/**
* Returns a hash code value for this object. Auto-generated by Intellij.
*/
@Override
public int hashCode() {
int result = (inSchedule ? 1 : 0);
result = 31 * result + (int) (timestamp ^ (timestamp >>> 32));
return result;
}
}
// TODO: make members public. See b/28321953.
@SerializedName(JSON_ATTRIBUTE_STARRED_SESSIONS)
private Map<String, StarredSession> starredSessions = new HashMap<>();
@SerializedName(JSON_ATTRIBUTE_FEEDBACK_SUBMITTED_SESSIONS)
private Set<String> feedbackSubmittedSessionIds = new HashSet<String>();
@SerializedName(JSON_ATTRIBUTE_VIEWED_VIDEOS)
private Set<String> viewedVideoIds = new HashSet<String>();
@SerializedName(JSON_ATTRIBUTE_GCM_KEY)
private String gcmKey;
public Map<String, StarredSession> getStarredSessions() {
return starredSessions;
}
public void setStarredSessions(Map<String, StarredSession> starredSessions) {
this.starredSessions = starredSessions;
}
public Set<String> getFeedbackSubmittedSessionIds() {
return feedbackSubmittedSessionIds;
}
public void setFeedbackSubmittedSessionIds(Set<String> feedbackSubmittedSessionIds) {
this.feedbackSubmittedSessionIds = feedbackSubmittedSessionIds;
}
public Set<String> getViewedVideoIds() {
return viewedVideoIds;
}
public void setViewedVideoIds(Set<String> viewedVideoIds) {
this.viewedVideoIds = viewedVideoIds;
}
public String getGcmKey() {
return gcmKey;
}
public void setGcmKey(String gcmKey) {
this.gcmKey = gcmKey;
}
public void addVideoId(String videoId) {
getViewedVideoIds().add(videoId);
}
public void updateVideoIds(UserData other) {
getViewedVideoIds().addAll(other.getViewedVideoIds());
}
public void addFeedbackSubmittedSessionId(String sessionId) {
getFeedbackSubmittedSessionIds().add(sessionId);
}
public void updateFeedbackSubmittedSessionIds(UserData other) {
getFeedbackSubmittedSessionIds().addAll(other.getFeedbackSubmittedSessionIds());
}
/**
* Indicates whether this is equal to another object. Auto-generated by Intellij.
*/
@Override
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
final UserData userData = (UserData) o;
if (starredSessions != null ? !starredSessions.equals(userData.starredSessions) :
userData.starredSessions != null) {
return false;
}
if (feedbackSubmittedSessionIds != null ?
!feedbackSubmittedSessionIds.equals(userData.feedbackSubmittedSessionIds) :
userData.feedbackSubmittedSessionIds != null) {
return false;
}
if (viewedVideoIds != null ? !viewedVideoIds.equals(userData.viewedVideoIds) :
userData.viewedVideoIds != null) {
return false;
}
return !(gcmKey != null ? !gcmKey.equals(userData.gcmKey) : userData.gcmKey != null);
}
/**
* Returns a hash code value for this object. Auto-generated by Intellij.
*/
@Override
public int hashCode() {
int result = starredSessions != null ? starredSessions.hashCode() : 0;
result = 31 * result +
(feedbackSubmittedSessionIds != null ? feedbackSubmittedSessionIds.hashCode() :
0);
result = 31 * result + (viewedVideoIds != null ? viewedVideoIds.hashCode() : 0);
result = 31 * result + (gcmKey != null ? gcmKey.hashCode() : 0);
return result;
}
}