/** * galaxy inc. * meetup client for android */ package com.galaxy.meetup.client.android.ui.view; import WriteReviewOperation.MediaRef; import android.content.Context; import android.content.res.Resources; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.Typeface; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.NinePatchDrawable; import android.text.StaticLayout; import android.text.TextPaint; import android.text.TextUtils; import android.util.AttributeSet; import android.util.Pair; import android.view.animation.Interpolator; import com.galaxy.meetup.client.android.R; import com.galaxy.meetup.client.android.content.DbEmbedSquare; import com.galaxy.meetup.client.android.content.DbLocation; import com.galaxy.meetup.client.android.content.DbPlusOneData; import com.galaxy.meetup.client.android.content.EsAvatarData; import com.galaxy.meetup.client.android.content.EsPostsData; import com.galaxy.meetup.client.util.AccessibilityUtils; import com.galaxy.meetup.client.util.BackgroundPatternUtils; import com.galaxy.meetup.client.util.Dates; import com.galaxy.meetup.client.util.ImageUtils; import com.galaxy.meetup.client.util.PlusBarUtils; import com.galaxy.meetup.client.util.TextPaintUtils; import com.galaxy.meetup.server.client.domain.PlusEvent; import com.galaxy.meetup.server.client.util.JsonUtil; /** * * @author sihai * */ public abstract class StreamCardView extends CardView implements ClickableButton.ClickableButtonListener { protected static TextPaint sAttributionTextPaint; protected static Bitmap sAuthorBitmap; protected static int sAuthorNameYOffset; protected static TextPaint sAutoTextPaint; protected static int sAvatarSize; protected static Bitmap sCommentsBitmap; protected static Bitmap sCommunityBitmap; protected static int sContentXPadding; protected static int sContentYPadding; private static final Interpolator sDampingInterpolator = new Interpolator() { public final float getInterpolation(float f) { double d = 3.1415926535897931D * (double)(4F * f - 1.0F); return (float)(Math.sin(d) / d); } }; protected static Bitmap sDeepLinkHintBitmap; protected static Paint sGraySpamBackgroundPaint; protected static int sGraySpamIconPadding; protected static TextPaint sGraySpamTextPaint; protected static Bitmap sGraySpamWarningBitmap; protected static float sMediaCardBigHeightPercentage; protected static float sMediaCardHeightPercentage; protected static NinePatchDrawable sMediaShadowDrawable; protected static Paint sMediaTopAreaBackgroundPaint; protected static TextPaint sNameTextPaint; protected static TextPaint sRelativeTimeTextPaint; protected static int sRelativeTimeYOffset; protected static Bitmap sReshareBitmap; protected static Bitmap sSquareBitmap; private static boolean sStreamCardViewInitialized; protected static Bitmap sTagAlbumBitmaps[]; protected static int sTagBackgroundYPadding; protected static Drawable sTagDrawable; protected static Bitmap sTagHangoutBitmaps[]; protected static int sTagIconXPadding; protected static int sTagIconYPaddingCheckin; protected static int sTagIconYPaddingLocation; protected static int sTagIconYPaddingWithPhoto; protected static Bitmap sTagLinkBitmaps[]; protected static Bitmap sTagLocationBitmaps[]; protected static Bitmap sTagMusicBitmaps[]; protected static TextPaint sTagTextPaint; protected static int sTagTextXPadding; protected static Bitmap sTagVideoBitmaps[]; protected static int sTagYOffset; protected static BitmapDrawable sTiledStageDrawable; protected static Bitmap sWhatsHotBitmap; protected String mActivityId; protected CharSequence mAttribution; protected StaticLayout mAttributionLayout; protected String mAuthorAvatarUrl; protected String mAuthorGaiaId; protected ClickableAvatar mAuthorImage; protected String mAuthorName; protected StaticLayout mAuthorNameLayout; protected int mAutoText; protected StaticLayout mAutoTextLayout; protected boolean mCanReshare; protected ClickableButton mCommentsButton; protected CharSequence mContent; protected StaticLayout mContentLayout; protected Bitmap mCornerIcon; protected String mEventId; protected String mEventOwnerId; protected CharSequence mFillerContent; protected StaticLayout mFillerContentLayout; protected StaticLayout mGraySpamLayout; protected boolean mInvisiblePlusOneButton; protected boolean mIsGraySpam; protected boolean mIsLimited; protected ClickableButton mOverridePlusOnedButton; protected boolean mOverridePlusOnedButtonDisplay; protected ClickableButton mPlusOneButton; protected DbPlusOneData mPlusOneData; protected String mRelativeTime; protected StaticLayout mRelativeTimeLayout; protected ClickableButton mReshareButton; private Runnable mShakeAnimation; protected String mSquareIdForOneUp; protected boolean mSquareMode; protected StreamMediaClickListener mStreamMediaClickListener; protected StreamPlusBarClickListener mStreamPlusBarClickListener; protected CharSequence mTag; protected Drawable mTagDrawableInstance; protected Bitmap mTagIcon; protected StaticLayout mTagLayout; protected int mTotalComments; private ViewedListener mViewedListener; protected boolean mViewerIsSquareAdmin; public StreamCardView(Context context) { this(context, null); } public StreamCardView(Context context, AttributeSet attributeset) { super(context, attributeset); Resources resources = context.getResources(); if(!sStreamCardViewInitialized) { sStreamCardViewInitialized = true; sAuthorBitmap = EsAvatarData.getMediumDefaultAvatar(context, true); Bitmap abitmap[] = new Bitmap[2]; abitmap[0] = ImageUtils.decodeResource(resources, R.drawable.ic_metadata_album); abitmap[1] = ImageUtils.decodeResource(resources, R.drawable.ic_album_blue); sTagAlbumBitmaps = abitmap; Bitmap abitmap1[] = new Bitmap[2]; abitmap1[0] = ImageUtils.decodeResource(resources, R.drawable.ic_metadata_link); abitmap1[1] = ImageUtils.decodeResource(resources, R.drawable.ic_link_blue); sTagLinkBitmaps = abitmap1; Bitmap abitmap2[] = new Bitmap[2]; abitmap2[0] = ImageUtils.decodeResource(resources, R.drawable.ic_metadata_location); abitmap2[1] = ImageUtils.decodeResource(resources, R.drawable.icn_location_card); sTagLocationBitmaps = abitmap2; Bitmap abitmap3[] = new Bitmap[2]; abitmap3[0] = ImageUtils.decodeResource(resources, R.drawable.ic_metadata_music); abitmap3[1] = ImageUtils.decodeResource(resources, R.drawable.ic_music_blue); sTagMusicBitmaps = abitmap3; Bitmap abitmap4[] = new Bitmap[2]; abitmap4[0] = ImageUtils.decodeResource(resources, R.drawable.ic_metadata_video); abitmap4[1] = ImageUtils.decodeResource(resources, R.drawable.ic_video_blue); sTagVideoBitmaps = abitmap4; Bitmap abitmap5[] = new Bitmap[2]; abitmap5[0] = ImageUtils.decodeResource(resources, R.drawable.ic_metadata_hangouts); abitmap5[1] = null; sTagHangoutBitmaps = abitmap5; sCommentsBitmap = ImageUtils.decodeResource(resources, R.drawable.ic_comments); sReshareBitmap = ImageUtils.decodeResource(resources, R.drawable.ic_menu_reshare); sCommunityBitmap = ImageUtils.decodeResource(resources, R.drawable.ic_community); sWhatsHotBitmap = ImageUtils.decodeResource(resources, R.drawable.ic_whatshot); sDeepLinkHintBitmap = ImageUtils.decodeResource(resources, R.drawable.ic_open_external_link); sSquareBitmap = ImageUtils.decodeResource(resources, R.drawable.ic_community_share); sGraySpamWarningBitmap = ImageUtils.decodeResource(resources, R.drawable.ic_error_white); sTagDrawable = resources.getDrawable(R.drawable.card_tag); sMediaShadowDrawable = (NinePatchDrawable)resources.getDrawable(R.drawable.taco_media_shadow); BitmapDrawable bitmapdrawable = (BitmapDrawable)resources.getDrawable(R.drawable.bg_taco_mediapattern); sTiledStageDrawable = bitmapdrawable; bitmapdrawable.setTileModeX(android.graphics.Shader.TileMode.REPEAT); sTiledStageDrawable.setTileModeY(android.graphics.Shader.TileMode.REPEAT); TextPaint textpaint = new TextPaint(); sNameTextPaint = textpaint; textpaint.setAntiAlias(true); sNameTextPaint.setColor(resources.getColor(R.color.card_author_name)); sNameTextPaint.setTypeface(Typeface.DEFAULT_BOLD); sNameTextPaint.setTextSize(resources.getDimension(R.dimen.card_author_name_text_size)); TextPaintUtils.registerTextPaint(sNameTextPaint, R.dimen.card_author_name_text_size); TextPaint textpaint1 = new TextPaint(); sRelativeTimeTextPaint = textpaint1; textpaint1.setAntiAlias(true); sRelativeTimeTextPaint.setColor(resources.getColor(R.color.card_relative_time_text)); sRelativeTimeTextPaint.setTypeface(Typeface.DEFAULT_BOLD); sRelativeTimeTextPaint.setTextSize(resources.getDimension(R.dimen.card_relative_time_text_size)); TextPaintUtils.registerTextPaint(sRelativeTimeTextPaint, R.dimen.card_relative_time_text_size); TextPaint textpaint2 = new TextPaint(); sTagTextPaint = textpaint2; textpaint2.setAntiAlias(true); sTagTextPaint.setColor(resources.getColor(R.color.card_tag_text)); sTagTextPaint.setTypeface(Typeface.DEFAULT_BOLD); sTagTextPaint.setTextSize(resources.getDimension(R.dimen.card_tag_text_size)); sTagTextPaint.setShadowLayer(resources.getDimension(R.dimen.card_tag_text_shadow_radius), resources.getDimension(R.dimen.card_tag_text_shadow_x), resources.getDimension(R.dimen.card_tag_text_shadow_y), resources.getColor(R.color.card_tag_shadow_text)); TextPaintUtils.registerTextPaint(sTagTextPaint, R.dimen.card_tag_text_size); TextPaint textpaint3 = new TextPaint(); sAutoTextPaint = textpaint3; textpaint3.setAntiAlias(true); sAutoTextPaint.setColor(resources.getColor(R.color.card_auto_text)); sAutoTextPaint.setTextSize(resources.getDimension(R.dimen.card_auto_text_size)); TextPaintUtils.registerTextPaint(sAutoTextPaint, R.dimen.card_auto_text_size); TextPaint textpaint4 = new TextPaint(); sAttributionTextPaint = textpaint4; textpaint4.setAntiAlias(true); sAttributionTextPaint.setColor(resources.getColor(R.color.card_attribution_text)); sAttributionTextPaint.setTextSize(resources.getDimension(R.dimen.card_default_text_size)); sAttributionTextPaint.linkColor = resources.getColor(R.color.card_link); TextPaintUtils.registerTextPaint(sAttributionTextPaint, R.dimen.card_default_text_size); TextPaint textpaint5 = new TextPaint(); sGraySpamTextPaint = textpaint5; textpaint5.setAntiAlias(true); sGraySpamTextPaint.setColor(resources.getColor(R.color.card_gray_spam_text)); sGraySpamTextPaint.setTextSize(resources.getDimension(R.dimen.card_default_text_size)); TextPaintUtils.registerTextPaint(sGraySpamTextPaint, R.dimen.card_default_text_size); Paint paint = new Paint(); sMediaTopAreaBackgroundPaint = paint; paint.setColor(resources.getColor(R.color.solid_black)); Paint paint1 = new Paint(); sGraySpamBackgroundPaint = paint1; paint1.setColor(resources.getColor(R.color.card_gray_spam_background)); sAvatarSize = (int)resources.getDimension(R.dimen.card_avatar_size); sAuthorNameYOffset = (int)resources.getDimension(R.dimen.card_author_name_y_padding); sRelativeTimeYOffset = (int)resources.getDimension(R.dimen.card_relative_time_y_offset); sContentXPadding = (int)resources.getDimension(R.dimen.card_content_x_padding); sContentYPadding = (int)resources.getDimension(R.dimen.card_content_y_padding); sTagYOffset = (int)resources.getDimension(R.dimen.card_tag_y_offset); sTagTextXPadding = (int)resources.getDimension(R.dimen.card_tag_text_x_padding); sTagBackgroundYPadding = (int)resources.getDimension(R.dimen.card_tag_background_y_padding); sTagIconXPadding = (int)resources.getDimension(R.dimen.card_tag_icon_x_padding); sTagIconYPaddingCheckin = (int)resources.getDimension(R.dimen.card_tag_icon_y_padding_checkin); sTagIconYPaddingLocation = (int)resources.getDimension(R.dimen.card_tag_icon_y_padding_location); sTagIconYPaddingWithPhoto = (int)resources.getDimension(R.dimen.card_tag_icon_y_padding_with_photo); sGraySpamIconPadding = (int)resources.getDimension(R.dimen.card_gray_spam_x_padding); sMediaCardHeightPercentage = resources.getDimension(R.dimen.media_card_height_percentage); sMediaCardBigHeightPercentage = resources.getDimension(R.dimen.media_card_big_height_percentage); } mTagDrawableInstance = sTagDrawable.getConstantState().newDrawable(); } private void createSourceRectForMediaImage(Rect rect, int i, int j, int k, int l) { if(k == 0 || l == 0) { rect.setEmpty(); } else { int i1 = k + sXDoublePadding; int j1 = (int)((float)(l + sYDoublePadding) * getMediaHeightPercentage()); int k1 = i; int l1 = j; int i2; int j2; if(i * j1 > j * i1) k1 = (j * i1) / j1; else l1 = (i * j1) / i1; i2 = (i - k1) / 2; j2 = (j - l1) / 2; rect.set(i2, j2, i2 + k1, j2 + l1); } } protected static void drawMediaTopAreaStageWithTiledBackground(Canvas canvas, int i, int j) { sTiledStageDrawable.setBounds(sLeftBorderPadding, sTopBorderPadding, i + sXDoublePadding + sRightBorderPadding, j + sYPadding); sTiledStageDrawable.draw(canvas); } private void ensureOverridePlusOnedButton(int i) { if(mOverridePlusOnedButton == null) { Rect rect = mPlusOneButton.getRect(); Resources resources = getResources(); int j = R.string.stream_plus_one_count_with_plus; Object aobj[] = new Object[1]; aobj[0] = Integer.valueOf(i); String s = resources.getString(j, aobj); mOverridePlusOnedButton = new ClickableButton(getContext(), s, PlusBarUtils.sPlusOnedTextPaint, PlusBarUtils.sPlusOnedDrawable, PlusBarUtils.sPlusOnedPressedDrawable, this, rect.left, rect.top); } } protected final int createAuthorNameAndRelativeTimeLayoutOnSameLine(int i, int j) { CharSequence charsequence = TextUtils.ellipsize(mAuthorName, sNameTextPaint, j, android.text.TextUtils.TruncateAt.END); int k = (int)sNameTextPaint.measureText(charsequence.toString()); mAuthorNameLayout = new StaticLayout(charsequence, sNameTextPaint, k, android.text.Layout.Alignment.ALIGN_NORMAL, 1.0F, 0.0F, false); int l = i + mAuthorNameLayout.getHeight(); CharSequence charsequence1 = TextUtils.ellipsize(mRelativeTime, sRelativeTimeTextPaint, j, android.text.TextUtils.TruncateAt.END); int i1 = (int)sRelativeTimeTextPaint.measureText(charsequence1.toString()); if(i1 < j - k) mRelativeTimeLayout = new StaticLayout(charsequence1, sRelativeTimeTextPaint, i1, android.text.Layout.Alignment.ALIGN_NORMAL, 1.0F, 0.0F, false); return l; } protected final void createGraySpamBar(int i) { if(mIsGraySpam && i > 0) { int j; int k; if(mSquareMode && mViewerIsSquareAdmin) j = R.string.card_square_gray_spam_for_moderator; else j = R.string.card_square_gray_spam; k = i - (sGraySpamWarningBitmap.getWidth() + 2 * sGraySpamIconPadding); mGraySpamLayout = new StaticLayout(getResources().getString(j), sGraySpamTextPaint, k, android.text.Layout.Alignment.ALIGN_NORMAL, 1.0F, 0.0F, false); } } protected final int createMediaBottomArea(int i, int j, int k, int l) { int i1 = (int)((float)(l + sYDoublePadding) * getMediaHeightPercentage()) + sTopBorderPadding + sAuthorNameYOffset; setAuthorImagePosition(i, i1 - sAvatarSize / 2); int _tmp = sAvatarSize; int _tmp1 = sContentXPadding; int j1 = k - (sAvatarSize + sContentXPadding); int k1 = createAuthorNameAndRelativeTimeLayoutOnSameLine(i1, j1) + sContentYPadding; boolean flag = TextUtils.isEmpty(mAttribution); boolean flag1 = false; if(!flag) { int k2 = ((l + j) - k1) / (int)(sAttributionTextPaint.descent() - sAttributionTextPaint.ascent()); flag1 = false; if(k2 > 0) { mAttributionLayout = TextPaintUtils.createConstrainedStaticLayout(sAttributionTextPaint, mAttribution, j1, k2); k1 += mAttributionLayout.getHeight() + sContentYPadding; flag1 = true; } } if(!TextUtils.isEmpty(mContent)) { int j2 = ((l + j) - k1) / (int)(sDefaultTextPaint.descent() - sDefaultTextPaint.ascent()); if(j2 > 0) { mContentLayout = TextPaintUtils.createConstrainedStaticLayout(sDefaultTextPaint, mContent, j1, j2); k1 += mContentLayout.getHeight() + sContentYPadding; flag1 = true; } } if(!TextUtils.isEmpty(mFillerContent)) { int i2 = ((l + j) - k1) / (int)(sDefaultTextPaint.descent() - sDefaultTextPaint.ascent()); if(i2 > 0) { mFillerContentLayout = TextPaintUtils.createConstrainedStaticLayout(sDefaultTextPaint, mFillerContent, j1, i2); k1 += mFillerContentLayout.getHeight() + sContentYPadding; flag1 = true; } } if(!flag1 && mAutoText != 0) { int l1 = ((l + j) - k1) / (int)(sAutoTextPaint.descent() - sAutoTextPaint.ascent()); if(l1 > 0) { mAutoTextLayout = TextPaintUtils.createConstrainedStaticLayout(sAutoTextPaint, getResources().getString(mAutoText), j1, l1); k1 += mAutoTextLayout.getHeight() + sContentYPadding; } } return k1; } protected final int createNameLayout(int i, int j) { mAuthorNameLayout = new StaticLayout(TextUtils.ellipsize(mAuthorName, sNameTextPaint, j, android.text.TextUtils.TruncateAt.END), sNameTextPaint, j, android.text.Layout.Alignment.ALIGN_NORMAL, 1.0F, 0.0F, false); return i + mAuthorNameLayout.getHeight(); } protected final int createPlusOneBar(int i, int j, int k) { Context context = getContext(); int l = i + k; boolean flag; int i1; Resources resources; int j1; Object aobj[]; String s; TextPaint textpaint; NinePatchDrawable ninepatchdrawable; NinePatchDrawable ninepatchdrawable1; int k1; int l1; if(mPlusOneData != null && mPlusOneData.isPlusOnedByMe()) flag = true; else flag = false; if(mPlusOneData == null) i1 = 1; else i1 = mPlusOneData.getCount(); resources = getResources(); j1 = R.string.stream_plus_one_count_with_plus; aobj = new Object[1]; aobj[0] = Integer.valueOf(Math.max(i1, 1)); s = resources.getString(j1, aobj); removeClickableItem(mPlusOneButton); if(flag) textpaint = PlusBarUtils.sPlusOnedTextPaint; else textpaint = PlusBarUtils.sNotPlusOnedTextPaint; if(flag) ninepatchdrawable = PlusBarUtils.sPlusOnedDrawable; else ninepatchdrawable = PlusBarUtils.sButtonDrawable; if(flag) ninepatchdrawable1 = PlusBarUtils.sPlusOnedPressedDrawable; else ninepatchdrawable1 = PlusBarUtils.sButtonPressedDrawable; mPlusOneButton = new ClickableButton(context, s, textpaint, ninepatchdrawable, ninepatchdrawable1, this, l, j); k1 = l - mPlusOneButton.getRect().width(); l1 = j - mPlusOneButton.getRect().height(); mPlusOneButton.getRect().offsetTo(k1, l1); addClickableItem(mPlusOneButton); if(flag && mCanReshare) { removeClickableItem(mReshareButton); Bitmap bitmap1 = sReshareBitmap; NinePatchDrawable ninepatchdrawable4 = PlusBarUtils.sButtonDrawable; NinePatchDrawable ninepatchdrawable5 = PlusBarUtils.sButtonPressedDrawable; String s3 = getResources().getString(R.string.reshare_button_content_description); mReshareButton = new ClickableButton(context, bitmap1, ninepatchdrawable4, ninepatchdrawable5, this, k1, l1, s3); k1 -= mReshareButton.getRect().width() + PlusBarUtils.sPlusBarXPadding; mReshareButton.getRect().offsetTo(k1, l1); addClickableItem(mReshareButton); } if(mTotalComments > 0) { String s1 = String.valueOf(mTotalComments); removeClickableItem(mCommentsButton); Resources resources1 = getResources(); int i2 = R.plurals.stream_one_up_comment_count; int j2 = mTotalComments; Object aobj1[] = new Object[1]; aobj1[0] = Integer.valueOf(mTotalComments); String s2 = resources1.getQuantityString(i2, j2, aobj1); Bitmap bitmap = sCommentsBitmap; TextPaint textpaint1 = PlusBarUtils.sNotPlusOnedTextPaint; NinePatchDrawable ninepatchdrawable2 = PlusBarUtils.sButtonDrawable; NinePatchDrawable ninepatchdrawable3 = PlusBarUtils.sButtonPressedDrawable; Object obj; int k2; if(this instanceof EventStreamCardView) obj = null; else obj = this; mCommentsButton = new ClickableButton(context, bitmap, s1, textpaint1, ninepatchdrawable2, ninepatchdrawable3, ((ClickableButton.ClickableButtonListener) (obj)), k1, l1, s2); k2 = k1 - (mCommentsButton.getRect().width() + PlusBarUtils.sPlusBarXPadding); mCommentsButton.getRect().offsetTo(k2, l1); addClickableItem(mCommentsButton); } return l1 + mPlusOneButton.getRect().height(); } protected final void createSourceRectForMediaImage(Rect rect, Bitmap bitmap, int i, int j) { if(bitmap == null) rect.setEmpty(); else createSourceRectForMediaImage(rect, bitmap.getWidth(), bitmap.getHeight(), i, j); } protected final void createSourceRectForMediaImage(Rect rect, Drawable drawable, int i, int j) { if(drawable == null) rect.setEmpty(); else createSourceRectForMediaImage(rect, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), i, j); } protected final int createTagBar(int i, int j, int k) { if(mTag != null) { int _tmp = sTagTextXPadding; int l = k - 2 * sTagTextXPadding; int i1 = j + sTagYOffset; if(mTagIcon != null) { mTagIcon.getWidth(); int _tmp1 = sTagIconXPadding; l -= mTagIcon.getWidth() + sTagIconXPadding; } CharSequence charsequence = TextPaintUtils.smartEllipsize(mTag, sTagTextPaint, l, android.text.TextUtils.TruncateAt.END); int j1 = (int)sTagTextPaint.measureText(charsequence.toString()); mTagLayout = new StaticLayout(charsequence, sTagTextPaint, j1, android.text.Layout.Alignment.ALIGN_NORMAL, 1.0F, 0.0F, false); j = i1 + mTagLayout.getHeight(); } return j; } protected final void drawAuthorImage(Canvas canvas) { if(null == mAuthorImage) { return; } Bitmap bitmap; if(mAuthorImage.getBitmap() != null) bitmap = mAuthorImage.getBitmap(); else bitmap = sAuthorBitmap; canvas.drawBitmap(bitmap, null, mAuthorImage.getRect(), sResizePaint); if(mAuthorImage.isClicked()) mAuthorImage.drawSelectionRect(canvas); } protected final int drawAuthorName(Canvas canvas, int i, int j) { if(mAuthorNameLayout != null) { canvas.translate(i, j); mAuthorNameLayout.draw(canvas); canvas.translate(-i, -j); j += mAuthorNameLayout.getHeight(); } return j; } protected final void drawCornerIcon(Canvas canvas) { if(mCornerIcon != null) { int i = getHeight() - sBottomBorderPadding - mCornerIcon.getHeight(); canvas.drawBitmap(mCornerIcon, sLeftBorderPadding, i, null); } } protected final int drawMediaBottomArea(Canvas canvas, int i, int j, int k) { int l = (int)((float)(k + 2 * sYPadding) * getMediaHeightPercentage()) + sTopBorderPadding + sAuthorNameYOffset; int _tmp = sAvatarSize; drawAuthorImage(canvas); int i1 = i + (sAvatarSize + sContentXPadding); int j1 = j - (sAvatarSize + sContentXPadding); int k1 = drawAuthorName(canvas, i1, l); if(mRelativeTimeLayout != null) drawRelativeTimeLayout(canvas, (i1 + j1) - mRelativeTimeLayout.getWidth(), k1 - mRelativeTimeLayout.getHeight() - sRelativeTimeYOffset); int l1 = k1 + sContentYPadding; if(mAttributionLayout != null) { canvas.translate(i1, l1); mAttributionLayout.draw(canvas); canvas.translate(-i1, -l1); l1 += mAttributionLayout.getHeight() + sContentYPadding; } if(mContentLayout != null) { canvas.translate(i1, l1); mContentLayout.draw(canvas); canvas.translate(-i1, -l1); l1 += mContentLayout.getHeight() + sContentYPadding; } if(mFillerContentLayout != null) { canvas.translate(i1, l1); mFillerContentLayout.draw(canvas); canvas.translate(-i1, -l1); l1 += mFillerContentLayout.getHeight() + sContentYPadding; } if(mAutoTextLayout != null) { canvas.translate(i1, l1); mAutoTextLayout.draw(canvas); canvas.translate(-i1, -l1); l1 += mAutoTextLayout.getHeight() + sContentYPadding; } return l1; } protected final void drawMediaTopAreaShadow(Canvas canvas, int i, int j) { int k = i + 2 * sXPadding; int l = (int)((float)(j + 2 * sYPadding) * getMediaHeightPercentage()); sMediaShadowDrawable.setBounds(sLeftBorderPadding, (l + sTopBorderPadding) - sMediaShadowDrawable.getIntrinsicHeight(), k + sLeftBorderPadding, l + sTopBorderPadding); sMediaShadowDrawable.draw(canvas); } protected final void drawMediaTopAreaStage(Canvas canvas, int i, int j, boolean flag, Rect rect, Paint paint) { int k = i + 2 * sXPadding; int l = (int)((float)(j + 2 * sYPadding) * getMediaHeightPercentage()); if(flag) { if(rect == null || rect.width() < k || rect.height() < l) canvas.drawRect(sLeftBorderPadding, sTopBorderPadding, k + sLeftBorderPadding, l + sTopBorderPadding, paint); } else { BackgroundPatternUtils.getInstance(getContext()); BitmapDrawable bitmapdrawable = BackgroundPatternUtils.getBackgroundPattern(mActivityId); bitmapdrawable.setBounds(sLeftBorderPadding, sTopBorderPadding, k + sLeftBorderPadding, l + sTopBorderPadding); bitmapdrawable.draw(canvas); } } protected final void drawPlusOneBar(Canvas canvas) { if(mInvisiblePlusOneButton) { } else { if(mOverridePlusOnedButtonDisplay) { if(mOverridePlusOnedButton != null) mOverridePlusOnedButton.draw(canvas); } else { mPlusOneButton.draw(canvas); } } if(mReshareButton != null) mReshareButton.draw(canvas); if(mCommentsButton != null) mCommentsButton.draw(canvas); return; } protected final int drawRelativeTimeLayout(Canvas canvas, int i, int j) { if(mRelativeTimeLayout != null) { canvas.translate(i, j); mRelativeTimeLayout.draw(canvas); canvas.translate(-i, -j); j += mRelativeTimeLayout.getHeight(); } return j; } protected final void drawTagBarIconAndBackground(Canvas canvas, int i, int j) { if(mTagLayout != null) { int k = j + sTagYOffset; int l = mTagLayout.getWidth() + 2 * sTagTextXPadding; if(mTagIcon != null) l += mTagIcon.getWidth() + sTagIconXPadding; mTagDrawableInstance.setBounds(i, k - sTagBackgroundYPadding, i + l, k + mTagLayout.getHeight() + sTagBackgroundYPadding); mTagDrawableInstance.draw(canvas); int i1 = i + sTagTextXPadding; if(mTagIcon != null) { int j1 = k + (mTagLayout.getHeight() - mTagIcon.getHeight()) / 2 + sTagIconYPaddingWithPhoto; canvas.drawBitmap(mTagIcon, i1, j1, null); i1 += mTagIcon.getWidth() + sTagIconXPadding; } canvas.translate(i1, k); mTagLayout.draw(canvas); canvas.translate(-i1, -k); } } protected String formatLocationName(String s) { return s.toUpperCase(); } public final String getActivityId() { return mActivityId; } public String getAlbumId() { return null; } public String getDeepLinkLabel() { return null; } public int getDesiredHeight() { return 0; } public int getDesiredWidth() { return 0; } public final String getEventId() { return mEventId; } public final String getEventOwnerId() { return mEventOwnerId; } public String getLinkTitle() { return null; } public String getLinkUrl() { return null; } protected final float getMediaHeightPercentage() { float f; if(mDisplaySizeType == 1 || mDisplaySizeType == 3) f = sMediaCardBigHeightPercentage; else f = sMediaCardHeightPercentage; return f; } public String getMediaLinkUrl() { return null; } public MediaRef getMediaRef() { return null; } public final Pair getPlusOneButtonAnimationCopies() { int i = (int)getX(); int j = (int)getY(); ClickableButton clickablebutton = mPlusOneButton.createAbsoluteCoordinatesCopy(i, j); int k; if(mPlusOneData == null) k = 1; else k = 1 + mPlusOneData.getCount(); ensureOverridePlusOnedButton(k); return new Pair(clickablebutton, mOverridePlusOnedButton.createAbsoluteCoordinatesCopy(i, j)); } public String getSquareId() { return null; } public final String getSquareIdForOneUp() { return mSquareIdForOneUp; } public void init(Cursor cursor, int i, int j, android.view.View.OnClickListener onclicklistener, ItemClickListener itemclicklistener, ViewedListener viewedlistener, StreamPlusBarClickListener streamplusbarclicklistener, StreamMediaClickListener streammediaclicklistener) { super.init(cursor, i, j, onclicklistener, itemclicklistener, viewedlistener, streamplusbarclicklistener, streammediaclicklistener); Context context = getContext(); Resources resources = getResources(); mStreamPlusBarClickListener = streamplusbarclicklistener; mStreamMediaClickListener = streammediaclicklistener; mActivityId = cursor.getString(1); mAuthorGaiaId = cursor.getString(2); mAuthorName = cursor.getString(3); if(mAuthorName == null) mAuthorName = ""; mAuthorAvatarUrl = EsAvatarData.uncompressAvatarUrl(cursor.getString(4)); if(mAuthorImage != null) removeClickableItem(mAuthorImage); mAuthorImage = new ClickableAvatar(this, mAuthorGaiaId, mAuthorAvatarUrl, mAuthorName, itemclicklistener, 2); addClickableItem(mAuthorImage); mRelativeTime = Dates.getRelativeTimeSpanString(context, cursor.getLong(8)).toString().toUpperCase(); long l = cursor.getLong(15); String s; String s1; byte abyte0[]; boolean flag; boolean flag1; boolean flag2; StringBuilder stringbuilder; int k; byte abyte1[]; byte abyte2[]; if((2L & l) != 0L) mContent = cursor.getString(16); else mContent = null; if((1L & l) != 0L) if(TextUtils.isEmpty(mContent)) mContent = cursor.getString(17); else mFillerContent = cursor.getString(17); s = cursor.getString(18); s1 = cursor.getString(19); if(!TextUtils.isEmpty(s) && !TextUtils.isEmpty(s1)) mAttribution = resources.getString(R.string.stream_original_author, new Object[] { s1 }); if(mTag == null && (8L & l) != 0L) { byte abyte3[] = cursor.getBlob(7); if(abyte3 != null) { mTag = formatLocationName(DbLocation.deserialize(abyte3).getLocationName()); mTagIcon = sTagLocationBitmaps[0]; } } mTotalComments = cursor.getInt(6); abyte0 = cursor.getBlob(5); if(abyte0 != null) mPlusOneData = DbPlusOneData.deserialize(abyte0); else mPlusOneData = null; if(cursor.getInt(11) != 1) mViewedListener = viewedlistener; if(!mSquareMode && (0x80000L & l) != 0L) mCornerIcon = sCommunityBitmap; else if(cursor.getInt(14) == 1) mCornerIcon = sWhatsHotBitmap; else mCornerIcon = null; if(cursor.getInt(9) == 0) flag = true; else flag = false; mIsLimited = flag; if(mViewerIsSquareAdmin && cursor.getInt(10) == 1 && (0x80000L & l) != 0L) flag1 = true; else flag1 = false; mIsGraySpam = flag1; if(cursor.getInt(12) != 0) flag2 = true; else flag2 = false; mCanReshare = flag2; mAutoText = EsPostsData.getDefaultText(l); stringbuilder = new StringBuilder(); AccessibilityUtils.appendAndSeparateIfNotEmpty(stringbuilder, mAuthorName); if(mAutoText != 0) AccessibilityUtils.appendAndSeparateIfNotEmpty(stringbuilder, resources.getString(mAutoText)); AccessibilityUtils.appendAndSeparateIfNotEmpty(stringbuilder, mRelativeTime); AccessibilityUtils.appendAndSeparateIfNotEmpty(stringbuilder, mContent); AccessibilityUtils.appendAndSeparateIfNotEmpty(stringbuilder, mFillerContent); AccessibilityUtils.appendAndSeparateIfNotEmpty(stringbuilder, mAttribution); AccessibilityUtils.appendAndSeparateIfNotEmpty(stringbuilder, mTag); if(mTotalComments > 0) { int j1 = R.plurals.comments; int k1 = mTotalComments; Object aobj1[] = new Object[1]; aobj1[0] = Integer.valueOf(mTotalComments); stringbuilder.append(resources.getQuantityString(j1, k1, aobj1)).append(". "); } if(mPlusOneData == null) k = 0; else k = mPlusOneData.getCount(); if(k > 0) { int i1 = R.plurals.plus_one_accessibility_description; Object aobj[] = new Object[1]; aobj[0] = Integer.valueOf(k); stringbuilder.append(resources.getQuantityString(i1, k, aobj)); } abyte1 = cursor.getBlob(13); if(abyte1 != null) { PlusEvent plusevent = (PlusEvent)JsonUtil.fromByteArray(abyte1, PlusEvent.class); if(plusevent != null) { mEventId = plusevent.id; mEventOwnerId = plusevent.creatorObfuscatedId; } } abyte2 = cursor.getBlob(27); if(abyte2 != null) mSquareIdForOneUp = DbEmbedSquare.deserialize(abyte2).getSquareId(); setContentDescription(stringbuilder.toString()); setFocusable(true); } public boolean isAlbum() { return false; } protected void onBindResources() { super.onBindResources(); if(mAuthorImage != null) mAuthorImage.bindResources(); } public void onClickableButtonListenerClick(ClickableButton clickablebutton) { if(mStreamPlusBarClickListener == null) { return; } if(clickablebutton != mPlusOneButton) { if(clickablebutton == mReshareButton) mStreamPlusBarClickListener.onReshareClicked(mActivityId, mIsLimited); else if(clickablebutton == mCommentsButton) { StreamPlusBarClickListener streamplusbarclicklistener = mStreamPlusBarClickListener; streamplusbarclicklistener.onCommentsClicked(this); } } else { mStreamPlusBarClickListener.onPlusOneClicked(mActivityId, mPlusOneData, this); } } protected void onDetachedFromWindow() { if(mShakeAnimation == null) { removeCallbacks(mShakeAnimation); mShakeAnimation = null; } clearAnimation(); super.onDetachedFromWindow(); } protected void onDraw(Canvas canvas) { if(mActivityId != null) { super.onDraw(canvas); int i = sLeftBorderPadding; int j = sTopBorderPadding; int k = getWidth() - sLeftBorderPadding - sRightBorderPadding; if(mGraySpamLayout != null) { int l = Math.max(sGraySpamWarningBitmap.getHeight(), mGraySpamLayout.getHeight()); canvas.drawRect(i, j, k + i, j + l, sGraySpamBackgroundPaint); canvas.drawBitmap(sGraySpamWarningBitmap, i + sGraySpamIconPadding, j + (l - sGraySpamWarningBitmap.getHeight()) / 2, sResizePaint); int i1 = i + sGraySpamWarningBitmap.getWidth() + 2 * sGraySpamIconPadding; int j1 = j + (l - mGraySpamLayout.getHeight()) / 2; canvas.translate(i1, j1); mGraySpamLayout.draw(canvas); canvas.translate(-i1, -j1); } if(mViewedListener != null) { mViewedListener.onStreamCardViewed(mActivityId); mViewedListener = null; } } } protected void onMeasure(int i, int j) { if(mActivityId == null) { setMeasuredDimension(0, 0); } else { super.onMeasure(i, j); createGraySpamBar(getMeasuredWidth() - sLeftBorderPadding - sRightBorderPadding); } } public void onRecycle() { super.onRecycle(); mActivityId = null; mAuthorGaiaId = null; mAuthorName = null; mAuthorAvatarUrl = null; mAuthorNameLayout = null; mRelativeTime = null; mRelativeTimeLayout = null; mTag = null; mTagIcon = null; mTagLayout = null; mContent = null; mContentLayout = null; mAttribution = null; mAttributionLayout = null; mFillerContent = null; mFillerContentLayout = null; mAutoText = 0; mAutoTextLayout = null; mGraySpamLayout = null; mCommentsButton = null; mReshareButton = null; mPlusOneButton = null; mOverridePlusOnedButton = null; mInvisiblePlusOneButton = false; mOverridePlusOnedButtonDisplay = false; mTotalComments = 0; mPlusOneData = null; mStreamPlusBarClickListener = null; mCornerIcon = null; mIsLimited = false; mIsGraySpam = false; mCanReshare = false; mSquareMode = false; mViewerIsSquareAdmin = false; mSquareIdForOneUp = null; mEventId = null; mEventOwnerId = null; mViewedListener = null; } protected void onUnbindResources() { super.onUnbindResources(); if(mAuthorImage != null) mAuthorImage.unbindResources(); } public final void overridePlusOnedButtonDisplay(boolean flag, int i) { mOverridePlusOnedButtonDisplay = flag; if(mOverridePlusOnedButtonDisplay) { ensureOverridePlusOnedButton(i); mPlusOneButton.setListener(null); mOverridePlusOnedButton.setListener(this); mInvisiblePlusOneButton = false; } else { mOverridePlusOnedButton = null; } invalidate(); } protected final void setAuthorImagePosition(int i, int j) { if(mAuthorImage != null) mAuthorImage.setRect(i, j, i + sAvatarSize, j + sAvatarSize); } public void setSquareMode(boolean flag, boolean flag1) { mSquareMode = flag; mViewerIsSquareAdmin = flag1; } public final void startDelayedShakeAnimation() { final float rotX; final float rotY; mInvisiblePlusOneButton = true; invalidate(); switch(mDisplaySizeType) { default: rotX = -1.5F; rotY = 2.0F; break; case 0: // '\0' if(/*this instanceof TextCardView*/ false) rotX = -2.5F; else rotX = -2F; rotY = 2.5F; break; } if(android.os.Build.VERSION.SDK_INT >= 14) { animate().setDuration(300L).rotationX(rotX).rotationY(rotY).scaleX(0.95F).scaleY(0.95F).setInterpolator(sDampingInterpolator).setStartDelay(615L); } else { mShakeAnimation = new Runnable() { public final void run() { if(getHandler() != null) animate().setDuration(300L).rotationX(rotX).rotationY(rotY).scaleX(0.95F).scaleY(0.95F).setInterpolator(StreamCardView.sDampingInterpolator); mShakeAnimation = null; } }; removeCallbacks(mShakeAnimation); postDelayed(mShakeAnimation, 615L); } } public static interface StreamMediaClickListener { void onMediaClicked(String s, String s1, MediaRef mediaref, boolean flag, StreamCardView streamcardview); } public static interface StreamPlusBarClickListener { void onCommentsClicked(StreamCardView streamcardview); void onPlusOneClicked(String s, DbPlusOneData dbplusonedata, StreamCardView streamcardview); void onReshareClicked(String s, boolean flag); } public static interface ViewedListener { void onStreamCardViewed(String s); } }