Piano.java

package com.dnoved1.www.smartkeys;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.view.MotionEvent;
import android.view.View;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Handler;
import android.os.Looper;
import android.util.AttributeSet;
import android.util.Log;
class Piano extends View {
    public Piano(Context context) {
        super(context);
    }
    public Piano(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public Piano(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    public Piano(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }
    private static final int REQUEST_ENABLE_BT = 42;
    private static final int num_keys = 7;
    private static final int WHITE_1 = 0;
    private static final int WHITE_2 = 1;
    private static final int WHITE_3 = 2;
    private static final int WHITE_4 = 3;
    private static final int WHITE_5 = 4;
    private static final int WHITE_6 = 5;
    private static final int WHITE_7 = 6;
    private static final int BLACK_1 = 10;
    private static final int BLACK_2 = 11;
    private static final int BLACK_3 = 12;
    private static final int BLACK_4 = 13;
    private static final int BLACK_5 = 14;
    public void onDraw(Canvas canvas) {
        int width = this.getMeasuredWidth();
        int height = this.getMeasuredHeight();
        Paint white = new Paint(); white.setARGB(255, 255, 255, 255);
        Paint black = new Paint(); black.setARGB(255, 0, 0, 0);
        for (int i = 0; i < num_keys; i++) {
            canvas.drawRect((width / num_keys) * i, 0, (width / num_keys) * (i + 1), height, white);
            canvas.drawLine((width / num_keys) * i, 0, (width / num_keys) * (i + 1), 0, black);
            canvas.drawLine((width / num_keys) * i, height, (width / num_keys) * (i + 1), height, black);
            canvas.drawLine((width / num_keys) * i, 0, (width / num_keys) * i, height, black);
            canvas.drawLine((width / num_keys) * (i + 1), 0, (width / num_keys) * (i + 1), height, black);
        }
        for (int i = 0; i < num_keys; i++) {
            if (i != 2 && i != 6) {
                canvas.drawRect((int)((width / num_keys) * (i + 0.6)), 0, (int)((width / num_keys) * (i + 1.4)), height / 2, black);
            }
        }
    }
    public boolean onTouchEvent(MotionEvent event) {
        float x = event.getX();
        float y = event.getY();
        float width = this.getMeasuredWidth();
        float height = this.getMeasuredHeight();
        int key_pressed = (int)(x / (width / num_keys));
        boolean is_black = false;
        {
            int i = 0;
            for (float left = width / num_keys / 2; left < width; left += width / num_keys) {
                if (i != 2 && i != 6 && y <= height / 2 && x > left && x < left + width / num_keys) {
                    is_black = true;
                    key_pressed = i;
                    break;
                }
                i++;
            }
        }
        Log.i("Piano", key_pressed + ", " + is_black);
        final char char_to_send = (char)(is_black ? 'A' + key_pressed : '0' + key_pressed);
        // Send the key pressed over bluetooth
        new Handler(Looper.getMainLooper()).post(new Runnable() {
            @Override
            public void run() {
                MainActivity main = (MainActivity) Piano.this.getContext();
                if (main.btGatt != null && main.tx != null) {
                    main.tx.setValue(new byte[] {(byte)char_to_send});
                    if (main.btGatt.writeCharacteristic(main.tx)) {
                        Log.i("BT", "Sent: " + char_to_send);
                    } else {
                        Log.e("BT", "Couldn't write TX characteristic!");
                    }
                }
            }
        });
        return true;
    }
}