diff --git a/smack-core/src/main/java/org/jivesoftware/smack/packet/Presence.java b/smack-core/src/main/java/org/jivesoftware/smack/packet/Presence.java
index 198d99c420..1332613253 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/packet/Presence.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/packet/Presence.java
@@ -107,7 +107,8 @@ public Presence(Presence other) {
* equivalent to getType() == Presence.Type.available. Note that even
* when the user is available, their presence mode may be {@link Mode#away away},
* {@link Mode#xa extended away} or {@link Mode#dnd do not disturb}. Use
- * {@link #isAway()} to determine if the user is away.
+ * {@link #isAway()} to determine if the user is away, or {@link #isActive()}
+ * to determine if user is available an not away.
*
* @return true if the presence type is available.
*/
@@ -129,6 +130,19 @@ public boolean isAway() {
return type == Type.available && (mode == Mode.away || mode == Mode.xa || mode == Mode.dnd);
}
+ /**
+ * Returns true if the presence signals availability ({@link #isAvailable()}) and no away mode ({@link #isAway()}). Otherwise, returns false.
+ * mode is {@link Mode#available available}, or {@link Mode#chat ready to chat}. False will be returned when the type or mode
+ * is any other value, including when the presence type is unavailable (offline).
+ * This is a convenience method equivalent to
+ * isAvailable() && !isAway().
+ *
+ * @return true if the presence type is available and the presence mode is available or chat.
+ */
+ public boolean isActive() {
+ return isAvailable() && !isAway();
+ }
+
@Override
public Type getType() {
return type;
diff --git a/smack-core/src/test/java/org/jivesoftware/smack/packet/PresenceTest.java b/smack-core/src/test/java/org/jivesoftware/smack/packet/PresenceTest.java
index 6c3b3e6a80..eecc14bf0d 100644
--- a/smack-core/src/test/java/org/jivesoftware/smack/packet/PresenceTest.java
+++ b/smack-core/src/test/java/org/jivesoftware/smack/packet/PresenceTest.java
@@ -172,9 +172,11 @@ public void isModeAwayTest() {
PresenceBuilder presence = getNewPresence();
presence.setMode(Presence.Mode.away);
assertTrue(presence.build().isAway());
+ assertFalse(presence.build().isActive());
presence.setMode(Presence.Mode.chat);
assertFalse(presence.build().isAway());
+ assertTrue(presence.build().isActive());
}
@Test