element-ios/RiotShareExtension/Sources/ShareExtensionRootViewContr...

102 lines
3.6 KiB
Objective-C

/*
Copyright 2024 New Vector Ltd.
Copyright 2017 Aram Sargsyan
SPDX-License-Identifier: AGPL-3.0-only
Please see LICENSE in the repository root for full details.
*/
#import "ShareExtensionRootViewController.h"
#import "ShareManager.h"
#import "ThemeService.h"
#import "ShareItemSender.h"
#import "GeneratedInterface-Swift.h"
@interface ShareExtensionRootViewController ()
@property (nonatomic, strong, readonly) id<Configurable> configuration;
@property (nonatomic, strong, readonly) ShareManager *shareManager;
@end
@implementation ShareExtensionRootViewController
- (void)viewDidLoad
{
[super viewDidLoad];
_configuration = [[CommonConfiguration alloc] init];
[_configuration setupSettings];
// NSLog -> console.log file when not debugging the app
MXLogConfiguration *configuration = [[MXLogConfiguration alloc] init];
configuration.logLevel = MXLogLevelVerbose;
configuration.logFilesSizeLimit = 0;
configuration.maxLogFilesCount = 10;
configuration.subLogName = @"share";
// Redirect NSLogs to files only if we are not debugging
if (!isatty(STDERR_FILENO)) {
configuration.redirectLogsToFiles = YES;
}
[MXLog configure:configuration];
// Configure our analytics. It will start if the option is enabled
Analytics *analytics = Analytics.shared;
[MXSDKOptions sharedInstance].analyticsDelegate = analytics;
[analytics startIfEnabled];
[ThemeService.shared setThemeId:RiotSettings.shared.userInterfaceTheme];
ShareExtensionShareItemProvider *shareItemProvider = [[ShareExtensionShareItemProvider alloc] initWithExtensionContext:self.extensionContext];
ShareItemSender *shareItemSender = [[ShareItemSender alloc] initWithRootViewController:self
shareItemProvider:shareItemProvider];
_shareManager = [[ShareManager alloc] initWithShareItemSender:shareItemSender
type:ShareManagerTypeSend];
MXWeakify(self);
[_shareManager setCompletionCallback:^(ShareManagerResult result) {
MXStrongifyAndReturnIfNil(self);
switch (result)
{
case ShareManagerResultFinished:
[self.extensionContext completeRequestReturningItems:nil completionHandler:nil];
[self dismiss];
break;
case ShareManagerResultCancelled:
[self.extensionContext cancelRequestWithError:[NSError errorWithDomain:@"MXUserCancelErrorDomain" code:4201 userInfo:nil]];
[self dismiss];
break;
case ShareManagerResultFailed:
[self.extensionContext cancelRequestWithError:[NSError errorWithDomain:@"MXFailureErrorDomain" code:500 userInfo:nil]];
[self dismiss];
break;
default:
break;
}
}];
[self.shareManager.mainViewController setModalInPopover:YES];
[self presentViewController:self.shareManager.mainViewController animated:YES completion:nil];
}
#pragma mark - Private
- (void)dismiss
{
[self dismissViewControllerAnimated:true completion:^{
[self.presentingViewController dismissViewControllerAnimated:false completion:nil];
// FIXME: Share extension memory usage increase when launched several times and then crash due to some memory leaks.
// For now, we force the share extension to exit and free memory.
[NSException raise:@"Kill the app extension" format:@"Free memory used by share extension"];
}];
}
@end