Add Sharing Media feature

This commit is contained in:
Benoit Martins 2023-02-06 14:37:49 +01:00 committed by QuentinArguillere
parent 989ae6db8f
commit e2233674ae
4 changed files with 102 additions and 18 deletions

View file

@ -71,15 +71,15 @@
NSDictionary *dict = [defaults valueForKey:@"photoData"];
NSDictionary *dictFile = [defaults valueForKey:@"icloudData"];
NSDictionary *dictUrl = [defaults valueForKey:@"url"];
if(dict||dictFile||dictUrl) VIEW(ChatConversationView).sharingMedia = TRUE;
if(dict||dictFile||dictUrl) VIEW(ChatConversationViewSwift).sharingMedia = TRUE;
if(VIEW(ChatConversationView).sharingMedia == nil){
if(VIEW(ChatConversationViewSwift).sharingMedia == false){
forwardMode = VIEW(ChatConversationViewSwift).pendingForwardMessage != nil;
}else{
forwardMode = VIEW(ChatConversationView).sharingMedia != nil;
forwardMode = VIEW(ChatConversationViewSwift).sharingMedia != false;
}
_tableController.editButton.hidden = forwardMode;
if(VIEW(ChatConversationView).sharingMedia == nil){
if(VIEW(ChatConversationViewSwift).sharingMedia == false){
_forwardTitle.text = NSLocalizedString(@"Select a discussion or create a new one",nil);
}
else{
@ -201,7 +201,7 @@ static UICompositeViewDescription *compositeDescription = nil;
}
- (IBAction)onCancelForwardClicked:(id)sender {
VIEW(ChatConversationView).sharingMedia = nil;
VIEW(ChatConversationViewSwift).sharingMedia = false;
VIEW(ChatConversationViewSwift).pendingForwardMessage = nil;
NSString* groupName = [NSString stringWithFormat:@"group.%@.linphoneExtension",[[NSBundle mainBundle] bundleIdentifier]];
NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:groupName];

View file

@ -423,12 +423,12 @@
}
} else if([[url scheme] isEqualToString:@"message-linphone"]) {
if ([[PhoneMainView.instance currentView] equal:ChatsListView.compositeViewDescription]) {
VIEW(ChatConversationView).sharingMedia = TRUE;
VIEW(ChatConversationViewSwift).sharingMedia = TRUE;
ChatsListView *view = VIEW(ChatsListView);
[view mediaSharing];
}else{
[SVProgressHUD dismiss];
VIEW(ChatConversationView).sharingMedia = TRUE;
VIEW(ChatConversationViewSwift).sharingMedia = TRUE;
[PhoneMainView.instance popToView:ChatsListView.compositeViewDescription];
}
} else if ([scheme isEqualToString:@"sip"]||[scheme isEqualToString:@"sips"]) {

View file

@ -151,10 +151,13 @@ import AVFoundation
var showReplyView = false
var replyMessage : OpaquePointer? = nil
@objc var sharingMedia : Bool = false
override func viewDidLoad() {
super.viewDidLoad(
backAction: {
self.goBackChatListView()
},
action1: {
self.onCallClick(cChatRoom: self.chatRoom?.getCobject)
@ -220,6 +223,7 @@ import AVFoundation
}
self.handlePendingTransferIfAny()
self.shareFile()
}
override func viewWillDisappear(_ animated: Bool) {
@ -271,6 +275,7 @@ import AVFoundation
}
func goBackChatListView() {
sharingMedia = false
PhoneMainView.instance().pop(toView: ChatsListView.compositeViewDescription())
}
@ -527,7 +532,7 @@ import AVFoundation
}
@objc func alertActionGoToDevicesList() {
func alertActionGoToDevicesList() {
let notAskAgain = ConfigManager.instance().lpConfigBoolForKey(key: "confirmation_dialog_before_sas_call_not_ask_again");
if(!notAskAgain){
@ -977,7 +982,7 @@ import AVFoundation
result = self.formattedDuration(linphonePlayer.duration)!
linphonePlayer.close()
}catch{
print(error)
}
return result
}
@ -1005,7 +1010,7 @@ import AVFoundation
// we're finished, save the image and update the message
let image = UIImage(data: data!)
if image == nil {
showFileDownloadError()
ChatConversationViewSwift.showFileDownloadError()
return
}
var placeHolder: PHObjectPlaceholder? = nil
@ -1199,7 +1204,7 @@ import AVFoundation
collectionViewReply.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "cellReply")
}
@objc func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
if(collectionView == collectionViewMedia){
return mediaCollectionView.count
}
@ -1498,6 +1503,74 @@ import AVFoundation
}
}
func shareFile() {
let groupName = "group.\(Bundle.main.bundleIdentifier ?? "").linphoneExtension"
let defaults = UserDefaults(suiteName: groupName)
let dict = defaults?.value(forKey: "photoData") as? [AnyHashable : Any]
let dictFile = defaults?.value(forKey: "icloudData") as? [AnyHashable : Any]
let dictUrl = defaults?.value(forKey: "url") as? [AnyHashable : Any]
if let dict {
//file shared from photo lib
let fileName = dict["url"] as? String
messageView.messageText.text = dict["message"] as? String
confirmShare(nsDataRead(), url: nil, fileName: fileName)
defaults?.removeObject(forKey: "photoData")
} else if let dictFile {
let fileName = dictFile["url"] as? String
messageView.messageText.text = dictFile["message"] as? String
confirmShare(nsDataRead(), url: nil, fileName: fileName)
defaults?.removeObject(forKey: "icloudData")
} else if let dictUrl {
let url = dictUrl["url"] as? String
messageView.messageText.text = dictUrl["message"] as? String
confirmShare(nil, url: url, fileName: nil)
defaults?.removeObject(forKey: "url")
}
}
func nsDataRead() -> Data? {
let groupName = "group.\(Bundle.main.bundleIdentifier ?? "").linphoneExtension"
let path = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: groupName)?.path
let fullCacheFilePathPath = "\(path ?? "")/\("nsData")"
return NSData(contentsOfFile: fullCacheFilePathPath) as Data?
}
func confirmShare(_ data: Data?, url: String?, fileName: String?) {
let sheet = DTActionSheet(title: NSLocalizedString("Select or create a conversation to share the file(s)", comment: ""))
DispatchQueue.main.async(execute: { [self] in
sheet!.addButton(
withTitle: NSLocalizedString("Send to this conversation", comment: "")) { [self] in
do{
if messageView.messageText.text != "" {
try sendMessageInMessageField(rootMessage: chatRoom?.createEmptyMessage())
}
if let url {
_ = try sendMessage(message: url, withExterlBodyUrl: nil, rootMessage: chatRoom?.createEmptyMessage())
} else {
_ = try startFileUpload(data, withName: fileName, rootMessage: chatRoom?.createEmptyMessage())
}
}catch{
print(error)
}
}
sheet!.addCancelButton(withTitle: NSLocalizedString("Cancel", comment: ""), block: nil)
sheet!.show(in: PhoneMainView.instance().view)
})
}
func startFileUpload(_ data: Data?, withName name: String?, rootMessage: ChatMessage?) -> Bool {
let fileTransfer = FileTransferDelegate()
fileTransfer.uploadFile(data, for: chatRoom?.getCobject, withName: name, rootMessage: rootMessage?.getCobject)
tableController.scroll(toBottom: true)
return true
}
@objc class func getFileUrl(_ name: String?) -> URL? {
let filePath = LinphoneManager.validFilePath(name)
return URL(fileURLWithPath: filePath!)
}
@objc func initiateReplyView(forMessage: OpaquePointer?) {
if(replyBubble.isHidden == false){
replyBubble.isHidden = true
@ -1508,4 +1581,14 @@ import AVFoundation
replyMessage = forMessage
initReplyView(true, message: forMessage)
}
@objc class func isBasicChatRoom(_ room: OpaquePointer?) -> Bool {
if room == nil {
return true
}
let charRoomBasic = ChatRoom.getSwiftObject(cObject: room!)
let isBasic = charRoomBasic.hasCapability(mask: Int(LinphoneChatRoomCapabilitiesBasic.rawValue))
return isBasic
}
}

