diff --git a/B4A/B4XMainPage.bas b/B4A/B4XMainPage.bas index 6af1c9e..1b5a80c 100644 --- a/B4A/B4XMainPage.bas +++ b/B4A/B4XMainPage.bas @@ -5,8 +5,8 @@ Type=Class Version=9.85 @EndOfDesignText@ #Region Shared Files -'#CustomBuildAction: folders ready, %WINDIR%\System32\Robocopy.exe,"..\..\Shared Files" "..\Files" -'Ctrl + click to sync files: ide://run?file=%WINDIR%\System32\Robocopy.exe&args=..\..\Shared+Files&args=..\Files&FilesSync=True + '#CustomBuildAction: folders ready, %WINDIR%\System32\Robocopy.exe,"..\..\Shared Files" "..\Files" + 'Ctrl + click to sync files: ide://run?file=%WINDIR%\System32\Robocopy.exe&args=..\..\Shared+Files&args=..\Files&FilesSync=True '########################################################################################################### '###################### PULL ############################################################# 'Ctrl + click ide://run?file=%WINDIR%\System32\cmd.exe&Args=/c&Args=git&Args=pull @@ -94,6 +94,8 @@ Sub Class_Globals Private b_envioBD As Button Public Provider As FileProvider Public rutaBDBackup = "" + Private b_importarBD As Button + Private p_botones As Panel End Sub Public Sub Initialize @@ -141,8 +143,8 @@ Private Sub B4XPage_Created (Root1 As B4XView) ruta = Starter.ruta Provider.Initialize - Subs.borraArribaDe100Errores ' Para Websockets - Subs.borraArribaDe600RenglonesBitacora ' Para Websockets +' Subs.borraArribaDe100Errores ' Para Websockets +' Subs.borraArribaDe600RenglonesBitacora ' Para Websockets If File.Exists(ruta, "kmt.db") = False Then File.Copy(File.DirAssets, "kmt.db", ruta, "kmt.db") End If @@ -168,9 +170,7 @@ Private Sub B4XPage_Created (Root1 As B4XView) skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS ENCUESTA_MODULO5 (CLIENTE TEXT, ALMACEN TEXT,P1 TEXT, P2 TEXT, P3 TEXT , P4 TEXT, P5 TEXT, P6 TEXT, P7 TEXT, P8 TEXT, P9 TEXT)") skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_ENCUESTA_CLIENTE (HEC_CLIENTE TEXT, HEC_MODULO TEXT)") - - - c=skmt.ExecQuery("select COUNT(*) AS CUANTOS from HIST_STAY_OUT ") + c = skmt.ExecQuery("select COUNT(*) AS CUANTOS from HIST_STAY_OUT ") C.Position = 0 If c.GetString("CUANTOS") = 0 Then skmt.ExecNonQuery("INSERT INTO HIST_STAY_OUT(HSO_INI, HSO_FIN) VALUES (0,0)") @@ -194,7 +194,8 @@ Private Sub B4XPage_Created (Root1 As B4XView) almacen = 0 rutaPreventa = 0 p_appUpdate.Visible = False - + Subs.centraPanel(p_botones, Root.Width) + Subs.guardaAppInfo(skmt) End Sub Sub B4XPage_Appear @@ -604,7 +605,12 @@ Sub i_engrane_Click p_appUpdate.Left = (Root.Width/2) - (p_appUpdate.Width/2) lv_server.Clear lv_server.AddSingleLine("http://keymon.lat:1782") - If user.Text = "KMTS1" Then lv_server.AddSingleLine("http://10.0.0.205:1782") + If user.Text = "KMTS1" Then + lv_server.AddSingleLine("http://10.0.0.205:1782") + b_importarBD.Visible = True + Else + b_importarBD.Visible = False + End If l_server.Text = Starter.server Subs.panelVisible(p_appUpdate,0,0) p_appUpdate.Height = Root.Height @@ -647,3 +653,18 @@ Private Sub b_envioBD_Click in.Flags = 1 'FLAG_GRANT_READ_URI_PERMISSION StartActivity(in) End Sub + +Private Sub b_importarBD_Click + Private FH As FileHandler + FH.Initialize + Wait For (FH.Load) Complete (Result As LoadResult) 'Abre un fileManager para seleccionar la base de datos a importar. + File.Copy(Result.Dir, Result.FileName, File.DirInternal, "kmt.db") 'Copia la base de datos seleccionada al directorio interno. + skmt.Initialize(Starter.ruta,"kmt.db", True) 'Reiniciliza la base de datos con la recien importada. + Private c As Cursor = skmt.ExecQuery("select CAT_VA_VALOR from CAT_VARIABLES where CAT_VA_DESCRIPCION = 'APP_NAME'") + If c.RowCount > 1 Then + c.Position = 0 + ToastMessageShow($"BD de ${c.GetString("APP_NAME")} importada!"$, True) + Else + ToastMessageShow($"¡BD importada!"$, True) + End If +End Sub \ No newline at end of file diff --git a/B4A/FileHandler.bas b/B4A/FileHandler.bas new file mode 100644 index 0000000..a9529f8 --- /dev/null +++ b/B4A/FileHandler.bas @@ -0,0 +1,162 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=11 +@EndOfDesignText@ +'Requiere la librería "ContentResolver" y "FileProvider" o "AppUpdating" +' +'Copiar este codigo al boton_Click que se quiere que importe la base de datos. +' +' Private Sub b_importarBD_Click +' Private FH As FileHandler +' FH.Initialize +' Wait For (FH.Load) Complete (Result As LoadResult) 'Abre un fileManager para seleccionar la base de datos a importar. +' File.Copy(Result.Dir, Result.FileName, File.DirInternal, "kmt.db") 'Copia la base de datos seleccionada al directorio interno. +' Starter.skmt.Initialize(Starter.ruta,"kmt.db", True) 'Reiniciliza la base de datos con la recien importada. +' ToastMessageShow("¡BD importada!", False) +' End Sub + +Sub Class_Globals + #if B4A + Private ion As Object + Private OldIntent As Intent + #end if + Type LoadResult (Success As Boolean, Dir As String, FileName As String, RealName As String, Size As Long, Modified As Long, MimeType As String) +End Sub + +Public Sub Initialize + +End Sub + +#if B4A +Public Sub SaveAs (Source As InputStream, MimeType As String, Title As String) As ResumableSub + Dim intent As Intent + intent.Initialize("android.intent.action.CREATE_DOCUMENT", "") + intent.AddCategory("android.intent.category.OPENABLE") + intent.PutExtra("android.intent.extra.TITLE", Title) + intent.SetType(MimeType) + StartActivityForResult(intent) + Wait For ion_Event (MethodName As String, Args() As Object) + If -1 = Args(0) Then 'resultCode = RESULT_OK + Dim result As Intent = Args(1) + Dim jo As JavaObject = result + Dim ctxt As JavaObject + Dim out As OutputStream = ctxt.InitializeContext.RunMethodJO("getContentResolver", Null).RunMethod("openOutputStream", Array(jo.RunMethod("getData", Null))) + File.Copy2(Source, out) + out.Close + Return True + End If + Return False +End Sub + +Public Sub Load As ResumableSub + Dim cc As ContentChooser + cc.Initialize("cc") + cc.Show("application/octet-stream", "Choose text file") + Wait For CC_Result (Success As Boolean, Dir As String, FileName As String) + Log($"***************************${CRLF}${Dir}${CRLF} ${FileName}"$) + Dim res As LoadResult = CreateLoadResult(Success, Dir, FileName) + Log($"***************************${CRLF}${res.FileName}${CRLF} ${res}"$) + If res.Success Then ExtractInformationFromURI(res.FileName, res) + Return res +End Sub + +Private Sub StartActivityForResult(i As Intent) + Dim jo As JavaObject = GetBA + ion = jo.CreateEvent("anywheresoftware.b4a.IOnActivityResult", "ion", Null) + jo.RunMethod("startActivityForResult", Array(ion, i)) +End Sub + +Private Sub GetBA As Object + Return Me.As(JavaObject).RunMethod("getBA", Null) +End Sub + +Private Sub ExtractInformationFromURI (Uri As String, res As LoadResult) + Try + + Dim resolver As ContentResolver + resolver.Initialize("") + Dim u As Uri + u.Parse(Uri) + Dim rs As ResultSet = resolver.Query(u, Null, "", Null, "") + If rs.NextRow Then + Dim columns As B4XSet = B4XCollections.CreateSet + For i = 0 To rs.ColumnCount - 1 + columns.Add(rs.GetColumnName(i)) + Next + If columns.Contains("_display_name") Then res.RealName = rs.GetString("_display_name") + If columns.Contains("_size") Then res.Size = rs.GetLong("_size") + If columns.Contains("last_modified") Then res.Modified = rs.GetLong("last_modified") + If columns.Contains("mime_type") Then res.MimeType = rs.GetString("mime_type") + End If + rs.Close + + Catch + Log("error extracting information from file provider") + Log(LastException) + End Try +End Sub + +Public Sub CheckForReceivedFiles As LoadResult + Dim Activity As Activity = B4XPages.GetNativeParent(B4XPages.MainPage) + If IsRelevantIntent(Activity.GetStartingIntent) Then + Dim in As Intent = Activity.GetStartingIntent + Dim uri As String + If in.HasExtra("android.intent.extra.STREAM") Then + uri = in.As(JavaObject).RunMethod("getParcelableExtra", Array("android.intent.extra.STREAM")) + Else + uri = in.GetData + End If + Dim res As LoadResult = CreateLoadResult(True, "ContentDir", uri) + ExtractInformationFromURI(res.FileName, res) + Return res + End If + Return CreateLoadResult(False, "", "") +End Sub + +Private Sub IsRelevantIntent(in As Intent) As Boolean + If in.IsInitialized And in <> OldIntent And in.Action = in.ACTION_VIEW Then + OldIntent = in + Return True + End If + Return False +End Sub + +#else if B4i +Public Sub SaveAs(ParentPage As Object, AnchorView As Object, Text As String) As ResumableSub + Dim avc As ActivityViewController + avc.Initialize("avc", Array(Text)) + avc.Show(B4XPages.GetNativeParent(ParentPage), AnchorView) + Wait For avc_Complete (Success As Boolean, ActivityType As String) + Return Success +End Sub + +Public Sub Load (ParentPage As Object, AnchorView As Object) As ResumableSub + Dim DocumentPicker As DocumentPickerViewController + DocumentPicker.InitializeImport("picker", Array("public.text")) + DocumentPicker.Show(B4XPages.GetNativeParent(ParentPage), AnchorView) + Wait For Picker_Complete (Success As Boolean, URLs As List) + If Success And URLs.Size > 0 Then + Return UrlToLoadResult(URLs.Get(0)) + End If + Return CreateLoadResult(False, "", "") +End Sub + +Public Sub UrlToLoadResult(url As String) As LoadResult + Dim res As LoadResult = CreateLoadResult(IIf(File.Exists(url, ""), True, False), url, "") + res.RealName = res.Dir.SubString(res.Dir.LastIndexOf("/") + 1) + res.Size = File.Size(res.Dir, "") + Return res +End Sub +#end if + +Private Sub CreateLoadResult (Success As Boolean, Dir As String, FileName As String) As LoadResult + Dim t1 As LoadResult + t1.Initialize + t1.Success = Success + t1.Dir = Dir + t1.FileName = FileName + Return t1 +End Sub + diff --git a/B4A/Files/login.bal b/B4A/Files/login.bal index 7d2081d..456515e 100644 Binary files a/B4A/Files/login.bal and b/B4A/Files/login.bal differ diff --git a/B4A/Guna Vistas V3.1.b4a b/B4A/Guna Vistas V3.1.b4a index 0221d06..c8df408 100644 --- a/B4A/Guna Vistas V3.1.b4a +++ b/B4A/Guna Vistas V3.1.b4a @@ -134,11 +134,12 @@ Library22=okhttputils2 Library23=phone Library24=randomaccessfile Library25=rspopupmenu -Library26=sql -Library27=togglelibrary -Library28=xui views -Library29=serial +Library26=serial +Library27=sql +Library28=togglelibrary +Library29=xui views Library3=baqrcode +Library30=contentresolver Library4=batteryprogressview Library5=bitmapcreator Library6=byteconverter @@ -155,12 +156,13 @@ Module14=C_Promos Module15=C_TicketsDia Module16=C_UpdateAvailable Module17=DBRequestManager -Module18=FirebaseMessaging -Module19=MAPA_RUTAS +Module18=FileHandler +Module19=FirebaseMessaging Module2=B4XMainPage -Module20=Starter -Module21=Subs -Module22=Tracker +Module20=MAPA_RUTAS +Module21=Starter +Module22=Subs +Module23=Tracker Module3=BatteryUtilities Module4=C_Cliente Module5=C_Clientes @@ -169,9 +171,9 @@ Module7=C_Mapas Module8=C_Nota Module9=C_NoVenta NumberOfFiles=58 -NumberOfLibraries=29 -NumberOfModules=22 -Version=11.5 +NumberOfLibraries=30 +NumberOfModules=23 +Version=12.5 @EndOfDesignText@ #Region Project Attributes #ApplicationLabel: Guna V3.1 diff --git a/B4A/Guna Vistas V3.1.b4a.meta b/B4A/Guna Vistas V3.1.b4a.meta index c644e5f..3ebe79c 100644 --- a/B4A/Guna Vistas V3.1.b4a.meta +++ b/B4A/Guna Vistas V3.1.b4a.meta @@ -14,6 +14,7 @@ ModuleBookmarks2= ModuleBookmarks20= ModuleBookmarks21= ModuleBookmarks22= +ModuleBookmarks23= ModuleBookmarks3= ModuleBookmarks4= ModuleBookmarks5= @@ -37,6 +38,7 @@ ModuleBreakpoints2= ModuleBreakpoints20= ModuleBreakpoints21= ModuleBreakpoints22= +ModuleBreakpoints23= ModuleBreakpoints3= ModuleBreakpoints4= ModuleBreakpoints5= @@ -57,9 +59,10 @@ ModuleClosedNodes17= ModuleClosedNodes18= ModuleClosedNodes19= ModuleClosedNodes2=6,9 -ModuleClosedNodes20=1 -ModuleClosedNodes21= +ModuleClosedNodes20= +ModuleClosedNodes21=1 ModuleClosedNodes22= +ModuleClosedNodes23= ModuleClosedNodes3= ModuleClosedNodes4=1,2,3,5,6,7,10,11 ModuleClosedNodes5=7 @@ -67,6 +70,6 @@ ModuleClosedNodes6= ModuleClosedNodes7= ModuleClosedNodes8= ModuleClosedNodes9= -NavigationStack=C_Productos,b_prodMas_Click,464,0,C_Productos,b_prodMenos_Click,456,0,C_Principal,connecta_Click,1624,0,B4XMainPage,Class_Globals,24,0,Main,Globals,25,0,Main,Activity_Create,30,0,Main,Process_Globals,21,0,C_Cliente,Class_Globals,0,0,C_Cliente,B4XPage_Created,399,0,C_Nota,Class_Globals,0,0,C_Nota,B4XPage_CloseRequest,126,0 +NavigationStack=Subs,guardaAppInfo,1095,0,Subs,traePromoIdDeBD,1086,0,B4XMainPage,i_engrane_LongClick,611,0,B4XMainPage,i_engrane_Click,605,5,B4XMainPage,Class_Globals,92,0,Visual Designer,login.bal,-100,6,B4XMainPage,b_importarBD_Click,662,6,B4XMainPage,lv_server_ItemClick,630,0,B4XMainPage,b_envioBD_Click,640,0,Subs,borraArribaDe100Errores,405,0,B4XMainPage,B4XPage_Created,140,0 SelectedBuild=0 -VisibleModules=20,2,21,12,13,4,8,11,5,10,19,17 +VisibleModules=21,2,22,12,13,4 diff --git a/B4A/Subs.bas b/B4A/Subs.bas index 27f1d5d..5149539 100644 --- a/B4A/Subs.bas +++ b/B4A/Subs.bas @@ -1095,4 +1095,11 @@ Sub traePromoIdDeBD As Map 'ignore End If c.Close Return m +End Sub + +'Guarda el nombre y version de la app en CAT_VARIABLES. +Sub guardaAppInfo(skmt As SQL) 'ignore + skmt.ExecNonQuery("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = 'EMPRESA' or CAT_VA_DESCRIPCION = 'APP_NAME' or CAT_VA_DESCRIPCION = 'APP_VERSION'") + skmt.ExecNonQuery($"insert into CAT_VARIABLES (CAT_VA_DESCRIPCION, CAT_VA_VALOR) values ('APP_NAME', '${Application.LabelName}')"$) + skmt.ExecNonQuery($"insert into CAT_VARIABLES (CAT_VA_DESCRIPCION, CAT_VA_VALOR) values ('APP_VERSION', '${Application.VersionName}')"$) End Sub \ No newline at end of file