/* * Copyright (C) 2015 Actor LLC. <https://actor.im> */ package im.actor.sdk.view.emoji.smiles; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.view.MotionEvent; import android.view.SoundEffectConstants; import android.view.View; import android.view.ViewConfiguration; import java.util.ArrayList; import im.actor.sdk.view.emoji.SmileProcessor; import im.actor.sdk.view.emoji.keyboard.emoji.smiles.OnSmileClickListener; public class SmilesPackView extends View { private int smileysInRow; private int rowCount; private int countInRow; private SmileProcessor processor; private ArrayList<Long> smileyIds; private int[] smileysSections; private int[] smileysX; private int[] smileysY; private int smileySrcSize; private int smileySize; private int smileyPadding; private Rect rect = new Rect(); private Rect sectionRect = new Rect(); private Paint paint = new Paint(); private OnSmileClickListener onSmileClickListener; private float touchX, touchY; public SmilesPackView(Context context, SmileProcessor processor, ArrayList<Long> smileyIds, int smileysInRow, int smileySize, int smileyPadding) { super(context); this.smileysInRow = smileysInRow; this.rowCount = (int) Math.ceil((float) smileyIds.size() / smileysInRow); this.processor = processor; this.smileyIds = new ArrayList<Long>(smileyIds); this.countInRow = smileysInRow; this.smileySize = smileySize; this.smileyPadding = smileyPadding; this.smileySrcSize = processor.getRectSize(); init(); } private void init() { smileysSections = new int[smileyIds.size()]; smileysX = new int[smileyIds.size()]; smileysY = new int[smileyIds.size()]; for (int i = 0; i < smileyIds.size(); i++) { smileysSections[i] = processor.getSectionIndex(smileyIds.get(i)); smileysX[i] = processor.getSectionX(smileyIds.get(i)); smileysY[i] = processor.getSectionY(smileyIds.get(i)); } this.paint.setAntiAlias(true); this.paint.setFlags(Paint.FILTER_BITMAP_FLAG); } public void update() { this.rowCount = (int) Math.ceil((float) smileyIds.size() / smileysInRow); super.invalidate(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(smileySize * countInRow, smileySize * rowCount); } public OnSmileClickListener getOnSmileClickListener() { return onSmileClickListener; } public void setOnSmileClickListener(OnSmileClickListener onSmileClickListener) { this.onSmileClickListener = onSmileClickListener; } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: touchX = event.getX(); touchY = event.getY(); return true; case MotionEvent.ACTION_UP: float slop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); if (Math.abs(event.getX() - touchX) < slop && Math.abs(event.getY() - touchY) < slop) { int offsetLeft = (getWidth() - countInRow * smileySize) / 2; if (touchX > offsetLeft || touchX < offsetLeft + smileySize * countInRow) { int row = (int) (touchY / smileySize); int col = (int) ((touchX - offsetLeft) / smileySize); int index = row * countInRow + col; if (index >= 0 && index < smileyIds.size()) { if (onSmileClickListener != null) { playSoundEffect(SoundEffectConstants.CLICK); long smileId = smileyIds.get(index); String smile = null; char a = (char) (smileId & 0xFFFFFFFF); char b = (char) ((smileId >> 16) & 0xFFFFFFFF); char c = (char) ((smileId >> 32) & 0xFFFFFFFF); char d = (char) ((smileId >> 48) & 0xFFFFFFFF); if (c != 0 && d != 0) { smile = "" + d + c + b + a; } else if (b != 0) { smile = b + "" + a; } else { smile = "" + a; } SmileProcessor.emoji().upRecent(smileId); onSmileClickListener.onEmojiClicked(smile); } } } } return true; } return false; } @Override protected void onDraw(Canvas canvas) { if (processor.isLoaded()) { int offsetLeft = (getWidth() - countInRow * smileySize) / 2; for (int i = 0; i < smileyIds.size(); i++) { int row = i / countInRow; int col = i % countInRow; rect.set(col * smileySize + smileyPadding + offsetLeft, row * smileySize + smileyPadding, (col + 1) * smileySize - smileyPadding + offsetLeft, (row + 1) * smileySize - smileyPadding); if (!canvas.quickReject(rect.left, rect.top, rect.right, rect.bottom, Canvas.EdgeType.AA)) { Bitmap img = processor.getSection(smileysSections[i]); if (img != null) { sectionRect.set(smileysX[i] * smileySrcSize + 1, smileysY[i] * smileySrcSize + 1, (smileysX[i] + 1) * smileySrcSize - 1, (smileysY[i] + 1) * smileySrcSize - 1); canvas.drawBitmap(img, sectionRect, rect, paint); } } } } } public void setPack(Long[] updated) { } }