1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.google.android.car.kitchensink.touch;
18
19import android.content.Context;
20import android.graphics.Canvas;
21import android.graphics.Color;
22import android.graphics.Paint;
23import android.graphics.Point;
24import android.util.AttributeSet;
25import android.util.Log;
26import android.view.MotionEvent;
27import android.view.View;
28
29import java.util.ArrayList;
30import java.util.List;
31
32public class TouchPointView extends View {
33    @SuppressWarnings("unused")
34    private static final String TAG = TouchPointView.class.getSimpleName();
35
36    private static final boolean LOG_ONLY = true;
37
38    private final int[] mColors = {
39            Color.RED,
40            Color.GREEN,
41            Color.BLUE,
42            Color.YELLOW,
43            Color.MAGENTA,
44            Color.BLACK,
45            Color.DKGRAY
46    };
47    List<Finger> mFingers;
48    Paint mPaint;
49
50    public TouchPointView(Context context, AttributeSet attrs) {
51        this(context, attrs, 0);
52    }
53
54    public TouchPointView(Context context, AttributeSet attrs, int defStyle) {
55        super(context, attrs, defStyle);
56        mFingers = new ArrayList<Finger>();
57
58        mPaint = new Paint();
59        mPaint.setStyle(Paint.Style.FILL);
60    }
61
62    @Override
63    public boolean onTouchEvent(MotionEvent event) {
64        if (LOG_ONLY) {
65            logTouchEvents(event);
66            return true;
67        }
68        mFingers.clear();
69        if (event.getActionMasked() == MotionEvent.ACTION_UP) {
70            invalidate();
71            return true;
72        }
73        for (int i = 0; i < event.getPointerCount(); i++) {
74            int pointerId = event.getPointerId(i);
75            int pointerIndex = event.findPointerIndex(pointerId);
76            Finger finger = new Finger();
77            finger.point =  new Point((int)event.getX(pointerIndex), (int)event.getY(pointerIndex));
78            finger.pointerId = pointerId;
79
80            mFingers.add(finger);
81        }
82        invalidate();
83        return true;
84    }
85
86    private void logTouchEvents(MotionEvent event) {
87        if (event.getActionMasked() != MotionEvent.ACTION_UP) {
88            return;
89        }
90
91        for (int i = 0; i < event.getPointerCount(); i++) {
92            int pointerId = event.getPointerId(i);
93            int pointerIndex = event.findPointerIndex(pointerId);
94            long downTime = event.getDownTime();
95            long eventTime = event.getEventTime();
96            Log.d(TAG, "TouchUp [x=" + event.getX(pointerIndex) + ", y=" + event.getY(pointerIndex) +
97                  " , pointerId=" + pointerId + ", pointerIndex=" + pointerIndex + ", duration=" +
98                  (eventTime - downTime) + "]");
99        }
100    }
101
102    @Override
103    public void onDraw(Canvas canvas) {
104        if (LOG_ONLY) {
105            return;
106        }
107        int radius = canvas.getWidth() / 20;
108        for (int i = 0; i < mFingers.size(); i++) {
109            Finger finger = mFingers.get(i);
110            Point point = finger.point;
111            int color = mColors[finger.pointerId % mColors.length];
112            mPaint.setColor(color);
113            canvas.drawCircle(point.x, point.y, radius, mPaint);
114        }
115    }
116
117    private class Finger {
118        public Point point;
119        public int pointerId;
120    }
121}
122