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