From d8d36edb45f11ad774e7a93093280e14806f1139 Mon Sep 17 00:00:00 2001 From: Christine Dodrill Date: Mon, 5 Jul 2021 20:30:17 -0400 Subject: [PATCH] oh hey it works! Signed-off-by: Christine Dodrill --- app/build.gradle | 3 +- .../christine/xesite/GsonGetRequest.kt | 49 ++++++++++ .../java/website/christine/xesite/NewPost.kt | 7 ++ .../website/christine/xesite/NewPostWidget.kt | 90 ++++++++++++++----- app/src/main/res/layout/new_post_widget.xml | 53 ++++------- app/src/main/res/xml/new_post_widget_info.xml | 2 +- 6 files changed, 147 insertions(+), 57 deletions(-) create mode 100644 app/src/main/java/website/christine/xesite/GsonGetRequest.kt create mode 100644 app/src/main/java/website/christine/xesite/NewPost.kt diff --git a/app/build.gradle b/app/build.gradle index c13149b..7f3c0a6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -207,5 +207,6 @@ dependencies { implementation 'com.google.androidbrowserhelper:androidbrowserhelper:2.2.0' implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - implementation "com.android.support:support-compat:28.0.0" + implementation 'com.android.volley:volley:1.2.0' + implementation 'com.google.code.gson:gson:2.8.7' } diff --git a/app/src/main/java/website/christine/xesite/GsonGetRequest.kt b/app/src/main/java/website/christine/xesite/GsonGetRequest.kt new file mode 100644 index 0000000..f51f36e --- /dev/null +++ b/app/src/main/java/website/christine/xesite/GsonGetRequest.kt @@ -0,0 +1,49 @@ +package website.christine.xesite + +import com.android.volley.NetworkResponse +import com.android.volley.ParseError +import com.android.volley.Request +import com.android.volley.Response +import com.android.volley.toolbox.HttpHeaderParser +import com.google.gson.Gson +import com.google.gson.JsonSyntaxException +import java.io.UnsupportedEncodingException +import java.nio.charset.Charset + +/** + * Make a GET request and return a parsed object from JSON. + * + * @param url URL of the request to make + * @param clazz Relevant class object, for Gson's reflection + * @param headers Map of request headers + * + * From here: https://developer.android.com/training/volley/request-custom + */ +class GsonGetRequest( + url: String, + private val clazz: Class, + private val headers: MutableMap?, + private val listener: Response.Listener, + errorListener: Response.ErrorListener +) : Request(Method.GET, url, errorListener) { + private val gson = Gson() + + override fun getHeaders(): MutableMap = headers ?: super.getHeaders() + + override fun deliverResponse(response: T) = listener.onResponse(response) + + override fun parseNetworkResponse(response: NetworkResponse?): Response { + return try { + val json = String( + response?.data ?: ByteArray(0), + Charset.forName(HttpHeaderParser.parseCharset(response?.headers))) + Response.success( + gson.fromJson(json, clazz), + HttpHeaderParser.parseCacheHeaders(response)) + } catch (e: UnsupportedEncodingException) { + Response.error(ParseError(e)) + } catch (e: JsonSyntaxException) { + Response.error(ParseError(e)) + } + } +} diff --git a/app/src/main/java/website/christine/xesite/NewPost.kt b/app/src/main/java/website/christine/xesite/NewPost.kt new file mode 100644 index 0000000..fad5a6d --- /dev/null +++ b/app/src/main/java/website/christine/xesite/NewPost.kt @@ -0,0 +1,7 @@ +package website.christine.xesite + +class NewPost ( + val title: String, + val summary: String, + val link: String, +) \ No newline at end of file diff --git a/app/src/main/java/website/christine/xesite/NewPostWidget.kt b/app/src/main/java/website/christine/xesite/NewPostWidget.kt index 236d200..60cf8ce 100644 --- a/app/src/main/java/website/christine/xesite/NewPostWidget.kt +++ b/app/src/main/java/website/christine/xesite/NewPostWidget.kt @@ -3,44 +3,94 @@ package website.christine.xesite import android.appwidget.AppWidgetManager import android.appwidget.AppWidgetProvider import android.content.Context -import android.widget.LinearLayout +import android.util.Log import android.widget.RemoteViews +import com.android.volley.RequestQueue +import com.android.volley.Response +import com.android.volley.toolbox.BasicNetwork +import com.android.volley.toolbox.DiskBasedCache +import com.android.volley.toolbox.HurlStack /** * Implementation of App Widget functionality. */ class NewPostWidget : AppWidgetProvider() { + private lateinit var requestQueue: RequestQueue + override fun onUpdate( - context: Context, + ctx: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray ) { - // There may be multiple widgets active, so update all of them - for (appWidgetId in appWidgetIds) { - updateAppWidget(context, appWidgetManager, appWidgetId) + val url = "https://christine.website/.within/website.within.xesite/new_post" + + val jor: GsonGetRequest = GsonGetRequest( + url, + NewPost::class.java, + null, + Response.Listener { response -> + Log.println(Log.INFO, "new_post", response.toString()) + // There may be multiple widgets active, so update all of them + for (appWidgetId in appWidgetIds) { + this.updateAppWidget(ctx, appWidgetManager, appWidgetId, response) + } + }, Response.ErrorListener { error -> + // There may be multiple widgets active, so update all of them + for (appWidgetId in appWidgetIds) { + this.updateAppWidget( + ctx, + appWidgetManager, + appWidgetId, + NewPost("Error", error.toString(), "") + ) + } + }) + + if (!this::requestQueue.isInitialized) { + this.makeQueue(ctx) + } + this.requestQueue.add(jor) + } + + private fun makeQueue(ctx: Context) { + // Instantiate the cache + val cache = DiskBasedCache(ctx.cacheDir, 1024 * 1024) // 1MB cap + + // Set up the network to use HttpURLConnection as the HTTP client. + val network = BasicNetwork(HurlStack()) + + this.requestQueue = RequestQueue(cache, network).apply { + start() } } - override fun onEnabled(context: Context) { - // Enter relevant functionality for when the first widget is created - val views = RemoteViews(context.packageName, R.layout.new_post_widget) + override fun onEnabled(ctx: Context) { + this.makeQueue(ctx) } override fun onDisabled(context: Context) { // Enter relevant functionality for when the last widget is disabled } -} -internal fun updateAppWidget( - context: Context, - appWidgetManager: AppWidgetManager, - appWidgetId: Int -) { - // Construct the RemoteViews object - val views = RemoteViews(context.packageName, R.layout.new_post_widget) - views.setTextViewText(R.id.article_title, "My Thoughts About Using Android Again as an iPhone User") - views.setTextViewText(R.id.appwidget_text2, "I used to be a hardcore Android user. It was my second major kind of smartphone (the first was Windows Mobile 6.1 on a T-Mobile Dash) and it left me hooked to the concept of smartphones and connected tech in general.") + private fun updateAppWidget( + context: Context, + appWidgetManager: AppWidgetManager, + appWidgetId: Int, + body: NewPost + ) { + // Construct the RemoteViews object + val views = RemoteViews(context.packageName, R.layout.new_post_widget) - // Instruct the widget manager to update the widget - appWidgetManager.updateAppWidget(appWidgetId, views) + views.setTextViewText( + R.id.article_title, + body.title + ) + views.setTextViewText( + R.id.article_preview, + body.summary + ) + + // Instruct the widget manager to update the widget + appWidgetManager.updateAppWidget(appWidgetId, views) + } } \ No newline at end of file diff --git a/app/src/main/res/layout/new_post_widget.xml b/app/src/main/res/layout/new_post_widget.xml index a711bca..0a7a166 100644 --- a/app/src/main/res/layout/new_post_widget.xml +++ b/app/src/main/res/layout/new_post_widget.xml @@ -10,12 +10,12 @@ + android:orientation="vertical"> + android:layout_width="match_parent" + android:layout_height="109dp" + android:orientation="horizontal"> -