1
0
mirror of https://gitlab.com/comunic/comunicmobile synced 2025-07-01 14:13:29 +00:00

41 Commits

Author SHA1 Message Date
61e279f719 Show banner in tablet mode 2021-12-30 13:45:22 +01:00
94ae3434e4 Adapt banner to large screens 2021-12-30 13:36:12 +01:00
78ae2a574a Show banner on Forez main route 2021-12-30 12:32:50 +01:00
75b06e7df8 Show banner on welcome route 2021-12-30 12:28:06 +01:00
71a72d4f04 Add support for banner timeout 2021-12-30 12:22:10 +01:00
90b3ffbe81 Fix lang selection 2021-12-30 12:11:26 +01:00
bfe932c053 Start to display banner 2021-12-30 12:02:18 +01:00
4fd8c4d613 Fix deprecated methods call 2021-12-28 19:09:00 +01:00
ecc4f5bffe Update some Gradle dependencies 2021-12-28 19:03:37 +01:00
c849ee0bac Update Gradle & Target sdk 32 2021-12-28 18:35:32 +01:00
04114dede1 Update Gradle version to 6.2 2021-12-28 17:49:33 +01:00
fff33f907a Update firebase_messaging dependency 2021-12-28 17:29:05 +01:00
9a82301c52 Update web_socket_channel dependency 2021-12-28 17:25:49 +01:00
48ececf93c Update video_thumbnail dependency 2021-12-28 17:23:26 +01:00
bc6068c2a1 Update record_mp3 dependency 2021-12-28 17:18:37 +01:00
5b680bb922 Fix issue on posts list not refreshing when a new post is created 2021-12-28 17:15:25 +01:00
2b05fbda35 Update image_picker dependency 2021-12-28 17:06:21 +01:00
30494ff74a Update flutter_webrtc dependency 2021-12-28 16:59:32 +01:00
062abc5a03 Update file_picker dependency 2021-12-28 16:46:46 +01:00
21506f769e Updated cached_network_image package 2021-12-28 16:43:15 +01:00
e180f0bc13 Replace identicon with jdenticon 2021-12-28 16:34:14 +01:00
7ae50e21a4 Fix all code warnings 2021-12-28 15:33:27 +01:00
ae75429b1d Update to Flutter 2.8.1 2021-12-28 15:23:08 +01:00
f2380ba60a Start to work on version 1.1.10 2021-10-28 16:30:22 +02:00
b4140e61ad Fix little bug 2021-10-28 16:20:31 +02:00
aa44688d66 Start to work on v1.1.9 2021-07-13 18:42:21 +02:00
45cd7f1481 Fix conflict 2021-07-13 18:08:19 +02:00
a076c08429 Fix navigability issue 2021-05-29 15:57:31 +02:00
fa8c1f46a1 Fix appearance issues 2021-05-29 15:48:51 +02:00
0b4306990a Updated dependencies 2021-05-29 15:40:47 +02:00
4e7950582a Fix copy operation 2021-05-08 11:19:42 +02:00
3c179d4b83 Remove Alpha channel on application icon 2021-05-05 19:15:09 +02:00
622c1a5abf Add #Forez build script 2021-05-05 19:13:31 +02:00
48eb525f18 Make push notifications work on iOS 2021-05-05 19:09:01 +02:00
acb24b0b36 Bump build number 2021-05-05 12:23:48 +02:00
b9fe15e190 Fix dark theme issue 2021-05-05 12:23:02 +02:00
98b9c44315 New build attempt 2021-05-05 11:57:49 +02:00
1f0fa1faaa Update build number 2021-05-05 11:42:10 +02:00
a92664ac81 First iOS publish request 2021-05-05 11:36:19 +02:00
06d1d08f6d Push notifications are working on iOS 2021-05-05 08:40:59 +02:00
77030609c0 Start to work on a new version of the application 2021-05-04 08:04:15 +02:00
74 changed files with 885 additions and 356 deletions

2
.gitignore vendored
View File