View file

@ -22,6 +22,7 @@
#import "LinphoneManager.h"
#import "PhoneMainView.h"
#import "Utils.h"
#import "linphoneapp-Swift.h"
@interface FileTransferDelegate ()
@property(strong) NSMutableData *data;
@ -51,7 +52,7 @@ static void file_transfer_progress_indication_recv(LinphoneChatMessage *message,
NSString *name = [NSString stringWithUTF8String: linphone_content_get_name(content) ? : ""];
LOGI(@"Transfer of %@ (%d bytes): download finished", name, total);
NSString *fileType = [NSString stringWithUTF8String:linphone_content_get_type(content)];
NSString *key = [ChatConversationView getKeyFromFileType:fileType fileName:name];
NSString *key = [ChatConversationViewSwift getKeyFromFileType:fileType fileName:name];
dispatch_async(dispatch_get_main_queue(), ^{
[LinphoneManager setValueInMessageAppData:name
@ -59,7 +60,7 @@ static void file_transfer_progress_indication_recv(LinphoneChatMessage *message,
inMessage:message];
dispatch_async(dispatch_get_main_queue(), ^{
if (![VFSUtil vfsEnabledWithGroupName:kLinphoneMsgNotificationAppGroupId] && [ConfigManager.instance lpConfigBoolForKeyWithKey:@"auto_write_to_gallery_preference"]) {
[ChatConversationView writeMediaToGallery:name fileType:fileType];
[ChatConversationViewSwift writeMediaToGalleryFromName:name fileType:fileType];
}
});
});
@ -109,7 +110,7 @@ static void file_transfer_progress_indication_send(LinphoneChatMessage *message,
return;
}
[LinphoneManager.instance.fileTransferDelegates addObject:self];
[ChatConversationView writeFileInImagesDirectory:data name:name];
[ChatConversationViewSwift writeFileInImagesDirectory:data name:name];
LinphoneContent *content = linphone_core_create_content(linphone_chat_room_get_core(chatRoom));
linphone_content_set_type(content, [type UTF8String]);
@ -120,7 +121,7 @@ static void file_transfer_progress_indication_send(LinphoneChatMessage *message,
linphone_chat_message_add_file_content(_message, content);
const LinphoneAccountParams *params = linphone_account_get_params(linphone_core_get_default_account(LC));
BOOL cpimEnabled = linphone_account_params_cpim_in_basic_chat_room_enabled(params);
BOOL basic = [ChatConversationView isBasicChatRoom:linphone_chat_message_get_chat_room(_message)];
BOOL basic = [ChatConversationViewSwift isBasicChatRoom:linphone_chat_message_get_chat_room(_message)];
if ((!basic || cpimEnabled) && (_text!=nil && ![_text isEqualToString:@""]))
linphone_chat_message_add_utf8_text_content(_message, [_text UTF8String]);
@ -166,7 +167,7 @@ static void file_transfer_progress_indication_send(LinphoneChatMessage *message,
linphone_content_unref(content);
}
BOOL basic = [ChatConversationView isBasicChatRoom:linphone_chat_message_get_chat_room(rootMessage)];
BOOL basic = [ChatConversationViewSwift isBasicChatRoom:linphone_chat_message_get_chat_room(rootMessage)];
const LinphoneAccountParams *params = linphone_account_get_params(linphone_core_get_default_account(LC));
BOOL cpimEnabled = linphone_account_params_cpim_in_basic_chat_room_enabled(params);
@ -248,10 +249,10 @@ static void file_transfer_progress_indication_send(LinphoneChatMessage *message,
- (void)uploadFile:(NSData *)data forChatRoom:(LinphoneChatRoom *)chatRoom withName:(NSString *)name rootMessage:(LinphoneChatMessage *)rootMessage {
NSURL *url = [ChatConversationView getFileUrl:name];
NSURL *url = [ChatConversationViewSwift getFileUrl:name];
AVAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
NSString *fileType = [[asset tracksWithMediaType:AVMediaTypeVideo] count] > 0 ? @"video" : @"file";
NSString *key = [ChatConversationView getKeyFromFileType:fileType fileName:name];
NSString *key = [ChatConversationViewSwift getKeyFromFileType:fileType fileName:name];
[self uploadData:data forChatRoom:chatRoom type:fileType subtype:name.lastPathComponent name:name key:key rootMessage:rootMessage];
}