content: /*
   * Copyright (C) 2015 Actor LLC. <https://actor.im>
   */
  
  package im.actor.core.entity;
  
  import com.google.j2objc.annotations.Property;
  
  import java.io.IOException;
  
  import im.actor.core.entity.content.AbsContent;
  import im.actor.core.entity.content.ContactContent;
  import im.actor.core.entity.content.DocumentContent;
  import im.actor.core.entity.content.JsonContent;
  import im.actor.core.entity.content.LocationContent;
  import im.actor.core.entity.content.PhotoContent;
  import im.actor.core.entity.content.ServiceCallEnded;
  import im.actor.core.entity.content.ServiceCallMissed;
  import im.actor.core.entity.content.ServiceContent;
  import im.actor.core.entity.content.ServiceGroupAvatarChanged;
  import im.actor.core.entity.content.ServiceGroupAboutChanged;
  import im.actor.core.entity.content.ServiceGroupTopicChanged;
  import im.actor.core.entity.content.ServiceGroupCreated;
  import im.actor.core.entity.content.ServiceGroupTitleChanged;
  import im.actor.core.entity.content.ServiceGroupUserInvited;
  import im.actor.core.entity.content.ServiceGroupUserJoined;
  import im.actor.core.entity.content.ServiceGroupUserKicked;
  import im.actor.core.entity.content.ServiceGroupUserLeave;
  import im.actor.core.entity.content.ServiceUserRegistered;
  import im.actor.core.entity.content.StickerContent;
  import im.actor.core.entity.content.TextContent;
  import im.actor.core.entity.content.VideoContent;
  import im.actor.core.entity.content.VoiceContent;
  import im.actor.runtime.bser.Bser;
  import im.actor.runtime.bser.BserObject;
  import im.actor.runtime.bser.BserValues;
  import im.actor.runtime.bser.BserWriter;
  
  
  public class ContentDescription extends BserObject {
  
      public static ContentDescription fromBytes(byte[] data) throws IOException {
          return Bser.parse(new ContentDescription(), data);
      }
  
      public static ContentDescription fromContent(AbsContent msg) {
          if (msg instanceof TextContent) {
              return new ContentDescription(ContentType.TEXT,
                      ((TextContent) msg).getText());
          } else if (msg instanceof PhotoContent) {
              return new ContentDescription(ContentType.DOCUMENT_PHOTO);
          } else if (msg instanceof VideoContent) {
              return new ContentDescription(ContentType.DOCUMENT_VIDEO);
          } else if (msg instanceof VoiceContent) {
              return new ContentDescription(ContentType.DOCUMENT_AUDIO);
          } else if (msg instanceof DocumentContent) {
              return new ContentDescription(ContentType.DOCUMENT);
          } else if (msg instanceof LocationContent) {
              return new ContentDescription(ContentType.LOCATION);
          } else if (msg instanceof ContactContent) {
              return new ContentDescription(ContentType.CONTACT);
          } else if (msg instanceof StickerContent) {
              return new ContentDescription(ContentType.STICKER);
          } else if (msg instanceof ServiceUserRegistered) {
              return new ContentDescription(ContentType.SERVICE_REGISTERED);
          } else if (msg instanceof ServiceCallEnded) {
              return new ContentDescription(ContentType.SERVICE_CALL_ENDED);
          } else if (msg instanceof ServiceCallMissed) {
              return new ContentDescription(ContentType.SERVICE_CALL_MISSED);
          } else if (msg instanceof ServiceGroupAvatarChanged) {
              if (((ServiceGroupAvatarChanged) msg).getNewAvatar() == null) {
                  return new ContentDescription(ContentType.SERVICE_AVATAR_REMOVED);
              } else {
                  return new ContentDescription(ContentType.SERVICE_AVATAR);
              }
          } else if (msg instanceof ServiceGroupTitleChanged) {
              return new ContentDescription(ContentType.SERVICE_TITLE,
                      ((ServiceGroupTitleChanged) msg).getNewTitle());
          } else if (msg instanceof ServiceGroupTopicChanged) {
              return new ContentDescription(ContentType.SERVICE_TOPIC,
                      ((ServiceGroupTopicChanged) msg).getNewTopic());
          } else if (msg instanceof ServiceGroupAboutChanged) {
              return new ContentDescription(ContentType.SERVICE_ABOUT,
                      ((ServiceGroupAboutChanged) msg).getNewAbout());
          } else if (msg instanceof ServiceGroupCreated) {
              return new ContentDescription(ContentType.SERVICE_CREATED);
          } else if (msg instanceof ServiceGroupUserInvited) {
              return new ContentDescription(ContentType.SERVICE_ADD, "",
                      ((ServiceGroupUserInvited) msg).getAddedUid(), false);
          } else if (msg instanceof ServiceGroupUserKicked) {
              return new ContentDescription(ContentType.SERVICE_KICK, "",
                      ((ServiceGroupUserKicked) msg).getKickedUid(), false);
          } else if (msg instanceof ServiceGroupUserLeave) {
              return new ContentDescription(ContentType.SERVICE_LEAVE, "",
                      0, true);
          } else if (msg instanceof ServiceGroupUserJoined) {
              return new ContentDescription(ContentType.SERVICE_JOINED, "",
                      0, false);
          } else if (msg instanceof ServiceContent) {
              return new ContentDescription(ContentType.SERVICE,
                      ((ServiceContent) msg).getCompatText(), 0, false);
          } else if (msg instanceof JsonContent) {
              return new ContentDescription(ContentType.TEXT, ((JsonContent) msg).getContentDescription());
          } else {
              return new ContentDescription(ContentType.UNKNOWN_CONTENT);
          }
      }
  
      @Property("readonly, nonatomic")
      private ContentType contentType;
      @Property("readonly, nonatomic")
      private String text;
      @Property("readonly, nonatomic")
      private int relatedUser;
      @Property("readonly, nonatomic")
      private boolean isSilent;
  
      public ContentDescription(ContentType contentType, String text, int relatedUser,
                                boolean isSilent) {
          this.contentType = contentType;
          this.text = text;
          this.relatedUser = relatedUser;
          this.isSilent = isSilent;
      }
  
      public ContentDescription(ContentType contentType, String text) {
          this(contentType, text, 0, false);
      }
  
      public ContentDescription(ContentType contentType) {
          this(contentType, "", 0, false);
      }
  
      private ContentDescription() {
  
      }
  
      public ContentType getContentType() {
          return contentType;
      }
  
      public String getText() {
          return text;
      }
  
      public int getRelatedUser() {
          return relatedUser;
      }
  
      public boolean isSilent() {
          return isSilent;
      }
  
      @Override
      public void parse(BserValues values) throws IOException {
          contentType = ContentType.fromValue(values.getInt(1));
          text = values.getString(2);
          relatedUser = values.getInt(3);
          isSilent = values.getBool(4);
      }
  
      @Override
      public void serialize(BserWriter writer) throws IOException {
          writer.writeInt(1, contentType.getValue());
          writer.writeString(2, text);
          writer.writeInt(3, relatedUser);
          writer.writeBool(4, isSilent);
      }
  }
  