@ -74,3 +74,5 @@ lib/*private*.dart
.flutter-plugins-dependencies
local.properties
.gradle

View File

@ -33,7 +33,7 @@ if (keystorePropertiesFile.exists()) {
}
android {
compileSdkVersion 30
compileSdkVersion 31
compileOptions {
@ -45,12 +45,15 @@ android {
lintOptions {
disable 'InvalidPackage'
// TODO remove this fix to use Gradle plugin 4 ASAP
checkReleaseBuilds false
}
defaultConfig {
applicationId "org.communiquons.comunic"
minSdkVersion 21
targetSdkVersion 30
targetSdkVersion 31
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@ -110,9 +113,9 @@ flutter {
dependencies {
implementation 'com.neovisionaries:nv-websocket-client:2.14'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
testImplementation 'junit:junit:4.13.1'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}
apply plugin: 'com.google.gms.google-services'

View File

@ -59,7 +59,8 @@
android:hardwareAccelerated="true"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:windowSoftInputMode="adjustResize">
android:windowSoftInputMode="adjustResize"
android:exported="true">
<!-- This keeps the window background of the activity showing
until Flutter renders its first frame. It can be removed if
there is no splash screen (such as the default splash screen
@ -69,12 +70,6 @@
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme" />
<!-- Specify that the launch screen should continue being displayed -->
<!-- until Flutter renders its first frame. -->
<meta-data
android:name="io.flutter.embedding.android.SplashScreenDrawable"
android:resource="@drawable/launch_background" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />

View File

@ -100,7 +100,10 @@ public class NotificationsService extends Service implements Runnable {
Intent notificationIntent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this,
0, notificationIntent, 0);
0,
notificationIntent,
android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M ? PendingIntent.FLAG_IMMUTABLE : 0);
Notification notification = new NotificationCompat.Builder(this, SVC_CHANNEL_ID)
.setContentTitle("Comunic")
.setContentText(getText(R.string.independent_push_notification_notification_text))
@ -197,12 +200,12 @@ public class NotificationsService extends Service implements Runnable {
ws.setPingInterval(PING_INTERVAL);
ws.addListener(new WebSocketAdapter() {
@Override
public void onConnected(WebSocket websocket, Map<String, List<String>> headers) throws Exception {
public void onConnected(WebSocket websocket, Map<String, List<String>> headers) {
Log.v(TAG, "Connected to independent push notifications service!");
}
@Override
public void onDisconnected(WebSocket websocket, WebSocketFrame serverCloseFrame, WebSocketFrame clientCloseFrame, boolean closedByServer) throws Exception {
public void onDisconnected(WebSocket websocket, WebSocketFrame serverCloseFrame, WebSocketFrame clientCloseFrame, boolean closedByServer) {
Log.v(TAG, "Disconnected from independent push notifications websocket!");
synchronized (lock) {
lock.notify();
@ -210,12 +213,12 @@ public class NotificationsService extends Service implements Runnable {
}
@Override
public void onTextFrame(WebSocket websocket, WebSocketFrame frame) throws Exception {
public void onTextFrame(WebSocket websocket, WebSocketFrame frame) {
handleTextFrame(frame);
}
@Override
public void onError(WebSocket websocket, WebSocketException cause) throws Exception {
public void onError(WebSocket websocket, WebSocketException cause) {
Log.e(TAG, "An error occured, closing WebSocket!");
cause.printStackTrace();
websocket.disconnect();
@ -254,17 +257,14 @@ public class NotificationsService extends Service implements Runnable {
}
}
private void dropNotification(String id) throws Exception {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
private void dropNotification(String id) {
new Handler(Looper.getMainLooper()).post(() -> {
NotificationManagerCompat notifManager = NotificationManagerCompat.from(NotificationsService.this);
notifManager.cancel(id, NOTIFS_ID);
}
});
}
private void sendNotification(PushNotification n) throws Exception {
private void sendNotification(PushNotification n) {
new Handler(Looper.getMainLooper()).post(() -> postNotification(n));
}
@ -273,7 +273,12 @@ public class NotificationsService extends Service implements Runnable {
createPushNotificationChannel();
Intent intent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
PendingIntent pendingIntent = PendingIntent.getActivity(
this,
0,
intent,
android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M ? PendingIntent.FLAG_IMMUTABLE : 0
);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, NOTIFS_CHANNEL_ID)
.setSmallIcon(R.drawable.ic_notifications)

View File

@ -1,21 +1,21 @@
buildscript {
repositories {
google()
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.4'
classpath 'com.android.tools.build:gradle:4.1.3'
// Firebase
classpath 'com.google.gms:google-services:4.3.5'
classpath 'com.google.gms:google-services:4.3.10'
}
}
allprojects {
repositories {
google()
jcenter()
mavenCentral()
}
}

View File

@ -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-5.6.4-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip

View File

@ -5,7 +5,7 @@ make stable_release_split_per_abi && \
mv build/app/outputs/flutter-apk/app-armeabi-v7a-stable-release.apk "$DEST" && \
mv build/app/outputs/flutter-apk/app-arm64-v8a-stable-release.apk "$DEST" && \
mv build/app/outputs/flutter-apk/app-x86_64-stable-release.apk "$DEST" && \
mv build/app/outputs/mapping/stable/release/mapping.txt "$DEST" && \
mv build/app/outputs/mapping/stableRelease/mapping.txt "$DEST" && \
make stable_release && \
mv build/app/outputs/flutter-apk/app-stable-release.apk "$DEST"

View File

@ -5,4 +5,4 @@ make forez_release_split_per_abi && \
mv build/app/outputs/flutter-apk/app-armeabi-v7a-forez-release.apk "$DEST" && \
mv build/app/outputs/flutter-apk/app-arm64-v8a-forez-release.apk "$DEST" && \
mv build/app/outputs/flutter-apk/app-x86_64-forez-release.apk "$DEST" && \
mv build/app/outputs/mapping/forez/release/mapping.txt "$DEST"
mv build/app/outputs/mapping/forezRelease/mapping.txt "$DEST"

1
build_comunic_ios.sh Executable file
View File

@ -0,0 +1 @@
flutter build ipa --flavor comunic -t lib/main_online.dart

1
build_forez_ios.sh Executable file
View File

@ -0,0 +1 @@
flutter build ipa --flavor forez -t lib/forez/main_forez_online.dart

View File

@ -36,5 +36,48 @@ end
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
target.build_configurations.each do |config|
# You can remove unused permissions here
# for more infomation: https://github.com/BaseflowIT/flutter-permission-handler/blob/develop/permission_handler/ios/Classes/PermissionHandlerEnums.h
# e.g. when you don't need camera permission, just add 'PERMISSION_CAMERA=0'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
'$(inherited)',
## dart: PermissionGroup.calendar
'PERMISSION_EVENTS=0',
## dart: PermissionGroup.reminders
'PERMISSION_REMINDERS=0',
## dart: PermissionGroup.contacts
'PERMISSION_CONTACTS=0',
## dart: PermissionGroup.camera
# 'PERMISSION_CAMERA=0',
## dart: PermissionGroup.microphone
# 'PERMISSION_MICROPHONE=0',
## dart: PermissionGroup.speech
'PERMISSION_SPEECH_RECOGNIZER=0',
## dart: PermissionGroup.photos
#'PERMISSION_PHOTOS=0'
## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]
'PERMISSION_LOCATION=0',
## dart: PermissionGroup.notification
# 'PERMISSION_NOTIFICATIONS=0',
## dart: PermissionGroup.mediaLibrary
# 'PERMISSION_MEDIA_LIBRARY=0',
## dart: PermissionGroup.sensors
'PERMISSION_SENSORS=0'
]
end
end
end

View File

@ -281,6 +281,6 @@ SPEC CHECKSUMS:
video_thumbnail: c4e2a3c539e247d4de13cd545344fd2d26ffafd1
wakelock: b0843b2479edbf6504d8d262c2959446f35373aa
PODFILE CHECKSUM: f92af04f373e0b50153886c1f8a6969f509e3fc8
PODFILE CHECKSUM: efdcc144b284f95c85507e2c43974fc68ced9a09
COCOAPODS: 1.10.0

View File

@ -11,6 +11,7 @@
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
6B56B0EAFAE8328410BF4F0C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F57A07BDAAD5F07639423EE8 /* Pods_Runner.framework */; };
8F2AEBBC26394110007DF92A /* LaunchScreenForez.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8F2AEBBA26394110007DF92A /* LaunchScreenForez.storyboard */; };
8FFF7880264272F1002E5895 /* config in Resources */ = {isa = PBXBuildFile; fileRef = 8FFF787F264272F1002E5895 /* config */; };
9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; };
978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; };
97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; };
@ -45,6 +46,8 @@
7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
8CF757033A070BF5F6AD7355 /* Pods-Runner.debug-comunic.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-comunic.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-comunic.xcconfig"; sourceTree = "<group>"; };
8F2AEBBB26394110007DF92A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreenForez.storyboard; sourceTree = "<group>"; };
8FEFC7EA26405694003B7DF3 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = "<group>"; };
8FFF787F264272F1002E5895 /* config */ = {isa = PBXFileReference; lastKnownFileType = folder; path = config; sourceTree = "<group>"; };
9731915131511AD49411A740 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
@ -87,6 +90,7 @@
97C146E51CF9000F007C117D = {
isa = PBXGroup;
children = (
8FFF787F264272F1002E5895 /* config */,
9740EEB11CF90186004384FC /* Flutter */,
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
@ -106,6 +110,7 @@
97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup;
children = (
8FEFC7EA26405694003B7DF3 /* Runner.entitlements */,
8F2AEBBA26394110007DF92A /* LaunchScreenForez.storyboard */,
7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */,
7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */,
@ -164,6 +169,7 @@
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
8FFF788226427350002E5895 /* Copy GoogleService-Info.plist to the correct location */,
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
@ -189,7 +195,7 @@
TargetAttributes = {
97C146ED1CF9000F007C117D = {
CreatedOnToolsVersion = 7.3.1;
DevelopmentTeam = A9JXUMT7RC;
DevelopmentTeam = QRU542F2B8;
};
};
};
@ -218,6 +224,7 @@
buildActionMask = 2147483647;
files = (
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
8FFF7880264272F1002E5895 /* config in Resources */,
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */,
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
@ -265,6 +272,24 @@
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
8FFF788226427350002E5895 /* Copy GoogleService-Info.plist to the correct location */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "Copy GoogleService-Info.plist to the correct location";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "setopt KSH_ARRAYS BASH_REMATCH\nenvironment=\"default\"\n\n# Regex to extract the scheme name from the Build Configuration\n# We have named our Build Configurations as Debug-dev, Debug-prod etc.\n# Here, dev and prod are the scheme names. This kind of naming is required by Flutter for flavors to work.\n# We are using the $CONFIGURATION variable available in the XCode build environment to extract \n# the environment (or flavor)\n# For eg.\n# If CONFIGURATION=\"Debug-prod\", then environment will get set to \"prod\".\nif [[ $CONFIGURATION =~ -([^-]*)$ ]]; then\nenvironment=${BASH_REMATCH[1]}\nfi\n\necho $environment\n\n# Name and path of the resource we're copying\nGOOGLESERVICE_INFO_PLIST=GoogleService-Info.plist\nGOOGLESERVICE_INFO_FILE=${PROJECT_DIR}/config/${environment}/${GOOGLESERVICE_INFO_PLIST}\n\n# Make sure GoogleService-Info.plist exists\necho \"Looking for ${GOOGLESERVICE_INFO_PLIST} in ${GOOGLESERVICE_INFO_FILE}\"\nif [ ! -f $GOOGLESERVICE_INFO_FILE ]\nthen\necho \"No GoogleService-Info.plist found. Please ensure it's in the proper directory.\"\nexit 1\nfi\n\n# Get a reference to the destination location for the GoogleService-Info.plist\n# This is the default location where Firebase init code expects to find GoogleServices-Info.plist file\nPLIST_DESTINATION=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app\necho \"Will copy ${GOOGLESERVICE_INFO_PLIST} to final destination: ${PLIST_DESTINATION}\"\n\n# Copy over the prod GoogleService-Info.plist for Release builds\ncp \"${GOOGLESERVICE_INFO_FILE}\" \"${PLIST_DESTINATION}\"\n# unsetopt KSH_ARRAYS\n";
};
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
@ -277,7 +302,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n";
};
C9EE070942D44B728369915C /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
@ -456,8 +481,9 @@
APP_DISPLAY_NAME = Comunic;
APP_LAUNCH_STORYBOARD_NAME = LaunchScreen;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = S8QB4VV633;
DEVELOPMENT_TEAM = QRU542F2B8;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
@ -469,7 +495,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
PRODUCT_BUNDLE_IDENTIFIER = org.communiquons.comunic;
PRODUCT_BUNDLE_IDENTIFIER = org.PierreHubert.comunic;
PRODUCT_NAME = "$(TARGET_NAME)";
VERSIONING_SYSTEM = "apple-generic";
};
@ -535,8 +561,9 @@
APP_DISPLAY_NAME = "#Forez";
APP_LAUNCH_STORYBOARD_NAME = LaunchScreenForez;
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-forez";
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = A9JXUMT7RC;
DEVELOPMENT_TEAM = QRU542F2B8;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
@ -548,7 +575,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
PRODUCT_BUNDLE_IDENTIFIER = org.communiquons.forez;
PRODUCT_BUNDLE_IDENTIFIER = org.PierreHubert.forez;
PRODUCT_NAME = "$(TARGET_NAME)";
VERSIONING_SYSTEM = "apple-generic";
};
@ -608,8 +635,9 @@
APP_DISPLAY_NAME = "#Forez";
APP_LAUNCH_STORYBOARD_NAME = LaunchScreenForez;
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-forez";
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = A9JXUMT7RC;
DEVELOPMENT_TEAM = QRU542F2B8;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
@ -621,7 +649,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
PRODUCT_BUNDLE_IDENTIFIER = org.communiquons.forez;
PRODUCT_BUNDLE_IDENTIFIER = org.PierreHubert.forez;
PRODUCT_NAME = "$(TARGET_NAME)";
VERSIONING_SYSTEM = "apple-generic";
};
@ -681,8 +709,9 @@
APP_DISPLAY_NAME = "#Forez";
APP_LAUNCH_STORYBOARD_NAME = LaunchScreenForez;
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-forez";
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = S8QB4VV633;
DEVELOPMENT_TEAM = QRU542F2B8;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
@ -694,7 +723,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
PRODUCT_BUNDLE_IDENTIFIER = org.communiquons.forez;
PRODUCT_BUNDLE_IDENTIFIER = org.PierreHubert.forez;
PRODUCT_NAME = "$(TARGET_NAME)";
VERSIONING_SYSTEM = "apple-generic";
};
@ -807,8 +836,9 @@
APP_DISPLAY_NAME = Comunic;
APP_LAUNCH_STORYBOARD_NAME = LaunchScreen;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = A9JXUMT7RC;
DEVELOPMENT_TEAM = QRU542F2B8;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
@ -820,7 +850,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
PRODUCT_BUNDLE_IDENTIFIER = org.communiquons.comunic;
PRODUCT_BUNDLE_IDENTIFIER = org.PierreHubert.comunic;
PRODUCT_NAME = "$(TARGET_NAME)";
VERSIONING_SYSTEM = "apple-generic";
};
@ -833,8 +863,9 @@
APP_DISPLAY_NAME = Comunic;
APP_LAUNCH_STORYBOARD_NAME = LaunchScreen;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = A9JXUMT7RC;
DEVELOPMENT_TEAM = QRU542F2B8;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
@ -846,7 +877,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
PRODUCT_BUNDLE_IDENTIFIER = org.communiquons.comunic;
PRODUCT_BUNDLE_IDENTIFIER = org.PierreHubert.comunic;
PRODUCT_NAME = "$(TARGET_NAME)";
VERSIONING_SYSTEM = "apple-generic";
};

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

