Skip to content

Commit d620d13

Browse files
refactored simple sample
1 parent e1abc0b commit d620d13

14 files changed

+234
-307
lines changed

simple_sample/android/app/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ android {
3333

3434
defaultConfig {
3535
applicationId "com.quickblox.quickblox_sdk_example"
36-
minSdkVersion 21
36+
minSdkVersion 26
3737
targetSdkVersion 34
3838
versionCode flutterVersionCode.toInteger()
3939
versionName flutterVersionName

simple_sample/lib/main.dart

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,49 +10,49 @@ import 'package:quickblox_sdk_example/screens/settings_screen.dart';
1010
import 'package:quickblox_sdk_example/screens/subscriptions_screen.dart';
1111
import 'package:quickblox_sdk_example/screens/users_screen.dart';
1212
import 'package:quickblox_sdk_example/screens/webrtc_screen.dart';
13+
import 'package:quickblox_sdk_example/widgets/blue_app_bar.dart';
14+
import 'package:quickblox_sdk_example/widgets/blue_button.dart';
1315

1416
void main() => runApp(App());
1517

1618
class App extends StatelessWidget {
1719
@override
1820
Widget build(BuildContext context) {
19-
return MaterialApp(home: MainScreen());
21+
return MaterialApp(
22+
home: MainScreen(),
23+
theme: ThemeData(
24+
useMaterial3: true,
25+
colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue, primary: Colors.blue),
26+
appBarTheme: AppBarTheme(
27+
elevation: 4.0,
28+
color: Colors.blue,
29+
shadowColor: Theme.of(context).colorScheme.shadow,
30+
),
31+
),
32+
);
2033
}
2134
}
2235

2336
class MainScreen extends StatelessWidget {
2437
@override
2538
Widget build(BuildContext context) {
2639
return Scaffold(
27-
appBar: _buildAppBar(),
40+
appBar: BlueAppBar('Flutter Quickblox SDK'),
2841
body: Center(
2942
child: Column(children: [
30-
_buildButton(context, 'Auth', AuthScreen()),
31-
_buildButton(context, 'Chat', ChatScreen()),
32-
_buildButton(context, 'Custom objects', CustomObjectsScreen()),
33-
_buildButton(context, 'File', ContentScreen()),
34-
_buildButton(context, 'Events', EventsScreen()),
35-
_buildButton(context, 'Subscriptions', SubscriptionsScreen()),
36-
_buildButton(context, 'Settings', SettingsScreen()),
37-
_buildButton(context, 'Users', UsersScreen()),
38-
_buildButton(context, 'WebRTC', WebRTCScreen()),
39-
_buildButton(context, 'Conference', ConferenceScreen()),
43+
BlueButton('Auth', () => AuthScreen.show(context)),
44+
BlueButton('Chat', () => ChatScreen.show(context)),
45+
BlueButton('Custom objects', () => CustomObjectsScreen.show(context)),
46+
BlueButton('File', () => ContentScreen.show(context)),
47+
BlueButton('Events', () => EventsScreen.show(context)),
48+
BlueButton('Subscriptions', () => SubscriptionsScreen.show(context)),
49+
BlueButton('Settings', () => SettingsScreen.show(context)),
50+
BlueButton('Users', () => UsersScreen.show(context)),
51+
BlueButton('WebRTC', () => WebRTCScreen.show(context)),
52+
BlueButton('Conference', () => ConferenceScreen.show(context)),
4053
Padding(
4154
padding: EdgeInsets.fromLTRB(0, 30, 0, 0),
4255
child: Text("USER LOGIN: $USER_LOGIN \n USER ID: $LOGGED_USER_ID", style: TextStyle(fontSize: 14)))
4356
])));
4457
}
45-
46-
PreferredSizeWidget _buildAppBar() {
47-
return AppBar(title: const Text('Flutter Quickblox SDK'), centerTitle: true);
48-
}
49-
50-
Widget _buildButton(BuildContext context, String title, Widget screen) {
51-
return MaterialButton(
52-
minWidth: 200,
53-
child: Text(title),
54-
color: Theme.of(context).primaryColor,
55-
textColor: Colors.white,
56-
onPressed: () => Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => screen)));
57-
}
5858
}

simple_sample/lib/screens/auth_screen.dart

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,14 @@ import 'package:quickblox_sdk_example/credentials.dart';
1111
import 'package:quickblox_sdk_example/data_holder.dart';
1212
import 'package:quickblox_sdk_example/utils/dialog_utils.dart';
1313
import 'package:quickblox_sdk_example/utils/snackbar_utils.dart';
14+
import 'package:quickblox_sdk_example/widgets/blue_app_bar.dart';
15+
import 'package:quickblox_sdk_example/widgets/blue_button.dart';
1416

