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