After

Width:  |  Height:  |  Size: 80 KiB

View File

@ -1,122 +1,122 @@
{
"images" : [
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
"idiom" : "iphone",
"scale" : "2x",
"size" : "20x20"
},
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@3x.png",
"scale" : "3x"
"idiom" : "iphone",
"scale" : "3x",
"size" : "20x20"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
"idiom" : "iphone",
"scale" : "1x",
"size" : "29x29"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
"idiom" : "iphone",
"scale" : "2x",
"size" : "29x29"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@3x.png",
"scale" : "3x"
"idiom" : "iphone",
"scale" : "3x",
"size" : "29x29"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
"idiom" : "iphone",
"scale" : "2x",
"size" : "40x40"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@3x.png",
"scale" : "3x"
"idiom" : "iphone",
"scale" : "3x",
"size" : "40x40"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"scale" : "2x",
"size" : "60x60"
},
{
"filename" : "Icon-App-60x60@3x.png",
"scale" : "3x"
"idiom" : "iphone",
"scale" : "3x",
"size" : "60x60"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@1x.png",
"scale" : "1x"
"idiom" : "ipad",
"scale" : "1x",
"size" : "20x20"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
"idiom" : "ipad",
"scale" : "2x",
"size" : "20x20"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
"idiom" : "ipad",
"scale" : "1x",
"size" : "29x29"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
"idiom" : "ipad",
"scale" : "2x",
"size" : "29x29"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@1x.png",
"scale" : "1x"
"idiom" : "ipad",
"scale" : "1x",
"size" : "40x40"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
"idiom" : "ipad",
"scale" : "2x",
"size" : "40x40"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@1x.png",
"scale" : "1x"
"idiom" : "ipad",
"scale" : "1x",
"size" : "76x76"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@2x.png",
"scale" : "2x"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "Icon-App-83.5x83.5@2x.png",
"scale" : "2x"
"scale" : "2x",
"size" : "76x76"
},
{
"filename" : "Icon-App-83.5x83.5@2x.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "83.5x83.5"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "Icon-App-1024x1024@1x.png",
"scale" : "1x"
"idiom" : "ios-marketing",
"scale" : "1x",
"size" : "1024x1024"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 53 KiB

View File

@ -66,5 +66,11 @@
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>This permission is not needed by the app, but it is required by an underlying API. If you see this dialog, contact us.</string>
<key>NSAppleMusicUsageDescription</key>
<string>This permission is not needed by the app, but it is required by an underlying API. If you see this dialog, contact us.</string>
<key>NSBluetoothAlwaysUsageDescription</key>
<string>This permission is not needed by the app, but it is required by an underlying API. If you see this dialog, contact us.</string>
</dict>
</plist>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>aps-environment</key>
<string>development</string>
</dict>
</plist>

View File

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CLIENT_ID</key>
<string>1007877315904-umuhjlq7qfcdn8f24kjddhpmlb67gvpd.apps.googleusercontent.com</string>
<key>REVERSED_CLIENT_ID</key>
<string>com.googleusercontent.apps.1007877315904-umuhjlq7qfcdn8f24kjddhpmlb67gvpd</string>
<key>API_KEY</key>
<string>AIzaSyBzcEJVIHvHl-viG19qR3LFhb6aYj5EZXM</string>
<key>GCM_SENDER_ID</key>
<string>1007877315904</string>
<key>PLIST_VERSION</key>
<string>1</string>
<key>BUNDLE_ID</key>
<string>org.PierreHubert.comunic</string>
<key>PROJECT_ID</key>
<string>comunic-ae92c</string>
<key>STORAGE_BUCKET</key>
<string>comunic-ae92c.appspot.com</string>
<key>IS_ADS_ENABLED</key>
<false></false>
<key>IS_ANALYTICS_ENABLED</key>
<false></false>
<key>IS_APPINVITE_ENABLED</key>
<true></true>
<key>IS_GCM_ENABLED</key>
<true></true>
<key>IS_SIGNIN_ENABLED</key>
<true></true>
<key>GOOGLE_APP_ID</key>
<string>1:1007877315904:ios:469f6c61859712260aeea5</string>
</dict>
</plist>

View File

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CLIENT_ID</key>
<string>500630888942-0b42osg6gpr5tnr8s49uvlstg1bil1be.apps.googleusercontent.com</string>
<key>REVERSED_CLIENT_ID</key>
<string>com.googleusercontent.apps.500630888942-0b42osg6gpr5tnr8s49uvlstg1bil1be</string>
<key>API_KEY</key>
<string>AIzaSyBuhS3BM7Ql6sQ1EPghKiLaLjh_78pT9-k</string>
<key>GCM_SENDER_ID</key>
<string>500630888942</string>
<key>PLIST_VERSION</key>
<string>1</string>
<key>BUNDLE_ID</key>
<string>org.PierreHubert.forez</string>
<key>PROJECT_ID</key>
<string>forez-1b859</string>
<key>STORAGE_BUCKET</key>
<string>forez-1b859.appspot.com</string>
<key>IS_ADS_ENABLED</key>
<false></false>
<key>IS_ANALYTICS_ENABLED</key>
<false></false>
<key>IS_APPINVITE_ENABLED</key>
<true></true>
<key>IS_GCM_ENABLED</key>
<true></true>
<key>IS_SIGNIN_ENABLED</key>
<true></true>
<key>GOOGLE_APP_ID</key>
<string>1:500630888942:ios:4bac527bf743b4b5d02eff</string>
<key>DATABASE_URL</key>
<string>https://forez-1b859.firebaseio.com</string>
</dict>
</plist>

View File

@ -75,7 +75,7 @@ class JoinGroupPaneBodyState extends State<_JoinGroupPaneBody> {
]..addAll(_groups.map((e) => RadioListTile(
value: e.id,
groupValue: _currChoice,
onChanged: (v) => setState(() => _currChoice = _currChoice),
onChanged: (v) => setState(() => _currChoice = e.id),
title: Text(e.name),
subtitle: Text(e.membershipText),
))),

View File

@ -9,6 +9,7 @@ import 'package:comunic/ui/routes/main_route/page_info.dart';
import 'package:comunic/ui/screens/conversations_list_screen.dart';
import 'package:comunic/ui/screens/group_sections/forez_presence_section.dart';
import 'package:comunic/ui/screens/group_sections/group_posts_section.dart';
import 'package:comunic/ui/widgets/banner_widget.dart';
import 'package:comunic/ui/widgets/safe_state.dart';
import 'package:comunic/ui/widgets/status_widget.dart';
import 'package:comunic/ui/widgets/tab_transition_widget.dart';
@ -115,7 +116,12 @@ class _ForezRouteBodyState extends SafeState<ForezRouteBody> {
actions: <Widget>[_buildPopupMenuButton()],
bottom: TabBar(tabs: _tabs),
),
body: TabBarView(children: _tabsPages),
body: Column(
children: [
BannerWidget(),
Expanded(child: TabBarView(children: _tabsPages)),
],
),
),
);
}

View File

