From 0a80e54a1dc186dd73bd4bda7b855c98662179c7 Mon Sep 17 00:00:00 2001 From: sekelsenmat Date: Mon, 8 Aug 2011 09:30:32 +0000 Subject: [PATCH] Android-SDK: Finishes fixing all compilation errors from generated Pascal and Java git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1785 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../android_bindings_generator.lpi | 140 ++++---- .../android-sdk/android_sdk_bindings_gen.pas | 323 ++++++++++-------- .../android-sdk/sdk_level_7/android_all.txt | 6 +- 3 files changed, 273 insertions(+), 196 deletions(-) diff --git a/bindings/android-sdk/android_bindings_generator.lpi b/bindings/android-sdk/android_bindings_generator.lpi index 88d83fb57..2681f715e 100644 --- a/bindings/android-sdk/android_bindings_generator.lpi +++ b/bindings/android-sdk/android_bindings_generator.lpi @@ -39,7 +39,7 @@ - + @@ -48,7 +48,7 @@ - + @@ -61,7 +61,7 @@ - + @@ -117,12 +117,11 @@ - - - - + + + @@ -160,22 +159,20 @@ - + - + - - - - + + @@ -195,132 +192,157 @@ - + + - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - - + + - + - + - + - + - - + + - - + + - + - + - + - + - + - - + + - - + + - - + + - - + + - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + + + + + diff --git a/bindings/android-sdk/android_sdk_bindings_gen.pas b/bindings/android-sdk/android_sdk_bindings_gen.pas index ac6d3662d..268d81206 100644 --- a/bindings/android-sdk/android_sdk_bindings_gen.pas +++ b/bindings/android-sdk/android_sdk_bindings_gen.pas @@ -19,6 +19,8 @@ type FJavaOutputIDs, FJavaOutputMethods: TStringList; FClassName, FClassNamePas: string; // Class name of the class currently being parsed FClassNum, FMethodNum: Integer; + procedure GeneratePascalFile(ASourceFile: string; ADest: TStringList); + procedure GenerateJavaFile(ASourceFile: string; ADest: TStringList); procedure ProcessModelFile(ASourceFile, APasOutputFile, AJavaOutputFile: string); procedure ProcessModelLine(ASourceLine: string); procedure ProcessModelClass(ASourceLine: string); @@ -31,8 +33,12 @@ type function PassByReference(ABaseName: string): Boolean; function GetJavaResultFunction(AReturnType: string): string; function GetJavaTypeReader(AType: string): string; + function GetJavaTypeLocalVar(AType: string): string; + function GetJavaTypeConverter(AType: string): string; function GetIDString(AMethodName: string): string; procedure AddOutputIDs(AIDString: string); + function ConvertPointToUnderline(AStr: string): string; + function IsBasicJavaType(AStr: string): Boolean; public constructor Create; destructor Destroy; override; @@ -46,6 +52,144 @@ implementation { TAndroidSDKBindingsGen } +procedure TAndroidSDKBindingsGen.GeneratePascalFile(ASourceFile: string; ADest: TStringList); +begin + ADest.Add(Format('unit %s;', [ChangeFileExt(ExtractFileName(ASourceFile), '')])); + ADest.Add(''); + ADest.Add('interface'); + ADest.Add(''); + ADest.Add('uses javalang, androidpipescomm;'); + ADest.Add(''); + ADest.Add('type'); + ADest.Add(''); + ADest.Add(' { Forward declaration of classes }'); + ADest.Add(''); + ADest.AddStrings(FPasOutputClassesForward); + ADest.Add(''); + ADest.Add(' { Types }'); + ADest.Add(''); + ADest.AddStrings(FPasOutputTypes); + ADest.Add(''); + ADest.Add(' { Classes }'); + ADest.Add(''); + ADest.AddStrings(FPasOutputClasses); + ADest.Add(' end;'); + ADest.Add(''); + ADest.Add('function HandleMessage(AFirstInt: Integer): Boolean;'); + ADest.Add(''); + ADest.Add('implementation'); + ADest.Add(''); + ADest.Add('const'); + ADest.Add(' { Constants }'); + ADest.Add(''); + ADest.AddStrings(FPasOutputConsts); + ADest.Add(''); + ADest.Add(' { IDs }'); + ADest.Add(''); + ADest.AddStrings(FPasOutputIDs); + ADest.Add(''); + ADest.Add('{ Implementation of Classes }'); + ADest.Add(''); + ADest.AddStrings(FPasOutputImpl); + ADest.Add(''); + ADest.Add('{ Message Handling }'); + ADest.Add(''); + ADest.Add('function HandleMessage(AFirstInt: Integer): Boolean;'); + ADest.Add('var'); + ADest.Add(' lInt: Integer;'); + ADest.Add(' lPascalPointer: PtrInt = -1;'); + ADest.Add('begin'); + ADest.Add(' case AFirstInt of'); + ADest.AddStrings(FPasOutputMessages); + ADest.Add(' end;'); + ADest.Add('end;'); + ADest.Add(''); + ADest.Add('end.'); +end; + +procedure TAndroidSDKBindingsGen.GenerateJavaFile(ASourceFile: string; ADest: TStringList); +begin + ADest.Add('package com.pascal.androidlcl;'); + ADest.Add(''); + ADest.Add('import android.app.*;'); + ADest.Add('import android.view.*;'); + ADest.Add('import android.os.*;'); + ADest.Add('import android.util.*;'); + ADest.Add('import android.content.*;'); + ADest.Add('import android.view.*;'); + ADest.Add('import android.widget.*;'); + ADest.Add('import java.util.*;'); + ADest.Add('import java.lang.*;'); + ADest.Add(''); + ADest.Add('public class AndroidAll'); + ADest.Add('{'); + ADest.Add(' // info from other classes'); + ADest.Add(' Activity activity;'); + ADest.Add(' AndroidPipesComm MyAndroidPipesComm;'); + ADest.Add(' JavaLang MyJavaLang;'); + ADest.Add(' // lists of variables'); + ADest.Add(' ArrayList ViewElements;'); + ADest.Add(''); + ADest.Add(' public AndroidAll(AndroidPipesComm AAndroidPipesComm, Activity AActivity, JavaLang AJavaLang)'); + ADest.Add(' {'); + ADest.Add(' activity = AActivity;'); + ADest.Add(' MyAndroidPipesComm = AAndroidPipesComm;'); + ADest.Add(' MyJavaLang = AJavaLang;'); + ADest.Add(' ViewElements = new ArrayList();'); + ADest.Add(' }'); + ADest.Add(''); + ADest.Add(' public void DebugOut(String Str)'); + ADest.Add(' {'); + ADest.Add(' MyAndroidPipesComm.DebugOut(Str);'); + ADest.Add(' }'); + ADest.Add(''); + ADest.AddStrings(FJavaOutputIDs); + ADest.Add(''); + ADest.Add(' public boolean ProcessCommand(int Buffer)'); + ADest.Add(' {'); + ADest.Add(' //DebugOut("AndroidUI.ProcessCommand Command=" + java.lang.Integer.toHexString(Buffer));'); + ADest.Add(' // basic types'); + ADest.Add(' int lInt, lIndex, lPascalPointer;'); + ADest.Add(' boolean lBool;'); + ADest.Add(' float lFloat;'); + ADest.Add(' // Self params'); + ADest.Add(' View param_self_View;'); + ADest.Add(' ViewGroup param_self_ViewGroup;'); + ADest.Add(' TextView param_self_TextView;'); + ADest.Add(' Button param_self_Button;'); + ADest.Add(' EditText param_self_EditText;'); + ADest.Add(' LinearLayout param_self_LinearLayout;'); + ADest.Add(' TimePicker param_self_TimePicker;'); + ADest.Add(' Display param_self_Display;'); + ADest.Add(' DisplayMetrics param_self_DisplayMetrics;'); + ADest.Add(' CompoundButton param_self_CompoundButton;'); + ADest.Add(' WindowManager param_self_WindowManager;'); + ADest.Add(' // Params'); + ADest.Add(' ViewGroup.LayoutParams lViewGroup_LayoutParams_1;'); + ADest.Add(' DisplayMetrics lDisplayMetrics_1;'); + ADest.Add(' CharSequence lCharSequence_1;'); + ADest.Add(' int lint_1, lint_2, lint_3, lint_4;'); + ADest.Add(' float lfloat_1, lfloat_2;'); + ADest.Add(' boolean lboolean_1;'); + ADest.Add(' // Results'); + ADest.Add(' float lResult_float;'); + ADest.Add(' int lResult_int;'); + ADest.Add(' boolean lResult_boolean;'); + ADest.Add(' Display lResult_Display;'); + ADest.Add(''); + ADest.Add(' switch (Buffer)'); + ADest.Add(' {'); + ADest.Add(''); + ADest.AddStrings(FJavaOutputMethods); + ADest.Add(''); + ADest.Add(' default:'); + ADest.Add(' return false;'); + ADest.Add(' }'); + ADest.Add(' return true;'); + ADest.Add(' }'); + ADest.Add('}'); +end; + procedure TAndroidSDKBindingsGen.ProcessModelFile(ASourceFile, APasOutputFile, AJavaOutputFile: string); var @@ -67,137 +211,11 @@ begin end; // Now save the Pascal file - lPasOutputFile.Add(Format('unit %s;', [ChangeFileExt(ExtractFileName(ASourceFile), '')])); - lPasOutputFile.Add(''); - lPasOutputFile.Add('interface'); - lPasOutputFile.Add(''); - lPasOutputFile.Add('uses javalang, androidpipescomm;'); - lPasOutputFile.Add(''); - lPasOutputFile.Add('type'); - lPasOutputFile.Add(''); - lPasOutputFile.Add(' { Forward declaration of classes }'); - lPasOutputFile.Add(''); - lPasOutputFile.AddStrings(FPasOutputClassesForward); - lPasOutputFile.Add(''); - lPasOutputFile.Add(' { Types }'); - lPasOutputFile.Add(''); - lPasOutputFile.AddStrings(FPasOutputTypes); - lPasOutputFile.Add(''); - lPasOutputFile.Add(' { Classes }'); - lPasOutputFile.Add(''); - lPasOutputFile.AddStrings(FPasOutputClasses); - lPasOutputFile.Add(' end;'); - lPasOutputFile.Add(''); - lPasOutputFile.Add('function HandleMessage(AFirstInt: Integer): Boolean;'); - lPasOutputFile.Add(''); - lPasOutputFile.Add('implementation'); - lPasOutputFile.Add(''); - lPasOutputFile.Add('const'); - lPasOutputFile.Add(' { Constants }'); - lPasOutputFile.Add(''); - lPasOutputFile.AddStrings(FPasOutputConsts); - lPasOutputFile.Add(''); - lPasOutputFile.Add(' { IDs }'); - lPasOutputFile.Add(''); - lPasOutputFile.AddStrings(FPasOutputIDs); - lPasOutputFile.Add(''); - lPasOutputFile.Add('{ Implementation of Classes }'); - lPasOutputFile.Add(''); - lPasOutputFile.AddStrings(FPasOutputImpl); - lPasOutputFile.Add(''); - lPasOutputFile.Add('{ Message Handling }'); - lPasOutputFile.Add(''); - lPasOutputFile.Add('function HandleMessage(AFirstInt: Integer): Boolean;'); - lPasOutputFile.Add('var'); - lPasOutputFile.Add(' lInt: Integer;'); - lPasOutputFile.Add(' lPascalPointer: PtrInt = -1;'); - lPasOutputFile.Add('begin'); - lPasOutputFile.Add(' case AFirstInt of'); - lPasOutputFile.AddStrings(FPasOutputMessages); - lPasOutputFile.Add(' end;'); - lPasOutputFile.Add('end;'); - lPasOutputFile.Add(''); - lPasOutputFile.Add('end.'); + GeneratePascalFile(ASourceFile, lPasOutputFile); lPasOutputFile.SaveToFile(APasOutputFile); - lJavaOutputFile.Add('package com.pascal.androidlcl;'); - lJavaOutputFile.Add(''); - lJavaOutputFile.Add('import android.app.*;'); - lJavaOutputFile.Add('import android.view.*;'); - lJavaOutputFile.Add('import android.os.*;'); - lJavaOutputFile.Add('import android.util.*;'); - lJavaOutputFile.Add('import android.content.*;'); - lJavaOutputFile.Add('import android.view.*;'); - lJavaOutputFile.Add('import android.widget.*;'); - lJavaOutputFile.Add('import java.util.*;'); - lJavaOutputFile.Add('import java.lang.*;'); - lJavaOutputFile.Add(''); - lJavaOutputFile.Add('public class AndroidAll'); - lJavaOutputFile.Add('{'); - lJavaOutputFile.Add(' // info from other classes'); - lJavaOutputFile.Add(' Activity activity;'); - lJavaOutputFile.Add(' AndroidPipesComm MyAndroidPipesComm;'); - lJavaOutputFile.Add(' JavaLang MyJavaLang;'); - lJavaOutputFile.Add(' // lists of variables'); - lJavaOutputFile.Add(' ArrayList ViewElements;'); - lJavaOutputFile.Add(''); - lJavaOutputFile.Add(' public AndroidAll(AndroidPipesComm AAndroidPipesComm, Activity AActivity, JavaLang AJavaLang)'); - lJavaOutputFile.Add(' {'); - lJavaOutputFile.Add(' activity = AActivity;'); - lJavaOutputFile.Add(' MyAndroidPipesComm = AAndroidPipesComm;'); - lJavaOutputFile.Add(' MyJavaLang = AJavaLang;'); - lJavaOutputFile.Add(' ViewElements = new ArrayList();'); - lJavaOutputFile.Add(' }'); - lJavaOutputFile.Add(''); - lJavaOutputFile.Add(' public void DebugOut(String Str)'); - lJavaOutputFile.Add(' {'); - lJavaOutputFile.Add(' MyAndroidPipesComm.DebugOut(Str);'); - lJavaOutputFile.Add(' }'); - lJavaOutputFile.Add(''); - lJavaOutputFile.AddStrings(FJavaOutputIDs); - lJavaOutputFile.Add(''); - lJavaOutputFile.Add(' public boolean ProcessCommand(int Buffer)'); - lJavaOutputFile.Add(' {'); - lJavaOutputFile.Add(' //DebugOut("AndroidUI.ProcessCommand Command=" + java.lang.Integer.toHexString(Buffer));'); - lJavaOutputFile.Add(' // basic types'); - lJavaOutputFile.Add(' int lInt, lIndex, lPascalPointer;'); - lJavaOutputFile.Add(' // Self params'); - lJavaOutputFile.Add(' View param_self_View;'); - lJavaOutputFile.Add(' ViewGroup param_self_ViewGroup;'); - lJavaOutputFile.Add(' TextView param_self_TextView;'); - lJavaOutputFile.Add(' Button param_self_Button;'); - lJavaOutputFile.Add(' EditText param_self_EditText;'); - lJavaOutputFile.Add(' LinearLayout param_self_LinearLayout;'); - lJavaOutputFile.Add(' TimePicker param_self_TimePicker;'); - lJavaOutputFile.Add(' Display param_self_Display;'); - lJavaOutputFile.Add(' DisplayMetrics param_self_DisplayMetrics;'); - lJavaOutputFile.Add(' CompoundButton param_self_CompoundButton;'); - lJavaOutputFile.Add(' WindowManager param_self_WindowManager;'); - lJavaOutputFile.Add(' // Params'); - lJavaOutputFile.Add(' ViewGroup.LayoutParams lLayoutParams_1;'); - lJavaOutputFile.Add(' DisplayMetrics lDisplayMetrics_1;'); - lJavaOutputFile.Add(' CharSequence lCharSequence_1;'); - lJavaOutputFile.Add(' int lint_1, lint_2, lint_3, lint_4;'); - lJavaOutputFile.Add(' float lfloat_1, lfloat_2;'); - lJavaOutputFile.Add(' boolean lboolean_1;'); - lJavaOutputFile.Add(' // Results'); - lJavaOutputFile.Add(' float lResult_float;'); - lJavaOutputFile.Add(' int lResult_int;'); - lJavaOutputFile.Add(' boolean lResult_boolean;'); - lJavaOutputFile.Add(' Display lResult_Display;'); - lJavaOutputFile.Add(''); - lJavaOutputFile.Add(' switch (Buffer)'); - lJavaOutputFile.Add(' {'); - lJavaOutputFile.Add(''); - lJavaOutputFile.AddStrings(FJavaOutputMethods); - lJavaOutputFile.Add(''); - lJavaOutputFile.Add(' default:'); - lJavaOutputFile.Add(' return false;'); - lJavaOutputFile.Add(' }'); - lJavaOutputFile.Add(' return true;'); - lJavaOutputFile.Add(' }'); - lJavaOutputFile.Add('}'); + GenerateJavaFile(ASourceFile, lJavaOutputFile); lJavaOutputFile.SaveToFile(AJavaOutputFile); finally @@ -357,8 +375,11 @@ begin FPasOutputImpl.Add(' vAndroidPipesComm.SendInt(Integer(' + lParamName + '));'); // Java parameter reading - lJavaParamVar := 'l' + lParamType + '_' + IntToStr(lParamNum); - FJavaOutputMethods.Add(' ' + lJavaParamVar + ' = MyAndroidPipesComm.' + GetJavaTypeReader(lParamType) + '();'); + lJavaParamVar := Format('l%s_%d', [ConvertPointToUnderline(lParamType), lParamNum]); + FJavaOutputMethods.Add(Format(' %s = MyAndroidPipesComm.%s();', + [GetJavaTypeLocalVar(lParamType), GetJavaTypeReader(lParamType)])); + FJavaOutputMethods.Add(Format(' %s = %s;', + [lJavaParamVar, GetJavaTypeConverter(lParamType)])); lJavaParams := lJavaParams + lJavaParamVar + ', '; Inc(lParamNum); @@ -401,7 +422,13 @@ begin else begin FJavaOutputMethods.Add(' lResult_' + lMethodReturn + ' = ' + lJavaParamSelf + '.' + lMethodName + '(' + lJavaParams + ');'); - FJavaOutputMethods.Add(' MyAndroidPipesComm.' + GetJavaResultFunction(lMethodReturn) + '(lResult_' + lMethodReturn + ');'); + if IsBasicJavaType(lMethodReturn) then + FJavaOutputMethods.Add(' MyAndroidPipesComm.' + GetJavaResultFunction(lMethodReturn) + '(lResult_' + lMethodReturn + ');') + else + begin + FJavaOutputMethods.Add(Format(' ViewElements.add(lResult_%s);', [lMethodReturn])); + FJavaOutputMethods.Add(Format(' MyAndroidPipesComm.%s(ViewElements.size() - 1);', [GetJavaResultFunction(lMethodReturn)])) + end; end; FJavaOutputMethods.Add(' break;'); @@ -430,9 +457,7 @@ begin AddOutputIDs(lIDString); - FPasOutputClasses.Add(' constructor ' + lMethodName + '();'); - - FPasOutputImpl.Add('constructor ' + FClassNamePas + '.' + lMethodName + '();'); + FPasOutputImplCurLine := FPasOutputImpl.Count; FPasOutputImpl.Add('begin'); FPasOutputImpl.Add(' vAndroidPipesComm.SendByte(ShortInt(amkUICommand));'); FPasOutputImpl.Add(' vAndroidPipesComm.SendInt(' + lIDString + ');'); @@ -488,6 +513,10 @@ begin // Finalization of the constructor + FPasOutputClasses.Add(Format(' constructor %s(%s);', [lMethodName, lConstructorPasParams])); + // + FPasOutputImpl.Insert(FPasOutputImplCurLine, + Format('constructor %s.%s(%s);', [FClassNamePas, lMethodName, lConstructorPasParams])); FPasOutputImpl.Add(' Index := vAndroidPipesComm.WaitForIntReturn();'); FPasOutputImpl.Add('end;'); @@ -656,9 +685,25 @@ end; function TAndroidSDKBindingsGen.GetJavaTypeReader(AType: string): string; begin if AType = 'boolean' then Exit('GetBool') + else if AType = 'float' then Exit('GetFloat') else Exit('GetInt'); end; +function TAndroidSDKBindingsGen.GetJavaTypeLocalVar(AType: string): string; +begin + if AType = 'boolean' then Exit('lBool') + else if AType = 'float' then Exit('lFloat') + else Exit('lInt'); +end; + +function TAndroidSDKBindingsGen.GetJavaTypeConverter(AType: string): string; +begin + if AType = 'boolean' then Exit('lBool') + else if AType = 'int' then Exit('lInt') + else if AType = 'float' then Exit('lFloat') + else Result := Format('(%s) ViewElements.get(lInt)', [AType]); +end; + function TAndroidSDKBindingsGen.GetIDString(AMethodName: string): string; begin Result := 'amkUI_' + FClassNamePas + '_' + AMethodName;; @@ -671,6 +716,16 @@ begin FJavaOutputIDs.Add(' static final int ' + AIDString + ' = 0x' + IntToHex(FClassNum*$1000+FMethodNum, 8) + ';'); end; +function TAndroidSDKBindingsGen.ConvertPointToUnderline(AStr: string): string; +begin + Result := SysUtils.StringReplace(AStr, '.', '_', [rfReplaceAll, rfIgnoreCase]); +end; + +function TAndroidSDKBindingsGen.IsBasicJavaType(AStr: string): Boolean; +begin + Result := (AStr = 'boolean') or (AStr = 'int') or (AStr = 'float'); +end; + constructor TAndroidSDKBindingsGen.Create; begin FSourceFile := TStringList.Create; diff --git a/bindings/android-sdk/sdk_level_7/android_all.txt b/bindings/android-sdk/sdk_level_7/android_all.txt index 86303aa26..27976e1b2 100644 --- a/bindings/android-sdk/sdk_level_7/android_all.txt +++ b/bindings/android-sdk/sdk_level_7/android_all.txt @@ -35,7 +35,7 @@ constructor Create(int width, int height); const FILL_PARENT = $FFFFFFFF; [View] TJavaObject -method void setLayoutParams(LayoutParams params); +method void setLayoutParams(ViewGroup.LayoutParams params); method void setVisibility(int visibility); const VISIBLE = 0; const INVISIBLE = 4; @@ -54,7 +54,7 @@ const VERTICAL = 1; [AbsoluteLayout] ViewGroup constructor Create(Activity); -[AbsoluteLayout_LayoutParams] LayoutParams +[AbsoluteLayout.LayoutParams] ViewGroup.LayoutParams constructor Create(int param_width, int param_height, int param_x, int param_y); [TextView] View @@ -86,7 +86,7 @@ method void setIs24HourView(boolean AIs24HourView); constructor Create(Activity); [CompoundButton] Button -constructor Create(Activity) +#constructor Create(Activity) abstract method boolean isChecked() method boolean performClick() method void setChecked(boolean checked)