From 82c17a4d1d3f100901f13184ecc8946b75c7dc8d Mon Sep 17 00:00:00 2001 From: Andrea Gottardo Date: Thu, 9 May 2024 11:33:51 -0700 Subject: [PATCH] drawables: add disabled notification icon (#384) Adds a disabled state for the notification icon, and uses it where needed. Also switches to using vector-based icons instead of PNGs. Signed-off-by: Andrea Gottardo --- .../src/main/java/com/tailscale/ipn/App.kt | 43 ++++++++-------- .../res/drawable-hdpi/ic_notification.png | Bin 641 -> 0 bytes .../res/drawable-mdpi/ic_notification.png | Bin 406 -> 0 bytes .../res/drawable-xhdpi/ic_notification.png | Bin 879 -> 0 bytes .../res/drawable-xxhdpi/ic_notification.png | Bin 1415 -> 0 bytes .../res/drawable-xxxhdpi/ic_notification.png | Bin 1843 -> 0 bytes .../src/main/res/drawable/ic_notification.xml | 38 +++++++++++++++ .../res/drawable/ic_notification_disabled.xml | 46 ++++++++++++++++++ 8 files changed, 105 insertions(+), 22 deletions(-) delete mode 100644 android/src/main/res/drawable-hdpi/ic_notification.png delete mode 100644 android/src/main/res/drawable-mdpi/ic_notification.png delete mode 100644 android/src/main/res/drawable-xhdpi/ic_notification.png delete mode 100644 android/src/main/res/drawable-xxhdpi/ic_notification.png delete mode 100644 android/src/main/res/drawable-xxxhdpi/ic_notification.png create mode 100644 android/src/main/res/drawable/ic_notification.xml create mode 100644 android/src/main/res/drawable/ic_notification_disabled.xml diff --git a/android/src/main/java/com/tailscale/ipn/App.kt b/android/src/main/java/com/tailscale/ipn/App.kt index 7443a4a..e86bcfb 100644 --- a/android/src/main/java/com/tailscale/ipn/App.kt +++ b/android/src/main/java/com/tailscale/ipn/App.kt @@ -131,7 +131,7 @@ class App : Application(), libtailscale.AppContext { fun setWantRunning(wantRunning: Boolean) { val callback: (Result) -> Unit = { result -> result.fold( - onSuccess = { }, + onSuccess = {}, onFailure = { error -> Log.d("TAG", "Set want running: failed to update preferences: ${error.message}") }) @@ -181,7 +181,6 @@ class App : Application(), libtailscale.AppContext { startService(intent) } - // encryptToPref a byte array of data using the Jetpack Security // library and writes it to a global encrypted preference store. @Throws(IOException::class, GeneralSecurityException::class) @@ -215,26 +214,17 @@ class App : Application(), libtailscale.AppContext { QuickToggleService.setReady(this, ready) Log.d("App", "Set Tile Ready: $ready") val action = if (ready) IPNReceiver.INTENT_DISCONNECT_VPN else IPNReceiver.INTENT_CONNECT_VPN - val intent = Intent(this, IPNReceiver::class.java).apply { - this.action = action - } - val pendingIntent : PendingIntent = PendingIntent.getBroadcast( - this, - 0, - intent, - PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE - ) - if (ready){ + val intent = Intent(this, IPNReceiver::class.java).apply { this.action = action } + val pendingIntent: PendingIntent = + PendingIntent.getBroadcast( + this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) + if (ready) { startVPN() } - val notificationMessage = if (ready) getString(R.string.connected) else getString(R.string.not_connected) + val notificationMessage = + if (ready) getString(R.string.connected) else getString(R.string.not_connected) notify( - "Tailscale", - notificationMessage, - STATUS_CHANNEL_ID, - pendingIntent, - STATUS_NOTIFICATION_ID -) + "Tailscale", notificationMessage, ready, STATUS_CHANNEL_ID, pendingIntent, STATUS_NOTIFICATION_ID) } fun getHostname(): String { @@ -337,7 +327,8 @@ class App : Application(), libtailscale.AppContext { } val pending: PendingIntent = PendingIntent.getActivity(this, 0, viewIntent, PendingIntent.FLAG_UPDATE_CURRENT) - notify(getString(R.string.file_notification), msg, FILE_CHANNEL_ID, pending, FILE_NOTIFICATION_ID) + notify( + getString(R.string.file_notification), msg, true, FILE_CHANNEL_ID, pending, FILE_NOTIFICATION_ID) } fun createNotificationChannel(id: String?, name: String?, importance: Int) { @@ -346,10 +337,18 @@ class App : Application(), libtailscale.AppContext { nm.createNotificationChannel(channel) } - fun notify(title: String?, message: String?, channel: String, intent: PendingIntent?, notificationID: Int) { + fun notify( + title: String?, + message: String?, + usesEnabledIcon: Boolean, + channel: String, + intent: PendingIntent?, + notificationID: Int + ) { + val icon = if (usesEnabledIcon) R.drawable.ic_notification else R.drawable.ic_notification_disabled val builder: NotificationCompat.Builder = NotificationCompat.Builder(this, channel) - .setSmallIcon(R.drawable.ic_notification) + .setSmallIcon(icon) .setContentTitle(title) .setContentText(message) .setContentIntent(intent) diff --git a/android/src/main/res/drawable-hdpi/ic_notification.png b/android/src/main/res/drawable-hdpi/ic_notification.png deleted file mode 100644 index e6aec75abdc025731dad223439572682677e4fbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 641 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 diff --git a/android/src/main/res/drawable/ic_notification.xml b/android/src/main/res/drawable/ic_notification.xml new file mode 100644 index 0000000..7ed7e21 --- /dev/null +++ b/android/src/main/res/drawable/ic_notification.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + diff --git a/android/src/main/res/drawable/ic_notification_disabled.xml b/android/src/main/res/drawable/ic_notification_disabled.xml new file mode 100644 index 0000000..68eb971 --- /dev/null +++ b/android/src/main/res/drawable/ic_notification_disabled.xml @@ -0,0 +1,46 @@ + + + + + + + + + + +