| /* |
| * Copyright (C) 2012 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| * use this file except in compliance with the License. You may obtain a copy of |
| * the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| * License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| |
| package com.android.tools.sdkcontroller.handlers; |
| |
| import android.graphics.Point; |
| import android.os.Message; |
| import android.util.Log; |
| |
| import com.android.tools.sdkcontroller.lib.Channel; |
| import com.android.tools.sdkcontroller.lib.ProtocolConstants; |
| import com.android.tools.sdkcontroller.service.ControllerService; |
| |
| import java.nio.ByteBuffer; |
| |
| /** |
| * Implements multi-touch emulation. |
| */ |
| public class MultiTouchChannel extends Channel { |
| |
| @SuppressWarnings("hiding") |
| private static final String TAG = MultiTouchChannel.class.getSimpleName(); |
| /** |
| * A new frame buffer has been received from the emulator. |
| * Parameter {@code obj} is a {@code byte[] array} containing the screen data. |
| */ |
| public static final int EVENT_FRAME_BUFFER = 1; |
| /** |
| * A multi-touch "start" command has been received from the emulator. |
| * Parameter {@code obj} is the string parameter from the start command. |
| */ |
| public static final int EVENT_MT_START = 2; |
| /** |
| * A multi-touch "stop" command has been received from the emulator. There |
| * is no {@code obj} parameter associated. |
| */ |
| public static final int EVENT_MT_STOP = 3; |
| |
| private static final Point mViewSize = new Point(0, 0); |
| |
| /** |
| * Constructs MultiTouchChannel instance. |
| */ |
| public MultiTouchChannel(ControllerService service) { |
| super(service, Channel.MULTITOUCH_CHANNEL); |
| } |
| |
| /** |
| * Sets size of the display view for emulated screen updates. |
| * |
| * @param width View width in pixels. |
| * @param height View height in pixels. |
| */ |
| public void setViewSize(int width, int height) { |
| mViewSize.set(width, height); |
| } |
| |
| /* |
| * Channel abstract implementation. |
| */ |
| |
| /** |
| * This method is invoked when this channel is fully connected with its |
| * counterpart in the emulator. |
| */ |
| @Override |
| public void onEmulatorConnected() { |
| if (hasUiHandler()) { |
| enable(); |
| notifyUiHandlers(EVENT_MT_START); |
| } |
| } |
| |
| /** |
| * This method is invoked when this channel loses connection with its |
| * counterpart in the emulator. |
| */ |
| @Override |
| public void onEmulatorDisconnected() { |
| if (hasUiHandler()) { |
| disable(); |
| notifyUiHandlers(EVENT_MT_STOP); |
| } |
| } |
| |
| /** |
| * A message has been received from the emulator. |
| * |
| * @param msg_type Message type. |
| * @param msg_data Packet received from the emulator. |
| */ |
| @Override |
| public void onEmulatorMessage(int msg_type, ByteBuffer msg_data) { |
| switch (msg_type) { |
| case ProtocolConstants.MT_FB_UPDATE: |
| Message msg = Message.obtain(); |
| msg.what = EVENT_FRAME_BUFFER; |
| msg.obj = msg_data; |
| postMessage(ProtocolConstants.MT_FB_ACK, (byte[]) null); |
| notifyUiHandlers(msg); |
| break; |
| |
| default: |
| Log.e(TAG, "Unknown message type " + msg_type); |
| } |
| } |
| |
| /** |
| * A query has been received from the emulator. |
| * |
| * @param query_id Identifies the query. This ID must be used when replying |
| * to the query. |
| * @param query_type Query type. |
| * @param query_data Query data. |
| */ |
| @Override |
| public void onEmulatorQuery(int query_id, int query_type, ByteBuffer query_data) { |
| Loge("Unexpected query " + query_type + " in multi-touch"); |
| sendQueryResponse(query_id, (byte[]) null); |
| } |
| |
| /** |
| * Registers a new UI handler. |
| * |
| * @param uiHandler A non-null UI handler to register. Ignored if the UI |
| * handler is null or already registered. |
| */ |
| @Override |
| public void addUiHandler(android.os.Handler uiHandler) { |
| final boolean first_handler = !hasUiHandler(); |
| super.addUiHandler(uiHandler); |
| if (first_handler && isConnected()) { |
| enable(); |
| notifyUiHandlers(EVENT_MT_START); |
| } |
| } |
| |
| /** |
| * Unregisters an UI handler. |
| * |
| * @param uiHandler A non-null UI listener to unregister. Ignored if the |
| * listener is null or already registered. |
| */ |
| @Override |
| public void removeUiHandler(android.os.Handler uiHandler) { |
| super.removeUiHandler(uiHandler); |
| if (isConnected() && !hasUiHandler()) { |
| disable(); |
| } |
| } |
| |
| /*************************************************************************** |
| * Logging wrappers |
| **************************************************************************/ |
| |
| private void Loge(String log) { |
| mService.addError(log); |
| Log.e(TAG, log); |
| } |
| } |