mirror of
https://github.com/twonlyapp/twonly-app.git
synced 2026-01-15 11:18:41 +00:00
some small bug fixes
This commit is contained in:
parent
24cf6e552f
commit
f372444b5a
4 changed files with 86 additions and 179 deletions
|
|
@ -0,0 +1,64 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class VideoRecordingTimer extends StatelessWidget {
|
||||||
|
final DateTime? videoRecordingStarted;
|
||||||
|
final int maxVideoRecordingTime;
|
||||||
|
|
||||||
|
const VideoRecordingTimer({
|
||||||
|
super.key,
|
||||||
|
required this.videoRecordingStarted,
|
||||||
|
required this.maxVideoRecordingTime,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
if (videoRecordingStarted != null) {
|
||||||
|
final currentTime = DateTime.now();
|
||||||
|
return Positioned(
|
||||||
|
top: 50,
|
||||||
|
left: 0,
|
||||||
|
right: 0,
|
||||||
|
child: Center(
|
||||||
|
child: SizedBox(
|
||||||
|
width: 50,
|
||||||
|
height: 50,
|
||||||
|
child: Stack(
|
||||||
|
children: [
|
||||||
|
Center(
|
||||||
|
child: CircularProgressIndicator(
|
||||||
|
value: (currentTime.difference(videoRecordingStarted!))
|
||||||
|
.inMilliseconds /
|
||||||
|
(maxVideoRecordingTime * 1000),
|
||||||
|
strokeWidth: 4,
|
||||||
|
valueColor: AlwaysStoppedAnimation<Color>(Colors.red),
|
||||||
|
backgroundColor: Colors.grey[300],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Center(
|
||||||
|
child: Text(
|
||||||
|
currentTime
|
||||||
|
.difference(videoRecordingStarted!)
|
||||||
|
.inSeconds
|
||||||
|
.toString(),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: const TextStyle(
|
||||||
|
fontSize: 17,
|
||||||
|
shadows: [
|
||||||
|
Shadow(
|
||||||
|
color: Color.fromARGB(122, 0, 0, 0),
|
||||||
|
blurRadius: 5.0,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return const SizedBox.shrink();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -10,6 +10,7 @@ import 'package:permission_handler/permission_handler.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/views/camera/camera_preview_components/send_to.dart';
|
import 'package:twonly/src/views/camera/camera_preview_components/send_to.dart';
|
||||||
|
import 'package:twonly/src/views/camera/camera_preview_components/video_recording_time.dart';
|
||||||
import 'package:twonly/src/views/camera/camera_preview_components/zoom_selector.dart';
|
import 'package:twonly/src/views/camera/camera_preview_components/zoom_selector.dart';
|
||||||
import 'package:twonly/src/database/daos/contacts_dao.dart';
|
import 'package:twonly/src/database/daos/contacts_dao.dart';
|
||||||
import 'package:twonly/src/database/twonly_database.dart';
|
import 'package:twonly/src/database/twonly_database.dart';
|
||||||
|
|
@ -267,7 +268,7 @@ class _CameraPreviewViewState extends State<CameraPreviewView> {
|
||||||
|
|
||||||
Future<bool> pushMediaEditor(
|
Future<bool> pushMediaEditor(
|
||||||
Future<Uint8List?>? imageBytes, File? videoFilePath) async {
|
Future<Uint8List?>? imageBytes, File? videoFilePath) async {
|
||||||
bool? shoudReturn = await Navigator.push(
|
bool? shouldReturn = await Navigator.push(
|
||||||
context,
|
context,
|
||||||
PageRouteBuilder(
|
PageRouteBuilder(
|
||||||
opaque: false,
|
opaque: false,
|
||||||
|
|
@ -285,9 +286,15 @@ class _CameraPreviewViewState extends State<CameraPreviewView> {
|
||||||
reverseTransitionDuration: Duration.zero,
|
reverseTransitionDuration: Duration.zero,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
if (context.mounted) {
|
||||||
|
setState(() {
|
||||||
|
sharePreviewIsShown = false;
|
||||||
|
showSelfieFlash = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
if (!context.mounted) return true;
|
if (!context.mounted) return true;
|
||||||
// shouldReturn is null when the user used the back button
|
// shouldReturn is null when the user used the back button
|
||||||
if (shoudReturn != null && shoudReturn) {
|
if (shouldReturn != null && shouldReturn) {
|
||||||
// ignore: use_build_context_synchronously
|
// ignore: use_build_context_synchronously
|
||||||
if (widget.sendTo == null) {
|
if (widget.sendTo == null) {
|
||||||
globalUpdateOfHomeViewPageIndex(0);
|
globalUpdateOfHomeViewPageIndex(0);
|
||||||
|
|
@ -297,12 +304,6 @@ class _CameraPreviewViewState extends State<CameraPreviewView> {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
widget.selectCamera(selectedCameraDetails.cameraId, false, false);
|
widget.selectCamera(selectedCameraDetails.cameraId, false, false);
|
||||||
if (context.mounted) {
|
|
||||||
setState(() {
|
|
||||||
sharePreviewIsShown = false;
|
|
||||||
showSelfieFlash = false;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -485,11 +486,6 @@ class _CameraPreviewViewState extends State<CameraPreviewView> {
|
||||||
onPanUpdate: onPanUpdate,
|
onPanUpdate: onPanUpdate,
|
||||||
child: Stack(
|
child: Stack(
|
||||||
children: [
|
children: [
|
||||||
// if (!galleryLoadedImageIsShown)
|
|
||||||
// CameraPreviewWidget(
|
|
||||||
// controller: cameraController,
|
|
||||||
// screenshotController: screenshotController,
|
|
||||||
// ),
|
|
||||||
if (galleryLoadedImageIsShown)
|
if (galleryLoadedImageIsShown)
|
||||||
Center(
|
Center(
|
||||||
child: SizedBox(
|
child: SizedBox(
|
||||||
|
|
@ -499,9 +495,6 @@ class _CameraPreviewViewState extends State<CameraPreviewView> {
|
||||||
strokeWidth: 1, color: context.color.primary),
|
strokeWidth: 1, color: context.color.primary),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
// Positioned.fill(
|
|
||||||
// child: GestureDetector(),
|
|
||||||
// ),
|
|
||||||
if (!sharePreviewIsShown &&
|
if (!sharePreviewIsShown &&
|
||||||
widget.sendTo != null &&
|
widget.sendTo != null &&
|
||||||
!isVideoRecording)
|
!isVideoRecording)
|
||||||
|
|
@ -667,52 +660,10 @@ class _CameraPreviewViewState extends State<CameraPreviewView> {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
if (videoRecordingStarted != null)
|
VideoRecordingTimer(
|
||||||
Positioned(
|
videoRecordingStarted: videoRecordingStarted,
|
||||||
top: 50,
|
maxVideoRecordingTime: maxVideoRecordingTime,
|
||||||
left: 0,
|
),
|
||||||
right: 0,
|
|
||||||
child: Center(
|
|
||||||
child: SizedBox(
|
|
||||||
width: 50,
|
|
||||||
height: 50,
|
|
||||||
child: Stack(
|
|
||||||
children: [
|
|
||||||
Center(
|
|
||||||
child: CircularProgressIndicator(
|
|
||||||
value:
|
|
||||||
(currentTime.difference(videoRecordingStarted!))
|
|
||||||
.inMilliseconds /
|
|
||||||
(maxVideoRecordingTime * 1000),
|
|
||||||
strokeWidth: 4,
|
|
||||||
valueColor:
|
|
||||||
AlwaysStoppedAnimation<Color>(Colors.red),
|
|
||||||
backgroundColor: Colors.grey[300],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Center(
|
|
||||||
child: Text(
|
|
||||||
currentTime
|
|
||||||
.difference(videoRecordingStarted!)
|
|
||||||
.inSeconds
|
|
||||||
.toString(),
|
|
||||||
textAlign: TextAlign.center,
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 17,
|
|
||||||
shadows: [
|
|
||||||
Shadow(
|
|
||||||
color: const Color.fromARGB(122, 0, 0, 0),
|
|
||||||
blurRadius: 5.0,
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
if (!sharePreviewIsShown && widget.sendTo != null)
|
if (!sharePreviewIsShown && widget.sendTo != null)
|
||||||
Positioned(
|
Positioned(
|
||||||
left: 5,
|
left: 5,
|
||||||
|
|
|
||||||
|
|
@ -1,121 +1,16 @@
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'package:drift/drift.dart' show Value;
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
|
|
||||||
import 'package:twonly/globals.dart';
|
import 'package:twonly/globals.dart';
|
||||||
import 'package:twonly/src/providers/api/media_send.dart' as send;
|
import 'package:twonly/src/providers/api/media_send.dart' as send;
|
||||||
import 'package:twonly/src/views/camera/camera_send_to_view.dart';
|
|
||||||
import 'package:twonly/src/views/components/alert_dialog.dart';
|
|
||||||
import 'package:twonly/src/views/components/media_view_sizing.dart';
|
|
||||||
import 'package:twonly/src/views/components/message_send_state_icon.dart';
|
import 'package:twonly/src/views/components/message_send_state_icon.dart';
|
||||||
import 'package:twonly/src/database/twonly_database.dart';
|
import 'package:twonly/src/database/twonly_database.dart';
|
||||||
import 'package:twonly/src/database/tables/messages_table.dart';
|
import 'package:twonly/src/database/tables/messages_table.dart';
|
||||||
import 'package:twonly/src/model/json/message.dart';
|
import 'package:twonly/src/model/json/message.dart';
|
||||||
import 'package:twonly/src/providers/api/media_received.dart' as received;
|
|
||||||
import 'package:twonly/src/views/gallery/gallery_main_view.dart';
|
import 'package:twonly/src/views/gallery/gallery_main_view.dart';
|
||||||
import 'package:video_player/video_player.dart';
|
import 'package:video_player/video_player.dart';
|
||||||
|
|
||||||
// class ChatMediaViewerFullScreen extends StatefulWidget {
|
|
||||||
// const ChatMediaViewerFullScreen({
|
|
||||||
// super.key,
|
|
||||||
// required this.message,
|
|
||||||
// required this.contact,
|
|
||||||
// required this.color,
|
|
||||||
// });
|
|
||||||
// final Message message;
|
|
||||||
// final Contact contact;
|
|
||||||
// final Color color;
|
|
||||||
|
|
||||||
// @override
|
|
||||||
// State<ChatMediaViewerFullScreen> createState() =>
|
|
||||||
// _ChatMediaViewerFullScreenState();
|
|
||||||
// }
|
|
||||||
|
|
||||||
// class _ChatMediaViewerFullScreenState extends State<ChatMediaViewerFullScreen> {
|
|
||||||
// bool hideMediaFile = false;
|
|
||||||
|
|
||||||
// Future deleteFiles(context) async {
|
|
||||||
// bool confirmed = await showAlertDialog(
|
|
||||||
// context, "Are you sure?", "The image will be irrevocably deleted.");
|
|
||||||
|
|
||||||
// if (!confirmed) return;
|
|
||||||
|
|
||||||
// await twonlyDatabase.messagesDao.updateMessageByMessageId(
|
|
||||||
// widget.message.messageId,
|
|
||||||
// MessagesCompanion(mediaStored: Value(false)),
|
|
||||||
// );
|
|
||||||
// await send.purgeSendMediaFiles();
|
|
||||||
// await received.purgeReceivedMediaFiles();
|
|
||||||
// if (context.mounted) {
|
|
||||||
// Navigator.pop(context, true);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// @override
|
|
||||||
// Widget build(BuildContext context) {
|
|
||||||
// return Scaffold(
|
|
||||||
// body: MediaViewSizing(
|
|
||||||
// bottomNavigation: Positioned(
|
|
||||||
// bottom: 10,
|
|
||||||
// left: 0,
|
|
||||||
// right: 0,
|
|
||||||
// child: Row(
|
|
||||||
// mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
||||||
// children: [
|
|
||||||
// IconButton.outlined(
|
|
||||||
// onPressed: () {
|
|
||||||
// deleteFiles(context);
|
|
||||||
// },
|
|
||||||
// icon: FaIcon(FontAwesomeIcons.trashCan),
|
|
||||||
// style: ButtonStyle(
|
|
||||||
// padding: WidgetStateProperty.all<EdgeInsets>(
|
|
||||||
// EdgeInsets.symmetric(vertical: 10, horizontal: 20),
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// IconButton.filled(
|
|
||||||
// icon: FaIcon(FontAwesomeIcons.camera),
|
|
||||||
// onPressed: () async {
|
|
||||||
// setState(() {
|
|
||||||
// hideMediaFile = true;
|
|
||||||
// });
|
|
||||||
// await Navigator.push(context, MaterialPageRoute(
|
|
||||||
// builder: (context) {
|
|
||||||
// return CameraSendToView(widget.contact);
|
|
||||||
// },
|
|
||||||
// ));
|
|
||||||
// setState(() {
|
|
||||||
// hideMediaFile = false;
|
|
||||||
// });
|
|
||||||
// },
|
|
||||||
// style: ButtonStyle(
|
|
||||||
// padding: WidgetStateProperty.all<EdgeInsets>(
|
|
||||||
// EdgeInsets.symmetric(vertical: 10, horizontal: 30),
|
|
||||||
// ),
|
|
||||||
// backgroundColor: WidgetStateProperty.all<Color>(
|
|
||||||
// Theme.of(context).colorScheme.primary,
|
|
||||||
// )),
|
|
||||||
// ),
|
|
||||||
// ],
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// child: (hideMediaFile)
|
|
||||||
// ? Container()
|
|
||||||
// : Hero(
|
|
||||||
// tag: "chat_entry_${widget.message.messageId}",
|
|
||||||
// child: InChatMediaViewer(
|
|
||||||
// message: widget.message,
|
|
||||||
// contact: widget.contact,
|
|
||||||
// color: widget.color,
|
|
||||||
// isInFullscreen: true,
|
|
||||||
// ),
|
|
||||||
// )),
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
class InChatMediaViewer extends StatefulWidget {
|
class InChatMediaViewer extends StatefulWidget {
|
||||||
const InChatMediaViewer({
|
const InChatMediaViewer({
|
||||||
super.key,
|
super.key,
|
||||||
|
|
@ -222,9 +117,6 @@ class _InChatMediaViewerState extends State<InChatMediaViewer> {
|
||||||
MaterialPageRoute(
|
MaterialPageRoute(
|
||||||
builder: (context) => GalleryPhotoViewWrapper(
|
builder: (context) => GalleryPhotoViewWrapper(
|
||||||
galleryItems: widget.galleryItems,
|
galleryItems: widget.galleryItems,
|
||||||
// backgroundDecoration: const BoxDecoration(
|
|
||||||
// color: Colors.black,
|
|
||||||
// ),
|
|
||||||
initialIndex: widget.galleryItems.indexWhere((x) =>
|
initialIndex: widget.galleryItems.indexWhere((x) =>
|
||||||
x.id ==
|
x.id ==
|
||||||
(widget.message.mediaUploadId ?? widget.message.messageId)
|
(widget.message.mediaUploadId ?? widget.message.messageId)
|
||||||
|
|
|
||||||
|
|
@ -138,22 +138,22 @@ class _ChatMessagesViewState extends State<ChatMessagesView> {
|
||||||
notifyContactAboutOpeningMessage(
|
notifyContactAboutOpeningMessage(
|
||||||
widget.contact.userId, openedMessageOtherIds);
|
widget.contact.userId, openedMessageOtherIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
twonlyDatabase.messagesDao
|
twonlyDatabase.messagesDao
|
||||||
.openedAllNonMediaMessages(widget.contact.userId);
|
.openedAllNonMediaMessages(widget.contact.userId);
|
||||||
// should be fixed with that
|
|
||||||
// if (!updated) {
|
|
||||||
// // The stream should be get an update, so only update the UI when all are opened
|
|
||||||
setState(() {
|
setState(() {
|
||||||
textReactionsToMessageId = tmpTextReactionsToMessageId;
|
textReactionsToMessageId = tmpTextReactionsToMessageId;
|
||||||
emojiReactionsToMessageId = tmpEmojiReactionsToMessageId;
|
emojiReactionsToMessageId = tmpEmojiReactionsToMessageId;
|
||||||
messages = displayedMessages;
|
messages = displayedMessages;
|
||||||
});
|
});
|
||||||
Map<int, GalleryItem> items = await GalleryItem.convertFromMessages(
|
|
||||||
displayedMessages
|
final filteredMediaFiles = displayedMessages
|
||||||
.where((x) => x.kind == MessageKind.media)
|
.where((x) => x.kind == MessageKind.media)
|
||||||
.toList()
|
.toList()
|
||||||
.reversed
|
.reversed
|
||||||
.toList());
|
.toList();
|
||||||
|
final items = await GalleryItem.convertFromMessages(filteredMediaFiles);
|
||||||
setState(() {
|
setState(() {
|
||||||
galleryItems = items.values.toList();
|
galleryItems = items.values.toList();
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue