Skip to content

Commit

Permalink
Add MQTTChuck (#9)
Browse files Browse the repository at this point in the history
* Add MQTTChuck

* Add MQTTChuck
  • Loading branch information
alfianlosari authored May 17, 2023
1 parent ed20c27 commit 95d88c0
Show file tree
Hide file tree
Showing 89 changed files with 3,932 additions and 1,650 deletions.
3 changes: 2 additions & 1 deletion courier_dart_sdk/android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ buildscript {
}

dependencies {
classpath 'com.android.tools.build:gradle:4.1.0'
classpath 'com.android.tools.build:gradle:7.2.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
Expand Down Expand Up @@ -54,4 +54,5 @@ dependencies {
implementation "com.gojek.courier:mqtt-client:$courier_version"
implementation "com.gojek.courier:timer-pingsender:$courier_version"
implementation "com.gojek.courier:alarm-pingsender:$courier_version"
implementation "com.gojek.courier:chuck-mqtt:$courier_version"
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.8-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import android.util.Log
import androidx.annotation.NonNull
import com.gojek.alarm.pingsender.AlarmPingSenderConfig
import com.gojek.alarm.pingsender.AlarmPingSenderFactory
import com.gojek.chuckmqtt.external.MqttChuckConfig
import com.gojek.chuckmqtt.external.MqttChuckInterceptor
import com.gojek.courier.Message
import com.gojek.courier.courier_dart_sdk.internal.MqttClientDelegate
import com.gojek.courier.courier_dart_sdk.internal.event.MqttEventHandler
Expand Down Expand Up @@ -100,6 +102,12 @@ class CourierDartSdkPlugin: FlutterPlugin, MethodCallHandler {
val connectRetryPolicyConfig = arguments["connectRetryPolicyConfig"]!! as Map<String, Any>
val connectTimeoutPolicyConfig = arguments["connectTimeoutConfig"]!! as Map<String, Any>

val enableMqttChuck = if (arguments["enableMQTTChuck"] is Boolean) {
arguments["enableMQTTChuck"]!! as Boolean
} else {
false
}

readTimeoutSeconds = arguments["readTimeoutSeconds"]!! as Int
disconnectDelaySeconds = arguments["disconnectDelaySeconds"]!! as Int

Expand All @@ -122,7 +130,7 @@ class CourierDartSdkPlugin: FlutterPlugin, MethodCallHandler {
inactivityTimeoutSeconds = inactivityTimeoutSeconds,
),
pingSender = pingSender,
mqttInterceptorList = emptyList(),
mqttInterceptorList = if (enableMqttChuck) listOf(MqttChuckInterceptor(context, MqttChuckConfig())) else emptyList(),
eventHandler = MqttEventHandler(::handleEvent),
authFailureHandler = object : AuthFailureHandler {
override fun handleAuthFailure() {
Expand All @@ -147,7 +155,7 @@ class CourierDartSdkPlugin: FlutterPlugin, MethodCallHandler {
clientId = arguments["clientId"]!! as String,
username = arguments["username"]!! as String,
password = arguments["password"]!! as String,
serverUris = listOf(ServerUri(arguments["host"]!! as String, arguments["port"] as Int)),
serverUris = listOf(ServerUri(arguments["host"]!! as String, arguments["port"] as Int, arguments["scheme"]!! as String)),
keepAlive = KeepAlive(arguments["keepAliveSeconds"] as Int),
isCleanSession = arguments["cleanSession"]!! as Boolean,
readTimeoutSecs = readTimeoutSeconds
Expand Down
79 changes: 79 additions & 0 deletions courier_dart_sdk/ios/Classes/MQTTChuckView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import CourierMQTTChuck
import Flutter
#if canImport(SwiftUI)
import SwiftUI
#endif
import UIKit

class MQTTChuckViewFactory: NSObject, FlutterPlatformViewFactory {
private var messenger: FlutterBinaryMessenger
private let logger = MQTTChuckLogger()

init(messenger: FlutterBinaryMessenger) {
self.messenger = messenger
super.init()
}

func create(
withFrame frame: CGRect,
viewIdentifier viewId: Int64,
arguments args: Any?
) -> FlutterPlatformView {
return FlutterMQTTChuckView(
frame: frame,
viewIdentifier: viewId,
arguments: args,
logger: self.logger,
binaryMessenger: messenger)
}
}

class FlutterMQTTChuckView: NSObject, FlutterPlatformView {
private var _view: UIView
private let logger: MQTTChuckLogger

init(
frame: CGRect,
viewIdentifier viewId: Int64,
arguments args: Any?,
logger: MQTTChuckLogger,
binaryMessenger messenger: FlutterBinaryMessenger?
) {
_view = UIView()
self.logger = logger
super.init()
createNativeView()
}

func view() -> UIView {
return _view
}

func createNativeView(){
if #available(iOS 15, *) {
let topVC = (UIApplication.shared.windows.first(where: { $0.isKeyWindow }) ?? UIApplication.shared.windows.first)!.rootViewController
let mqttChuckView = MQTTChuckView(logger: self.logger)
let hostingController = UIHostingController(rootView: mqttChuckView)
let navigationController = UINavigationController(rootViewController: hostingController)
let swiftuiView = navigationController.view!
swiftuiView.translatesAutoresizingMaskIntoConstraints = false
topVC!.addChild(navigationController)
_view.addSubview(swiftuiView)

NSLayoutConstraint.activate([
swiftuiView.leadingAnchor.constraint(equalTo: _view.leadingAnchor),
swiftuiView.trailingAnchor.constraint(equalTo: _view.trailingAnchor),
swiftuiView.topAnchor.constraint(equalTo: _view.topAnchor),
swiftuiView.bottomAnchor.constraint(equalTo: _view.bottomAnchor)
])
navigationController.didMove(toParent: topVC)
} else {
let nativeLabel = UILabel()
nativeLabel.text = "MQTT Chuck is only supported on iOS 15 and above."
nativeLabel.textColor = UIColor.white
nativeLabel.textAlignment = .center
nativeLabel.frame = CGRect(x: 0, y: 0, width: 180, height: 48.0)
_view.addSubview(nativeLabel)
}
}
}
3 changes: 3 additions & 0 deletions courier_dart_sdk/ios/Classes/SwiftCourierDartSdkPlugin.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ public class SwiftCourierDartSdkPlugin: NSObject, FlutterPlugin {

let instance = SwiftCourierDartSdkPlugin(channel: channel)
registrar.addMethodCallDelegate(instance, channel: channel)

let factory = MQTTChuckViewFactory(messenger: registrar.messenger())
registrar.register(factory, withId: "mqtt-chuck-view")
}

public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
Expand Down
5 changes: 3 additions & 2 deletions courier_dart_sdk/ios/courier_dart_sdk.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,9 @@ Flutter SDK for Courier
s.source = { :path => '.' }
s.source_files = 'Classes/**/*'
s.dependency 'Flutter'
s.dependency 'CourierCore', '0.0.14'
s.dependency 'CourierMQTT', '0.0.14'
s.dependency 'CourierCore', '0.0.17'
s.dependency 'CourierMQTT', '0.0.17'
s.dependency 'CourierMQTTChuck', '0.0.17'
s.platform = :ios, '11.0'

# Flutter.framework does not contain a i386 slice.
Expand Down
2 changes: 1 addition & 1 deletion courier_dart_sdk/lib/auth_response_mapper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@ import 'package:courier_dart_sdk/courier_connect_options.dart';

abstract class AuthResponseMapper {
CourierConnectOptions map(Map<String, dynamic> response);
}
}
58 changes: 58 additions & 0 deletions courier_dart_sdk/lib/chuck/mqtt_chuck_view.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

class MQTTChuckView extends StatelessWidget {
const MQTTChuckView({Key? key}) : super(key: key);

@override
Widget build(BuildContext context) {
const String viewType = 'mqtt-chuck-view';
final Map<String, dynamic> creationParams = <String, dynamic>{};

switch (defaultTargetPlatform) {
case TargetPlatform.iOS:
return Stack(
children: [
UiKitView(
viewType: viewType,
layoutDirection: TextDirection.ltr,
creationParams: creationParams,
creationParamsCodec: const StandardMessageCodec(),
),
Align(
alignment: Alignment.bottomRight,
child: Padding(
padding: const EdgeInsets.only(right: 32, bottom: 32),
child: FloatingActionButton(
child: const Icon(Icons.close),
onPressed: () {
Navigator.pop(context);
}),
)),
],
);

case TargetPlatform.android:
return Scaffold(
appBar: AppBar(
title: const Text('MQTT Chuck'),
),
body: Center(
child: Padding(
padding: const EdgeInsets.all(16),
child: Text(
"To enable MQTT Chuck on Android. Pass \"enableMQTTChuck\" as \"True\" when invoking Platform Channel \"initialise\" method.\n\n" +
"You need to grant notification permission access to the App.\n\n" +
"Notification will be posted as new MQTT log arrives, you can tap on banner from the Notification drawer to launch the transaction list Activity Screen.",
style: Theme.of(context).textTheme.headlineSmall,
textAlign: TextAlign.center,
),
)),
);

default:
return const Text("Unsupported Platform");
}
}
}
28 changes: 15 additions & 13 deletions courier_dart_sdk/lib/config/courier_configuration.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,20 @@ class CourierConfiguration {
final ConnectRetryPolicyConfig connectRetryPolicyConfig;
final ConnectTimeoutConfig connectTimeoutConfig;
final AuthRetryPolicy authRetryPolicy;
final bool enableMQTTChuck;

CourierConfiguration({
required this.tokenApi,
required this.authResponseMapper,
required this.authRetryPolicy,
this.timerPingSenderEnabled = true,
this.activityCheckIntervalSeconds = 12,
this.inactivityTimeoutSeconds = 10,
this.readTimeoutSeconds = 40,
this.disconnectDelaySeconds = 0,
this.connectRetryPolicyConfig = const ConnectRetryPolicyConfig(),
this.connectTimeoutConfig = const ConnectTimeoutConfig(),
});
CourierConfiguration(
{required this.tokenApi,
required this.authResponseMapper,
required this.authRetryPolicy,
this.timerPingSenderEnabled = true,
this.activityCheckIntervalSeconds = 12,
this.inactivityTimeoutSeconds = 10,
this.readTimeoutSeconds = 40,
this.disconnectDelaySeconds = 0,
this.connectRetryPolicyConfig = const ConnectRetryPolicyConfig(),
this.connectTimeoutConfig = const ConnectTimeoutConfig(),
this.enableMQTTChuck = false});

Map<String, dynamic> convertToMap() {
return {
Expand All @@ -37,6 +38,7 @@ class CourierConfiguration {
"disconnectDelaySeconds": disconnectDelaySeconds,
"connectRetryPolicyConfig": connectRetryPolicyConfig.convertToMap(),
"connectTimeoutConfig": connectTimeoutConfig.convertToMap(),
"enableMQTTChuck": enableMQTTChuck
};
}
}
}
22 changes: 12 additions & 10 deletions courier_dart_sdk/lib/courier_connect_options.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,30 +2,32 @@ class CourierConnectOptions {
final String clientId;
final String username;
final String password;
final String scheme;
final String host;
final int port;
final bool cleanSession;
final int keepAliveSeconds;

CourierConnectOptions({
required this.clientId,
required this.username,
required this.password,
required this.host,
required this.port,
required this.cleanSession,
required this.keepAliveSeconds
});
CourierConnectOptions(
{required this.clientId,
required this.username,
required this.password,
this.scheme = "ssl",
required this.host,
required this.port,
required this.cleanSession,
required this.keepAliveSeconds});

Map<String, Object> convertToMap() {
return {
"clientId": clientId,
"username": username,
"password": password,
"scheme": scheme,
"host": host,
"port": port,
"cleanSession": cleanSession,
"keepAliveSeconds": keepAliveSeconds,
};
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,6 @@
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
</manifest>
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.gojek.courier.courier_dart_sdk_demo">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>

<application
android:label="courier_dart_sdk_demo"
android:name="${applicationName}"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,6 @@
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
</manifest>
2 changes: 1 addition & 1 deletion courier_dart_sdk_demo/android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ buildscript {
}

dependencies {
classpath 'com.android.tools.build:gradle:4.1.0'
classpath 'com.android.tools.build:gradle:7.2.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
5 changes: 3 additions & 2 deletions courier_dart_sdk_demo/ios/Podfile
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,9 @@ require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelpe
target 'Runner' do
use_frameworks!
use_modular_headers!
pod 'CourierCore', '0.0.14', :modular_headers => true
pod 'CourierMQTT', '0.0.14', :modular_headers => true
pod 'CourierCore', '0.0.17', :modular_headers => true
pod 'CourierMQTT', '0.0.17', :modular_headers => true
pod 'CourierMQTTChuck', '0.0.17', :modular_headers => true
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end

Expand Down
Loading

0 comments on commit 95d88c0

Please sign in to comment.