From ecd24a6d80df09d17d715e85d3ce64168a03e9a4 Mon Sep 17 00:00:00 2001 From: Damian Minkov Date: Thu, 28 Jun 2012 09:00:29 +0000 Subject: [PATCH] Adds status icon in front of auto answer items to easily detect when it is enabled. --- resources/images/images.properties | 1 + .../impl/gui/common/autoAnswerCheck.png | Bin 0 -> 2050 bytes .../impl/gui/main/menus/AutoAnswerMenu.java | 182 ++++++++++++++---- .../impl/gui/utils/ImageLoader.java | 3 + ...rationSetPersistentPresenceJabberImpl.java | 3 +- ...nSetServerStoredAccountInfoJabberImpl.java | 13 +- .../sip/communicator/util/ImageUtils.java | 56 ++++++ 7 files changed, 213 insertions(+), 45 deletions(-) create mode 100644 resources/images/impl/gui/common/autoAnswerCheck.png diff --git a/resources/images/images.properties b/resources/images/images.properties index 86881b33d..b96951911 100644 --- a/resources/images/images.properties +++ b/resources/images/images.properties @@ -112,6 +112,7 @@ service.gui.icons.SD_VIDEO_ICON=resources/images/impl/gui/common/sdVideoIcon.png service.gui.icons.HD_VIDEO_ICON=resources/images/impl/gui/common/hdVideoIcon.png service.gui.icons.UNAUTHORIZED_CONTACT_PHOTO=resources/images/impl/gui/common/unauthorizedContact.png service.gui.icons.UNAUTHORIZED_CONTACT_16x16=resources/images/impl/gui/common/unauthorizedContact16x16.png +service.gui.icons.AUTO_ANSWER_CHECK=resources/images/impl/gui/common/autoAnswerCheck.png # Status icons service.gui.statusicons.USER_ONLINE_ICON=resources/images/impl/gui/common/statusicons/online.png diff --git a/resources/images/impl/gui/common/autoAnswerCheck.png b/resources/images/impl/gui/common/autoAnswerCheck.png new file mode 100644 index 0000000000000000000000000000000000000000..202a58a2643f0d2691057d0970b424d95eb779ca GIT binary patch literal 2050 zcmZ8h3pmsJ8~?H5M6MCz zOVaesVo>~D+3h(Ttk!1!(%p|z_lPcbYCX_0G<(1{@a$4TIisS|rQWN#mRlKTH4%xK zd$ZTJ0q3>$z4U!Y7ory? zKaCq@kJM-Pct^H$E5}s?KP2)I29L+ZnnrPI3y+#T4Kq0i+fU~UW6GX=ZnfAp?J@@z zq}84fC-Iyg2foTPstsjEy~dO$7X{Z@oI#&fR~ahr!g41JZ1V$Hw|r7#rZcNL8ck+l zr17ICw@sHC&N?uLx|(06#wf>q7?|47PIkW*;4NHDGS2c*WGVN;s$Iu0Y4}H%nr&zM zt~b}htlp36Gd;|_%(J#)S9ASjs#70wMKs*)#3Jp&3oltVW0;yEdHG zvJCfJI@Yv#7U_OR%Iro?%I3$qjDs#95Gl{O`%s=n+I5N|^<$JUzA21fpm3}2{9gN@ z_FIRAo-c#;50=QcspJ5`vBuKPOa?Y{5&7e$yo9mb=&r`sMD z+xu*tyA{*fQ5mn{IVtKd!QM^O*w_xn8Yn6venU<`3oBL|kKYF)h+kxA;d40k?C(Cbm-dTKl zl5Fm1NRQ~c?^R5&M;AwdHG zii4Ddp;R^n%n1#lv5*`zKLO<5`K0_Hl3ei~KRY~+AI1~oL6mEj}!7NEc zNi-sHOe%#5kF~_M5xuA0UZFhVF}w)ZV4pq35waHswN) zZ1KeWm)BNnO;+HvBrRarpsfEfboYF!0T!YOvK?02*l+b`{*{(~jz1RKHk0U7KbIW5 z5}J6kIAQ-_)o8ZrMB^Ln6sg_z=2>%_AOlNbn(}q?K*Wo9B~^coaoJOJdt*7uDZR+- z%xeq2(BJRV8h{*}s)=rM^V^7w$`HF!xo25Wg@`BA*(dnE>nOn)a^N)IdaN`R+99v& ztW@vU@#HqT0B?H2)j7Ezu#nC_a!xdGzW3C6+QzS`aZ<;U z-sG0r#HR=xrmZx>s(g5Yfwcd~(uGfe~qgEl3FY==mpCrE;)>|n((%5S}d$|UGo96+FWyum% zl@rF?=UbOgSsUnUbh+e{aP}dwW*NiWiB93`u~UCwMBach{IZ|6AIpIhoc!pprotocolProvider. * @param protocolProvider the ProtocolProviderService, for which @@ -218,7 +231,7 @@ private static void addAccountInternal( return; AutoAnswerMenuItem providerMenu = - new AutoAnswerMenuItem(protocolProvider); + new AutoAnswerMenuItem(protocolProvider, parentMenu); int lastAutoAnswerIx = 0; boolean isMenuAdded = false; @@ -254,7 +267,7 @@ else if (protocolCompare == 0) if (accountId.getDisplayName() .compareTo(menuAccountID.getDisplayName()) < 0) { - parentMenu.insert( providerMenu, menuIndex); + parentMenu.insert(providerMenu, menuIndex); isMenuAdded = true; break; } @@ -321,14 +334,7 @@ public static void removeAccount(ProtocolProviderService protocolProvider, if(ConfigurationManager.isAutoAnswerDisableSubmenu() && getAutoAnswerItemCount(parentMenu) == 1) { - AutoAnswerMenuItem item = getAutoAnswerItem(parentMenu, 0); - if(item != null) - { - item.setText(GuiActivator.getResources().getI18NString( - "service.gui.AUTO_ANSWER")); - item.setIcon(new ImageIcon( - ImageLoader.getImage(ImageLoader.CALL_16x16_ICON))); - } + updateItem(getAutoAnswerItem(parentMenu, 0), true); } } @@ -341,6 +347,62 @@ public void loadSkin() ImageLoader.getImage(ImageLoader.CALL_16x16_ICON))); } + /** + * Check whether any auto answer option is enabled for a protocol. + * @param providerService the provider. + * @return whether any auto answer option is enabled for a protocol. + */ + private static boolean isAutoAnswerEnabled( + ProtocolProviderService providerService) + { + OperationSetBasicAutoAnswer opset = providerService + .getOperationSet(OperationSetBasicAutoAnswer.class); + OperationSetAdvancedAutoAnswer opSetAdvanced = providerService + .getOperationSet(OperationSetAdvancedAutoAnswer.class); + + if(opset == null) + return false; + + if(opSetAdvanced != null) + { + if(opSetAdvanced.isAutoAnswerConditionSet()) + { + return true; + } + + if(!StringUtils.isNullOrEmpty(opSetAdvanced.getCallForward())) + { + return true; + } + } + + return opset.isAutoAnswerWithVideoSet() + || opset.isAutoAnswerUnconditionalSet(); + } + + /** + * Returns the icon for the provider. + * @param providerService the provider + * @param customProviderImage set custom provider image + * @return the image. + */ + private static Image getIconForProvider( + ProtocolProviderService providerService, Image customProviderImage, + ImageObserver imageObserver) + { + Image left = null; + if(isAutoAnswerEnabled(providerService)) + left = ImageLoader.getImage(ImageLoader.AUTO_ANSWER_CHECK); + + if(customProviderImage == null) + customProviderImage = ImageUtils.getBytesInImage( + providerService.getProtocolIcon().getIcon( + ProtocolIcon.ICON_SIZE_16x16)); + + return ImageUtils.getComposedImage( + left, customProviderImage, imageObserver); + } + /** * Listens for new protocol providers. */ @@ -411,17 +473,23 @@ private static class AutoAnswerMenuItem */ private ProtocolProviderService providerService; + /** + * The parent menu. + */ + private final SIPCommMenu parentMenu; + /** * Init the menu item. * @param provider the provider. + * @param parentMenu the parent menu. */ - AutoAnswerMenuItem(ProtocolProviderService provider) + AutoAnswerMenuItem(ProtocolProviderService provider, + SIPCommMenu parentMenu) { this(provider, - getItemDisplayName(provider), - ImageUtils.getBytesInImage( - provider.getProtocolIcon().getIcon( - ProtocolIcon.ICON_SIZE_16x16))); + getItemDisplayName(provider), + getIconForProvider(provider, null, parentMenu), + parentMenu); } /** @@ -429,13 +497,16 @@ private static class AutoAnswerMenuItem * @param provider the provider. * @param displayName the display name of the item. * @param onlineImage the icon to display + * @param parentMenu the parent menu. */ private AutoAnswerMenuItem(ProtocolProviderService provider, String displayName, - Image onlineImage) + Image onlineImage, + SIPCommMenu parentMenu) { super(displayName, new ImageIcon(onlineImage)); this.providerService = provider; + this.parentMenu = parentMenu; this.addActionListener(this); } @@ -455,7 +526,8 @@ public ProtocolProviderService getProtocolProvider() */ public void actionPerformed(ActionEvent e) { - new AutoAnswerOptionsDialog(providerService).setVisible(true); + new AutoAnswerOptionsDialog(providerService, parentMenu) + .setVisible(true); } /** @@ -554,14 +626,22 @@ private static class AutoAnswerOptionsDialog */ private JTextField callFwdNumberField = new JTextField(); + /** + * The parent menu. + */ + private final SIPCommMenu parentMenu; + /** * Create dialog. * @param providerService provider. + * @param parentMenu the parent menu. */ - AutoAnswerOptionsDialog(ProtocolProviderService providerService) + AutoAnswerOptionsDialog(ProtocolProviderService providerService, + SIPCommMenu parentMenu) { super(false); + this.parentMenu = parentMenu; this.providerService = providerService; this.setTitle(GuiActivator.getResources() @@ -801,6 +881,24 @@ else if(callFwd.isSelected()) opset.setAutoAnswerWithVideo( answerWithVideoCheckBox.isSelected()); + + // as settings changed lets update items + if( ConfigurationManager.isAutoAnswerDisableSubmenu() + && getAutoAnswerItemCount(parentMenu) == 1) + { + updateItem(getAutoAnswerItem(parentMenu, 0), true); + } + else + { + for(int i = 0; i < parentMenu.getItemCount(); i++) + { + JMenuItem item = parentMenu.getItem(i); + if(item instanceof AutoAnswerMenuItem) + { + updateItem((AutoAnswerMenuItem)item, false); + } + } + } } dispose(); diff --git a/src/net/java/sip/communicator/impl/gui/utils/ImageLoader.java b/src/net/java/sip/communicator/impl/gui/utils/ImageLoader.java index fe8a52c6f..e589bd445 100644 --- a/src/net/java/sip/communicator/impl/gui/utils/ImageLoader.java +++ b/src/net/java/sip/communicator/impl/gui/utils/ImageLoader.java @@ -1603,6 +1603,9 @@ public class ImageLoader public static final ImageID SOUND_SETTING_BUTTON_PRESSED = new ImageID("service.gui.soundlevel.SOUND_SETTING_BUTTON_PRESSED"); + public static final ImageID AUTO_ANSWER_CHECK + = new ImageID("service.gui.icons.AUTO_ANSWER_CHECK"); + /** * Loads an image from a given image identifier. * diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetPersistentPresenceJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetPersistentPresenceJabberImpl.java index 5a587b335..27b8e25f3 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetPersistentPresenceJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetPersistentPresenceJabberImpl.java @@ -1344,7 +1344,8 @@ public void createAccountPhotoPresenceInterceptor() } catch(XMPPException ex) { - logger.info("Can not retrieve account avatar", ex); + logger.info("Can not retrieve account avatar for " + + parentProvider.getOurJID() + ": " + ex.getMessage()); } // Creates the presence extension to generates the the element diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetServerStoredAccountInfoJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetServerStoredAccountInfoJabberImpl.java index 642e172dd..8431277ae 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetServerStoredAccountInfoJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetServerStoredAccountInfoJabberImpl.java @@ -12,8 +12,8 @@ import net.java.sip.communicator.service.protocol.event.*; import net.java.sip.communicator.service.protocol.ServerStoredDetails.*; +import net.java.sip.communicator.util.*; import org.jivesoftware.smack.*; -import org.jivesoftware.smackx.packet.*; /** * The Account Info Operation set is a means of accessing and modifying detailed @@ -25,6 +25,15 @@ public class OperationSetServerStoredAccountInfoJabberImpl extends AbstractOperationSetServerStoredAccountInfo { + /** + * The logger. + */ + private static final Logger logger = + Logger.getLogger(OperationSetServerStoredAccountInfoJabberImpl.class); + + /** + * The info retriever. + */ private InfoRetreiver infoRetreiver = null; /** @@ -387,7 +396,7 @@ private boolean uploadImageDetail( } catch (XMPPException xmppe) { - xmppe.printStackTrace(); + logger.error("Error loading/saving vcard: ", xmppe); } return isPhotoChanged; diff --git a/src/net/java/sip/communicator/util/ImageUtils.java b/src/net/java/sip/communicator/util/ImageUtils.java index c94616322..002dcdea1 100644 --- a/src/net/java/sip/communicator/util/ImageUtils.java +++ b/src/net/java/sip/communicator/util/ImageUtils.java @@ -390,4 +390,60 @@ public static Image getBytesInImage(byte[] imageBytes) } return image; } + + /** + * Creates a composed image from two images. If one of the images + * is missing will add an empty space on its place. + * @param leftImage the left image. + * @param rightImage the right image + * @param imageObserver need to calculate image sizes. + * @return the composed image. + */ + public static Image getComposedImage( + Image leftImage, Image rightImage, + ImageObserver imageObserver) + { + int height = 0; + if(leftImage == null && rightImage == null) + return null; + if(leftImage != null && rightImage != null) + height = Math.max(leftImage.getHeight(imageObserver), + rightImage.getHeight(imageObserver)); + else if(leftImage == null) + height = rightImage.getHeight(imageObserver); + else + height = leftImage.getHeight(imageObserver); + + int width = 0; + int leftWidth = 0; + if(leftImage != null && rightImage != null) + { + leftWidth = leftImage.getWidth(imageObserver); + width = leftWidth + + rightImage.getWidth(imageObserver); + } + else if(leftImage == null) + { + leftWidth = rightImage.getWidth(imageObserver); + width = leftWidth*2; + } + else + { + leftWidth = leftImage.getWidth(imageObserver); + width = leftWidth*2; + } + + BufferedImage buffImage = + new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + Graphics2D g = (Graphics2D) buffImage.getGraphics(); + + AntialiasingManager.activateAntialiasing(g); + g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); + if(leftImage != null) + g.drawImage(leftImage, 0, 0, null); + if(rightImage != null) + g.drawImage(rightImage, leftWidth + 1, 0, null); + + return buffImage; + } }