diff --git a/bindings/android-sdk/android_bindings_generator.lpi b/bindings/android-sdk/android_bindings_generator.lpi index 23a940fc2..88d83fb57 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 @@ - + @@ -60,8 +60,8 @@ - - + + @@ -107,23 +107,22 @@ - - - - - + + + + - - - + + + @@ -152,31 +151,30 @@ - - + - - - + + + + - - - - + + + @@ -187,128 +185,142 @@ + + + + + + + + + + + + + + + + + + - + - + - + - + - - + + - + - + - - + + - - + + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - - + + - + - - + + - + - - - - diff --git a/bindings/android-sdk/android_sdk_bindings_gen.pas b/bindings/android-sdk/android_sdk_bindings_gen.pas index c77388126..ac6d3662d 100644 --- a/bindings/android-sdk/android_sdk_bindings_gen.pas +++ b/bindings/android-sdk/android_sdk_bindings_gen.pas @@ -22,7 +22,7 @@ type procedure ProcessModelFile(ASourceFile, APasOutputFile, AJavaOutputFile: string); procedure ProcessModelLine(ASourceLine: string); procedure ProcessModelClass(ASourceLine: string); - procedure ProcessModelMethod(ASourceLine: string); + procedure ProcessModelMethod(ASourceLine: string; AIsField: Boolean); procedure ProcessModelConstructor(ASourceLine: string); procedure ProcessModelConst(ASourceLine: string); procedure ProcessModelCallbackSetterCaller(ASourceLine: string); @@ -121,12 +121,83 @@ begin lPasOutputFile.SaveToFile(APasOutputFile); - // Now save the Java file + 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('}'); lJavaOutputFile.SaveToFile(AJavaOutputFile); finally @@ -157,7 +228,7 @@ begin // Adding methods to a class if lCurWord = 'method' then begin - ProcessModelMethod(ASourceLine); + ProcessModelMethod(ASourceLine, False); Exit; end; @@ -180,6 +251,13 @@ begin ProcessModelCallbackSetterCaller(ASourceLine); Exit; end; + + // Fields + if lCurWord = 'field' then + begin + ProcessModelMethod(ASourceLine, True); + Exit; + end; end; procedure TAndroidSDKBindingsGen.ProcessModelClass(ASourceLine: string); @@ -214,7 +292,7 @@ begin end; procedure TAndroidSDKBindingsGen.ProcessModelMethod( - ASourceLine: string); + ASourceLine: string; AIsField: Boolean); var lReaderPos: Integer = 1; lParamNum: Integer = 1; @@ -287,7 +365,8 @@ begin until lParamName = ''; // Remove the last ; for the parameters, if necessary - if TmpStr[Length(TmpStr)-1] = ';' then TmpStr := System.Copy(TmpStr, 0, Length(TmpStr)-2); + if (Length(TmpStr) > 0) and (TmpStr[Length(TmpStr)-1] = ';') then + TmpStr := System.Copy(TmpStr, 0, Length(TmpStr)-2); // And for Java params too lJavaParams := System.Copy(lJavaParams, 0, Length(lJavaParams)-2); @@ -309,7 +388,12 @@ begin FPasOutputImpl.Add(''); FJavaOutputMethods.Add(' //'); - if lMethodReturn = 'void' then + if AIsField then + begin + FJavaOutputMethods.Add(' lResult_' + lMethodReturn + ' = ' + lJavaParamSelf + '.' + lMethodName + ';'); + FJavaOutputMethods.Add(' MyAndroidPipesComm.' + GetJavaResultFunction(lMethodReturn) + '(lResult_' + lMethodReturn + ');'); + end + else if lMethodReturn = 'void' then begin FJavaOutputMethods.Add(' ' + lJavaParamSelf + '.' + lMethodName + '(' + lJavaParams + ');'); FJavaOutputMethods.Add(' MyAndroidPipesComm.SendResult();'); @@ -330,8 +414,10 @@ var lCurWord: string; lParamNum: Integer = 1; lMethodName, lParamType, lParamTypePas, lParamName: string; - DeclarationBase, TmpStr, lIDString: string; + lConstructorPasParams, lConstructorJavaParams, lParamPrefix, lJavaParamVar: string; + DeclarationBase, lIDString: string; FPasOutputImplCurLine: Integer; + HasActivityParam: Boolean = False; begin if ASourceLine = '' then Exit; @@ -342,20 +428,70 @@ begin lIDString := GetIDString(lMethodName); + AddOutputIDs(lIDString); + FPasOutputClasses.Add(' constructor ' + lMethodName + '();'); FPasOutputImpl.Add('constructor ' + FClassNamePas + '.' + lMethodName + '();'); FPasOutputImpl.Add('begin'); FPasOutputImpl.Add(' vAndroidPipesComm.SendByte(ShortInt(amkUICommand));'); FPasOutputImpl.Add(' vAndroidPipesComm.SendInt(' + lIDString + ');'); - FPasOutputImpl.Add(' Index := vAndroidPipesComm.WaitForIntReturn();'); - FPasOutputImpl.Add('end;'); - - AddOutputIDs(lIDString); FJavaOutputMethods.Add(' case ' + lIDString + ':'); FJavaOutputMethods.Add(' DebugOut("' + lIDString + '");'); - FJavaOutputMethods.Add(' ViewElements.add(new ' + FClassName + '(activity));'); + + // Constructor parameters + lConstructorJavaParams := ''; + lConstructorPasParams := ''; + + repeat + lParamType := GetNextWord(ASourceLine, lReaderPos); + + // Method modifiers + if (lParamType = 'virtual') or (lParamType = 'override') then Continue; + + // The Activity global object doesn't appear in the Pascal side and + //comes as a single word in the txt file + if (lParamType = 'Activity') then + begin + HasActivityParam := True; + Continue; + end; + + lParamTypePas := GetPascalTypeName(lParamType); + lParamName := GetNextWord(ASourceLine, lReaderPos); + if PassByReference(lParamType) then lParamPrefix := 'var ' + else lParamPrefix := ''; + + if lParamName = '' then Break; + + lConstructorPasParams := lConstructorPasParams + lParamPrefix + lParamName + ': ' + lParamTypePas + '; '; + + // Pascal parameter sending + FPasOutputImpl.Add(' vAndroidPipesComm.SendInt(Integer(' + lParamName + '));'); + + // Java parameter reading + lJavaParamVar := 'l' + lParamType + '_' + IntToStr(lParamNum); + FJavaOutputMethods.Add(' ' + lJavaParamVar + ' = MyAndroidPipesComm.' + GetJavaTypeReader(lParamType) + '();'); + lConstructorJavaParams := lConstructorJavaParams + lJavaParamVar + ', '; + + Inc(lParamNum); + until lParamName = ''; + + if HasActivityParam then lConstructorJavaParams := 'activity, ' + lConstructorJavaParams; + + // Remove the last ; for the parameters, if necessary + if (Length(lConstructorPasParams) > 0) and (lConstructorPasParams[Length(lConstructorPasParams)-1] = ';') then + lConstructorPasParams := System.Copy(lConstructorPasParams, 0, Length(lConstructorPasParams)-2); + // And for Java params too + lConstructorJavaParams := System.Copy(lConstructorJavaParams, 0, Length(lConstructorJavaParams)-2); + + // Finalization of the constructor + + FPasOutputImpl.Add(' Index := vAndroidPipesComm.WaitForIntReturn();'); + FPasOutputImpl.Add('end;'); + + FJavaOutputMethods.Add(' ViewElements.add(new ' + FClassName + '(' + lConstructorJavaParams + '));'); FJavaOutputMethods.Add(' MyAndroidPipesComm.SendIntResult(ViewElements.size() - 1);'); FJavaOutputMethods.Add(' break;'); @@ -492,7 +628,11 @@ begin else if ABaseName = 'void' then Result := ABaseName else if ABaseName = 'CharSequence' then Result := 'string' else if ABaseName = 'TJavaObject' then Result := ABaseName - else Result := 'T' + ABaseName; + else + begin + Result := 'T' + ABaseName; + Result := StringReplace(Result, '.', '_', [rfReplaceAll]); + end; end; function TAndroidSDKBindingsGen.PassByReference(ABaseName: string): Boolean; @@ -509,6 +649,7 @@ function TAndroidSDKBindingsGen.GetJavaResultFunction(AReturnType: string ): string; begin if AReturnType = 'boolean' then Result := 'SendBoolResult' + else if AReturnType = 'float' then Result := 'SendFloatResult' else Result := 'SendIntResult'; end; @@ -521,6 +662,7 @@ end; function TAndroidSDKBindingsGen.GetIDString(AMethodName: string): string; begin Result := 'amkUI_' + FClassNamePas + '_' + AMethodName;; + Result := StringReplace(Result, '.', '_', [rfReplaceAll]); end; procedure TAndroidSDKBindingsGen.AddOutputIDs(AIDString: string); @@ -570,7 +712,7 @@ procedure TAndroidSDKBindingsGen.GenerateAllBindings(AInputDir, APasOutputDir, begin ProcessModelFile(IncludeTrailingPathDelimiter(AInputDir) + 'android_all.txt', IncludeTrailingPathDelimiter(APasOutputDir) + 'android_all.pas', - IncludeTrailingPathDelimiter(AJavaOutputDir) + 'android_all.java'); + IncludeTrailingPathDelimiter(AJavaOutputDir) + 'AndroidAll.java'); end; initialization diff --git a/bindings/android-sdk/sdk_level_7/android_all.txt b/bindings/android-sdk/sdk_level_7/android_all.txt index 5cb4dfab2..86303aa26 100644 --- a/bindings/android-sdk/sdk_level_7/android_all.txt +++ b/bindings/android-sdk/sdk_level_7/android_all.txt @@ -10,13 +10,13 @@ # [DisplayMetrics] TJavaObject constructor Create() -method float density() -method int densityDpi() -method int heightPixels() -method float scaledDensity() -method int widthPixels() -method float xdpi() -method float ydpi() +field float density +field int densityDpi +field int heightPixels +field float scaledDensity +field int widthPixels +field float xdpi +field float ydpi # # android.app.* @@ -30,7 +30,7 @@ method Display getDefaultDisplay() # # android.view # -[LayoutParams] TJavaObject +[ViewGroup.LayoutParams] TJavaObject constructor Create(int width, int height); const FILL_PARENT = $FFFFFFFF; @@ -46,35 +46,35 @@ procedure addView(View child, LayoutParams params); procedure addView(View child); [LinearLayout] ViewGroup -constructor Create(); +constructor Create(Activity); procedure setOrientation(int orientation); const HORIZONTAL = 0; const VERTICAL = 1; [AbsoluteLayout] ViewGroup -constructor Create(); +constructor Create(Activity); [AbsoluteLayout_LayoutParams] LayoutParams constructor Create(int param_width, int param_height, int param_x, int param_y); [TextView] View -constructor Create(); virtual; +constructor Create(Activity); virtual; method void setText(CharSequence AText); virtual; callbacksettercaller setOnClickListener callOnClickListener OnClickListener = procedure (v: TView) of object; method void setTextSize(int unit_; float size); [EditText] TextView -constructor Create(); override; +constructor Create(Activity); override; method void setText(CharSequence AText); override; [Button] TextView -constructor Create(); override; +constructor Create(Activity); override; method void setText(CharSequence AText); override; [FrameLayout] ViewGroup [TimePicker] FrameLayout -constructor Create(); +constructor Create(Activity); method int getCurrentHour(); method void setCurrentHour(int currentHour); method int getCurrentMinute; @@ -83,9 +83,10 @@ method boolean is24HourView; method void setIs24HourView(boolean AIs24HourView); [ScrollView] FrameLayout -constructor Create(); +constructor Create(Activity); [CompoundButton] Button +constructor Create(Activity) method boolean isChecked() method boolean performClick() method void setChecked(boolean checked) @@ -93,5 +94,5 @@ method void setChecked(boolean checked) method void toggle() [CheckBox] CompoundButton -constructor Create() +constructor Create(Activity)