/* * Copyright 2015 Hippo Seven * * 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.hippo.nimingban.client.ac.data; import android.graphics.Color; import android.os.Parcel; import android.text.Spannable; import android.text.SpannableString; import android.text.Spanned; import android.text.TextUtils; import android.text.style.ForegroundColorSpan; import com.hippo.nimingban.client.data.ACSite; import com.hippo.nimingban.client.data.Post; import com.hippo.nimingban.client.data.Reply; import com.hippo.nimingban.client.data.Site; import com.hippo.text.Html; import com.hippo.yorozuya.NumberUtils; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Locale; import java.util.TimeZone; public class ACPost extends Post { public static final Reply[] EMPTY_REPLY_ARRAY = new Reply[0]; /** * Parse the time string from website */ private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-ddHH:mm:ss", Locale.getDefault()); private static final Object sDateFormatLock = new Object(); static { // The website use GMT+08:00 DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("GMT+08:00")); } public String id = ""; public String img = ""; public String ext = ""; public String now = ""; public String userid = ""; public String name = ""; public String email = ""; public String title = ""; public String content = ""; public String sage = ""; public String admin = ""; public String replyCount = ""; // Ignore when writeToParcel public List<ACReply> replys; private Site mSite; private long mTime; private CharSequence mUser; private int mReplyCount; private CharSequence mContent; private String mThumbKey; private String mImageKey; private String mThumbUrl; private String mImageUrl; private Reply[] mReplies; @Override public String toString() { return "id = " + id + ", img = " + img + ", ext = " + ext + ", now = " + now + ", userid = " + userid + ", name = " + name + ", email = " + email + ", title = " + title + ", content = " + content + ", admin = " + admin + ", replyCount = " + replyCount + ", replys = " + replys; } private static String removeDayOfWeek(String time) { StringBuilder sb = new StringBuilder(time.length() - 3); boolean inBrackets = false; for (int i = 0, n = time.length(); i < n; i++) { char c = time.charAt(i); if (inBrackets) { if (c == ')') { inBrackets = false; } else { // Skip } } else { if (c == '(') { inBrackets = true; } else { sb.append(c); } } } return sb.toString(); } public static long parseTime(String time) { try { synchronized (sDateFormatLock) { Date date = DATE_FORMAT.parse(removeDayOfWeek(time)); return date.getTime(); } } catch (ParseException e) { return 0; } } @Override public void generate(Site site) { mSite = site; mTime = parseTime(now); if ("1".equals(admin)) { Spannable spannable = new SpannableString(userid); spannable.setSpan(new ForegroundColorSpan(Color.RED), 0, userid.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); mUser = spannable; } else { mUser = ACItemUtils.handleUser(Html.fromHtml(userid), getNMBPostId(), getNMBId()); } mReplyCount = NumberUtils.parseIntSafely(replyCount, -1); mContent = ACItemUtils.generateContent(content, sage, title, name, email); if (!TextUtils.isEmpty(img)) { String ext2 = ext; if (".jpe".equals(ext2)) { ext2 = ".jpeg"; } String key = img + ext2; mThumbKey = "thumb/" + key; mImageKey = "image/" + key; ACSite acSite = ACSite.getInstance(); mThumbUrl = acSite.getPictureUrl(mThumbKey); mImageUrl = acSite.getPictureUrl(mImageKey); } List<ACReply> replyList = replys; if (replyList != null && replyList.size() > 0) { int n = replyList.size(); Reply[] replies = new Reply[n]; mReplies = replies; for (int i = 0; i < n; i++) { replies[i] = replyList.get(i); } } else { mReplies = EMPTY_REPLY_ARRAY; } } public void generateSelfAndReplies(Site site) { generate(site); // generate replies if (replys == null) { // Can't get replise replys = new ArrayList<>(0); } else { for (ACReply reply : replys) { reply.mPostId = id; reply.generate(site); } } } @Override public Site getNMBSite() { return mSite; } @Override public String getNMBId() { return id; } @Override public String getNMBPostId() { return id; } @Override public long getNMBTime() { return mTime; } @Override public CharSequence getNMBDisplayUsername() { return mUser; } @Override public CharSequence getNMBDisplayContent() { return mContent; } @Override public int getNMBReplyCount() { return mReplyCount; } @Override public CharSequence getNMBReplyDisplayCount() { return replyCount; } @Override public Reply[] getNMBReplies() { return mReplies; } @Override public String getNMBThumbKey() { return mThumbKey; } @Override public String getNMBImageKey() { return mImageKey; } @Override public String getNMBThumbUrl() { return mThumbUrl; } @Override public String getNMBImageUrl() { return mImageUrl; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(this.id); dest.writeString(this.img); dest.writeString(this.ext); dest.writeString(this.now); dest.writeString(this.userid); dest.writeString(this.name); dest.writeString(this.email); dest.writeString(this.title); dest.writeString(this.content); dest.writeString(this.admin); dest.writeString(this.replyCount); dest.writeInt(this.mSite.getId()); } public ACPost() { } // Need to call generate protected ACPost(Parcel in) { this.id = in.readString(); this.img = in.readString(); this.ext = in.readString(); this.now = in.readString(); this.userid = in.readString(); this.name = in.readString(); this.email = in.readString(); this.title = in.readString(); this.content = in.readString(); this.admin = in.readString(); this.replyCount = in.readString(); this.mSite = Site.fromId(in.readInt()); } public static final Creator<ACPost> CREATOR = new Creator<ACPost>() { @Override public ACPost createFromParcel(Parcel source) { return new ACPost(source); } @Override public ACPost[] newArray(int size) { return new ACPost[size]; } }; }