Kaydet (Commit) e77fb2cc authored tarafından Tor Lillqvist's avatar Tor Lillqvist Kaydeden (comit) Tomaž Vajngerl

Bin the since long obsolete "desktop" Android app

It was an early approach, indeed experimental, and has been abandoned
for quite a while.

(cherry picked from commit 43ad4c56)
üst 4ea03ed4
# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
#
# This file is part of the LibreOffice project.
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
$(eval $(call gb_CustomTarget_CustomTarget,android/desktop))
android_desktop_DIR := $(call gb_CustomTarget_get_workdir,android/experimental/Desktop)
$(call gb_CustomTarget_get_target,android/desktop) : \
$(android_desktop_DIR)/done
# We want that to be built completely first,
# so that we can serialize Ant access to Bootstrap, which is used
# by several LO-android apps. We don't want one Ant to be cleaning
# out Bootstrap while another is building stuff that depends on it.
# Yeah, this sucks
$(android_desktop_DIR)/done : $(call gb_Postprocess_get_target,AllModulesButInstsetNative)
$(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),MAK,2)
cd $(SRCDIR)/android/experimental/desktop && $(MAKE) all
# Copy to $(BUILDDIR)/instsetoo_native as that is where the tinderbox build script
# still looks for the .apk, and we want fresh daily builds to be uploaded. Even if
# the apps as such are mostly useless.
# Us "foo" instead of the old INPATH
mkdir -p $(BUILDDIR)/instsetoo_native/foo/bin; \
cp $(SRCDIR)/android/experimental/desktop/bin/*.apk $(BUILDDIR)/instsetoo_native/foo/bin
$(call gb_CustomTarget_get_clean_target,android/desktop) :
$(call gb_Output_announce,$(subst $(WORKDIR)/Clean/,,$@),$(false),MAK,2)
cd $(SRCDIR)/android/experimental/desktop && $(MAKE) clean
# vim: set noet sw=4 ts=4:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.libreoffice.experimental.desktop"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="15"
android:targetSdkVersion="15"/>
<application android:label="LibreOffice Desktop"
android:debuggable="true"
android:largeHeap="true"
android:hardwareAccelerated="true">
<activity android:name=".Desktop"
android:label="LibreOffice Desktop"
android:configChanges="keyboardHidden">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
ifeq ($(BUILDDIR),)
include ../../../config_host.mk
endif
# The default target just builds.
all: build-ant
# The package of this app
APP_PACKAGE=org.libreoffice.experimental.desktop
BOOTSTRAPDIR=../../Bootstrap
include $(BOOTSTRAPDIR)/Makefile.shared
native-code.cxx: $(SRCDIR)/solenv/bin/native-code.py
$< -j \
-g core -g edit -g writer \
> $@
# The name of the Bootstrap activity class
BOOTSTRAP=org.libreoffice.android.Bootstrap
# The default target just builds.
copy-stuff-desktop:
# tango artwork / icons
mkdir -p assets/share/config
cp -R $(INSTDIR)/$(LIBO_SHARE_FOLDER)/config/images_tango.zip assets/share/config
# shell / splash images
mkdir -p assets/program
cp -r $(SRC_ROOT)/icon-themes/galaxy/brand/* assets/program
# presets - becomes the users home directory, .stamp forces .zip dir creation
for D in $(strip autocorr autotext backup basic config gallery \
psprint/driver template \
uno_packages/cache wordbook); do \
mkdir -p assets/presets/$$D ; \
echo "content" > assets/presets/$$D/stamp; \
done
# lofficerc
mkdir -p assets/program/
echo "[Bootstrap]" > assets/program/lofficerc
echo "Logo=1" >> assets/program/lofficerc
echo "NativeProgress=1" >> assets/program/lofficerc
echo "URE_BOOTSTRAP=file:///assets/program/fundamentalrc" >> assets/program/lofficerc
echo "HOME=$(APP_DATA_PATH)/files" >> assets/program/lofficerc
echo "OSL_SOCKET_PATH=$(APP_DATA_PATH)/files" >> assets/program/lofficerc
# - this looks useful but breaks more than it fixes ...
# echo "DISABLE_EXTENSION_SYNCHRONIZATION=1" >> assets/program/lofficerc
setup-jars:
#
# Copy jar files we need
#
for F in java_uno \
juh \
jurt \
ridl \
unoloader; do \
$(call COPYJAR,$(INSTDIR)/$(LIBO_URE_SHARE_JAVA_FOLDER)/$${F}.jar); \
done
for F in unoil; do \
$(call COPYJAR,$(INSTDIR)/$(LIBO_SHARE_JAVA_FOLDER)/$${F}.jar); \
done
build-ant: android_version_setup copy-stuff copy-stuff-desktop link-so properties setup-jars
unset JAVA_HOME && $(ANT) $(if $(VERBOSE)$(verbose),,-quiet) debug
run:
$(ANDROID_SDK_HOME)/platform-tools/adb shell am start -n $(APP_PACKAGE)/.Desktop
# This file is used to override default values used by the Ant build system.
#
# This file must be checked in Version Control Systems, as it is
# integral to the build system of your project.
# This file is only used by the Ant script.
# You can use this to override default values such as
# 'source.dir' for the location of your java source folder and
# 'out.dir' for the location of your output folder.
# You can also use it define how the release builds are signed by declaring
# the following properties:
# 'key.store' for the location of your keystore and
# 'key.alias' for the name of the key to use.
# The password will be asked during the build when you use the 'release' target.
<?xml version="1.0" encoding="UTF-8"?>
<project name="LibreOfficeExperimentalDesktop" default="help">
<!-- The local.properties file is created and updated by the 'android' tool.
It contains the path to the SDK. It should *NOT* be checked into
Version Control Systems. -->
<loadproperties srcFile="local.properties" />
<!-- The ant.properties file can be created by you. It is only edited by the
'android' tool to add properties to it.
This is the place to change some Ant specific build properties.
Here are some properties you may want to change/update:
source.dir
The name of the source directory. Default is 'src'.
out.dir
The name of the output directory. Default is 'bin'.
For other overridable properties, look at the beginning of the rules
files in the SDK, at tools/ant/build.xml
Properties related to the SDK location or the project target should
be updated using the 'android' tool with the 'update' action.
This file is an integral part of the build system for your
application and should be checked into Version Control Systems.
-->
<property file="ant.properties" />
<!-- The project.properties file is created and updated by the 'android'
tool, as well as ADT.
This contains project specific properties such as project target, and library
dependencies. Lower level build properties are stored in ant.properties
(or in .classpath for Eclipse projects).
This file is an integral part of the build system for your
application and should be checked into Version Control Systems. -->
<loadproperties srcFile="project.properties" />
<!-- quick check on sdk.dir -->
<fail
message="sdk.dir is missing. Make sure to generate local.properties using 'android update project'"
unless="sdk.dir"
/>
<!-- extension targets. Uncomment the ones where you want to do custom work
in between standard targets -->
<!--
<target name="-pre-build">
</target>
<target name="-pre-compile">
</target>
/* This is typically used for code obfuscation.
Compiled code location: ${out.classes.absolute.dir}
If this is not done in place, override ${out.dex.input.absolute.dir} */
<target name="-post-compile">
</target>
-->
<!-- Import the actual build file.
To customize existing targets, there are two options:
- Customize only one target:
- copy/paste the target into this file, *before* the
<import> task.
- customize it to your needs.
- Customize the whole content of build.xml
- copy/paste the content of the rules files (minus the top node)
into this file, replacing the <import> task.
- customize to your needs.
***********************
****** IMPORTANT ******
***********************
In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
in order to avoid having your file be overridden by tools such as "android update project"
-->
<!-- version-tag: 1 -->
<import file="${android.library.reference.1}/no-resource-compress.xml" />
</project>
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<!-- /etc/fonts/fonts.conf file to configure system font access -->
<fontconfig>
<!-- Font directory list -->
<dir>/system/fonts</dir>
<alias>
<family>serif</family>
<prefer>
<family>Droid Serif</family>
</prefer>
</alias>
<alias>
<family>sans-serif</family>
<prefer>
<family>Roboto</family>
<family>Droid Sans Fallback</family>
</prefer>
</alias>
<alias>
<family>monospace</family>
<prefer>
<family>Droid Sans Mono</family>
</prefer>
</alias>
<!--
Accept deprecated 'mono' alias, replacing it with 'monospace'
-->
<match target="pattern">
<test qual="any" name="family">
<string>mono</string>
</test>
<edit name="family" mode="assign">
<string>monospace</string>
</edit>
</match>
<!--
Accept alternate 'sans serif' spelling, replacing it with 'sans-serif'
-->
<match target="pattern">
<test qual="any" name="family">
<string>sans serif</string>
</test>
<edit name="family" mode="assign">
<string>sans-serif</string>
</edit>
</match>
<!--
Accept deprecated 'sans' alias, replacing it with 'sans-serif'
-->
<match target="pattern">
<test qual="any" name="family">
<string>sans</string>
</test>
<edit name="family" mode="assign">
<string>sans-serif</string>
</edit>
</match>
<!--
Load local system customization file
-->
<include ignore_missing="yes">conf.d</include>
<!-- Font cache directory list -->
<!-- Yeah this hardcoding is wrong of course, will have to fix
later to patch in proper code in fontonfig on Android to
find out a good place.
-->
<cachedir>/data/data/org.libreoffice.experimental.desktop/fontconfig</cachedir>
<config>
<!--
These are the default Unicode chars that are expected to be blank
in fonts. All other blank chars are assumed to be broken and
won't appear in the resulting charsets
-->
<blank>
<int>0x0020</int> <!-- SPACE -->
<int>0x00A0</int> <!-- NO-BREAK SPACE -->
<int>0x00AD</int> <!-- SOFT HYPHEN -->
<int>0x034F</int> <!-- COMBINING GRAPHEME JOINER -->
<int>0x0600</int> <!-- ARABIC NUMBER SIGN -->
<int>0x0601</int> <!-- ARABIC SIGN SANAH -->
<int>0x0602</int> <!-- ARABIC FOOTNOTE MARKER -->
<int>0x0603</int> <!-- ARABIC SIGN SAFHA -->
<int>0x06DD</int> <!-- ARABIC END OF AYAH -->
<int>0x070F</int> <!-- SYRIAC ABBREVIATION MARK -->
<int>0x115F</int> <!-- HANGUL CHOSEONG FILLER -->
<int>0x1160</int> <!-- HANGUL JUNGSEONG FILLER -->
<int>0x1680</int> <!-- OGHAM SPACE MARK -->
<int>0x17B4</int> <!-- KHMER VOWEL INHERENT AQ -->
<int>0x17B5</int> <!-- KHMER VOWEL INHERENT AA -->
<int>0x180E</int> <!-- MONGOLIAN VOWEL SEPARATOR -->
<int>0x2000</int> <!-- EN QUAD -->
<int>0x2001</int> <!-- EM QUAD -->
<int>0x2002</int> <!-- EN SPACE -->
<int>0x2003</int> <!-- EM SPACE -->
<int>0x2004</int> <!-- THREE-PER-EM SPACE -->
<int>0x2005</int> <!-- FOUR-PER-EM SPACE -->
<int>0x2006</int> <!-- SIX-PER-EM SPACE -->
<int>0x2007</int> <!-- FIGURE SPACE -->
<int>0x2008</int> <!-- PUNCTUATION SPACE -->
<int>0x2009</int> <!-- THIN SPACE -->
<int>0x200A</int> <!-- HAIR SPACE -->
<int>0x200B</int> <!-- ZERO WIDTH SPACE -->
<int>0x200C</int> <!-- ZERO WIDTH NON-JOINER -->
<int>0x200D</int> <!-- ZERO WIDTH JOINER -->
<int>0x200E</int> <!-- LEFT-TO-RIGHT MARK -->
<int>0x200F</int> <!-- RIGHT-TO-LEFT MARK -->
<int>0x2028</int> <!-- LINE SEPARATOR -->
<int>0x2029</int> <!-- PARAGRAPH SEPARATOR -->
<int>0x202A</int> <!-- LEFT-TO-RIGHT EMBEDDING -->
<int>0x202B</int> <!-- RIGHT-TO-LEFT EMBEDDING -->
<int>0x202C</int> <!-- POP DIRECTIONAL FORMATTING -->
<int>0x202D</int> <!-- LEFT-TO-RIGHT OVERRIDE -->
<int>0x202E</int> <!-- RIGHT-TO-LEFT OVERRIDE -->
<int>0x202F</int> <!-- NARROW NO-BREAK SPACE -->
<int>0x205F</int> <!-- MEDIUM MATHEMATICAL SPACE -->
<int>0x2060</int> <!-- WORD JOINER -->
<int>0x2061</int> <!-- FUNCTION APPLICATION -->
<int>0x2062</int> <!-- INVISIBLE TIMES -->
<int>0x2063</int> <!-- INVISIBLE SEPARATOR -->
<int>0x206A</int> <!-- INHIBIT SYMMETRIC SWAPPING -->
<int>0x206B</int> <!-- ACTIVATE SYMMETRIC SWAPPING -->
<int>0x206C</int> <!-- INHIBIT ARABIC FORM SHAPING -->
<int>0x206D</int> <!-- ACTIVATE ARABIC FORM SHAPING -->
<int>0x206E</int> <!-- NATIONAL DIGIT SHAPES -->
<int>0x206F</int> <!-- NOMINAL DIGIT SHAPES -->
<int>0x2800</int> <!-- BRAILLE PATTERN BLANK -->
<int>0x3000</int> <!-- IDEOGRAPHIC SPACE -->
<int>0x3164</int> <!-- HANGUL FILLER -->
<int>0xFEFF</int> <!-- ZERO WIDTH NO-BREAK SPACE -->
<int>0xFFA0</int> <!-- HALFWIDTH HANGUL FILLER -->
<int>0xFFF9</int> <!-- INTERLINEAR ANNOTATION ANCHOR -->
<int>0xFFFA</int> <!-- INTERLINEAR ANNOTATION SEPARATOR -->
<int>0xFFFB</int> <!-- INTERLINEAR ANNOTATION TERMINATOR -->
</blank>
<!--
Rescan configuration every 3600 seconds when FcFontSetList is called
-->
<rescan>
<int>3600</int>
</rescan>
</config>
</fontconfig>
# Copyright (C) 2009 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.
#
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(BUILD_SHARED_LIBRARY)
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system use,
# "ant.properties", and override values to adapt the script to your
# project structure.
# Project target.
target=android-21
android.library.reference.1=../../Bootstrap
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello World"
/>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">LibreOffice Viewer test</string>
</resources>
// -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
//
// This file is part of the LibreOffice project.
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
// This is just a testbed for ideas and implementations. (Still, it might turn
// out to be somewhat useful as such while waiting for "real" apps.)
package org.libreoffice.experimental.desktop;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Bundle;
import android.text.InputType;
import android.util.Log;
import android.view.GestureDetector;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;
import android.view.inputmethod.BaseInputConnection;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.view.inputmethod.InputMethodManager;
import com.sun.star.awt.Key;
import org.libreoffice.android.AppSupport;
import org.libreoffice.android.Bootstrap;
public class Desktop
extends Activity
{
private static final String TAG = "LODesktop";
/**
* This class contains the state that is initialized once and never changes
* (not specific to a document or a view).
*/
class BootstrapContext
{
}
BootstrapContext bootstrapContext;
private static final Integer ZERO = 0;
private static int normalize(Number value) {
return ZERO.compareTo(-value.intValue());
}
private void initBootstrapContext()
{
bootstrapContext = new BootstrapContext();
Bootstrap.setup(this);
// To enable the putenv below, which turns on all SAL_INFO
// logging, do: "adb shell setprop log.tag.LODesktopLogging
// VERBOSE".
if (Log.isLoggable("LODesktopLogging", Log.VERBOSE))
Bootstrap.putenv("SAL_LOG=+WARN+INFO");
}
// This sucks, we need to experiment and think, can an app process
// have several instances of this Activity active?
static BitmapView theView;
// This is called back from LO in the LO thread
static public void callbackDamaged()
{
synchronized (theView) {
if (!invalidatePosted)
theView.post(new Runnable() {
@Override public void run() {
synchronized (theView) {
theView.invalidate();
invalidatePosted = false;
}
}
});
invalidatePosted = true;
}
}
static boolean invalidatePosted;
@Override public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Log.i(TAG, "onCreate");
try {
String input;
// input = getIntent().getStringExtra("input");
// if (input == null)
input = "/assets/test1.odt";
// input = "--writer";
// We need to fake up an argv, and the argv[0] even needs to
// point to some file name that we can pretend is the "program".
// setCommandArgs() will prefix argv[0] with the app's data
// directory.
String[] argv = { "lo-document-loader", input };
Bootstrap.setCommandArgs(argv);
// To enable the sleep below, do: "adb shell setprop
// log.tag.LODesktopSleepOnCreate VERBOSE". Yeah, has
// nothing to do with logging as such.
// This should be after at least one call to something in
// the Bootstrap class as it is the static initialiser
// that loads the lo-native-code library, and presumably
// in ndk-gdb you want to set a breapoint in some native
// code...
if (Log.isLoggable("LODesktopSleepOnCreate", Log.VERBOSE)) {
Log.i(TAG, "Sleeping, start ndk-gdb NOW if you intend to debug");
Thread.sleep(20000);
}
if (bootstrapContext == null)
initBootstrapContext();
Log.i(TAG, "onCreate - set content view");
theView = new BitmapView();
setContentView(theView);
AppSupport.registerForDamageCallback(getClass());
// Start a Java thread to run soffice_main(). We don't
// want to start the thread from native code becauce
// native threads apparently have no Java class loaders in
// Android, or someghin. So for instance FindClass fails.
// See https://groups.google.com/group/android-ndk/msg/a0793f009e6e71f7?dmode=source
// .
new Thread(new Runnable() {
@Override public void run() {
AppSupport.runMain();
}
}).start();
}
catch (Exception e) {
e.printStackTrace(System.err);
finish();
}
}
class BitmapView
extends View
{
Bitmap mBitmap;
boolean renderedOnce;
GestureDetector gestureDetector;
ScaleGestureDetector scaleDetector;
boolean scrollInProgress, scalingInProgress;
float translateX = 0, translateY = 0;
float accumulatedScale = 1;
float pivotX = 0, pivotY = 0;
public BitmapView()
{
super(Desktop.this);
setFocusableInTouchMode(true);
gestureDetector =
new GestureDetector(Desktop.this,
new GestureDetector.SimpleOnGestureListener() {
@Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
{
Log.i(TAG, "onFling: (" + velocityX + ", " + velocityY + ")");
return false;
}
@Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
{
Log.i(TAG, "onScroll: (" + distanceX + ", " + distanceY + ")");
translateX += -distanceX;
translateY += -distanceY;
scrollInProgress = true;
invalidate();
return true;
}
});
scaleDetector =
new ScaleGestureDetector(Desktop.this,
new ScaleGestureDetector.SimpleOnScaleGestureListener() {
@Override public boolean onScaleBegin(ScaleGestureDetector detector)
{
scalingInProgress = true;
return true;
}
@Override public boolean onScale(ScaleGestureDetector detector)
{
accumulatedScale *= detector.getScaleFactor();
pivotX = detector.getFocusX();
pivotY = detector.getFocusY();
invalidate();
return true;
}
@Override public void onScaleEnd(ScaleGestureDetector detector)
{
accumulatedScale *= detector.getScaleFactor();
AppSupport.zoom(accumulatedScale, (int) pivotX, (int) pivotY);
accumulatedScale = 1;
pivotX = pivotY = 0;
scalingInProgress = false;
invalidate();
}
});
}
@Override protected void onDraw(Canvas canvas)
{
if (mBitmap == null) {
Log.i(TAG, "calling Bitmap.createBitmap(" + getWidth() + ", " + getHeight() + ", Bitmap.Config.ARGB_8888)");
mBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
AppSupport.setViewSize(getWidth(), getHeight());
}
AppSupport.renderVCL(mBitmap);
if (scrollInProgress) {
canvas.save();
canvas.translate(translateX, translateY);
canvas.drawBitmap(mBitmap, 0, 0, null);
canvas.restore();
} else if (scalingInProgress) {
canvas.save();
canvas.scale(accumulatedScale, accumulatedScale, pivotX, pivotY);
canvas.drawBitmap(mBitmap, 0, 0, null);
canvas.restore();
} else {
canvas.drawBitmap(mBitmap, 0, 0, null);
}
renderedOnce = true;
}
@Override public boolean onKeyDown(int keyCode, KeyEvent event)
{
switch (keyCode) {
case KeyEvent.KEYCODE_0:
case KeyEvent.KEYCODE_1:
case KeyEvent.KEYCODE_2:
case KeyEvent.KEYCODE_3:
case KeyEvent.KEYCODE_4:
case KeyEvent.KEYCODE_5:
case KeyEvent.KEYCODE_6:
case KeyEvent.KEYCODE_7:
case KeyEvent.KEYCODE_8:
case KeyEvent.KEYCODE_9:
AppSupport.key((char) ('0' + keyCode - KeyEvent.KEYCODE_0));
return true;
case KeyEvent.KEYCODE_DEL:
AppSupport.key((char) Key.BACKSPACE);
return true;
case KeyEvent.KEYCODE_ENTER:
AppSupport.key((char) Key.RETURN);
return true;
case KeyEvent.KEYCODE_TAB:
AppSupport.key((char) Key.TAB);
return true;
default:
return false;
}
}
@Override public boolean onTouchEvent(MotionEvent event)
{
boolean scrollJustEnded = false;
if (event.getPointerCount() == 1 &&
gestureDetector.onTouchEvent(event)) {
return true;
}
// There is no callback in SimpleOnGestureListener for end
// of scroll. Is this a good way to detect it? Assume that
// as long as the scrolling gesture is in progress, the
// Gesturedetector.onTouchEvent() will keep returning
// true, so if scrollInProgress is true and we get here,
// the scroll must have ended.
if (scrollInProgress) {
AppSupport.scroll(normalize(translateX), normalize(translateY));
translateX = translateY = 0;
scrollInProgress = false;
scrollJustEnded = true;
invalidate();
} else if (event.getPointerCount() == 2 &&
scaleDetector.onTouchEvent(event) &&
scalingInProgress) {
// If a scaling gesture is in progress no other touch
// processing should be done.
return true;
}
// Just temporary hack. We should not show the keyboard
// unconditionally on a ACTION_UP event here. The LO level
// should callback to us requesting showing the keyboard
// if the user taps in a text area. Unfortunately it seems
// less than obvious where the correct place to insert
// such a request is.
// Also, if the device has a hardware keyboard, we
// probably should not show the soft one unconditionally?
// But what if the user wants to input in another script
// than what the hardware keyboard covers?
if (!scrollJustEnded &&
event.getPointerCount() == 1 &&
event.getActionMasked() == MotionEvent.ACTION_UP) {
// show the keyboard so we can enter text
InputMethodManager imm = (InputMethodManager) getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(this, InputMethodManager.SHOW_FORCED);
}
if (event.getPointerCount() == 1) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_MOVE:
AppSupport.touch(event.getActionMasked(), (int) event.getX(), (int) event.getY());
break;
}
}
return true;
}
@Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
BaseInputConnection fic = new LOInputConnection(this, true);
outAttrs.actionLabel = null;
outAttrs.inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS;
outAttrs.imeOptions = EditorInfo.IME_ACTION_NONE;
return fic;
}
@Override public boolean onCheckIsTextEditor() {
return renderedOnce;
}
}
class LOInputConnection
extends BaseInputConnection
{
public LOInputConnection(View targetView, boolean fullEditor) {
super(targetView, fullEditor);
}
@Override public boolean commitText(CharSequence text, int newCursorPosition) {
for (int i = 0; i < text.length(); i++) {
AppSupport.key(text.charAt(i));
}
return true;
}
}
}
// vim:set shiftwidth=4 softtabstop=4 expandtab:
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment