AccountUtils.java

  1package eu.siacs.conversations.utils;
  2
  3import android.app.Activity;
  4import android.content.Intent;
  5import android.view.Menu;
  6import android.view.MenuItem;
  7import android.widget.Toast;
  8
  9import com.google.common.primitives.Bytes;
 10import com.google.common.primitives.Longs;
 11
 12import java.nio.ByteBuffer;
 13import java.util.ArrayList;
 14import java.util.List;
 15import java.util.UUID;
 16
 17import eu.siacs.conversations.Config;
 18import eu.siacs.conversations.R;
 19import eu.siacs.conversations.entities.Account;
 20import eu.siacs.conversations.services.XmppConnectionService;
 21import eu.siacs.conversations.ui.XmppActivity;
 22
 23public class AccountUtils {
 24
 25    public static final Class<?> MANAGE_ACCOUNT_ACTIVITY;
 26
 27    static {
 28        MANAGE_ACCOUNT_ACTIVITY = getManageAccountActivityClass();
 29    }
 30
 31    public static boolean hasEnabledAccounts(final XmppConnectionService service) {
 32        final List<Account> accounts = service.getAccounts();
 33        for (Account account : accounts) {
 34            if (account.isOptionSet(Account.OPTION_DISABLED)) {
 35                return false;
 36            }
 37        }
 38        return false;
 39    }
 40
 41    public static String publicDeviceId(final Account account) {
 42        final UUID uuid;
 43        try {
 44            uuid = UUID.fromString(account.getUuid());
 45        } catch (final IllegalArgumentException e) {
 46            return account.getUuid();
 47        }
 48        final byte[] bytes =
 49                Bytes.concat(
 50                        Longs.toByteArray(uuid.getLeastSignificantBits()),
 51                        Longs.toByteArray(uuid.getLeastSignificantBits()));
 52        bytes[6] &= 0x0f; /* clear version        */
 53        bytes[6] |= 0x40; /* set to version 4     */
 54        bytes[8] &= 0x3f; /* clear variant        */
 55        bytes[8] |= 0x80; /* set to IETF variant  */
 56        final ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);
 57        return new UUID(byteBuffer.getLong(), byteBuffer.getLong()).toString();
 58    }
 59
 60    public static List<String> getEnabledAccounts(final XmppConnectionService service) {
 61        final ArrayList<String> accounts = new ArrayList<>();
 62        for (final Account account : service.getAccounts()) {
 63            if (account.isEnabled()) {
 64                accounts.add(account.getJid().asBareJid().toEscapedString());
 65            }
 66        }
 67        return accounts;
 68    }
 69
 70    public static Account getFirstEnabled(XmppConnectionService service) {
 71        final List<Account> accounts = service.getAccounts();
 72        for (Account account : accounts) {
 73            if (!account.isOptionSet(Account.OPTION_DISABLED)) {
 74                return account;
 75            }
 76        }
 77        return null;
 78    }
 79
 80    public static Account getFirst(XmppConnectionService service) {
 81        final List<Account> accounts = service.getAccounts();
 82        for (Account account : accounts) {
 83            return account;
 84        }
 85        return null;
 86    }
 87
 88    public static Account getPendingAccount(XmppConnectionService service) {
 89        Account pending = null;
 90        for (Account account : service.getAccounts()) {
 91            if (!account.isOptionSet(Account.OPTION_LOGGED_IN_SUCCESSFULLY)) {
 92                pending = account;
 93            } else {
 94                return null;
 95            }
 96        }
 97        return pending;
 98    }
 99
100    public static void launchManageAccounts(final Activity activity) {
101        if (MANAGE_ACCOUNT_ACTIVITY != null) {
102            activity.startActivity(new Intent(activity, MANAGE_ACCOUNT_ACTIVITY));
103        } else {
104            Toast.makeText(activity, R.string.feature_not_implemented, Toast.LENGTH_SHORT).show();
105        }
106    }
107
108    public static void launchManageAccount(final XmppActivity xmppActivity) {
109        final Account account = getFirst(xmppActivity.xmppConnectionService);
110        xmppActivity.switchToAccount(account);
111    }
112
113    private static Class<?> getManageAccountActivityClass() {
114        try {
115            return Class.forName("eu.siacs.conversations.ui.ManageAccountActivity");
116        } catch (final ClassNotFoundException e) {
117            return null;
118        }
119    }
120
121    public static void showHideMenuItems(final Menu menu) {
122        final MenuItem manageAccounts = menu.findItem(R.id.action_accounts);
123        final MenuItem manageAccount = menu.findItem(R.id.action_account);
124        if (manageAccount != null) {
125            manageAccount.setVisible(MANAGE_ACCOUNT_ACTIVITY == null);
126        }
127        if (manageAccounts != null) {
128            manageAccounts.setVisible(MANAGE_ACCOUNT_ACTIVITY != null);
129        }
130    }
131}