diff --git a/android-yumee-panels/app/src/main/AndroidManifest.xml b/android-yumee-panels/app/src/main/AndroidManifest.xml
index 0d0f015..90da082 100644
--- a/android-yumee-panels/app/src/main/AndroidManifest.xml
+++ b/android-yumee-panels/app/src/main/AndroidManifest.xml
@@ -13,8 +13,6 @@
+
+
+
+
+
+
+
+
-
+
\ No newline at end of file
diff --git a/android-yumee-panels/app/src/main/kotlin/com/yumee/panels/YumeeApp.kt b/android-yumee-panels/app/src/main/kotlin/com/yumee/panels/YumeeApp.kt
index 7bf35d3..7da0830 100644
--- a/android-yumee-panels/app/src/main/kotlin/com/yumee/panels/YumeeApp.kt
+++ b/android-yumee-panels/app/src/main/kotlin/com/yumee/panels/YumeeApp.kt
@@ -1,7 +1,6 @@
package com.yumee.panels
import android.app.Application
-import androidx.room.Room
import com.yumee.panels.data.local.YumeeDatabase
class YumeeApp : Application() {
@@ -11,8 +10,6 @@ class YumeeApp : Application() {
override fun onCreate() {
super.onCreate()
- database = Room.databaseBuilder(this, YumeeDatabase::class.java, "yumee_db")
- .fallbackToDestructiveMigration()
- .build()
+ database = YumeeDatabase.getDatabase(this)
}
-}
+}
\ No newline at end of file
diff --git a/android-yumee-panels/app/src/main/kotlin/com/yumee/panels/data/local/Database.kt b/android-yumee-panels/app/src/main/kotlin/com/yumee/panels/data/local/Database.kt
index f1a02b0..a8ca4ba 100644
--- a/android-yumee-panels/app/src/main/kotlin/com/yumee/panels/data/local/Database.kt
+++ b/android-yumee-panels/app/src/main/kotlin/com/yumee/panels/data/local/Database.kt
@@ -1,5 +1,6 @@
package com.yumee.panels.data.local
+import android.content.Context
import androidx.room.*
import kotlinx.coroutines.flow.Flow
@@ -8,6 +9,9 @@ interface MonitorDao {
@Query("SELECT * FROM monitors")
fun getAllMonitors(): Flow>
+ @Query("SELECT * FROM monitors")
+ suspend fun getAllMonitorsSync(): List
+
@Query("SELECT * FROM monitors WHERE isActive = 1")
suspend fun getActiveMonitors(): List
@@ -36,4 +40,21 @@ interface MonitorDao {
@Database(entities = [Monitor::class, MonitorLog::class], version = 1)
abstract class YumeeDatabase : RoomDatabase() {
abstract fun monitorDao(): MonitorDao
-}
+
+ companion object {
+ @Volatile
+ private var INSTANCE: YumeeDatabase? = null
+
+ fun getDatabase(context: Context): YumeeDatabase {
+ return INSTANCE ?: synchronized(this) {
+ val instance = Room.databaseBuilder(
+ context.applicationContext,
+ YumeeDatabase::class.java,
+ "yumee_database"
+ ).build()
+ INSTANCE = instance
+ instance
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/android-yumee-panels/app/src/main/kotlin/com/yumee/panels/service/MonitorService.kt b/android-yumee-panels/app/src/main/kotlin/com/yumee/panels/service/MonitorService.kt
index 99d21c5..409302a 100644
--- a/android-yumee-panels/app/src/main/kotlin/com/yumee/panels/service/MonitorService.kt
+++ b/android-yumee-panels/app/src/main/kotlin/com/yumee/panels/service/MonitorService.kt
@@ -2,10 +2,8 @@ package com.yumee.panels.service
import android.app.*
import android.content.*
-import android.net.ConnectivityManager
import android.os.*
import androidx.core.app.NotificationCompat
-import androidx.room.Room
import com.yumee.panels.MainActivity
import com.yumee.panels.R
import com.yumee.panels.data.local.*
@@ -32,7 +30,7 @@ class MonitorService : Service() {
override fun onCreate() {
super.onCreate()
- db = Room.databaseBuilder(applicationContext, YumeeDatabase::class.java, "yumee_db").build()
+ db = YumeeDatabase.getDatabase(applicationContext)
createNotificationChannel()
acquireWakeLock()
}
@@ -49,18 +47,27 @@ class MonitorService : Service() {
serviceScope.launch {
while (isActive) {
val monitors = db.monitorDao().getActiveMonitors()
+ var updated = false
monitors.forEach { monitor ->
- // Simplified: In a real app, track individual interval timers
- // Here we check if it's time to ping based on lastChecked
if (System.currentTimeMillis() - monitor.lastChecked >= monitor.intervalSeconds * 1000) {
- launch { pingMonitor(monitor) }
+ pingMonitor(monitor)
+ updated = true
}
}
- delay(1000) // check every second
+ if (updated) {
+ updateWidget()
+ }
+ delay(1000)
}
}
}
+ private fun updateWidget() {
+ val intent = Intent("com.yumee.panels.UPDATE_WIDGET")
+ intent.setPackage(packageName)
+ sendBroadcast(intent)
+ }
+
private suspend fun pingMonitor(monitor: Monitor) {
val startTime = System.currentTimeMillis()
var isOnline = false
@@ -81,7 +88,6 @@ class MonitorService : Service() {
responseTime = System.currentTimeMillis() - startTime
}
- // Update database
val updatedMonitor = monitor.copy(
lastStatusCode = statusCode,
lastResponseTime = responseTime,
@@ -107,7 +113,7 @@ class MonitorService : Service() {
private fun sendAlert(name: String, message: String) {
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val alertNotification = NotificationCompat.Builder(this, CHANNEL_ID)
- .setSmallIcon(R.drawable.ic_launcher_foreground) // Placeholder
+ .setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("Alert: $name")
.setContentText(message)
.setPriority(NotificationCompat.PRIORITY_HIGH)
@@ -122,7 +128,7 @@ class MonitorService : Service() {
return NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("Yumee Panels")
.setContentText(text)
- .setSmallIcon(R.drawable.ic_launcher_foreground) // Placeholder
+ .setSmallIcon(R.mipmap.ic_launcher)
.setOngoing(true)
.setContentIntent(pendingIntent)
.build()
@@ -152,4 +158,4 @@ class MonitorService : Service() {
wakeLock?.let { if (it.isHeld) it.release() }
super.onDestroy()
}
-}
+}
\ No newline at end of file
diff --git a/android-yumee-panels/app/src/main/kotlin/com/yumee/panels/widget/MonitorWidget.kt b/android-yumee-panels/app/src/main/kotlin/com/yumee/panels/widget/MonitorWidget.kt
new file mode 100644
index 0000000..626e1ee
--- /dev/null
+++ b/android-yumee-panels/app/src/main/kotlin/com/yumee/panels/widget/MonitorWidget.kt
@@ -0,0 +1,56 @@
+package com.yumee.panels.widget
+
+import android.app.PendingIntent
+import android.appwidget.AppWidgetManager
+import android.appwidget.AppWidgetProvider
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.widget.RemoteViews
+import com.yumee.panels.MainActivity
+import com.yumee.panels.R
+import com.yumee.panels.data.local.YumeeDatabase
+import kotlinx.coroutines.*
+
+class MonitorWidget : AppWidgetProvider() {
+
+ override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) {
+ for (appWidgetId in appWidgetIds) {
+ updateAppWidget(context, appWidgetManager, appWidgetId)
+ }
+ }
+
+ override fun onReceive(context: Context, intent: Intent) {
+ super.onReceive(context, intent)
+ if (intent.action == "com.yumee.panels.UPDATE_WIDGET") {
+ val appWidgetManager = AppWidgetManager.getInstance(context)
+ val appWidgetIds = appWidgetManager.getAppWidgetIds(ComponentName(context, MonitorWidget::class.java))
+ for (appWidgetId in appWidgetIds) {
+ updateAppWidget(context, appWidgetManager, appWidgetId)
+ }
+ }
+ }
+
+ private fun updateAppWidget(context: Context, appWidgetManager: AppWidgetManager, appWidgetId: Int) {
+ val views = RemoteViews(context.packageName, R.layout.widget_layout)
+
+ // Launch app on click
+ val intent = Intent(context, MainActivity::class.java)
+ val pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE)
+ views.setOnClickPendingIntent(R.id.widget_title, pendingIntent)
+
+ // Fetch counts from DB
+ CoroutineScope(Dispatchers.IO).launch {
+ val db = YumeeDatabase.getDatabase(context)
+ val allMonitors = db.monitorDao().getAllMonitorsSync()
+ val onlineCount = allMonitors.count { it.isOnline }
+ val offlineCount = allMonitors.count { !it.isOnline }
+
+ withContext(Dispatchers.Main) {
+ views.setTextViewText(R.id.widget_online_count, "Online: $onlineCount")
+ views.setTextViewText(R.id.widget_offline_count, "Offline: $offlineCount")
+ appWidgetManager.updateAppWidget(appWidgetId, views)
+ }
+ }
+ }
+}
diff --git a/android-yumee-panels/app/src/main/res/drawable/widget_background.xml b/android-yumee-panels/app/src/main/res/drawable/widget_background.xml
new file mode 100644
index 0000000..ca663bf
--- /dev/null
+++ b/android-yumee-panels/app/src/main/res/drawable/widget_background.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/android-yumee-panels/app/src/main/res/layout/widget_layout.xml b/android-yumee-panels/app/src/main/res/layout/widget_layout.xml
new file mode 100644
index 0000000..87d895d
--- /dev/null
+++ b/android-yumee-panels/app/src/main/res/layout/widget_layout.xml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android-yumee-panels/app/src/main/res/xml/widget_info.xml b/android-yumee-panels/app/src/main/res/xml/widget_info.xml
new file mode 100644
index 0000000..d22f2a9
--- /dev/null
+++ b/android-yumee-panels/app/src/main/res/xml/widget_info.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/yumee_panels_android_source.tar.gz b/yumee_panels_android_source.tar.gz
index 04c517a..4304298 100644
Binary files a/yumee_panels_android_source.tar.gz and b/yumee_panels_android_source.tar.gz differ