package co.smartreceipts.android.sync.model.impl;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import java.sql.Date;
import co.smartreceipts.android.sync.model.SyncState;
import co.smartreceipts.android.sync.provider.SyncProvider;
public class DefaultSyncState implements SyncState {
private final IdentifierMap mIdentifierMap;
private final SyncStatusMap mSyncStatusMap;
private final MarkedForDeletionMap mMarkedForDeletionMap;
private final Date mLastLocalModificationTime;
public DefaultSyncState() {
this(new Date(System.currentTimeMillis()));
}
public DefaultSyncState(@NonNull Date lastLocalModificationTime) {
this(null, null, null, lastLocalModificationTime);
}
public DefaultSyncState(@Nullable IdentifierMap identifierMap, @Nullable SyncStatusMap syncStatusMap, @Nullable MarkedForDeletionMap markedForDeletionMap, @Nullable Date lastLocalModificationTime) {
mIdentifierMap = identifierMap;
mSyncStatusMap = syncStatusMap;
mMarkedForDeletionMap = markedForDeletionMap;
mLastLocalModificationTime = lastLocalModificationTime;
}
private DefaultSyncState(@NonNull Parcel source) {
mIdentifierMap = (IdentifierMap) source.readSerializable();
mSyncStatusMap = (SyncStatusMap) source.readSerializable();
mMarkedForDeletionMap = (MarkedForDeletionMap) source.readSerializable();
mLastLocalModificationTime = new Date(source.readLong());
}
@Nullable
@Override
public Identifier getSyncId(@NonNull SyncProvider provider) {
if (mIdentifierMap != null) {
return mIdentifierMap.getSyncId(provider);
} else {
return null;
}
}
@Override
public boolean isSynced(@NonNull SyncProvider provider) {
if (mSyncStatusMap != null) {
return mSyncStatusMap.isSynced(provider);
} else {
return false;
}
}
@Override
public boolean isMarkedForDeletion(@NonNull SyncProvider provider) {
if (mMarkedForDeletionMap != null) {
return mMarkedForDeletionMap.isMarkedForDeletion(provider);
} else {
return false;
}
}
@NonNull
@Override
public Date getLastLocalModificationTime() {
if (mLastLocalModificationTime != null) {
return mLastLocalModificationTime;
} else {
return new Date(0);
}
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof DefaultSyncState)) return false;
DefaultSyncState syncState = (DefaultSyncState) o;
if (mIdentifierMap != null ? !mIdentifierMap.equals(syncState.mIdentifierMap) : syncState.mIdentifierMap != null)
return false;
if (mSyncStatusMap != null ? !mSyncStatusMap.equals(syncState.mSyncStatusMap) : syncState.mSyncStatusMap != null)
return false;
if (mMarkedForDeletionMap != null ? !mMarkedForDeletionMap.equals(syncState.mMarkedForDeletionMap) : syncState.mMarkedForDeletionMap != null)
return false;
return mLastLocalModificationTime != null ? mLastLocalModificationTime.equals(syncState.mLastLocalModificationTime) : syncState.mLastLocalModificationTime == null;
}
@Override
public int hashCode() {
int result = mIdentifierMap != null ? mIdentifierMap.hashCode() : 0;
result = 31 * result + (mSyncStatusMap != null ? mSyncStatusMap.hashCode() : 0);
result = 31 * result + (mMarkedForDeletionMap != null ? mMarkedForDeletionMap.hashCode() : 0);
result = 31 * result + (mLastLocalModificationTime != null ? mLastLocalModificationTime.hashCode() : 0);
return result;
}
@Override
public String toString() {
return "DefaultSyncState{" +
"mIdentifierMap=" + mIdentifierMap +
", mSyncStatusMap=" + mSyncStatusMap +
", mMarkedForDeletionMap=" + mMarkedForDeletionMap +
", mLastLocalModificationTime=" + mLastLocalModificationTime +
'}';
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeSerializable(mIdentifierMap);
dest.writeSerializable(mSyncStatusMap);
dest.writeSerializable(mMarkedForDeletionMap);
dest.writeLong(getLastLocalModificationTime().getTime());
}
public static final Parcelable.Creator<DefaultSyncState> CREATOR = new Parcelable.Creator<DefaultSyncState>() {
public DefaultSyncState createFromParcel(Parcel source) {
return new DefaultSyncState(source);
}
public DefaultSyncState[] newArray(int size) {
return new DefaultSyncState[size];
}
};
}