mirror of
https://github.com/twonlyapp/twonly-app.git
synced 2026-01-16 05:58:40 +00:00
fix #103
This commit is contained in:
parent
8763313c41
commit
1bd33b2013
12 changed files with 272 additions and 137 deletions
|
|
@ -5,10 +5,9 @@ import 'package:pie_menu/pie_menu.dart';
|
||||||
import 'package:twonly/globals.dart';
|
import 'package:twonly/globals.dart';
|
||||||
import 'package:twonly/src/database/twonly_database.dart';
|
import 'package:twonly/src/database/twonly_database.dart';
|
||||||
import 'package:twonly/src/utils/misc.dart';
|
import 'package:twonly/src/utils/misc.dart';
|
||||||
import 'package:twonly/src/views/camera_to_share/share_image_view.dart';
|
import 'package:twonly/src/views/camera_to_share/camera_send_to_view.dart';
|
||||||
import 'package:twonly/src/views/chats/chat_item_details_view.dart';
|
import 'package:twonly/src/views/chats/chat_item_details_view.dart';
|
||||||
import 'package:twonly/src/views/contact/contact_verify_view.dart';
|
import 'package:twonly/src/views/contact/contact_verify_view.dart';
|
||||||
import 'package:twonly/src/views/home_view.dart';
|
|
||||||
|
|
||||||
class UserContextMenu extends StatefulWidget {
|
class UserContextMenu extends StatefulWidget {
|
||||||
final Widget child;
|
final Widget child;
|
||||||
|
|
@ -51,6 +50,7 @@ class _UserContextMenuState extends State<UserContextMenu> {
|
||||||
},
|
},
|
||||||
child: FaIcon(FontAwesomeIcons.boxOpen),
|
child: FaIcon(FontAwesomeIcons.boxOpen),
|
||||||
),
|
),
|
||||||
|
if (!widget.contact.verified)
|
||||||
PieAction(
|
PieAction(
|
||||||
tooltip: Text(context.lang.contextMenuVerifyUser),
|
tooltip: Text(context.lang.contextMenuVerifyUser),
|
||||||
onSelect: () {
|
onSelect: () {
|
||||||
|
|
@ -60,9 +60,7 @@ class _UserContextMenuState extends State<UserContextMenu> {
|
||||||
},
|
},
|
||||||
));
|
));
|
||||||
},
|
},
|
||||||
child: widget.contact.verified
|
child: const Icon(Icons.gpp_maybe_rounded),
|
||||||
? FaIcon(FontAwesomeIcons.shieldHeart)
|
|
||||||
: const Icon(Icons.gpp_maybe_rounded),
|
|
||||||
),
|
),
|
||||||
PieAction(
|
PieAction(
|
||||||
tooltip: Text(context.lang.contextMenuOpenChat),
|
tooltip: Text(context.lang.contextMenuOpenChat),
|
||||||
|
|
@ -78,8 +76,11 @@ class _UserContextMenuState extends State<UserContextMenu> {
|
||||||
PieAction(
|
PieAction(
|
||||||
tooltip: Text(context.lang.contextMenuSendImage),
|
tooltip: Text(context.lang.contextMenuSendImage),
|
||||||
onSelect: () {
|
onSelect: () {
|
||||||
globalSendNextMediaToUser = widget.contact;
|
Navigator.push(context, MaterialPageRoute(
|
||||||
globalUpdateOfHomeViewPageIndex(0);
|
builder: (context) {
|
||||||
|
return CameraSendToView(widget.contact);
|
||||||
|
},
|
||||||
|
));
|
||||||
},
|
},
|
||||||
child: const FaIcon(FontAwesomeIcons.camera),
|
child: const FaIcon(FontAwesomeIcons.camera),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@
|
||||||
"registerSubmitButton": "Jetzt registrieren!",
|
"registerSubmitButton": "Jetzt registrieren!",
|
||||||
"newMessageTitle": "Neue Nachricht",
|
"newMessageTitle": "Neue Nachricht",
|
||||||
"chatsTapToSend": "Klicke, um dein erstes Bild zu teilen.",
|
"chatsTapToSend": "Klicke, um dein erstes Bild zu teilen.",
|
||||||
|
"cameraPreviewSendTo": "Senden an",
|
||||||
"shareImageTitle": "Teilen mit",
|
"shareImageTitle": "Teilen mit",
|
||||||
"shareImageBestFriends": "Beste Freunde",
|
"shareImageBestFriends": "Beste Freunde",
|
||||||
"shareImagedEditorSendImage": "Senden",
|
"shareImagedEditorSendImage": "Senden",
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,8 @@
|
||||||
"@newMessageTitle": {},
|
"@newMessageTitle": {},
|
||||||
"chatsTapToSend": "Click to send your first image",
|
"chatsTapToSend": "Click to send your first image",
|
||||||
"@chatsTapToSend": {},
|
"@chatsTapToSend": {},
|
||||||
|
"cameraPreviewSendTo": "Send to",
|
||||||
|
"@cameraPreviewSendTo": {},
|
||||||
"shareImageTitle": "Share with",
|
"shareImageTitle": "Share with",
|
||||||
"@shareImageTitle": {},
|
"@shareImageTitle": {},
|
||||||
"shareImageBestFriends": "Best friends",
|
"shareImageBestFriends": "Best friends",
|
||||||
|
|
|
||||||
|
|
@ -7,43 +7,17 @@ import 'package:font_awesome_flutter/font_awesome_flutter.dart';
|
||||||
import 'package:screenshot/screenshot.dart';
|
import 'package:screenshot/screenshot.dart';
|
||||||
import 'package:twonly/globals.dart';
|
import 'package:twonly/globals.dart';
|
||||||
import 'package:twonly/src/components/zoom_selector.dart';
|
import 'package:twonly/src/components/zoom_selector.dart';
|
||||||
|
import 'package:twonly/src/database/daos/contacts_dao.dart';
|
||||||
|
import 'package:twonly/src/database/twonly_database.dart';
|
||||||
import 'package:twonly/src/utils/misc.dart';
|
import 'package:twonly/src/utils/misc.dart';
|
||||||
import 'package:twonly/src/components/image_editor/action_button.dart';
|
import 'package:twonly/src/components/image_editor/action_button.dart';
|
||||||
import 'package:twonly/src/components/media_view_sizing.dart';
|
import 'package:twonly/src/components/media_view_sizing.dart';
|
||||||
import 'package:twonly/src/components/permissions_view.dart';
|
import 'package:twonly/src/components/permissions_view.dart';
|
||||||
import 'package:twonly/src/views/camera_to_share/share_image_editor_view.dart';
|
import 'package:twonly/src/views/camera_to_share/share_image_editor_view.dart';
|
||||||
|
|
||||||
class CameraPreviewViewPermission extends StatefulWidget {
|
|
||||||
const CameraPreviewViewPermission({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<CameraPreviewViewPermission> createState() =>
|
|
||||||
_CameraPreviewViewPermission();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _CameraPreviewViewPermission extends State<CameraPreviewViewPermission> {
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return FutureBuilder(
|
|
||||||
future: checkPermissions(),
|
|
||||||
builder: (context, snap) {
|
|
||||||
if (snap.hasData) {
|
|
||||||
if (snap.data!) {
|
|
||||||
return CameraPreviewView();
|
|
||||||
} else {
|
|
||||||
return PermissionHandlerView(onSuccess: () {
|
|
||||||
setState(() {});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return Container();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class CameraPreviewView extends StatefulWidget {
|
class CameraPreviewView extends StatefulWidget {
|
||||||
const CameraPreviewView({super.key});
|
const CameraPreviewView({super.key, this.sendTo});
|
||||||
|
final Contact? sendTo;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<CameraPreviewView> createState() => _CameraPreviewViewState();
|
State<CameraPreviewView> createState() => _CameraPreviewViewState();
|
||||||
|
|
@ -171,12 +145,12 @@ class _CameraPreviewViewState extends State<CameraPreviewView> {
|
||||||
setState(() {
|
setState(() {
|
||||||
sharePreviewIsShown = true;
|
sharePreviewIsShown = true;
|
||||||
});
|
});
|
||||||
await Navigator.push(
|
bool? shoudReturn = await Navigator.push(
|
||||||
context,
|
context,
|
||||||
PageRouteBuilder(
|
PageRouteBuilder(
|
||||||
opaque: false,
|
opaque: false,
|
||||||
pageBuilder: (context, a1, a2) =>
|
pageBuilder: (context, a1, a2) =>
|
||||||
ShareImageEditorView(imageBytes: imageBytes),
|
ShareImageEditorView(imageBytes: imageBytes, sendTo: widget.sendTo),
|
||||||
transitionsBuilder: (context, animation, secondaryAnimation, child) {
|
transitionsBuilder: (context, animation, secondaryAnimation, child) {
|
||||||
return child;
|
return child;
|
||||||
},
|
},
|
||||||
|
|
@ -184,6 +158,10 @@ class _CameraPreviewViewState extends State<CameraPreviewView> {
|
||||||
reverseTransitionDuration: Duration.zero,
|
reverseTransitionDuration: Duration.zero,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
if (shoudReturn != null && shoudReturn) {
|
||||||
|
if (!context.mounted) return;
|
||||||
|
return Navigator.pop(context);
|
||||||
|
}
|
||||||
// does not work??
|
// does not work??
|
||||||
//await controller.resumePreview();
|
//await controller.resumePreview();
|
||||||
selectCamera(0);
|
selectCamera(0);
|
||||||
|
|
@ -201,6 +179,19 @@ class _CameraPreviewViewState extends State<CameraPreviewView> {
|
||||||
bool get isFront =>
|
bool get isFront =>
|
||||||
controller.description.lensDirection == CameraLensDirection.front;
|
controller.description.lensDirection == CameraLensDirection.front;
|
||||||
|
|
||||||
|
Future onPanUpdate(details) async {
|
||||||
|
if (isFront) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var diff = basePanY - details.localPosition.dy;
|
||||||
|
if (diff > 200) diff = 200;
|
||||||
|
if (diff < -200) diff = -200;
|
||||||
|
var tmp = (diff / 200 * (7 * 2)).toInt() / 2;
|
||||||
|
tmp = baseScaleFactor + tmp;
|
||||||
|
if (tmp < 1) tmp = 1;
|
||||||
|
updateScaleFactor(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
if (cameraId >= gCameras.length) {
|
if (cameraId >= gCameras.length) {
|
||||||
|
|
@ -215,33 +206,11 @@ class _CameraPreviewViewState extends State<CameraPreviewView> {
|
||||||
borderRadius: BorderRadius.circular(22),
|
borderRadius: BorderRadius.circular(22),
|
||||||
child: Stack(
|
child: Stack(
|
||||||
children: [
|
children: [
|
||||||
(controller.value.isInitialized)
|
CameraPreviewWidget(
|
||||||
? Positioned.fill(
|
controller: controller,
|
||||||
child: Screenshot(
|
screenshotController: screenshotController,
|
||||||
controller: screenshotController,
|
isFront: isFront,
|
||||||
child: AspectRatio(
|
|
||||||
aspectRatio: 9 / 16,
|
|
||||||
child: ClipRect(
|
|
||||||
child: FittedBox(
|
|
||||||
fit: BoxFit.cover,
|
|
||||||
child: SizedBox(
|
|
||||||
width: controller.value.previewSize!.height,
|
|
||||||
height: controller.value.previewSize!.width,
|
|
||||||
child: Transform(
|
|
||||||
alignment: Alignment.center,
|
|
||||||
transform: Matrix4.rotationY(
|
|
||||||
(isFront && Platform.isAndroid)
|
|
||||||
? 3.14
|
|
||||||
: 0),
|
|
||||||
child: CameraPreview(controller),
|
|
||||||
),
|
),
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
: Container(),
|
|
||||||
Positioned.fill(
|
Positioned.fill(
|
||||||
child: GestureDetector(
|
child: GestureDetector(
|
||||||
onPanStart: (details) async {
|
onPanStart: (details) async {
|
||||||
|
|
@ -253,23 +222,14 @@ class _CameraPreviewViewState extends State<CameraPreviewView> {
|
||||||
baseScaleFactor = scaleFactor;
|
baseScaleFactor = scaleFactor;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
onPanUpdate: (details) async {
|
onPanUpdate: onPanUpdate,
|
||||||
if (isFront) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var diff = basePanY - details.localPosition.dy;
|
|
||||||
if (diff > 200) diff = 200;
|
|
||||||
if (diff < -200) diff = -200;
|
|
||||||
var tmp = (diff / 200 * (7 * 2)).toInt() / 2;
|
|
||||||
tmp = baseScaleFactor + tmp;
|
|
||||||
if (tmp < 1) tmp = 1;
|
|
||||||
updateScaleFactor(tmp);
|
|
||||||
},
|
|
||||||
onDoubleTap: () async {
|
onDoubleTap: () async {
|
||||||
selectCamera((cameraId + 1) % 2);
|
selectCamera((cameraId + 1) % 2);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
if (!sharePreviewIsShown && widget.sendTo != null)
|
||||||
|
SendToWidget(sendTo: getContactDisplayName(widget.sendTo!)),
|
||||||
if (!sharePreviewIsShown)
|
if (!sharePreviewIsShown)
|
||||||
Positioned(
|
Positioned(
|
||||||
right: 5,
|
right: 5,
|
||||||
|
|
@ -362,6 +322,18 @@ class _CameraPreviewViewState extends State<CameraPreviewView> {
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
if (!sharePreviewIsShown && widget.sendTo != null)
|
||||||
|
Positioned(
|
||||||
|
left: 5,
|
||||||
|
top: 10,
|
||||||
|
child: ActionButton(
|
||||||
|
FontAwesomeIcons.xmark,
|
||||||
|
tooltipText: context.lang.close,
|
||||||
|
onPressed: () async {
|
||||||
|
Navigator.pop(context);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
if (showSelfieFlash)
|
if (showSelfieFlash)
|
||||||
Positioned.fill(
|
Positioned.fill(
|
||||||
child: ClipRRect(
|
child: ClipRRect(
|
||||||
|
|
@ -376,3 +348,130 @@ class _CameraPreviewViewState extends State<CameraPreviewView> {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class SendToWidget extends StatelessWidget {
|
||||||
|
final String sendTo;
|
||||||
|
|
||||||
|
const SendToWidget({
|
||||||
|
super.key,
|
||||||
|
required this.sendTo,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
TextStyle textStyle = TextStyle(
|
||||||
|
color: Colors.white,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
fontSize: 24,
|
||||||
|
decoration: TextDecoration.none,
|
||||||
|
shadows: [
|
||||||
|
Shadow(
|
||||||
|
color: const Color.fromARGB(122, 0, 0, 0),
|
||||||
|
blurRadius: 5.0,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
|
TextStyle boldTextStyle = textStyle.copyWith(
|
||||||
|
fontWeight: FontWeight.normal,
|
||||||
|
fontSize: 28,
|
||||||
|
);
|
||||||
|
|
||||||
|
return Positioned(
|
||||||
|
right: 0,
|
||||||
|
left: 0,
|
||||||
|
top: 50,
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
context.lang.cameraPreviewSendTo,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: textStyle,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
sendTo,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: boldTextStyle, // Use the bold text style here
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
String getContactDisplayName(String contact) {
|
||||||
|
// Replace this with your actual logic to get the contact display name
|
||||||
|
return contact; // Placeholder implementation
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class CameraPreviewWidget extends StatelessWidget {
|
||||||
|
final CameraController controller;
|
||||||
|
final ScreenshotController screenshotController;
|
||||||
|
final bool isFront;
|
||||||
|
|
||||||
|
const CameraPreviewWidget({
|
||||||
|
super.key,
|
||||||
|
required this.controller,
|
||||||
|
required this.screenshotController,
|
||||||
|
required this.isFront,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return (controller.value.isInitialized)
|
||||||
|
? Positioned.fill(
|
||||||
|
child: Screenshot(
|
||||||
|
controller: screenshotController,
|
||||||
|
child: AspectRatio(
|
||||||
|
aspectRatio: 9 / 16,
|
||||||
|
child: ClipRect(
|
||||||
|
child: FittedBox(
|
||||||
|
fit: BoxFit.cover,
|
||||||
|
child: SizedBox(
|
||||||
|
width: controller.value.previewSize!.height,
|
||||||
|
height: controller.value.previewSize!.width,
|
||||||
|
child: Transform(
|
||||||
|
alignment: Alignment.center,
|
||||||
|
transform: Matrix4.rotationY(
|
||||||
|
(isFront && Platform.isAndroid) ? 3.14 : 0),
|
||||||
|
child: CameraPreview(controller),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
: Container();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class CameraPreviewViewPermission extends StatefulWidget {
|
||||||
|
const CameraPreviewViewPermission({super.key, this.sendTo});
|
||||||
|
final Contact? sendTo;
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<CameraPreviewViewPermission> createState() =>
|
||||||
|
_CameraPreviewViewPermission();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _CameraPreviewViewPermission extends State<CameraPreviewViewPermission> {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return FutureBuilder(
|
||||||
|
future: checkPermissions(),
|
||||||
|
builder: (context, snap) {
|
||||||
|
if (snap.hasData) {
|
||||||
|
if (snap.data!) {
|
||||||
|
return CameraPreviewView(sendTo: widget.sendTo);
|
||||||
|
} else {
|
||||||
|
return PermissionHandlerView(onSuccess: () {
|
||||||
|
setState(() {});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return Container();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
19
lib/src/views/camera_to_share/camera_send_to_view.dart
Normal file
19
lib/src/views/camera_to_share/camera_send_to_view.dart
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:twonly/src/database/twonly_database.dart';
|
||||||
|
import 'package:twonly/src/views/camera_to_share/camera_preview_view.dart';
|
||||||
|
|
||||||
|
class CameraSendToView extends StatefulWidget {
|
||||||
|
const CameraSendToView(this.sendTo, {super.key});
|
||||||
|
final Contact sendTo;
|
||||||
|
@override
|
||||||
|
State<CameraSendToView> createState() => CameraSendToViewState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class CameraSendToViewState extends State<CameraSendToView> {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
body: CameraPreviewViewPermission(sendTo: widget.sendTo),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -17,15 +17,16 @@ import 'package:twonly/src/components/image_editor/data/layer.dart';
|
||||||
import 'package:twonly/src/components/image_editor/layers_viewer.dart';
|
import 'package:twonly/src/components/image_editor/layers_viewer.dart';
|
||||||
import 'package:twonly/src/components/image_editor/modules/all_emojis.dart';
|
import 'package:twonly/src/components/image_editor/modules/all_emojis.dart';
|
||||||
import 'package:screenshot/screenshot.dart';
|
import 'package:screenshot/screenshot.dart';
|
||||||
import 'package:twonly/src/views/home_view.dart';
|
|
||||||
|
|
||||||
List<Layer> layers = [];
|
List<Layer> layers = [];
|
||||||
List<Layer> undoLayers = [];
|
List<Layer> undoLayers = [];
|
||||||
List<Layer> removedLayers = [];
|
List<Layer> removedLayers = [];
|
||||||
|
|
||||||
class ShareImageEditorView extends StatefulWidget {
|
class ShareImageEditorView extends StatefulWidget {
|
||||||
const ShareImageEditorView({super.key, required this.imageBytes});
|
const ShareImageEditorView(
|
||||||
|
{super.key, required this.imageBytes, this.sendTo});
|
||||||
final Future<Uint8List?> imageBytes;
|
final Future<Uint8List?> imageBytes;
|
||||||
|
final Contact? sendTo;
|
||||||
@override
|
@override
|
||||||
State<ShareImageEditorView> createState() => _ShareImageEditorView();
|
State<ShareImageEditorView> createState() => _ShareImageEditorView();
|
||||||
}
|
}
|
||||||
|
|
@ -187,7 +188,8 @@ class _ShareImageEditorView extends State<ShareImageEditorView> {
|
||||||
ActionButton(
|
ActionButton(
|
||||||
FontAwesomeIcons.rotateLeft,
|
FontAwesomeIcons.rotateLeft,
|
||||||
tooltipText: context.lang.undo,
|
tooltipText: context.lang.undo,
|
||||||
disable: layers.length <= 2 && removedLayers.isEmpty,
|
disable: layers.where((x) => x.isDeleted).length <= 2 &&
|
||||||
|
removedLayers.isEmpty,
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
if (removedLayers.isNotEmpty) {
|
if (removedLayers.isNotEmpty) {
|
||||||
layers.add(removedLayers.removeLast());
|
layers.add(removedLayers.removeLast());
|
||||||
|
|
@ -261,9 +263,8 @@ class _ShareImageEditorView extends State<ShareImageEditorView> {
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
pixelRatio = MediaQuery.of(context).devicePixelRatio;
|
pixelRatio = MediaQuery.of(context).devicePixelRatio;
|
||||||
|
|
||||||
if (globalSendNextMediaToUser != null) {
|
if (widget.sendTo != null) {
|
||||||
sendNextMediaToUserName =
|
sendNextMediaToUserName = getContactDisplayName(widget.sendTo!);
|
||||||
getContactDisplayName(globalSendNextMediaToUser!);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
|
|
@ -309,8 +310,8 @@ class _ShareImageEditorView extends State<ShareImageEditorView> {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Positioned(
|
Positioned(
|
||||||
top: 5,
|
top: 10,
|
||||||
left: 0,
|
left: 5,
|
||||||
right: 0,
|
right: 0,
|
||||||
child: SafeArea(
|
child: SafeArea(
|
||||||
child: Row(
|
child: Row(
|
||||||
|
|
@ -392,16 +393,20 @@ class _ShareImageEditorView extends State<ShareImageEditorView> {
|
||||||
),
|
),
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
Future<Uint8List?> imageBytes = getMergedImage();
|
Future<Uint8List?> imageBytes = getMergedImage();
|
||||||
Navigator.push(
|
bool? wasSend = await Navigator.push(
|
||||||
context,
|
context,
|
||||||
MaterialPageRoute(
|
MaterialPageRoute(
|
||||||
builder: (context) => ShareImageView(
|
builder: (context) => ShareImageView(
|
||||||
imageBytesFuture: imageBytes,
|
imageBytesFuture: imageBytes,
|
||||||
isRealTwonly: _isRealTwonly,
|
isRealTwonly: _isRealTwonly,
|
||||||
maxShowTime: maxShowTime,
|
maxShowTime: maxShowTime,
|
||||||
|
preselectedUser: widget.sendTo,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
if (wasSend != null && wasSend && context.mounted) {
|
||||||
|
Navigator.pop(context, true);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
child: FaIcon(FontAwesomeIcons.userPlus),
|
child: FaIcon(FontAwesomeIcons.userPlus),
|
||||||
),
|
),
|
||||||
|
|
@ -420,7 +425,7 @@ class _ShareImageEditorView extends State<ShareImageEditorView> {
|
||||||
: FaIcon(FontAwesomeIcons.solidPaperPlane),
|
: FaIcon(FontAwesomeIcons.solidPaperPlane),
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
if (sendingImage) return;
|
if (sendingImage) return;
|
||||||
if (globalSendNextMediaToUser != null) {
|
if (widget.sendTo != null) {
|
||||||
setState(() {
|
setState(() {
|
||||||
sendingImage = true;
|
sendingImage = true;
|
||||||
});
|
});
|
||||||
|
|
@ -431,26 +436,29 @@ class _ShareImageEditorView extends State<ShareImageEditorView> {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
sendImage(
|
sendImage(
|
||||||
[globalSendNextMediaToUser!.userId],
|
[widget.sendTo!.userId],
|
||||||
imageBytes,
|
imageBytes,
|
||||||
_isRealTwonly,
|
_isRealTwonly,
|
||||||
maxShowTime,
|
maxShowTime,
|
||||||
);
|
);
|
||||||
Navigator.popUntil(context, (route) => route.isFirst);
|
Navigator.pop(context, true);
|
||||||
globalUpdateOfHomeViewPageIndex(1);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Future<Uint8List?> imageBytes = getMergedImage();
|
Future<Uint8List?> imageBytes = getMergedImage();
|
||||||
Navigator.push(
|
bool? wasSend = await Navigator.push(
|
||||||
context,
|
context,
|
||||||
MaterialPageRoute(
|
MaterialPageRoute(
|
||||||
builder: (context) => ShareImageView(
|
builder: (context) => ShareImageView(
|
||||||
imageBytesFuture: imageBytes,
|
imageBytesFuture: imageBytes,
|
||||||
isRealTwonly: _isRealTwonly,
|
isRealTwonly: _isRealTwonly,
|
||||||
maxShowTime: maxShowTime,
|
maxShowTime: maxShowTime,
|
||||||
|
preselectedUser: widget.sendTo,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
if (wasSend != null && wasSend && context.mounted) {
|
||||||
|
Navigator.pop(context, true);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
style: ButtonStyle(
|
style: ButtonStyle(
|
||||||
padding: WidgetStateProperty.all<EdgeInsets>(
|
padding: WidgetStateProperty.all<EdgeInsets>(
|
||||||
|
|
|
||||||
|
|
@ -15,17 +15,17 @@ import 'package:twonly/src/providers/api/media.dart';
|
||||||
import 'package:twonly/src/utils/misc.dart';
|
import 'package:twonly/src/utils/misc.dart';
|
||||||
import 'package:twonly/src/views/home_view.dart';
|
import 'package:twonly/src/views/home_view.dart';
|
||||||
|
|
||||||
Contact? globalSendNextMediaToUser;
|
|
||||||
|
|
||||||
class ShareImageView extends StatefulWidget {
|
class ShareImageView extends StatefulWidget {
|
||||||
const ShareImageView(
|
const ShareImageView(
|
||||||
{super.key,
|
{super.key,
|
||||||
required this.imageBytesFuture,
|
required this.imageBytesFuture,
|
||||||
required this.isRealTwonly,
|
required this.isRealTwonly,
|
||||||
required this.maxShowTime});
|
required this.maxShowTime,
|
||||||
|
this.preselectedUser});
|
||||||
final Future<Uint8List?> imageBytesFuture;
|
final Future<Uint8List?> imageBytesFuture;
|
||||||
final bool isRealTwonly;
|
final bool isRealTwonly;
|
||||||
final int maxShowTime;
|
final int maxShowTime;
|
||||||
|
final Contact? preselectedUser;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<ShareImageView> createState() => _ShareImageView();
|
State<ShareImageView> createState() => _ShareImageView();
|
||||||
|
|
@ -47,8 +47,8 @@ class _ShareImageView extends State<ShareImageView> {
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
|
|
||||||
if (globalSendNextMediaToUser != null) {
|
if (widget.preselectedUser != null) {
|
||||||
_selectedUserIds.add(globalSendNextMediaToUser!.userId);
|
_selectedUserIds.add(widget.preselectedUser!.userId);
|
||||||
}
|
}
|
||||||
|
|
||||||
Stream<List<Contact>> allContacts =
|
Stream<List<Contact>> allContacts =
|
||||||
|
|
@ -233,9 +233,13 @@ class _ShareImageView extends State<ShareImageView> {
|
||||||
widget.maxShowTime,
|
widget.maxShowTime,
|
||||||
);
|
);
|
||||||
if (context.mounted) {
|
if (context.mounted) {
|
||||||
|
if (widget.preselectedUser != null) {
|
||||||
|
Navigator.pop(context, true);
|
||||||
|
} else {
|
||||||
Navigator.popUntil(context, (route) => route.isFirst);
|
Navigator.popUntil(context, (route) => route.isFirst);
|
||||||
globalUpdateOfHomeViewPageIndex(1);
|
globalUpdateOfHomeViewPageIndex(1);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
style: ButtonStyle(
|
style: ButtonStyle(
|
||||||
padding: WidgetStateProperty.all<EdgeInsets>(
|
padding: WidgetStateProperty.all<EdgeInsets>(
|
||||||
|
|
|
||||||
|
|
@ -17,11 +17,10 @@ import 'package:twonly/src/json_models/message.dart';
|
||||||
import 'package:twonly/src/providers/api/api.dart';
|
import 'package:twonly/src/providers/api/api.dart';
|
||||||
import 'package:twonly/src/providers/api/media.dart';
|
import 'package:twonly/src/providers/api/media.dart';
|
||||||
import 'package:twonly/src/services/notification_service.dart';
|
import 'package:twonly/src/services/notification_service.dart';
|
||||||
import 'package:twonly/src/views/camera_to_share/share_image_view.dart';
|
import 'package:twonly/src/views/camera_to_share/camera_send_to_view.dart';
|
||||||
import 'package:twonly/src/views/chats/media_viewer_view.dart';
|
import 'package:twonly/src/views/chats/media_viewer_view.dart';
|
||||||
import 'package:twonly/src/utils/misc.dart';
|
import 'package:twonly/src/utils/misc.dart';
|
||||||
import 'package:twonly/src/views/contact/contact_view.dart';
|
import 'package:twonly/src/views/contact/contact_view.dart';
|
||||||
import 'package:twonly/src/views/home_view.dart';
|
|
||||||
|
|
||||||
class ChatListEntry extends StatelessWidget {
|
class ChatListEntry extends StatelessWidget {
|
||||||
const ChatListEntry(
|
const ChatListEntry(
|
||||||
|
|
@ -442,10 +441,11 @@ class _ChatItemDetailsViewState extends State<ChatItemDetailsView> {
|
||||||
: IconButton(
|
: IconButton(
|
||||||
icon: FaIcon(FontAwesomeIcons.camera),
|
icon: FaIcon(FontAwesomeIcons.camera),
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
globalSendNextMediaToUser = user;
|
Navigator.push(context, MaterialPageRoute(
|
||||||
globalUpdateOfHomeViewPageIndex(0);
|
builder: (context) {
|
||||||
Navigator.popUntil(
|
return CameraSendToView(widget.contact);
|
||||||
context, (route) => route.isFirst);
|
},
|
||||||
|
));
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -16,11 +16,10 @@ import 'package:twonly/src/json_models/message.dart';
|
||||||
import 'package:twonly/src/providers/api/media.dart';
|
import 'package:twonly/src/providers/api/media.dart';
|
||||||
import 'package:twonly/src/providers/connection_provider.dart';
|
import 'package:twonly/src/providers/connection_provider.dart';
|
||||||
import 'package:twonly/src/utils/misc.dart';
|
import 'package:twonly/src/utils/misc.dart';
|
||||||
import 'package:twonly/src/views/camera_to_share/share_image_view.dart';
|
import 'package:twonly/src/views/camera_to_share/camera_send_to_view.dart';
|
||||||
import 'package:twonly/src/views/chats/chat_item_details_view.dart';
|
import 'package:twonly/src/views/chats/chat_item_details_view.dart';
|
||||||
import 'package:twonly/src/views/chats/media_viewer_view.dart';
|
import 'package:twonly/src/views/chats/media_viewer_view.dart';
|
||||||
import 'package:twonly/src/views/chats/start_new_chat.dart';
|
import 'package:twonly/src/views/chats/start_new_chat.dart';
|
||||||
import 'package:twonly/src/views/home_view.dart';
|
|
||||||
import 'package:twonly/src/views/settings/settings_main_view.dart';
|
import 'package:twonly/src/views/settings/settings_main_view.dart';
|
||||||
import 'package:twonly/src/views/chats/search_username_view.dart';
|
import 'package:twonly/src/views/chats/search_username_view.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
@ -297,10 +296,24 @@ class _UserListItem extends State<UserListItem> {
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
leading: ContactAvatar(contact: widget.user),
|
leading: ContactAvatar(contact: widget.user),
|
||||||
|
trailing: IconButton(
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.push(context, MaterialPageRoute(
|
||||||
|
builder: (context) {
|
||||||
|
return CameraSendToView(widget.user);
|
||||||
|
},
|
||||||
|
));
|
||||||
|
},
|
||||||
|
icon: FaIcon(FontAwesomeIcons.camera,
|
||||||
|
color: context.color.outline.withAlpha(150)),
|
||||||
|
),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
if (currentMessage == null) {
|
if (currentMessage == null) {
|
||||||
globalSendNextMediaToUser = widget.user;
|
Navigator.push(context, MaterialPageRoute(
|
||||||
globalUpdateOfHomeViewPageIndex(0);
|
builder: (context) {
|
||||||
|
return CameraSendToView(widget.user);
|
||||||
|
},
|
||||||
|
));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
List<Message> msgs = previewMessages
|
List<Message> msgs = previewMessages
|
||||||
|
|
|
||||||
|
|
@ -15,9 +15,8 @@ import 'package:twonly/src/providers/api/api.dart';
|
||||||
import 'package:twonly/src/providers/api/media.dart';
|
import 'package:twonly/src/providers/api/media.dart';
|
||||||
import 'package:twonly/src/services/notification_service.dart';
|
import 'package:twonly/src/services/notification_service.dart';
|
||||||
import 'package:twonly/src/utils/misc.dart';
|
import 'package:twonly/src/utils/misc.dart';
|
||||||
import 'package:twonly/src/views/camera_to_share/share_image_view.dart';
|
import 'package:twonly/src/views/camera_to_share/camera_send_to_view.dart';
|
||||||
import 'package:twonly/src/views/chats/chat_item_details_view.dart';
|
import 'package:twonly/src/views/chats/chat_item_details_view.dart';
|
||||||
import 'package:twonly/src/views/home_view.dart';
|
|
||||||
|
|
||||||
final _noScreenshot = NoScreenshot.instance;
|
final _noScreenshot = NoScreenshot.instance;
|
||||||
|
|
||||||
|
|
@ -490,9 +489,11 @@ class _MediaViewerViewState extends State<MediaViewerView> {
|
||||||
IconButton.outlined(
|
IconButton.outlined(
|
||||||
icon: FaIcon(FontAwesomeIcons.camera),
|
icon: FaIcon(FontAwesomeIcons.camera),
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
globalSendNextMediaToUser = widget.contact;
|
await Navigator.push(context, MaterialPageRoute(
|
||||||
globalUpdateOfHomeViewPageIndex(0);
|
builder: (context) {
|
||||||
Navigator.popUntil(context, (route) => route.isFirst);
|
return CameraSendToView(widget.contact);
|
||||||
|
},
|
||||||
|
));
|
||||||
},
|
},
|
||||||
style: ButtonStyle(
|
style: ButtonStyle(
|
||||||
padding: WidgetStateProperty.all<EdgeInsets>(
|
padding: WidgetStateProperty.all<EdgeInsets>(
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ import 'package:font_awesome_flutter/font_awesome_flutter.dart';
|
||||||
import 'package:pie_menu/pie_menu.dart';
|
import 'package:pie_menu/pie_menu.dart';
|
||||||
import 'package:twonly/globals.dart';
|
import 'package:twonly/globals.dart';
|
||||||
import 'package:twonly/src/components/flame.dart';
|
import 'package:twonly/src/components/flame.dart';
|
||||||
import 'package:twonly/src/components/headline.dart';
|
|
||||||
import 'package:twonly/src/components/initialsavatar.dart';
|
import 'package:twonly/src/components/initialsavatar.dart';
|
||||||
import 'package:twonly/src/components/user_context_menu.dart';
|
import 'package:twonly/src/components/user_context_menu.dart';
|
||||||
import 'package:twonly/src/database/daos/contacts_dao.dart';
|
import 'package:twonly/src/database/daos/contacts_dao.dart';
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ import 'package:font_awesome_flutter/font_awesome_flutter.dart';
|
||||||
import 'package:pie_menu/pie_menu.dart';
|
import 'package:pie_menu/pie_menu.dart';
|
||||||
import 'package:twonly/src/services/notification_service.dart';
|
import 'package:twonly/src/services/notification_service.dart';
|
||||||
import 'package:twonly/src/utils/misc.dart';
|
import 'package:twonly/src/utils/misc.dart';
|
||||||
import 'package:twonly/src/views/camera_to_share/share_image_view.dart';
|
|
||||||
import 'camera_to_share/camera_preview_view.dart';
|
import 'camera_to_share/camera_preview_view.dart';
|
||||||
import 'chats/chat_list_view.dart';
|
import 'chats/chat_list_view.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
@ -31,9 +30,6 @@ class HomeViewState extends State<HomeView> {
|
||||||
activePageIdx = widget.initialPage;
|
activePageIdx = widget.initialPage;
|
||||||
homeViewPageController = PageController(initialPage: widget.initialPage);
|
homeViewPageController = PageController(initialPage: widget.initialPage);
|
||||||
globalUpdateOfHomeViewPageIndex = (index) {
|
globalUpdateOfHomeViewPageIndex = (index) {
|
||||||
if (index == 1) {
|
|
||||||
globalSendNextMediaToUser = null;
|
|
||||||
}
|
|
||||||
homeViewPageController.jumpToPage(index);
|
homeViewPageController.jumpToPage(index);
|
||||||
setState(() {
|
setState(() {
|
||||||
activePageIdx = index;
|
activePageIdx = index;
|
||||||
|
|
@ -61,8 +57,6 @@ class HomeViewState extends State<HomeView> {
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
selectNotificationStream.close();
|
selectNotificationStream.close();
|
||||||
// disable globalCallbacks to the flutter tree
|
|
||||||
globalUpdateOfHomeViewPageIndex = (a) {};
|
|
||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -74,9 +68,6 @@ class HomeViewState extends State<HomeView> {
|
||||||
body: PageView(
|
body: PageView(
|
||||||
controller: homeViewPageController,
|
controller: homeViewPageController,
|
||||||
onPageChanged: (index) {
|
onPageChanged: (index) {
|
||||||
if (index == 1) {
|
|
||||||
globalSendNextMediaToUser = null;
|
|
||||||
}
|
|
||||||
activePageIdx = index;
|
activePageIdx = index;
|
||||||
setState(() {});
|
setState(() {});
|
||||||
},
|
},
|
||||||
|
|
@ -103,9 +94,6 @@ class HomeViewState extends State<HomeView> {
|
||||||
],
|
],
|
||||||
onTap: (int index) {
|
onTap: (int index) {
|
||||||
activePageIdx = index;
|
activePageIdx = index;
|
||||||
if (index == 1) {
|
|
||||||
globalSendNextMediaToUser = null;
|
|
||||||
}
|
|
||||||
setState(() {
|
setState(() {
|
||||||
homeViewPageController.animateToPage(
|
homeViewPageController.animateToPage(
|
||||||
index,
|
index,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue