crankshaft icon indicating copy to clipboard operation
crankshaft copied to clipboard

No multitouch with Offical Screen

Open smartroad opened this issue 7 years ago • 5 comments

  • What phone do you have? What OS version? Nokia 8/Samsung A5 Oreo

  • Steps to reproduce the bug, if you're planning to report a bug. Please indicate whether the bug is always repoducible. Pinch to zoom not working in Google maps or Waze

When I try to use pinch to zoom in above nav apps nothing happens just moves with first finger touch. Is there a setting I am missing?

smartroad avatar May 27 '18 16:05 smartroad

AndroidAuto does not support multi-touch.

tehniemer avatar May 28 '18 23:05 tehniemer

Weird as I have a Peugeot hire car with AA and it supported multitouch

smartroad avatar May 29 '18 06:05 smartroad

Dang, well I stand corrected. I know at one time, not too long ago, it did not.

tehniemer avatar May 29 '18 11:05 tehniemer

This is a known issue. It is possible to add multi-touch, it's just not in the code. Will save for (many) enhancement ideas later :)

htruong avatar Jun 07 '18 13:06 htruong

Here is my Java code on how I do multi-touch in Android Auto, you will need to port this to C++ I guess.

InputClass:

public void sendInput(TouchEventData.TouchEvent.Builder touch)
    {
        sendInput(touch,null,null,null);
    }
    public void sendInput(ButtonEventsData.ButtonEvents.Builder button)
    {
        sendInput(null,button,null,null);
    }
    public void sendInput(RelativeInputEventsData.RelativeInputEvents.Builder relative, Long evenTime)
    {
        sendInput(null,null,relative,evenTime);
    }
    public void sendInput(ButtonEventsData.ButtonEvents.Builder button, Long evenTime)
    {
        sendInput(null,button,null,evenTime);
    }

    public void sendInput(
            TouchEventData.TouchEvent.Builder touch,
            ButtonEventsData.ButtonEvents.Builder button,
            RelativeInputEventsData.RelativeInputEvents.Builder relative,
            Long eventTime
    ) {
        InputEventIndicationMessage.InputEventIndication.Builder inputData = InputEventIndicationMessage.InputEventIndication.newBuilder();

        if (eventTime==null)
            inputData.setTimestamp(SystemClock.uptimeMillis());
        else
            inputData.setTimestamp(eventTime);

        if (touch!=null)
            inputData.setTouchEvent(touch.build());
        if (button!=null)
            inputData.setButtonEvent(button.build());
        if (relative!=null)
            inputData.setRelativeInputEvent(relative.build());

        InputEventIndicationMessage.InputEventIndication zzz = inputData.build();
        final ByteBuffer sendData=ByteBuffer.allocate(zzz.getSerializedSize()+2);
        sendData.putShort((short) InputChannelMessageIdsEnum.InputChannelMessage.Enum.INPUT_EVENT_INDICATION_VALUE);
        sendData.put(zzz.toByteArray());
        try {
            keySendQue.submit(new Runnable() {
                @Override
                public void run() {
                    try {
                         mTransporter.encrypt(sendData.array(),INPUTCHANNEL,FLAG_ALL);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void sendkey(int keycode, boolean action)
    {
        sendKey(keycode,action,null);
    }

    public void sendKey(int keycode, boolean action, Long eventTime)
    {
        Log.d("HU-KEY","Code: "+ keycode + "action: " + action +", time: " + eventTime);
        sendInput(ButtonEventsData.ButtonEvents.newBuilder().addButtonEvents(
                ButtonEventData.ButtonEvent.newBuilder()
                        .setScanCode(keycode)
                        .setIsPressed(action)
                        .setLongPress(false)
                        .setMeta(0)
                ),
                eventTime
        );
    }

    public void sendScrollKey(int delta, Long eventTime)
    {
        sendInput(RelativeInputEventsData.RelativeInputEvents.newBuilder().addRelativeInputEvents(
                RelativeInputEventData.RelativeInputEvent.newBuilder()
                        .setScanCode(65536)
                        .setDelta(delta)
                ),
                eventTime
        );
    }

And the touch listener:

@Override
    public boolean onTouch(View v, MotionEvent event) {

        if (mContext.mService==null) //Thigh coupling this should never happen!
            return false;

        event.getActionIndex();
        int me_action = event.getActionMasked();

        Log.d("HU", "Event pointer counter: " + event.getPointerCount());


        TouchEventData.TouchEvent.Builder touchdata = TouchEventData.TouchEvent.newBuilder();

     for (int i=0;i< event.getPointerCount(); i++ ) {
         Log.d("Touch","View height: " + v.getHeight() + ", display Height:" + BuildCarConfig.screenHeight+", Vertical adjust: "+verticalAdjust + "Touch pos: " + event.getY(i) + " Converted: " + ((int) ((event.getY(i)-verticalAdjust) / (v.getHeight() / (float) m_virt_vid_hei))));
         touchdata.addTouchLocation( TouchLocationData.TouchLocation.newBuilder().setX((int) ((event.getX(i)-horizontalAdjust) / (v.getWidth() / (float) m_virt_vid_wid))).setY((int) ((event.getY(i)-verticalAdjust) / (v.getHeight() / (float) m_virt_vid_hei))).setPointerId(event.getPointerId(i)).build());
         //touchdata.addPointerData( Input.TouchEvent.Pointer.newBuilder().setX((int) (event.getX(i) / (v.getWidth() / (float) m_virt_vid_wid))).setY((int) (event.getY(i) / (v.getHeight() / (float) m_virt_vid_hei))).setPointerId(event.getPointerId(i)).build());

     }
        TouchActionEnum.TouchAction.Enum aa_action;
        switch (me_action) {
            case MotionEvent.ACTION_DOWN:
                aa_action = TouchActionEnum.TouchAction.Enum.PRESS;
                break;
            case MotionEvent.ACTION_MOVE:
                aa_action = TouchActionEnum.TouchAction.Enum.DRAG;
                break;
            case MotionEvent.ACTION_CANCEL:
                aa_action = TouchActionEnum.TouchAction.Enum.RELEASE;
                break;
            case MotionEvent.ACTION_UP:
                aa_action = TouchActionEnum.TouchAction.Enum.RELEASE;
                break;
            case MotionEvent.ACTION_POINTER_DOWN:
                aa_action = TouchActionEnum.TouchAction.Enum.POINTER_DOWN;
                break;
          case MotionEvent.ACTION_POINTER_UP:
                aa_action = TouchActionEnum.TouchAction.Enum.POINTER_UP;
                break;
            default:
               return false;
        }

        touchdata.setTouchAction(aa_action);
        touchdata.setActionIndex(event.getActionIndex());

        inputMessage.sendInput(touchdata);

        return true;
    }

borconi avatar Jul 05 '19 12:07 borconi