package com.integreight.onesheeld.utils.customviews;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import java.util.concurrent.CopyOnWriteArrayList;
public class MutitouchKeysContainer extends RelativeLayout {
public int currentIndex = -1;
public String currentTag = null;
private CopyOnWriteArrayList<PinData> childrenRects = new CopyOnWriteArrayList<PinData>();
private CopyOnWriteArrayList<PinData> pressedRects = new CopyOnWriteArrayList<PinData>();
private int maxPointers = 1;
public MutitouchKeysContainer(Context context, AttributeSet attrs) {
super(context, attrs);
maxPointers = getMaxPointers(context);
}
private int getMaxPointers(Context context) {
PackageManager pm = context.getPackageManager();
if (pm.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH)
&& (pm.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT) || pm
.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH_JAZZHAND)))
return 2;
return 1;
}
private void loadRects(ViewGroup vg) {
for (int i = 0; i < vg.getChildCount(); i++) {
if (vg.getChildAt(i) instanceof Key) {
Key v = (Key) vg.getChildAt(i);
childrenRects.add(new PinData(((String) v.getTag()), new Rect(
vg.getLeft() + v.getLeft(), vg.getTop() + v.getTop(),
vg.getLeft() + v.getRight(), vg.getTop()
+ v.getBottom()), i, v));
} else if (vg.getChildAt(i) instanceof ViewGroup) {
loadRects((ViewGroup) vg.getChildAt(i));
}
}
}
private synchronized PinData getTouhedIndex(int x, int y,
CopyOnWriteArrayList<PinData> data) {
if (childrenRects == null || childrenRects.size() == 0) {
loadRects(this);
}
for (PinData item : data) {
if (item.rect.contains(x, y))
return item;
}
return new PinData("", null, -1, null);
}
private synchronized void down(int x, int y) {
PinData item = getTouhedIndex(x, y, childrenRects);
if (item.index != -1 && !pressedRects.contains(item)) {
pressedRects.add(item);
if (item.key != null && item.key.eventListener != null)
item.key.eventListener.onPressed(item.key);
}
}
private synchronized void up(int x, int y) {
PinData item = getTouhedIndex(x, y, childrenRects);
if (item.index != -1 && pressedRects.contains(item)) {
if (item.key != null && item.key.eventListener != null)
item.key.eventListener.onReleased(item.key);
pressedRects.remove(item);
}
}
private synchronized void move(MotionEvent event) {
for (PinData item : pressedRects) {
boolean pressed = false;
for (int i = 0; i < (event.getPointerCount() > maxPointers ? maxPointers
: event.getPointerCount()); i++) {
if (item.rect
.contains((int) event.getX(i), (int) event.getY(i)))
pressed = true;
}
if (!pressed) {
if (item.key != null && item.key.eventListener != null)
item.key.eventListener.onReleased(item.key);
pressedRects.remove(item);
}
}
for (int i = 0; i < (event.getPointerCount() > maxPointers ? maxPointers
: event.getPointerCount()); i++) {
down((int) event.getX(i), (int) event.getY(i));
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_POINTER_DOWN:
if (event.getActionIndex() <= maxPointers - 1)
down((int) event.getX(event.getActionIndex()),
(int) event.getY(event.getActionIndex()));
break;
case MotionEvent.ACTION_POINTER_UP:
if (event.getActionIndex() <= maxPointers - 1)
up((int) event.getX(event.getActionIndex()),
(int) event.getY(event.getActionIndex()));
break;
case MotionEvent.ACTION_MOVE:
move(event);
break;
case MotionEvent.ACTION_DOWN:
down((int) event.getX(), (int) event.getY());
break;
case MotionEvent.ACTION_UP:
up((int) event.getX(), (int) event.getY());
break;
default:
break;
}
return true;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
return true;
}
public class PinData {
public String tag;
public Rect rect;
public int index;
public Key key;
public PinData() {
// TODO Auto-generated constructor stub
}
public PinData(String tag, Rect rect, int index, Key key) {
super();
this.tag = tag;
this.rect = rect;
this.index = index;
this.key = key;
}
}
}