blob: ac324e9ab0eb594f54d16c8a9d57b8c935388d82 [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chromoting;
import android.content.Context;
import android.text.InputType;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.SurfaceView;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import org.chromium.chromoting.jni.Client;
/**
* The class for viewing and interacting with a specific remote host.
*/
public final class DesktopView extends SurfaceView {
private final Event.Raisable<TouchEventParameter> mOnTouch = new Event.Raisable<>();
/** The parent Desktop activity. */
private Desktop mDesktop;
private TouchInputHandler mInputHandler;
private InputEventSender mInputEventSender;
public DesktopView(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
// Give this view keyboard focus, allowing us to customize the soft keyboard's settings.
setFocusableInTouchMode(true);
}
/**
* Initializes the view.
*/
public void init(Client client, Desktop desktop, RenderStub renderStub) {
Preconditions.isNull(mDesktop);
Preconditions.isNull(mInputHandler);
Preconditions.isNull(mInputEventSender);
Preconditions.notNull(desktop);
Preconditions.notNull(renderStub);
mDesktop = desktop;
mInputEventSender = new InputEventSender(client);
renderStub.setDesktopView(this);
mInputHandler = new TouchInputHandler(this, mDesktop, renderStub, mInputEventSender);
}
/**
* Destroys the view. Should be called in {@link android.app.Activity#onDestroy()}.
*/
public void destroy() {
mInputHandler.detachEventListeners();
}
/** An {@link Event} which is triggered when user touches the screen. */
public final Event<TouchEventParameter> onTouch() {
return mOnTouch;
}
/** Called when a software keyboard is requested, and specifies its options. */
@Override
public final InputConnection onCreateInputConnection(EditorInfo outAttrs) {
// Disables rich input support and instead requests simple key events.
outAttrs.inputType = InputType.TYPE_NULL;
// Prevents most third-party IMEs from ignoring our Activity's adjustResize preference.
outAttrs.imeOptions |= EditorInfo.IME_FLAG_NO_FULLSCREEN;
// Ensures that keyboards will not decide to hide the remote desktop on small displays.
outAttrs.imeOptions |= EditorInfo.IME_FLAG_NO_EXTRACT_UI;
// Stops software keyboards from closing as soon as the enter key is pressed.
outAttrs.imeOptions |= EditorInfo.IME_MASK_ACTION | EditorInfo.IME_FLAG_NO_ENTER_ACTION;
return null;
}
/** Called whenever the user attempts to touch the canvas. */
@Override
public final boolean onTouchEvent(MotionEvent event) {
TouchEventParameter parameter = new TouchEventParameter(event);
mOnTouch.raise(parameter);
return parameter.handled;
}
}