summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Lillqvist <tml@iki.fi>2012-02-15 12:00:46 +0200
committerTor Lillqvist <tml@iki.fi>2012-02-15 12:00:46 +0200
commitc301199804f5beb7ef803abfa84e04d9351efb3f (patch)
tree991cfa7a033d7fc76e5ea76ca2a10363b1bc5271
parentMore String to rtl::OUString conversion while I'm at it. (diff)
parentNeed libfastsax.uno (diff)
downloadcore-c301199804f5beb7ef803abfa84e04d9351efb3f.tar.gz
core-c301199804f5beb7ef803abfa84e04d9351efb3f.zip
Merge branch 'feature/android'
-rw-r--r--Library_merged.mk7
-rw-r--r--README.Android1
-rw-r--r--README.cross2
-rw-r--r--android/Bootstrap/local.properties.in2
-rw-r--r--android/Bootstrap/src/org/libreoffice/android/Bootstrap.java8
-rw-r--r--android/qa/desktop/Makefile53
-rw-r--r--android/qa/desktop/fonts.conf21
-rw-r--r--android/qa/sc/Makefile27
-rw-r--r--configure.in5
-rw-r--r--desktop/source/app/app.cxx37
-rw-r--r--jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx2
-rw-r--r--sal/Library_lo-bootstrap.mk5
-rw-r--r--sal/Package_inc.mk1
-rw-r--r--sal/android/android_native_app_glue.c26
-rw-r--r--sal/android/lo-bootstrap.c62
-rw-r--r--sal/inc/osl/detail/android-bootstrap.h (renamed from solenv/inc/unxandr/lo-bootstrap.h)7
-rw-r--r--sal/osl/unx/file.cxx2
-rw-r--r--sal/osl/unx/file_misc.cxx12
-rw-r--r--sal/osl/unx/module.c6
-rw-r--r--sal/osl/unx/process_impl.cxx2
-rw-r--r--sal/osl/unx/security.c20
-rw-r--r--sal/osl/unx/thread.c18
-rw-r--r--sal/osl/unx/uunxapi.cxx2
-rw-r--r--sc/qa/unit/filters-test.cxx4
-rw-r--r--vcl/Library_vcl.mk1
-rw-r--r--vcl/Module_vcl.mk6
-rw-r--r--vcl/android/androidinst.cxx658
-rw-r--r--vcl/headless/svpframe.cxx3
-rw-r--r--vcl/headless/svpinst.cxx2
-rw-r--r--vcl/inc/android/androidinst.hxx29
-rw-r--r--vcl/inc/generic/geninst.h6
-rw-r--r--vcl/inc/headless/svpframe.hxx12
-rw-r--r--vcl/source/app/svmain.cxx5
33 files changed, 946 insertions, 108 deletions
diff --git a/Library_merged.mk b/Library_merged.mk
index 6d2d90806828..d4e31bbc7eb2 100644
--- a/Library_merged.mk
+++ b/Library_merged.mk
@@ -83,4 +83,11 @@ $(eval $(call gb_Library_add_linked_libs,merged,\
))
endif
+ifeq ($(OS),MACOSX)
+$(eval $(call gb_Library_add_linked_libs,merged,\
+ objc \
+ Cocoa \
+))
+endif
+
# vim: set noet sw=4 ts=4:
diff --git a/README.Android b/README.Android
index b5e32c7db716..e96597e98fd0 100644
--- a/README.Android
+++ b/README.Android
@@ -15,6 +15,7 @@ Then it is necessary to get stdout/err to go to somewhere we can find it:
Then:
+ . Env.Host.sh
cd android/qa/sc
make clean all install
make run ; adb shell logcat
diff --git a/README.cross b/README.cross
index 153f4b9c5497..2acd497c8496 100644
--- a/README.cross
+++ b/README.cross
@@ -339,6 +339,8 @@ And here is an autogen.lastrun for Android when cross-compiling from Linux:
CC_FOR_BUILD=ccache gcc
CXX_FOR_BUILD=ccache g++
--with-android-ndk=/home/tml/android-ndk-r7
+--with-android-sdk=/home/tml/android-sdk-linux_x86
+--with-ant-home=/opt/apache-ant-1.8.2
--build=x86_64-unknown-linux-gnu
--disable-zenity
--with-distro=LibreOfficeAndroid
diff --git a/android/Bootstrap/local.properties.in b/android/Bootstrap/local.properties.in
new file mode 100644
index 000000000000..27c8eb5f4dac
--- /dev/null
+++ b/android/Bootstrap/local.properties.in
@@ -0,0 +1,2 @@
+# Location of the SDK. This is only used by Ant.
+sdk.dir=@ANDROID_SDK_HOME@
diff --git a/android/Bootstrap/src/org/libreoffice/android/Bootstrap.java b/android/Bootstrap/src/org/libreoffice/android/Bootstrap.java
index 9e210565f7ca..ac5d027cb52a 100644
--- a/android/Bootstrap/src/org/libreoffice/android/Bootstrap.java
+++ b/android/Bootstrap/src/org/libreoffice/android/Bootstrap.java
@@ -136,16 +136,16 @@ public class Bootstrap extends NativeActivity
String[] argv = CommandLine.split(cmdLine);
- // Handle env var assignments in the command line. Actually
- // not sure if this works, are environments per-thread in
- // Android? This code runs in a different thread than that in
- // which lo_main etc will run.
+ // Handle env var assignments in the command line.
while (argv.length > 0 &&
argv[0].matches("[A-Z_]+=.*")) {
putenv(argv[0]);
argv = Arrays.copyOfRange(argv, 1, argv.length-1);
}
+ // TMPDIR is used by osl_getTempDirURL()
+ putenv("TMPDIR=" + getCacheDir().getAbsolutePath());
+
// argv[0] will be replaced by android_main() in lo-bootstrap.c by the
// pathname of the mainLibrary.
String[] newargv = new String[argv.length + 1];
diff --git a/android/qa/desktop/Makefile b/android/qa/desktop/Makefile
index 375bb82e341b..efe0040524d6 100644
--- a/android/qa/desktop/Makefile
+++ b/android/qa/desktop/Makefile
@@ -38,6 +38,7 @@ buildrcs:
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
+
# fundamentalrc ini ...
echo "[Bootstrap]" > assets/program/fundamentalrc
echo "LO_LIB_DIR=file://$(APP_DATA_PATH)/lib/" >> assets/program/fundamentalrc
@@ -71,6 +72,22 @@ buildrcs:
echo "ProductKey=LibreOffice 3.5" >> assets/program/bootstraprc
echo "UserInstallation=file://$(APP_DATA_PATH)/files/.libreoffice" >> assets/program/bootstraprc
+# versionrc ini ...
+ echo "[Version]" > assets/program/versionrc
+ echo "AllLanguages=en-US" >> assets/program/versionrc
+ echo "BuildVersion=" >> assets/program/versionrc
+ echo "buildid=dead-beef" >> assets/program/versionrc
+ echo "ExtensionUpdateURL=http://updateexte.libreoffice.org/ExtensionUpdateService/check.Update" >> assets/program/versionrc
+ echo "ProductBuildid=3" >> assets/program/versionrc
+ echo "ProductMajor=360" >> assets/program/versionrc
+ echo "ProductMinor=1" >> assets/program/versionrc
+ echo "ProductSource=OOO350" >> assets/program/versionrc
+ echo "ReferenceOOoMajorMinor=3.6" >> assets/program/versionrc
+ echo "UpdateID=LibreOffice_3_en-US" >> assets/program/versionrc
+ echo "UpdateURL=" >> assets/program/versionrc
+ echo "UpdateUserAgent=<PRODUCT> (${buildid}; ${_OS}; ${_ARCH}; BundledLanguages=${AllLanguages})" >> assets/program/versionrc
+ echo "Vendor=SelfCompiledGit" >> assets/program/versionrc
+
copy-stuff: buildrcs
#
# Copy shared libraries we need to libs/armeabi-v7a so that ant will
@@ -87,12 +104,17 @@ copy-stuff: buildrcs
# Libs and UNO components that we need.
#
for F in $(strip \
+ analysislo \
+ avmedialo \
basebmplo \
basegfxlo \
bootstrap.uno \
+ canvastoolslo \
comphelpgcc3 \
configmgr.uno \
- deploymentmisclo \
+ cppcanvaslo \
+ drawinglayerlo \
+ expwrap.uno \
fileacc \
fontconfig \
forlo \
@@ -101,6 +123,7 @@ copy-stuff: buildrcs
fwelo \
fwilo \
fwklo \
+ fsstorage.uno \
gcc3_uno \
i18nisolang1gcc3 \
i18npaperlo \
@@ -112,6 +135,7 @@ copy-stuff: buildrcs
icuuclo \
jvmaccessgcc3 \
jvmfwk \
+ lnglo \
localebe1.uno \
localedata_en \
localedata_es \
@@ -120,7 +144,7 @@ copy-stuff: buildrcs
mergedlo \
msfilterlo \
ooxlo \
- package2 \
+ reflection.uno \
reg \
saxlo \
sblo \
@@ -152,9 +176,16 @@ copy-stuff: buildrcs
xcrlo \
xml2 \
xmlreader \
+ xstor \
+ \
+ swlo \
+ swdlo \
); do \
$(call COPY,$(OUTDIR)/lib/lib$${F}.so); \
done
+# deployment \
+# deploymentmisclo \
+
#
# Then the shared GNU C++ library
$(call COPY,$(ANDROID_NDK_HOME)/sources/cxx-stl/gnu-libstdc++/libs/armeabi-v7a/libgnustl_shared.so)
@@ -186,6 +217,8 @@ copy-stuff: buildrcs
mkdir -p assets/presets/$$D ; \
echo "content" > assets/presets/$$D/stamp; \
done
+# shell / splash images
+ cp -r $(SRC_ROOT)/icon-themes/galaxy/brand/* assets/program
# Then assets that are unpacked at run-time into the app's data directory.
mkdir -p assets/unpack/etc/fonts
cp fonts.conf assets/unpack/etc/fonts
@@ -197,31 +230,31 @@ copy-stuff: buildrcs
build-ant: copy-stuff
- unset JAVA_HOME && ant debug
+ unset JAVA_HOME && $(ANT) debug
install: copy-stuff
- adb shell rm -r $(APP_DATA_PATH)
- unset JAVA_HOME && ant debug install
+ $(ANDROID_SDK_HOME)/platform-tools/adb shell rm -r $(APP_DATA_PATH)
+ unset JAVA_HOME && $(ANT) debug install
@echo
@echo 'Run it with "make run"'
@echo
uninstall:
- adb uninstall $(APP_PACKAGE)
+ $(ANDROID_SDK_HOME)/platform-tools/adb uninstall $(APP_PACKAGE)
run:
echo "FONTCONFIG_FILE=$(APP_DATA_PATH)/etc/fonts/fonts.conf -env:INIFILENAME=file:///assets/program/sofficerc" > cmdline
- adb push cmdline $(APP_DATA_PATH)/cmdline
- adb shell am start -n $(APP_PACKAGE)/$(BOOTSTRAP) -e lo-main-library libmergedlo -e lo-main-indirect-cmdline "$(APP_DATA_PATH)/cmdline"
+ $(ANDROID_SDK_HOME)/platform-tools/adb push cmdline $(APP_DATA_PATH)/cmdline
+ $(ANDROID_SDK_HOME)/platform-tools/adb shell am start -n $(APP_PACKAGE)/$(BOOTSTRAP) -e lo-main-library libmergedlo -e lo-main-indirect-cmdline "$(APP_DATA_PATH)/cmdline"
# add -e lo-strace yes # if you want that
# If you reinstall an app several times, even if you uninstall it
# between, disk space seems to leak that won't get recycled until you
# stop and start...
stop-start-cycle:
- adb shell stop && adb shell start && sleep 10
+ $(ANDROID_SDK_HOME)/platform-tools/adb shell stop && $(ANDROID_SDK_HOME)/platform-tools/adb shell start && sleep 10
clean:
- ant clean
+ $(ANT) clean
rm -rf assets $(SODEST) $(OBJLOCAL)
diff --git a/android/qa/desktop/fonts.conf b/android/qa/desktop/fonts.conf
index 0e92c5d78d38..64d714cf95c7 100644
--- a/android/qa/desktop/fonts.conf
+++ b/android/qa/desktop/fonts.conf
@@ -7,6 +7,27 @@
<dir>/system/fonts</dir>
+ <alias>
+ <family>serif</family>
+ <prefer>
+ <family>DroidSerif</family>
+ <family>Roboto</family>
+ </prefer>
+ </alias>
+ <alias>
+ <family>sans-serif</family>
+ <prefer>
+ <family>Roboto</family>
+ <family>DroidSerif</family>
+ </prefer>
+ </alias>
+ <alias>
+ <family>monospace</family>
+ <prefer>
+ <family>DroidSansMono</family>
+ </prefer>
+ </alias>
+
<!--
Accept deprecated 'mono' alias, replacing it with 'monospace'
-->
diff --git a/android/qa/sc/Makefile b/android/qa/sc/Makefile
index 0412f334f6e8..a57ecab04f52 100644
--- a/android/qa/sc/Makefile
+++ b/android/qa/sc/Makefile
@@ -53,11 +53,15 @@ copy-stuff:
# Libs and UNO components that the tests need.
#
for F in $(strip \
+ analysislo \
basebmplo \
basegfxlo \
bootstrap.uno \
comphelpgcc3 \
configmgr.uno \
+ datelo \
+ expwrap.uno \
+ fastsax.uno \
fileacc \
fontconfig \
forlo \
@@ -75,6 +79,7 @@ copy-stuff:
icui18nlo \
iculelo \
icuuclo \
+ introspection.uno \
jvmaccessgcc3 \
jvmfwk \
localedata_en \
@@ -84,6 +89,7 @@ copy-stuff:
mergedlo \
msfilterlo \
ooxlo \
+ reflection.uno \
reg \
saxlo \
sblo \
@@ -115,6 +121,7 @@ copy-stuff:
xcrlo \
xml2 \
xmlreader \
+ xstor \
); do \
$(call COPY,$(OUTDIR)/lib/lib$${F}.so); \
done
@@ -161,26 +168,26 @@ copy-stuff:
build-ant: copy-stuff
- unset JAVA_HOME && ant debug
+ unset JAVA_HOME && $(ANT) debug
install: copy-stuff
- unset JAVA_HOME && ant debug install
+ unset JAVA_HOME && $(ANT) debug install
@echo
@echo 'Run it with "make run"'
@echo
uninstall:
- adb uninstall $(APP_PACKAGE)
+ $(ANDROID_SDK_HOME)/platform-tools/adb uninstall $(APP_PACKAGE)
run_ucalc:
echo "STAR_RESOURCEPATH=/assets/bin FONTCONFIG_FILE=$(APP_DATA_PATH)/etc/fonts/fonts.conf $(APP_DATA_PATH)/lib/libtest_sc_ucalc.so --headless --protector libunoexceptionprotector.so unoexceptionprotector '-env:CONFIGURATION_LAYERS=xcsxcu:file:///assets/xml/registry' '-env:UNO_TYPES=file:///assets/bin/udkapi.rdb file:///assets/bin/types.rdb' '-env:UNO_SERVICES=file:///assets/xml/ure/services.rdb file:///assets/ComponentTarget/framework/util/fwk.component file:///assets/ComponentTarget/i18npool/util/i18npool.component file:///assets/ComponentTarget/sfx2/util/sfx.component file:///assets/ComponentTarget/unoxml/source/service/unoxml.component file:///assets/ComponentTarget/configmgr/source/configmgr.component file:///assets/ComponentTarget/ucb/source/core/ucb1.component file:///assets/ComponentTarget/ucb/source/ucp/file/ucpfile1.component' -env:URE_INTERNAL_LIB_DIR=file://$(APP_DATA_PATH)/lib -env:LO_LIB_DIR=file://$(APP_DATA_PATH)/lib" >cmdline
- adb push cmdline $(APP_DATA_PATH)/cmdline
- adb shell am start -n $(APP_PACKAGE)/$(BOOTSTRAP) -e lo-main-library libcppunittester -e lo-main-indirect-cmdline "$(APP_DATA_PATH)/cmdline"
+ $(ANDROID_SDK_HOME)/platform-tools/adb push cmdline $(APP_DATA_PATH)/cmdline
+ $(ANDROID_SDK_HOME)/platform-tools/adb shell am start -n $(APP_PACKAGE)/$(BOOTSTRAP) -e lo-main-library libcppunittester -e lo-main-indirect-cmdline "$(APP_DATA_PATH)/cmdline"
run_filters_test:
echo "STAR_RESOURCEPATH=/assets/bin FONTCONFIG_FILE=$(APP_DATA_PATH)/etc/fonts/fonts.conf $(APP_DATA_PATH)/lib/libtest_sc_filters_test.so --headless --protector libunoexceptionprotector.so unoexceptionprotector '-env:CONFIGURATION_LAYERS=xcsxcu:file:///assets/xml/registry module:file:///assets/xml/registry/spool' '-env:UNO_TYPES=file:///assets/bin/udkapi.rdb file:///assets/bin/types.rdb' '-env:UNO_SERVICES=file:///assets/xml/ure/services.rdb file:///assets/ComponentTarget/basic/util/sb.component file:///assets/ComponentTarget/chart2/source/controller/chartcontroller.component file:///assets/ComponentTarget/chart2/source/tools/charttools.component file:///assets/ComponentTarget/chart2/source/model/chartmodel.component file:///assets/ComponentTarget/comphelper/util/comphelp.component file:///assets/ComponentTarget/dbaccess/util/dba.component file:///assets/ComponentTarget/eventattacher/source/evtatt.component file:///assets/ComponentTarget/fileaccess/source/fileacc.component file:///assets/ComponentTarget/filter/source/config/cache/filterconfig1.component file:///assets/ComponentTarget/forms/util/frm.component file:///assets/ComponentTarget/oox/util/oox.component file:///assets/ComponentTarget/package/source/xstor/xstor.component file:///assets/ComponentTarget/package/util/package2.component file:///assets/ComponentTarget/sax/source/expatwrap/expwrap.component file:///assets/ComponentTarget/sax/source/fastparser/fastsax.component file:///assets/ComponentTarget/sc/util/sc.component file:///assets/ComponentTarget/sc/util/scfilt.component file:///assets/ComponentTarget/scaddins/source/analysis/analysis.component file:///assets/ComponentTarget/scaddins/source/datefunc/date.component file:///assets/ComponentTarget/sot/util/sot.component file:///assets/ComponentTarget/svl/util/svl.component file:///assets/ComponentTarget/toolkit/util/tk.component file:///assets/ComponentTarget/ucb/source/ucp/tdoc/ucptdoc1.component file:///assets/ComponentTarget/unotools/util/utl.component file:///assets/ComponentTarget/unoxml/source/rdf/unordf.component file:///assets/ComponentTarget/framework/util/fwk.component file:///assets/ComponentTarget/i18npool/util/i18npool.component file:///assets/ComponentTarget/sfx2/util/sfx.component file:///assets/ComponentTarget/unoxml/source/service/unoxml.component file:///assets/ComponentTarget/configmgr/source/configmgr.component file:///assets/ComponentTarget/ucb/source/core/ucb1.component file:///assets/ComponentTarget/ucb/source/ucp/file/ucpfile1.component' -env:URE_INTERNAL_LIB_DIR=file://$(APP_DATA_PATH)/lib -env:LO_LIB_DIR=file://$(APP_DATA_PATH)/lib" >cmdline
- adb push cmdline $(APP_DATA_PATH)/cmdline
- adb shell am start -n $(APP_PACKAGE)/$(BOOTSTRAP) -e lo-main-library libcppunittester -e lo-main-indirect-cmdline "$(APP_DATA_PATH)/cmdline"
+ $(ANDROID_SDK_HOME)/platform-tools/adb push cmdline $(APP_DATA_PATH)/cmdline
+ $(ANDROID_SDK_HOME)/platform-tools/adb shell am start -n $(APP_PACKAGE)/$(BOOTSTRAP) -e lo-main-library libcppunittester -e lo-main-indirect-cmdline "$(APP_DATA_PATH)/cmdline"
run: run_ucalc run_filters_test
@@ -188,13 +195,13 @@ run: run_ucalc run_filters_test
# between, disk space seems to leak that won't get recycled until you
# stop and start...
stop-start-cycle:
- adb shell stop && adb shell start && sleep 10
+ $(ANDROID_SDK_HOME)/platform-tools/adb shell stop && $(ANDROID_SDK_HOME)/platform-tools/adb shell start && sleep 10
# Too hard to remember this stuff;)
redirect-stdio:
- adb shell stop && adb shell setprop log.redirect-stdio true && adb shell start
+ $(ANDROID_SDK_HOME)/platform-tools/adb shell stop && $(ANDROID_SDK_HOME)/platform-tools/adb shell setprop log.redirect-stdio true && $(ANDROID_SDK_HOME)/platform-tools/adb shell start
clean:
- ant clean
+ $(ANT) clean
rm -rf assets $(SODEST) $(OBJLOCAL)
diff --git a/configure.in b/configure.in
index 0f5ba8a49af5..b96b081fcfb6 100644
--- a/configure.in
+++ b/configure.in
@@ -109,6 +109,8 @@ if test -n "$with_android_ndk"; then
test -z "$STRIP" && STRIP=$ANDROID_ABI_PREBUILT_BIN/arm-linux-androideabi-strip
ANDROIDCFLAGS="-march=armv7-a -mfloat-abi=softfp -mthumb -mfpu=neon -Wl,--fix-cortex-a8 --sysroot $ANDROID_NDK_HOME/platforms/android-9/arch-arm -L$ANDROID_NDK_HOME/sources/cxx-stl/gnu-libstdc++/libs/armeabi-v7a"
+
+ # Note that letting this set CC and CXX means ccache won't be used
test -z "$CC" && CC="$ANDROID_ABI_PREBUILT_BIN/arm-linux-androideabi-gcc $ANDROIDCFLAGS"
test -z "$CXX" && CXX="$ANDROID_ABI_PREBUILT_BIN/arm-linux-androideabi-g++ $ANDROIDCFLAGS -I $ANDROID_NDK_HOME/sources/cxx-stl/gnu-libstdc++/include -I$ANDROID_NDK_HOME/sources/cxx-stl/gnu-libstdc++/libs/armeabi-v7a/include -fexceptions -frtti"
fi
@@ -3135,6 +3137,7 @@ if test "$cross_compiling" = "yes"; then
tar cf - \
bin/repo-list.in \
build_env.in \
+ android/Bootstrap/local.properties.in \
android/qa/sc/local.properties.in \
android/qa/desktop/local.properties.in \
config.guess \
@@ -10895,7 +10898,7 @@ else
echo > config_host.mk.last
fi
-AC_CONFIG_FILES([config_host.mk ooo.lst bin/repo-list build_env android/qa/sc/local.properties android/qa/desktop/local.properties])
+AC_CONFIG_FILES([config_host.mk ooo.lst bin/repo-list build_env android/Bootstrap/local.properties android/qa/sc/local.properties android/qa/desktop/local.properties])
AC_OUTPUT
# touch the config timestamp file set_soenv.stamp
diff --git a/desktop/source/app/app.cxx b/desktop/source/app/app.cxx
index a3dabd43fc60..dc490ed8ad0b 100644
--- a/desktop/source/app/app.cxx
+++ b/desktop/source/app/app.cxx
@@ -102,6 +102,8 @@
#include <sys/wait.h>
#endif
+extern void VCL_DLLPUBLIC plasma_now(const char *msg);
+
#define DEFINE_CONST_UNICODE(CONSTASCII) UniString(RTL_CONSTASCII_USTRINGPARAM(CONSTASCII))
#define U2S(STRING) ::rtl::OUStringToOString(STRING, RTL_TEXTENCODING_UTF8)
@@ -1470,12 +1472,16 @@ int Desktop::Main()
ResMgr::SetReadStringHook( ReplaceStringHookProc );
+// ::plasma_now("after desktoppy bits"); - fine to here ...
+
// Startup screen
RTL_LOGFILE_CONTEXT_TRACE( aLog, "desktop (lo119109) Desktop::Main { OpenSplashScreen" );
OpenSplashScreen();
RTL_LOGFILE_CONTEXT_TRACE( aLog, "desktop (lo119109) Desktop::Main } OpenSplashScreen" );
SetSplashScreenProgress(10);
+
+// ::plasma_now("after splash open");
{
UserInstall::UserInstallError instErr_fin = UserInstall::finalize();
if ( instErr_fin != UserInstall::E_None)
@@ -1503,6 +1509,8 @@ int Desktop::Main()
{
RegisterServices( xSMgr );
+// ::plasma_now("registered services");
+
SetSplashScreenProgress(25);
#ifndef UNX
@@ -1547,6 +1555,8 @@ int Desktop::Main()
if ( !InitializeConfiguration() )
return EXIT_FAILURE;
+// ::plasma_now("init configuration");
+
SetSplashScreenProgress(30);
// set static variable to enabled/disable crash reporter
@@ -1564,6 +1574,8 @@ int Desktop::Main()
String aTitle = pLabelResMgr ? String( ResId( RID_APPTITLE, *pLabelResMgr ) ) : String();
delete pLabelResMgr;
+// ::plasma_now("after title string");
+
#ifdef DBG_UTIL
//include version ID in non product builds
::rtl::OUString aDefault(RTL_CONSTASCII_USTRINGPARAM("development"));
@@ -1580,6 +1592,8 @@ int Desktop::Main()
SetSplashScreenProgress(40);
RTL_LOGFILE_CONTEXT_TRACE( aLog, "} create SvtPathOptions and SvtLanguageOptions" );
+// ::plasma_now("unrestricted folders"); -- got this.
+
// Check special env variable
std::vector< String > aUnrestrictedFolders;
svt::getUnrestrictedFolders( aUnrestrictedFolders );
@@ -1600,6 +1614,8 @@ int Desktop::Main()
( xSMgr->createInstance(
DEFINE_CONST_UNICODE( "com.sun.star.frame.GlobalEventBroadcaster" ) ), UNO_QUERY );
+ ::plasma_now("done global event broadcaster");
+
/* ensure existance of a default window that messages can be dispatched to
This is for the benefit of testtool which uses PostUserEvent extensively
and else can deadlock while creating this window from another tread while
@@ -1607,6 +1623,7 @@ int Desktop::Main()
*/
Application::GetDefaultDevice();
+#ifndef ANDROID
// Check if bundled or shared extensions were added /removed
// and process those extensions (has to be done before checking
// the extension dependencies!
@@ -1624,6 +1641,7 @@ int Desktop::Main()
pExecGlobals->bRestartRequested = ( xRestartManager.is() && xRestartManager->isRestartRequested( sal_True ) );
Migration::migrateSettingsIfNecessary();
+#endif
// keep a language options instance...
pExecGlobals->pLanguageOptions.reset( new SvtLanguageOptions(sal_True));
@@ -1635,6 +1653,8 @@ int Desktop::Main()
pExecGlobals->xGlobalBroadcaster->notifyEvent(aEvent);
}
+ ::plasma_now("invoked OnStartupApp");
+
SetSplashScreenProgress(50);
// Backing Component
@@ -1664,6 +1684,8 @@ int Desktop::Main()
aMiscOptions.SetUseSystemFileDialog( sal_False );
}
+ ::plasma_now("nearly there !");
+
if ( !pExecGlobals->bRestartRequested )
{
if ((!rCmdLineArgs.WantsToLoadDocument() && !rCmdLineArgs.IsInvisible() && !rCmdLineArgs.IsHeadless() && !rCmdLineArgs.IsQuickstart()) &&
@@ -1733,6 +1755,8 @@ int Desktop::Main()
aOptions.SetVCLSettings();
SetSplashScreenProgress(60);
+ ::plasma_now("setup appearance !");
+
if ( !pExecGlobals->bRestartRequested )
{
Application::SetFilterHdl( LINK( this, Desktop, ImplInitFilterHdl ) );
@@ -1766,6 +1790,8 @@ int Desktop::Main()
// Release solar mutex just before we wait for our client to connect
int nAcquireCount = Application::ReleaseSolarMutex();
+ ::plasma_now("wait client connect !");
+
// Post user event to startup first application component window
// We have to send this OpenClients message short before execute() to
// minimize the risk that this message overtakes type detection contruction!!
@@ -1784,6 +1810,8 @@ int Desktop::Main()
// call Application::Execute to process messages in vcl message loop
RTL_LOGFILE_PRODUCT_TRACE( "PERFORMANCE - enter Application::Execute()" );
+ ::plasma_now("before java foo !");
+
try
{
// The JavaContext contains an interaction handler which is used when
@@ -1799,6 +1827,15 @@ int Desktop::Main()
// if this run of the office is triggered by restart, some additional actions should be done
DoRestartActionsIfNecessary( !rCmdLineArgs.IsInvisible() && !rCmdLineArgs.IsNoQuickstart() );
+ ::plasma_now("pre hit execute!");
+
+ // For some reason we're not getting a desktop frame or component [odd]
+ ErrorBox aKickStartVCL( NULL, WB_OK, rtl::OUString::createFromAscii("My very own title!") );
+ aKickStartVCL.SetText( rtl::OUString::createFromAscii("Delphic Utterance") );
+ aKickStartVCL.Show(); // don't execute - just leave it lying around ....
+
+ ::plasma_now("hit execute!");
+
Execute();
}
}
diff --git a/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx b/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx
index a8d82581d16e..f28882186ba9 100644
--- a/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx
+++ b/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx
@@ -65,7 +65,7 @@
#include "diagnostics.h"
#ifdef ANDROID
-#include <lo-bootstrap.h>
+#include <osl/detail/android-bootstrap.h>
#endif
#if defined HAVE_VALGRIND_H
diff --git a/sal/Library_lo-bootstrap.mk b/sal/Library_lo-bootstrap.mk
index 995f2077c562..6d6c0d0a7022 100644
--- a/sal/Library_lo-bootstrap.mk
+++ b/sal/Library_lo-bootstrap.mk
@@ -37,4 +37,9 @@ $(eval $(call gb_Library_add_cobjects,lo-bootstrap,\
sal/android/lo-bootstrap \
))
+$(eval $(call gb_Library_set_include,lo-bootstrap,\
+ $$(INCLUDE) \
+ -I$(realpath $(SRCDIR)/sal/inc) \
+))
+
# vim: set noet sw=4 ts=4:
diff --git a/sal/Package_inc.mk b/sal/Package_inc.mk
index e43de3e46388..304ab9d68797 100644
--- a/sal/Package_inc.mk
+++ b/sal/Package_inc.mk
@@ -65,6 +65,7 @@ $(eval $(call gb_Package_add_file,sal_inc,inc/osl/time.h,osl/time.h))
$(eval $(call gb_Package_add_file,sal_inc,inc/osl/util.h,osl/util.h))
$(eval $(call gb_Package_add_file,sal_inc,inc/osl/detail/file.h,osl/detail/file.h))
$(eval $(call gb_Package_add_file,sal_inc,inc/osl/detail/android_native_app_glue.h,osl/detail/android_native_app_glue.h))
+$(eval $(call gb_Package_add_file,sal_inc,inc/osl/detail/android-bootstrap.h,osl/detail/android-bootstrap.h))
$(eval $(call gb_Package_add_file,sal_inc,inc/rtl/allocator.hxx,rtl/allocator.hxx))
$(eval $(call gb_Package_add_file,sal_inc,inc/rtl/alloc.h,rtl/alloc.h))
$(eval $(call gb_Package_add_file,sal_inc,inc/rtl/bootstrap.h,rtl/bootstrap.h))
diff --git a/sal/android/android_native_app_glue.c b/sal/android/android_native_app_glue.c
index cf5d8e8575fd..c01db3b46e71 100644
--- a/sal/android/android_native_app_glue.c
+++ b/sal/android/android_native_app_glue.c
@@ -22,10 +22,11 @@
#include <unistd.h>
#include <sys/resource.h>
+#include "osl/detail/android-bootstrap.h"
#include "osl/detail/android_native_app_glue.h"
#include <android/log.h>
-#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "threaded_app", __VA_ARGS__))
+#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "lo-bootstrap", __VA_ARGS__))
static void free_saved_state(struct android_app* android_app) {
pthread_mutex_lock(&android_app->mutex);
@@ -143,6 +144,12 @@ void android_app_post_exec_cmd(struct android_app* android_app, int8_t cmd) {
pthread_cond_broadcast(&android_app->cond);
pthread_mutex_unlock(&android_app->mutex);
break;
+ case APP_CMD_WINDOW_REDRAW_NEEDED:
+ LOGI("APP_CMD_WINDOW_REDRAW_NEEDED - post\n");
+ pthread_mutex_lock(&android_app->mutex);
+ pthread_cond_broadcast(&android_app->cond);
+ pthread_mutex_unlock(&android_app->mutex);
+ break;
case APP_CMD_SAVE_STATE:
LOGI("APP_CMD_SAVE_STATE\n");
@@ -303,6 +310,17 @@ static void android_app_set_window(struct android_app* android_app, ANativeWindo
pthread_mutex_unlock(&android_app->mutex);
}
+static void android_app_window_redraw_needed(struct android_app* android_app, ANativeWindow* window) {
+ pthread_mutex_lock(&android_app->mutex);
+ if (window != NULL) {
+ android_app_write_cmd(android_app, APP_CMD_WINDOW_REDRAW_NEEDED);
+ }
+ while (android_app->window != android_app->pendingWindow) {
+ pthread_cond_wait(&android_app->cond, &android_app->mutex);
+ }
+ pthread_mutex_unlock(&android_app->mutex);
+}
+
static void android_app_set_activity_state(struct android_app* android_app, int8_t cmd) {
pthread_mutex_lock(&android_app->mutex);
android_app_write_cmd(android_app, cmd);
@@ -404,6 +422,11 @@ static void onNativeWindowDestroyed(ANativeActivity* activity, ANativeWindow* wi
android_app_set_window((struct android_app*)activity->instance, NULL);
}
+static void onNativeWindowRedrawNeeded(ANativeActivity* activity, ANativeWindow* window) {
+ LOGI("onNativeWindowRedrawNeeded: %p -- %p\n", activity, window);
+ android_app_window_redraw_needed((struct android_app*)activity->instance, window);
+}
+
static void onInputQueueCreated(ANativeActivity* activity, AInputQueue* queue) {
LOGI("InputQueueCreated: %p -- %p\n", activity, queue);
android_app_set_input((struct android_app*)activity->instance, queue);
@@ -428,6 +451,7 @@ __attribute__ ((visibility("default"))) void ANativeActivity_onCreate(ANativeAct
activity->callbacks->onWindowFocusChanged = onWindowFocusChanged;
activity->callbacks->onNativeWindowCreated = onNativeWindowCreated;
activity->callbacks->onNativeWindowDestroyed = onNativeWindowDestroyed;
+ activity->callbacks->onNativeWindowRedrawNeeded = onNativeWindowRedrawNeeded;
activity->callbacks->onInputQueueCreated = onInputQueueCreated;
activity->callbacks->onInputQueueDestroyed = onInputQueueDestroyed;
diff --git a/sal/android/lo-bootstrap.c b/sal/android/lo-bootstrap.c
index 3cb8d3a25300..1140515fb4f2 100644
--- a/sal/android/lo-bootstrap.c
+++ b/sal/android/lo-bootstrap.c
@@ -34,6 +34,7 @@
#include <stdlib.h>
#include <stdio.h>
#include <sys/stat.h>
+#include <sys/time.h>
#include <unistd.h>
#include <fcntl.h>
@@ -48,7 +49,7 @@
#include "uthash.h"
-#include "lo-bootstrap.h"
+#include "osl/detail/android-bootstrap.h"
#pragma GCC diagnostic ignored "-Wdeclaration-after-statement"
@@ -641,7 +642,8 @@ lo_dlneeds(const char *library)
int i, fd;
int n_needed;
char **result;
- char *shstrtab, *dynstr;
+ char *shstrtab;
+ char *dynstr = NULL;
Elf32_Ehdr hdr;
Elf32_Shdr shdr;
Elf32_Dyn dyn;
@@ -767,7 +769,8 @@ lo_dlneeds(const char *library)
}
close(fd);
- free(dynstr);
+ if (dynstr)
+ free(dynstr);
free(shstrtab);
result[n_needed] = NULL;
return result;
@@ -813,6 +816,8 @@ lo_dlopen(const char *library)
int i;
int found;
+ struct timeval tv0, tv1, tvdiff;
+
rover = loaded_libraries;
while (rover != NULL &&
strcmp(rover->name, library) != 0)
@@ -867,8 +872,13 @@ lo_dlopen(const char *library)
}
free_ptrarray((void **) needed);
+ gettimeofday(&tv0, NULL);
p = dlopen(full_name, RTLD_LOCAL);
- LOGI("dlopen(%s) = %p", full_name, p);
+ gettimeofday(&tv1, NULL);
+ timersub(&tv1, &tv0, &tvdiff);
+ LOGI("dlopen(%s) = %p, %ld.%03lds",
+ full_name, p,
+ (long) tvdiff.tv_sec, (long) tvdiff.tv_usec / 1000);
free(full_name);
if (p == NULL)
LOGE("lo_dlopen: Error from dlopen(%s): %s", library, dlerror());
@@ -950,6 +960,19 @@ lo_dladdr(void *addr,
}
__attribute__ ((visibility("default")))
+int
+lo_dlclose(void *handle)
+{
+ /* As we don't know when the reference count for a dlopened shared
+ * object drops to zero, we wouldn't know when to remove it from
+ * our list, so we can't call dlclose().
+ */
+ LOGI("lo_dlclose(%p)", handle);
+
+ return 0;
+}
+
+__attribute__ ((visibility("default")))
void *
lo_apkentry(const char *filename,
size_t *size)
@@ -1079,7 +1102,7 @@ new_stat(const char *path,
struct tm tm;
memset(statp, 0, sizeof(*statp));
- statp->st_mode = mode | S_IRUSR | S_IRGRP | S_IROTH;
+ statp->st_mode = mode | S_IRUSR;
statp->st_nlink = 1;
statp->st_uid = getuid();
@@ -1131,7 +1154,7 @@ lo_apk_lstat(const char *path,
if (*pn == '/') {
pn++;
if (!pn[0])
- return new_stat(path, statp, NULL, S_IFDIR, 1);
+ return new_stat(path, statp, NULL, S_IFDIR | S_IXUSR, 1);
}
name_size = strlen(pn);
@@ -1147,7 +1170,7 @@ lo_apk_lstat(const char *path,
if (letoh16(entry->filename_size) == name_size)
return new_stat(path, statp, entry, S_IFREG, cdir_entries - count + 1);
else
- return new_stat(path, statp, entry, S_IFDIR, cdir_entries - count + 1);
+ return new_stat(path, statp, entry, S_IFDIR | S_IXUSR, cdir_entries - count + 1);
}
errno = ENOENT;
@@ -1402,7 +1425,7 @@ extract_files(const char *prefix)
apkentry = lo_apkentry(filename, &size);
if (apkentry == NULL) {
- LOGE("extract_files: Could not find %s in .apk", newfilename);
+ LOGE("extract_files: Could not find %s in .apk", filename);
free(filename);
continue;
}
@@ -1480,8 +1503,25 @@ __attribute__ ((visibility("default")))
void
android_main(struct android_app* state)
{
+ jint nRet;
+ JNIEnv *pEnv = NULL;
struct engine engine;
Dl_info lo_main_info;
+ JavaVMAttachArgs aArgs = {
+ JNI_VERSION_1_2,
+ "LibreOfficeThread",
+ NULL
+ };
+
+ fprintf (stderr, "android_main in thread: %d\n", (int)pthread_self());
+
+ if (sleep_time != 0) {
+ LOGI("android_main: Sleeping for %d seconds, start ndk-gdb NOW if that is your intention", sleep_time);
+ sleep(sleep_time);
+ }
+
+ nRet = (*(*state->activity->vm)->AttachCurrentThreadAsDaemon)(state->activity->vm, &pEnv, &aArgs);
+ fprintf (stderr, "attach thread returned %d %p\n", nRet, pEnv);
app = state;
@@ -1493,16 +1533,12 @@ android_main(struct android_app* state)
lo_main_argv[0] = lo_main_info.dli_fname;
}
- if (sleep_time != 0)
- sleep(sleep_time);
-
patch_libgnustl_shared();
extract_files(UNPACK_TREE);
lo_main(lo_main_argc, lo_main_argv);
-
- exit(0);
+ fprintf (stderr, "exit android_main\n");
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/solenv/inc/unxandr/lo-bootstrap.h b/sal/inc/osl/detail/android-bootstrap.h
index d78d88beaaab..bd453b3475dd 100644
--- a/solenv/inc/unxandr/lo-bootstrap.h
+++ b/sal/inc/osl/detail/android-bootstrap.h
@@ -27,6 +27,8 @@
* instead of those above.
*/
+#ifndef ANDROID_BOOSTRAP_H
+#define ANDROID_BOOSTRAP_H
#if defined(ANDROID)
#include <jni.h>
@@ -49,6 +51,8 @@ void *lo_dlsym(void *handle,
int lo_dladdr(void *addr,
Dl_info *info);
+int lo_dlclose(void *handle);
+
void *lo_apkentry(const char *filename,
size_t *size);
@@ -72,6 +76,7 @@ struct android_app *lo_get_app(void);
}
#endif
-#endif
+#endif // ANDROID
+#endif // ANDROID_BOOTSTRAP_H
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sal/osl/unx/file.cxx b/sal/osl/unx/file.cxx
index 63e9775fa25e..b8a851f5a84d 100644
--- a/sal/osl/unx/file.cxx
+++ b/sal/osl/unx/file.cxx
@@ -59,7 +59,7 @@
#endif /* MACOSX */
#ifdef ANDROID
-#include <lo-bootstrap.h>
+#include <osl/detail/android-bootstrap.h>
#endif
#ifdef DEBUG_OSL_FILE
diff --git a/sal/osl/unx/file_misc.cxx b/sal/osl/unx/file_misc.cxx
index 260b711ee1da..edd4eecbead6 100644
--- a/sal/osl/unx/file_misc.cxx
+++ b/sal/osl/unx/file_misc.cxx
@@ -55,7 +55,7 @@
#include <algorithm>
#ifdef ANDROID
-#include <lo-bootstrap.h>
+#include <osl/detail/android-bootstrap.h>
#endif
/************************************************************************
@@ -774,7 +774,7 @@ static oslFileError osl_psz_removeFile( const sal_Char* pszPath )
int nRet=0;
struct stat aStat;
- nRet = lstat(pszPath,&aStat);
+ nRet = lstat_c(pszPath,&aStat);
if ( nRet < 0 )
{
nRet=errno;
@@ -1055,14 +1055,6 @@ static int oslDoCopyFile(const sal_Char* pszSourceFileName, const sal_Char* pszD
int DestFileFD=0;
int nRet=0;
-#ifdef ANDROID
- volatile int beenhere = 0;
- if (!beenhere) {
- beenhere++;
- fprintf(stderr, "Sleeping NOW, start ndk-gdb!\n");
- ::sleep(20);
- }
-#endif
if (osl_openFilePath(pszSourceFileName,
&SourceFileFH,
osl_File_OpenFlag_Read|osl_File_OpenFlag_NoLock|osl_File_OpenFlag_NoExcl) != osl_File_E_None)
diff --git a/sal/osl/unx/module.c b/sal/osl/unx/module.c
index bddf390fdcaa..b88080b31219 100644
--- a/sal/osl/unx/module.c
+++ b/sal/osl/unx/module.c
@@ -44,7 +44,7 @@
#endif
#ifdef ANDROID
-#include <lo-bootstrap.h>
+#include <osl/detail/android-bootstrap.h>
#endif
/* implemented in file.c */
@@ -237,7 +237,11 @@ void SAL_CALL osl_unloadModule(oslModule hModule)
if (hModule)
{
#ifndef NO_DL_FUNCTIONS
+#ifdef ANDROID
+ int nRet = lo_dlclose(hModule);
+#else
int nRet = dlclose(hModule);
+#endif
#if OSL_DEBUG_LEVEL > 1
if (nRet != 0)
diff --git a/sal/osl/unx/process_impl.cxx b/sal/osl/unx/process_impl.cxx
index 1582b581bf37..168b9be617ec 100644
--- a/sal/osl/unx/process_impl.cxx
+++ b/sal/osl/unx/process_impl.cxx
@@ -60,7 +60,7 @@
#include "uunxapi.h"
#ifdef ANDROID
-#include <lo-bootstrap.h>
+#include <osl/detail/android-bootstrap.h>
#endif
/***************************************
diff --git a/sal/osl/unx/security.c b/sal/osl/unx/security.c
index d73111c8afba..96605fc1739c 100644
--- a/sal/osl/unx/security.c
+++ b/sal/osl/unx/security.c
@@ -276,7 +276,7 @@ static sal_Bool SAL_CALL osl_psz_getUserName(oslSecurity Security, sal_Char* psz
{
oslSecurityImpl *pSecImpl = (oslSecurityImpl *)Security;
- if (pSecImpl == NULL)
+ if (pSecImpl == NULL || pSecImpl->m_pPasswd.pw_name == NULL)
return sal_False;
strncpy(pszName, pSecImpl->m_pPasswd.pw_name, nMax);
@@ -364,14 +364,17 @@ static sal_Bool SAL_CALL osl_psz_getHomeDir(oslSecurity Security, sal_Char* pszD
pStr = getenv("HOME");
#endif
- if ((pStr != NULL) && (strlen(pStr) > 0) &&
- (access(pStr, 0) == 0))
+ if (pStr != NULL && strlen(pStr) > 0 && access(pStr, 0) == 0)
strncpy(pszDirectory, pStr, nMax);
- else
+ else if (pSecImpl->m_pPasswd.pw_dir != NULL)
strncpy(pszDirectory, pSecImpl->m_pPasswd.pw_dir, nMax);
+ else
+ return sal_False;
}
- else
+ else if (pSecImpl->m_pPasswd.pw_dir != NULL)
strncpy(pszDirectory, pSecImpl->m_pPasswd.pw_dir, nMax);
+ else
+ return sal_False;
return sal_True;
}
@@ -403,8 +406,7 @@ static sal_Bool SAL_CALL osl_psz_getConfigDir(oslSecurity Security, sal_Char* ps
{
sal_Char *pStr = getenv("XDG_CONFIG_HOME");
- if ((pStr == NULL) || (strlen(pStr) == 0) ||
- (access(pStr, 0) != 0))
+ if (pStr == NULL || strlen(pStr) == 0 || access(pStr, 0) != 0)
{
size_t n = 0;
// a default equal to $HOME/.config should be used.
@@ -460,9 +462,9 @@ sal_Bool SAL_CALL osl_isAdministrator(oslSecurity Security)
return sal_False;
if (pSecImpl->m_pPasswd.pw_uid != 0)
- return (sal_False);
+ return sal_False;
- return (sal_True);
+ return sal_True;
}
void SAL_CALL osl_freeSecurityHandle(oslSecurity Security)
diff --git a/sal/osl/unx/thread.c b/sal/osl/unx/thread.c
index 4128d08f0d63..59a0514b322b 100644
--- a/sal/osl/unx/thread.c
+++ b/sal/osl/unx/thread.c
@@ -37,6 +37,10 @@
#include <rtl/textenc.h>
#include <rtl/alloc.h>
#include <sal/macros.h>
+#ifdef ANDROID
+#include <jni.h>
+#include <osl/detail/android-bootstrap.h>
+#endif
#if defined LINUX && ! defined __FreeBSD_kernel__
#include <sys/prctl.h>
@@ -288,8 +292,22 @@ static void* osl_thread_start_Impl (void* pData)
if (!terminate)
{
+#ifdef ANDROID
+ {
+ JNIEnv* env = 0;
+ int res = (*lo_get_javavm())->AttachCurrentThread(lo_get_javavm(), &env, NULL); // res == 0
+ fprintf (stderr, "new sal thread started and attached %d!\n", res);
+ }
+#endif
/* call worker function */
pImpl->m_WorkerFunction(pImpl->m_pData);
+
+#ifdef ANDROID
+ {
+ int res = (*lo_get_javavm())->DetachCurrentThread(lo_get_javavm());
+ fprintf (stderr, "detached finished sal thread %d!\n", res);
+ }
+#endif
}
/* call cleanup handler and leave */
diff --git a/sal/osl/unx/uunxapi.cxx b/sal/osl/unx/uunxapi.cxx
index 8abe57f3b2f7..270f5c33513a 100644
--- a/sal/osl/unx/uunxapi.cxx
+++ b/sal/osl/unx/uunxapi.cxx
@@ -48,7 +48,7 @@
#endif
#ifdef ANDROID
- #include <lo-bootstrap.h>
+ #include <osl/detail/android-bootstrap.h>
#endif
//###########################
diff --git a/sc/qa/unit/filters-test.cxx b/sc/qa/unit/filters-test.cxx
index 4e40f57f521a..bf1cb7281b48 100644
--- a/sc/qa/unit/filters-test.cxx
+++ b/sc/qa/unit/filters-test.cxx
@@ -299,9 +299,11 @@ void ScFiltersTest::testRangeNameODS()
{
const rtl::OUString aFileNameBase(RTL_CONSTASCII_USTRINGPARAM("named-ranges-global."));
ScDocShellRef xDocSh = loadDoc(aFileNameBase, 1);
- xDocSh->DoHardRecalc(true);
CPPUNIT_ASSERT_MESSAGE("Failed to load named-ranges-globals.*", xDocSh.Is());
+
+ xDocSh->DoHardRecalc(true);
+
ScDocument* pDoc = xDocSh->GetDocument();
testRangeNameImpl(pDoc);
diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk
index e6da489417f3..c21a3d4de6b2 100644
--- a/vcl/Library_vcl.mk
+++ b/vcl/Library_vcl.mk
@@ -438,6 +438,7 @@ ifeq ($(GUIBASE),android)
$(eval $(call gb_Library_add_libs,vcl,\
-llog \
-landroid \
+ -lEGL -lGLESv1_CM \
-llo-bootstrap \
))
$(eval $(call gb_Library_add_defs,vcl,\
diff --git a/vcl/Module_vcl.mk b/vcl/Module_vcl.mk
index 47da575b960c..0a91f8795cc8 100644
--- a/vcl/Module_vcl.mk
+++ b/vcl/Module_vcl.mk
@@ -79,10 +79,4 @@ $(eval $(call gb_Module_add_targets,vcl,\
))
endif
-ifeq ($(GUIBASE),android)
-$(eval $(call gb_Module_add_targets,vcl,\
- Library_vclplug_svp \
-))
-endif
-
# vim: set noet sw=4 ts=4:
diff --git a/vcl/android/androidinst.cxx b/vcl/android/androidinst.cxx
index a7721438e8c3..16a512551c33 100644
--- a/vcl/android/androidinst.cxx
+++ b/vcl/android/androidinst.cxx
@@ -29,18 +29,520 @@
#include <android/androidinst.hxx>
#include <headless/svpdummies.hxx>
#include <generic/gendata.hxx>
+#include <jni.h>
#include <android/log.h>
#include <android/looper.h>
-#include <lo-bootstrap.h>
+#include <osl/detail/android-bootstrap.h>
#include <osl/detail/android_native_app_glue.h>
+#include <rtl/strbuf.hxx>
+
+extern void VCL_DLLPUBLIC plasma_now(const char *msg);
+
+void plasma_now(const char *msg)
+{
+ fprintf (stderr, "Skipped plasma '%s' !\n", msg);
+}
+
+class AndroidSalData : public SalGenericData
+{
+public:
+ AndroidSalData( SalInstance *pInstance ) : SalGenericData( SAL_DATA_ANDROID, pInstance ) {}
+ virtual void ErrorTrapPush() {}
+ virtual bool ErrorTrapPop( bool ) { return false; }
+};
+
+static rtl::OString MotionEdgeFlagsToString(int32_t nFlags)
+{
+ rtl::OStringBuffer aStr;
+ if (nFlags == AMOTION_EVENT_EDGE_FLAG_NONE)
+ aStr.append ("no-edge");
+ if (nFlags & AMOTION_EVENT_EDGE_FLAG_TOP)
+ aStr.append (":top");
+ if (nFlags & AMOTION_EVENT_EDGE_FLAG_BOTTOM)
+ aStr.append (":bottom");
+ if (nFlags & AMOTION_EVENT_EDGE_FLAG_LEFT)
+ aStr.append (":left");
+ if (nFlags & AMOTION_EVENT_EDGE_FLAG_RIGHT)
+ aStr.append (":right");
+ return aStr.makeStringAndClear();
+}
+
+static rtl::OString KeyMetaStateToString(int32_t nFlags)
+{
+ rtl::OStringBuffer aStr;
+ if (nFlags == AMETA_NONE)
+ aStr.append ("no-meta");
+ if (nFlags & AMETA_ALT_ON)
+ aStr.append (":alt");
+ if (nFlags & AMETA_SHIFT_ON)
+ aStr.append (":shift");
+ if (nFlags & AMETA_SYM_ON)
+ aStr.append (":sym");
+ return aStr.makeStringAndClear();
+}
+
+static sal_uInt16 KeyMetaStateToCode(AInputEvent *event)
+{
+ sal_uInt16 nCode = 0;
+ int32_t nFlags = AKeyEvent_getMetaState(event);
+ if (nFlags & AMETA_SHIFT_ON)
+ nCode |= KEY_SHIFT;
+ if (nFlags & AMETA_SYM_ON)
+ nCode |= KEY_MOD1;
+ if (nFlags & AMETA_ALT_ON)
+ nCode |= KEY_MOD2;
+ return nCode;
+}
+
+static sal_uInt16 KeyToCode(AInputEvent *event)
+{
+ sal_uInt16 nCode = 0;
+ switch (AKeyEvent_getKeyCode(event)) {
+#define MAP(a,b) \
+ case AKEYCODE_##a: nCode = KEY_##b; break
+#define MAP_SAME(a) MAP(a,a)
+
+ MAP_SAME(HOME);
+ MAP_SAME(0); MAP_SAME(1); MAP_SAME(2); MAP_SAME(3); MAP_SAME(4);
+ MAP_SAME(5); MAP_SAME(6); MAP_SAME(7); MAP_SAME(8); MAP_SAME(9);
+
+ MAP_SAME(A); MAP_SAME(B); MAP_SAME(C); MAP_SAME(D);
+ MAP_SAME(E); MAP_SAME(F); MAP_SAME(G); MAP_SAME(H);
+ MAP_SAME(I); MAP_SAME(J); MAP_SAME(K); MAP_SAME(L);
+ MAP_SAME(M); MAP_SAME(N); MAP_SAME(O); MAP_SAME(P);
+ MAP_SAME(Q); MAP_SAME(R); MAP_SAME(S); MAP_SAME(T);
+ MAP_SAME(U); MAP_SAME(V); MAP_SAME(W); MAP_SAME(X);
+ MAP_SAME(Y); MAP_SAME(Z);
+
+ MAP_SAME(TAB); MAP_SAME(SPACE); MAP_SAME(COMMA);
+
+ MAP(ENTER,RETURN);
+ MAP(PAGE_UP, PAGEUP);
+ MAP(PAGE_DOWN, PAGEDOWN);
+ MAP(DEL, DELETE);
+ MAP(PERIOD, POINT);
+
+ case AKEYCODE_BACK: // escape ?
+ case AKEYCODE_UNKNOWN:
+ case AKEYCODE_SOFT_LEFT:
+ case AKEYCODE_SOFT_RIGHT:
+ case AKEYCODE_CALL:
+ case AKEYCODE_ENDCALL:
+ case AKEYCODE_STAR:
+ case AKEYCODE_POUND:
+ case AKEYCODE_DPAD_UP:
+ case AKEYCODE_DPAD_DOWN:
+ case AKEYCODE_DPAD_LEFT:
+ case AKEYCODE_DPAD_RIGHT:
+ case AKEYCODE_DPAD_CENTER:
+ case AKEYCODE_VOLUME_UP:
+ case AKEYCODE_VOLUME_DOWN:
+ case AKEYCODE_POWER:
+ case AKEYCODE_CAMERA:
+ case AKEYCODE_CLEAR:
+ case AKEYCODE_ALT_LEFT:
+ case AKEYCODE_ALT_RIGHT:
+ case AKEYCODE_SHIFT_LEFT:
+ case AKEYCODE_SHIFT_RIGHT:
+ case AKEYCODE_SYM:
+ case AKEYCODE_EXPLORER:
+ case AKEYCODE_ENVELOPE:
+ case AKEYCODE_GRAVE:
+ case AKEYCODE_MINUS:
+ case AKEYCODE_EQUALS:
+ case AKEYCODE_LEFT_BRACKET:
+ case AKEYCODE_RIGHT_BRACKET:
+ case AKEYCODE_BACKSLASH:
+ case AKEYCODE_SEMICOLON:
+ case AKEYCODE_APOSTROPHE:
+ case AKEYCODE_SLASH:
+ case AKEYCODE_AT:
+ case AKEYCODE_NUM:
+ case AKEYCODE_HEADSETHOOK:
+ case AKEYCODE_FOCUS: // not widget, but camera focus
+ case AKEYCODE_PLUS:
+ case AKEYCODE_MENU:
+ case AKEYCODE_NOTIFICATION:
+ case AKEYCODE_SEARCH:
+ case AKEYCODE_MEDIA_PLAY_PAUSE:
+ case AKEYCODE_MEDIA_STOP:
+ case AKEYCODE_MEDIA_NEXT:
+ case AKEYCODE_MEDIA_PREVIOUS:
+ case AKEYCODE_MEDIA_REWIND:
+ case AKEYCODE_MEDIA_FAST_FORWARD:
+ case AKEYCODE_MUTE:
+ case AKEYCODE_PICTSYMBOLS:
+ case AKEYCODE_SWITCH_CHARSET:
+ case AKEYCODE_BUTTON_A:
+ case AKEYCODE_BUTTON_B:
+ case AKEYCODE_BUTTON_C:
+ case AKEYCODE_BUTTON_X:
+ case AKEYCODE_BUTTON_Y:
+ case AKEYCODE_BUTTON_Z:
+ case AKEYCODE_BUTTON_L1:
+ case AKEYCODE_BUTTON_R1:
+ case AKEYCODE_BUTTON_L2:
+ case AKEYCODE_BUTTON_R2:
+ case AKEYCODE_BUTTON_THUMBL:
+ case AKEYCODE_BUTTON_THUMBR:
+ case AKEYCODE_BUTTON_START:
+ case AKEYCODE_BUTTON_SELECT:
+ case AKEYCODE_BUTTON_MODE:
+ fprintf (stderr, "un-mapped keycode %d\n", nCode);
+ nCode = 0;
+ break;
+#undef MAP_SAME
+#undef MAP
+ }
+ fprintf (stderr, "mapped %d -> %d\n", AKeyEvent_getKeyCode(event), nCode);
+ return nCode;
+}
+
+static void BlitFrameRegionToWindow(ANativeWindow_Buffer *pOutBuffer,
+ const basebmp::BitmapDeviceSharedPtr& aDev,
+ const ARect &rSrcRect,
+ int nDestX, int nDestY)
+{
+ fprintf (stderr, "Blit frame #2 src %d,%d->%d,%d to position %d, %d\n",
+ rSrcRect.left, rSrcRect.top, rSrcRect.right, rSrcRect.bottom,
+ nDestX, nDestY);
+
+ basebmp::RawMemorySharedArray aSrcData = aDev->getBuffer();
+ basegfx::B2IVector aDevSize = aDev->getSize();
+ sal_Int32 nStride = aDev->getScanlineStride();
+ unsigned char *pSrc = aSrcData.get();
+
+ // FIXME: do some cropping goodness on aSrcRect to ensure no overflows etc.
+ ARect aSrcRect = rSrcRect;
+
+ // FIXME: we have WINDOW_FORMAT_RGB_565 = 4 ...
+
+ for (unsigned int y = 0; y < (unsigned int)(aSrcRect.bottom - aSrcRect.top); y++)
+ {
+ unsigned char *sp = ( pSrc + nStride * (aSrcRect.bottom - aSrcRect.top - y - 1) +
+ aSrcRect.left * 3 /* src pixel size */ );
+
+ switch (pOutBuffer->format) {
+ case WINDOW_FORMAT_RGBA_8888:
+ case WINDOW_FORMAT_RGBX_8888:
+ {
+ unsigned char *dp = ( (unsigned char *)pOutBuffer->bits +
+ pOutBuffer->stride * 4 * (y + nDestY) +
+ nDestX * 4 /* dest pixel size */ );
+ for (unsigned int x = 0; x < (unsigned int)(aSrcRect.right - aSrcRect.left); x++)
+ {
+ dp[x*4 + 0] = sp[x*3 + 2]; // R
+ dp[x*4 + 1] = sp[x*3 + 1]; // G
+ dp[x*4 + 2] = sp[x*3 + 0]; // B
+ dp[x*4 + 3] = 255; // A
+ }
+ break;
+ }
+ case WINDOW_FORMAT_RGB_565:
+ {
+ unsigned char *dp = ( (unsigned char *)pOutBuffer->bits +
+ pOutBuffer->stride * 2 * (y + nDestY) +
+ nDestX * 2 /* dest pixel size */ );
+ for (unsigned int x = 0; x < (unsigned int)(aSrcRect.right - aSrcRect.left); x++)
+ {
+ unsigned char b = sp[x*3 + 0]; // B
+ unsigned char g = sp[x*3 + 1]; // G
+ unsigned char r = sp[x*3 + 2]; // R
+ dp[x*2 + 0] = (r & 0xf8) | (g >> 5);
+ dp[x*2 + 1] = ((g & 0x1c) << 5) | ((b & 0xf8) >> 3);
+ }
+ break;
+ }
+ default:
+ fprintf (stderr, "unknown pixel format %d !\n", pOutBuffer->format);
+ break;
+ }
+ }
+ fprintf (stderr, "done blit!\n");
+}
+
+void AndroidSalInstance::BlitFrameToWindow(ANativeWindow_Buffer *pOutBuffer,
+ const basebmp::BitmapDeviceSharedPtr& aDev)
+{
+ basegfx::B2IVector aDevSize = aDev->getSize();
+ ARect aWhole = { 0, 0, aDevSize.getX(), aDevSize.getY() };
+ BlitFrameRegionToWindow(pOutBuffer, aDev, aWhole, 0, 0);
+}
+
+void AndroidSalInstance::RedrawWindows(ANativeWindow *pWindow)
+{
+ if (!pWindow)
+ return;
+
+ ANativeWindow_Buffer aOutBuffer;
+ memset ((void *)&aOutBuffer, 0, sizeof (aOutBuffer));
+
+// ARect aRect;
+ fprintf (stderr, "pre lock #3\n");
+ int32_t nRet = ANativeWindow_lock(pWindow, &aOutBuffer, NULL);
+ fprintf (stderr, "locked window %d returned " // rect: %d,%d->%d,%d "
+ "buffer: %dx%d stride %d, format %d, bits %p\n",
+ nRet, // aRect.left, aRect.top, aRect.right, aRect.bottom,
+ aOutBuffer.width, aOutBuffer.height, aOutBuffer.stride,
+ aOutBuffer.format, aOutBuffer.bits);
+ if (aOutBuffer.bits != NULL)
+ {
+
+#if 1 // pre-'clean' the buffer with cruft:
+ // hard-code / guess at a format ...
+ int32_t *p = (int32_t *)aOutBuffer.bits;
+ for (int32_t y = 0; y < aOutBuffer.height; y++)
+ {
+ for (int32_t x = 0; x < aOutBuffer.stride; x++)
+ *p++ = (y << 24) + (x << 10) + 0xff ;
+ }
+#endif
+
+ std::list< SalFrame* >::const_iterator it;
+ for ( it = getFrames().begin(); it != getFrames().end(); it++ )
+ {
+ SvpSalFrame *pFrame = static_cast<SvpSalFrame *>(*it);
+
+ if (pFrame->IsVisible())
+ {
+ // FIXME: force a re-draw - this appears not to happen much otherwis
+ pFrame->PostPaint(true);
+ BlitFrameToWindow (&aOutBuffer, pFrame->getDevice());
+ }
+ else // Sucky the frame is invisible - why !?
+ fprintf (stderr, "invisible frame\n");
+ }
+ }
+ else
+ fprintf (stderr, "no buffer for locked window\n");
+ ANativeWindow_unlockAndPost(pWindow);
+
+ fprintf (stderr, "done render!\n");
+ mbQueueReDraw = false;
+}
+
+static const char *app_cmd_name(int cmd)
+{
+ switch (cmd) {
+ case APP_CMD_INPUT_CHANGED: return "INPUT_CHANGED";
+ case APP_CMD_INIT_WINDOW: return "INIT_WINDOW";
+ case APP_CMD_TERM_WINDOW: return "TERM_WINDOW";
+ case APP_CMD_WINDOW_RESIZED: return "WINDOW_RESIZED";
+ case APP_CMD_WINDOW_REDRAW_NEEDED: return "WINDOW_REDRAW_NEEDED";
+ case APP_CMD_CONTENT_RECT_CHANGED: return "CONTENT_RECT_CHANGED";
+ case APP_CMD_GAINED_FOCUS: return "GAINED_FOCUS";
+ case APP_CMD_LOST_FOCUS: return "LOST_FOCUS";
+ case APP_CMD_CONFIG_CHANGED: return "CONFIG_CHANGED";
+ case APP_CMD_LOW_MEMORY: return "LOW_MEMORY";
+ case APP_CMD_START: return "START";
+ case APP_CMD_RESUME: return "RESUME";
+ case APP_CMD_SAVE_STATE: return "SAVE_STATE";
+ case APP_CMD_PAUSE: return "PAUSE";
+ case APP_CMD_STOP: return "STOP";
+ case APP_CMD_DESTROY: return "DESTROY";
+ default:
+ static char buf[10];
+ sprintf(buf, "%d", cmd);
+ return buf;
+ }
+}
+
+void AndroidSalInstance::GetWorkArea( Rectangle& rRect )
+{
+ ANativeWindow *pWindow = mpApp->window;
+ if (!pWindow)
+ rRect = Rectangle( Point( 0, 0 ),
+ Size( 800, 600 ) );
+ else
+ rRect = Rectangle( Point( 0, 0 ),
+ Size( ANativeWindow_getWidth( pWindow ),
+ ANativeWindow_getHeight( pWindow ) ) );
+}
+
+void AndroidSalInstance::onAppCmd (struct android_app* app, int32_t cmd)
+{
+ fprintf (stderr, "app cmd for app %p: %s\n", app, app_cmd_name(cmd));
+ ANativeWindow *pWindow = mpApp->window;
+ switch (cmd) {
+ case APP_CMD_INIT_WINDOW:
+ {
+ ARect aRect = { 0, 0, 0, 0 };
+ aRect.right = ANativeWindow_getWidth(pWindow);
+ aRect.bottom = ANativeWindow_getHeight(pWindow);
+ int nRet = ANativeWindow_setBuffersGeometry(
+ pWindow, ANativeWindow_getWidth(pWindow),
+ ANativeWindow_getHeight(pWindow),
+ WINDOW_FORMAT_RGBA_8888);
+ fprintf (stderr, "we have an app window ! %p %dx%x (%d) set %d\n",
+ pWindow, aRect.right, aRect.bottom,
+ ANativeWindow_getFormat(pWindow), nRet);
+ break;
+ }
+ case APP_CMD_WINDOW_RESIZED:
+ {
+ ARect aRect = { 0, 0, 0, 0 };
+ aRect.right = ANativeWindow_getWidth(pWindow);
+ aRect.bottom = ANativeWindow_getHeight(pWindow);
+ fprintf (stderr, "app window resized to ! %p %dx%x (%d)\n",
+ pWindow, aRect.right, aRect.bottom,
+ ANativeWindow_getFormat(pWindow));
+ break;
+ }
+
+ case APP_CMD_WINDOW_REDRAW_NEEDED:
+ {
+ fprintf (stderr, "redraw needed\n");
+ mbQueueReDraw = true;
+ break;
+ }
+
+ case APP_CMD_CONTENT_RECT_CHANGED:
+ {
+ ARect aRect = mpApp->contentRect;
+ fprintf (stderr, "content rect changed [ k/b popped up etc. ] %d,%d->%d,%d\n",
+ aRect.left, aRect.top, aRect.right, aRect.bottom);
+ break;
+ }
+ default:
+ fprintf (stderr, "unhandled app cmd %d\n", cmd);
+ break;
+ }
+}
+
+int32_t AndroidSalInstance::onInputEvent (struct android_app* app, AInputEvent* event)
+{
+ bool bHandled = false;
+ fprintf (stderr, "input event for app %p, event %p type %d source %d device id %d\n",
+ app, event,
+ AInputEvent_getType(event),
+ AInputEvent_getSource(event),
+ AInputEvent_getDeviceId(event));
+
+ switch (AInputEvent_getType(event))
+ {
+ case AINPUT_EVENT_TYPE_KEY:
+ {
+ int32_t nAction = AKeyEvent_getAction(event);
+ fprintf (stderr, "key event keycode %d '%s' %s\n",
+ AKeyEvent_getKeyCode(event),
+ nAction == AKEY_EVENT_ACTION_DOWN ? "down" :
+ nAction == AKEY_EVENT_ACTION_UP ? "up" : "multiple",
+ KeyMetaStateToString(AKeyEvent_getMetaState(event)).getStr());
+
+ // FIXME: the whole SALEVENT_KEYMODCHANGE stuff is going to be interesting
+ // can we really emit that ? no input method madness required though.
+ sal_uInt16 nEvent;
+ SalKeyEvent aEvent;
+ int64_t nNsTime = AKeyEvent_getEventTime(event);
+
+ nEvent = (AKeyEvent_getAction(event) == AKEY_EVENT_ACTION_UP ?
+ SALEVENT_KEYUP : SALEVENT_KEYINPUT);
+ aEvent.mnTime = nNsTime / (1000 * 1000);
+ aEvent.mnCode = KeyToCode(event);
+ aEvent.mnCode |= KeyMetaStateToCode(event);
+ aEvent.mnCharCode = 'a'; // the unicode of it all ...
+ aEvent.mnRepeat = AKeyEvent_getRepeatCount(event);
+
+ SalFrame *pFocus = SvpSalFrame::GetFocusFrame();
+ if (pFocus)
+ bHandled = pFocus->CallCallback( nEvent, &aEvent );
+ else
+ fprintf (stderr, "no focused frame to emit event on\n");
+
+ fprintf( stderr, "bHandled == %s\n", bHandled? "true": "false" );
+
+ // FIXME: queueing full re-draw on key events ...
+ mbQueueReDraw = true;
+ break;
+ }
+ case AINPUT_EVENT_TYPE_MOTION:
+ {
+ size_t nPoints = AMotionEvent_getPointerCount(event);
+ fprintf (stderr, "motion event %d %g,%g %d points: %s\n",
+ AMotionEvent_getAction(event),
+ AMotionEvent_getXOffset(event),
+ AMotionEvent_getYOffset(event),
+ (int)nPoints,
+ MotionEdgeFlagsToString(AMotionEvent_getEdgeFlags(event)).getStr());
+ for (size_t i = 0; i < nPoints; i++)
+ fprintf(stderr, "\t%d: %g,%g - pressure %g\n",
+ (int)i,
+ AMotionEvent_getX(event, i),
+ AMotionEvent_getY(event, i),
+ AMotionEvent_getPressure(event, i));
+
+ SalMouseEvent aMouseEvent;
+ sal_uInt16 nEvent = 0;
+
+ // FIXME: all this filing the nEvent and aMouseEvent has to be cleaned up
+ nEvent = AMotionEvent_getAction(event)? SALEVENT_MOUSEBUTTONUP: SALEVENT_MOUSEBUTTONDOWN;
+
+ aMouseEvent.mnX = AMotionEvent_getXOffset(event);
+ aMouseEvent.mnY = AMotionEvent_getYOffset(event);
+ aMouseEvent.mnTime = 0; // FIXME
+ aMouseEvent.mnCode = 0; // FIXME
+ aMouseEvent.mnButton = MOUSE_LEFT; // FIXME
+
+ SalFrame *pFocus = SvpSalFrame::GetFocusFrame();
+ if (pFocus)
+ bHandled = pFocus->CallCallback( nEvent, &aMouseEvent );
+ else
+ fprintf (stderr, "no focused frame to emit event on\n");
+
+ fprintf( stderr, "bHandled == %s\n", bHandled? "true": "false" );
+
+ break;
+ }
+ default:
+ fprintf (stderr, "unknown input event type %p %d\n",
+ event, AInputEvent_getType(event));
+ break;
+ }
+ return bHandled ? 1 : 0;
+}
+
+AndroidSalInstance *AndroidSalInstance::getInstance()
+{
+ if (!ImplGetSVData())
+ return NULL;
+ AndroidSalData *pData = static_cast<AndroidSalData *>(ImplGetSVData()->mpSalData);
+ if (!pData)
+ return NULL;
+ return static_cast<AndroidSalInstance *>(pData->m_pInstance);
+}
+
+extern "C" {
+ void onAppCmd_cb (struct android_app *app, int32_t cmd)
+ {
+ AndroidSalInstance::getInstance()->onAppCmd(app, cmd);
+ }
+
+ int32_t onInputEvent_cb (struct android_app *app, AInputEvent *event)
+ {
+ return AndroidSalInstance::getInstance()->onInputEvent(app, event);
+ }
+}
AndroidSalInstance::AndroidSalInstance( SalYieldMutex *pMutex )
: SvpSalInstance( pMutex )
+ , mpApp( NULL )
+ , mbQueueReDraw( false )
+ , mxDisplay( EGL_NO_DISPLAY )
+ , mxSurface( EGL_NO_SURFACE )
+ , mxContext( EGL_NO_CONTEXT )
{
- app = lo_get_app();
- fprintf (stderr, "created Android Sal Instance for app %p window %p\n",
- app,
- app ? app->window : NULL);
+ mpApp = lo_get_app();
+ fprintf (stderr, "created Android Sal Instance for app %p window %p thread: %d\n",
+ mpApp,
+ mpApp ? mpApp->window : NULL,
+ (int)pthread_self());
+ if (mpApp)
+ {
+ pthread_mutex_lock (&mpApp->mutex);
+ mpApp->onAppCmd = onAppCmd_cb;
+ mpApp->onInputEvent = onInputEvent_cb;
+ pthread_mutex_unlock (&mpApp->mutex);
+ }
}
AndroidSalInstance::~AndroidSalInstance()
@@ -50,8 +552,9 @@ AndroidSalInstance::~AndroidSalInstance()
void AndroidSalInstance::Wakeup()
{
- if (app && app->looper)
- ALooper_wake (app->looper);
+ fprintf (stderr, "Wakeup alooper\n");
+ if (mpApp && mpApp->looper)
+ ALooper_wake (mpApp->looper);
else
fprintf (stderr, "busted - no global looper\n");
}
@@ -61,20 +564,40 @@ void AndroidSalInstance::DoReleaseYield (int nTimeoutMS)
// release yield mutex
sal_uLong nAcquireCount = ReleaseYieldMutex();
- fprintf (stderr, "DoReleaseYield for %d ms\n", nTimeoutMS);
-// int ALooper_pollOnce(timeoutMs, int* outFd, int* outEvents, void** outData);
+ fprintf (stderr, "DoReleaseYield #3 %d thread: %d ms\n",
+ nTimeoutMS, (int)pthread_self());
+
+ struct android_poll_source *pSource = NULL;
+ int outFd = 0, outEvents = 0;
+
+ if (mbQueueReDraw)
+ nTimeoutMS = 0;
+
+ int nRet;
+ nRet = ALooper_pollAll (nTimeoutMS, &outFd, &outEvents, (void**)&pSource);
+ fprintf (stderr, "ret #6 %d %d %d %p\n", nRet, outFd, outEvents, pSource);
// acquire yield mutex again
AcquireYieldMutex(nAcquireCount);
+
+ if (nRet >= 0)
+ {
+ // Process this event.
+ if (pSource != NULL)
+ pSource->process(mpApp, pSource);
+ }
+
+ if (mbQueueReDraw && mpApp->window)
+ AndroidSalInstance::getInstance()->RedrawWindows (mpApp->window);
}
bool AndroidSalInstance::AnyInput( sal_uInt16 nType )
{
- (void) nType;
- // FIXME: ideally we should check the input queue to avoid being busy ...
- fprintf (stderr, "FIXME: AnyInput returns true\n");
- // app->inputQueue ? ...
- return true;
+ if( (nType & VCL_INPUT_TIMER) != 0 )
+ return CheckTimeout( false );
+ // FIXME: ideally we should check our input queue here ...
+ fprintf (stderr, "FIXME: AnyInput returns false\n");
+ return false;
}
class AndroidSalSystem : public SvpSalSystem {
@@ -84,14 +607,7 @@ public:
virtual int ShowNativeDialog( const rtl::OUString& rTitle,
const rtl::OUString& rMessage,
const std::list< rtl::OUString >& rButtons,
- int nDefButton )
- {
- (void)rButtons; (void)nDefButton;
- __android_log_print(ANDROID_LOG_INFO, "LibreOffice - dialog '%s': '%s'",
- rtl::OUStringToOString(rTitle, RTL_TEXTENCODING_ASCII_US).getStr(),
- rtl::OUStringToOString(rMessage, RTL_TEXTENCODING_ASCII_US).getStr());
- return 0;
- }
+ int nDefButton );
};
SalSystem *AndroidSalInstance::CreateSalSystem()
@@ -99,14 +615,66 @@ SalSystem *AndroidSalInstance::CreateSalSystem()
return new AndroidSalSystem();
}
-class AndroidSalData : public SalGenericData
+class AndroidSalFrame : public SvpSalFrame
{
public:
- AndroidSalData( SalInstance *pInstance ) : SalGenericData( SAL_DATA_ANDROID, pInstance ) {}
- virtual void ErrorTrapPush() {}
- virtual bool ErrorTrapPop( bool ) { return false; }
+ AndroidSalFrame( AndroidSalInstance *pInstance,
+ SalFrame *pParent,
+ sal_uLong nSalFrameStyle,
+ SystemParentData *pSysParent )
+ : SvpSalFrame( pInstance, pParent, nSalFrameStyle, pSysParent )
+ {
+ }
+
+ virtual void GetWorkArea( Rectangle& rRect )
+ {
+ AndroidSalInstance::getInstance()->GetWorkArea( rRect );
+ }
+
+ virtual void UpdateSettings( AllSettings &rSettings )
+ {
+ // Clobber the UI fonts
+#if 0
+ psp::FastPrintFontInfo aInfo;
+ aInfo.m_aFamilyName = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Roboto" ) );
+ aInfo.m_eItalic = ITALIC_NORMAL;
+ aInfo.m_eWeight = WEIGHT_NORMAL;
+ aInfo.m_eWidth = WIDTH_NORMAL;
+ psp::PrintFontManager::get().matchFont( aInfo, rSettings.GetUILocale() );
+#endif
+
+ // FIXME: is 12 point enough ?
+ Font aFont( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Roboto" ) ),
+ Size( 0, 14 ) );
+
+ StyleSettings aStyleSet = rSettings.GetStyleSettings();
+ aStyleSet.SetAppFont( aFont );
+ aStyleSet.SetHelpFont( aFont );
+ aStyleSet.SetMenuFont( aFont );
+ aStyleSet.SetToolFont( aFont );
+ aStyleSet.SetLabelFont( aFont );
+ aStyleSet.SetInfoFont( aFont );
+ aStyleSet.SetRadioCheckFont( aFont );
+ aStyleSet.SetPushButtonFont( aFont );
+ aStyleSet.SetFieldFont( aFont );
+ aStyleSet.SetIconFont( aFont );
+ aStyleSet.SetGroupFont( aFont );
+
+ rSettings.SetStyleSettings( aStyleSet );
+ }
};
+SalFrame *AndroidSalInstance::CreateChildFrame( SystemParentData* pParent, sal_uLong nStyle )
+{
+ return new AndroidSalFrame( this, NULL, nStyle, pParent );
+}
+
+SalFrame *AndroidSalInstance::CreateFrame( SalFrame* pParent, sal_uLong nStyle )
+{
+ return new AndroidSalFrame( this, pParent, nStyle, NULL );
+}
+
+
// All the interesting stuff is slaved from the AndroidSalInstance
void InitSalData() {}
void DeInitSalData() {}
@@ -120,7 +688,7 @@ void SalAbort( const rtl::OUString& rErrorText, bool bDumpCore )
aError = rtl::OUString::createFromAscii("Unknown application error");
::fprintf( stderr, "%s\n", rtl::OUStringToOString(rErrorText, osl_getThreadTextEncoding()).getStr() );
- __android_log_print(ANDROID_LOG_INFO, "SalAbort: '%s'",
+ __android_log_print(ANDROID_LOG_INFO, "LibreOffice", "SalAbort: '%s'",
rtl::OUStringToOString(aError, RTL_TEXTENCODING_ASCII_US).getStr());
if( bDumpCore )
abort();
@@ -148,6 +716,7 @@ SalData::~SalData()
// This is our main entry point:
SalInstance *CreateSalInstance()
{
+ fprintf (stderr, "Android: CreateSalInstance!\n");
AndroidSalInstance* pInstance = new AndroidSalInstance( new SalYieldMutex() );
new AndroidSalData( pInstance );
return pInstance;
@@ -159,4 +728,39 @@ void DestroySalInstance( SalInstance *pInst )
delete pInst;
}
+#include <vcl/msgbox.hxx>
+
+int AndroidSalSystem::ShowNativeDialog( const rtl::OUString& rTitle,
+ const rtl::OUString& rMessage,
+ const std::list< rtl::OUString >& rButtons,
+ int nDefButton )
+{
+ (void)rButtons; (void)nDefButton;
+ fprintf (stderr, "LibreOffice native dialog '%s': '%s'\n",
+ rtl::OUStringToOString(rTitle, RTL_TEXTENCODING_ASCII_US).getStr(),
+ rtl::OUStringToOString(rMessage, RTL_TEXTENCODING_ASCII_US).getStr());
+ __android_log_print(ANDROID_LOG_INFO, "LibreOffice", "Dialog '%s': '%s'",
+ rtl::OUStringToOString(rTitle, RTL_TEXTENCODING_ASCII_US).getStr(),
+ rtl::OUStringToOString(rMessage, RTL_TEXTENCODING_ASCII_US).getStr());
+
+ if (AndroidSalInstance::getInstance() != NULL)
+ {
+ // Does Android have a native dialog ? if not,. we have to do this ...
+
+ // Of course it has. android.app.AlertDialog seems like a good
+ // choice, it even has one, two or three buttons. Naturally,
+ // it intended to be used from Java, so some verbose JNI
+ // horror would be needed to use it directly here. Probably we
+ // want some easier to use magic wrapper, hmm.
+
+ ErrorBox aVclErrBox( NULL, WB_OK, rTitle );
+ aVclErrBox.SetText( rMessage );
+ aVclErrBox.Execute();
+ }
+ else
+ fprintf (stderr, "VCL not initialized\n");
+ return 0;
+}
+
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/headless/svpframe.cxx b/vcl/headless/svpframe.cxx
index 68fe8e1f3f6b..a8486b040406 100644
--- a/vcl/headless/svpframe.cxx
+++ b/vcl/headless/svpframe.cxx
@@ -150,11 +150,12 @@ sal_Bool SvpSalFrame::PostEvent( void* pData )
return sal_True;
}
-void SvpSalFrame::PostPaint() const
+void SvpSalFrame::PostPaint(bool bImmediate) const
{
if( m_bVisible )
{
SalPaintEvent aPEvt(0, 0, maGeometry.nWidth, maGeometry.nHeight);
+ aPEvt.mbImmediateUpdate = bImmediate;
CallCallback( SALEVENT_PAINT, &aPEvt );
}
}
diff --git a/vcl/headless/svpinst.cxx b/vcl/headless/svpinst.cxx
index 56ea818af6bc..e330dcbc469d 100644
--- a/vcl/headless/svpinst.cxx
+++ b/vcl/headless/svpinst.cxx
@@ -301,7 +301,7 @@ void SvpSalInstance::Yield( bool bWait, bool bHandleAllCurrentEvents )
{
// this would be a good time to post a paint
const SvpSalFrame* pSvpFrame = static_cast<const SvpSalFrame*>(it->m_pFrame);
- pSvpFrame->PostPaint();
+ pSvpFrame->PostPaint(false);
}
}
}
diff --git a/vcl/inc/android/androidinst.hxx b/vcl/inc/android/androidinst.hxx
index 3b026b0d9357..10d17c53b8b5 100644
--- a/vcl/inc/android/androidinst.hxx
+++ b/vcl/inc/android/androidinst.hxx
@@ -30,22 +30,49 @@
#ifndef ANDROID_SALINST_H
#define ANDROID_SALINST_H
+#include <EGL/egl.h>
+#include <GLES/gl.h>
+
+#include <android/input.h>
+#include <android/native_window.h>
#include <headless/svpinst.hxx>
+#include <headless/svpframe.hxx>
class AndroidSalInstance : public SvpSalInstance
{
+ void BlitFrameToWindow(ANativeWindow_Buffer *pOutBuffer,
+ const basebmp::BitmapDeviceSharedPtr& aDev);
public:
AndroidSalInstance( SalYieldMutex *pMutex );
virtual ~AndroidSalInstance();
+ static AndroidSalInstance *getInstance();
virtual SalSystem* CreateSalSystem();
+ // frame management
+ void GetWorkArea( Rectangle& rRect );
+ SalFrame* CreateFrame( SalFrame* pParent, sal_uLong nStyle );
+ SalFrame* CreateChildFrame( SystemParentData* pParent, sal_uLong nStyle );
+
// mainloop pieces
virtual void Wakeup();
virtual bool AnyInput( sal_uInt16 nType );
+
+ // incoming android event handlers:
+ void onAppCmd (struct android_app* app, int32_t cmd);
+ int32_t onInputEvent (struct android_app* app, AInputEvent* event);
+ void RedrawWindows(ANativeWindow *pWindow);
+ SalFrame *getFocusFrame() const;
+
protected:
virtual void DoReleaseYield( int nTimeoutMS );
- struct android_app *app;
+ struct android_app *mpApp;
+ bool mbQueueReDraw;
+
+private:
+ EGLDisplay mxDisplay;
+ EGLSurface mxSurface;
+ EGLContext mxContext;
};
#endif // ANDROID_SALINST_H
diff --git a/vcl/inc/generic/geninst.h b/vcl/inc/generic/geninst.h
index 471b6307c38f..240ebe676e0b 100644
--- a/vcl/inc/generic/geninst.h
+++ b/vcl/inc/generic/geninst.h
@@ -103,7 +103,7 @@ public:
virtual void GetPrinterQueueInfo ( ImplPrnQueueList* pList );
virtual void GetPrinterQueueState ( SalPrinterQueueInfo* pInfo );
virtual void DeletePrinterQueueInfo ( SalPrinterQueueInfo* pInfo );
- virtual rtl::OUString GetDefaultPrinter();
+ virtual rtl::OUString GetDefaultPrinter();
virtual void PostPrintersChanged() = 0;
virtual void updatePrinterUpdate();
virtual void jobStartedPrinterUpdate();
@@ -117,8 +117,8 @@ public:
protected:
void configurePspInfoPrinter( PspSalInfoPrinter* pInfoPrinter,
- SalPrinterQueueInfo* pQueueInfo,
- ImplJobSetup* pSetupData );
+ SalPrinterQueueInfo* pQueueInfo,
+ ImplJobSetup* pSetupData );
};
inline SalGenericInstance *GetGenericInstance()
diff --git a/vcl/inc/headless/svpframe.hxx b/vcl/inc/headless/svpframe.hxx
index 217dccc809c7..2165c5d89fc8 100644
--- a/vcl/inc/headless/svpframe.hxx
+++ b/vcl/inc/headless/svpframe.hxx
@@ -41,9 +41,9 @@ class SvpSalGraphics;
class SvpSalFrame : public SalFrame, public SvpElement
{
SvpSalInstance* m_pInstance;
- SvpSalFrame* m_pParent; // pointer to parent frame
+ SvpSalFrame* m_pParent; // pointer to parent frame
std::list< SvpSalFrame* > m_aChildren; // List of child frames
- sal_uLong m_nStyle;
+ sal_uLong m_nStyle;
bool m_bVisible;
long m_nMinWidth;
long m_nMinHeight;
@@ -65,7 +65,7 @@ public:
void GetFocus();
void LoseFocus();
- void PostPaint() const;
+ void PostPaint(bool bImmediate) const;
// SvpElement
virtual const basebmp::BitmapDeviceSharedPtr& getDevice() const { return m_aFrame; }
@@ -74,7 +74,7 @@ public:
virtual SalGraphics* GetGraphics();
virtual void ReleaseGraphics( SalGraphics* pGraphics );
- virtual sal_Bool PostEvent( void* pData );
+ virtual sal_Bool PostEvent( void* pData );
virtual void SetTitle( const rtl::OUString& rTitle );
virtual void SetIcon( sal_uInt16 nIcon );
@@ -125,6 +125,10 @@ public:
/*TODO: functional implementation */
virtual void SetScreenNumber( unsigned int nScreen ) { (void)nScreen; }
virtual void SetApplicationID(const rtl::OUString &rApplicationID) { (void) rApplicationID; }
+ bool IsVisible() { return m_bVisible; }
+
+ static SvpSalFrame* GetFocusFrame() { return s_pFocusFrame; }
+
};
#endif // _SVP_SVPFRAME_HXX
diff --git a/vcl/source/app/svmain.cxx b/vcl/source/app/svmain.cxx
index cf98fb8a0b6a..4db7b122a292 100644
--- a/vcl/source/app/svmain.cxx
+++ b/vcl/source/app/svmain.cxx
@@ -155,12 +155,16 @@ oslSignalAction SAL_CALL VCLExceptionSignal_impl( void* /*pData*/, oslSignalInfo
}
+extern void VCL_DLLPUBLIC plasma_now(const char *msg);
+
// =======================================================================
int ImplSVMain()
{
// The 'real' SVMain()
RTL_LOGFILE_CONTEXT( aLog, "vcl (ss112471) ::SVMain" );
+// plasma_now("top"); - works here
+
ImplSVData* pSVData = ImplGetSVData();
DBG_ASSERT( pSVData->mpApp, "no instance of class Application" );
@@ -175,6 +179,7 @@ int ImplSVMain()
{
// Application-Main rufen
pSVData->maAppData.mbInAppMain = sal_True;
+// plasma_now("after vcl init"); - works here
nReturn = pSVData->mpApp->Main();
pSVData->maAppData.mbInAppMain = sal_False;
}