' Class Module: NativeDialogs
Sub Class_Globals
Private xui As XUI
Public mTargetDialog As B4XDialog
End Sub
Public Sub Initialize (TargetB4XDialog As B4XDialog)
mTargetDialog = TargetB4XDialog
End Sub
' Native Time Wheel Dialog
Public Sub ShowTimeDialog(Title As String, InitialTicks As Long) As ResumableSub
Dim hour As Int = DateTime.GetHour(InitialTicks)
Dim minute As Int = DateTime.GetMinute(InitialTicks)
Dim ctxt As JavaObject
ctxt.InitializeContext
' Fetch HoloWheelTheme from Manifest
Dim res As JavaObject = ctxt.RunMethod("getResources", Null)
Dim pkgName As String = ctxt.RunMethod("getPackageName", Null)
Dim themeResId As Int = res.RunMethod("getIdentifier", Array("HoloWheelTheme", "style", pkgName))
If themeResId = 0 Then themeResId = 16973931 ' Fallback to Theme_Holo_Light_Dialog
Dim themeWrapper As JavaObject
themeWrapper.InitializeNewInstance("android.view.ContextThemeWrapper", Array(ctxt, themeResId))
Dim OnTimeSetListener As Object = ctxt.CreateEventFromUI("android.app.TimePickerDialog$OnTimeSetListener", "OnNativeTimeSet", Null)
Dim tpd As JavaObject
tpd.InitializeNewInstance("android.app.TimePickerDialog", Array(themeWrapper, OnTimeSetListener, hour, minute, True))
If Title <> "" Then tpd.RunMethod("setTitle", Array(Title))
tpd.RunMethod("show", Null)
Wait For OnNativeTimeSet_Event (MethodName As String, Args() As Object)
If Args <> Null And Args.Length >= 3 Then
Dim selHour As Int = Args(1)
Dim selMin As Int = Args(2)
Dim todayDateTicks As Long = DateTime.DateParse(DateTime.Date(DateTime.Now))
Dim hoursTicks As Long = selHour * DateTime.TicksPerHour
Dim minutesTicks As Long = selMin * DateTime.TicksPerMinute
Return todayDateTicks + hoursTicks + minutesTicks
Else
Dim cancelReturn As Long = -1
Return cancelReturn
End If
End Sub
' Native Date Wheel Dialog
Public Sub ShowDateDialog(InitialTicks As Long) As ResumableSub
Dim c As JavaObject
c = c.InitializeStatic("java.util.Calendar").RunMethod("getInstance", Null)
c.RunMethod("setTimeInMillis", Array(InitialTicks))
Dim year As Int = c.RunMethod("get", Array(1))
Dim month As Int = c.RunMethod("get", Array(2))
Dim day As Int = c.RunMethod("get", Array(5))
Dim ctxt As JavaObject
ctxt.InitializeContext
Dim res As JavaObject = ctxt.RunMethod("getResources", Null)
Dim pkgName As String = ctxt.RunMethod("getPackageName", Null)
Dim themeResId As Int = res.RunMethod("getIdentifier", Array("HoloWheelTheme", "style", pkgName))
If themeResId = 0 Then themeResId = 16973931
Dim themeWrapper As JavaObject
themeWrapper.InitializeNewInstance("android.view.ContextThemeWrapper", Array(ctxt, themeResId))
Dim OnDateSetListener As Object = ctxt.CreateEventFromUI("android.app.DatePickerDialog$OnDateSetListener", "OnNativeDateSet", Null)
Dim dpd As JavaObject
dpd.InitializeNewInstance("android.app.DatePickerDialog", Array(themeWrapper, OnDateSetListener, year, month, day))
dpd.RunMethod("show", Null)
Wait For OnNativeDateSet_Event (MethodName As String, Args() As Object)
If Args <> Null And Args.Length >= 4 Then
Dim selYear As Int = Args(1)
Dim selMonth As Int = Args(2) + 1
Dim selDay As Int = Args(3)
DateTime.DateFormat = "dd/MM/yyyy"
Dim dateStr As String = $"${NumberFormat(selDay, 2, 0)}/${NumberFormat(selMonth, 2, 0)}/${selYear}"$
Return DateTime.DateParse(dateStr)
Else
Dim cancelReturn As Long = -1
Return cancelReturn
End If
End Sub
' B4XInputTemplate Dialog
Public Sub ShowInputDialog(Title As String, Prompt As String, InitialText As String, ConfirmText As String, CancelText As String, IsRTL As Boolean, IsNumeric As Boolean, AllowDecimals As Boolean) As ResumableSub
If mTargetDialog.IsInitialized = False Then
Log("Error: B4XDialog (mTargetDialog) was not initialized in NativeDialogs!")
Return Null
End If
Sleep(50)
Dim inputTemplate As B4XInputTemplate
inputTemplate.Initialize
inputTemplate.lblTitle.Text = Prompt
inputTemplate.lblTitle.Font = xui.CreateDefaultFont(13)
inputTemplate.Text = InitialText
If IsNumeric Then
inputTemplate.ConfigureForNumbers(AllowDecimals, False)
End If
If IsRTL Then
inputTemplate.TextField1.SetTextAlignment("CENTER", "RIGHT")
inputTemplate.lblTitle.SetTextAlignment("CENTER","RIGHT") 'HEBREW ONLY!!
Else
inputTemplate.TextField1.SetTextAlignment("CENTER", "LEFT")
inputTemplate.lblTitle.SetTextAlignment("CENTER","LEFT") 'ENGLISH ONLY!!
End If
mTargetDialog.Title = Title
Dim rs As ResumableSub = mTargetDialog.ShowTemplate(inputTemplate, ConfirmText, "", CancelText)
Try
If mTargetDialog.Base.IsInitialized Then
Dim parentView As B4XView = mTargetDialog.Base.Parent
If parentView.IsInitialized Then
mTargetDialog.Base.Top = parentView.Height * 0.15
End If
End If
Catch
Log(LastException)
End Try
Wait For (rs) Complete (Result As Int)
If Result = xui.DialogResponse_Positive Then
Return inputTemplate.Text.Trim
Else
Return Null
End If
End Sub