Skip to content

Commit 6e4475a

Browse files
committed
2.0.1
1 parent 632cc16 commit 6e4475a

File tree

7 files changed

+136
-19
lines changed

7 files changed

+136
-19
lines changed

conf/nbs.db

0 Bytes
Binary file not shown.

src/main/java/io/nbs/client/adapter/ContactsItemAdapter.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import io.nbs.client.listener.AbstractMouseListener;
1010
import io.nbs.commons.utils.AvatarUtil;
1111
import io.nbs.commons.helper.CharacterParser;
12+
import org.apache.commons.lang3.StringUtils;
1213

1314
import javax.swing.*;
1415
import java.awt.*;
@@ -103,10 +104,15 @@ public void onBindHeaderViewHolder(AvatarViewHolder viewHolder, int position) {
103104
public void onBindViewHolder(ContactsItemViewHolder viewHolder, int position) {
104105
viewHolders.add(position, viewHolder);
105106
ContactsItem item = contactsItems.get(position);
106-
107+
String avatarFile = StringUtils.isBlank(item.getFormid()) ? item.getName() : item.getFormid();
108+
Image image;
109+
if(StringUtils.isNotBlank(item.getFormid())){
110+
image = AvatarUtil.createOrLoadUserAvatar(item.getFormid(),true,item.getAvatarSuffix());
111+
}else {
112+
image = AvatarUtil.createOrLoadUserAvatar(item.getName(),false,null);
113+
}
107114
ImageIcon icon = new ImageIcon();
108-
icon.setImage(AvatarUtil.createOrLoadUserAvatar(item.getName())
109-
.getScaledInstance(40, 40, Image.SCALE_SMOOTH));
115+
icon.setImage(image.getScaledInstance(40, 40, Image.SCALE_SMOOTH));
110116
viewHolder.avatar.setIcon(icon);
111117

112118
viewHolder.roomName.setText(item.getName());

src/main/java/io/nbs/client/helper/AvatarImageHandler.java

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public class AvatarImageHandler {
3232
private static final int DEFAULT_THUMB_SIZE = 128;
3333
private static final int DEFAULT_PROFILE_AVATAR_SIZE = 128;
3434
private static final int DEFAULT_PROFILE_THUMB_SIZE = 48;
35-
private static final int DEFAULT_CONTACTS_THUMB_SIZE = 40;
35+
private static final int DEFAULT_CONTACTS_THUMB_SIZE = 64;
3636
private static AvatarImageHandler ourInstance = new AvatarImageHandler();
3737

3838
public static AvatarImageHandler getInstance() {
@@ -63,7 +63,7 @@ public static AvatarImageHandler getInstance() {
6363

6464
private AvatarImageHandler() {
6565
AVATAR_PROFILE_HOME = AppGlobalCnst.consturactPath(Launcher.appBasePath,"profile","avatars");
66-
AVATAR_ORIGIN_HOME = AppGlobalCnst.consturactPath(Launcher.appBasePath,"profile","origin");
66+
AVATAR_ORIGIN_HOME = AppGlobalCnst.consturactPath(Launcher.appBasePath,"cache","avatars");
6767
AVATAR_CUSTOM_HOME = AppGlobalCnst.consturactPath(Launcher.appBasePath,"cache","avatars","custom");
6868
}
6969

@@ -143,8 +143,6 @@ public void createdAvatar4Profile(File srcFile,String hashFileName) throws Excep
143143
File targetFile128 = new File(target128);
144144
generateThumbScale(srcFile,targetFile128,DEFAULT_PROFILE_AVATAR_SIZE);
145145

146-
File target64 = new File(AppGlobalCnst.consturactPath(AVATAR_PROFILE_HOME,"thumbs",originName));
147-
generateThumbScale(srcFile,target64,DEFAULT_PROFILE_THUMB_SIZE);
148146
}
149147

150148
/**
@@ -238,11 +236,58 @@ public static String getAvatarProfileHome() {
238236
return AVATAR_PROFILE_HOME;
239237
}
240238

239+
/**
240+
* 获取联系人缓存目录
241+
* @return
242+
*/
243+
public static String getAvatarCustomHome() {
244+
return AVATAR_CUSTOM_HOME;
245+
}
246+
241247
/**
242248
*
243249
* @return
244250
*/
245251
public static String getAvatarOriginHome() {
246252
return AVATAR_ORIGIN_HOME;
247253
}
254+
255+
/**
256+
*
257+
* @param srcFile
258+
* @param size
259+
* @return
260+
*/
261+
public ImageIcon getAvatarScaleIcon(File srcFile,int size){
262+
if(!srcFile.exists()||srcFile.isDirectory())return null;
263+
if(size<20)size=20;
264+
try {
265+
String fineName = srcFile.getName();
266+
BufferedImage image = ImageIO.read(srcFile);
267+
int oriWidth = image.getWidth();
268+
int oriHeight = image.getHeight();
269+
float oriScale = oriWidth*1.0F/oriHeight;
270+
int nW=32,nH=32;
271+
float zipScale = 1.0F;
272+
if(oriScale>=1.0F){
273+
//按宽压缩
274+
nW= size;
275+
zipScale = size*1.0F/oriWidth;
276+
nH = (int)(oriHeight*zipScale);
277+
}else{
278+
nH = size;
279+
zipScale = size*1.0F/oriHeight;
280+
nW = (int)(oriWidth*zipScale);
281+
}
282+
283+
ImageIcon newIcon = new ImageIcon(AppGlobalCnst.consturactPath(AVATAR_CUSTOM_HOME,"f"+size,fineName));
284+
image.getScaledInstance(nW,nH,Image.SCALE_SMOOTH);
285+
newIcon.setImage(image);
286+
return newIcon;
287+
} catch (IOException e) {
288+
e.printStackTrace();
289+
return null;
290+
}
291+
292+
}
248293
}

src/main/java/io/nbs/client/ui/panels/ToolbarPanel.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import io.nbs.commons.utils.IconUtil;
1313
import org.apache.commons.lang3.StringUtils;
1414

15+
import javax.imageio.ImageIO;
1516
import javax.swing.*;
1617
import java.awt.*;
1718
import java.awt.event.ActionEvent;
@@ -94,10 +95,12 @@ private ImageIcon getAvatarIcon(PeerInfo peer){
9495
ImageIcon icon;
9596
if(peer!=null&&StringUtils.isNotBlank(peer.getId())
9697
&&StringUtils.isNotBlank(peer.getAvatarSuffix())){
97-
String a48Path = AppGlobalCnst.consturactPath(AvatarImageHandler.getAvatarProfileHome(),"thumbs",peer.getAvatarName());
98-
System.out.println(a48Path);
98+
String a48Path = AppGlobalCnst.consturactPath(AvatarImageHandler.getAvatarProfileHome(),peer.getAvatarName());
99+
//System.out.println(a48Path);
99100
if((new File(a48Path)).exists()){
100101
icon = new ImageIcon(a48Path);
102+
Image image = icon.getImage().getScaledInstance(42,48,Image.SCALE_SMOOTH);
103+
icon.setImage(image);
101104
}else {
102105
icon = IconUtil.getIcon(this,"/icons/lambor48.png");
103106
}

src/main/java/io/nbs/client/ui/panels/info/InfoHeaderPanel.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@
2020
import io.nbs.sdk.prot.IPMParser;
2121
import org.apache.commons.lang3.StringUtils;
2222

23+
import javax.imageio.ImageIO;
2324
import javax.swing.*;
2425
import java.awt.*;
2526
import java.awt.event.MouseAdapter;
2627
import java.awt.event.MouseEvent;
28+
import java.awt.image.BufferedImage;
2729
import java.io.File;
2830
import java.io.FileOutputStream;
2931
import java.io.IOException;
@@ -211,7 +213,7 @@ private void uploadAvatar(){
211213
//上传前先压缩
212214
imageHandler.createdAvatar4Profile(file,name);
213215
File file128 = new File(AppGlobalCnst.consturactPath(AvatarImageHandler.getAvatarProfileHome(),name));
214-
file128.getAbsolutePath();
216+
215217
NamedStreamable.FileWrapper fileWrapper = new NamedStreamable.FileWrapper(file128);
216218
//上传ipfs
217219
nodes = ipfs.add(fileWrapper);
@@ -227,17 +229,18 @@ private void uploadAvatar(){
227229

228230
//TODO 存数据库upload
229231
/**
230-
* 40*40
232+
* 创建Hash 头像 :cache/avatar/custom
231233
*/
232234
String hashFileName = fileHash+".png";
233235
try {
234236
imageHandler.createContactsAvatar(file,hashFileName);
235-
Image img =Toolkit.getDefaultToolkit().getImage(AppGlobalCnst.consturactPath(AvatarImageHandler.getAvatarProfileHome(),name));
236-
ImageIcon icon = new ImageIcon(img);
237-
logger.warn(icon.getDescription());
238-
if(icon!=null){
237+
BufferedImage image = ImageIO.read(file128);
238+
ImageIcon avatarIcon = AvatarImageHandler.getInstance().getAvatarScaleIcon(file128,128);
239+
240+
logger.info( file128.getAbsolutePath());
241+
if(avatarIcon!=null){
239242
logger.info(fileHash);
240-
avatarLabel.setIcon(icon);
243+
avatarLabel.setIcon(avatarIcon);
241244
avatarLabel.validate();
242245
avatarLabel.updateUI();
243246
MainFrame.getContext().refreshAvatar();

src/main/java/io/nbs/commons/utils/AvatarUtil.java

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,20 @@
44
import io.nbs.client.cnsts.AppGlobalCnst;
55
import io.nbs.client.cnsts.FontUtil;
66
import io.nbs.client.cnsts.ColorCnst;
7+
import io.nbs.client.helper.AvatarImageHandler;
8+
import io.nbs.commons.helper.ConfigurationHelper;
9+
import org.slf4j.Logger;
10+
import org.slf4j.LoggerFactory;
711

812
import javax.imageio.ImageIO;
13+
import javax.swing.*;
914
import java.awt.*;
1015
import java.awt.geom.RoundRectangle2D;
1116
import java.awt.image.BufferedImage;
1217
import java.io.File;
1318
import java.io.FileNotFoundException;
1419
import java.io.IOException;
20+
import java.net.URL;
1521
import java.util.HashMap;
1622
import java.util.Map;
1723

@@ -25,7 +31,7 @@
2531
*/
2632
public class AvatarUtil {
2733
private static final Color[] colorArr;
28-
34+
private static Logger logger = LoggerFactory.getLogger(AvatarUtil.class);
2935
static
3036
{
3137
colorArr = new Color[]{
@@ -62,7 +68,7 @@ public class AvatarUtil {
6268

6369
static
6470
{
65-
AVATAR_CACHE_ROOT = AppGlobalCnst.consturactPath(Launcher.appBasePath,"cache","avatars");
71+
AVATAR_CACHE_ROOT = AvatarImageHandler.getAvatarOriginHome();
6672

6773
File file = new File(AVATAR_CACHE_ROOT);
6874
if (!file.exists())
@@ -71,7 +77,7 @@ public class AvatarUtil {
7177
System.out.println("创建头像缓存目录:" + file.getAbsolutePath());
7278
}
7379

74-
CUSTOM_AVATAR_CACHE_ROOT = AVATAR_CACHE_ROOT + "/custom";
80+
CUSTOM_AVATAR_CACHE_ROOT = AvatarImageHandler.getAvatarCustomHome();
7581
file = new File(CUSTOM_AVATAR_CACHE_ROOT);
7682
if (!file.exists())
7783
{
@@ -128,6 +134,48 @@ public static Image createOrLoadGroupAvatar(String groupName, String[] members,
128134
return avatar;
129135
}
130136

137+
/**
138+
* 获取联系人头像,如果是hash则先从IPFS获取
139+
* @param identify
140+
* @param isHash
141+
* @param suffix
142+
* @return
143+
*/
144+
public static Image createOrLoadUserAvatar(String identify,boolean isHash,String suffix){
145+
String avatarPath;
146+
Image avatar;
147+
avatar = avatarCache.get(identify);
148+
if(avatar!=null)return avatar;
149+
150+
if(isHash){
151+
avatarPath = AppGlobalCnst.consturactPath(CUSTOM_AVATAR_CACHE_ROOT,identify+".png");
152+
File temFile = new File(avatarPath);
153+
try {
154+
if(temFile.exists()){
155+
avatar = ImageIO.read(temFile);
156+
avatarCache.put(identify,avatar);
157+
return avatar;
158+
}else {//不存在下载
159+
File temCacheFile = new File(AppGlobalCnst.consturactPath(AVATAR_CACHE_ROOT,identify+suffix));
160+
URL url = new URL(ConfigurationHelper.getInstance().getGateWayURL()+identify);
161+
AvatarImageHandler.getInstance().getFileFromIPFS(url,temCacheFile);
162+
avatar = ImageIO.read(url);
163+
avatarCache.put(identify,avatar);
164+
return avatar;
165+
}
166+
} catch (Exception e) {
167+
logger.warn(e.getMessage(),e.getCause());
168+
avatar = null;
169+
}
170+
}
171+
if(avatar==null){
172+
avatar = createAvatar(identify,identify);
173+
avatarCache.put(identify,avatar);
174+
175+
}
176+
return avatar;
177+
}
178+
131179
/**
132180
*
133181
* @param username

src/main/java/io/nbs/sdk/beans/MessageItem.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ public class MessageItem implements Comparable<MessageItem> {
6161
private int messageType;
6262

6363
private long updatedAt;
64+
/**
65+
* 头像hash
66+
*/
67+
private String avatar;
6468

6569

6670

@@ -182,4 +186,12 @@ public long getUpdatedAt() {
182186
public void setUpdatedAt(long updatedAt) {
183187
this.updatedAt = updatedAt;
184188
}
189+
190+
public String getAvatar() {
191+
return avatar;
192+
}
193+
194+
public void setAvatar(String avatar) {
195+
this.avatar = avatar;
196+
}
185197
}

0 commit comments

Comments
 (0)