Skip to content

Commit 645dfe1

Browse files
committed
media upload
1 parent b2dc384 commit 645dfe1

20 files changed

+443
-634
lines changed

lib/main.dart

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,9 @@ import 'package:twonly/src/providers/connection.provider.dart';
1010
import 'package:twonly/src/providers/image_editor.provider.dart';
1111
import 'package:twonly/src/providers/settings.provider.dart';
1212
import 'package:twonly/src/services/api.service.dart';
13-
import 'package:twonly/src/services/api/mediafiles/download.service.dart';
14-
import 'package:twonly/src/services/api/mediafiles/upload.service.dart';
13+
import 'package:twonly/src/services/api/mediafiles/media_background.service.dart';
1514
import 'package:twonly/src/services/fcm.service.dart';
1615
import 'package:twonly/src/services/notifications/setup.notifications.dart';
17-
import 'package:twonly/src/services/twonly_safe/create_backup.twonly_safe.dart';
1816
import 'package:twonly/src/utils/log.dart';
1917
import 'package:twonly/src/utils/storage.dart';
2018

lib/src/database/daos/groups.dao.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,9 @@ class GroupsDao extends DatabaseAccessor<TwonlyDB> with _$GroupsDaoMixin {
2626
await (update(groups)..where((c) => c.groupId.equals(groupId)))
2727
.write(updates);
2828
}
29+
30+
Future<List<GroupMember>> getGroupMembers(String groupId) async {
31+
return (select(groupMembers)..where((t) => t.groupId.equals(groupId)))
32+
.get();
33+
}
2934
}

lib/src/database/daos/messages.dao.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,14 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
285285
.write(updatedValues);
286286
}
287287

288+
Future<void> updateMessagesByMediaId(
289+
String mediaId,
290+
MessagesCompanion updatedValues,
291+
) {
292+
return (update(messages)..where((c) => c.mediaId.equals(mediaId)))
293+
.write(updatedValues);
294+
}
295+
288296
Future<Message?> insertMessage(MessagesCompanion message) async {
289297
try {
290298
final rowId = await into(messages).insert(message);

lib/src/database/tables/groups.table.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ class Groups extends Table {
1111
BoolColumn get pinned => boolean().withDefault(const Constant(false))();
1212
BoolColumn get archived => boolean().withDefault(const Constant(false))();
1313

14+
TextColumn get groupName => text()();
15+
1416
DateTimeColumn get lastMessageExchange =>
1517
dateTime().withDefault(currentDateAndTime)();
1618
DateTimeColumn get createdAt => dateTime().withDefault(currentDateAndTime)();

lib/src/database/tables/mediafiles.table.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@ enum UploadState {
1515
// Image was stored but not send
1616
storedOnly,
1717
// At this point the user is finished with editing, and the media file can be uploaded
18-
compressing,
19-
encrypting,
18+
preprocessing,
2019
uploading,
2120
backgroundUploadTaskStarted,
2221
uploaded,

lib/src/database/tables/messages.table.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ class Messages extends Table {
1818
TextColumn get mediaId =>
1919
text().nullable().references(MediaFiles, #mediaId)();
2020

21+
BoolColumn get mediaStored => boolean().withDefault(const Constant(false))();
22+
2123
BlobColumn get downloadToken => blob().nullable()();
2224

2325
TextColumn get quotesMessageId =>

lib/src/database/twonly.db.g.dart

Lines changed: 113 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/src/services/api.service.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import 'package:twonly/src/model/protobuf/api/websocket/server_to_client.pb.dart
2424
as server;
2525
import 'package:twonly/src/model/protobuf/api/websocket/server_to_client.pbserver.dart';
2626
import 'package:twonly/src/services/api/mediafiles/download.service.dart';
27-
import 'package:twonly/src/services/api/mediafiles/upload.service.dart';
2827
import 'package:twonly/src/services/api/messages.dart';
2928
import 'package:twonly/src/services/api/server_messages.dart';
3029
import 'package:twonly/src/services/api/utils.dart';
@@ -94,7 +93,6 @@ class ApiService {
9493
if (!globalIsAppInBackground) {
9594
unawaited(retransmitRawBytes());
9695
unawaited(tryTransmitMessages());
97-
unawaited(retryMediaUpload(false));
9896
unawaited(tryDownloadAllMediaFiles());
9997
unawaited(notifyContactsAboutProfileChange());
10098
twonlyDB.markUpdated();

lib/src/services/api/mediafiles/media_background.service.dart

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
import 'dart:async';
22
import 'package:background_downloader/background_downloader.dart';
3+
import 'package:drift/drift.dart' show Value;
34
import 'package:flutter/foundation.dart';
5+
import 'package:twonly/globals.dart';
6+
import 'package:twonly/src/database/tables/mediafiles.table.dart';
7+
import 'package:twonly/src/database/twonly.db.dart';
48
import 'package:twonly/src/services/api/mediafiles/download.service.dart';
59
import 'package:twonly/src/services/api/mediafiles/upload.service.dart';
10+
import 'package:twonly/src/services/mediafiles/mediafile.service.dart';
611
import 'package:twonly/src/services/twonly_safe/create_backup.twonly_safe.dart';
712
import 'package:twonly/src/utils/log.dart';
813

@@ -48,3 +53,59 @@ Future<void> initFileDownloader() async {
4853
);
4954
}
5055
}
56+
57+
Future<void> handleUploadStatusUpdate(TaskStatusUpdate update) async {
58+
final mediaId = update.task.taskId.replaceAll('upload_', '');
59+
final media = await twonlyDB.mediaFilesDao.getMediaFileById(mediaId);
60+
61+
if (media == null) {
62+
Log.error(
63+
'Got an upload task but no upload media in the media upload database',
64+
);
65+
return;
66+
}
67+
68+
if (update.status == TaskStatus.complete) {
69+
if (update.responseStatusCode == 200) {
70+
Log.info('Upload of ${media.mediaId} success!');
71+
72+
await twonlyDB.mediaFilesDao.updateMedia(
73+
media.mediaId,
74+
const MediaFilesCompanion(
75+
uploadState: Value(UploadState.uploaded),
76+
),
77+
);
78+
79+
await twonlyDB.messagesDao.updateMessagesByMediaId(
80+
media.mediaId,
81+
const MessagesCompanion(
82+
ackByServer: Value(true),
83+
),
84+
);
85+
return;
86+
}
87+
Log.error(
88+
'Got HTTP error ${update.responseStatusCode} for $mediaId',
89+
);
90+
91+
if (update.responseStatusCode == 429) {
92+
await twonlyDB.mediaFilesDao.updateMedia(
93+
mediaId,
94+
const MediaFilesCompanion(
95+
uploadState: Value(UploadState.uploadLimitReached),
96+
),
97+
);
98+
return;
99+
}
100+
}
101+
102+
Log.info(
103+
'Background upload failed for $mediaId with status ${update.status}. Trying again.',
104+
);
105+
106+
final mediaService = await MediaFileService.fromMedia(media);
107+
108+
await mediaService.setUploadState(UploadState.uploading);
109+
// In all other cases just try the upload again...
110+
await startBackgroundMediaUpload(mediaService);
111+
}

0 commit comments

Comments
 (0)