// // Copyright (c) 2014 VK.com // // 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. // /** * VKAttachments.java * vk-android-sdk * * Created by Babichev Vitaly on 01.02.14. * Copyright (c) 2014 VK. All rights reserved. */ package com.vk.sdk.api.model; import android.os.Parcel; import com.vk.sdk.util.VKStringJoiner; import org.json.JSONArray; import org.json.JSONObject; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * A list of attachments in {@link VKApiComment}, {@link VKApiPost}, {@link VKApiMessage} */ public class VKAttachments extends VKList<VKAttachments.VKApiAttachment> implements android.os.Parcelable { /** * Attachment is a photo. * @see {@link VKApiPhoto} */ public static final String TYPE_PHOTO = "photo"; /** * Attachment is a video. * @see {@link VKApiVideo} */ public static final String TYPE_VIDEO = "video"; /** * Attachment is an audio. * @see {@link VKApiAudio} */ public static final String TYPE_AUDIO = "audio"; /** * Attachment is a document. * @see {@link VKApiDocument} */ public static final String TYPE_DOC = "doc"; /** * Attachment is a wall post. * @see {@link VKApiPost} */ public static final String TYPE_POST = "wall"; /** * Attachment is a posted photo. * @see {@link VKApiPostedPhoto} */ public static final String TYPE_POSTED_PHOTO = "posted_photo"; /** * Attachment is a link * @see {@link VKApiLink} */ public static final String TYPE_LINK = "link"; /** * Attachment is a note * @see {@link VKApiNote} */ public static final String TYPE_NOTE = "note"; /** * Attachment is an application content * @see {@link VKApiApplicationContent} */ public static final String TYPE_APP = "app"; /** * Attachment is a poll * @see {@link VKApiPoll} */ public static final String TYPE_POLL = "poll"; /** * Attachment is a WikiPage * @see {@link VKApiWikiPage} */ public static final String TYPE_WIKI_PAGE = "page"; /** * Attachment is a PhotoAlbum * @see {@link VKApiPhotoAlbum} */ public static final String TYPE_ALBUM = "album"; public VKAttachments() { super(); } public VKAttachments(VKApiAttachment... data) { super(Arrays.asList(data)); } public VKAttachments(List<? extends VKApiAttachment> data) { super(data); } public VKAttachments(JSONObject from) { super(); fill(from); } public VKAttachments(JSONArray from) { super(); fill(from); } public void fill(JSONObject from) { super.fill(from, parser); } public void fill(JSONArray from) { super.fill(from, parser); } public String toAttachmentsString() { ArrayList<CharSequence> attachments = new ArrayList<CharSequence>(); for (VKApiAttachment attach : this) { attachments.add(attach.toAttachmentString()); } return VKStringJoiner.join(attachments, ","); } /** * Parser that's used for parsing photo sizes. */ private final Parser<VKApiAttachment> parser = new Parser<VKApiAttachment>() { @Override public VKApiAttachment parseObject(JSONObject attachment) throws Exception { String type = attachment.optString("type"); if(TYPE_PHOTO.equals(type)) { return new VKApiPhoto().parse(attachment.getJSONObject(TYPE_PHOTO)); } else if(TYPE_VIDEO.equals(type)) { return new VKApiVideo().parse(attachment.getJSONObject(TYPE_VIDEO)); } else if(TYPE_AUDIO.equals(type)) { return new VKApiAudio().parse(attachment.getJSONObject(TYPE_AUDIO)); } else if(TYPE_DOC.equals(type)) { return new VKApiDocument().parse(attachment.getJSONObject(TYPE_DOC)); } else if(TYPE_POST.equals(type)) { return new VKApiPost().parse(attachment.getJSONObject(TYPE_POST)); } else if(TYPE_POSTED_PHOTO.equals(type)) { return new VKApiPostedPhoto().parse(attachment.getJSONObject(TYPE_POSTED_PHOTO)); } else if(TYPE_LINK.equals(type)) { return new VKApiLink().parse(attachment.getJSONObject(TYPE_LINK)); } else if(TYPE_NOTE.equals(type)) { return new VKApiNote().parse(attachment.getJSONObject(TYPE_NOTE)); } else if(TYPE_APP.equals(type)) { return new VKApiApplicationContent().parse(attachment.getJSONObject(TYPE_APP)); } else if(TYPE_POLL.equals(type)) { return new VKApiPoll().parse(attachment.getJSONObject(TYPE_POLL)); } else if(TYPE_WIKI_PAGE.equals(type)) { return new VKApiWikiPage().parse(attachment.getJSONObject(TYPE_WIKI_PAGE)); } else if(TYPE_ALBUM.equals(type)) { return new VKApiPhotoAlbum().parse(attachment.getJSONObject(TYPE_ALBUM)); } return null; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(size()); for(VKApiAttachment attachment: this) { dest.writeString(attachment.getType()); dest.writeParcelable(attachment, 0); } } public VKAttachments(Parcel parcel) { int size = parcel.readInt(); for(int i = 0; i < size; i++) { String type = parcel.readString(); if(TYPE_PHOTO.equals(type)) { add((VKApiAttachment) parcel.readParcelable(VKApiPhoto.class.getClassLoader())); } else if(TYPE_VIDEO.equals(type)) { add((VKApiAttachment) parcel.readParcelable(VKApiVideo.class.getClassLoader())); } else if(TYPE_AUDIO.equals(type)) { add((VKApiAttachment) parcel.readParcelable(VKApiAudio.class.getClassLoader())); } else if(TYPE_DOC.equals(type)) { add((VKApiAttachment) parcel.readParcelable(VKApiDocument.class.getClassLoader())); } else if(TYPE_POST.equals(type)) { add((VKApiAttachment) parcel.readParcelable(VKApiPost.class.getClassLoader())); } else if(TYPE_POSTED_PHOTO.equals(type)) { add((VKApiAttachment) parcel.readParcelable(VKApiPostedPhoto.class.getClassLoader())); } else if(TYPE_LINK.equals(type)) { add((VKApiAttachment) parcel.readParcelable(VKApiLink.class.getClassLoader())); } else if(TYPE_NOTE.equals(type)) { add((VKApiAttachment) parcel.readParcelable(VKApiNote.class.getClassLoader())); } else if(TYPE_APP.equals(type)) { add((VKApiAttachment) parcel.readParcelable(VKApiApplicationContent.class.getClassLoader())); } else if(TYPE_POLL.equals(type)) { add((VKApiAttachment) parcel.readParcelable(VKApiPoll.class.getClassLoader())); } else if(TYPE_WIKI_PAGE.equals(type)) { add((VKApiAttachment) parcel.readParcelable(VKApiWikiPage.class.getClassLoader())); } else if(TYPE_ALBUM.equals(type)) { add((VKApiAttachment) parcel.readParcelable(VKApiPhotoAlbum.class.getClassLoader())); } } } public static Creator<VKAttachments> CREATOR = new Creator<VKAttachments>() { public VKAttachments createFromParcel(Parcel source) { return new VKAttachments(source); } public VKAttachments[] newArray(int size) { return new VKAttachments[size]; } }; /** * An abstract class for all attachments */ @SuppressWarnings("unused") public abstract static class VKApiAttachment extends VKApiModel implements Identifiable { /** * Convert attachment to special string to attach it to the post, message or comment. */ public abstract CharSequence toAttachmentString(); /** * @return type of this attachment */ public abstract String getType(); } }