Files
Izca_Multiventa/B4A/FileHandler.bas
2025-09-15 17:40:09 -06:00

164 lines
5.4 KiB
QBasic

B4A=true
Group=Default Group
ModulesStructureVersion=1
Type=Class
Version=11
@EndOfDesignText@
'Requiere la librería "ContentResolver"
'
'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