diff --git a/examples/androidlcl/android/AndroidManifest.xml b/examples/androidlcl/android/AndroidManifest.xml new file mode 100644 index 000000000..e6c7a3c56 --- /dev/null +++ b/examples/androidlcl/android/AndroidManifest.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + diff --git a/examples/androidlcl/android/build.properties b/examples/androidlcl/android/build.properties new file mode 100644 index 000000000..edc7f2305 --- /dev/null +++ b/examples/androidlcl/android/build.properties @@ -0,0 +1,17 @@ +# 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. + diff --git a/examples/androidlcl/android/build.xml b/examples/androidlcl/android/build.xml new file mode 100644 index 000000000..73bc2da82 --- /dev/null +++ b/examples/androidlcl/android/build.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/androidlcl/android/default.properties b/examples/androidlcl/android/default.properties new file mode 100644 index 000000000..9d79b12c7 --- /dev/null +++ b/examples/androidlcl/android/default.properties @@ -0,0 +1,11 @@ +# 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, +# "build.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-4 diff --git a/examples/androidlcl/android/local.properties b/examples/androidlcl/android/local.properties new file mode 100644 index 000000000..d5219d1cb --- /dev/null +++ b/examples/androidlcl/android/local.properties @@ -0,0 +1,10 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must *NOT* be checked in Version Control Systems, +# as it contains information specific to your local configuration. + +# location of the SDK. This is only used by Ant +# For customization when using a Version Control System, please read the +# header note. +sdk.dir=/home/felipe/Programas/android-sdk-linux_x86 diff --git a/examples/androidlcl/android/res/drawable-hdpi/icon.png b/examples/androidlcl/android/res/drawable-hdpi/icon.png new file mode 100644 index 000000000..1cf343225 Binary files /dev/null and b/examples/androidlcl/android/res/drawable-hdpi/icon.png differ diff --git a/examples/androidlcl/android/res/drawable-ldpi/icon.png b/examples/androidlcl/android/res/drawable-ldpi/icon.png new file mode 100644 index 000000000..e433879ed Binary files /dev/null and b/examples/androidlcl/android/res/drawable-ldpi/icon.png differ diff --git a/examples/androidlcl/android/res/drawable-mdpi/icon.png b/examples/androidlcl/android/res/drawable-mdpi/icon.png new file mode 100644 index 000000000..21496a29a Binary files /dev/null and b/examples/androidlcl/android/res/drawable-mdpi/icon.png differ diff --git a/examples/androidlcl/android/res/values/strings.xml b/examples/androidlcl/android/res/values/strings.xml new file mode 100644 index 000000000..da1dbf958 --- /dev/null +++ b/examples/androidlcl/android/res/values/strings.xml @@ -0,0 +1,4 @@ + + + LCL Test + diff --git a/examples/androidlcl/android/src/com/pascal/androidlcl/AndroidAll.java b/examples/androidlcl/android/src/com/pascal/androidlcl/AndroidAll.java new file mode 100644 index 000000000..c689d95bd --- /dev/null +++ b/examples/androidlcl/android/src/com/pascal/androidlcl/AndroidAll.java @@ -0,0 +1,525 @@ +package com.pascal.androidlcl; + +import android.app.*; +import android.view.*; +import android.os.*; +import android.util.*; +import android.content.*; +import android.view.*; +import android.widget.*; +import java.util.*; +import java.lang.*; + +public class AndroidAll +{ + // info from other classes + Activity activity; + AndroidPipesComm MyAndroidPipesComm; + JavaLang MyJavaLang; + // lists of variables + ArrayList ViewElements; + + public AndroidAll(AndroidPipesComm AAndroidPipesComm, Activity AActivity, JavaLang AJavaLang) + { + activity = AActivity; + MyAndroidPipesComm = AAndroidPipesComm; + MyJavaLang = AJavaLang; + ViewElements = new ArrayList(); + } + + public void DebugOut(String Str) + { + MyAndroidPipesComm.DebugOut(Str); + } + + // DisplayMetrics + static final int amkUI_TDisplayMetrics_Create = 0x00101000; + static final int amkUI_TDisplayMetrics_density = 0x00101001; + static final int amkUI_TDisplayMetrics_densityDpi = 0x00101002; + static final int amkUI_TDisplayMetrics_heightPixels = 0x00101003; + static final int amkUI_TDisplayMetrics_scaledDensity = 0x00101004; + static final int amkUI_TDisplayMetrics_widthPixels = 0x00101005; + static final int amkUI_TDisplayMetrics_xdpi = 0x00101006; + static final int amkUI_TDisplayMetrics_ydpi = 0x00101007; + // Display + static final int amkUI_TDisplay_getMetrics = 0x00102000; + // WindowManager + static final int amkUI_TWindowManager_getDefaultDisplay = 0x00103000; + // ViewGroup.LayoutParams + static final int amkUI_TViewGroup_LayoutParams_Create = 0x00104000; + // View + static final int amkUI_TView_setLayoutParams = 0x00105000; + static final int amkUI_TView_setVisibility = 0x00105001; + // ViewGroup + static final int amkUI_TViewGroup_addView = 0x00106000; + // LinearLayout + static final int amkUI_TLinearLayout_Create = 0x00107000; + static final int amkUI_TLinearLayout_setOrientation = 0x00107001; + // AbsoluteLayout + static final int amkUI_TAbsoluteLayout_Create = 0x00108000; + // AbsoluteLayout.LayoutParams + static final int amkUI_TAbsoluteLayout_LayoutParams_Create = 0x00109000; + // TextView + static final int amkUI_TTextView_Create = 0x0010A000; + static final int amkUI_TTextView_setText = 0x0010A001; + static final int amkUI_TTextView_setOnClickListener = 0x0010A002; + static final int amkUI_TTextView_OnClickListener_Start = 0x0010A002; + static final int amkUI_TTextView_OnClickListener_Finished = 0x0010A002; + static final int amkUI_TTextView_setTextSize = 0x0010A002; + // EditText + static final int amkUI_TEditText_Create = 0x0010B000; + static final int amkUI_TEditText_setText = 0x0010B001; + // Button + static final int amkUI_TButton_Create = 0x0010C000; + static final int amkUI_TButton_setText = 0x0010C001; + // FrameLayout + // TimePicker + static final int amkUI_TTimePicker_Create = 0x0010E000; + static final int amkUI_TTimePicker_getCurrentHour = 0x0010E001; + static final int amkUI_TTimePicker_setCurrentHour = 0x0010E002; + static final int amkUI_TTimePicker_getCurrentMinute = 0x0010E003; + static final int amkUI_TTimePicker_setCurrentMinute = 0x0010E004; + static final int amkUI_TTimePicker_is24HourView = 0x0010E005; + static final int amkUI_TTimePicker_setIs24HourView = 0x0010E006; + // ScrollView + static final int amkUI_TScrollView_Create = 0x0010F000; + // CompoundButton + static final int amkUI_TCompoundButton_isChecked = 0x00110000; + static final int amkUI_TCompoundButton_performClick = 0x00110001; + static final int amkUI_TCompoundButton_setChecked = 0x00110002; + static final int amkUI_TCompoundButton_toggle = 0x00110003; + // CheckBox + static final int amkUI_TCheckBox_Create = 0x00111000; + + public boolean ProcessCommand(int Buffer) + { + //DebugOut("AndroidUI.ProcessCommand Command=" + java.lang.Integer.toHexString(Buffer)); + // basic types + int lInt, lIndex, lPascalPointer; + boolean lBool; + float lFloat; + // Self params + View param_self_View; + ViewGroup param_self_ViewGroup; + TextView param_self_TextView; + Button param_self_Button; + EditText param_self_EditText; + LinearLayout param_self_LinearLayout; + TimePicker param_self_TimePicker; + Display param_self_Display; + DisplayMetrics param_self_DisplayMetrics; + CompoundButton param_self_CompoundButton; + WindowManager param_self_WindowManager; + // Params + ViewGroup.LayoutParams lViewGroup_LayoutParams_1, lViewGroup_LayoutParams_2; + DisplayMetrics lDisplayMetrics_1; + CharSequence lCharSequence_1; + View lView_1; + int lint_1, lint_2, lint_3, lint_4; + float lfloat_1, lfloat_2; + boolean lboolean_1; + // Results + float lResult_float; + int lResult_int; + boolean lResult_boolean; + Display lResult_Display; + + switch (Buffer) + { + + case amkUI_TDisplayMetrics_Create: + DebugOut("amkUI_TDisplayMetrics_Create"); + ViewElements.add(new DisplayMetrics()); + MyAndroidPipesComm.SendIntResult(ViewElements.size() - 1); + break; + // field float density + case amkUI_TDisplayMetrics_density: + DebugOut("amkUI_TDisplayMetrics_density"); + // Self + lInt = MyAndroidPipesComm.GetInt(); + param_self_DisplayMetrics = (DisplayMetrics) ViewElements.get(lInt); + // params + // + lResult_float = param_self_DisplayMetrics.density; + MyAndroidPipesComm.SendFloatResult(lResult_float); + break; + // field int densityDpi + case amkUI_TDisplayMetrics_densityDpi: + DebugOut("amkUI_TDisplayMetrics_densityDpi"); + // Self + lInt = MyAndroidPipesComm.GetInt(); + param_self_DisplayMetrics = (DisplayMetrics) ViewElements.get(lInt); + // params + // + lResult_int = param_self_DisplayMetrics.densityDpi; + MyAndroidPipesComm.SendIntResult(lResult_int); + break; + // field int heightPixels + case amkUI_TDisplayMetrics_heightPixels: + DebugOut("amkUI_TDisplayMetrics_heightPixels"); + // Self + lInt = MyAndroidPipesComm.GetInt(); + param_self_DisplayMetrics = (DisplayMetrics) ViewElements.get(lInt); + // params + // + lResult_int = param_self_DisplayMetrics.heightPixels; + MyAndroidPipesComm.SendIntResult(lResult_int); + break; + // field float scaledDensity + case amkUI_TDisplayMetrics_scaledDensity: + DebugOut("amkUI_TDisplayMetrics_scaledDensity"); + // Self + lInt = MyAndroidPipesComm.GetInt(); + param_self_DisplayMetrics = (DisplayMetrics) ViewElements.get(lInt); + // params + // + lResult_float = param_self_DisplayMetrics.scaledDensity; + MyAndroidPipesComm.SendFloatResult(lResult_float); + break; + // field int widthPixels + case amkUI_TDisplayMetrics_widthPixels: + DebugOut("amkUI_TDisplayMetrics_widthPixels"); + // Self + lInt = MyAndroidPipesComm.GetInt(); + param_self_DisplayMetrics = (DisplayMetrics) ViewElements.get(lInt); + // params + // + lResult_int = param_self_DisplayMetrics.widthPixels; + MyAndroidPipesComm.SendIntResult(lResult_int); + break; + // field float xdpi + case amkUI_TDisplayMetrics_xdpi: + DebugOut("amkUI_TDisplayMetrics_xdpi"); + // Self + lInt = MyAndroidPipesComm.GetInt(); + param_self_DisplayMetrics = (DisplayMetrics) ViewElements.get(lInt); + // params + // + lResult_float = param_self_DisplayMetrics.xdpi; + MyAndroidPipesComm.SendFloatResult(lResult_float); + break; + // field float ydpi + case amkUI_TDisplayMetrics_ydpi: + DebugOut("amkUI_TDisplayMetrics_ydpi"); + // Self + lInt = MyAndroidPipesComm.GetInt(); + param_self_DisplayMetrics = (DisplayMetrics) ViewElements.get(lInt); + // params + // + lResult_float = param_self_DisplayMetrics.ydpi; + MyAndroidPipesComm.SendFloatResult(lResult_float); + break; + // method void getMetrics(DisplayMetrics outMetrics) + case amkUI_TDisplay_getMetrics: + DebugOut("amkUI_TDisplay_getMetrics"); + // Self + lInt = MyAndroidPipesComm.GetInt(); + param_self_Display = (Display) ViewElements.get(lInt); + // params + lInt = MyAndroidPipesComm.GetInt(); + lDisplayMetrics_1 = (DisplayMetrics) ViewElements.get(lInt); + // + param_self_Display.getMetrics(lDisplayMetrics_1); + MyAndroidPipesComm.SendResult(); + break; + // method Display getDefaultDisplay() + case amkUI_TWindowManager_getDefaultDisplay: + DebugOut("amkUI_TWindowManager_getDefaultDisplay"); + // Self + lInt = MyAndroidPipesComm.GetInt(); + param_self_WindowManager = (WindowManager) ViewElements.get(lInt); + // params + // + lResult_Display = param_self_WindowManager.getDefaultDisplay(); + ViewElements.add(lResult_Display); + MyAndroidPipesComm.SendIntResult(ViewElements.size() - 1); + break; + case amkUI_TViewGroup_LayoutParams_Create: + DebugOut("amkUI_TViewGroup_LayoutParams_Create"); + lint_1 = MyAndroidPipesComm.GetInt(); + lint_2 = MyAndroidPipesComm.GetInt(); + ViewElements.add(new ViewGroup.LayoutParams(lint_1, lint_2)); + MyAndroidPipesComm.SendIntResult(ViewElements.size() - 1); + break; + // method void setLayoutParams(ViewGroup.LayoutParams params); + case amkUI_TView_setLayoutParams: + DebugOut("amkUI_TView_setLayoutParams"); + // Self + lInt = MyAndroidPipesComm.GetInt(); + param_self_View = (View) ViewElements.get(lInt); + // params + lInt = MyAndroidPipesComm.GetInt(); + lViewGroup_LayoutParams_1 = (ViewGroup.LayoutParams) ViewElements.get(lInt); + // + param_self_View.setLayoutParams(lViewGroup_LayoutParams_1); + MyAndroidPipesComm.SendResult(); + break; + // method void setVisibility(int visibility); + case amkUI_TView_setVisibility: + DebugOut("amkUI_TView_setVisibility"); + // Self + lInt = MyAndroidPipesComm.GetInt(); + param_self_View = (View) ViewElements.get(lInt); + // params + lInt = MyAndroidPipesComm.GetInt(); + lint_1 = lInt; + // + param_self_View.setVisibility(lint_1); + MyAndroidPipesComm.SendResult(); + break; + // method void addView(View child, ViewGroup.LayoutParams params); + case amkUI_TViewGroup_addView: + DebugOut("amkUI_TViewGroup_addView"); + // Self + lInt = MyAndroidPipesComm.GetInt(); + param_self_ViewGroup = (ViewGroup) ViewElements.get(lInt); + // params + lInt = MyAndroidPipesComm.GetInt(); + lView_1 = (View) ViewElements.get(lInt); + lInt = MyAndroidPipesComm.GetInt(); + lViewGroup_LayoutParams_2 = (ViewGroup.LayoutParams) ViewElements.get(lInt); + // + param_self_ViewGroup.addView(lView_1, lViewGroup_LayoutParams_2); + MyAndroidPipesComm.SendResult(); + break; + case amkUI_TLinearLayout_Create: + DebugOut("amkUI_TLinearLayout_Create"); + ViewElements.add(new LinearLayout(activity)); + MyAndroidPipesComm.SendIntResult(ViewElements.size() - 1); + break; + // method void setOrientation(int orientation); + case amkUI_TLinearLayout_setOrientation: + DebugOut("amkUI_TLinearLayout_setOrientation"); + // Self + lInt = MyAndroidPipesComm.GetInt(); + param_self_LinearLayout = (LinearLayout) ViewElements.get(lInt); + // params + lInt = MyAndroidPipesComm.GetInt(); + lint_1 = lInt; + // + param_self_LinearLayout.setOrientation(lint_1); + MyAndroidPipesComm.SendResult(); + break; + case amkUI_TAbsoluteLayout_Create: + DebugOut("amkUI_TAbsoluteLayout_Create"); + ViewElements.add(new AbsoluteLayout(activity)); + MyAndroidPipesComm.SendIntResult(ViewElements.size() - 1); + break; + case amkUI_TAbsoluteLayout_LayoutParams_Create: + DebugOut("amkUI_TAbsoluteLayout_LayoutParams_Create"); + lint_1 = MyAndroidPipesComm.GetInt(); + lint_2 = MyAndroidPipesComm.GetInt(); + lint_3 = MyAndroidPipesComm.GetInt(); + lint_4 = MyAndroidPipesComm.GetInt(); + ViewElements.add(new AbsoluteLayout.LayoutParams(lint_1, lint_2, lint_3, lint_4)); + MyAndroidPipesComm.SendIntResult(ViewElements.size() - 1); + break; + case amkUI_TTextView_Create: + DebugOut("amkUI_TTextView_Create"); + ViewElements.add(new TextView(activity)); + MyAndroidPipesComm.SendIntResult(ViewElements.size() - 1); + break; + // method void setText(CharSequence AText); virtual; + case amkUI_TTextView_setText: + DebugOut("amkUI_TTextView_setText"); + // Self + lInt = MyAndroidPipesComm.GetInt(); + param_self_TextView = (TextView) ViewElements.get(lInt); + // params + lInt = MyAndroidPipesComm.GetInt(); + lCharSequence_1 = (CharSequence) MyJavaLang.LangElements.get(lInt); + // + param_self_TextView.setText(lCharSequence_1); + MyAndroidPipesComm.SendResult(); + break; + // method void setTextSize(int unit_; float size); + case amkUI_TTextView_setTextSize: + DebugOut("amkUI_TTextView_setTextSize"); + // Self + lInt = MyAndroidPipesComm.GetInt(); + param_self_TextView = (TextView) ViewElements.get(lInt); + // params + lInt = MyAndroidPipesComm.GetInt(); + lint_1 = lInt; + lFloat = MyAndroidPipesComm.GetFloat(); + lfloat_2 = lFloat; + // + param_self_TextView.setTextSize(lint_1, lfloat_2); + MyAndroidPipesComm.SendResult(); + break; + case amkUI_TEditText_Create: + DebugOut("amkUI_TEditText_Create"); + ViewElements.add(new EditText(activity)); + MyAndroidPipesComm.SendIntResult(ViewElements.size() - 1); + break; + // method void setText(CharSequence AText); override; + case amkUI_TEditText_setText: + DebugOut("amkUI_TEditText_setText"); + // Self + lInt = MyAndroidPipesComm.GetInt(); + param_self_EditText = (EditText) ViewElements.get(lInt); + // params + lInt = MyAndroidPipesComm.GetInt(); + lCharSequence_1 = (CharSequence) MyJavaLang.LangElements.get(lInt); + // + param_self_EditText.setText(lCharSequence_1); + MyAndroidPipesComm.SendResult(); + break; + case amkUI_TButton_Create: + DebugOut("amkUI_TButton_Create"); + ViewElements.add(new Button(activity)); + MyAndroidPipesComm.SendIntResult(ViewElements.size() - 1); + break; + // method void setText(CharSequence AText); override; + case amkUI_TButton_setText: + DebugOut("amkUI_TButton_setText"); + // Self + lInt = MyAndroidPipesComm.GetInt(); + param_self_Button = (Button) ViewElements.get(lInt); + // params + lInt = MyAndroidPipesComm.GetInt(); + lCharSequence_1 = (CharSequence) MyJavaLang.LangElements.get(lInt); + // + param_self_Button.setText(lCharSequence_1); + MyAndroidPipesComm.SendResult(); + break; + case amkUI_TTimePicker_Create: + DebugOut("amkUI_TTimePicker_Create"); + ViewElements.add(new TimePicker(activity)); + MyAndroidPipesComm.SendIntResult(ViewElements.size() - 1); + break; + // method int getCurrentHour(); + case amkUI_TTimePicker_getCurrentHour: + DebugOut("amkUI_TTimePicker_getCurrentHour"); + // Self + lInt = MyAndroidPipesComm.GetInt(); + param_self_TimePicker = (TimePicker) ViewElements.get(lInt); + // params + // + lResult_int = param_self_TimePicker.getCurrentHour(); + MyAndroidPipesComm.SendIntResult(lResult_int); + break; + // method void setCurrentHour(int currentHour); + case amkUI_TTimePicker_setCurrentHour: + DebugOut("amkUI_TTimePicker_setCurrentHour"); + // Self + lInt = MyAndroidPipesComm.GetInt(); + param_self_TimePicker = (TimePicker) ViewElements.get(lInt); + // params + lInt = MyAndroidPipesComm.GetInt(); + lint_1 = lInt; + // + param_self_TimePicker.setCurrentHour(lint_1); + MyAndroidPipesComm.SendResult(); + break; + // method int getCurrentMinute; + case amkUI_TTimePicker_getCurrentMinute: + DebugOut("amkUI_TTimePicker_getCurrentMinute"); + // Self + lInt = MyAndroidPipesComm.GetInt(); + param_self_TimePicker = (TimePicker) ViewElements.get(lInt); + // params + // + lResult_int = param_self_TimePicker.getCurrentMinute(); + MyAndroidPipesComm.SendIntResult(lResult_int); + break; + // method void setCurrentMinute(int currentMinute); + case amkUI_TTimePicker_setCurrentMinute: + DebugOut("amkUI_TTimePicker_setCurrentMinute"); + // Self + lInt = MyAndroidPipesComm.GetInt(); + param_self_TimePicker = (TimePicker) ViewElements.get(lInt); + // params + lInt = MyAndroidPipesComm.GetInt(); + lint_1 = lInt; + // + param_self_TimePicker.setCurrentMinute(lint_1); + MyAndroidPipesComm.SendResult(); + break; + // method boolean is24HourView; + case amkUI_TTimePicker_is24HourView: + DebugOut("amkUI_TTimePicker_is24HourView"); + // Self + lInt = MyAndroidPipesComm.GetInt(); + param_self_TimePicker = (TimePicker) ViewElements.get(lInt); + // params + // + lResult_boolean = param_self_TimePicker.is24HourView(); + MyAndroidPipesComm.SendBoolResult(lResult_boolean); + break; + // method void setIs24HourView(boolean AIs24HourView); + case amkUI_TTimePicker_setIs24HourView: + DebugOut("amkUI_TTimePicker_setIs24HourView"); + // Self + lInt = MyAndroidPipesComm.GetInt(); + param_self_TimePicker = (TimePicker) ViewElements.get(lInt); + // params + lBool = MyAndroidPipesComm.GetBool(); + lboolean_1 = lBool; + // + param_self_TimePicker.setIs24HourView(lboolean_1); + MyAndroidPipesComm.SendResult(); + break; + case amkUI_TScrollView_Create: + DebugOut("amkUI_TScrollView_Create"); + ViewElements.add(new ScrollView(activity)); + MyAndroidPipesComm.SendIntResult(ViewElements.size() - 1); + break; + // method boolean isChecked() + case amkUI_TCompoundButton_isChecked: + DebugOut("amkUI_TCompoundButton_isChecked"); + // Self + lInt = MyAndroidPipesComm.GetInt(); + param_self_CompoundButton = (CompoundButton) ViewElements.get(lInt); + // params + // + lResult_boolean = param_self_CompoundButton.isChecked(); + MyAndroidPipesComm.SendBoolResult(lResult_boolean); + break; + // method boolean performClick() + case amkUI_TCompoundButton_performClick: + DebugOut("amkUI_TCompoundButton_performClick"); + // Self + lInt = MyAndroidPipesComm.GetInt(); + param_self_CompoundButton = (CompoundButton) ViewElements.get(lInt); + // params + // + lResult_boolean = param_self_CompoundButton.performClick(); + MyAndroidPipesComm.SendBoolResult(lResult_boolean); + break; + // method void setChecked(boolean checked) + case amkUI_TCompoundButton_setChecked: + DebugOut("amkUI_TCompoundButton_setChecked"); + // Self + lInt = MyAndroidPipesComm.GetInt(); + param_self_CompoundButton = (CompoundButton) ViewElements.get(lInt); + // params + lBool = MyAndroidPipesComm.GetBool(); + lboolean_1 = lBool; + // + param_self_CompoundButton.setChecked(lboolean_1); + MyAndroidPipesComm.SendResult(); + break; + // method void toggle() + case amkUI_TCompoundButton_toggle: + DebugOut("amkUI_TCompoundButton_toggle"); + // Self + lInt = MyAndroidPipesComm.GetInt(); + param_self_CompoundButton = (CompoundButton) ViewElements.get(lInt); + // params + // + param_self_CompoundButton.toggle(); + MyAndroidPipesComm.SendResult(); + break; + case amkUI_TCheckBox_Create: + DebugOut("amkUI_TCheckBox_Create"); + ViewElements.add(new CheckBox(activity)); + MyAndroidPipesComm.SendIntResult(ViewElements.size() - 1); + break; + + default: + return false; + } + return true; + } +} diff --git a/examples/androidlcl/android/src/com/pascal/androidlcl/AndroidApp.java b/examples/androidlcl/android/src/com/pascal/androidlcl/AndroidApp.java new file mode 100644 index 000000000..6ee44b1f2 --- /dev/null +++ b/examples/androidlcl/android/src/com/pascal/androidlcl/AndroidApp.java @@ -0,0 +1,77 @@ +package com.pascal.androidlcl; + +import android.app.Activity; +import android.app.AlertDialog; +import android.os.*; +import android.util.*; +import android.content.*; +import android.view.*; +import android.widget.*; +import java.util.*; + +public class AndroidApp +{ + // info from other classes + Activity activity; + AndroidPipesComm MyAndroidPipesComm; + JavaLang MyJavaLang; + AndroidAll MyAndroidAll; + + // lists of variables + ArrayList ViewElements; + + // + // android.app.* + static final int amkUI_Activity_setContentView = 0x0000; + static final int amkUI_Activity_getWindowManager = 0x0080; + + public AndroidApp(AndroidPipesComm AAndroidPipesComm, Activity AActivity, JavaLang AJavaLang, AndroidAll AAndroidAll) + { + activity = AActivity; + MyAndroidPipesComm = AAndroidPipesComm; + MyJavaLang = AJavaLang; + MyAndroidAll = AAndroidAll; + ViewElements = AAndroidAll.ViewElements; + } + + public void DebugOut(String Str) + { + MyAndroidPipesComm.DebugOut(Str); + } + + public boolean ProcessCommand(int Buffer) + { + //DebugOut("AndroidUI.ProcessCommand"); + //DebugOut("AndroidUI.ProcessCommand Command=" + java.lang.Integer.toHexString(Buffer)); + + int lInt, lIndex, lPascalPointer; + Integer lTag; + TextView lTextView; + CharSequence lChars; + // + WindowManager param_self_WindowManager; + // + + switch (Buffer) + { + // android.app.Activity + // public void setContentView (View view) + case amkUI_Activity_setContentView: + DebugOut("amkUI_Activity_setContentView"); + lInt = MyAndroidPipesComm.GetInt(); + View lView = (View) ViewElements.get(lInt); + activity.setContentView(lView); + MyAndroidPipesComm.SendResult(); + break; +/* case amkUI_Activity_getWindowManager: + DebugOut("amkUI_Activity_getWindowManager"); + WindowManagerElements.add(activity.getWindowManager()); + MyAndroidPipesComm.SendIntResult(WindowManagerElements.size() - 1); + break;*/ + default: + return false; + } + return true; + } +} + diff --git a/examples/androidlcl/android/src/com/pascal/androidlcl/AndroidLCLTest.java b/examples/androidlcl/android/src/com/pascal/androidlcl/AndroidLCLTest.java new file mode 100644 index 000000000..28abee283 --- /dev/null +++ b/examples/androidlcl/android/src/com/pascal/androidlcl/AndroidLCLTest.java @@ -0,0 +1,273 @@ +package com.pascal.androidlcl; + +import android.app.Activity; +import android.app.AlertDialog; +import android.os.*; +import android.util.Log; +import android.content.*; +import android.view.*; +import android.widget.*; +import java.io.*; + +public class AndroidLCLTest extends Activity +{ + AndroidPipesComm MyAndroidPipesComm; + String ExecutablePath; + // Debug + boolean DEBUG_PASCAL4ANDROID = true; + + // Android Message subtype + static int ams_ActivityCallback_onCreateStarted = 0x0001; + static int ams_ActivityCallback_onStartStarted = 0x0002; + static int ams_ActivityCallback_onRestartStarted = 0x0003; + static int ams_ActivityCallback_onResumeStarted = 0x0004; + static int ams_ActivityCallback_onPauseStarted = 0x0005; + static int ams_ActivityCallback_onStopStarted = 0x0006; + static int ams_ActivityCallback_onDestroyStarted = 0x0007; + static int ams_ActivityCallback_onCreateOptionsMenuStarted = 0x0008; + static int ams_ActivityCallback_onKeyUpStarted = 0x0010; + + static int ams_ActivityCallback_onCreateFinished = 0x1001; + static int ams_ActivityCallback_onStartFinished = 0x1002; + static int ams_ActivityCallback_onRestartFinished = 0x1003; + static int ams_ActivityCallback_onResumeFinished = 0x1004; + static int ams_ActivityCallback_onPauseFinished = 0x1005; + static int ams_ActivityCallback_onStopFinished = 0x1006; + static int ams_ActivityCallback_onDestroyFinished = 0x1007; + static int ams_ActivityCallback_onCreateOptionsMenuFinished = 0x1008; + static int ams_ActivityCallback_onKeyUpFinished = 0x1010; + + Button.OnClickListener buttonClickCallback = new Button.OnClickListener() + { + public void onClick(View v) + { + MyAndroidPipesComm.DebugOut("Click!"); + } + }; + + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + + MyAndroidPipesComm = new AndroidPipesComm(this); + + // Prepare the application + ExecutablePath = getApplicationContext().getFilesDir() + "/androidlcltest"; + + String LibraryPathPath = "/data/data/com.pascal.androidlcl/lib/libandroidlcltest.so"; + + MyAndroidPipesComm.DebugOut("Executing application " + LibraryPathPath + " copied to " + ExecutablePath); + + String Str = FileCopy(LibraryPathPath, ExecutablePath); + + String Str2 = RunProgram("/system/bin/chmod", "755", ExecutablePath); + + // Run the application + RunPascalProgram(ExecutablePath); + + // Waits until the Pascal side finishes its initialization + MyAndroidPipesComm.DebugOut("WaitForPascalMessage(amkActivityCallback, ams_ActivityCallback_onCreateFinished)"); + MyAndroidPipesComm.WaitForPascalMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onCreateFinished); + MyAndroidPipesComm.DebugOut("END onCreate"); + } + + /** */ + @Override + protected void onStart() + { + MyAndroidPipesComm.DebugOut("START onStart"); + super.onStart(); + MyAndroidPipesComm.SendMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onStartStarted); + MyAndroidPipesComm.WaitForPascalMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onStartFinished); + MyAndroidPipesComm.DebugOut("END onStart"); + } + + /** */ + @Override + protected void onRestart() + { + MyAndroidPipesComm.DebugOut("START onRestart"); + super.onRestart(); + MyAndroidPipesComm.SendMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onRestartStarted); + MyAndroidPipesComm.WaitForPascalMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onRestartFinished); + MyAndroidPipesComm.DebugOut("END onRestart"); + } + + /** */ + @Override + protected void onResume() + { + MyAndroidPipesComm.DebugOut("START onResume"); + super.onResume(); + MyAndroidPipesComm.SendMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onResumeStarted); + MyAndroidPipesComm.WaitForPascalMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onResumeFinished); + MyAndroidPipesComm.DebugOut("END onResume"); + } + + /** */ + @Override + protected void onPause() + { + MyAndroidPipesComm.DebugOut("START onPause"); + super.onPause(); + MyAndroidPipesComm.SendMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onPauseStarted); + MyAndroidPipesComm.WaitForPascalMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onPauseFinished); + MyAndroidPipesComm.DebugOut("END onPause"); + } + + /** */ + @Override + protected void onStop() + { + MyAndroidPipesComm.DebugOut("START onStop"); + super.onStop(); + MyAndroidPipesComm.SendMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onStopStarted); + MyAndroidPipesComm.WaitForPascalMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onStopFinished); + MyAndroidPipesComm.DebugOut("END onStop"); + } + + /** */ + @Override + protected void onDestroy() + { + MyAndroidPipesComm.DebugOut("START onDestroy"); + super.onDestroy(); + MyAndroidPipesComm.SendMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onStartStarted); + MyAndroidPipesComm.WaitForPascalMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onStartFinished); + MyAndroidPipesComm.DebugOut("END onDestroy"); + } + + // public boolean onCreateOptionsMenu (Menu menu) + /*@Override + public boolean onCreateOptionsMenu(Menu menu) + { + if (DEBUG_PASCAL4ANDROID == true) MyAndroidPipesComm.DebugOut("START onCreateOptionsMenu"); + MyAndroidPipesComm.SendMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onCreateOptionsMenuStarted); + MyAndroidPipesComm.MyAndroidMenu.MenuElements.add(menu); + int lMenuIndex = MyAndroidPipesComm.MyAndroidMenu.MenuElements.size() - 1; + MyAndroidPipesComm.SendInt(lMenuIndex); + MyAndroidPipesComm.WaitForPascalMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onCreateOptionsMenuFinished); + int lInt = MyAndroidPipesComm.GetInt(); + // ToDo: If we start supporting object deletion then we need to use indexOf to get the new index + MyAndroidPipesComm.MyAndroidMenu.MenuElements.remove(lMenuIndex); + if (DEBUG_PASCAL4ANDROID == true) MyAndroidPipesComm.DebugOut("END onCreateOptionsMenu"); + return (lInt != 0); + }*/ + + // generic Key Listener + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) + { + if (DEBUG_PASCAL4ANDROID == true) MyAndroidPipesComm.DebugOut("START onKeyUp"); + MyAndroidPipesComm.SendMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onKeyUpStarted); + MyAndroidPipesComm.SendInt(keyCode); + // ToDo: Also send the KeyEvent + //MyAndroidPipesComm.MyAndroidMenu.MenuElements.add(menu); + //int lMenuIndex = MyAndroidPipesComm.MyAndroidMenu.MenuElements.size() - 1; + MyAndroidPipesComm.WaitForPascalMessage(MyAndroidPipesComm.amkActivityCallback, ams_ActivityCallback_onKeyUpFinished); + int lInt = MyAndroidPipesComm.GetInt(); + if (DEBUG_PASCAL4ANDROID == true) MyAndroidPipesComm.DebugOut("END onCreateOptionsMenu"); + if (lInt != 0) return true; + return super.onKeyUp(keyCode, event); + } + + // + private static String FileCopy(String srFile, String dtFile) + { + try + { + File f1 = new File(srFile); + File f2 = new File(dtFile); + InputStream in = new FileInputStream(f1); + + //For Overwrite the file. + OutputStream out = new FileOutputStream(f2, true); + + byte[] buf = new byte[1024]; + int len; + while ((len = in.read(buf)) > 0){ + out.write(buf, 0, len); + } + in.close(); + out.close(); + + return "Success dest=" + dtFile; + } + catch(FileNotFoundException e) + { + return "Error=FileNotFoundException=" + e.getMessage(); + } + catch(IOException e) + { + return "Error=IOException=" + e.getMessage(); + } + } + + /* + Simple method for running external applications. + It waits until the program finishes running. + it uses Runtime.getRuntime() + */ + public String RunProgram(String cmd, String param1, String param2) + { + String output = ""; + try + { + if (param1 == null) param1 = ""; + if (param2 == null) param2 = ""; + + // Runs the application + java.lang.Process process = Runtime.getRuntime().exec(cmd + " " + param1 + " " + param2); + + // Now connects pipes to it + DataInputStream reader = new DataInputStream(process.getInputStream()); + + // Waits until it finishes + process.waitFor(); + + // And stores the result of the pipes in the result of the function + String line; + String separator = System.getProperty("line.separator"); + while ((line = reader.readLine()) != null) + { + output += line + separator; + } + } + catch (IOException e) + { + output += "error=IOException=" + e.getMessage(); + } + catch (InterruptedException e) + { + output += "error=InterruptedException=" + e.getMessage(); + } + + return output; + } + + /* + This function will run a Pascal program and interact with it via pipes + Uses Runtime.getRuntime() + */ + public void RunPascalProgram(String cmd) + { + try + { + // Runs the application + MyAndroidPipesComm.PascalProcess = Runtime.getRuntime().exec(cmd); + + // Now connects pipes to it + MyAndroidPipesComm.writer = new DataOutputStream( + MyAndroidPipesComm.PascalProcess.getOutputStream()); + MyAndroidPipesComm.reader = new DataInputStream( + MyAndroidPipesComm.PascalProcess.getInputStream()); + } + catch (IOException e) + { + MyAndroidPipesComm.DebugOut("error=IOException=" + e.getMessage()); + } + } +} + diff --git a/examples/androidlcl/android/src/com/pascal/androidlcl/AndroidPipesComm.java b/examples/androidlcl/android/src/com/pascal/androidlcl/AndroidPipesComm.java new file mode 100644 index 000000000..51d25e1f5 --- /dev/null +++ b/examples/androidlcl/android/src/com/pascal/androidlcl/AndroidPipesComm.java @@ -0,0 +1,276 @@ +package com.pascal.androidlcl; + +import android.app.Activity; +import android.app.AlertDialog; +import android.os.*; +import android.util.Log; +import android.content.*; +import android.view.*; +import android.widget.*; +import java.io.*; + +public class AndroidPipesComm +{ + // info from other classes + Activity activity; + + // Data pool accessed by many methods + java.lang.Process PascalProcess; + DataOutputStream writer; + DataInputStream reader; + // Data pool to solve the lack of passing parameter by reference + byte lType = 0; + int lSubtype = 0; + + // Android Message Kind + static byte amkFloatResult = 103; + static byte amkIntResult = 102; + static byte amkResult = 101; + static byte amkActivityCallback = 0; + static byte amkLog = 1; + static byte amkUICommand = 2; + static byte amkJavaLangCall = 3; + static byte amkTimer = 4; + + // Add / remove modules here + public JavaLang MyJavaLang; + public AndroidAll MyAndroidAll; + public AndroidApp MyAndroidApp; + + public AndroidPipesComm(Activity AActivity) + { + activity = AActivity; + MyJavaLang = new JavaLang(this); + MyAndroidAll = new AndroidAll(this, activity, MyJavaLang); + MyAndroidApp = new AndroidApp(this, activity, MyJavaLang, MyAndroidAll); + } + + public void DebugOut(String Str) + { + Log.v("AndroidPipesComm:", Str); +// tv.setText(tv.getText().toString() + Str); + } + + public void ErrorOut(String Str) + { + Log.v("AndroidPipesComm:", Str); +// tv.setText(tv.getText().toString() + Str); + } + + // Waits for a particular Pascal message. + // In the mean time processes any other incoming messages + public void WaitForPascalMessage(byte AExpectedMessageType, int AExpectedMessageSubtype) + { + DebugOut("START WaitForPascalMessage AExpectedMessageType=" + AExpectedMessageType + + " AExpectedMessageSubtype=" + java.lang.Integer.toHexString(AExpectedMessageSubtype)); + + while (true) + { + WaitAndProcessPascalMessage(); + DebugOut("MID_END WaitForPascalMessage lType=" + lType + " lSubtype=" + java.lang.Integer.toHexString(lSubtype)); + if ((lType == AExpectedMessageType) && (lSubtype == AExpectedMessageSubtype)) return; + if ((lType == amkActivityCallback) && (AExpectedMessageType == amkActivityCallback)) return; + } + } + + // Waits for and processes a Pascal message + public void WaitAndProcessPascalMessage() + { + try + { + DebugOut("WaitAndProcessPascalMessage"); + byte Buffer = reader.readByte(); // blocking read + lType = Buffer; + lSubtype = 0; + + if (Buffer == amkActivityCallback) + { + DebugOut("amkActivityCallback"); +// lSubtype = reader.readInt(); // blocking read + } + else if (Buffer == amkLog) + { + DebugOut("amkLog"); + } + else if (Buffer == amkUICommand) + { + DebugOut("amkUICommand"); + lSubtype = reader.readInt(); // blocking read + if (MyAndroidAll.ProcessCommand(lSubtype) == true) ; + else if (MyAndroidApp.ProcessCommand(lSubtype) == true) ; + else + { + ErrorOut("Unknown UI Command!!!" + java.lang.Integer.toHexString(lSubtype)); + }; + } + else if (Buffer == amkJavaLangCall) + { + DebugOut("amkJavaLangCall"); + lSubtype = reader.readInt(); // blocking read + MyJavaLang.ProcessCommand(lSubtype); + } +// else if (Buffer == amkTimer) +// { +// DebugOut("amkTimer"); +// lSubtype = reader.readInt(); // blocking read +// MyAndroidTimer.ProcessCommand(lSubtype); +// } + else + { + ErrorOut("Unknown Pascal message!!! " + java.lang.Integer.toHexString(Buffer)); + } + } + catch (EOFException e) + { + ErrorOut("[WaitAndProcessPascalMessage] EOFException=" + e.getMessage()); + } + catch (IOException e) + { + ErrorOut("[WaitAndProcessPascalMessage] IOException=" + e.getMessage()); + } + } + + // Receiving data + + public byte GetByte() + { + try + { + return reader.readByte(); + } + catch (IOException e) + { + ErrorOut("[GetByte] IOException=" + e.getMessage()); + } + return -1; + } + + public int GetInt() + { + try + { + return reader.readInt(); + } + catch (IOException e) + { + ErrorOut("[GetInt] IOException=" + e.getMessage()); + } + return -1; + } + + public boolean GetBool() + { + try + { + int Tmp = reader.readInt(); + if (Tmp == 0) return false; + else return true; + } + catch (IOException e) + { + ErrorOut("[GetBool] IOException=" + e.getMessage()); + } + return false; + } + + public float GetFloat() + { + try + { + return reader.readFloat(); + } + catch (IOException e) + { + ErrorOut("[GetFloat] IOException=" + e.getMessage()); + } + return -1; + } + + // Sending results + + public void SendResult() + { + try + { + writer.writeByte(amkResult); + } + catch (IOException e) + { + ErrorOut("[SendResult] IOException=" + e.getMessage()); + } + } + + public void SendIntResult(int Result) + { + try + { + writer.writeByte(amkIntResult); + writer.writeInt(Result); + } + catch (IOException e) + { + ErrorOut("[SendIntResult] IOException=" + e.getMessage()); + } + } + + public void SendFloatResult(float Result) + { + try + { + writer.writeByte(amkFloatResult); + writer.writeFloat(Result); +// writer.writeInt(Float.floatToIntBits(Result)); + } + catch (IOException e) + { + ErrorOut("[SendFloatResult] IOException=" + e.getMessage()); + } + } + + // Sending data + + // Convenience routine, uses SendIntResult + public void SendBoolResult(boolean Result) + { + if (Result == false) SendIntResult(0); + else SendIntResult(-1); + } + + public void SendInt(int AData) + { + try + { + writer.writeInt(AData); + } + catch (IOException e) + { + ErrorOut("[SendBoolResult] IOException=" + e.getMessage()); + } + } + + public void SendMessage(byte AMessageKind, int AMessageSubtype) + { + try + { + writer.writeByte(AMessageKind); + writer.writeInt(AMessageSubtype); + } + catch (IOException e) + { + ErrorOut("[SendMessage] IOException=" + e.getMessage()); + System.exit(0); + } + } + +// String separator = System.getProperty("line.separator"); +/* // Displays a dialog with the result of the operation + AlertDialog alertDialog; + alertDialog = new AlertDialog.Builder(this).create(); + alertDialog.setTitle("Result of cp"); + alertDialog.setMessage(Str + "||" + Str2 + "||" + Str3); + alertDialog.show();*/ + // Waits until it finishes +// process.waitFor(); + // Thread.currentThread().sleep(1000); +} + diff --git a/examples/androidlcl/android/src/com/pascal/androidlcl/JavaLang.java b/examples/androidlcl/android/src/com/pascal/androidlcl/JavaLang.java new file mode 100644 index 000000000..0773ea79a --- /dev/null +++ b/examples/androidlcl/android/src/com/pascal/androidlcl/JavaLang.java @@ -0,0 +1,50 @@ +package com.pascal.androidlcl; + +import java.lang.*; +import java.util.*; + +public class JavaLang +{ + // info from other classes + AndroidPipesComm MyAndroidPipesComm; + + // lists of variables + ArrayList LangElements = new ArrayList(); + + // + static final int amkJavaLang_New_String = 0x0000; + + public JavaLang(AndroidPipesComm AAndroidPipesComm) + { + MyAndroidPipesComm = AAndroidPipesComm; + } + + public void DebugOut(String Str) + { + MyAndroidPipesComm.DebugOut(Str); + } + + public void ProcessCommand(int Buffer) + { + // DebugOut(""); + int lInt; + + switch (Buffer) + { + // java.lang.String + // String(char[] data) + case amkJavaLang_New_String: + DebugOut("amkJavaLang_New_String"); + lInt = MyAndroidPipesComm.GetInt(); // Length + char[] lChars = new char[lInt]; + for (int i = 0; i < lInt; i++) + { + lChars[i] = (char) MyAndroidPipesComm.GetByte(); + } + LangElements.add(new String(lChars)); + MyAndroidPipesComm.SendIntResult(LangElements.size() - 1); + break; + } + } +} + diff --git a/examples/androidlcl/androidlcltest.ico b/examples/androidlcl/androidlcltest.ico new file mode 100644 index 000000000..0341321b5 Binary files /dev/null and b/examples/androidlcl/androidlcltest.ico differ diff --git a/examples/androidlcl/androidlcltest.lpi b/examples/androidlcl/androidlcltest.lpi new file mode 100644 index 000000000..6e7c1dc2e --- /dev/null +++ b/examples/androidlcl/androidlcltest.lpi @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/androidlcl/androidlcltest.lpr b/examples/androidlcl/androidlcltest.lpr new file mode 100644 index 000000000..91c0832f7 --- /dev/null +++ b/examples/androidlcl/androidlcltest.lpr @@ -0,0 +1,20 @@ +program androidlcltest; + +{$mode objfpc}{$H+} + +uses + {$IFDEF UNIX}{$IFDEF UseCThreads} + cthreads, + {$ENDIF}{$ENDIF} + Interfaces, // this includes the LCL widgetset + Forms, mainform + { you can add units after this }; + +//{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm2, Form2); + Application.Run; +end. + diff --git a/examples/androidlcl/androidlcltest.res b/examples/androidlcl/androidlcltest.res new file mode 100644 index 000000000..7c6cf3e4b Binary files /dev/null and b/examples/androidlcl/androidlcltest.res differ diff --git a/examples/androidlcl/mainform.lfm b/examples/androidlcl/mainform.lfm new file mode 100644 index 000000000..2db36739e --- /dev/null +++ b/examples/androidlcl/mainform.lfm @@ -0,0 +1,18 @@ +object Form2: TForm2 + Left = 313 + Height = 240 + Top = 186 + Width = 320 + Caption = 'Form2' + ClientHeight = 240 + ClientWidth = 320 + LCLVersion = '0.9.31' + object Button1: TButton + Left = 33 + Height = 25 + Top = 35 + Width = 75 + Caption = 'Button1' + TabOrder = 0 + end +end diff --git a/examples/androidlcl/mainform.pas b/examples/androidlcl/mainform.pas new file mode 100644 index 000000000..5c6012897 --- /dev/null +++ b/examples/androidlcl/mainform.pas @@ -0,0 +1,32 @@ +unit mainform; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, + StdCtrls; + +type + + { TForm2 } + + TForm2 = class(TForm) + Button1: TButton; + private + { private declarations } + public + { public declarations } + end; + +var + Form2: TForm2; + +implementation + +initialization + {$I mainform.lrs} + +end. +