/** * Copyright 2010-present Facebook. * * 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.facebook.internal; import android.content.Context; import android.graphics.*; import android.util.TypedValue; import android.view.Gravity; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.TextView; import com.facebook.android.R; /** * com.facebook.internal is solely for the use of other packages within the Facebook SDK for Android. Use of * any of the classes in this package is unsupported, and they may be modified or removed without warning at * any time. */ public class LikeBoxCountView extends FrameLayout { public enum LikeBoxCountViewCaretPosition { LEFT, TOP, RIGHT, BOTTOM } private TextView likeCountLabel; private LikeBoxCountViewCaretPosition caretPosition = LikeBoxCountViewCaretPosition.LEFT; private float caretHeight; private float caretWidth; private float borderRadius; private Paint borderPaint; private int textPadding; private int additionalTextPadding; /** * Constructor * * @param context Context for this View */ public LikeBoxCountView(Context context) { super(context); initialize(context); } /** * Sets the text for this view * @param text */ public void setText(String text) { likeCountLabel.setText(text); } /** * Sets the caret's position. This will trigger a layout of the view. * @param caretPosition */ public void setCaretPosition(LikeBoxCountViewCaretPosition caretPosition) { this.caretPosition = caretPosition; // Since the presence of a caret will move that edge closer to the text, let's add // some padding (equal to caretHeight) in that same direction switch (caretPosition) { case LEFT: setAdditionalTextPadding(additionalTextPadding, 0, 0, 0); break; case TOP: setAdditionalTextPadding(0, additionalTextPadding, 0, 0); break; case RIGHT: setAdditionalTextPadding(0, 0, additionalTextPadding, 0); break; case BOTTOM: setAdditionalTextPadding(0, 0, 0, additionalTextPadding); break; } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); int top = getPaddingTop(), left = getPaddingLeft(); int right = getWidth() - getPaddingRight(), bottom = getHeight() - getPaddingBottom(); switch (caretPosition) { case BOTTOM: bottom -= caretHeight; break; case LEFT: left += caretHeight; break; case TOP: top += caretHeight; break; case RIGHT: right -= caretHeight; break; } drawBorder(canvas, left, top, right, bottom); } private void initialize(Context context) { setWillNotDraw(false); // Required for the onDraw() method to be called on a FrameLayout caretHeight = getResources().getDimension(R.dimen.com_facebook_likeboxcountview_caret_height); caretWidth = getResources().getDimension(R.dimen.com_facebook_likeboxcountview_caret_width); borderRadius = getResources().getDimension(R.dimen.com_facebook_likeboxcountview_border_radius); borderPaint = new Paint(); borderPaint.setColor(getResources().getColor(R.color.com_facebook_likeboxcountview_border_color)); borderPaint.setStrokeWidth(getResources().getDimension(R.dimen.com_facebook_likeboxcountview_border_width)); borderPaint.setStyle(Paint.Style.STROKE); initializeLikeCountLabel(context); addView(likeCountLabel); setCaretPosition(this.caretPosition); } private void initializeLikeCountLabel(Context context) { likeCountLabel = new TextView(context); LayoutParams likeCountLabelLayoutParams = new LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); likeCountLabel.setLayoutParams(likeCountLabelLayoutParams); likeCountLabel.setGravity(Gravity.CENTER); likeCountLabel.setTextSize( TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.com_facebook_likeboxcountview_text_size)); likeCountLabel.setTextColor(getResources().getColor(R.color.com_facebook_likeboxcountview_text_color)); textPadding = getResources().getDimensionPixelSize(R.dimen.com_facebook_likeboxcountview_text_padding); // Calculate the additional text padding that will be applied in the direction of the caret. additionalTextPadding = getResources().getDimensionPixelSize(R.dimen.com_facebook_likeboxcountview_caret_height); } private void setAdditionalTextPadding(int left, int top, int right, int bottom) { likeCountLabel.setPadding( textPadding + left, textPadding + top, textPadding + right, textPadding + bottom); } private void drawBorder(Canvas canvas, float left, float top, float right, float bottom) { Path borderPath = new Path(); float ovalSize = 2.0f * borderRadius; // Top left corner borderPath.addArc(new RectF(left, top, left + ovalSize, top + ovalSize), -180, 90); // Top caret if (caretPosition == LikeBoxCountViewCaretPosition.TOP) { borderPath.lineTo(left + (right - left - caretWidth) / 2, top); borderPath.lineTo(left + (right - left) / 2, top - caretHeight); borderPath.lineTo(left + (right - left + caretWidth) / 2, top); } // Move to top right corner borderPath.lineTo(right - borderRadius, top); // Top right corner borderPath.addArc(new RectF(right - ovalSize, top, right, top + ovalSize), -90, 90); // Right caret if (caretPosition == LikeBoxCountViewCaretPosition.RIGHT) { borderPath.lineTo(right, top + (bottom - top - caretWidth) / 2); borderPath.lineTo(right + caretHeight, top + (bottom - top) / 2); borderPath.lineTo(right, top + (bottom - top + caretWidth) / 2); } // Move to bottom right corner borderPath.lineTo(right, bottom - borderRadius); // Bottom right corner borderPath.addArc(new RectF(right - ovalSize, bottom - ovalSize, right, bottom), 0, 90); // Bottom caret if (caretPosition == LikeBoxCountViewCaretPosition.BOTTOM) { borderPath.lineTo(left + (right - left + caretWidth) / 2, bottom); borderPath.lineTo(left + (right - left) / 2, bottom + caretHeight); borderPath.lineTo(left + (right - left - caretWidth) / 2, bottom); } // Move to bottom left corner borderPath.lineTo(left + borderRadius, bottom); // Bottom left corner borderPath.addArc(new RectF(left, bottom - ovalSize, left + ovalSize, bottom), 90, 90); // Left caret if (caretPosition == LikeBoxCountViewCaretPosition.LEFT) { borderPath.lineTo(left, top + (bottom - top + caretWidth) / 2); borderPath.lineTo(left - caretHeight, top + (bottom - top) / 2); borderPath.lineTo(left, top + (bottom - top - caretWidth) / 2); } // Move back to the beginning borderPath.lineTo(left, top + borderRadius); canvas.drawPath(borderPath, borderPaint); } }