From 87213ac5eb7a6b557cf58609fce03c2e0ef1e36a Mon Sep 17 00:00:00 2001
From: pacien
Date: Mon, 6 Aug 2018 02:30:00 +0200
Subject: Use notifications for error reporting
---
app/build.gradle | 1 +
app/src/main/AndroidManifest.xml | 1 -
.../main/java/org/pacien/tincapp/context/App.kt | 13 ++--
.../tincapp/context/AppNotificationManager.kt | 84 ++++++++++++++++++++++
.../org/pacien/tincapp/service/TincVpnService.kt | 2 +
.../java/org/pacien/tincapp/utils/ProgressModal.kt | 2 +
.../main/res/drawable/ic_warning_primary_24dp.xml | 28 ++++++++
app/src/main/res/values/strings.xml | 2 +
8 files changed, 123 insertions(+), 10 deletions(-)
create mode 100644 app/src/main/java/org/pacien/tincapp/context/AppNotificationManager.kt
create mode 100644 app/src/main/res/drawable/ic_warning_primary_24dp.xml
diff --git a/app/build.gradle b/app/build.gradle
index bc5ae95..bfe3944 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -55,6 +55,7 @@ dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'net.sourceforge.streamsupport:streamsupport-cfuture:1.6.3'
+ implementation "com.android.support:support-compat:27.1.1"
implementation 'com.android.support:design:27.1.1'
implementation 'com.google.zxing:android-integration:3.3.0'
implementation 'org.bouncycastle:bcpkix-jdk15on:1.59'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index bf8e9d7..d96fba6 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -23,7 +23,6 @@
package="org.pacien.tincapp">
-
openURL(manualLink) } }
- .setPositiveButton(R.string.action_close) { _, _ -> Unit }
- .create().apply { window.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR) }.show()
- }
+ fun alert(@StringRes title: Int, msg: String, manualLink: String? = null) =
+ notificationManager.notifyError(appContext!!.getString(title), msg, manualLink)
fun openURL(url: String) {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
diff --git a/app/src/main/java/org/pacien/tincapp/context/AppNotificationManager.kt b/app/src/main/java/org/pacien/tincapp/context/AppNotificationManager.kt
new file mode 100644
index 0000000..0f9092a
--- /dev/null
+++ b/app/src/main/java/org/pacien/tincapp/context/AppNotificationManager.kt
@@ -0,0 +1,84 @@
+/*
+ * tinc app, an Android binding and user interface for the tinc mesh VPN daemon
+ * Copyright (C) 2017-2018 Pacien TRAN-GIRARD
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package org.pacien.tincapp.context
+
+import android.app.NotificationChannel
+import android.app.NotificationManager
+import android.app.PendingIntent
+import android.content.Context
+import android.content.Intent
+import android.net.Uri
+import android.os.Build
+import android.support.annotation.RequiresApi
+import android.support.v4.app.NotificationCompat
+import android.support.v4.app.NotificationManagerCompat
+import org.pacien.tincapp.R
+
+/**
+ * @author pacien
+ */
+class AppNotificationManager(private val context: Context) {
+ companion object {
+ private const val CHANNEL_ID = "org.pacien.tincapp.notification.channels.error"
+ private const val ERROR_NOTIFICATION_ID = 0
+ }
+
+ init {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) registerChannel()
+ }
+
+ fun notifyError(title: String, message: String, manualLink: String? = null) {
+ val notification = NotificationCompat.Builder(context, CHANNEL_ID)
+ .setSmallIcon(R.drawable.ic_warning_primary_24dp)
+ .setContentTitle(title)
+ .setContentText(message)
+ .setStyle(NotificationCompat.BigTextStyle().bigText(message))
+ .setHighPriority()
+ .setAutoCancel(true)
+ .apply { if (manualLink != null) setManualLink(manualLink) }
+ .build()
+
+ NotificationManagerCompat.from(context)
+ .notify(ERROR_NOTIFICATION_ID, notification)
+ }
+
+ fun dismissAll() {
+ NotificationManagerCompat.from(context).cancelAll()
+ }
+
+ @RequiresApi(Build.VERSION_CODES.O)
+ private fun registerChannel() {
+ val name = context.getString(R.string.notification_channel_error_name)
+ val importance = NotificationManager.IMPORTANCE_HIGH
+ val channel = NotificationChannel(CHANNEL_ID, name, importance)
+ val notificationManager = context.getSystemService(NotificationManager::class.java)
+ notificationManager.createNotificationChannel(channel)
+ }
+
+ private fun NotificationCompat.Builder.setHighPriority() = apply {
+ priority = NotificationCompat.PRIORITY_MAX
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) setDefaults(NotificationCompat.DEFAULT_SOUND) // force heads-up notification
+ }
+
+ private fun NotificationCompat.Builder.setManualLink(manualLink: String) = apply {
+ val intent = Intent(Intent.ACTION_VIEW, Uri.parse(manualLink))
+ val pendingIntent = PendingIntent.getActivity(context, 0, intent, 0)
+ addAction(R.drawable.ic_help_primary_24dp, context.getString(R.string.action_open_manual), pendingIntent)
+ }
+}
diff --git a/app/src/main/java/org/pacien/tincapp/service/TincVpnService.kt b/app/src/main/java/org/pacien/tincapp/service/TincVpnService.kt
index 30d7c8b..6ed9a34 100644
--- a/app/src/main/java/org/pacien/tincapp/service/TincVpnService.kt
+++ b/app/src/main/java/org/pacien/tincapp/service/TincVpnService.kt
@@ -197,6 +197,8 @@ class TincVpnService : VpnService() {
fun isConnected() = !(daemon?.isDone ?: true)
fun connect(netName: String, passphrase: String? = null) {
+ App.notificationManager.dismissAll()
+
App.getContext().startService(
Intent(App.getContext(), TincVpnService::class.java)
.setAction(Actions.ACTION_CONNECT)
diff --git a/app/src/main/java/org/pacien/tincapp/utils/ProgressModal.kt b/app/src/main/java/org/pacien/tincapp/utils/ProgressModal.kt
index 379e3af..6bf02d5 100644
--- a/app/src/main/java/org/pacien/tincapp/utils/ProgressModal.kt
+++ b/app/src/main/java/org/pacien/tincapp/utils/ProgressModal.kt
@@ -27,6 +27,8 @@ import android.widget.TextView
import org.pacien.tincapp.R
/**
+ * An indefinite progress dialog replacing the deprecated `android.app.ProgressDialog`.
+ *
* @author pacien
*/
object ProgressModal {
diff --git a/app/src/main/res/drawable/ic_warning_primary_24dp.xml b/app/src/main/res/drawable/ic_warning_primary_24dp.xml
new file mode 100644
index 0000000..d8fa0fe
--- /dev/null
+++ b/app/src/main/res/drawable/ic_warning_primary_24dp.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index e8ba80d..e4adcae 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -32,6 +32,8 @@
Running on Android %1$s %2$s
Device ABIs: %1$s
+ Errors
+
About this app
Configure
Disconnect
--
cgit v1.2.3