diff --git a/app/src/main/java/website/christine/xesite/Application.kt b/app/src/main/java/website/christine/xesite/Application.kt index c818d01..6703bb5 100644 --- a/app/src/main/java/website/christine/xesite/Application.kt +++ b/app/src/main/java/website/christine/xesite/Application.kt @@ -16,9 +16,37 @@ package website.christine.xesite import android.app.Application +import android.app.NotificationChannel +import android.app.NotificationManager +import android.content.Context +import android.os.Build class Application : Application() { override fun onCreate() { super.onCreate() + + val ctx = this.applicationContext + createNotificationChannel(ctx) } -} \ No newline at end of file + + private fun createNotificationChannel(ctx: Context) { + // Create the NotificationChannel, but only on API 26+ because + // the NotificationChannel class is new and not in the support library + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val name = NEW_POST_CHANNEL + val descriptionText = NEW_POST_CHANNEL_DESC + val importance = NotificationManager.IMPORTANCE_LOW + val channel = NotificationChannel(NEW_POST_CHANNEL, name, importance).apply { + description = descriptionText + } + // Register the channel with the system + val notificationManager: NotificationManager = + ctx.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + notificationManager.createNotificationChannel(channel) + } + } +} + +internal val NEW_POST_CHANNEL = "New Posts"; +internal val NEW_POST_CHANNEL_DESC = "New posts on christine.website"; +internal val notificationId = 1; \ No newline at end of file diff --git a/app/src/main/java/website/christine/xesite/LauncherActivity.kt b/app/src/main/java/website/christine/xesite/LauncherActivity.kt index ebf6c4e..1c1f528 100644 --- a/app/src/main/java/website/christine/xesite/LauncherActivity.kt +++ b/app/src/main/java/website/christine/xesite/LauncherActivity.kt @@ -15,6 +15,7 @@ */ package website.christine.xesite +import android.content.Context import android.net.Uri import com.google.androidbrowserhelper.trusted.LauncherActivity diff --git a/app/src/main/java/website/christine/xesite/NewPostWidget.kt b/app/src/main/java/website/christine/xesite/NewPostWidget.kt index 9b0692f..6c766da 100644 --- a/app/src/main/java/website/christine/xesite/NewPostWidget.kt +++ b/app/src/main/java/website/christine/xesite/NewPostWidget.kt @@ -1,10 +1,15 @@ package website.christine.xesite +import android.app.NotificationChannel +import android.app.NotificationManager import android.appwidget.AppWidgetManager import android.appwidget.AppWidgetProvider import android.content.Context +import android.os.Build import android.util.Log import android.widget.RemoteViews +import androidx.core.app.NotificationCompat +import androidx.core.app.NotificationManagerCompat import com.android.volley.RequestQueue import com.android.volley.Response import com.android.volley.toolbox.BasicNetwork @@ -23,6 +28,18 @@ class NewPostWidget : AppWidgetProvider() { return ctx.packageName.plus("/").plus(pkgInfo.versionName) } + private fun notify(ctx: Context, newPost: NewPost) { + var builder = NotificationCompat.Builder(ctx, NEW_POST_CHANNEL) + .setSmallIcon(R.drawable.splash) + .setContentTitle(newPost.title) + .setContentText(newPost.summary) + .setPriority(NotificationCompat.PRIORITY_DEFAULT) + + NotificationManagerCompat.from(ctx).apply { + notify(notificationId, builder.build()) + } + } + override fun onUpdate( ctx: Context, appWidgetManager: AppWidgetManager, @@ -38,6 +55,13 @@ class NewPostWidget : AppWidgetProvider() { NewPost::class.java, headers, Response.Listener { response -> + val oldURL = loadPref(ctx, "old_url", response.link) + if (response.link != oldURL) { + // make notification? + this.notify(ctx, response) + savePref(ctx, "old_url", response.link) + } + Log.println(Log.INFO, "new_post", response.toString()) // There may be multiple widgets active, so update all of them for (appWidgetId in appWidgetIds) { @@ -75,6 +99,8 @@ class NewPostWidget : AppWidgetProvider() { override fun onEnabled(ctx: Context) { this.makeQueue(ctx) + //this.createNotificationChannel(ctx) + savePref(ctx, "old_url", "http://google.com") } override fun onDisabled(context: Context) { @@ -102,4 +128,19 @@ class NewPostWidget : AppWidgetProvider() { // Instruct the widget manager to update the widget appWidgetManager.updateAppWidget(appWidgetId, views) } +} + +private const val PREFS_NAME = "website.christine.xesite.NewPostWidget" +private const val PREF_PREFIX_KEY = "appwidget_" + +internal fun savePref(ctx: Context, key: String, value: String) { + val prefs = ctx.getSharedPreferences(PREFS_NAME, 0).edit() + prefs.putString(PREF_PREFIX_KEY + key, value) + prefs.apply() +} + +internal fun loadPref(ctx: Context, key: String, default: String): String { + val prefs = ctx.getSharedPreferences(PREFS_NAME, 0) + val titleValue = prefs.getString(PREF_PREFIX_KEY + key, default) + return titleValue ?: default } \ No newline at end of file