mirror of
				https://gitlab.com/comunic/comunicmobile
				synced 2025-11-04 04:04:18 +00:00 
			
		
		
		
	Start update
This commit is contained in:
		@@ -33,7 +33,7 @@ if (keystorePropertiesFile.exists()) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
android {
 | 
			
		||||
    compileSdkVersion 29
 | 
			
		||||
    compileSdkVersion 30
 | 
			
		||||
 | 
			
		||||
    compileOptions {
 | 
			
		||||
 | 
			
		||||
@@ -50,8 +50,8 @@ android {
 | 
			
		||||
    defaultConfig {
 | 
			
		||||
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
 | 
			
		||||
        applicationId "org.communiquons.comunic"
 | 
			
		||||
        minSdkVersion 18
 | 
			
		||||
        targetSdkVersion 29
 | 
			
		||||
        minSdkVersion 21
 | 
			
		||||
        targetSdkVersion 30
 | 
			
		||||
        versionCode flutterVersionCode.toInteger()
 | 
			
		||||
        versionName flutterVersionName
 | 
			
		||||
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
 | 
			
		||||
 
 | 
			
		||||
@@ -62,6 +62,17 @@ class APIHelper {
 | 
			
		||||
                contentType: v.type,
 | 
			
		||||
              )));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Process picked files
 | 
			
		||||
        for (final key in request.pickedFiles.keys) {
 | 
			
		||||
          var v = request.pickedFiles[key];
 | 
			
		||||
          data.files.add(MapEntry(
 | 
			
		||||
              key,
 | 
			
		||||
              MultipartFile.fromBytes(
 | 
			
		||||
                await v.readAsBytes(),
 | 
			
		||||
                filename: v.path.split("/").last,
 | 
			
		||||
              )));
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // Execute the request
 | 
			
		||||
 
 | 
			
		||||
@@ -4,8 +4,7 @@ import 'package:comunic/helpers/websocket_helper.dart';
 | 
			
		||||
import 'package:comunic/lists/call_members_list.dart';
 | 
			
		||||
import 'package:comunic/models/call_config.dart';
 | 
			
		||||
import 'package:comunic/models/call_member.dart';
 | 
			
		||||
import 'package:flutter_webrtc/rtc_ice_candidate.dart';
 | 
			
		||||
import 'package:flutter_webrtc/rtc_session_description.dart';
 | 
			
		||||
import 'package:flutter_webrtc/flutter_webrtc.dart';
 | 
			
		||||
 | 
			
		||||
/// Calls helper
 | 
			
		||||
///
 | 
			
		||||
 
 | 
			
		||||
@@ -17,7 +17,7 @@ class CommentsHelper {
 | 
			
		||||
      "content": comment.hasContent ? comment.content : "",
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    if (comment.hasImage) request.addFile("image", comment.image);
 | 
			
		||||
    if (comment.hasImage) request.addPickedFile("image", comment.image);
 | 
			
		||||
 | 
			
		||||
    final response = await request.execWithFiles();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -335,8 +335,8 @@ class ConversationsHelper {
 | 
			
		||||
      },
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    //Check for image
 | 
			
		||||
    if (message.hasImage) request.addFile("image", message.image);
 | 
			
		||||
    // Check for image
 | 
			
		||||
    if (message.hasImage) request.addPickedFile("image", message.image);
 | 
			
		||||
 | 
			
		||||
    //Send the message
 | 
			
		||||
    APIResponse response;
 | 
			
		||||
 
 | 
			
		||||
@@ -3,8 +3,7 @@ import 'dart:async';
 | 
			
		||||
import 'package:comunic/models/comment.dart';
 | 
			
		||||
import 'package:comunic/models/conversation_message.dart';
 | 
			
		||||
import 'package:event_bus/event_bus.dart';
 | 
			
		||||
import 'package:flutter_webrtc/rtc_ice_candidate.dart';
 | 
			
		||||
import 'package:flutter_webrtc/rtc_session_description.dart';
 | 
			
		||||
import 'package:flutter_webrtc/flutter_webrtc.dart';
 | 
			
		||||
 | 
			
		||||
/// Events helper
 | 
			
		||||
///
 | 
			
		||||
 
 | 
			
		||||
@@ -143,7 +143,7 @@ class PostsHelper {
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
      case PostKind.IMAGE:
 | 
			
		||||
        request.addFile("image", post.image);
 | 
			
		||||
        request.addPickedFile("image", post.image);
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
      case PostKind.WEB_LINK:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,10 @@
 | 
			
		||||
import 'dart:io';
 | 
			
		||||
 | 
			
		||||
import 'package:comunic/enums/user_page_visibility.dart';
 | 
			
		||||
import 'package:comunic/models/account_image_settings.dart';
 | 
			
		||||
import 'package:comunic/models/api_request.dart';
 | 
			
		||||
import 'package:comunic/models/general_settings.dart';
 | 
			
		||||
import 'package:comunic/models/new_emoji.dart';
 | 
			
		||||
import 'package:comunic/models/security_settings.dart';
 | 
			
		||||
import 'package:image_picker/image_picker.dart';
 | 
			
		||||
 | 
			
		||||
/// Settings helper
 | 
			
		||||
///
 | 
			
		||||
@@ -92,9 +91,9 @@ class SettingsHelper {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /// Upload a new account image
 | 
			
		||||
  static Future<bool> uploadAccountImage(File newImage) async =>
 | 
			
		||||
  static Future<bool> uploadAccountImage(PickedFile newImage) async =>
 | 
			
		||||
      (await APIRequest(uri: "settings/upload_account_image", needLogin: true)
 | 
			
		||||
              .addFile("picture", newImage)
 | 
			
		||||
              .addPickedFile("picture", newImage)
 | 
			
		||||
              .execWithFiles())
 | 
			
		||||
          .isOK;
 | 
			
		||||
 | 
			
		||||
@@ -132,7 +131,7 @@ class SettingsHelper {
 | 
			
		||||
                  uri: "settings/upload_custom_emoji",
 | 
			
		||||
                  needLogin: true,
 | 
			
		||||
                  args: {"shortcut": newEmoji.shortcut})
 | 
			
		||||
              .addFile("image", newEmoji.image)
 | 
			
		||||
              .addPickedFile("image", newEmoji.image)
 | 
			
		||||
              .execWithFiles())
 | 
			
		||||
          .assertOk();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -7,8 +7,7 @@ import 'package:comunic/helpers/events_helper.dart';
 | 
			
		||||
import 'package:comunic/models/api_request.dart';
 | 
			
		||||
import 'package:comunic/models/config.dart';
 | 
			
		||||
import 'package:comunic/models/ws_message.dart';
 | 
			
		||||
import 'package:flutter_webrtc/rtc_ice_candidate.dart';
 | 
			
		||||
import 'package:flutter_webrtc/rtc_session_description.dart';
 | 
			
		||||
import 'package:flutter_webrtc/flutter_webrtc.dart';
 | 
			
		||||
import 'package:web_socket_channel/web_socket_channel.dart';
 | 
			
		||||
 | 
			
		||||
/// User web socket helper
 | 
			
		||||
 
 | 
			
		||||
@@ -3,6 +3,7 @@ import 'dart:io';
 | 
			
		||||
import 'package:comunic/helpers/api_helper.dart';
 | 
			
		||||
import 'package:comunic/models/api_response.dart';
 | 
			
		||||
import 'package:http_parser/http_parser.dart';
 | 
			
		||||
import 'package:image_picker/image_picker.dart';
 | 
			
		||||
import 'package:meta/meta.dart';
 | 
			
		||||
 | 
			
		||||
/// API Request model
 | 
			
		||||
@@ -28,6 +29,7 @@ class APIRequest {
 | 
			
		||||
  final bool needLogin;
 | 
			
		||||
  Map<String, String> args;
 | 
			
		||||
  Map<String, File> files = Map();
 | 
			
		||||
  Map<String, PickedFile> pickedFiles = Map();
 | 
			
		||||
  Map<String, BytesFile> bytesFiles = Map();
 | 
			
		||||
 | 
			
		||||
  APIRequest({@required this.uri, this.needLogin = false, this.args})
 | 
			
		||||
@@ -68,6 +70,11 @@ class APIRequest {
 | 
			
		||||
    return this;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  APIRequest addPickedFile(String name, PickedFile file) {
 | 
			
		||||
    pickedFiles[name] = file;
 | 
			
		||||
    return this;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  APIRequest addBytesFile(String name, BytesFile file) {
 | 
			
		||||
    this.bytesFiles[name] = file;
 | 
			
		||||
    return this;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
import 'package:flutter_webrtc/media_stream.dart';
 | 
			
		||||
import 'package:flutter_webrtc/flutter_webrtc.dart';
 | 
			
		||||
 | 
			
		||||
/// Single call member information
 | 
			
		||||
///
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,4 @@
 | 
			
		||||
import 'dart:io';
 | 
			
		||||
 | 
			
		||||
import 'package:image_picker/image_picker.dart';
 | 
			
		||||
import 'package:meta/meta.dart';
 | 
			
		||||
 | 
			
		||||
/// New comment information
 | 
			
		||||
@@ -9,7 +8,7 @@ import 'package:meta/meta.dart';
 | 
			
		||||
class NewComment {
 | 
			
		||||
  final int postID;
 | 
			
		||||
  final String content;
 | 
			
		||||
  final File image;
 | 
			
		||||
  final PickedFile image;
 | 
			
		||||
 | 
			
		||||
  const NewComment({
 | 
			
		||||
    @required this.postID,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,4 @@
 | 
			
		||||
import 'dart:io';
 | 
			
		||||
 | 
			
		||||
import 'package:image_picker/image_picker.dart';
 | 
			
		||||
import 'package:meta/meta.dart';
 | 
			
		||||
 | 
			
		||||
/// New conversation message model
 | 
			
		||||
@@ -11,15 +10,14 @@ import 'package:meta/meta.dart';
 | 
			
		||||
class NewConversationMessage {
 | 
			
		||||
  final int conversationID;
 | 
			
		||||
  final String message;
 | 
			
		||||
  final File image;
 | 
			
		||||
  final PickedFile image;
 | 
			
		||||
 | 
			
		||||
  NewConversationMessage({
 | 
			
		||||
    @required this.conversationID,
 | 
			
		||||
    @required this.message,
 | 
			
		||||
    this.image
 | 
			
		||||
  })  : assert(conversationID != null),
 | 
			
		||||
  NewConversationMessage(
 | 
			
		||||
      {@required this.conversationID, @required this.message, this.image})
 | 
			
		||||
      : assert(conversationID != null),
 | 
			
		||||
        assert(image != null || message != null);
 | 
			
		||||
 | 
			
		||||
  bool get hasMessage => message != null;
 | 
			
		||||
 | 
			
		||||
  bool get hasImage => image != null;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,5 @@
 | 
			
		||||
import 'dart:io';
 | 
			
		||||
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
import 'package:image_picker/image_picker.dart';
 | 
			
		||||
 | 
			
		||||
/// New emoji information
 | 
			
		||||
///
 | 
			
		||||
@@ -8,7 +7,7 @@ import 'package:flutter/material.dart';
 | 
			
		||||
 | 
			
		||||
class NewEmoji {
 | 
			
		||||
  final String shortcut;
 | 
			
		||||
  final File image;
 | 
			
		||||
  final PickedFile image;
 | 
			
		||||
 | 
			
		||||
  const NewEmoji({
 | 
			
		||||
    @required this.shortcut,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,7 @@
 | 
			
		||||
import 'dart:io';
 | 
			
		||||
 | 
			
		||||
import 'package:comunic/enums/post_kind.dart';
 | 
			
		||||
import 'package:comunic/enums/post_target.dart';
 | 
			
		||||
import 'package:comunic/enums/post_visibility_level.dart';
 | 
			
		||||
import 'package:image_picker/image_picker.dart';
 | 
			
		||||
import 'package:meta/meta.dart';
 | 
			
		||||
 | 
			
		||||
/// New post information
 | 
			
		||||
@@ -28,7 +27,7 @@ class NewPost {
 | 
			
		||||
  final int targetID;
 | 
			
		||||
  final PostVisibilityLevel visibility;
 | 
			
		||||
  final String content;
 | 
			
		||||
  final File image;
 | 
			
		||||
  final PickedFile image;
 | 
			
		||||
  final String url;
 | 
			
		||||
  final List<int> pdf;
 | 
			
		||||
  final PostKind kind;
 | 
			
		||||
 
 | 
			
		||||
@@ -6,4 +6,4 @@ import 'package:wakelock/wakelock.dart';
 | 
			
		||||
 | 
			
		||||
/// Interface for requesting device wake locking
 | 
			
		||||
Future<void> setWakeLock(bool enabled) async =>
 | 
			
		||||
    await Wakelock.toggle(on: enabled);
 | 
			
		||||
    await Wakelock.toggle(enable: enabled);
 | 
			
		||||
 
 | 
			
		||||
@@ -57,7 +57,7 @@ class _TabletRouteState extends MainController {
 | 
			
		||||
 | 
			
		||||
  Widget _buildLeftPane() => Theme(
 | 
			
		||||
        data: Theme.of(context).copyWith(
 | 
			
		||||
          textTheme: TextTheme(body1: TextStyle(color: Colors.white)),
 | 
			
		||||
          textTheme: TextTheme(bodyText2: TextStyle(color: Colors.white)),
 | 
			
		||||
          iconTheme: IconThemeData(color: Colors.white),
 | 
			
		||||
        ),
 | 
			
		||||
        child: Container(
 | 
			
		||||
 
 | 
			
		||||
@@ -74,13 +74,13 @@ class _AccountImageSettingsScreenState
 | 
			
		||||
      // Upload new account image
 | 
			
		||||
      SettingsTile(
 | 
			
		||||
        title: tr("Upload an account image"),
 | 
			
		||||
        onTap: () => _uploadAccountImage(),
 | 
			
		||||
        onPressed: (_) => _uploadAccountImage(),
 | 
			
		||||
      ),
 | 
			
		||||
 | 
			
		||||
      // Generate a random account image
 | 
			
		||||
      SettingsTile(
 | 
			
		||||
        title: tr("Generate a random account image"),
 | 
			
		||||
        onTap: () => _generateRandomAccountImage(),
 | 
			
		||||
        onPressed: (_) => _generateRandomAccountImage(),
 | 
			
		||||
      ),
 | 
			
		||||
    ];
 | 
			
		||||
  }
 | 
			
		||||
@@ -100,19 +100,19 @@ class _AccountImageSettingsScreenState
 | 
			
		||||
      // Upload new account image
 | 
			
		||||
      SettingsTile(
 | 
			
		||||
        title: tr("Upload new account image"),
 | 
			
		||||
        onTap: () => _uploadAccountImage(),
 | 
			
		||||
        onPressed: (_) => _uploadAccountImage(),
 | 
			
		||||
      ),
 | 
			
		||||
 | 
			
		||||
      // Generate a random account image
 | 
			
		||||
      SettingsTile(
 | 
			
		||||
        title: tr("Generate a random account image"),
 | 
			
		||||
        onTap: () => _generateRandomAccountImage(),
 | 
			
		||||
        onPressed: (_) => _generateRandomAccountImage(),
 | 
			
		||||
      ),
 | 
			
		||||
 | 
			
		||||
      // Change account image visibility
 | 
			
		||||
      SettingsTile(
 | 
			
		||||
          title: tr("Change account image visibility"),
 | 
			
		||||
          onTap: () => _chooseAccountImageVisibility(),
 | 
			
		||||
          onPressed: (_) => _chooseAccountImageVisibility(),
 | 
			
		||||
          subtitle: tr("Current level: %level%", args: {
 | 
			
		||||
            "level":
 | 
			
		||||
                _settings.visibility == AccountImageVisibilityLevels.EVERYONE
 | 
			
		||||
@@ -126,7 +126,7 @@ class _AccountImageSettingsScreenState
 | 
			
		||||
      // Delete account image
 | 
			
		||||
      SettingsTile(
 | 
			
		||||
        title: tr("Delete account image"),
 | 
			
		||||
        onTap: () => _deleteAccountImage(),
 | 
			
		||||
        onPressed: (_) => _deleteAccountImage(),
 | 
			
		||||
      ),
 | 
			
		||||
    ];
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@ class _AccountPrivacySettingsState extends State<AccountPrivacySettings> {
 | 
			
		||||
          title: tr("Delete your account"),
 | 
			
		||||
          subtitle:
 | 
			
		||||
              tr("Permanently delete your account and all data related to it."),
 | 
			
		||||
          onTap: _deleteAccount,
 | 
			
		||||
          onPressed: (_)=>_deleteAccount,
 | 
			
		||||
        )
 | 
			
		||||
      ])
 | 
			
		||||
    ]);
 | 
			
		||||
 
 | 
			
		||||
@@ -30,19 +30,19 @@ class _AccountSecuritySettingsScreenState
 | 
			
		||||
          tiles: [
 | 
			
		||||
            SettingsTile(
 | 
			
		||||
              title: tr("Change password"),
 | 
			
		||||
              onTap: _changePassword,
 | 
			
		||||
              onPressed: (_) => _changePassword,
 | 
			
		||||
            ),
 | 
			
		||||
            SettingsTile(
 | 
			
		||||
              title: tr("Change your security questions"),
 | 
			
		||||
              subtitle: tr(
 | 
			
		||||
                  "Your security questions can be used to recover an access to your account when you loose your password..."),
 | 
			
		||||
              onTap: _changeSecurityQuestions,
 | 
			
		||||
              onPressed: (_) => _changeSecurityQuestions,
 | 
			
		||||
            ),
 | 
			
		||||
            SettingsTile(
 | 
			
		||||
              title: tr("Disconnect all your devices"),
 | 
			
		||||
              subtitle: tr(
 | 
			
		||||
                  "Disconnect all your devices from Comunic, including the current one. Use this option if one of the device you use for Comunic was stolen."),
 | 
			
		||||
              onTap: _disconnectAllDevices,
 | 
			
		||||
              onPressed: (_) => _disconnectAllDevices,
 | 
			
		||||
            ),
 | 
			
		||||
          ],
 | 
			
		||||
        )
 | 
			
		||||
 
 | 
			
		||||
@@ -152,7 +152,7 @@ class __AccountSettingsBodyState extends State<_AccountSettingsBody> {
 | 
			
		||||
                      title: f.title,
 | 
			
		||||
                      leading: Icon(f.icon),
 | 
			
		||||
                      subtitle: f.subtitle,
 | 
			
		||||
                      onTap: () => _openSectionsAsNewRoute(f),
 | 
			
		||||
                      onPressed: (_) => _openSectionsAsNewRoute(f),
 | 
			
		||||
                    ))
 | 
			
		||||
                .toList(),
 | 
			
		||||
          )
 | 
			
		||||
 
 | 
			
		||||
@@ -58,7 +58,7 @@ class _ApplicationSettingsState extends State<ApplicationSettings> {
 | 
			
		||||
          SettingsTile(
 | 
			
		||||
            title: tr("About this application"),
 | 
			
		||||
            subtitle: tr("Learn more about us"),
 | 
			
		||||
            onTap: () => showAboutAppDialog(context),
 | 
			
		||||
            onPressed: (_) => showAboutAppDialog(context),
 | 
			
		||||
          )
 | 
			
		||||
        ],
 | 
			
		||||
      );
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,3 @@
 | 
			
		||||
import 'dart:io';
 | 
			
		||||
 | 
			
		||||
import 'package:comunic/helpers/settings_helper.dart';
 | 
			
		||||
import 'package:comunic/helpers/users_helper.dart';
 | 
			
		||||
import 'package:comunic/lists/custom_emojies_list.dart';
 | 
			
		||||
@@ -14,6 +12,7 @@ import 'package:comunic/utils/input_utils.dart';
 | 
			
		||||
import 'package:comunic/utils/intl_utils.dart';
 | 
			
		||||
import 'package:comunic/utils/ui_utils.dart';
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
import 'package:image_picker/image_picker.dart';
 | 
			
		||||
 | 
			
		||||
/// Emojies account settings
 | 
			
		||||
///
 | 
			
		||||
@@ -137,7 +136,7 @@ class _NewCustomEmojiDialog extends StatefulWidget {
 | 
			
		||||
 | 
			
		||||
class _NewCustomEmojiDialogState extends State<_NewCustomEmojiDialog> {
 | 
			
		||||
  final _controller = TextEditingController();
 | 
			
		||||
  File _file;
 | 
			
		||||
  PickedFile _file;
 | 
			
		||||
 | 
			
		||||
  bool get _hasImage => _file != null;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -198,7 +198,7 @@ class _GeneralAccountSettingsScreenState
 | 
			
		||||
      SettingsTile(
 | 
			
		||||
        title: tr("Virtual directory (optional)"),
 | 
			
		||||
        subtitle: _settings.virtualDirectory,
 | 
			
		||||
        onTap: () async {
 | 
			
		||||
        onPressed: (_) async {
 | 
			
		||||
          final dir = await showVirtualDirectoryDialog(
 | 
			
		||||
              context: context,
 | 
			
		||||
              initialDirectory: _settings.virtualDirectory,
 | 
			
		||||
 
 | 
			
		||||
@@ -17,8 +17,7 @@ import 'package:comunic/utils/account_utils.dart';
 | 
			
		||||
import 'package:comunic/utils/intl_utils.dart';
 | 
			
		||||
import 'package:comunic/utils/ui_utils.dart';
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
import 'package:flutter_webrtc/rtc_peerconnection.dart';
 | 
			
		||||
import 'package:flutter_webrtc/webrtc.dart';
 | 
			
		||||
import 'package:flutter_webrtc/flutter_webrtc.dart';
 | 
			
		||||
 | 
			
		||||
/// Call screen
 | 
			
		||||
///
 | 
			
		||||
@@ -216,7 +215,7 @@ class _CallScreenState extends SafeState<CallScreen> {
 | 
			
		||||
      await _stopStreaming();
 | 
			
		||||
 | 
			
		||||
      // Request user media
 | 
			
		||||
      _localStream = await navigator.getUserMedia({
 | 
			
		||||
      _localStream = await navigator.mediaDevices.getUserMedia({
 | 
			
		||||
        "audio": true,
 | 
			
		||||
        "video": !includeVideo
 | 
			
		||||
            ? false
 | 
			
		||||
@@ -451,7 +450,7 @@ class _CallScreenState extends SafeState<CallScreen> {
 | 
			
		||||
    switch (option) {
 | 
			
		||||
      // Switch camera
 | 
			
		||||
      case _PopupMenuOption.SWITCH_CAMERA:
 | 
			
		||||
        await _localStream.getVideoTracks()[0].switchCamera();
 | 
			
		||||
        await Helper.switchCamera(_localStream.getVideoTracks()[0]);
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
      // Stop streaming
 | 
			
		||||
 
 | 
			
		||||
@@ -112,7 +112,7 @@ class _GroupSettingsScreenState extends SafeState<GroupSettingsScreen> {
 | 
			
		||||
        SettingsTile(
 | 
			
		||||
          title: tr("Virtual directory (optional)"),
 | 
			
		||||
          subtitle: _groupSettings.virtualDirectory,
 | 
			
		||||
          onTap: () async {
 | 
			
		||||
          onPressed: (_) async {
 | 
			
		||||
            final newDir = await showVirtualDirectoryDialog(
 | 
			
		||||
              context: context,
 | 
			
		||||
              initialDirectory: _groupSettings.virtualDirectory,
 | 
			
		||||
@@ -257,19 +257,19 @@ class _GroupSettingsScreenState extends SafeState<GroupSettingsScreen> {
 | 
			
		||||
        // Upload a new logo
 | 
			
		||||
        SettingsTile(
 | 
			
		||||
          title: tr("Upload a new logo"),
 | 
			
		||||
          onTap: _uploadNewLogo,
 | 
			
		||||
          onPressed: (_) => _uploadNewLogo,
 | 
			
		||||
        ),
 | 
			
		||||
 | 
			
		||||
        // Generate a new random logo
 | 
			
		||||
        SettingsTile(
 | 
			
		||||
          title: tr("Generate a new random logo"),
 | 
			
		||||
          onTap: _generateRandomLogo,
 | 
			
		||||
          onPressed: (_) => _generateRandomLogo,
 | 
			
		||||
        ),
 | 
			
		||||
 | 
			
		||||
        // Delete current logo
 | 
			
		||||
        SettingsTile(
 | 
			
		||||
          title: tr("Delete logo"),
 | 
			
		||||
          onTap: _deleteLogo,
 | 
			
		||||
          onPressed: (_) => _deleteLogo,
 | 
			
		||||
        ),
 | 
			
		||||
      ],
 | 
			
		||||
    );
 | 
			
		||||
@@ -279,7 +279,7 @@ class _GroupSettingsScreenState extends SafeState<GroupSettingsScreen> {
 | 
			
		||||
  void _uploadNewLogo() async {
 | 
			
		||||
    try {
 | 
			
		||||
      final logo = await pickImage(context);
 | 
			
		||||
      final bytes = logo.readAsBytesSync();
 | 
			
		||||
      final bytes = await logo.readAsBytes();
 | 
			
		||||
      await _doUploadLogo(bytes);
 | 
			
		||||
    } catch (e, stack) {
 | 
			
		||||
      print("Could not upload new logo! $e\n$stack");
 | 
			
		||||
@@ -326,7 +326,7 @@ class _GroupSettingsScreenState extends SafeState<GroupSettingsScreen> {
 | 
			
		||||
      tiles: [
 | 
			
		||||
        SettingsTile(
 | 
			
		||||
          title: tr("Delete group"),
 | 
			
		||||
          onTap: _deleteGroup,
 | 
			
		||||
          onPressed: (_) => _deleteGroup,
 | 
			
		||||
        ),
 | 
			
		||||
      ],
 | 
			
		||||
    );
 | 
			
		||||
 
 | 
			
		||||
@@ -76,7 +76,7 @@ class _UnreadConversationsScreenState
 | 
			
		||||
      leading: AccountImageWidget(user: user),
 | 
			
		||||
      title: Text(user.displayName),
 | 
			
		||||
      subtitle: RichText(
 | 
			
		||||
        text: TextSpan(style: Theme.of(context).textTheme.body1, children: [
 | 
			
		||||
        text: TextSpan(style: Theme.of(context).textTheme.bodyText2, children: [
 | 
			
		||||
          TextSpan(text: conv.convName.isNotEmpty ? conv.convName + "\n" : ""),
 | 
			
		||||
          TextSpan(
 | 
			
		||||
            text: conv.message,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,3 @@
 | 
			
		||||
import 'dart:io';
 | 
			
		||||
import 'dart:math';
 | 
			
		||||
 | 
			
		||||
import 'package:comunic/enums/post_kind.dart';
 | 
			
		||||
@@ -26,6 +25,7 @@ import 'package:comunic/utils/navigation_utils.dart';
 | 
			
		||||
import 'package:comunic/utils/post_utils.dart';
 | 
			
		||||
import 'package:comunic/utils/ui_utils.dart';
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
import 'package:image_picker/image_picker.dart';
 | 
			
		||||
import 'package:url_launcher/url_launcher.dart';
 | 
			
		||||
 | 
			
		||||
/// Single posts tile
 | 
			
		||||
@@ -76,7 +76,7 @@ class _PostTileState extends State<PostTile> {
 | 
			
		||||
 | 
			
		||||
  // Class members
 | 
			
		||||
  TextEditingController _commentController = TextEditingController();
 | 
			
		||||
  File _commentImage;
 | 
			
		||||
  PickedFile _commentImage;
 | 
			
		||||
  bool _submitting = false;
 | 
			
		||||
  int _maxNumberOfCommentToShow = 10;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,7 @@ class LoginScaffold extends StatelessWidget {
 | 
			
		||||
        ),
 | 
			
		||||
        scaffoldBackgroundColor: Colors.indigo.shade900,
 | 
			
		||||
        textTheme: TextTheme(
 | 
			
		||||
          body1: TextStyle(color: Colors.white),
 | 
			
		||||
          bodyText2: TextStyle(color: Colors.white),
 | 
			
		||||
          button: TextStyle(color: Colors.white),
 | 
			
		||||
        ),
 | 
			
		||||
      ),
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,3 @@
 | 
			
		||||
import 'dart:io';
 | 
			
		||||
 | 
			
		||||
import 'package:comunic/enums/post_kind.dart';
 | 
			
		||||
import 'package:comunic/enums/post_target.dart';
 | 
			
		||||
@@ -15,6 +14,7 @@ import 'package:comunic/utils/post_utils.dart';
 | 
			
		||||
import 'package:comunic/utils/ui_utils.dart';
 | 
			
		||||
import 'package:file_picker_cross/file_picker_cross.dart';
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
import 'package:image_picker/image_picker.dart';
 | 
			
		||||
 | 
			
		||||
/// Widget that allows to create posts
 | 
			
		||||
///
 | 
			
		||||
@@ -51,7 +51,7 @@ class _PostCreateFormWidgetState extends State<PostCreateFormWidget> {
 | 
			
		||||
  bool _isCreating = false;
 | 
			
		||||
  final TextEditingController _postTextController = TextEditingController();
 | 
			
		||||
  PostVisibilityLevel _postVisibilityLevel;
 | 
			
		||||
  File _postImage;
 | 
			
		||||
  PickedFile _postImage;
 | 
			
		||||
  String _postURL;
 | 
			
		||||
  List<int> _postPDF;
 | 
			
		||||
  DateTime _timeEnd;
 | 
			
		||||
@@ -278,13 +278,11 @@ class _PostCreateFormWidgetState extends State<PostCreateFormWidget> {
 | 
			
		||||
  /// Pick a PDF for the new post
 | 
			
		||||
  Future<void> _pickPDFForPost() async {
 | 
			
		||||
    try {
 | 
			
		||||
      final picker = FilePickerCross(
 | 
			
		||||
      final picker = await FilePickerCross.importFromStorage(
 | 
			
		||||
        type: FileTypeCross.custom,
 | 
			
		||||
        fileExtension: "pdf",
 | 
			
		||||
      );
 | 
			
		||||
 | 
			
		||||
      if (!await picker.pick()) return;
 | 
			
		||||
 | 
			
		||||
      _resetPostSelection();
 | 
			
		||||
 | 
			
		||||
      setState(() {
 | 
			
		||||
@@ -416,7 +414,9 @@ class _PostOptionWidget extends StatelessWidget {
 | 
			
		||||
      onPressed: onTap,
 | 
			
		||||
      color: hasCustomColor
 | 
			
		||||
          ? customColor
 | 
			
		||||
          : selected ? _ActiveButtonsColor : _InactiveButtonsColor,
 | 
			
		||||
          : selected
 | 
			
		||||
              ? _ActiveButtonsColor
 | 
			
		||||
              : _InactiveButtonsColor,
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@ class MultiChoicesSettingsTile<T> extends SettingsTile {
 | 
			
		||||
    return SettingsTile(
 | 
			
		||||
      title: title,
 | 
			
		||||
      subtitle: choices.firstWhere((f) => f.id == currentValue).title,
 | 
			
		||||
      onTap: () => _changeValue(context),
 | 
			
		||||
      onPressed: (_) => _changeValue(context),
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,7 @@ class TextEditSettingsTile extends SettingsTile {
 | 
			
		||||
    return SettingsTile(
 | 
			
		||||
      title: title,
 | 
			
		||||
      subtitle: currValue,
 | 
			
		||||
      onTap: readOnly ? null : () => _changeValue(context),
 | 
			
		||||
      onPressed: (_)=>readOnly ? null : () => _changeValue(context),
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -44,7 +44,7 @@ class ConversationWindowContainer extends StatelessWidget {
 | 
			
		||||
          appBar: AppBarWrapper(
 | 
			
		||||
              height: 40,
 | 
			
		||||
              appBar: AppBar(
 | 
			
		||||
                textTheme: TextTheme(title: TextStyle(fontSize: 15)),
 | 
			
		||||
                textTheme: TextTheme(headline6: TextStyle(fontSize: 15)),
 | 
			
		||||
                backgroundColor: appBarBgColor,
 | 
			
		||||
                leading: icon,
 | 
			
		||||
                title: GestureDetector(child: title, onTap: onToggleCollapse),
 | 
			
		||||
 
 | 
			
		||||
@@ -33,7 +33,7 @@ class TextWidget extends StatelessWidget {
 | 
			
		||||
  Widget build(BuildContext context) {
 | 
			
		||||
    if (this.content.isNull || this.content.isEmpty) return Text("");
 | 
			
		||||
 | 
			
		||||
    var usedStyle = style == null ? Theme.of(context).textTheme.body1 : style;
 | 
			
		||||
    var usedStyle = style == null ? Theme.of(context).textTheme.bodyText2 : style;
 | 
			
		||||
 | 
			
		||||
    var content = this.content.parsedString;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,7 @@ class BBCodeParsedWidget extends StatelessWidget {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /// Initialize parsing
 | 
			
		||||
  static _Element _parse(String text, {_ElementStyle style}) {
 | 
			
		||||
  static _Element _parse(String text) {
 | 
			
		||||
    try {
 | 
			
		||||
      return _parseRecur(
 | 
			
		||||
        text: text,
 | 
			
		||||
@@ -213,7 +213,7 @@ class _ElementStyle {
 | 
			
		||||
 | 
			
		||||
  /// Generate corresponding TextStyle
 | 
			
		||||
  TextStyle toTextStyle(BuildContext context) {
 | 
			
		||||
    return Theme.of(context).textTheme.body1.copyWith(
 | 
			
		||||
    return Theme.of(context).textTheme.bodyText2.copyWith(
 | 
			
		||||
        decoration: decoration,
 | 
			
		||||
        fontWeight: fontWeight,
 | 
			
		||||
        fontStyle: fontStyle,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,3 @@
 | 
			
		||||
import 'dart:io';
 | 
			
		||||
 | 
			
		||||
import 'package:comunic/utils/intl_utils.dart';
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
import 'package:image_picker/image_picker.dart';
 | 
			
		||||
@@ -13,7 +11,7 @@ enum _ChooseImageSource { GALLERY, CAMERA }
 | 
			
		||||
/// Ask the user to choose an image, either from the gallery or using the camera
 | 
			
		||||
///
 | 
			
		||||
/// Returns null in case of failure
 | 
			
		||||
Future<File> pickImage(BuildContext context) async {
 | 
			
		||||
Future<PickedFile> pickImage(BuildContext context) async {
 | 
			
		||||
  /// First, we ask the user to choose between image picker and camera
 | 
			
		||||
  final result = await showDialog<_ChooseImageSource>(
 | 
			
		||||
    context: context,
 | 
			
		||||
@@ -42,8 +40,7 @@ Future<File> pickImage(BuildContext context) async {
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  if (result == null) return null;
 | 
			
		||||
 | 
			
		||||
  return await ImagePicker.pickImage(
 | 
			
		||||
  return await ImagePicker().getImage(
 | 
			
		||||
      source: result == _ChooseImageSource.CAMERA
 | 
			
		||||
          ? ImageSource.camera
 | 
			
		||||
          : ImageSource.gallery);
 | 
			
		||||
 
 | 
			
		||||
@@ -39,8 +39,8 @@ Widget buildErrorCard(String message,
 | 
			
		||||
  if (hide) return Container();
 | 
			
		||||
 | 
			
		||||
  return Theme(
 | 
			
		||||
    data:
 | 
			
		||||
        ThemeData(textTheme: TextTheme(body1: TextStyle(color: Colors.white))),
 | 
			
		||||
    data: ThemeData(
 | 
			
		||||
        textTheme: TextTheme(bodyText2: TextStyle(color: Colors.white))),
 | 
			
		||||
    child: Card(
 | 
			
		||||
      elevation: 2.0,
 | 
			
		||||
      color: Colors.red,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										79
									
								
								pubspec.lock
									
									
									
									
									
								
							
							
						
						
									
										79
									
								
								pubspec.lock
									
									
									
									
									
								
							@@ -70,7 +70,7 @@ packages:
 | 
			
		||||
      name: connectivity
 | 
			
		||||
      url: "https://pub.dartlang.org"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "0.4.9+5"
 | 
			
		||||
    version: "2.0.2"
 | 
			
		||||
  connectivity_for_web:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
@@ -127,6 +127,13 @@ packages:
 | 
			
		||||
      url: "https://pub.dartlang.org"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "3.0.10"
 | 
			
		||||
  disk_space:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: disk_space
 | 
			
		||||
      url: "https://pub.dartlang.org"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "0.0.3"
 | 
			
		||||
  event_bus:
 | 
			
		||||
    dependency: "direct main"
 | 
			
		||||
    description:
 | 
			
		||||
@@ -168,21 +175,14 @@ packages:
 | 
			
		||||
      name: file_picker
 | 
			
		||||
      url: "https://pub.dartlang.org"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "1.13.3"
 | 
			
		||||
    version: "2.1.6"
 | 
			
		||||
  file_picker_cross:
 | 
			
		||||
    dependency: "direct main"
 | 
			
		||||
    description:
 | 
			
		||||
      name: file_picker_cross
 | 
			
		||||
      url: "https://pub.dartlang.org"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "2.1.0"
 | 
			
		||||
  file_picker_platform_interface:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: file_picker_platform_interface
 | 
			
		||||
      url: "https://pub.dartlang.org"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "1.3.1"
 | 
			
		||||
    version: "4.2.8"
 | 
			
		||||
  flutter:
 | 
			
		||||
    dependency: "direct main"
 | 
			
		||||
    description: flutter
 | 
			
		||||
@@ -232,7 +232,7 @@ packages:
 | 
			
		||||
      name: flutter_webrtc
 | 
			
		||||
      url: "https://pub.dartlang.org"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "0.2.8"
 | 
			
		||||
    version: "0.5.8"
 | 
			
		||||
  html:
 | 
			
		||||
    dependency: "direct main"
 | 
			
		||||
    description:
 | 
			
		||||
@@ -282,6 +282,13 @@ packages:
 | 
			
		||||
      url: "https://pub.dartlang.org"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "1.1.6"
 | 
			
		||||
  import_js_library:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: import_js_library
 | 
			
		||||
      url: "https://pub.dartlang.org"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "1.0.2"
 | 
			
		||||
  intl:
 | 
			
		||||
    dependency: "direct main"
 | 
			
		||||
    description:
 | 
			
		||||
@@ -289,6 +296,13 @@ packages:
 | 
			
		||||
      url: "https://pub.dartlang.org"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "0.16.1"
 | 
			
		||||
  js:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: js
 | 
			
		||||
      url: "https://pub.dartlang.org"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "0.6.2"
 | 
			
		||||
  matcher:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
@@ -303,6 +317,13 @@ packages:
 | 
			
		||||
      url: "https://pub.dartlang.org"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "1.3.0-nullsafety.3"
 | 
			
		||||
  mime:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: mime
 | 
			
		||||
      url: "https://pub.dartlang.org"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "0.9.7"
 | 
			
		||||
  octo_image:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
@@ -310,6 +331,13 @@ packages:
 | 
			
		||||
      url: "https://pub.dartlang.org"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "0.3.0"
 | 
			
		||||
  package_info:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: package_info
 | 
			
		||||
      url: "https://pub.dartlang.org"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "0.4.3+4"
 | 
			
		||||
  path:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
@@ -372,14 +400,14 @@ packages:
 | 
			
		||||
      name: photo_view
 | 
			
		||||
      url: "https://pub.dartlang.org"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "0.9.2"
 | 
			
		||||
    version: "0.10.3"
 | 
			
		||||
  pie_chart:
 | 
			
		||||
    dependency: "direct main"
 | 
			
		||||
    description:
 | 
			
		||||
      name: pie_chart
 | 
			
		||||
      url: "https://pub.dartlang.org"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "3.1.1"
 | 
			
		||||
    version: "4.0.1"
 | 
			
		||||
  platform:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
@@ -421,7 +449,14 @@ packages:
 | 
			
		||||
      name: settings_ui
 | 
			
		||||
      url: "https://pub.dartlang.org"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "0.3.0"
 | 
			
		||||
    version: "0.5.0"
 | 
			
		||||
  share:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: share
 | 
			
		||||
      url: "https://pub.dartlang.org"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "0.6.5+4"
 | 
			
		||||
  shared_preferences:
 | 
			
		||||
    dependency: "direct main"
 | 
			
		||||
    description:
 | 
			
		||||
@@ -601,7 +636,21 @@ packages:
 | 
			
		||||
      name: wakelock
 | 
			
		||||
      url: "https://pub.dartlang.org"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "0.1.4+2"
 | 
			
		||||
    version: "0.2.1+1"
 | 
			
		||||
  wakelock_platform_interface:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: wakelock_platform_interface
 | 
			
		||||
      url: "https://pub.dartlang.org"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "0.1.0+1"
 | 
			
		||||
  wakelock_web:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: wakelock_web
 | 
			
		||||
      url: "https://pub.dartlang.org"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "0.1.0+3"
 | 
			
		||||
  web_socket_channel:
 | 
			
		||||
    dependency: "direct main"
 | 
			
		||||
    description:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										16
									
								
								pubspec.yaml
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								pubspec.yaml
									
									
									
									
									
								
							@@ -35,7 +35,7 @@ dependencies:
 | 
			
		||||
 | 
			
		||||
  # The HTTP client is used to make requests on the Comunic API
 | 
			
		||||
  dio: ^3.0.9
 | 
			
		||||
  http_parser: ^3.1.3
 | 
			
		||||
  http_parser: ^3.1.4
 | 
			
		||||
 | 
			
		||||
  # This plugins allows to load remote images
 | 
			
		||||
  cached_network_image: ^2.0.0
 | 
			
		||||
@@ -47,7 +47,7 @@ dependencies:
 | 
			
		||||
  html: ^0.14.0+3
 | 
			
		||||
 | 
			
		||||
  # Module that display the charts for the surveys
 | 
			
		||||
  pie_chart: ^3.1.1
 | 
			
		||||
  pie_chart: ^4.0.1
 | 
			
		||||
 | 
			
		||||
  # Get current system language
 | 
			
		||||
  intl: ^0.16.1
 | 
			
		||||
@@ -56,7 +56,7 @@ dependencies:
 | 
			
		||||
  flutter_emoji: ^2.2.1+1
 | 
			
		||||
 | 
			
		||||
  # Build settings UI
 | 
			
		||||
  settings_ui: ^0.3.0
 | 
			
		||||
  settings_ui: ^0.5.0
 | 
			
		||||
 | 
			
		||||
  # Generate identicons
 | 
			
		||||
  identicon: ^0.1.1
 | 
			
		||||
@@ -65,10 +65,10 @@ dependencies:
 | 
			
		||||
  random_string: ^2.0.1
 | 
			
		||||
 | 
			
		||||
  # Display zoomable images
 | 
			
		||||
  photo_view: ^0.9.2
 | 
			
		||||
  photo_view: ^0.10.3
 | 
			
		||||
 | 
			
		||||
  # Check Internet connection
 | 
			
		||||
  connectivity: ^0.4.8+2
 | 
			
		||||
  connectivity: ^2.0.2
 | 
			
		||||
 | 
			
		||||
  # Establish WebSocket connections
 | 
			
		||||
  web_socket_channel: ^1.1.0
 | 
			
		||||
@@ -77,13 +77,13 @@ dependencies:
 | 
			
		||||
  event_bus: ^1.1.1
 | 
			
		||||
 | 
			
		||||
  # WebRTC calls
 | 
			
		||||
  flutter_webrtc: ^0.2.7
 | 
			
		||||
  flutter_webrtc: ^0.5.8
 | 
			
		||||
 | 
			
		||||
  # Prevent phone from auto-locking during calls
 | 
			
		||||
  wakelock: ^0.1.4+1
 | 
			
		||||
  wakelock: ^0.2.1+1
 | 
			
		||||
 | 
			
		||||
  # Pick any kind of file
 | 
			
		||||
  file_picker_cross: ^2.0.0
 | 
			
		||||
  file_picker_cross: ^4.2.8
 | 
			
		||||
 | 
			
		||||
dev_dependencies:
 | 
			
		||||
  flutter_test:
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user