mirror of
https://github.com/igniterealtime/Spark.git
synced 2025-12-01 12:27:58 +00:00
Refactor avatar updating.
git-svn-id: http://svn.igniterealtime.org/svn/repos/spark/trunk@9067 b35dd754-fafc-0310-a699-88a17e54d16e
This commit is contained in:
@ -15,13 +15,14 @@ import org.jivesoftware.resource.Res;
|
||||
import org.jivesoftware.resource.SparkRes;
|
||||
import org.jivesoftware.smack.XMPPConnection;
|
||||
import org.jivesoftware.smack.packet.Presence;
|
||||
import org.jivesoftware.smackx.debugger.EnhancedDebuggerWindow;
|
||||
import org.jivesoftware.spark.SparkManager;
|
||||
import org.jivesoftware.spark.ui.ChatFrame;
|
||||
import org.jivesoftware.spark.util.BrowserLauncher;
|
||||
import org.jivesoftware.spark.util.GraphicUtils;
|
||||
import org.jivesoftware.spark.util.ResourceUtils;
|
||||
import org.jivesoftware.spark.util.SwingTimerTask;
|
||||
import org.jivesoftware.spark.util.SwingWorker;
|
||||
import org.jivesoftware.spark.util.TaskEngine;
|
||||
import org.jivesoftware.spark.util.URLFileSystem;
|
||||
import org.jivesoftware.spark.util.log.Log;
|
||||
import org.jivesoftware.sparkimpl.plugin.alerts.InputTextAreaDialog;
|
||||
@ -30,6 +31,20 @@ import org.jivesoftware.sparkimpl.settings.local.LocalPreferences;
|
||||
import org.jivesoftware.sparkimpl.settings.local.SettingsManager;
|
||||
import org.jivesoftware.sparkimpl.updater.CheckUpdates;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Color;
|
||||
import java.awt.Font;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.WindowAdapter;
|
||||
import java.awt.event.WindowEvent;
|
||||
import java.awt.event.WindowFocusListener;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.TimerTask;
|
||||
|
||||
import javax.swing.AbstractAction;
|
||||
import javax.swing.Action;
|
||||
import javax.swing.ImageIcon;
|
||||
@ -44,22 +59,6 @@ import javax.swing.JSplitPane;
|
||||
import javax.swing.JTextPane;
|
||||
import javax.swing.JToolBar;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Color;
|
||||
import java.awt.Font;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.WindowAdapter;
|
||||
import java.awt.event.WindowEvent;
|
||||
import java.awt.event.WindowFocusListener;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.sql.Date;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
/**
|
||||
* The <code>MainWindow</code> class acts as both the DockableHolder and the proxy
|
||||
* to the Workspace in Spark.
|
||||
@ -272,7 +271,7 @@ public final class MainWindow extends ChatFrame implements ActionListener {
|
||||
if (con.isConnected() && sendStatus) {
|
||||
final InputTextAreaDialog inputTextDialog = new InputTextAreaDialog();
|
||||
status = inputTextDialog.getInput(Res.getString("title.status.message"), Res.getString("message.current.status"),
|
||||
SparkRes.getImageIcon(SparkRes.USER1_MESSAGE_24x24), this);
|
||||
SparkRes.getImageIcon(SparkRes.USER1_MESSAGE_24x24), this);
|
||||
}
|
||||
|
||||
// Notify all MainWindowListeners
|
||||
@ -382,7 +381,7 @@ public final class MainWindow extends ChatFrame implements ActionListener {
|
||||
if (!Spark.isMac()) {
|
||||
connectMenu.add(exitMenuItem);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Action updateAction = new AbstractAction() {
|
||||
public void actionPerformed(ActionEvent actionEvent) {
|
||||
@ -465,15 +464,14 @@ public final class MainWindow extends ChatFrame implements ActionListener {
|
||||
}
|
||||
});
|
||||
|
||||
int delay = 15000; // 15 sec
|
||||
Date timeToRun = new Date(System.currentTimeMillis() + delay);
|
||||
Timer timer = new Timer();
|
||||
|
||||
timer.schedule(new TimerTask() {
|
||||
public void run() {
|
||||
// Execute spark update checker after one minute.
|
||||
final TimerTask task = new SwingTimerTask() {
|
||||
public void doRun() {
|
||||
checkForUpdates(false);
|
||||
}
|
||||
}, timeToRun);
|
||||
};
|
||||
|
||||
TaskEngine.getInstance().schedule(task, 60000);
|
||||
|
||||
}
|
||||
|
||||
@ -578,7 +576,7 @@ public final class MainWindow extends ChatFrame implements ActionListener {
|
||||
*/
|
||||
private static void showAboutBox() {
|
||||
JOptionPane.showMessageDialog(SparkManager.getMainWindow(), Default.getString(Default.APPLICATION_NAME) + " " + JiveInfo.getVersion(),
|
||||
"About", JOptionPane.INFORMATION_MESSAGE);
|
||||
"About", JOptionPane.INFORMATION_MESSAGE);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -18,15 +18,10 @@ import org.jivesoftware.smack.packet.PacketExtension;
|
||||
import org.jivesoftware.smack.packet.Presence;
|
||||
import org.jivesoftware.smack.packet.RosterPacket;
|
||||
import org.jivesoftware.smack.util.StringUtils;
|
||||
import org.jivesoftware.smackx.packet.VCard;
|
||||
import org.jivesoftware.spark.ChatManager;
|
||||
import org.jivesoftware.spark.PresenceManager;
|
||||
import org.jivesoftware.spark.SparkManager;
|
||||
import org.jivesoftware.spark.util.GraphicUtils;
|
||||
import org.jivesoftware.spark.util.ModelUtil;
|
||||
import org.jivesoftware.spark.util.TaskEngine;
|
||||
import org.jivesoftware.spark.util.log.Log;
|
||||
import org.jivesoftware.sparkimpl.profile.VCardManager;
|
||||
import org.jivesoftware.sparkimpl.settings.local.LocalPreferences;
|
||||
import org.jivesoftware.sparkimpl.settings.local.SettingsManager;
|
||||
|
||||
@ -35,14 +30,11 @@ import java.awt.Font;
|
||||
import java.awt.GridBagConstraints;
|
||||
import java.awt.GridBagLayout;
|
||||
import java.awt.Insets;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.File;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import javax.swing.Icon;
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.UIManager;
|
||||
@ -257,7 +249,7 @@ public class ContactItem extends JPanel {
|
||||
this.hash = hash;
|
||||
|
||||
if (!hashExists(hash)) {
|
||||
updateAvatar(hash);
|
||||
updateAvatar();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -300,41 +292,9 @@ public class ContactItem extends JPanel {
|
||||
|
||||
/**
|
||||
* Persists the avatar locally based on the new hash.
|
||||
*
|
||||
* @param hash the new hash.
|
||||
*/
|
||||
private void updateAvatar(final String hash) {
|
||||
Runnable updateRunnable = new Runnable() {
|
||||
public void run() {
|
||||
contactsDir.mkdirs();
|
||||
|
||||
final File imageFile = new File(contactsDir, hash);
|
||||
|
||||
VCard vcard = SparkManager.getVCardManager().reloadVCard(getJID());
|
||||
|
||||
try {
|
||||
byte[] bytes = vcard.getAvatar();
|
||||
if (bytes != null) {
|
||||
ImageIcon icon = new ImageIcon(bytes);
|
||||
icon = VCardManager.scale(icon);
|
||||
if (icon != null && icon.getIconWidth() != -1) {
|
||||
BufferedImage image = GraphicUtils.convert(icon.getImage());
|
||||
if (image == null) {
|
||||
Log.warning("Unable to write out avatar for " + getJID());
|
||||
}
|
||||
else {
|
||||
ImageIO.write(image, "PNG", imageFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
Log.error("Unable to update avatar in Contact Item.", e);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
TaskEngine.getInstance().submit(updateRunnable);
|
||||
private void updateAvatar() {
|
||||
SparkManager.getVCardManager().addToQueue(getJID());
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
|
||||
@ -87,6 +87,8 @@ public class VCardManager {
|
||||
|
||||
private LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>();
|
||||
|
||||
private File contactsDir;
|
||||
|
||||
|
||||
/**
|
||||
* Initialize VCardManager.
|
||||
@ -111,6 +113,10 @@ public class VCardManager {
|
||||
vcardStorageDirectory = new File(SparkManager.getUserDirectory(), "vcards");
|
||||
vcardStorageDirectory.mkdirs();
|
||||
|
||||
// Set the current user directory.
|
||||
contactsDir = new File(SparkManager.getUserDirectory(), "contacts");
|
||||
contactsDir.mkdirs();
|
||||
|
||||
initializeUI();
|
||||
|
||||
// Intercept all presence packets being sent and append vcard information.
|
||||
@ -178,7 +184,7 @@ public class VCardManager {
|
||||
*
|
||||
* @param jid the jid to lookup.
|
||||
*/
|
||||
private void addToQueue(String jid) {
|
||||
public void addToQueue(String jid) {
|
||||
if (!queue.contains(jid)) {
|
||||
queue.add(jid);
|
||||
}
|
||||
@ -580,6 +586,24 @@ public class VCardManager {
|
||||
byte[] bytes = vcard.getAvatar();
|
||||
if (bytes != null) {
|
||||
vcard.setAvatar(bytes);
|
||||
try {
|
||||
String hash = org.jivesoftware.spark.util.StringUtils.hash(bytes);
|
||||
final File avatarFile = new File(contactsDir, hash);
|
||||
ImageIcon icon = new ImageIcon(bytes);
|
||||
icon = VCardManager.scale(icon);
|
||||
if (icon != null && icon.getIconWidth() != -1) {
|
||||
BufferedImage image = GraphicUtils.convert(icon.getImage());
|
||||
if (image == null) {
|
||||
Log.warning("Unable to write out avatar for " + jid);
|
||||
}
|
||||
else {
|
||||
ImageIO.write(image, "PNG", avatarFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
Log.error("Unable to update avatar in Contact Item.", e);
|
||||
}
|
||||
}
|
||||
|
||||
// Set timestamp
|
||||
|
||||
Reference in New Issue
Block a user