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