TUIEmojiConfig.m 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. //
  2. // TUIEmojiConfig.m
  3. // TUIEmojiPlugin
  4. //
  5. // Created by wyl on 2023/11/13.
  6. // Copyright © 2023 Tencent. All rights reserved.
  7. //
  8. #import "TUIEmojiConfig.h"
  9. typedef NS_ENUM(NSUInteger, TUIEmojiFaceType) {
  10. TUIEmojiFaceTypeKeyBoard = 0,
  11. TUIEmojiFaceTypePopDetail = 1,
  12. TUIEmojiFaceTypePopContextDetail = 2,
  13. };
  14. @interface TUIEmojiConfig ()
  15. @end
  16. @implementation TUIEmojiConfig
  17. + (void)load {
  18. NSLog(@"TUIEmojiConfig load%@",[TUIEmojiConfig defaultConfig]);
  19. }
  20. - (id)init {
  21. self = [super init];
  22. if (self) {
  23. [self updateEmojiGroups];
  24. [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(onChangeLanguage) name:TUIChangeLanguageNotification object:nil];
  25. [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(onChangeTheme) name:TUIDidApplyingThemeChangedNotfication object:nil];
  26. }
  27. return self;
  28. }
  29. + (id)defaultConfig {
  30. static dispatch_once_t onceToken;
  31. static TUIEmojiConfig *config;
  32. dispatch_once(&onceToken, ^{
  33. config = [[TUIEmojiConfig alloc] init];
  34. });
  35. return config;
  36. }
  37. - (void)appendFaceGroup:(TUIFaceGroup *)faceGroup {
  38. NSMutableArray *faceGroupMenu = [NSMutableArray arrayWithArray:self.faceGroups];
  39. [faceGroupMenu addObject:faceGroup];
  40. self.faceGroups = faceGroupMenu;
  41. }
  42. - (void)onChangeLanguage {
  43. [self updateEmojiGroups];
  44. }
  45. - (void)onChangeTheme { }
  46. @end
  47. @implementation TUIEmojiConfig (defaultFace)
  48. - (void)updateEmojiGroups {
  49. self.faceGroups = [self updateFaceGroups:self.faceGroups type:TUIEmojiFaceTypeKeyBoard];
  50. self.chatPopDetailGroups = [self updateFaceGroups:self.chatPopDetailGroups type:TUIEmojiFaceTypePopDetail];
  51. self.chatContextEmojiDetailGroups = [self updateFaceGroups:self.chatContextEmojiDetailGroups type:TUIEmojiFaceTypePopContextDetail];
  52. }
  53. - (NSArray *)updateFaceGroups:(NSArray *)groups type:(TUIEmojiFaceType)type {
  54. if (groups.count) {
  55. NSMutableArray *arrayM = [NSMutableArray arrayWithArray:groups];
  56. [arrayM removeObjectAtIndex:0];
  57. TUIFaceGroup *defaultFaceGroup = [self findFaceGroupAboutType:type];
  58. if (defaultFaceGroup) {
  59. [arrayM insertObject:[self findFaceGroupAboutType:type] atIndex:0];
  60. }
  61. return [NSArray arrayWithArray:arrayM];
  62. } else {
  63. NSMutableArray *faceArray = [NSMutableArray array];
  64. TUIFaceGroup *defaultFaceGroup = [self findFaceGroupAboutType:type];
  65. if (defaultFaceGroup) {
  66. [faceArray addObject:defaultFaceGroup];
  67. }
  68. return faceArray;
  69. }
  70. return @[];
  71. }
  72. - (TUIFaceGroup *)findFaceGroupAboutType:(TUIEmojiFaceType)type {
  73. // emoji group
  74. NSMutableArray *emojiFaces = [NSMutableArray array];
  75. NSArray *emojis = [NSArray arrayWithContentsOfFile:TUIChatFaceImagePath(@"emoji/emoji.plist")];
  76. for (NSDictionary *dic in emojis) {
  77. TUIFaceCellData *data = [[TUIFaceCellData alloc] init];
  78. NSString *name = [dic objectForKey:@"face_name"];
  79. NSString *fileName = [dic objectForKey:@"face_file"];
  80. NSString *path = [NSString stringWithFormat:@"emoji/%@", fileName];
  81. NSString *localizableName = [TUIGlobalization getLocalizedStringForKey:name bundle:@"TUIChatFace"];
  82. data.name = name;
  83. data.path = TUIChatFaceImagePath(path);
  84. data.localizableName = localizableName;
  85. [self addFaceToCache:data.path];
  86. [emojiFaces addObject:data];
  87. }
  88. if (emojiFaces.count != 0) {
  89. TUIFaceGroup *emojiGroup = [[TUIFaceGroup alloc] init];
  90. emojiGroup.faces = emojiFaces;
  91. emojiGroup.groupIndex = 0;
  92. emojiGroup.groupPath = TUIChatFaceImagePath(@"emoji/");
  93. emojiGroup.menuPath = TUIChatFaceImagePath(@"emoji/menu");
  94. emojiGroup.isNeedAddInInputBar = YES;
  95. emojiGroup.groupName = TIMCommonLocalizableString(TUIChatFaceGroupAllEmojiName);
  96. if (type == TUIEmojiFaceTypeKeyBoard) {
  97. emojiGroup.rowCount = 4;
  98. emojiGroup.itemCountPerRow = 8;
  99. emojiGroup.needBackDelete = NO;
  100. } else if (type == TUIEmojiFaceTypePopDetail) {
  101. emojiGroup.rowCount = 3;
  102. emojiGroup.itemCountPerRow = 8;
  103. emojiGroup.needBackDelete = NO;
  104. }
  105. else if (type == TUIEmojiFaceTypePopContextDetail) {
  106. emojiGroup.rowCount = 20;
  107. emojiGroup.itemCountPerRow = 7;
  108. emojiGroup.needBackDelete = NO;
  109. }
  110. [self addFaceToCache:emojiGroup.menuPath];
  111. [self addFaceToCache:TUIChatFaceImagePath(@"del_normal")];
  112. [self addFaceToCache:TUIChatFaceImagePath(@"ic_unknown_image")];
  113. return emojiGroup;
  114. }
  115. return nil;
  116. }
  117. #pragma mark - chatPopMenuQueue
  118. - (NSArray *)getChatPopMenuQueue {
  119. NSArray *emojis = [[NSUserDefaults standardUserDefaults] objectForKey:@"TUIChatPopMenuQueue"];
  120. if (emojis && [emojis isKindOfClass:[NSArray class]]) {
  121. if (emojis.count > 0) {
  122. //Randomly check whether an emoticon matches the current emoticon resource package
  123. //to avoid overwriting the installation context emoticon inconsistency.
  124. NSDictionary *dic = emojis.lastObject;
  125. NSString *name = [dic objectForKey:@"face_name"];
  126. NSString *fileName = [dic objectForKey:@"face_file"];
  127. NSString *path = [NSString stringWithFormat:@"emoji/%@", fileName];
  128. UIImage * image = [UIImage imageWithContentsOfFile:TUIChatFaceImagePath(path)];
  129. if (image) {
  130. return emojis;
  131. }
  132. }
  133. }
  134. return [NSArray arrayWithContentsOfFile:TUIChatFaceImagePath(@"emoji/emojiRecentDefaultList.plist")];
  135. }
  136. - (TUIFaceGroup *)getChatPopMenuRecentQueue {
  137. // emoji group
  138. NSMutableArray *emojiFaces = [NSMutableArray array];
  139. NSArray *emojis = [self getChatPopMenuQueue];
  140. for (NSDictionary *dic in emojis) {
  141. TUIFaceCellData *data = [[TUIFaceCellData alloc] init];
  142. NSString *name = [dic objectForKey:@"face_name"];
  143. NSString *fileName = [dic objectForKey:@"face_file"];
  144. NSString *path = [NSString stringWithFormat:@"emoji/%@", fileName];
  145. NSString *localizableName = [TUIGlobalization g_localizedStringForKey:name bundle:@"TUIChatFace"];
  146. data.name = name;
  147. data.path = TUIChatFaceImagePath(path);
  148. data.localizableName = localizableName;
  149. [emojiFaces addObject:data];
  150. }
  151. if (emojiFaces.count != 0) {
  152. TUIFaceGroup *emojiGroup = [[TUIFaceGroup alloc] init];
  153. emojiGroup.faces = emojiFaces;
  154. emojiGroup.groupIndex = 0;
  155. emojiGroup.groupPath = TUIChatFaceImagePath(@"emoji/");
  156. emojiGroup.menuPath = TUIChatFaceImagePath(@"emoji/menu");
  157. emojiGroup.rowCount = 1;
  158. emojiGroup.itemCountPerRow = 6;
  159. emojiGroup.needBackDelete = NO;
  160. emojiGroup.isNeedAddInInputBar = YES;
  161. return emojiGroup;
  162. }
  163. return nil;
  164. }
  165. - (void)updateRecentMenuQueue:(NSString *)faceName {
  166. NSArray *emojis = [self getChatPopMenuQueue];
  167. NSMutableArray *muArray = [NSMutableArray arrayWithArray:emojis];
  168. BOOL hasInQueue = NO;
  169. int index = 0;
  170. for (NSDictionary *dic in emojis) {
  171. NSString *name = [dic objectForKey:@"face_name"];
  172. if ([name isEqualToString:faceName]) {
  173. hasInQueue = YES;
  174. break;
  175. }
  176. index ++;
  177. }
  178. if (hasInQueue) {
  179. NSDictionary *targetDic = emojis[index];
  180. [muArray removeObjectAtIndex:index];
  181. [muArray insertObject:targetDic atIndex:0];
  182. }else {
  183. [muArray removeLastObject];
  184. NSArray *emojis = [NSArray arrayWithContentsOfFile:TUIChatFaceImagePath(@"emoji/emoji.plist")];
  185. NSDictionary *targetDic = @{@"face_name" : faceName};
  186. for (NSDictionary *dic in emojis) {
  187. NSString *name = [dic objectForKey:@"face_name"];
  188. if ([name isEqualToString:faceName]) {
  189. targetDic = dic;
  190. break;
  191. }
  192. }
  193. [muArray insertObject:targetDic atIndex:0];
  194. }
  195. [[NSUserDefaults standardUserDefaults] setObject:muArray forKey:@"TUIChatPopMenuQueue"];
  196. [[NSUserDefaults standardUserDefaults] synchronize];
  197. }
  198. #pragma mark - resource
  199. - (void)addResourceToCache:(NSString *)path {
  200. [[TUIImageCache sharedInstance] addResourceToCache:path];
  201. }
  202. - (void)addFaceToCache:(NSString *)path {
  203. [[TUIImageCache sharedInstance] addFaceToCache:path];
  204. }
  205. @end