@ -2,11 +2,14 @@
// Generated file. Do not edit.
//
// ignore_for_file: directives_ordering
// ignore_for_file: lines_longer_than_80_chars
import 'package:file_picker/src/file_picker_web.dart';
import 'package:connectivity_for_web/connectivity_for_web.dart';
import 'package:file_picker/_internal/file_picker_web.dart';
import 'package:firebase_core_web/firebase_core_web.dart';
import 'package:firebase_messaging_web/firebase_messaging_web.dart';
import 'package:image_picker_for_web/image_picker_for_web.dart';
import 'package:shared_preferences_web/shared_preferences_web.dart';
import 'package:url_launcher_web/url_launcher_web.dart';
import 'package:video_player_web/video_player_web.dart';
@ -16,9 +19,11 @@ import 'package:flutter_web_plugins/flutter_web_plugins.dart';
// ignore: public_member_api_docs
void registerPlugins(Registrar registrar) {
ConnectivityPlugin.registerWith(registrar);
FilePickerWeb.registerWith(registrar);
FirebaseCoreWeb.registerWith(registrar);
FirebaseMessagingWeb.registerWith(registrar);
ImagePickerPlugin.registerWith(registrar);
SharedPreferencesPlugin.registerWith(registrar);
UrlLauncherPlugin.registerWith(registrar);
VideoPlayerPlugin.registerWith(registrar);

View File

@ -174,7 +174,7 @@ class AccountHelper {
String token) async {
final response =
await APIRequest.withoutLogin("account/check_password_reset_token")
.addString("token", token)
.addString("reset_token", token)
.execWithThrowGetObject();
return ResCheckPasswordToken(
@ -190,7 +190,7 @@ class AccountHelper {
static Future<void> changeAccountPassword(
String token, String password) async =>
await APIRequest.withoutLogin("account/reset_user_passwd")
.addString("token", token)
.addString("reset_token", token)
.addString("password", password)
.execWithThrow();

View File

@ -17,6 +17,7 @@ class ServerConfigurationHelper {
(await APIRequest.withoutLogin("server/config").execWithThrow())
.getObject();
final banner = response["banner"];
final pushNotificationsPolicy = response["push_notifications"];
final passwordPolicy = response["password_policy"];
final dataConservationPolicy = response["data_conservation_policy"];
@ -31,6 +32,15 @@ class ServerConfigurationHelper {
contactEmail: response["contact_email"],
playStoreURL: response["play_store_url"],
androidDirectDownloadURL: response["android_direct_download_url"],
banner: banner == null
? null
: Banner(
enabled: banner["enabled"],
expire: banner["expire"],
nature: BannerNatureExt.fromStr(banner["nature"]),
message: Map<String, dynamic>.from(banner["message"])
.map((key, value) => MapEntry(key, value.toString())),
link: banner["link"]),
notificationsPolicy: NotificationsPolicy(
hasFirebase: pushNotificationsPolicy["has_firebase"],
hasIndependent: pushNotificationsPolicy["has_independent"],
@ -98,3 +108,5 @@ class ServerConfigurationHelper {
/// Shortcut for server configuration
ServerConfig get srvConfig => ServerConfigurationHelper.config;
bool get showBanner => srvConfig.banner != null && srvConfig.banner.visible;

View File

@ -9,6 +9,7 @@ import 'package:comunic/utils/flutter_utils.dart';
import 'package:comunic/utils/intl_utils.dart';
import 'package:connectivity/connectivity.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
/// Main file of the application
///
@ -68,7 +69,8 @@ class ComunicApplicationState extends State<ComunicApplication> {
primaryColor: config().primaryColor,
primaryColorDark: config().primaryColorDark,
appBarTheme: AppBarTheme(
brightness: Brightness.dark,
backgroundColor: config().primaryColor,
systemOverlayStyle: SystemUiOverlayStyle.light,
)),
showPerformanceOverlay: prefs.showPerformancesOverlay,
);

View File

@ -1,8 +1,5 @@
import 'dart:ui';
import 'package:comunic/ui/routes/tour_route.dart';
import 'package:flutter/material.dart';
import 'package:meta/meta.dart';
/// Application configuration model
///

View File

@ -2,7 +2,6 @@ import 'package:comunic/helpers/serialization/base_serialization_helper.dart';
import 'package:comunic/models/conversation_member.dart';
import 'package:comunic/utils/account_utils.dart';
import 'package:flutter/material.dart';
import 'package:meta/meta.dart';
import 'group.dart';

View File

@ -4,7 +4,6 @@ import 'package:comunic/models/displayed_content.dart';
import 'package:comunic/utils/account_utils.dart' as account;
import 'package:comunic/utils/intl_utils.dart';
import 'package:flutter/material.dart';
import 'package:meta/meta.dart';
/// Single conversation message
///
@ -132,10 +131,14 @@ class ConversationServerMessage {
return Set()..add(userID);
case ConversationServerMessageType.USER_ADDED_ANOTHER_USER:
return Set()..add(userWhoAdded)..add(userAdded);
return Set()
..add(userWhoAdded)
..add(userAdded);
case ConversationServerMessageType.USER_REMOVED_ANOTHER_USER:
return Set()..add(userWhoRemoved)..add(userRemoved);
return Set()
..add(userWhoRemoved)
..add(userRemoved);
}
throw Exception("Unsupported server message type!");

View File

@ -1,3 +1,4 @@
import 'package:comunic/utils/date_utils.dart';
import 'package:flutter/widgets.dart';
import 'package:version/version.dart';
@ -132,6 +133,42 @@ class AccountInformationPolicy {
assert(maxLocationLength != null);
}
enum BannerNature { Information, Warning, Success }
extension BannerNatureExt on BannerNature {
static BannerNature fromStr(String s) {
switch (s) {
case "information":
return BannerNature.Information;
case "success":
return BannerNature.Success;
case "warning":
default:
return BannerNature.Warning;
}
}
}
class Banner {
final bool enabled;
final int expire;
final BannerNature nature;
final Map<String, String> message;
final String link;
const Banner({
@required this.enabled,
@required this.expire,
@required this.nature,
@required this.message,
@required this.link,
}) : assert(enabled != null),
assert(nature != null),
assert(message != null);
bool get visible => enabled && (expire == null || expire > time());
}
class ServerConfig {
final Version minSupportedMobileVersion;
final String termsURL;
@ -139,6 +176,7 @@ class ServerConfig {
final String contactEmail;
final String playStoreURL;
final String androidDirectDownloadURL;
final Banner banner;
final NotificationsPolicy notificationsPolicy;
final PasswordPolicy passwordPolicy;
final ServerDataConservationPolicy dataConservationPolicy;
@ -152,6 +190,7 @@ class ServerConfig {
@required this.contactEmail,
@required this.playStoreURL,
@required this.androidDirectDownloadURL,
@required this.banner,
@required this.notificationsPolicy,
@required this.passwordPolicy,
@required this.dataConservationPolicy,

View File

@ -1,7 +1,6 @@
import 'package:chewie_audio/chewie_audio.dart';
import 'package:comunic/ui/widgets/async_screen_widget.dart';
import 'package:comunic/utils/intl_utils.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';

View File

@ -1,7 +1,6 @@
import 'package:comunic/ui/dialogs/single_input_dialog.dart';
import 'package:comunic/utils/input_utils.dart';
import 'package:comunic/utils/intl_utils.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
/// Ask the user to enter an URL

View File

@ -1,6 +1,5 @@
import 'package:comunic/ui/dialogs/single_input_dialog.dart';
import 'package:comunic/utils/intl_utils.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
/// Add YouTube link dialog

View File

@ -1,6 +1,5 @@
import 'package:comunic/ui/widgets/dialogs/auto_sized_dialog_content_widget.dart';
import 'package:comunic/utils/intl_utils.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
/// Build and show a dialog to offer to the user to choose between several

View File

@ -8,7 +8,6 @@ import 'package:comunic/utils/ui_utils.dart';
import 'package:file_picker/file_picker.dart';
import 'package:filesize/filesize.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:image_cropper/image_cropper.dart';
import 'package:image_picker/image_picker.dart';
import 'package:mime/mime.dart';
@ -124,7 +123,7 @@ Future<BytesFile> showPickFileDialog({
// Pick an image
case _FileChoices.PICK_IMAGE:
case _FileChoices.TAKE_PICTURE:
final image = await ImagePicker().getImage(
final image = await ImagePicker().pickImage(
source: choice == _FileChoices.PICK_IMAGE
? ImageSource.gallery
: ImageSource.camera,
@ -143,7 +142,7 @@ Future<BytesFile> showPickFileDialog({
// Pick an video
case _FileChoices.PICK_VIDEO:
case _FileChoices.TAKE_VIDEO:
final image = await ImagePicker().getVideo(
final image = await ImagePicker().pickVideo(
source: choice == _FileChoices.PICK_VIDEO
? ImageSource.gallery
: ImageSource.camera,

View File

@ -4,7 +4,6 @@ import 'package:comunic/ui/widgets/dialogs/confirm_dialog_button.dart';
import 'package:comunic/ui/widgets/pick_user_widget.dart';
import 'package:comunic/ui/widgets/safe_state.dart';
import 'package:comunic/utils/intl_utils.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
/// Pick user dialog

View File

@ -2,7 +2,6 @@ import 'package:comunic/enums/post_visibility_level.dart';
import 'package:comunic/ui/tiles/post_visibility_level_tile.dart';
import 'package:comunic/utils/intl_utils.dart';
import 'package:flutter/material.dart';
import 'package:meta/meta.dart';
/// Post utilities
///

View File

@ -1,7 +1,6 @@
import 'dart:math';
import 'package:comunic/utils/ui_utils.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
/// Screen dialog

View File

@ -1,5 +1,4 @@
import 'package:comunic/utils/intl_utils.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
/// Dialog to use to ask the user to enter a value

View File

@ -2,7 +2,6 @@ import 'package:comunic/helpers/groups_helper.dart';
import 'package:comunic/helpers/settings_helper.dart';
import 'package:comunic/ui/widgets/safe_state.dart';
import 'package:comunic/utils/intl_utils.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
/// Show a dialog to offer the user to pick a virtual directory

View File

@ -6,9 +6,7 @@ import 'package:comunic/ui/widgets/safe_state.dart';
import 'package:comunic/utils/input_utils.dart';
import 'package:comunic/utils/intl_utils.dart';
import 'package:comunic/utils/ui_utils.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
/// Reset password route
///

View File

@ -1,6 +1,7 @@
import 'package:comunic/ui/routes/main_route/main_route.dart';
import 'package:comunic/ui/routes/main_route/page_info.dart';
import 'package:comunic/ui/screens/notifications_screen.dart';
import 'package:comunic/ui/widgets/banner_widget.dart';
import 'package:comunic/ui/widgets/mobile_mode/mobile_appbar_widget.dart';
import 'package:flutter/material.dart';
@ -33,7 +34,14 @@ class _MainRouteState extends MainController {
appBar: currentPage.hideNavBar
? null
: ComunicMobileAppBar(currentPage: currentPage),
body: SafeArea(key: currentPage.key, child: currentPage.child),
body: SafeArea(
key: currentPage.key,
child: Column(
children: [
BannerWidget(),
Expanded(child: currentPage.child)
],
)),
),
),
),

View File

@ -3,6 +3,7 @@ import 'package:comunic/ui/dialogs/screen_dialog.dart';
import 'package:comunic/ui/routes/main_route/main_route.dart';
import 'package:comunic/ui/routes/main_route/page_info.dart';
import 'package:comunic/ui/screens/newest_posts.dart';
import 'package:comunic/ui/widgets/banner_widget.dart';
import 'package:comunic/ui/widgets/tablet_mode/calls/calls_area.dart';
import 'package:comunic/ui/widgets/tablet_mode/conversations/conversations_area_widget.dart';
import 'package:comunic/ui/widgets/tablet_mode/current_user_panel.dart';
@ -79,7 +80,12 @@ class _TabletRouteState extends MainController {
Widget _buildRightPane() => Container(
key: currentPage.key,
width: MediaQuery.of(context).size.width - _SideBarSize,
child: currentPage.child,
child: Column(
children: [
BannerWidget(),
Expanded(child: currentPage.child),
],
),
);
@override

View File

@ -4,7 +4,7 @@ import 'package:comunic/utils/flutter_utils.dart';
import 'package:comunic/utils/intl_utils.dart';
import 'package:comunic/utils/ui_utils.dart';
import 'package:flutter/material.dart';
import 'package:settings_ui/settings_ui.dart';
import 'package:flutter_settings_ui/flutter_settings_ui.dart';
import 'package:url_launcher/url_launcher.dart';
/// About application settings

View File

@ -8,13 +8,12 @@ import 'package:comunic/ui/widgets/settings/header_spacer_section.dart';
import 'package:comunic/ui/widgets/settings/multi_choices_settings_tile.dart';
import 'package:comunic/utils/account_utils.dart';
import 'package:comunic/utils/files_utils.dart';
import 'package:comunic/utils/identicon_utils.dart';
import 'package:comunic/utils/intl_utils.dart';
import 'package:comunic/utils/ui_utils.dart';
import 'package:flutter/material.dart';
import 'package:identicon/identicon.dart';
import 'package:flutter_settings_ui/flutter_settings_ui.dart';
import 'package:image_cropper/image_cropper.dart';
import 'package:random_string/random_string.dart';
import 'package:settings_ui/settings_ui.dart';
import '../../../utils/log_utils.dart';
import '../../../utils/ui_utils.dart';
@ -167,7 +166,7 @@ class _AccountImageSettingsScreenState
/// Generate a random account image
void _generateRandomAccountImage() async {
// Generate emoticon
final bytes = Identicon().generate(randomString(10));
final bytes = await genIdenticon(context);
if (!await SettingsHelper.uploadAccountImageFromMemory(bytes)) {
showSimpleSnack(

View File

@ -12,8 +12,7 @@ import 'package:comunic/utils/flutter_utils.dart';
import 'package:comunic/utils/intl_utils.dart';
import 'package:comunic/utils/ui_utils.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:settings_ui/settings_ui.dart';
import 'package:flutter_settings_ui/flutter_settings_ui.dart';
/// Account privacy settings
///
@ -176,7 +175,7 @@ class DataConservationPolicyTile extends SettingsTile {
final Function(int) onChange;
final int minValue;
const DataConservationPolicyTile({
DataConservationPolicyTile({
@required this.value,
@required this.title,
@required this.onChange,

View File

@ -12,7 +12,7 @@ import 'package:comunic/utils/flutter_utils.dart';
import 'package:comunic/utils/intl_utils.dart';
import 'package:comunic/utils/ui_utils.dart';
import 'package:flutter/material.dart';
import 'package:settings_ui/settings_ui.dart';
import 'package:flutter_settings_ui/flutter_settings_ui.dart';
/// Account security settings
///

View File

@ -12,7 +12,7 @@ import 'package:comunic/utils/flutter_utils.dart';
import 'package:comunic/utils/intl_utils.dart';
import 'package:comunic/utils/ui_utils.dart';
import 'package:flutter/material.dart';
import 'package:settings_ui/settings_ui.dart';
import 'package:flutter_settings_ui/flutter_settings_ui.dart';
enum _MainMenuActions { SHOW_TOUR }

View File

@ -5,7 +5,7 @@ import 'package:comunic/utils/flutter_utils.dart';
import 'package:comunic/utils/intl_utils.dart';
import 'package:comunic/utils/ui_utils.dart';
import 'package:flutter/material.dart';
import 'package:settings_ui/settings_ui.dart';
import 'package:flutter_settings_ui/flutter_settings_ui.dart';
/// Application settings
///
@ -94,7 +94,7 @@ class _PreferencesSettingsTile extends SettingsTile {
final Function onChange;
final PreferencesHelper helper;
const _PreferencesSettingsTile({
_PreferencesSettingsTile({
@required this.preferencesKey,
@required this.title,
@required this.subtitle,

View File

@ -14,7 +14,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:settings_ui/settings_ui.dart';
import 'package:flutter_settings_ui/flutter_settings_ui.dart';
/// General account settings
///

View File

@ -8,7 +8,7 @@ import 'package:comunic/utils/intl_utils.dart';
import 'package:comunic/utils/log_utils.dart';
import 'package:comunic/utils/ui_utils.dart';
import 'package:flutter/material.dart';
import 'package:settings_ui/settings_ui.dart';
import 'package:flutter_settings_ui/flutter_settings_ui.dart';
/// Notifications settings
///

View File

@ -2,7 +2,6 @@ import 'package:comunic/helpers/posts_helper.dart';
import 'package:comunic/lists/posts_list.dart';
import 'package:comunic/ui/widgets/posts_list_widget.dart';
import 'package:comunic/utils/intl_utils.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
/// Single post route

View File

@ -19,14 +19,13 @@ import 'package:comunic/ui/widgets/settings/header_spacer_section.dart';
import 'package:comunic/ui/widgets/settings/multi_choices_settings_tile.dart';
import 'package:comunic/ui/widgets/settings/text_settings_edit_tile.dart';
import 'package:comunic/utils/files_utils.dart';
import 'package:comunic/utils/identicon_utils.dart';
import 'package:comunic/utils/input_utils.dart';
import 'package:comunic/utils/intl_utils.dart';
import 'package:comunic/utils/log_utils.dart';
import 'package:comunic/utils/ui_utils.dart';
import 'package:flutter/material.dart';
import 'package:identicon/identicon.dart';
import 'package:random_string/random_string.dart';
import 'package:settings_ui/settings_ui.dart';
import 'package:flutter_settings_ui/flutter_settings_ui.dart';
/// Groups settings screen
///
@ -432,8 +431,7 @@ class _GroupSettingsScreenState extends SafeState<GroupSettingsScreen> {
/// Generate a new random logo for the group
void _generateRandomLogo() async {
try {
final newLogo =
Identicon(rows: 10, cols: 10).generate(randomString(20), size: 100);
final newLogo = await genIdenticon(context);
await _doUploadLogo(newLogo);
} catch (e, stack) {
print("Could not generate new logo! $e\n$stack");

View File

@ -15,7 +15,6 @@ import 'package:comunic/utils/intl_utils.dart';
import 'package:comunic/utils/navigation_utils.dart';
import 'package:comunic/utils/ui_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
/// Notifications screen
///

View File

@ -29,6 +29,7 @@ class _UserPostsSectionState extends State<UserPostsSection> {
@override
Widget build(BuildContext context) => PostsListWidget(
key: _postsKey,
topWidgets: [
widget.user.canPostTexts
? PostCreateFormWidget(

View File

@ -124,7 +124,7 @@ class ConversationMessageTile extends StatelessWidget {
break;
case _MenuChoices.COPY_URL:
copyToClipboard(context, message.message.content);
copyToClipboard(context, message.file.url);
break;
case _MenuChoices.GET_STATS:

View File

@ -25,7 +25,6 @@ import 'package:comunic/utils/intl_utils.dart';
import 'package:comunic/utils/navigation_utils.dart';
import 'package:comunic/utils/ui_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:url_launcher/url_launcher.dart';
import '../../models/api_request.dart';

View File

@ -0,0 +1,113 @@
import 'dart:async';
import 'package:comunic/helpers/server_config_helper.dart';
import 'package:comunic/models/server_config.dart';
import 'package:comunic/utils/date_utils.dart';
import 'package:comunic/utils/intl_utils.dart';
import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';
bool _bannerDismissed = false;
class BannerWidget extends StatefulWidget {
const BannerWidget({Key key}) : super(key: key);
@override
_BannerWidgetState createState() => _BannerWidgetState();
}
class _BannerWidgetState extends State<BannerWidget> {
Timer _timer;
bool get _shouldShowBanner => showBanner && !_bannerDismissed;
void _hideBanner() {
if (this.mounted) setState(() => _bannerDismissed = true);
}
void _openLink() {
launch(srvConfig.banner.link);
}
@override
void initState() {
super.initState();
if (_shouldShowBanner && srvConfig.banner.expire != null) {
_timer = Timer(
Duration(seconds: srvConfig.banner.expire - time()), _hideBanner);
}
}
@override
void dispose() {
if (_timer != null) _timer.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
if (!_shouldShowBanner) return Container();
final banner = srvConfig.banner;
return Card(
color: banner.nature == BannerNature.Information
? Colors.blue
: banner.nature == BannerNature.Success
? Colors.green
: Colors.red,
child: Padding(
padding: const EdgeInsets.all(2.0),
child: Row(
children: [
BannerButton(
icon: Icon(
banner.nature == BannerNature.Information
? Icons.info
: banner.nature == BannerNature.Success
? Icons.check
: Icons.warning,
),
),
Expanded(
child: Text(
banner.message.containsKey(shortLang)
? banner.message[shortLang]
: banner.message["en"],
style: TextStyle(color: Colors.white),
),
),
banner.link == null
? Container()
: BannerButton(
onPressed: _openLink,
icon: Icon(Icons.open_in_new),
),
BannerButton(
onPressed: _hideBanner,
icon: Icon(Icons.close),
)
],
),
),
);
}
}
class BannerButton extends StatelessWidget {
final Function() onPressed;
final Widget icon;
const BannerButton({this.onPressed, this.icon, Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return IconButton(
onPressed: onPressed,
icon: icon,
color: Colors.white,
disabledColor: Colors.white,
padding: EdgeInsets.all(1.0),
);
}
}

View File

@ -75,7 +75,7 @@ class _CountdownWidgetState extends State<CountdownWidget> {
value: remainingTime <= 0
? 1.0
: 1 - (remainingTime / totalDuration),
backgroundColor: Theme.of(context).accentColor,
backgroundColor: Theme.of(context).colorScheme.secondary,
valueColor: AlwaysStoppedAnimation<Color>(
Theme.of(context).backgroundColor),
),

View File

@ -35,30 +35,40 @@ class PresenceCalendarWidget extends StatefulWidget {
}
class _PresenceCalendarWidgetState extends State<PresenceCalendarWidget> {
CalendarController _calendarController;
var selectedDay = DateTime.now();
@override
void initState() {
super.initState();
_calendarController = CalendarController();
void didUpdateWidget(covariant PresenceCalendarWidget oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.selectedDay != widget.selectedDay) {
selectedDay = widget.selectedDay;
setState(() {});
}
@override
void dispose() {
_calendarController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return TableCalendar(
calendarController: _calendarController,
firstDay: DateTime.utc(2020, 01, 01),
lastDay: DateTime.now().add(Duration(days: 365 * 2)),
selectedDayPredicate: (d) => d == selectedDay,
locale: "fr_FR",
weekendDays: [],
onHeaderTapped: _pickDate,
builders: CalendarBuilders(dayBuilder: _dayBuilder),
calendarBuilders: CalendarBuilders(
defaultBuilder: _dayBuilder,
todayBuilder: _dayBuilder,
selectedBuilder: _dayBuilder,
),
onDaySelected: _selectedDay,
availableCalendarFormats: const {CalendarFormat.month: "Mois"},
focusedDay: selectedDay,
onPageChanged: (s) {
setState(() {
selectedDay = s;
});
},
);
}
@ -70,14 +80,12 @@ class _PresenceCalendarWidgetState extends State<PresenceCalendarWidget> {
lastDate: DateTime.now().add(Duration(days: 365 * 5)),
);
if (pickedDate != null) {
_calendarController.setSelectedDay(pickedDate, animate: true);
setState(() {});
}
setState(() {
if (pickedDate != null) selectedDay = pickedDate;
});
}
Widget _dayBuilder(
BuildContext context, DateTime date, List<dynamic> events) {
Widget _dayBuilder(BuildContext context, DateTime date, DateTime focusedDay) {
if (widget.presenceSet.containsDate(date)) {
// Show the number of users who are present
if (widget.mode == CalendarDisplayMode.MULTIPLE_USERS)
@ -120,9 +128,9 @@ class _PresenceCalendarWidgetState extends State<PresenceCalendarWidget> {
);
}
void _selectedDay(
DateTime day, List<dynamic> events, List<dynamic> holidays) {
if (widget.onDayClicked != null) widget.onDayClicked(day);
void _selectedDay(DateTime selecteDay, DateTime focusedDay) {
if (widget.onDayClicked != null) widget.onDayClicked(selecteDay);
setState(() {});
}
}

View File

@ -43,7 +43,6 @@ class LoginRoutesTheme extends StatelessWidget {
backgroundColor: Config.get().splashBackgroundColor,
disabledColor: Colors.grey,
highlightColor: Colors.white12,
accentColor: Colors.white,
hintColor: Colors.white,
textTheme: TextTheme(subtitle1: TextStyle(color: Colors.white)),
radioTheme: RadioThemeData(
@ -63,7 +62,7 @@ class LoginRoutesTheme extends StatelessWidget {
onBackground: Colors.white,
onError: Colors.redAccent,
brightness: Brightness.dark,
)),
).copyWith(secondary: Colors.white)),
child: child,
);
}

View File

@ -1,4 +1,5 @@
import 'package:comunic/models/config.dart';
import 'package:comunic/ui/widgets/banner_widget.dart';
import 'package:comunic/utils/intl_utils.dart';
import 'package:flutter/material.dart';
@ -43,7 +44,12 @@ class LoginScaffold extends StatelessWidget {
),
),
child: Scaffold(
body: SingleChildScrollView(
body: SafeArea(
child: Column(
children: [
BannerWidget(),
Expanded(
child: SingleChildScrollView(
child: Center(
child: Container(
height: contentHeight,
@ -51,7 +57,7 @@ class LoginScaffold extends StatelessWidget {
constraints: BoxConstraints(maxWidth: 300),
child: Column(
children: <Widget>[
Spacer(flex: 3),
Spacer(flex: 2),
Text(config().appName,
textAlign: TextAlign.center,
style: TextStyle(fontSize: 50)),
@ -80,6 +86,10 @@ class LoginScaffold extends StatelessWidget {
),
),
),
],
),
),
),
);
}
}

View File

@ -382,9 +382,9 @@ class _PostCreateFormWidgetState extends State<PostCreateFormWidget> {
this._resetForm();
widget.onCreated();
} catch (e) {
} catch (e, s) {
setState(() => _isCreating = false);
print("Error while creating post : " + e.toString());
print("Error while creating post : $e $s");
showSimpleSnack(context, tr("Could not create post !"));
}
}

View File

@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'package:settings_ui/settings_ui.dart';
import 'package:flutter_settings_ui/flutter_settings_ui.dart';
// ignore: must_be_immutable
class HeadSpacerSection extends CustomSection {

View File

@ -1,6 +1,6 @@
import 'package:comunic/ui/dialogs/multi_choices_dialog.dart';
import 'package:flutter/material.dart';
import 'package:settings_ui/settings_ui.dart';
import 'package:flutter_settings_ui/flutter_settings_ui.dart';
/// Multiple choices settings tile
///
@ -14,7 +14,7 @@ class MultiChoicesSettingsTile<T> extends SettingsTile {
final Widget leading;
final Widget trailing;
const MultiChoicesSettingsTile({
MultiChoicesSettingsTile({
Key key,
@required this.title,
@required this.choices,

View File

@ -3,7 +3,7 @@ import 'package:comunic/utils/flutter_utils.dart';
import 'package:comunic/utils/intl_utils.dart';
import 'package:comunic/utils/string_utils.dart';
import 'package:flutter/material.dart';
import 'package:settings_ui/settings_ui.dart';
import 'package:flutter_settings_ui/flutter_settings_ui.dart';
/// Text edit settings tile
///
@ -22,7 +22,7 @@ class TextEditSettingsTile extends SettingsTile {
bool get readOnly => onChanged == null;
const TextEditSettingsTile({
TextEditSettingsTile({
Key key,
@required this.title,
@required this.currValue,

View File

@ -44,7 +44,6 @@ class ConversationWindowContainer extends StatelessWidget {
appBar: AppBarWrapper(
height: 40,
appBar: AppBar(
textTheme: TextTheme(headline6: TextStyle(fontSize: 15)),
backgroundColor: appBarBgColor,
leading: icon,
title: GestureDetector(child: title, onTap: onToggleCollapse),
@ -52,6 +51,10 @@ class ConversationWindowContainer extends StatelessWidget {
..add(
IconButton(icon: Icon(Icons.close), onPressed: onClose),
),
toolbarTextStyle:
TextTheme(headline6: TextStyle(fontSize: 15)).bodyText2,
titleTextStyle:
TextTheme(headline6: TextStyle(fontSize: 15)).headline6,
)),
body: Visibility(
child: body,

View File

@ -14,8 +14,8 @@ import 'package:comunic/utils/account_utils.dart';
import 'package:comunic/utils/conversations_utils.dart';
import 'package:comunic/utils/date_utils.dart';
import 'package:comunic/utils/intl_utils.dart';
import 'package:comunic/utils/ui_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
/// Tablet mode of user page
///
@ -253,6 +253,7 @@ class _AboutUserEntry extends StatelessWidget {
return ListTile(
title: RichText(
text: TextSpan(
style: TextStyle(color: darkTheme() ? null : Colors.black),
children: [
WidgetSpan(
child: Icon(icon, size: 15),

View File

@ -1,5 +1,3 @@
import 'dart:ui';
import 'package:comunic/utils/input_utils.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';

View File

@ -0,0 +1,52 @@
import 'dart:typed_data';
import 'dart:ui';
import 'package:flutter/cupertino.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:jdenticon_dart/jdenticon_dart.dart';
import 'package:random_string/random_string.dart';
/// Identicon utilities
///
/// @author Pierre Hubert
// Based on https://stackoverflow.com/a/63215502/3781411
Future<Uint8List> svgToPng(BuildContext context, String svgString,
{int svgWidth, int svgHeight}) async {
DrawableRoot svgDrawableRoot = await svg.fromSvgString(svgString, null);
// to have a nice rendering it is important to have the exact original height and width,
// the easier way to retrieve it is directly from the svg string
// but be careful, this is an ugly fix for a flutter_svg problem that works
// with my images
String temp = svgString.substring(svgString.indexOf('height="') + 8);
int originalHeight =
svgHeight ?? int.parse(temp.substring(0, temp.indexOf('p')));
temp = svgString.substring(svgString.indexOf('width="') + 7);
int originalWidth =
svgWidth ?? int.parse(temp.substring(0, temp.indexOf('p')));
// toPicture() and toImage() don't seem to be pixel ratio aware, so we calculate the actual sizes here
double devicePixelRatio = MediaQuery.of(context).devicePixelRatio;
double width = originalHeight *
devicePixelRatio; // where 32 is your SVG's original width
double height = originalWidth * devicePixelRatio; // same thing
// Convert to ui.Picture
final picture = svgDrawableRoot.toPicture(size: Size(width, height));
// Convert to ui.Image. toImage() takes width and height as parameters
// you need to find the best size to suit your needs and take into account the screen DPI
final image = await picture.toImage(width.toInt(), height.toInt());
ByteData bytes = await image.toByteData(format: ImageByteFormat.png);
return bytes.buffer.asUint8List();
}
Future<Uint8List> genIdenticon(BuildContext context, {int size: 100}) async {
final identicon = Jdenticon.toSvg(randomString(25), size: size);
return svgToPng(context, identicon, svgHeight: size, svgWidth: size);
}

View File

@ -48,3 +48,10 @@ String tr(String string, {Map<String, String> args}) {
return string;
}
/// Get current lang, in format aa_BB
String get lang => _currLang != null ? _currLang : "en_US";
/// Get short lang format, in format aa
String get shortLang => lang.split("_")[0];

View File

@ -4,7 +4,6 @@ import 'package:comunic/ui/routes/single_post_route.dart';
import 'package:comunic/utils/intl_utils.dart';
import 'package:comunic/utils/ui_utils.dart';
import 'package:flutter/material.dart';
import 'package:meta/meta.dart';
/// Navigation utilities
///

View File

@ -7,21 +7,21 @@ packages:
name: archive
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.13"
version: "3.1.6"
args:
dependency: transitive
description:
name: args
url: "https://pub.dartlang.org"
source: hosted
version: "1.6.0"
version: "2.3.0"
async:
dependency: transitive
description:
name: async
url: "https://pub.dartlang.org"
source: hosted
version: "2.5.0"
version: "2.8.2"
boolean_selector:
dependency: transitive
description:
@ -35,28 +35,42 @@ packages:
name: cached_network_image
url: "https://pub.dartlang.org"
source: hosted
version: "2.5.1"
version: "3.2.0"
cached_network_image_platform_interface:
dependency: transitive
description:
name: cached_network_image_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
cached_network_image_web:
dependency: transitive
description:
name: cached_network_image_web
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
characters:
dependency: transitive
description:
name: characters
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
version: "1.2.0"
charcode:
dependency: transitive
description:
name: charcode
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
version: "1.3.1"
chewie:
dependency: "direct main"
description:
name: chewie
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
version: "1.2.2"
chewie_audio:
dependency: "direct main"
description:
@ -91,14 +105,21 @@ packages:
name: connectivity
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.2"
version: "3.0.6"
connectivity_for_web:
dependency: transitive
description:
name: connectivity_for_web
url: "https://pub.dartlang.org"
source: hosted
version: "0.4.0+1"
connectivity_macos:
dependency: transitive
description:
name: connectivity_macos
url: "https://pub.dartlang.org"
source: hosted
version: "0.2.0"
version: "0.2.1+2"
connectivity_platform_interface:
dependency: transitive
description:
@ -106,41 +127,48 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
convert:
cross_file:
dependency: transitive
description:
name: convert
name: cross_file
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.1"
version: "0.3.2"
crypto:
dependency: transitive
description:
name: crypto
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.5"
version: "3.0.1"
csslib:
dependency: transitive
description:
name: csslib
url: "https://pub.dartlang.org"
source: hosted
version: "0.17.0"
version: "0.17.1"
cupertino_icons:
dependency: "direct main"
description:
name: cupertino_icons
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.2"
version: "1.0.4"
dart_webrtc:
dependency: transitive
description:
name: dart_webrtc
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.3"
dio:
dependency: "direct main"
description:
name: dio
url: "https://pub.dartlang.org"
source: hosted
version: "4.0.0-beta7"
version: "4.0.4"
emoji_picker:
dependency: "direct main"
description:
@ -168,70 +196,70 @@ packages:
name: ffi
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
version: "1.1.2"
file:
dependency: transitive
description:
name: file
url: "https://pub.dartlang.org"
source: hosted
version: "6.1.0"
version: "6.1.2"
file_picker:
dependency: "direct main"
description:
name: file_picker
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.0"
version: "4.3.0"
filesize:
dependency: "direct main"
description:
name: filesize
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.4"
version: "2.0.1"
firebase_core:
dependency: "direct main"
description:
name: firebase_core
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
version: "1.10.6"
firebase_core_platform_interface:
dependency: transitive
description:
name: firebase_core_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "4.0.0"
version: "4.2.3"
firebase_core_web:
dependency: transitive
description:
name: firebase_core_web
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
version: "1.5.3"
firebase_messaging:
dependency: "direct main"
description:
name: firebase_messaging
url: "https://pub.dartlang.org"
source: hosted
version: "9.0.0"
version: "11.2.4"
firebase_messaging_platform_interface:
dependency: transitive
description:
name: firebase_messaging_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
version: "3.1.4"
firebase_messaging_web:
dependency: transitive
description:
name: firebase_messaging_web
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
version: "2.2.5"
flutter:
dependency: "direct main"
description: flutter
@ -243,21 +271,21 @@ packages:
name: flutter_blurhash
url: "https://pub.dartlang.org"
source: hosted
version: "0.5.0"
version: "0.6.0"
flutter_cache_manager:
dependency: transitive
description:
name: flutter_cache_manager
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.2"
version: "3.3.0"
flutter_colorpicker:
dependency: "direct main"
description:
name: flutter_colorpicker
url: "https://pub.dartlang.org"
source: hosted
version: "0.3.5"
version: "1.0.3"
flutter_emoji:
dependency: "direct main"
description:
@ -271,14 +299,28 @@ packages:
name: flutter_launcher_icons
url: "https://pub.dartlang.org"
source: hosted
version: "0.8.1"
version: "0.9.2"
flutter_plugin_android_lifecycle:
dependency: transitive
description:
name: flutter_plugin_android_lifecycle
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
version: "2.0.5"
flutter_settings_ui:
dependency: "direct main"
description:
name: flutter_settings_ui
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
flutter_svg:
dependency: "direct main"
description:
name: flutter_svg
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
flutter_test:
dependency: "direct dev"
description: flutter
@ -295,7 +337,7 @@ packages:
name: flutter_webrtc
url: "https://pub.dartlang.org"
source: hosted
version: "0.5.8"
version: "0.8.0"
html:
dependency: "direct main"
description:
@ -309,7 +351,7 @@ packages:
name: http
url: "https://pub.dartlang.org"
source: hosted
version: "0.13.0"
version: "0.13.4"
http_parser:
dependency: "direct main"
description:
@ -317,41 +359,41 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "4.0.0"
identicon:
dependency: "direct main"
description:
name: identicon
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.1"
image:
dependency: transitive
description:
name: image
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.19"
version: "3.1.0"
image_cropper:
dependency: "direct main"
description:
name: image_cropper
url: "https://pub.dartlang.org"
source: hosted
version: "1.4.0"
version: "1.4.1"
image_picker:
dependency: "direct main"
description:
name: image_picker
url: "https://pub.dartlang.org"
source: hosted
version: "0.7.2+1"
version: "0.8.4+4"
image_picker_for_web:
dependency: transitive
description:
name: image_picker_for_web
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.4"
image_picker_platform_interface:
dependency: transitive
description:
name: image_picker_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
version: "2.4.1"
intl:
dependency: "direct main"
description:
@ -359,6 +401,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "0.17.0"
jdenticon_dart:
dependency: "direct main"
description:
name: jdenticon_dart
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
js:
dependency: transitive
description:
@ -372,20 +421,27 @@ packages:
name: matcher
url: "https://pub.dartlang.org"
source: hosted
version: "0.12.10"
version: "0.12.11"
meta:
dependency: transitive
description:
name: meta
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.0"
version: "1.7.0"
mime:
dependency: "direct main"
description:
name: mime
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
nested:
dependency: transitive
description:
name: nested
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
octo_image:
dependency: transitive
@ -393,14 +449,14 @@ packages:
name: octo_image
url: "https://pub.dartlang.org"
source: hosted
version: "0.3.0"
version: "1.0.1"
package_info:
dependency: "direct main"
description:
name: package_info
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
version: "2.0.2"
path:
dependency: transitive
description:
@ -408,27 +464,55 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.8.0"
path_drawing:
dependency: transitive
description:
name: path_drawing
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
path_parsing:
dependency: transitive
description:
name: path_parsing
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
path_provider:
dependency: "direct main"
description:
name: path_provider
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
version: "2.0.8"
path_provider_android:
dependency: transitive
description:
name: path_provider_android
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.11"
path_provider_ios:
dependency: transitive
description:
name: path_provider_ios
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.7"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
version: "2.1.4"
path_provider_macos:
dependency: transitive
description:
name: path_provider_macos
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
version: "2.0.4"
path_provider_platform_interface:
dependency: transitive
description:
@ -442,98 +526,98 @@ packages:
name: path_provider_windows
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
version: "2.0.4"
pedantic:
dependency: transitive
description:
name: pedantic
url: "https://pub.dartlang.org"
source: hosted
version: "1.11.0"
version: "1.11.1"
permission_handler:
dependency: "direct main"
description:
name: permission_handler
url: "https://pub.dartlang.org"
source: hosted
version: "6.1.0"
version: "8.3.0"
permission_handler_platform_interface:
dependency: transitive
description:
name: permission_handler_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.0"
version: "3.7.0"
petitparser:
dependency: transitive
description:
name: petitparser
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.0"
version: "4.4.0"
photo_view:
dependency: "direct main"
description:
name: photo_view
url: "https://pub.dartlang.org"
source: hosted
version: "0.11.1"
version: "0.13.0"
pie_chart:
dependency: "direct main"
description:
name: pie_chart
url: "https://pub.dartlang.org"
source: hosted
version: "5.0.0"
version: "5.1.0"
platform:
dependency: transitive
description:
name: platform
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.0"
version: "3.1.0"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
version: "2.0.2"
process:
dependency: transitive
description:
name: process
url: "https://pub.dartlang.org"
source: hosted
version: "4.1.0"
version: "4.2.4"
provider:
dependency: transitive
description:
name: provider
url: "https://pub.dartlang.org"
source: hosted
version: "5.0.0"
random_string:
dependency: "direct main"
description:
name: random_string
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
version: "2.3.1"
record_mp3:
dependency: "direct main"
description:
name: record_mp3
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
version: "3.0.0"
rxdart:
dependency: transitive
description:
name: rxdart
url: "https://pub.dartlang.org"
source: hosted
version: "0.25.0"
settings_ui:
dependency: "direct main"
description:
name: settings_ui
url: "https://pub.dartlang.org"
source: hosted
version: "0.6.0"
version: "0.27.3"
shared_preferences:
dependency: "direct main"
description:
@ -568,7 +652,7 @@ packages:
name: simple_gesture_detector
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.6"
version: "0.2.0"
sky_engine:
dependency: transitive
description: flutter
@ -580,21 +664,21 @@ packages:
name: source_span
url: "https://pub.dartlang.org"
source: hosted
version: "1.8.0"
version: "1.8.1"
sqflite:
dependency: "direct main"
description:
name: sqflite
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0+2"
version: "2.0.1"
sqflite_common:
dependency: transitive
description:
name: sqflite_common
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0+2"
version: "2.1.0"
stack_trace:
dependency: transitive
description:
@ -629,7 +713,7 @@ packages:
name: table_calendar
url: "https://pub.dartlang.org"
source: hosted
version: "2.3.3"
version: "3.0.3"
term_glyph:
dependency: transitive
description:
@ -643,7 +727,7 @@ packages:
name: test_api
url: "https://pub.dartlang.org"
source: hosted
version: "0.2.19"
version: "0.4.3"
typed_data:
dependency: transitive
description:
@ -657,118 +741,139 @@ packages:
name: url_launcher
url: "https://pub.dartlang.org"
source: hosted
version: "6.0.2"
version: "6.0.17"
url_launcher_android:
dependency: transitive
description:
name: url_launcher_android
url: "https://pub.dartlang.org"
source: hosted
version: "6.0.13"
url_launcher_ios:
dependency: transitive
description:
name: url_launcher_ios
url: "https://pub.dartlang.org"
source: hosted
version: "6.0.13"
url_launcher_linux:
dependency: transitive
description:
name: url_launcher_linux
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
version: "2.0.2"
url_launcher_macos:
dependency: transitive
description:
name: url_launcher_macos
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
version: "2.0.2"
url_launcher_platform_interface:
dependency: transitive
description:
name: url_launcher_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.2"
version: "2.0.4"
url_launcher_web:
dependency: transitive
description:
name: url_launcher_web
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
version: "2.0.5"
url_launcher_windows:
dependency: transitive
description:
name: url_launcher_windows
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
version: "2.0.2"
uuid:
dependency: transitive
description:
name: uuid
url: "https://pub.dartlang.org"
source: hosted
version: "2.2.2"
version: "3.0.5"
vector_math:
dependency: transitive
description:
name: vector_math
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
version: "2.1.1"
version:
dependency: "direct main"
description:
name: version
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.1"
version: "2.0.0"
video_player:
dependency: "direct main"
description:
name: video_player
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.2"
version: "2.2.10"
video_player_platform_interface:
dependency: transitive
description:
name: video_player_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "4.0.0"
version: "5.0.0"
video_player_web:
dependency: transitive
description:
name: video_player_web
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
version: "2.0.5"
video_thumbnail:
dependency: "direct main"
description:
name: video_thumbnail
url: "https://pub.dartlang.org"
source: hosted
version: "0.2.5+1"
version: "0.4.3"
wakelock:
dependency: "direct main"
description:
name: wakelock
url: "https://pub.dartlang.org"
source: hosted
version: "0.4.0"
version: "0.5.6"
wakelock_macos:
dependency: transitive
description:
name: wakelock_macos
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.0"
version: "0.4.0"
wakelock_platform_interface:
dependency: transitive
description:
name: wakelock_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "0.2.0"
version: "0.3.0"
wakelock_web:
dependency: transitive
description:
name: wakelock_web
url: "https://pub.dartlang.org"
source: hosted
version: "0.4.0"
wakelock_windows:
dependency: transitive
description:
name: wakelock_windows
url: "https://pub.dartlang.org"
source: hosted
version: "0.2.0"
web_socket_channel:
dependency: "direct main"
@ -776,14 +881,21 @@ packages:
name: web_socket_channel
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
version: "2.1.0"
webrtc_interface:
dependency: transitive
description:
name: webrtc_interface
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
win32:
dependency: transitive
description:
name: win32
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.3"
version: "2.3.3"
xdg_directories:
dependency: transitive
description:
@ -797,14 +909,14 @@ packages:
name: xml
url: "https://pub.dartlang.org"
source: hosted
version: "4.5.1"
version: "5.3.1"
yaml:
dependency: transitive
description:
name: yaml
url: "https://pub.dartlang.org"
source: hosted
version: "2.2.1"
version: "3.1.0"
sdks:
dart: ">=2.12.0 <3.0.0"
flutter: ">=1.24.0-10"
dart: ">=2.15.0 <3.0.0"
flutter: ">=2.5.0"

View File

@ -11,7 +11,7 @@ description: Comunic client
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.1.7+11
version: 1.1.10+17
environment:
sdk: ">=2.7.0 <3.0.0"
@ -31,14 +31,14 @@ dependencies:
sqflite: ^2.0.0+2
# Image picker is used whenever the user wants to send an image
image_picker: ^0.7.2+1
image_picker: ^0.8.4+4
# The HTTP client is used to make requests on the Comunic API
dio: ^4.0.0-beta7
http_parser: ^4.0.0
# This plugins allows to load remote images
cached_network_image: ^2.0.0
cached_network_image: ^3.2.0
# URL launcher is useful to open URL in the phone browser
url_launcher: ^6.0.2
@ -56,46 +56,49 @@ dependencies:
flutter_emoji: ^2.2.1+1
# Build settings UI
settings_ui: ^0.6.0
flutter_settings_ui: ^2.0.1
# Generate identicons
identicon: ^0.1.1
jdenticon_dart: ^2.0.0
# Render SVG images
flutter_svg: ^1.0.0
# Generate random strings
random_string: ^2.0.1
# Display zoomable images
photo_view: ^0.11.1
photo_view: ^0.13.0
# Check Internet connection
connectivity: ^3.0.2
# Establish WebSocket connections
web_socket_channel: ^1.1.0
web_socket_channel: ^2.1.0
# Events manager
event_bus: ^2.0.0
# WebRTC calls
flutter_webrtc: ^0.5.8
flutter_webrtc: ^0.8.0
# Prevent phone from auto-locking during calls
wakelock: ^0.4.0
wakelock: ^0.5.2
# Pick any kind of file
file_picker: ^3.0.0
file_picker: ^4.3.0
# Get information about current version
package_info: ^2.0.0
# Version manager
version: ^1.2.0
version: ^2.0.0
# Get path to temporary files
path_provider: ^2.0.1
# Format file size
filesize: ^1.0.4
filesize: ^2.0.1
# Copy content to clipboard
clipboard: ^0.1.2+8
@ -103,42 +106,42 @@ dependencies:
# Video / Audio player
video_player: ^2.0.2
chewie_audio: ^1.1.2
chewie: ^1.0.0
chewie: ^1.2.0
# Determine file mime type
mime: ^1.0.0
# Create video thumbnails
video_thumbnail: ^0.2.5+1
video_thumbnail: ^0.4.3
# Record audio file
record_mp3: ^2.1.0
record_mp3: ^3.0.0
# Request permissions
permission_handler: ^6.1.0
permission_handler: ^8.0.0+2
# Emojies picker
emoji_picker: ^0.1.0
# Color picker
flutter_colorpicker: ^0.3.5
flutter_colorpicker: ^1.0.3
# Image cropper
image_cropper: ^1.4.0
# Firebase cloud messaging (for push notifications)
firebase_core: ^1.0.1
firebase_messaging: ^9.0.0
firebase_messaging: ^11.2.4
# Forez presence
table_calendar: ^2.3.3
table_calendar: ^3.0.0
dev_dependencies:
flutter_test:
sdk: flutter
# Generate iOS application icons
flutter_launcher_icons: ^0.8.1
flutter_launcher_icons: ^0.9.2
flutter_icons:
android: false