mirror of
https://github.com/krille-chan/fluffychat
synced 2024-10-03 21:12:42 +00:00
refactor: Switch to UP for FCM
This commit is contained in:
parent
7445a72129
commit
6aec3dd25c
11 changed files with 47 additions and 231 deletions
|
@ -82,11 +82,9 @@ flutter {
|
|||
|
||||
dependencies {
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
||||
//implementation 'com.google.firebase:firebase-messaging:19.0.1' // Workaround for https://github.com/microg/android_packages_apps_GmsCore/issues/313#issuecomment-617651698
|
||||
implementation('com.github.UnifiedPush:android-foss_embedded_fcm_distributor:1.0.0-beta1')
|
||||
testImplementation 'junit:junit:4.12'
|
||||
androidTestImplementation 'androidx.test:runner:1.1.1'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
|
||||
implementation 'androidx.multidex:multidex:2.0.1'
|
||||
}
|
||||
|
||||
//apply plugin: 'com.google.gms.google-services'
|
||||
|
|
|
@ -103,13 +103,6 @@
|
|||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
<service android:name=".FcmPushService"
|
||||
android:exported="false">
|
||||
<intent-filter>
|
||||
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
|
||||
</intent-filter>
|
||||
</service>
|
||||
|
||||
<receiver android:name="org.unifiedpush.flutter.connector.UnifiedPushReceiver"
|
||||
tools:replace="android:enabled"
|
||||
android:enabled="false">
|
||||
|
@ -124,6 +117,15 @@
|
|||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
<receiver android:enabled="true" android:name=".EmbeddedDistributor" android:exported="false">
|
||||
<intent-filter>
|
||||
<action android:name="org.unifiedpush.android.distributor.feature.BYTES_MESSAGE"/>
|
||||
<action android:name="org.unifiedpush.android.distributor.REGISTER"/>
|
||||
<action android:name="org.unifiedpush.android.distributor.UNREGISTER"/>
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
|
||||
<!-- Don't delete the meta-data below.
|
||||
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
|
||||
<meta-data
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
package chat.fluffy.fluffychat
|
||||
|
||||
import android.content.Context
|
||||
import org.unifiedpush.android.foss_embedded_fcm_distributor.EmbeddedDistributorReceiver
|
||||
|
||||
class EmbeddedDistributor: EmbeddedDistributorReceiver() {
|
||||
|
||||
override val googleProjectNumber = "865731724731" // This value comes from the google-services.json
|
||||
|
||||
override fun getEndpoint(context: Context, token: String, instance: String): String {
|
||||
// This returns the endpoint of your FCM Rewrite-Proxy
|
||||
return "https://push.fluffychat.im/_matrix/push/v1/notify?token=$token"
|
||||
}
|
||||
}
|
|
@ -1,36 +0,0 @@
|
|||
/*package chat.fluffy.fluffychat
|
||||
|
||||
import com.famedly.fcm_shared_isolate.FcmSharedIsolateService
|
||||
|
||||
import chat.fluffy.fluffychat.MainActivity
|
||||
|
||||
import io.flutter.embedding.android.FlutterActivity
|
||||
import io.flutter.embedding.engine.FlutterEngine
|
||||
import io.flutter.view.FlutterMain
|
||||
import io.flutter.embedding.engine.dart.DartExecutor.DartEntrypoint
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Bundle
|
||||
import android.util.Log
|
||||
import android.view.WindowManager
|
||||
|
||||
class FcmPushService : FcmSharedIsolateService() {
|
||||
override fun getEngine(): FlutterEngine {
|
||||
return provideEngine(getApplicationContext())
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun provideEngine(context: Context): FlutterEngine {
|
||||
var engine = MainActivity.engine
|
||||
if (engine == null) {
|
||||
engine = MainActivity.provideEngine(context)
|
||||
engine.getLocalizationPlugin().sendLocalesToFlutter(
|
||||
context.getResources().getConfiguration())
|
||||
engine.getDartExecutor().executeDartEntrypoint(
|
||||
DartEntrypoint.createDefault())
|
||||
}
|
||||
return engine
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
|
@ -8,7 +8,6 @@ buildscript {
|
|||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:4.2.1'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
//classpath 'com.google.gms:google-services:4.3.8'
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -39,8 +39,6 @@ import '../config/setting_keys.dart';
|
|||
import 'famedlysdk_store.dart';
|
||||
import 'platform_infos.dart';
|
||||
|
||||
//import 'package:fcm_shared_isolate/fcm_shared_isolate.dart';
|
||||
|
||||
class NoTokenException implements Exception {
|
||||
String get cause => 'Cannot get firebase token';
|
||||
}
|
||||
|
@ -52,7 +50,6 @@ class BackgroundPush {
|
|||
Client client;
|
||||
BuildContext? context;
|
||||
GlobalKey<VRouterState>? router;
|
||||
String? _fcmToken;
|
||||
void Function(String errorMsg, {Uri? link})? onFcmError;
|
||||
L10n? l10n;
|
||||
Store? _store;
|
||||
|
@ -65,8 +62,6 @@ class BackgroundPush {
|
|||
|
||||
final pendingTests = <String, Completer<void>>{};
|
||||
|
||||
final dynamic firebase = null; //FcmSharedIsolate();
|
||||
|
||||
DateTime? lastReceivedPush;
|
||||
|
||||
bool upAction = false;
|
||||
|
@ -77,17 +72,6 @@ class BackgroundPush {
|
|||
onRoomSync ??= client.onSync.stream
|
||||
.where((s) => s.hasRoomUpdate)
|
||||
.listen((s) => _onClearingPush(getFromServer: false));
|
||||
firebase?.setListeners(
|
||||
onMessage: (message) => pushHelper(
|
||||
PushNotification.fromJson(
|
||||
Map<String, dynamic>.from(message['data'] ?? message)),
|
||||
client: client,
|
||||
l10n: l10n,
|
||||
activeRoomId: router?.currentState?.pathParameters['roomid'],
|
||||
onSelectNotification: goToRoom,
|
||||
),
|
||||
onNewToken: _newFcmToken,
|
||||
);
|
||||
if (Platform.isAndroid) {
|
||||
UnifiedPush.initialize(
|
||||
onNewEndpoint: _newUpEndpoint,
|
||||
|
@ -123,20 +107,13 @@ class BackgroundPush {
|
|||
StreamSubscription<LoginState>? onLogin;
|
||||
StreamSubscription<SyncUpdate>? onRoomSync;
|
||||
|
||||
void _newFcmToken(String token) {
|
||||
_fcmToken = token;
|
||||
setupPush();
|
||||
}
|
||||
|
||||
Future<void> setupPusher({
|
||||
String? gatewayUrl,
|
||||
String? token,
|
||||
Set<String?>? oldTokens,
|
||||
bool useDeviceSpecificAppId = false,
|
||||
}) async {
|
||||
if (PlatformInfos.isIOS) {
|
||||
await firebase?.requestPermission();
|
||||
}
|
||||
print('Setup pusher $gatewayUrl $token');
|
||||
final clientName = PlatformInfos.clientName;
|
||||
oldTokens ??= <String>{};
|
||||
final pushers = await (client.getPushers().catchError((e) {
|
||||
|
@ -232,8 +209,6 @@ class BackgroundPush {
|
|||
if (!PlatformInfos.isIOS &&
|
||||
(await UnifiedPush.getDistributors()).isNotEmpty) {
|
||||
await setupUp();
|
||||
} else {
|
||||
await setupFirebase();
|
||||
}
|
||||
|
||||
// ignore: unawaited_futures
|
||||
|
@ -251,46 +226,6 @@ class BackgroundPush {
|
|||
});
|
||||
}
|
||||
|
||||
Future<void> _noFcmWarning() async {
|
||||
if (context == null) {
|
||||
return;
|
||||
}
|
||||
if (await store.getItemBool(SettingKeys.showNoGoogle, true)) {
|
||||
await loadLocale();
|
||||
if (PlatformInfos.isAndroid) {
|
||||
onFcmError?.call(
|
||||
l10n!.noGoogleServicesWarning,
|
||||
link: Uri.parse(
|
||||
AppConfig.enablePushTutorial,
|
||||
),
|
||||
);
|
||||
}
|
||||
onFcmError?.call(l10n!.oopsPushError);
|
||||
|
||||
if (null == await store.getItem(SettingKeys.showNoGoogle)) {
|
||||
await store.setItemBool(SettingKeys.showNoGoogle, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> setupFirebase() async {
|
||||
Logs().v('Setup firebase');
|
||||
if (_fcmToken?.isEmpty ?? true) {
|
||||
try {
|
||||
_fcmToken = await firebase?.getToken();
|
||||
if (_fcmToken == null) throw ('PushToken is null');
|
||||
} catch (e, s) {
|
||||
Logs().w('[Push] cannot get token', e, e is String ? null : s);
|
||||
await _noFcmWarning();
|
||||
return;
|
||||
}
|
||||
}
|
||||
await setupPusher(
|
||||
gatewayUrl: AppConfig.pushNotificationsGatewayUrl,
|
||||
token: _fcmToken,
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> goToRoom(String? roomId) async {
|
||||
try {
|
||||
Logs().v('[Push] Attempting to go to room $roomId...');
|
||||
|
@ -316,6 +251,7 @@ class BackgroundPush {
|
|||
}
|
||||
|
||||
Future<void> _newUpEndpoint(String newEndpoint, String i) async {
|
||||
print('New UP endpoint');
|
||||
upAction = true;
|
||||
if (newEndpoint.isEmpty) {
|
||||
await _upUnregistered(i);
|
||||
|
@ -324,36 +260,35 @@ class BackgroundPush {
|
|||
var endpoint =
|
||||
'https://matrix.gateway.unifiedpush.org/_matrix/push/v1/notify';
|
||||
try {
|
||||
const matrixGatewayPath = '/_matrix/push/v1/notify';
|
||||
if (Uri.parse(newEndpoint).path == matrixGatewayPath) {
|
||||
endpoint = newEndpoint.split('?').first;
|
||||
} else {
|
||||
final url = Uri.parse(newEndpoint)
|
||||
.replace(
|
||||
path: '/_matrix/push/v1/notify',
|
||||
path: matrixGatewayPath,
|
||||
query: '',
|
||||
)
|
||||
.toString()
|
||||
.split('?')
|
||||
.first;
|
||||
final res =
|
||||
json.decode(utf8.decode((await http.get(Uri.parse(url))).bodyBytes));
|
||||
final res = json
|
||||
.decode(utf8.decode((await http.get(Uri.parse(url))).bodyBytes));
|
||||
if (res['gateway'] == 'matrix' ||
|
||||
(res['unifiedpush'] is Map &&
|
||||
res['unifiedpush']['gateway'] == 'matrix')) {
|
||||
endpoint = url;
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
Logs().i(
|
||||
'[Push] No self-hosted unified push gateway present: ' + newEndpoint);
|
||||
}
|
||||
Logs().i('[Push] UnifiedPush using endpoint ' + endpoint);
|
||||
final oldTokens = <String?>{};
|
||||
try {
|
||||
final fcmToken = await firebase?.getToken();
|
||||
oldTokens.add(fcmToken);
|
||||
} catch (_) {}
|
||||
await setupPusher(
|
||||
gatewayUrl: endpoint,
|
||||
token: newEndpoint,
|
||||
oldTokens: oldTokens,
|
||||
useDeviceSpecificAppId: true,
|
||||
token: Uri.tryParse(newEndpoint)?.queryParameters['token'],
|
||||
useDeviceSpecificAppId: false,
|
||||
);
|
||||
await store.setItem(SettingKeys.unifiedPushEndpoint, newEndpoint);
|
||||
await store.setItemBool(SettingKeys.unifiedPushRegistered, true);
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
#!/usr/bin/env bash
|
||||
git apply ./scripts/enable-android-google-services.patch
|
||||
FLUFFYCHAT_ORIG_GROUP="im.fluffychat"
|
||||
FLUFFYCHAT_ORIG_TEAM="4NXF6Z997G"
|
||||
#FLUFFYCHAT_NEW_GROUP="com.example.fluffychat"
|
||||
|
|
|
@ -2,7 +2,5 @@
|
|||
flutter pub get
|
||||
flutter pub run import_sorter:main --no-comments --exit-if-changed
|
||||
flutter format lib/ test/ --set-exit-if-changed
|
||||
git apply ./scripts/enable-android-google-services.patch
|
||||
flutter pub get
|
||||
flutter analyze
|
||||
flutter pub run dart_code_metrics:metrics lib -r gitlab > code-quality-report.json || true
|
|
@ -1,91 +0,0 @@
|
|||
diff --git a/android/app/build.gradle b/android/app/build.gradle
|
||||
index ad9ffb87..37baafb1 100644
|
||||
--- a/android/app/build.gradle
|
||||
+++ b/android/app/build.gradle
|
||||
@@ -44,7 +44,7 @@ android {
|
||||
|
||||
defaultConfig {
|
||||
applicationId "chat.fluffy.fluffychat"
|
||||
- minSdkVersion 16
|
||||
+ minSdkVersion 19
|
||||
targetSdkVersion 30
|
||||
versionCode flutterVersionCode.toInteger()
|
||||
versionName flutterVersionName
|
||||
@@ -82,11 +82,11 @@ flutter {
|
||||
|
||||
dependencies {
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
||||
- //implementation 'com.google.firebase:firebase-messaging:19.0.1' // Workaround for https://github.com/microg/android_packages_apps_GmsCore/issues/313#issuecomment-617651698
|
||||
+ implementation 'com.google.firebase:firebase-messaging:19.0.1' // Workaround for https://github.com/microg/android_packages_apps_GmsCore/issues/313#issuecomment-617651698
|
||||
testImplementation 'junit:junit:4.12'
|
||||
androidTestImplementation 'androidx.test:runner:1.1.1'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
|
||||
implementation 'androidx.multidex:multidex:2.0.1'
|
||||
}
|
||||
|
||||
-//apply plugin: 'com.google.gms.google-services'
|
||||
+apply plugin: 'com.google.gms.google-services'
|
||||
diff --git a/android/app/src/main/kotlin/chat/fluffy/fluffychat/FcmPushService.kt b/android/app/src/main/kotlin/chat/fluffy/fluffychat/FcmPushService.kt
|
||||
index d9930f55..510e9845 100644
|
||||
--- a/android/app/src/main/kotlin/chat/fluffy/fluffychat/FcmPushService.kt
|
||||
+++ b/android/app/src/main/kotlin/chat/fluffy/fluffychat/FcmPushService.kt
|
||||
@@ -1,4 +1,4 @@
|
||||
-/*package chat.fluffy.fluffychat
|
||||
+package chat.fluffy.fluffychat
|
||||
|
||||
import com.famedly.fcm_shared_isolate.FcmSharedIsolateService
|
||||
|
||||
@@ -33,4 +33,3 @@ class FcmPushService : FcmSharedIsolateService() {
|
||||
}
|
||||
}
|
||||
}
|
||||
-*/
|
||||
\ No newline at end of file
|
||||
diff --git a/android/build.gradle b/android/build.gradle
|
||||
index 85aa8647..3b7e09e7 100644
|
||||
--- a/android/build.gradle
|
||||
+++ b/android/build.gradle
|
||||
@@ -8,7 +8,7 @@ buildscript {
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:4.2.1'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
- //classpath 'com.google.gms:google-services:4.3.8'
|
||||
+ classpath 'com.google.gms:google-services:4.3.8'
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/lib/utils/background_push.dart b/lib/utils/background_push.dart
|
||||
index 00ca2aaa..8bb8a156 100644
|
||||
--- a/lib/utils/background_push.dart
|
||||
+++ b/lib/utils/background_push.dart
|
||||
@@ -39,7 +39,7 @@ import '../config/setting_keys.dart';
|
||||
import 'famedlysdk_store.dart';
|
||||
import 'platform_infos.dart';
|
||||
|
||||
-//import 'package:fcm_shared_isolate/fcm_shared_isolate.dart';
|
||||
+import 'package:fcm_shared_isolate/fcm_shared_isolate.dart';
|
||||
|
||||
class NoTokenException implements Exception {
|
||||
String get cause => 'Cannot get firebase token';
|
||||
@@ -65,7 +65,7 @@ class BackgroundPush {
|
||||
|
||||
final pendingTests = <String, Completer<void>>{};
|
||||
|
||||
- final dynamic firebase = null; //FcmSharedIsolate();
|
||||
+ final dynamic firebase = FcmSharedIsolate();
|
||||
|
||||
DateTime? lastReceivedPush;
|
||||
|
||||
diff --git a/pubspec.yaml b/pubspec.yaml
|
||||
index c6295788..8dd17ce4 100644
|
||||
--- a/pubspec.yaml
|
||||
+++ b/pubspec.yaml
|
||||
@@ -24,7 +24,7 @@ dependencies:
|
||||
email_validator: ^2.0.1
|
||||
emoji_picker_flutter: ^1.1.2
|
||||
encrypt: ^5.0.1
|
||||
- #fcm_shared_isolate: ^0.1.0
|
||||
+ fcm_shared_isolate: ^0.1.0
|
||||
file_picker_cross: ^4.5.0
|
||||
flutter:
|
||||
sdk: flutter
|
|
@ -1,5 +1,4 @@
|
|||
#!/usr/bin/env bash
|
||||
git apply ./scripts/enable-android-google-services.patch
|
||||
cd android
|
||||
echo $FDROID_KEY | base64 --decode --ignore-garbage > key.jks
|
||||
echo "storePassword=${FDROID_KEY_PASS}" >> key.properties
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
#!/bin/sh -ve
|
||||
git apply ./scripts/enable-android-google-services.patch
|
||||
flutter clean
|
||||
flutter pub get
|
||||
cd ios
|
||||
|
|
Loading…
Reference in a new issue