diff --git a/B4A/B4XMainPage.bas b/B4A/B4XMainPage.bas
index 02abf71..3b58279 100644
--- a/B4A/B4XMainPage.bas
+++ b/B4A/B4XMainPage.bas
@@ -82,6 +82,7 @@ End Sub
'This event will be called once, before the page becomes visible.
Private Sub B4XPage_Created (Root1 As B4XView)
Root = Root1
+' Log(567)
Root.LoadLayout("login")
B4XPages.SetTitle(Me, "Monitor Keymon")
B4XPages.AddPage("Login", login)
@@ -145,7 +146,7 @@ Private Sub B4XPage_Created (Root1 As B4XView)
' rp.CheckAndRequest(rp.PERMISSION_READ_PHONE_STATE)
' Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) 'change to Activity_PermissionResult if non-B4XPages.
' Log(888)
-
+ S.CheckAndRequestNotificationPermission
End Sub
Sub B4XPage_Appear
diff --git a/B4A/C_Subs.bas b/B4A/C_Subs.bas
index b3fc960..7b0b790 100644
--- a/B4A/C_Subs.bas
+++ b/B4A/C_Subs.bas
@@ -18,10 +18,13 @@ Sub Class_Globals
' Dim rutaHrsAtras As Int = 48
' Dim rutaInicioHoy As String = ""
Private subsLogs As Boolean = False
+ Dim logoKeymon As Bitmap
End Sub
'You can add more parameters here.
Public Sub Initialize As Object
+' smiley = LoadBitmapResize(File.DirAssets, "smiley.png", 24dip, 24dip, False)
+ logoKeymon = LoadBitmapResize(File.DirAssets, "logo_keymon.png", 24dip, 24dip, False)
Return Me
End Sub
@@ -418,7 +421,7 @@ Sub CreateNotification (Body As String) As Notification
End Sub
'Genera una notificacion con importancia alta
-Sub notiHigh(title As String, body As String, id As String, activity As Object) 'ignore
+Sub notiHigh0(title As String, body As String, id As String, activity As Object) 'ignore
activity = Main
Private notif As Notification
notif.Initialize2(notif.IMPORTANCE_HIGH)
@@ -432,8 +435,22 @@ Sub notiHigh(title As String, body As String, id As String, activity As Object)
notif.Notify(id)
End Sub
+'Genera una notificacion con importancia alta
+Sub notiHigh(title As String, body As String, id As String, activity As Object) 'ignore
+ activity = Main
+ Private notification As NB6
+ notification.Initialize("Errores", "Errores", "HIGH").AutoCancel(True).SmallIcon(logoKeymon)
+ If Starter.logger Then Log("notiHigh: "&title)
+ notification.Build(title, body, "", Main).Notify(id)
+' notif.AutoCancel = True
+' If logger Then Log("notiHigh: "&title)
+' notif.SetInfo(title, body, activity)
+' Log("notiHigh SetInfo")
+' notif.Notify(id)
+End Sub
+
'Regresa el objeto de una notificacion con importancia baja
-Sub notiLowReturn(title As String, Body As String, id As Int) As Notification 'ignore
+Sub notiLowReturn0(title As String, Body As String, id As Int) As Notification 'ignore
Private notification As Notification
notification.Initialize2(notification.IMPORTANCE_LOW)
' Log("notiLowReturn: "&title)
@@ -446,6 +463,22 @@ Sub notiLowReturn(title As String, Body As String, id As Int) As Notification 'i
Return notification
End Sub
+'Regresa el objeto de una notificacion con importancia minima
+Sub notiLowReturn(title As String, Body As String, id As Int) As NB6 'ignore
+ Private notification As NB6
+' notification.Initialize2(notification.IMPORTANCE_MIN)
+ notification.Initialize("Normal", "Normal", "LOW").SmallIcon(logoKeymon)
+ If Starter.logger Then Log("notiLowReturn: "&title)
+' notification.Icon = "icon"
+' notification.Sound = False
+' notification.Vibrate = False
+ notification.Build(title, Body, "", Main).Notify(id)
+' notification.SetInfo(title, Body, Main)
+' notification.n(id)
+' Log("notiLowReturn SetInfo")
+ Return notification
+End Sub
+
Sub ping
Private ph As Phone
Wait For (ph.ShellAsync("ping", Array As String("-c 1","-W 5", "8.8.8.8"))) Complete (Success As Boolean, ExitValue As Int, StdOut As String, StdErr As String)
@@ -500,4 +533,20 @@ Sub borraArribaDeXXXErrores(limite As Int) 'ignore
Starter.skmt.ExecNonQuery($"DELETE FROM error_log WHERE fecha NOT in (SELECT fecha FROM error_log ORDER BY fecha desc LIMIT ${limite})"$)
Starter.skmt.ExecNonQuery("vacuum;")
' if starter.logger then Log("Borramos mas de 100 de errorLog")
-End Sub
\ No newline at end of file
+End Sub
+
+Sub CheckAndRequestNotificationPermission As ResumableSub
+ Dim p As Phone
+ If p.SdkVersion < 33 Then Return True
+ Dim ctxt As JavaObject
+ ctxt.InitializeContext
+ Dim targetSdkVersion As Int = ctxt.RunMethodJO("getApplicationInfo", Null).GetField("targetSdkVersion")
+ If targetSdkVersion < 33 Then Return True
+ Dim NotificationsManager As JavaObject = ctxt.RunMethod("getSystemService", Array("notification"))
+ Dim NotificationsEnabled As Boolean = NotificationsManager.RunMethod("areNotificationsEnabled", Null)
+ If NotificationsEnabled Then Return True
+ Dim rp As RuntimePermissions
+ rp.CheckAndRequest(rp.PERMISSION_POST_NOTIFICATIONS)
+ Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) 'change to Activity_PermissionResult if non-B4XPages.
+ Return Result
+End Sub
diff --git a/B4A/Files/smiley.png b/B4A/Files/smiley.png
new file mode 100644
index 0000000..a563681
Binary files /dev/null and b/B4A/Files/smiley.png differ
diff --git a/B4A/Monitor-Keymon.b4a b/B4A/Monitor-Keymon.b4a
index 1c49662..8f160d8 100644
--- a/B4A/Monitor-Keymon.b4a
+++ b/B4A/Monitor-Keymon.b4a
@@ -16,11 +16,12 @@ FileGroup7=Default Group
Group=Default Group
Library1=b4xpages
Library10=reflection
-Library11=runtimepermissions
-Library12=sql
-Library13=xcustomlistview
-Library14=xui
-Library15=replyauto
+Library11=replyauto
+Library12=runtimepermissions
+Library13=sql
+Library14=xcustomlistview
+Library15=xui
+Library16=nb6
Library2=byteconverter
Library3=core
Library4=fusedlocationprovider
@@ -29,7 +30,7 @@ Library6=json
Library7=okhttputils2
Library8=phone
Library9=randomaccessfile
-ManifestCode='This code will be applied to the manifest file during compilation.~\n~'You do not need to modify it in most cases.~\n~'See this link for for more information: https://www.b4x.com/forum/showthread.php?p=78136~\n~AddManifestText(~\n~~\n~)~\n~SetApplicationAttribute(android:icon, "@drawable/icon")~\n~SetApplicationAttribute(android:label, "$LABEL$")~\n~CreateResourceFromFile(Macro, Themes.LightTheme)~\n~CreateResourceFromFile(Macro, FirebaseAnalytics.GooglePlayBase)~\n~ 'End of default text.~\n~''''' CAMBIA LA CLAVE API~\n~AddApplicationText(~\n~~\n~ ~\n~)~\n~AddApplicationText(~\n~~\n~)~\n~'AddManifestText(~\n~'~\n~')~\n~ 'End of default text.~\n~ ~\n~SetApplicationAttribute(android:usesCleartextTraffic, "true")~\n~AddManifestText()~\n~AddPermission(android.permission.ACCESS_BACKGROUND_LOCATION)~\n~AddManifestText()~\n~AddManifestText() 'in order to access the device non-resettable identifiers such as IMEI and serial number.~\n~AddManifestText()~\n~'AddManifestText()~\n~'AddManifestText()~\n~'AddManifestText()~\n~'AddPermission(android.permission.REQUEST_INSTALL_PACKAGES)~\n~AddPermission(android.permission.INTERNET)~\n~'AddPermission(android.permission.INSTALL_PACKAGES)~\n~'AddPermission(android.permission.READ_EXTERNAL_STORAGE)~\n~'AddPermission(android.permission.WRITE_EXTERNAL_STORAGE)~\n~AddPermission(android.permission.READ_PHONE_STATE)~\n~AddPermission(android.permission.WAKE_LOCK)~\n~AddPermission(android.permission.ACCESS_NETWORK_STATE)~\n~~\n~'AddPermission("android.permission.MANAGE_EXTERNAL_STORAGE")~\n~'SetApplicationAttribute(android:largeHeap, "true")~\n~~\n~AddManifestText()~\n~AddPermission(android.permission.INTERNET)~\n~SetApplicationAttribute(android:allowBackup, "false")~\n~AddApplicationText(~\n~~\n~ ~\n~ ~\n~ ~\n~)
+ManifestCode='This code will be applied to the manifest file during compilation.~\n~'You do not need to modify it in most cases.~\n~'See this link for for more information: https://www.b4x.com/forum/showthread.php?p=78136~\n~AddManifestText(~\n~~\n~)~\n~SetApplicationAttribute(android:icon, "@drawable/icon")~\n~SetApplicationAttribute(android:label, "$LABEL$")~\n~CreateResourceFromFile(Macro, Themes.LightTheme)~\n~CreateResourceFromFile(Macro, FirebaseAnalytics.GooglePlayBase)~\n~ 'End of default text.~\n~''''' CAMBIA LA CLAVE API~\n~'AddApplicationText(~\n~'~\n~' ~\n~')~\n~AddApplicationText(~\n~~\n~)~\n~'AddManifestText(~\n~'~\n~')~\n~ 'End of default text.~\n~ ~\n~SetApplicationAttribute(android:usesCleartextTraffic, "true")~\n~'AddManifestText()~\n~'AddPermission(android.permission.ACCESS_BACKGROUND_LOCATION)~\n~AddManifestText()~\n~'AddManifestText() 'in order to access the device non-resettable identifiers such as IMEI and serial number.~\n~AddManifestText()~\n~'AddManifestText()~\n~'AddManifestText()~\n~'AddManifestText()~\n~'AddPermission(android.permission.REQUEST_INSTALL_PACKAGES)~\n~AddPermission(android.permission.INTERNET)~\n~'AddPermission(android.permission.INSTALL_PACKAGES)~\n~'AddPermission(android.permission.READ_EXTERNAL_STORAGE)~\n~'AddPermission(android.permission.WRITE_EXTERNAL_STORAGE)~\n~AddPermission(android.permission.READ_PHONE_STATE)~\n~AddPermission(android.permission.WAKE_LOCK)~\n~AddPermission(android.permission.ACCESS_NETWORK_STATE)~\n~~\n~'AddPermission("android.permission.MANAGE_EXTERNAL_STORAGE")~\n~'SetApplicationAttribute(android:largeHeap, "true")~\n~~\n~AddManifestText()~\n~AddPermission(android.permission.INTERNET)~\n~SetApplicationAttribute(android:allowBackup, "false")~\n~AddApplicationText(~\n~~\n~ ~\n~ ~\n~ ~\n~)~\n~~\n~'Las siguientes lineas son para permitor el uso del SERVICIO en android 14+ (Se puso como servicio de medios porque no hay uno de monitoreo)~\n~'AddPermission(android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK)~\n~'SetServiceAttribute(Monitor, android:foregroundServiceType, "mediaPlayback")
Module1=B4XMainPage
Module2=BatteryUtilities
Module3=C_Subs
@@ -38,14 +39,14 @@ Module5=Monitor
Module6=NotificationService
Module7=Starter
NumberOfFiles=7
-NumberOfLibraries=15
+NumberOfLibraries=16
NumberOfModules=7
Version=12.8
@EndOfDesignText@
#Region Project Attributes
#ApplicationLabel: Monitor Keymon
#VersionCode: 1
- #VersionName: 4.12.11
+ #VersionName: 4.12.14
'SupportedOrientations possible values: unspecified, landscape or portrait.
#SupportedOrientations: portrait
#CanInstallToExternalStorage: False
@@ -55,7 +56,7 @@ Version=12.8
#MultiDex: True
#End Region
-#Region Activity Attributes
+#Region Activity Attributes
#FullScreen: False
#IncludeTitle: True
#End Region
@@ -65,8 +66,8 @@ Sub Process_Globals
End Sub
Sub Globals
- Type CameraInfoAndId (CameraInfo As Object, Id As Int)
- Type CameraSize (Width As Int, Height As Int)
+' Type CameraInfoAndId (CameraInfo As Object, Id As Int)
+' Type CameraSize (Width As Int, Height As Int)
End Sub
Sub Activity_Create(FirstTime As Boolean) 'ignore
diff --git a/B4A/Monitor-Keymon.b4a.meta b/B4A/Monitor-Keymon.b4a.meta
index 353563a..1cdf655 100644
--- a/B4A/Monitor-Keymon.b4a.meta
+++ b/B4A/Monitor-Keymon.b4a.meta
@@ -15,13 +15,13 @@ ModuleBreakpoints5=
ModuleBreakpoints6=
ModuleBreakpoints7=
ModuleClosedNodes0=
-ModuleClosedNodes1=8,11,19,21,22,24
+ModuleClosedNodes1=2
ModuleClosedNodes2=
-ModuleClosedNodes3=
+ModuleClosedNodes3=32,34
ModuleClosedNodes4=
ModuleClosedNodes5=5
ModuleClosedNodes6=
ModuleClosedNodes7=
-NavigationStack=C_Subs,ping,445,1,Main,Globals,26,0,B4XMainPage,Class_Globals,66,0,Monitor,Process_Globals,19,0,Monitor,JobDone,162,4,NotificationService,Service_Create,14,0,B4XMainPage,B4XPage_Created,79,0,NotificationService,Service_Start,18,0,NotificationService,MonitorKeymon_NotificationPosted,44,0,Starter,Service_Start,60,0,Monitor,Service_Start,43,0
+NavigationStack=NotificationService,Process_Globals,11,0,Starter,Service_Start,37,1,Monitor,Service_Create,36,1,NotificationService,Service_Create,13,1,NotificationService,MonitorKeymon_NotificationPosted,31,0,NotificationService,Service_Start,19,1,C_Subs,notiLowReturn,464,1,C_Subs,notiHigh,432,0,Monitor,Service_Start,40,0,B4XMainPage,B4XPage_Created,78,0
SelectedBuild=0
VisibleModules=1,7,3,5,4,6
diff --git a/B4A/NotificationService.bas b/B4A/NotificationService.bas
index 3e8dde5..32f78bc 100644
--- a/B4A/NotificationService.bas
+++ b/B4A/NotificationService.bas
@@ -5,7 +5,7 @@ Type=Service
Version=11
@EndOfDesignText@
#Region Service Attributes
- #StartAtBoot: False
+ #StartAtBoot: True
#End Region
Sub Process_Globals
@@ -17,12 +17,13 @@ Sub Process_Globals
End Sub
Sub Service_Create
+' Log(963)
rp.Initialize("MonitorKeymon")
If Starter.logger Then Log("**************** Iniciamos Monitor Keymon ***********************")
End Sub
Sub Service_Start (StartingIntent As Intent)
- Log("Monitor - NotificationService Start")
+ if starter.logger then Log("Monitor - NotificationService Start")
If rp.HandleIntent(StartingIntent) Then Return
DateTime.DateFormat = "mm"
ultimaNoti = DateTime.Date(DateTime.now)
diff --git a/B4A/Starter.bas b/B4A/Starter.bas
index c931e4e..bc556f1 100644
--- a/B4A/Starter.bas
+++ b/B4A/Starter.bas
@@ -41,6 +41,7 @@ Sub Service_Create
End Sub
Sub Service_Start (StartingIntent As Intent)
+' Log(123)
Service.StopAutomaticForeground 'Starter service can start in the foreground state in some edge cases.
s.Initialize
skmt = s.inicializaBD(File.DirInternal, "kmt.db")
diff --git a/B4A/monitor.bas b/B4A/monitor.bas
index 43b186a..949b568 100644
--- a/B4A/monitor.bas
+++ b/B4A/monitor.bas
@@ -19,7 +19,7 @@ Sub Process_Globals
Private lock As PhoneWakeState
Dim Interval As Int
Dim s As C_Subs
- Dim nid As Int = 51043
+ Dim nid As Int = 51045
' Dim monitorActivo As Boolean = True
Dim InternetOk As Boolean = True
Dim DBReqServerOk As Boolean = True
@@ -40,11 +40,12 @@ Sub Service_Create
logger = False
#end if
lock.PartialLock
+' Log(345)
' probamosConexion
End Sub
Sub Service_Start (StartingIntent As Intent)
- Log("Monitor Start")
+ If Starter.logger Then Log("Monitor Start")
Service.StopAutomaticForeground 'Call this when the background task completes (if there is one)
Service.StartForeground(nid, s.CreateNotification("..."))
StartServiceAt(Me, DateTime.Now + 10 * DateTime.TicksPerMinute, True)
@@ -68,7 +69,7 @@ End Sub
Sub probamosConexion
If logger Then Log("###################### "& CRLF& " probamos probamosConexion"& CRLF& " ############")
- Try
+' Try
If B4XPages.IsInitialized Then
B4XPages.MainPage.lv_servidores.Clear
B4XPages.MainPage.lv_dbs.Clear
@@ -120,9 +121,9 @@ Sub probamosConexion
cs.Initialize
If B4XPages.IsInitialized Then B4XPages.MainPage.l_status.Text = cs.Color(Colors.red).append("NO hay conexión a internet!!").PopAll
End If
- Catch
- Log(LastException)
- End Try
+' Catch
+' Log(LastException)
+' End Try
End Sub
Sub reinicializaReqManager 'ignore