/** * Copyright (c) 2013, Redsolution LTD. All rights reserved. * * This file is part of Xabber project; you can redistribute it and/or * modify it under the terms of the GNU General Public License, Version 3. * * Xabber is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License, * along with this program. If not, see http://www.gnu.org/licenses/. */ package com.xabber.android.data.account; import com.xabber.android.R; import org.jivesoftware.smack.packet.Presence; import org.jivesoftware.smack.packet.Presence.Mode; /** * Status mode. * * @author alexander.ivanov */ public enum StatusMode { /** * Free to chat. */ chat, /** * Available. */ available, /** * Away. */ away, /** * Away for an extended period of time. */ xa, /** * Do not disturb. */ dnd, /** * Account is invisible. */ invisible, /** * The user is unavailable. */ unavailable, /** * Account is in connection state. * <p/> * Don't use it for {@link AccountManager#setStatus(String, StatusMode)}. */ connection, /** * Account is unable to get presence information. Account is unsubscribed. * <p/> * Don't use it for {@link AccountManager#setStatus(String, StatusMode)}. */ unsubscribed; /** * Creates new {@link StatusMode} form {@link Presence}. */ static public StatusMode createStatusMode(Presence presence) { if (presence == null) { return StatusMode.unavailable; } switch (presence.getType()) { case available: final Mode mode = presence.getMode(); if (mode == Mode.away) return StatusMode.away; else if (mode == Mode.chat) return StatusMode.chat; else if (mode == Mode.dnd) return StatusMode.dnd; else if (mode == Mode.xa) return StatusMode.xa; else return StatusMode.available; case error: case unsubscribed: return StatusMode.unsubscribed; case unavailable: case subscribe: case subscribed: case unsubscribe: case probe: return StatusMode.unavailable; } return StatusMode.unavailable; } /** * Get {@link Mode} for {@link StatusMode}. * * @return */ public Mode getMode() { if (this == StatusMode.away) return Mode.away; else if (this == StatusMode.chat) return Mode.chat; else if (this == StatusMode.dnd) return Mode.dnd; else if (this == StatusMode.xa) return Mode.xa; else if (this == StatusMode.available) return Mode.available; throw new IllegalStateException(); } /** * @return ID of the string resource. */ public int getStringID() { if (this == StatusMode.available) return R.string.available; else if (this == StatusMode.dnd) return R.string.dnd; else if (this == StatusMode.xa) return R.string.xa; else if (this == StatusMode.chat) return R.string.chat; else if (this == StatusMode.away) return R.string.away; else if (this == StatusMode.unsubscribed) return R.string.unsubscribed; else if (this == StatusMode.invisible) return R.string.invisible; return R.string.unavailable; } /** * @return Drawable level for status icon. */ public int getStatusLevel() { return ordinal(); } /** * @return Whether entity is online. */ public boolean isOnline() { return this != StatusMode.unavailable && this != unsubscribed; } }