Skip to content

Commit 91299b1

Browse files
AlaaElattarzaelgoharyAhmedHanafy725
authored
Background service to check if node goes offline (#994)
* WIP: adding notifications pgk * fix ios issue and show notification with offline nodes * remove unused import && undo changes in podfile.lock * WIP: adding permissions for android * WIP: downgrade background_fetch * WIP: downgrade background_fetch * clear cached background_fetch * specify ndk version * undo nkd version setup * WIP: add debug logs * WIP: debug background_fetch version * update pubspec.lock * update build.gradle * WIP: remove gradle cache * fix command * WIP: Update build.gradle * WIP: fix space * undo latest commit * add maven url in build.gradle * Add close button for confirmation dialog (#976) * add close button for confirmation dialog * add cancel btn in bridge also * Handle non-loading for delete wallet (#973) * add timeout 1 min for deleting wallet * update error messages * Prevent PIN Entry Attempts During 30 Second Lockout Period (#989) * keep user locked after the many attempts * update pin screen to include live counter * Fix transactions paginations (#992) * Fix transactions pagination, use pagingToken instead of offset * Edit listTransactions to return stream instead of list * Update stellar client ref * handle duplicated daily (#986) * Update the packages version for background_fetch & flutter_local_notifications * Request to enable the notification service on android * Revert the changes in the wrong manifest file * Update the gradle repos * Update build gradle dependencies * Update the manifest permissions * only show notifications for nodes down last 2 days && group notifications * remove unused import * update checking nodes for last 7 days * Update app/lib/services/background_service.dart Co-authored-by: AhmedHanafy725 <41957921+AhmedHanafy725@users.noreply.github.com> * apply pr comments && apply the exponential notification * handle notification grouping * handled tapping on notification * Hide show phrase (#995) * Handle duplicated contacts in favorite List (#983) * handle duplicated contacts * undo latest solution * fix adding duplicated wallet in fav list * Fixed the duplicated contacts issue * update condition when editing address * Fix auth timeout routing (#1000) * Creating app lifecycle observer and use it in main.dart w navigator key, Replace Navigator routes w navigator key * Remove unused code * Revert navigator key changes from screens * Revert main screen changes * fix ios issue and show notification with offline nodes * update pubspec.lock * fix workflow * fix equation && workflow * undo the equation * fixed time conversion --------- Co-authored-by: Zainab Elgohary <40770501+zaelgohary@users.noreply.github.com> Co-authored-by: AhmedHanafy725 <hanafya@incubaid.com> Co-authored-by: AhmedHanafy725 <41957921+AhmedHanafy725@users.noreply.github.com>
1 parent c529c87 commit 91299b1

19 files changed

+704
-182
lines changed

app/android/app/build_local

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ android {
4040
}
4141

4242
compileOptions {
43+
coreLibraryDesugaringEnabled true
4344
sourceCompatibility JavaVersion.VERSION_17
4445
targetCompatibility JavaVersion.VERSION_17
4546
}
@@ -101,4 +102,7 @@ dependencies {
101102
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
102103
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
103104
implementation "androidx.activity:activity:1.9.3"
105+
implementation 'androidx.window:window:1.0.0'
106+
implementation 'androidx.window:window-java:1.0.0'
107+
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.4'
104108
}

app/android/app/build_production

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ android {
4040
}
4141

4242
compileOptions {
43+
coreLibraryDesugaringEnabled true
4344
sourceCompatibility JavaVersion.VERSION_17
4445
targetCompatibility JavaVersion.VERSION_17
4546
}
@@ -101,4 +102,7 @@ dependencies {
101102
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
102103
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
103104
implementation "androidx.activity:activity:1.9.3"
105+
implementation 'androidx.window:window:1.0.0'
106+
implementation 'androidx.window:window-java:1.0.0'
107+
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.4'
104108
}

app/android/app/build_staging

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ android {
4040
}
4141

4242
compileOptions {
43+
coreLibraryDesugaringEnabled true
4344
sourceCompatibility JavaVersion.VERSION_17
4445
targetCompatibility JavaVersion.VERSION_17
4546
}
@@ -101,4 +102,7 @@ dependencies {
101102
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
102103
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
103104
implementation "androidx.activity:activity:1.9.3"
105+
implementation 'androidx.window:window:1.0.0'
106+
implementation 'androidx.window:window-java:1.0.0'
107+
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.4'
104108
}

app/android/app/build_testing

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ android {
4040
}
4141

4242
compileOptions {
43+
coreLibraryDesugaringEnabled true
4344
sourceCompatibility JavaVersion.VERSION_17
4445
targetCompatibility JavaVersion.VERSION_17
4546
}
@@ -101,4 +102,7 @@ dependencies {
101102
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
102103
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
103104
implementation "androidx.activity:activity:1.9.3"
105+
implementation 'androidx.window:window:1.0.0'
106+
implementation 'androidx.window:window-java:1.0.0'
107+
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.4'
104108
}

app/android/app/src/main/AndroidManifest_local

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
<manifest xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android">
22
<application tools:replace="android:label" android:label="ThreeFold Connect" android:icon="@mipmap/ic_launcher" android:usesCleartextTraffic="true" android:enableOnBackInvokedCallback="true">
3-
<activity android:name=".MainActivity" android:exported="true" android:launchMode="singleTop" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
3+
<activity android:name=".MainActivity"
4+
android:exported="true"
5+
android:launchMode="singleTop"
6+
android:theme="@style/LaunchTheme"
7+
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
8+
android:showWhenLocked="true"
9+
android:turnScreenOn="true"
410
android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize" android:enableOnBackInvokedCallback="false">
511
<meta-data android:name="io.flutter.embedding.android.NormalTheme" android:resource="@style/NormalTheme" />
612
<meta-data android:name="io.flutter.embedding.android.SplashScreenDrawable" android:resource="@drawable/launch_background" />
@@ -32,6 +38,22 @@
3238
</intent-filter>
3339
</activity>
3440
<meta-data android:name="flutterEmbedding" android:value="2" />
41+
<service
42+
android:name="com.dexterous.flutterlocalnotifications.ForegroundService"
43+
android:exported="false"
44+
android:stopWithTask="false"
45+
android:foregroundServiceType="specialUse">
46+
<property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE" android:value="To demonstrate how to use foreground services to show notifications"/>
47+
</service>
48+
<receiver android:exported="false" android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationReceiver" />
49+
<receiver android:exported="false" android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver">
50+
<intent-filter>
51+
<action android:name="android.intent.action.BOOT_COMPLETED"/>
52+
<action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>
53+
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
54+
<action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
55+
</intent-filter>
56+
</receiver>
3557
</application>
3658

3759
<uses-permission android:name="android.permission.INTERNET" />
@@ -41,6 +63,14 @@
4163
<uses-permission android:name="android.permission.WAKE_LOCK" />
4264
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
4365
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
66+
<uses-permission android:minSdkVersion="34" android:name="android.permission.USE_EXACT_ALARM" />
67+
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
68+
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
69+
<uses-permission android:name="android.permission.VIBRATE" />
70+
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
71+
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
72+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
73+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
4474

4575
<uses-feature android:name="android.hardware.camera.autofocus" />
4676
<uses-feature android:name="android.hardware.camera" />

app/android/app/src/main/AndroidManifest_production

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
<manifest xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android">
22
<application tools:replace="android:label" android:label="ThreeFold Connect" android:icon="@mipmap/ic_launcher" android:usesCleartextTraffic="true" android:enableOnBackInvokedCallback="true">
3-
<activity android:name=".MainActivity" android:exported="true" android:launchMode="singleTop" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
3+
<activity android:name=".MainActivity"
4+
android:exported="true"
5+
android:launchMode="singleTop"
6+
android:theme="@style/LaunchTheme"
7+
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
8+
android:showWhenLocked="true"
9+
android:turnScreenOn="true"
410
android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize" android:enableOnBackInvokedCallback="false">
511
<meta-data android:name="io.flutter.embedding.android.NormalTheme" android:resource="@style/NormalTheme" />
612
<meta-data android:name="io.flutter.embedding.android.SplashScreenDrawable" android:resource="@drawable/launch_background" />
@@ -32,6 +38,22 @@
3238
</intent-filter>
3339
</activity>
3440
<meta-data android:name="flutterEmbedding" android:value="2" />
41+
<service
42+
android:name="com.dexterous.flutterlocalnotifications.ForegroundService"
43+
android:exported="false"
44+
android:stopWithTask="false"
45+
android:foregroundServiceType="specialUse">
46+
<property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE" android:value="To demonstrate how to use foreground services to show notifications"/>
47+
</service>
48+
<receiver android:exported="false" android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationReceiver" />
49+
<receiver android:exported="false" android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver">
50+
<intent-filter>
51+
<action android:name="android.intent.action.BOOT_COMPLETED"/>
52+
<action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>
53+
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
54+
<action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
55+
</intent-filter>
56+
</receiver>
3557
</application>
3658

3759
<uses-permission android:name="android.permission.INTERNET" />
@@ -41,6 +63,14 @@
4163
<uses-permission android:name="android.permission.WAKE_LOCK" />
4264
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
4365
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
66+
<uses-permission android:minSdkVersion="34" android:name="android.permission.USE_EXACT_ALARM" />
67+
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
68+
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
69+
<uses-permission android:name="android.permission.VIBRATE" />
70+
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
71+
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
72+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
73+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
4474

4575
<uses-feature android:name="android.hardware.camera.autofocus" />
4676
<uses-feature android:name="android.hardware.camera" />

app/android/app/src/main/AndroidManifest_staging

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
<manifest xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android">
22
<application tools:replace="android:label" android:label="ThreeFold Connect" android:icon="@mipmap/ic_launcher" android:usesCleartextTraffic="true" android:enableOnBackInvokedCallback="true">
3-
<activity android:name=".MainActivity" android:exported="true" android:launchMode="singleTop" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
3+
<activity android:name=".MainActivity"
4+
android:exported="true"
5+
android:launchMode="singleTop"
6+
android:theme="@style/LaunchTheme"
7+
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
8+
android:showWhenLocked="true"
9+
android:turnScreenOn="true"
410
android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize" android:enableOnBackInvokedCallback="false">
511
<meta-data android:name="io.flutter.embedding.android.NormalTheme" android:resource="@style/NormalTheme" />
612
<meta-data android:name="io.flutter.embedding.android.SplashScreenDrawable" android:resource="@drawable/launch_background" />
@@ -32,6 +38,22 @@
3238
</intent-filter>
3339
</activity>
3440
<meta-data android:name="flutterEmbedding" android:value="2" />
41+
<service
42+
android:name="com.dexterous.flutterlocalnotifications.ForegroundService"
43+
android:exported="false"
44+
android:stopWithTask="false"
45+
android:foregroundServiceType="specialUse">
46+
<property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE" android:value="To demonstrate how to use foreground services to show notifications"/>
47+
</service>
48+
<receiver android:exported="false" android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationReceiver" />
49+
<receiver android:exported="false" android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver">
50+
<intent-filter>
51+
<action android:name="android.intent.action.BOOT_COMPLETED"/>
52+
<action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>
53+
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
54+
<action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
55+
</intent-filter>
56+
</receiver>
3557
</application>
3658

3759
<uses-permission android:name="android.permission.INTERNET" />
@@ -41,6 +63,14 @@
4163
<uses-permission android:name="android.permission.WAKE_LOCK" />
4264
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
4365
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
66+
<uses-permission android:minSdkVersion="34" android:name="android.permission.USE_EXACT_ALARM" />
67+
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
68+
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
69+
<uses-permission android:name="android.permission.VIBRATE" />
70+
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
71+
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
72+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
73+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
4474

4575
<uses-feature android:name="android.hardware.camera.autofocus" />
4676
<uses-feature android:name="android.hardware.camera" />

app/android/app/src/main/AndroidManifest_testing

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
<manifest xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android">
22
<application tools:replace="android:label" android:label="ThreeFold Connect" android:icon="@mipmap/ic_launcher" android:usesCleartextTraffic="true" android:enableOnBackInvokedCallback="true">
3-
<activity android:name=".MainActivity" android:exported="true" android:launchMode="singleTop" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
3+
<activity android:name=".MainActivity"
4+
android:exported="true"
5+
android:launchMode="singleTop"
6+
android:theme="@style/LaunchTheme"
7+
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
8+
android:showWhenLocked="true"
9+
android:turnScreenOn="true"
410
android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize" android:enableOnBackInvokedCallback="false">
511
<meta-data android:name="io.flutter.embedding.android.NormalTheme" android:resource="@style/NormalTheme" />
612
<meta-data android:name="io.flutter.embedding.android.SplashScreenDrawable" android:resource="@drawable/launch_background" />
@@ -32,6 +38,22 @@
3238
</intent-filter>
3339
</activity>
3440
<meta-data android:name="flutterEmbedding" android:value="2" />
41+
<service
42+
android:name="com.dexterous.flutterlocalnotifications.ForegroundService"
43+
android:exported="false"
44+
android:stopWithTask="false"
45+
android:foregroundServiceType="specialUse">
46+
<property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE" android:value="To demonstrate how to use foreground services to show notifications"/>
47+
</service>
48+
<receiver android:exported="false" android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationReceiver" />
49+
<receiver android:exported="false" android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver">
50+
<intent-filter>
51+
<action android:name="android.intent.action.BOOT_COMPLETED"/>
52+
<action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>
53+
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
54+
<action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
55+
</intent-filter>
56+
</receiver>
3557
</application>
3658

3759
<uses-permission android:name="android.permission.INTERNET" />
@@ -41,6 +63,14 @@
4163
<uses-permission android:name="android.permission.WAKE_LOCK" />
4264
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
4365
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
66+
<uses-permission android:minSdkVersion="34" android:name="android.permission.USE_EXACT_ALARM" />
67+
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
68+
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
69+
<uses-permission android:name="android.permission.VIBRATE" />
70+
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
71+
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
72+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
73+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
4474

4575
<uses-feature android:name="android.hardware.camera.autofocus" />
4676
<uses-feature android:name="android.hardware.camera" />

app/android/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ allprojects {
55
mavenCentral()
66
maven { url 'https://jitpack.io' }
77
maven { url 'https://maven.google.com' }
8+
// [required] background_fetch
9+
maven { url "${project(':background_fetch').projectDir}/libs" }
810
}
911
}
1012

app/ios/Podfile.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,4 +257,4 @@ SPEC CHECKSUMS:
257257

258258
PODFILE CHECKSUM: 050ff199c8e97450c391a88d64db90da96da9995
259259

260-
COCOAPODS: 1.16.2
260+
COCOAPODS: 1.16.2

app/ios/Runner/AppDelegate.swift

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,27 @@
11
import UIKit
22
import Flutter
3+
import flutter_local_notifications
34

45
@UIApplicationMain
56
@objc class AppDelegate: FlutterAppDelegate {
6-
override func application(
7+
override func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
8+
completionHandler([.alert, .badge, .sound])
9+
}
10+
11+
override func application(
712
_ application: UIApplication,
813
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
914
) -> Bool {
15+
FlutterLocalNotificationsPlugin.setPluginRegistrantCallback { (registry) in
16+
GeneratedPluginRegistrant.register(with: registry)
17+
}
18+
19+
if #available(iOS 10.0, *) {
20+
UNUserNotificationCenter.current().delegate = self as UNUserNotificationCenterDelegate
21+
}
22+
1023
GeneratedPluginRegistrant.register(with: self)
1124
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
25+
1226
}
13-
}
27+
}

app/ios/Runner/Info.plist

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,5 +86,19 @@
8686
<false/>
8787
<key>io.flutter.embedded_views_preview</key>
8888
<true/>
89+
<key>UIBackgroundModes</key>
90+
<array>
91+
<string>fetch</string>
92+
<string>remote-notification</string>
93+
</array>
94+
95+
<key>NSUserNotificationAlertStyle</key>
96+
<string>alert</string>
97+
98+
<key>NSLocalNetworkUsageDescription</key>
99+
<string>This app uses the network to monitor your node status.</string>
100+
101+
<key>NSUserNotificationUsageDescription</key>
102+
<string>This app needs permission to send you notifications when your node is offline.</string>
89103
</dict>
90104
</plist>

0 commit comments

Comments
 (0)