format and merge
This commit is contained in:
commit
50638f432f
27
.drone.yml
27
.drone.yml
|
@ -201,21 +201,30 @@ steps:
|
|||
- git describe --tags > VERSION
|
||||
- powershell -command "Get-Date -Format 'yyyy-MM-dd-HH-mm'" > BUILDDATE
|
||||
- .\fetch-libcwtch-go.ps1
|
||||
-
|
||||
- name: build-windows
|
||||
image: openpriv/flutter-desktop:windows-dev
|
||||
commands:
|
||||
- flutter pub get
|
||||
- flutter build windows
|
||||
#- flutter pub get
|
||||
#- flutter build windows
|
||||
# flwtch-`cat VERSION`-`cat BUILDDATE`
|
||||
- $Env:builddir = 'deploy\flwtch-win-'
|
||||
- $Env:builddir += type .\VERSION
|
||||
- $Env:builddir += '-'
|
||||
- $Env:builddir += type .\BUILDDATE
|
||||
- echo $Env:builddir
|
||||
- $Env:buildname = 'flwtch-win-'
|
||||
- $Env:buildname += type .\VERSION
|
||||
- $Env:buildname += '-'
|
||||
- $Env:buildname += type .\BUILDDATE
|
||||
- $Env:builddir += $Env:buildname
|
||||
- $Env:zip = $Env:buildname
|
||||
- $Env:zip += '.zip'
|
||||
- $Env:sha = $Env:zip
|
||||
- $Env:sha += '.sha512'
|
||||
- mkdir deploy
|
||||
- move build\\windows\\runner\\Release $Env:builddir
|
||||
#- move build\\windows\\runner\\Release $Env:builddir
|
||||
- mkdir $Env:builddir
|
||||
- powershell -command "Expand-Archive -Path tor.zip -DestinationPath $Env:builddir\Tor"
|
||||
- powershell -command "Compress-Archive -Path $Env:builddir -DestinationPath $Env:zip"
|
||||
- powershell -command "(Get-FileHash *.zip -Algorithm sha512).Hash" > $Env:sha
|
||||
- mkdir deploy\$Env:builddir
|
||||
- move $Env:zip deploy\$Env:builddir
|
||||
- move $Env:sha deploy\$Env:builddir
|
||||
- dir deploy
|
||||
- name: deploy-windows
|
||||
image: openpriv/flutter-desktop:windows-sdk30-fdev2.2rc
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 20 KiB |
|
@ -0,0 +1,71 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Generator: Adobe Illustrator 25.2.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
id="Layer_1"
|
||||
x="0px"
|
||||
y="0px"
|
||||
viewBox="0 0 24 24"
|
||||
style="enable-background:new 0 0 24 24;"
|
||||
xml:space="preserve"
|
||||
sodipodi:docname="broken_heart_24.svg"
|
||||
inkscape:export-filename="/home/sarah/AndroidStudioProjects/flutter_app/assets/core/broken_heart_24.png"
|
||||
inkscape:export-xdpi="1280"
|
||||
inkscape:export-ydpi="1280"
|
||||
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"><metadata
|
||||
id="metadata19"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs17" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1015"
|
||||
id="namedview15"
|
||||
showgrid="false"
|
||||
inkscape:zoom="9.8333333"
|
||||
inkscape:cx="-6.344409"
|
||||
inkscape:cy="12.067375"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Layer_1" />
|
||||
<path
|
||||
d="M16.5,3c-1.7,0-3.4,0.8-4.5,2.1C10.9,3.8,9.2,3,7.5,3C4.8,3,2.6,4.9,2.1,7.4C2,7.7,12,12.5,12,12.5L16.5,3z"
|
||||
id="path2"
|
||||
style="fill:#ffffff" />
|
||||
<path
|
||||
d="M7.5,17.3c0.9,0.9,1.9,1.8,3,2.8l1.5,1.3l1.5-1.3c0.2-0.2,0.5-0.4,0.7-0.7L12,12.5L7.5,17.3z"
|
||||
id="path4"
|
||||
style="fill:#ffffff" />
|
||||
<path
|
||||
d="M12,12.5l5.5,3.7c2.5-2.5,4.1-4.6,4.4-7C22,9,12,12.5,12,12.5z"
|
||||
id="path6"
|
||||
style="fill:#ffffff" />
|
||||
<path
|
||||
d="M23,6.8c-0.2-1.8-1.2-3.4-2.8-4.2l-7.2,8.8L23,6.8z"
|
||||
id="path8"
|
||||
style="fill:#ffffff" />
|
||||
<path
|
||||
d="M0.7,9.1c0.1,2.6,1.9,4.9,4.8,7.7l5.3-4L0.7,9.1z"
|
||||
id="path10"
|
||||
style="fill:#ffffff" />
|
||||
<path
|
||||
d="M16.4,22.3c1.2-1.1,2.4-2.2,3.4-3.1l-5.5-3.7L16.4,22.3z"
|
||||
id="path12"
|
||||
style="fill:#ffffff" />
|
||||
</svg>
|
After Width: | Height: | Size: 2.4 KiB |
|
@ -363,6 +363,7 @@ class MessageState extends ChangeNotifier {
|
|||
bool _ackd = false;
|
||||
bool _error = false;
|
||||
bool _loaded = false;
|
||||
bool _malformed = false;
|
||||
|
||||
MessageState({
|
||||
BuildContext context,
|
||||
|
@ -379,6 +380,7 @@ class MessageState extends ChangeNotifier {
|
|||
get timestamp => this._timestamp;
|
||||
get ackd => this._ackd;
|
||||
get error => this._error;
|
||||
get malformed => this._malformed;
|
||||
get senderOnion => this._senderOnion;
|
||||
get senderImage => this._senderImage;
|
||||
get loaded => this._loaded;
|
||||
|
@ -399,50 +401,54 @@ class MessageState extends ChangeNotifier {
|
|||
|
||||
void tryLoad(BuildContext context) {
|
||||
Provider.of<FlwtchState>(context, listen: false).cwtch.GetMessage(profileOnion, contactHandle, messageIndex).then((jsonMessage) {
|
||||
dynamic messageWrapper = jsonDecode(jsonMessage);
|
||||
if (messageWrapper['Message'] == null || messageWrapper['Message'] == '' || messageWrapper['Message'] == '{}') {
|
||||
//todo: remove once sent group messages are prestored
|
||||
Future.delayed(const Duration(milliseconds: 2), () {
|
||||
tryLoad(context);
|
||||
});
|
||||
return;
|
||||
}
|
||||
try {
|
||||
dynamic messageWrapper = jsonDecode(jsonMessage);
|
||||
if (messageWrapper['Message'] == null || messageWrapper['Message'] == '' || messageWrapper['Message'] == '{}') {
|
||||
this._senderOnion = profileOnion;
|
||||
//todo: remove once sent group messages are prestored
|
||||
Future.delayed(const Duration(milliseconds: 2), () {
|
||||
tryLoad(context);
|
||||
});
|
||||
return;
|
||||
}
|
||||
dynamic message = jsonDecode(messageWrapper['Message']);
|
||||
this._message = message['d'];
|
||||
this._overlay = int.parse(message['o'].toString());
|
||||
this._timestamp = DateTime.tryParse(messageWrapper['Timestamp']);
|
||||
this._senderOnion = messageWrapper['PeerID'];
|
||||
this._senderImage = messageWrapper['ContactImage'];
|
||||
|
||||
dynamic message = jsonDecode(messageWrapper['Message']);
|
||||
this._message = message['d'];
|
||||
this._overlay = int.parse(message['o'].toString());
|
||||
this._timestamp = DateTime.tryParse(messageWrapper['Timestamp']);
|
||||
this._senderOnion = messageWrapper['PeerID'];
|
||||
this._senderImage = messageWrapper['ContactImage'];
|
||||
// If this is a group, store the signature
|
||||
if (contactHandle.length == 32) {
|
||||
this._signature = messageWrapper['Signature'];
|
||||
}
|
||||
|
||||
// If this is a group, store the signature
|
||||
if (contactHandle.length == 32) {
|
||||
this._signature = messageWrapper['Signature'];
|
||||
}
|
||||
|
||||
// if this is an invite, get the contact handle
|
||||
if (this.isInvite) {
|
||||
if (message['d'].toString().length == 56) {
|
||||
this._inviteTarget = message['d'];
|
||||
var targetContact = Provider.of<ProfileInfoState>(context).contactList.getContact(this._inviteTarget);
|
||||
this._inviteNick = targetContact == null ? message['d'] : targetContact.nickname;
|
||||
} else {
|
||||
var parts = message['d'].toString().split("||");
|
||||
if (parts.length == 2) {
|
||||
print("jsondecoding: " + utf8.fuse(base64).decode(parts[1].substring(5)));
|
||||
var jsonObj = jsonDecode(utf8.fuse(base64).decode(parts[1].substring(5)));
|
||||
this._inviteTarget = jsonObj['GroupID'];
|
||||
this._inviteNick = jsonObj['GroupName'];
|
||||
// if this is an invite, get the contact handle
|
||||
if (this.isInvite) {
|
||||
if (message['d'].toString().length == 56) {
|
||||
this._inviteTarget = message['d'];
|
||||
var targetContact = Provider.of<ProfileInfoState>(context).contactList.getContact(this._inviteTarget);
|
||||
this._inviteNick = targetContact == null ? message['d'] : targetContact.nickname;
|
||||
} else {
|
||||
var parts = message['d'].toString().split("||");
|
||||
if (parts.length == 2) {
|
||||
print("jsondecoding: " + utf8.fuse(base64).decode(parts[1].substring(5)));
|
||||
var jsonObj = jsonDecode(utf8.fuse(base64).decode(parts[1].substring(5)));
|
||||
this._inviteTarget = jsonObj['GroupID'];
|
||||
this._inviteNick = jsonObj['GroupName'];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this._loaded = true;
|
||||
this._loaded = true;
|
||||
|
||||
//update ackd and error last as they are changenotified
|
||||
this.ackd = messageWrapper['Acknowledged'];
|
||||
if (messageWrapper['Error'] != null) {
|
||||
this.error = true;
|
||||
//update ackd and error last as they are changenotified
|
||||
this.ackd = messageWrapper['Acknowledged'];
|
||||
if (messageWrapper['Error'] != null) {
|
||||
this.error = true;
|
||||
}
|
||||
} catch (e) {
|
||||
this._malformed = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -0,0 +1,63 @@
|
|||
import 'dart:convert';
|
||||
import 'dart:ffi';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import '../settings.dart';
|
||||
|
||||
final Color malformedColor = Color(0xFFE85DA1);
|
||||
|
||||
// MalformedBubble is displayed in the case of a malformed message
|
||||
class MalformedBubble extends StatefulWidget {
|
||||
@override
|
||||
MalformedBubbleState createState() => MalformedBubbleState();
|
||||
}
|
||||
|
||||
class MalformedBubbleState extends State<MalformedBubble> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return LayoutBuilder(builder: (context, constraints) {
|
||||
return Center(
|
||||
widthFactor: 1.0,
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
color: malformedColor,
|
||||
border: Border.all(color: malformedColor, width: 1),
|
||||
borderRadius: BorderRadius.only(
|
||||
topLeft: Radius.zero,
|
||||
topRight: Radius.zero,
|
||||
bottomLeft: Radius.zero,
|
||||
bottomRight: Radius.zero,
|
||||
),
|
||||
),
|
||||
child: Center(
|
||||
widthFactor: 1.0,
|
||||
child: Padding(
|
||||
padding: EdgeInsets.all(9.0),
|
||||
child: Row(mainAxisSize: MainAxisSize.min, children: [
|
||||
Center(
|
||||
widthFactor: 1,
|
||||
child: Padding(
|
||||
padding: EdgeInsets.all(4),
|
||||
child: Image(
|
||||
image: AssetImage("assets/core/broken_heart_24.png"),
|
||||
filterQuality: FilterQuality.medium,
|
||||
// We need some theme specific blending here...we might want to consider making this a theme level attribute
|
||||
colorBlendMode: BlendMode.srcIn,
|
||||
color: Provider.of<Settings>(context).theme.mainTextColor(),
|
||||
isAntiAlias: false,
|
||||
width: 32,
|
||||
height: 32))),
|
||||
Center(
|
||||
widthFactor: 1.0,
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [Text("Malformed Message")],
|
||||
))
|
||||
])))));
|
||||
});
|
||||
}
|
||||
}
|
|
@ -9,6 +9,7 @@ import '../main.dart';
|
|||
import '../model.dart';
|
||||
import '../settings.dart';
|
||||
import 'invitationbubble.dart';
|
||||
import 'malformedbubble.dart';
|
||||
import 'messagebubble.dart';
|
||||
import 'messageloadingbubble.dart';
|
||||
|
||||
|
@ -23,9 +24,17 @@ class _MessageRowState extends State<MessageRow> {
|
|||
@override
|
||||
Widget build(BuildContext context) {
|
||||
var fromMe = Provider.of<MessageState>(context).senderOnion == Provider.of<ProfileInfoState>(context).onion;
|
||||
var malformed = Provider.of<MessageState>(context).malformed;
|
||||
|
||||
Widget wdgBubble =
|
||||
Flexible(flex: 3, fit: FlexFit.loose, child: Provider.of<MessageState>(context).loaded == true ? widgetForOverlay(Provider.of<MessageState>(context).overlay) : MessageLoadingBubble());
|
||||
// If the message is malformed then override fromme as we can't trust it
|
||||
if (malformed) {
|
||||
fromMe = false;
|
||||
}
|
||||
|
||||
Widget wdgBubble = Flexible(
|
||||
flex: 3,
|
||||
fit: FlexFit.loose,
|
||||
child: malformed ? MalformedBubble() : (Provider.of<MessageState>(context).loaded == true ? widgetForOverlay(Provider.of<MessageState>(context).overlay) : MessageLoadingBubble()));
|
||||
Widget wdgIcons = Icon(Icons.delete_forever_outlined, color: Provider.of<Settings>(context).theme.dropShadowColor());
|
||||
Widget wdgSpacer = Expanded(child: SizedBox(width: 60, height: 10));
|
||||
var widgetRow = <Widget>[];
|
||||
|
@ -39,12 +48,13 @@ class _MessageRowState extends State<MessageRow> {
|
|||
} else {
|
||||
var contact = Provider.of<ContactInfoState>(context);
|
||||
Widget wdgPortrait = GestureDetector(
|
||||
onTap: _btnAdd,
|
||||
child: ProfileImage(
|
||||
diameter: 48.0,
|
||||
imagePath: Provider.of<MessageState>(context).senderImage ?? contact.imagePath,
|
||||
//maskOut: contact.status != "Authenticated",
|
||||
border: contact.status == "Authenticated" ? Provider.of<Settings>(context).theme.portraitOnlineBorderColor() : Provider.of<Settings>(context).theme.portraitOfflineBorderColor()));
|
||||
child: Padding(
|
||||
padding: EdgeInsets.all(4.0),
|
||||
child: ProfileImage(
|
||||
diameter: 48.0,
|
||||
imagePath: Provider.of<MessageState>(context).senderImage ?? contact.imagePath,
|
||||
//maskOut: contact.status != "Authenticated",
|
||||
border: contact.status == "Authenticated" ? Provider.of<Settings>(context).theme.portraitOnlineBorderColor() : Provider.of<Settings>(context).theme.portraitOfflineBorderColor())));
|
||||
|
||||
widgetRow = <Widget>[
|
||||
wdgPortrait,
|
||||
|
|
Loading…
Reference in New Issue