diff --git a/MacPass/MPIconHelper.h b/MacPass/MPIconHelper.h index 29629c54..9c57e415 100644 --- a/MacPass/MPIconHelper.h +++ b/MacPass/MPIconHelper.h @@ -132,6 +132,8 @@ typedef NS_ENUM(NSUInteger, MPIconType) { */ @property (class, nonatomic, strong, readonly) NSDictionary *availableIconNames; +@property (class, nonatomic, strong, readonly) NSDictionary *availableSymbolNames; + /** * List of all available DatabaseIcons as an array of Images. Sorted by IconIndex. * @return Array of Icons as NSImage objects diff --git a/MacPass/MPIconHelper.m b/MacPass/MPIconHelper.m index d5af09ce..2e36df1f 100644 --- a/MacPass/MPIconHelper.m +++ b/MacPass/MPIconHelper.m @@ -24,17 +24,34 @@ #import "MPSettingsHelper.h" #import "KeePassKit/KeePassKit.h" + @implementation MPIconHelper + (NSImage *)icon:(MPIconType)type { + static NSDictionary *symbols; + + if(!symbols) { + symbols = MPIconHelper.availableSymbolNames; + } + if([symbols.allKeys containsObject:@(type)]) { + NSString *imageName = symbols[@(type)]; + NSImage *image = [NSImage imageWithSystemSymbolName:imageName accessibilityDescription:nil]; + if(image) { + return image; + } + } + static NSDictionary *icons; + if(!icons) { icons = MPIconHelper.availableIconNames; } if([icons.allKeys containsObject:@(type)]) { NSString *imageName = icons[@(type)]; NSImage *image = [NSImage imageNamed:imageName]; - return image; + if(image) { + return image; + } } return [NSImage imageNamed:NSImageNameActionTemplate]; } @@ -45,11 +62,11 @@ dispatch_once(&onceToken, ^{ NSDictionary *imageNames = MPIconHelper.availableIconNames; NSMutableArray *mutableIcons = [[NSMutableArray alloc] initWithCapacity:imageNames.count]; - + NSArray *sortedImageNames = [imageNames.allKeys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { return [imageNames[obj1] compare:imageNames[obj2]]; }]; - + for(NSNumber *iconNumber in sortedImageNames) { if(iconNumber.integerValue > MPCustomIconTypeBegin) { continue; // Skip all non-db Keys @@ -69,7 +86,7 @@ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSDictionary *imageNames = MPIconHelper.availableIconNames; - + NSArray *sortedImageNames = [imageNames.allKeys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { return [imageNames[obj1] compare:imageNames[obj2]]; }]; @@ -81,6 +98,102 @@ return iconTypes; } ++ (NSDictionary *)availableSymbolNames { + static NSDictionary *symbolNames; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + symbolNames = @{ + @(MPIconPassword): @"ellipsis.rectangle", + @(MPIconPackageNetwork): @"globe", + @(MPIconWarning): @"exclamationmark.circle", + @(MPIconServer): @"macpro.gen3.server", + @(MPIconKlipper): @"paperclip", + @(MPIconLanguages): @"mouth", + @(MPIconBlockDevice): @"06_BlockDeviceTemplate", + @(MPIconNotepad): @"07_NotepadTemplate", + @(MPIconSocket): @"08_SocketTemplate", + @(MPIconIdentity): @"09_IdentityTemplate", + @(MPIconContact): @"10_ContactTemplate", + @(MPIconCamera): @"11_CameraTemplate", + @(MPIconRemote): @"12_RemoteTemplate", + @(MPIconKeys): @"key", + @(MPIconBattery): @"14_BatteryTemplate", + @(MPIconScanner): @"15_ScannerTemplate", + @(MPIconBrowser): @"16_BrowserTemplate", + @(MPIconCDRom): @"17_CDRomTemplate", + @(MPIconDisplay): @"18_DisplayTemplate", + @(MPIconEmail): @"19_EmailTemplate", + @(MPIconMisc): @"20_MiscTemplate", + @(MPIconOrganizer): @"21_OrganizerTemplate", + @(MPIconASCII): @"22_ASCIITemplate", + @(MPIconIcons): @"23_IconsTemplate", + @(MPIconEstablishedConnection): @"24_EstablishedConnectionTemplate", + @(MPIconMailFolder): @"25_MailFolderTemplate", + @(MPIconFileSave): @"26_FileSaveTemplate", + @(MPIconNFSUnmount) :@"27_NFSUnmountTemplate", + @(MPIconQuickTime) : @"28_QuickTimeTemplate", + @(MPIconSecureTerminal) : @"29_SecureTerminalTemplate", + @(MPIconTerminal) : @"30_TerminalTemplate", + @(MPIconPrint) : @"31_PrintTemplate", + @(MPIconFileSystemView) : @"32_FileSystemViewTemplate", + @(MPIconRun) : @"33_RunTemplate", + @(MPIconConfigure) : @"34_ConfigureTemplate", + @(MPIconBrowserWindow) : @"35_BrowserWindowTemplate", + @(MPIconArchive) : @"36_ArchiveTemplate", + @(MPIconPercentage) : @"37_PercentageTemplate", + @(MPIconSambaUnmount) : @"38_SambaUnmountTemplate", + @(MPIconHistory) : @"39_HistoryTemplate", + @(MPIconFindMail) : @"40_FindMailTemplate", + @(MPIconVector) : @"41_VectorTemplate", + @(MPIconMemory) : @"42_MemoryTemplate", + @(MPIconTrash): @"43_TrashTemplate", + @(MPIconNotes) : @"44_NotesTemplate", + @(MPIconCancel) : @"45_CancelTemplate", + @(MPIconHelp) : @"46_HelpTemplate", + @(MPIconPackage) : @"47_PackageTemplate", + @(MPIconFolder): @"48_FolderTemplate", + @(MPIconFolderOpen) : @"49_FolderOpenTemplate", + @(MPIconFolderTar) : @"50_FolderTarTemplate", + @(MPIconDecrypted) : @"51_DecryptedTemplate", + @(MPIconEncrypted) : @"52_EncryptedTemplate", + @(MPIconApply) : @"53_ApplyTemplate", + @(MPIconSignature) : @"54_SignatureTemplate", + @(MPIconThumbnail) : @"55_ThumbnailTemplate", + @(MPIconAddressBook) : @"56_AddressBookTemplate", + @(MPIconTextView) : @"57_TextViewTemplate", + @(MPIconSecureAccount) : @"58_SecureAccountTemplate", + @(MPIconDevelopment) : @"59_DevelopmentTemplate", + @(MPIconHome) : @"60_HomeTemplate", + @(MPIconServices) : @"61_ServicesTemplate", + @(MPIconTux) : @"62_TuxTemplate", + @(MPIconFeather) : @"63_FeatherTemplate", + @(MPIconApple) : @"64_AppleTemplate", + @(MPIconWiki) : @"65_WikiTemplate", + @(MPIconMoney) : @"66_MoneyTemplate", + @(MPIconCertificat) : @"67_CertificatTemplate", + @(MPIconPhone): @"68_PhoneTemplate", + /* Custom */ + @(MPIconInfo): @"sidebar.trailing", + @(MPIconAddFolder): @"addFolderTemplate", + @(MPIconHardDisk): @"harddiskTemplate", + @(MPIconCreated): @"createdTemplate", + @(MPIconAddEntry): @"addEntryTemplate", + @(MPIconContextTriangle): @"contextTriangleTemplate", + @(MPIconKeyboard): @"keyboardTemplate", + + @(MPIconExpiredEntry): NSImageNameCaution, + @(MPIconExpiredGroup): NSImageNameCaution + }; + }); + + if(@available(macOS 11.0, *)) { + return symbolNames; + } + else { + return nil; + } +} + + (NSDictionary *)availableIconNames { static NSDictionary *imageNames; @@ -173,11 +286,11 @@ } + (void)fetchIconDataForURL:(NSURL *)url completionHandler:(void (^)(NSData *iconData))handler { - + if(!url || !handler) { return; // no url, no handler so no need to do anything } - + NSString *urlString; MPFaviconDownloadMethod faviconDownloadMethod = (MPFaviconDownloadMethod)[NSUserDefaults.standardUserDefaults integerForKey:kMPSettingsKeyFaviconDownloadMethod]; switch(faviconDownloadMethod) { @@ -199,18 +312,18 @@ handler(nil); return; } - + NSURLSessionTask *task = [NSURLSession.sharedSession dataTaskWithURL:favIconURL completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { if(error) { - handler(nil); + handler(nil); } else if([response respondsToSelector:@selector(statusCode)] && (200 == [(id)response statusCode]) && data.length > 0) { - handler(data); + handler(data); } else { - handler(nil); + handler(nil); } }]; [task resume];