Files
featherVoice/TUIKit/TUIChat/CommonModel/TUIEmojiConfig.m

236 lines
8.2 KiB
Mathematica
Raw Normal View History

2025-08-08 10:49:36 +08:00
//
// TUIEmojiConfig.m
// TUIEmojiPlugin
//
// Created by wyl on 2023/11/13.
// Copyright © 2023 Tencent. All rights reserved.
//
#import "TUIEmojiConfig.h"
typedef NS_ENUM(NSUInteger, TUIEmojiFaceType) {
TUIEmojiFaceTypeKeyBoard = 0,
TUIEmojiFaceTypePopDetail = 1,
TUIEmojiFaceTypePopContextDetail = 2,
};
@interface TUIEmojiConfig ()
@end
@implementation TUIEmojiConfig
+ (void)load {
NSLog(@"TUIEmojiConfig load%@",[TUIEmojiConfig defaultConfig]);
}
- (id)init {
self = [super init];
if (self) {
[self updateEmojiGroups];
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(onChangeLanguage) name:TUIChangeLanguageNotification object:nil];
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(onChangeTheme) name:TUIDidApplyingThemeChangedNotfication object:nil];
}
return self;
}
+ (id)defaultConfig {
static dispatch_once_t onceToken;
static TUIEmojiConfig *config;
dispatch_once(&onceToken, ^{
config = [[TUIEmojiConfig alloc] init];
});
return config;
}
- (void)appendFaceGroup:(TUIFaceGroup *)faceGroup {
NSMutableArray *faceGroupMenu = [NSMutableArray arrayWithArray:self.faceGroups];
[faceGroupMenu addObject:faceGroup];
self.faceGroups = faceGroupMenu;
}
- (void)onChangeLanguage {
[self updateEmojiGroups];
}
- (void)onChangeTheme { }
@end
@implementation TUIEmojiConfig (defaultFace)
- (void)updateEmojiGroups {
self.faceGroups = [self updateFaceGroups:self.faceGroups type:TUIEmojiFaceTypeKeyBoard];
self.chatPopDetailGroups = [self updateFaceGroups:self.chatPopDetailGroups type:TUIEmojiFaceTypePopDetail];
self.chatContextEmojiDetailGroups = [self updateFaceGroups:self.chatContextEmojiDetailGroups type:TUIEmojiFaceTypePopContextDetail];
}
- (NSArray *)updateFaceGroups:(NSArray *)groups type:(TUIEmojiFaceType)type {
if (groups.count) {
NSMutableArray *arrayM = [NSMutableArray arrayWithArray:groups];
[arrayM removeObjectAtIndex:0];
TUIFaceGroup *defaultFaceGroup = [self findFaceGroupAboutType:type];
if (defaultFaceGroup) {
[arrayM insertObject:[self findFaceGroupAboutType:type] atIndex:0];
}
return [NSArray arrayWithArray:arrayM];
} else {
NSMutableArray *faceArray = [NSMutableArray array];
TUIFaceGroup *defaultFaceGroup = [self findFaceGroupAboutType:type];
if (defaultFaceGroup) {
[faceArray addObject:defaultFaceGroup];
}
return faceArray;
}
return @[];
}
- (TUIFaceGroup *)findFaceGroupAboutType:(TUIEmojiFaceType)type {
// emoji group
NSMutableArray *emojiFaces = [NSMutableArray array];
NSArray *emojis = [NSArray arrayWithContentsOfFile:TUIChatFaceImagePath(@"emoji/emoji.plist")];
for (NSDictionary *dic in emojis) {
TUIFaceCellData *data = [[TUIFaceCellData alloc] init];
NSString *name = [dic objectForKey:@"face_name"];
NSString *fileName = [dic objectForKey:@"face_file"];
NSString *path = [NSString stringWithFormat:@"emoji/%@", fileName];
NSString *localizableName = [TUIGlobalization getLocalizedStringForKey:name bundle:@"TUIChatFace"];
data.name = name;
data.path = TUIChatFaceImagePath(path);
data.localizableName = localizableName;
[self addFaceToCache:data.path];
[emojiFaces addObject:data];
}
if (emojiFaces.count != 0) {
TUIFaceGroup *emojiGroup = [[TUIFaceGroup alloc] init];
emojiGroup.faces = emojiFaces;
emojiGroup.groupIndex = 0;
emojiGroup.groupPath = TUIChatFaceImagePath(@"emoji/");
emojiGroup.menuPath = TUIChatFaceImagePath(@"emoji/menu");
emojiGroup.isNeedAddInInputBar = YES;
emojiGroup.groupName = TIMCommonLocalizableString(TUIChatFaceGroupAllEmojiName);
if (type == TUIEmojiFaceTypeKeyBoard) {
emojiGroup.rowCount = 4;
emojiGroup.itemCountPerRow = 8;
emojiGroup.needBackDelete = NO;
} else if (type == TUIEmojiFaceTypePopDetail) {
emojiGroup.rowCount = 3;
emojiGroup.itemCountPerRow = 8;
emojiGroup.needBackDelete = NO;
}
else if (type == TUIEmojiFaceTypePopContextDetail) {
emojiGroup.rowCount = 20;
emojiGroup.itemCountPerRow = 7;
emojiGroup.needBackDelete = NO;
}
[self addFaceToCache:emojiGroup.menuPath];
[self addFaceToCache:TUIChatFaceImagePath(@"del_normal")];
[self addFaceToCache:TUIChatFaceImagePath(@"ic_unknown_image")];
return emojiGroup;
}
return nil;
}
#pragma mark - chatPopMenuQueue
- (NSArray *)getChatPopMenuQueue {
NSArray *emojis = [[NSUserDefaults standardUserDefaults] objectForKey:@"TUIChatPopMenuQueue"];
if (emojis && [emojis isKindOfClass:[NSArray class]]) {
if (emojis.count > 0) {
//Randomly check whether an emoticon matches the current emoticon resource package
//to avoid overwriting the installation context emoticon inconsistency.
NSDictionary *dic = emojis.lastObject;
NSString *name = [dic objectForKey:@"face_name"];
NSString *fileName = [dic objectForKey:@"face_file"];
NSString *path = [NSString stringWithFormat:@"emoji/%@", fileName];
UIImage * image = [UIImage imageWithContentsOfFile:TUIChatFaceImagePath(path)];
if (image) {
return emojis;
}
}
}
return [NSArray arrayWithContentsOfFile:TUIChatFaceImagePath(@"emoji/emojiRecentDefaultList.plist")];
}
- (TUIFaceGroup *)getChatPopMenuRecentQueue {
// emoji group
NSMutableArray *emojiFaces = [NSMutableArray array];
NSArray *emojis = [self getChatPopMenuQueue];
for (NSDictionary *dic in emojis) {
TUIFaceCellData *data = [[TUIFaceCellData alloc] init];
NSString *name = [dic objectForKey:@"face_name"];
NSString *fileName = [dic objectForKey:@"face_file"];
NSString *path = [NSString stringWithFormat:@"emoji/%@", fileName];
NSString *localizableName = [TUIGlobalization g_localizedStringForKey:name bundle:@"TUIChatFace"];
data.name = name;
data.path = TUIChatFaceImagePath(path);
data.localizableName = localizableName;
[emojiFaces addObject:data];
}
if (emojiFaces.count != 0) {
TUIFaceGroup *emojiGroup = [[TUIFaceGroup alloc] init];
emojiGroup.faces = emojiFaces;
emojiGroup.groupIndex = 0;
emojiGroup.groupPath = TUIChatFaceImagePath(@"emoji/");
emojiGroup.menuPath = TUIChatFaceImagePath(@"emoji/menu");
emojiGroup.rowCount = 1;
emojiGroup.itemCountPerRow = 6;
emojiGroup.needBackDelete = NO;
emojiGroup.isNeedAddInInputBar = YES;
return emojiGroup;
}
return nil;
}
- (void)updateRecentMenuQueue:(NSString *)faceName {
NSArray *emojis = [self getChatPopMenuQueue];
NSMutableArray *muArray = [NSMutableArray arrayWithArray:emojis];
BOOL hasInQueue = NO;
int index = 0;
for (NSDictionary *dic in emojis) {
NSString *name = [dic objectForKey:@"face_name"];
if ([name isEqualToString:faceName]) {
hasInQueue = YES;
break;
}
index ++;
}
if (hasInQueue) {
NSDictionary *targetDic = emojis[index];
[muArray removeObjectAtIndex:index];
[muArray insertObject:targetDic atIndex:0];
}else {
[muArray removeLastObject];
NSArray *emojis = [NSArray arrayWithContentsOfFile:TUIChatFaceImagePath(@"emoji/emoji.plist")];
NSDictionary *targetDic = @{@"face_name" : faceName};
for (NSDictionary *dic in emojis) {
NSString *name = [dic objectForKey:@"face_name"];
if ([name isEqualToString:faceName]) {
targetDic = dic;
break;
}
}
[muArray insertObject:targetDic atIndex:0];
}
[[NSUserDefaults standardUserDefaults] setObject:muArray forKey:@"TUIChatPopMenuQueue"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
#pragma mark - resource
- (void)addResourceToCache:(NSString *)path {
[[TUIImageCache sharedInstance] addResourceToCache:path];
}
- (void)addFaceToCache:(NSString *)path {
[[TUIImageCache sharedInstance] addFaceToCache:path];
}
@end