1517
class AuthScreen extends StatefulWidget {
18+
static show(BuildContext context) {
19+
Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => AuthScreen()));
20+
}
21+
1622
@override
1723
State<StatefulWidget> createState() => _AuthScreenState();
1824
}
@@ -31,34 +37,18 @@ class _AuthScreenState extends State<AuthScreen> {
3137
Widget build(BuildContext context) {
3238
return Scaffold(
3339
key: _scaffoldKey,
34-
appBar: _buildAppBar(),
40+
appBar: BlueAppBar('Auth'),
3541
body: Center(
3642
child: Column(children: [
37-
_buildButton('login', () => login()),
38-
_buildButton('logout', () => logout()),
39-
_buildButton('set session', () => setSession()),
40-
_buildButton('get session', () => getSession()),
41-
_buildButton('subscribe session expired', () => _subscribeSessionExpired()),
42-
_buildButton('unsubscribe session expired', () => _unsubscribeSessionExpired())
43+
BlueButton('login', () => login()),
44+
BlueButton('logout', () => logout()),
45+
BlueButton('set session', () => setSession()),
46+
BlueButton('get session', () => getSession()),
47+
BlueButton('subscribe session expired', () => _subscribeSessionExpired()),
48+
BlueButton('unsubscribe session expired', () => _unsubscribeSessionExpired())
4349
])));
4450
}
4551

46-
PreferredSizeWidget _buildAppBar() {
47-
return AppBar(
48-
title: const Text('Auth'),
49-
centerTitle: true,
50-
leading: IconButton(icon: Icon(Icons.arrow_back), onPressed: () => Navigator.of(context).pop()));
51-
}
52-
53-
Widget _buildButton(String title, Function? callback) {
54-
return MaterialButton(
55-
minWidth: 200,
56-
child: Text(title),
57-
color: Theme.of(context).primaryColor,
58-
textColor: Colors.white,
59-
onPressed: () => callback?.call());
60-
}
61-
6252
Future<void> login() async {
6353
try {
6454
QBLoginResult result = await QB.auth.login(USER_LOGIN, USER_PASSWORD);

simple_sample/lib/screens/chat_screen.dart

Lines changed: 41 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,14 @@ import 'package:quickblox_sdk/quickblox_sdk.dart';
1313
import 'package:quickblox_sdk_example/credentials.dart';
1414
import 'package:quickblox_sdk_example/utils/dialog_utils.dart';
1515
import 'package:quickblox_sdk_example/utils/snackbar_utils.dart';
16+
import 'package:quickblox_sdk_example/widgets/blue_app_bar.dart';
17+
import 'package:quickblox_sdk_example/widgets/blue_button.dart';
1618

1719
class ChatScreen extends StatefulWidget {
20+
static show(BuildContext context) {
21+
Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => ChatScreen()));
22+
}
23+
1824
@override
1925
State<StatefulWidget> createState() => _ChatScreenState();
2026
}
@@ -36,6 +42,12 @@ class _ChatScreenState extends State<ChatScreen> with WidgetsBindingObserver {
3642
StreamSubscription? _reconnectionFailedSubscription;
3743
StreamSubscription? _reconnectionSuccessSubscription;
3844

45+
@override
46+
void initState() {
47+
super.initState();
48+
QB.settings.enableXMPPLogging();
49+
}
50+
3951
@override
4052
void dispose() {
4153
super.dispose();
@@ -56,61 +68,61 @@ class _ChatScreenState extends State<ChatScreen> with WidgetsBindingObserver {
5668
Widget build(BuildContext context) {
5769
return Scaffold(
5870
key: _scaffoldKey,
59-
appBar: _buildAppBar(),
71+
appBar: BlueAppBar('Chat'),
6072
body: Center(
6173
child: SingleChildScrollView(
6274
child: Column(children: [
63-
_buildButton('connect', () => connect()),
64-
_buildButton('disconnect', () => disconnect()),
65-
_buildButton('is connected', () => isConnected()),
66-
_buildButton('ping server', () => pingServer()),
67-
_buildButton('ping user', () => pingUser()),
68-
_buildButton('get dialogs', () => getDialogs()),
69-
_buildButton('get dialogs count', () => getDialogsCount()),
70-
_buildButton('update dialog', () => updateDialog()),
71-
_buildButton('create dialog', () => createDialog()),
72-
_buildButton('delete dialog', () => deleteDialog()),
73-
_buildButton('leave dialog', () => leaveDialog()),
74-
_buildButton('join dialog', () => joinDialog()),
75-
_buildButton('get online users', () => getOnlineUsers()),
76-
_buildButton('send message', () => sendMessage()),
77-
_buildButton('send system message', () => sendSystemMessage()),
78-
_buildButton('subscribe message events', () {
75+
BlueButton('connect', () => connect()),
76+
BlueButton('disconnect', () => disconnect()),
77+
BlueButton('is connected', () => isConnected()),
78+
BlueButton('ping server', () => pingServer()),
79+
BlueButton('ping user', () => pingUser()),
80+
BlueButton('get dialogs', () => getDialogs()),
81+
BlueButton('get dialogs count', () => getDialogsCount()),
82+
BlueButton('update dialog', () => updateDialog()),
83+
BlueButton('create dialog', () => createDialog()),
84+
BlueButton('delete dialog', () => deleteDialog()),
85+
BlueButton('leave dialog', () => leaveDialog()),
86+
BlueButton('join dialog', () => joinDialog()),
87+
BlueButton('get online users', () => getOnlineUsers()),
88+
BlueButton('send message', () => sendMessage()),
89+
BlueButton('send system message', () => sendSystemMessage()),
90+
BlueButton('subscribe message events', () {
7991
subscribeNewMessage();
8092
subscribeSystemMessage();
8193
}),
82-
_buildButton('unsubscribe message events', () {
94+
BlueButton('unsubscribe message events', () {
8395
unsubscribeNewMessage();
8496
unsubscribeSystemMessage();
8597
}),
86-
_buildButton('mark message read', () => markMessageRead()),
87-
_buildButton('mark message delivered', () => markMessageDelivered()),
88-
_buildButton('subscribe message status', () {
98+
BlueButton('mark message read', () => markMessageRead()),
99+
BlueButton('mark message delivered', () => markMessageDelivered()),
100+
BlueButton('subscribe message status', () {
89101
subscribeMessageDelivered();
90102
subscribeMessageRead();
91103
}),
92-
_buildButton('unsubscribe message status', () {
104+
BlueButton('unsubscribe message status', () {
93105
unsubscribeDeliveredMessage();
94106
unsubscribeReadMessage();
95107
}),
96-
_buildButton('send is typing', () => sendIsTyping()),
97-
_buildButton('send stopped typing', () => sendStoppedTyping()),
98-
_buildButton('subscribe typing', () {
108+
BlueButton('send is typing', () => sendIsTyping()),
109+
BlueButton('send stopped typing', () => sendStoppedTyping()),
110+
BlueButton('subscribe typing', () {
99111
subscribeUserTyping();
100112
subscribeUserStopTyping();
101113
}),
102-
_buildButton('unsubscribe typing', () {
114+
BlueButton('unsubscribe typing', () {
103115
unsubscribeUserTyping();
104116
unsubscribeUserStopTyping();
105117
}),
106-
_buildButton('get dialog messages', () => getDialogMessages()),
107-
_buildButton('subscribe event connections', () {
118+
BlueButton('get dialog messages', () => getDialogMessages()),
119+
BlueButton('subscribe event connections', () {
108120
subscribeConnected();
109121
subscribeConnectionClosed();
110122
subscribeReconnectionFailed();
111123
subscribeReconnectionSuccess();
112124
}),
113-
_buildButton('unsubscribe event connections', () {
125+
BlueButton('unsubscribe event connections', () {
114126
unsubscribeConnected();
115127
unsubscribeConnectionClosed();
116128
unsubscribeReconnectionFailed();
@@ -119,22 +131,6 @@ class _ChatScreenState extends State<ChatScreen> with WidgetsBindingObserver {
119131
]))));
120132
}
121133

122-
PreferredSizeWidget _buildAppBar() {
123-
return AppBar(
124-
title: const Text('Chat'),
125-
centerTitle: true,
126-
leading: IconButton(icon: Icon(Icons.arrow_back), onPressed: () => Navigator.of(context).pop()));
127-
}
128-
129-
Widget _buildButton(String title, Function? callback) {
130-
return MaterialButton(
131-
minWidth: 200,
132-
child: Text(title),
133-
color: Theme.of(context).primaryColor,
134-
textColor: Colors.white,
135-
onPressed: () => callback?.call());
136-
}
137-
138134
void connect() async {
139135
try {
140136
await QB.chat.connect(LOGGED_USER_ID, USER_PASSWORD);

simple_sample/lib/screens/conference_screen.dart

Lines changed: 23 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,14 @@ import 'package:quickblox_sdk/quickblox_sdk.dart';
1010
import 'package:quickblox_sdk_example/credentials.dart';
1111
import 'package:quickblox_sdk_example/utils/dialog_utils.dart';
1212
import 'package:quickblox_sdk_example/utils/snackbar_utils.dart';
13+
import 'package:quickblox_sdk_example/widgets/blue_app_bar.dart';
14+
import 'package:quickblox_sdk_example/widgets/blue_button.dart';
1315

1416
class ConferenceScreen extends StatefulWidget {
17+
static show(BuildContext context) {
18+
Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => ConferenceScreen()));
19+
}
20+
1521
@override
1622
State<StatefulWidget> createState() => _ConferenceScreenState();
1723
}
@@ -47,34 +53,33 @@ class _ConferenceScreenState extends State<ConferenceScreen> {
4753
Widget build(BuildContext context) {
4854
return Scaffold(
4955
key: _scaffoldKey,
50-
appBar: _buildAppBar(),
56+
appBar: BlueAppBar('Conference'),
5157
body: Center(
5258
child: SingleChildScrollView(
5359
child: Column(children: [
54-
_buildButton('init', () => init()),
55-
_buildButton('release', () => release()),
56-
_buildButton('release Video Views', () => releaseVideoViews()),
57-
_buildButton('create session', () => create(QBConferenceSessionTypes.VIDEO)),
58-
_buildButton('join as publisher', () => joinAsPublisher(QBConferenceSessionTypes.VIDEO)),
59-
_buildButton('get online participants', () => getOnlineParticipants()),
60-
_buildButton('leave session', () => leaveSession()),
61-
_buildButton('disable video', () => enableVideo(false)),
62-
_buildButton('enable video', () => enableVideo(true)),
63-
_buildButton('disable audio', () => enableAudio(false)),
64-
_buildButton('enable audio', () => enableAudio(true)),
65-
_buildButton('switch camera', () => switchCamera()),
66-
_buildButton(
67-
'switch audio to LOUDSPEAKER', () => switchAudioOutput(QBConferenceAudioOutputTypes.LOUDSPEAKER)),
68-
_buildButton('switch audio to EARSPEAKER', () => switchAudioOutput(QBConferenceAudioOutputTypes.EARSPEAKER)),
69-
_buildButton('subscribe Conference events', () {
60+
BlueButton('init', () => init()),
61+
BlueButton('release', () => release()),
62+
BlueButton('release Video Views', () => releaseVideoViews()),
63+
BlueButton('create session', () => create(QBConferenceSessionTypes.VIDEO)),
64+
BlueButton('join as publisher', () => joinAsPublisher(QBConferenceSessionTypes.VIDEO)),
65+
BlueButton('get online participants', () => getOnlineParticipants()),
66+
BlueButton('leave session', () => leaveSession()),
67+
BlueButton('disable video', () => enableVideo(false)),
68+
BlueButton('enable video', () => enableVideo(true)),
69+
BlueButton('disable audio', () => enableAudio(false)),
70+
BlueButton('enable audio', () => enableAudio(true)),
71+
BlueButton('switch camera', () => switchCamera()),
72+
BlueButton('switch audio to LOUDSPEAKER', () => switchAudioOutput(QBConferenceAudioOutputTypes.LOUDSPEAKER)),
73+
BlueButton('switch audio to EARSPEAKER', () => switchAudioOutput(QBConferenceAudioOutputTypes.EARSPEAKER)),
74+
BlueButton('subscribe Conference events', () {
7075
subscribeVideoTrack();
7176
subscribeParticipantReceived();
7277
subscribeParticipantLeft();
7378
subscribeErrors();
7479
subscribeConferenceClosed();
7580
subscribeConferenceStateChanged();
7681
}),
77-
_buildButton('unsubscribe Conference events', () {
82+
BlueButton('unsubscribe Conference events', () {
7883
unsubscribeVideoTrack();
7984
unsubscribeParticipantReceived();
8085
unsubscribeParticipantLeft();
@@ -102,22 +107,6 @@ class _ConferenceScreenState extends State<ConferenceScreen> {
102107
]))));
103108
}
104109

105-
PreferredSizeWidget _buildAppBar() {
106-
return AppBar(
107-
title: const Text('Conference'),
108-
centerTitle: true,
109-
leading: IconButton(icon: Icon(Icons.arrow_back), onPressed: () => Navigator.of(context).pop()));
110-
}
111-
112-
Widget _buildButton(String title, Function? callback) {
113-
return MaterialButton(
114-
minWidth: 200,
115-
child: Text(title),
116-
color: Theme.of(context).primaryColor,
117-
textColor: Colors.white,
118-
onPressed: () => callback?.call());
119-
}
120-
121110
Widget _buildVideoView(Alignment alignment, Function(ConferenceVideoViewController) callback) {
122111
return Align(
123112
alignment: alignment,

0 commit comments

Comments
 (0)