1package eu.siacs.conversations.services;
2
3
4import android.util.Log;
5
6import java.security.SecureRandom;
7import java.util.Collections;
8import java.util.Set;
9import java.util.WeakHashMap;
10import java.util.concurrent.atomic.AtomicBoolean;
11
12import eu.siacs.conversations.Config;
13import eu.siacs.conversations.entities.Account;
14import eu.siacs.conversations.utils.CryptoHelper;
15import eu.siacs.conversations.utils.PhoneNumberUtilWrapper;
16import io.michaelrocks.libphonenumber.android.Phonenumber;
17import rocks.xmpp.addr.Jid;
18
19public class QuickConversationsService {
20
21 private final XmppConnectionService service;
22
23 private final Set<OnVerificationRequested> mOnVerificationRequested = Collections.newSetFromMap(new WeakHashMap<>());
24 private final Set<OnVerification> mOnVerification = Collections.newSetFromMap(new WeakHashMap<>());
25
26 private final AtomicBoolean mVerificationInProgress = new AtomicBoolean(false);
27
28 QuickConversationsService(XmppConnectionService xmppConnectionService) {
29 this.service = xmppConnectionService;
30 }
31
32 public void addOnVerificationRequestedListener(OnVerificationRequested onVerificationRequested) {
33 synchronized (mOnVerificationRequested) {
34 mOnVerificationRequested.add(onVerificationRequested);
35 }
36 }
37
38 public void removeOnVerificationRequestedListener(OnVerificationRequested onVerificationRequested) {
39 synchronized (mOnVerificationRequested) {
40 mOnVerificationRequested.remove(onVerificationRequested);
41 }
42 }
43
44 public void addOnVerificationListener(OnVerification onVerification) {
45 synchronized (mOnVerification) {
46 mOnVerification.add(onVerification);
47 }
48 }
49
50 public void removeOnVerificationListener(OnVerification onVerification) {
51 synchronized (mOnVerification) {
52 mOnVerification.remove(onVerification);
53 }
54 }
55
56 public void requestVerification(Phonenumber.PhoneNumber phoneNumber) {
57 String local = PhoneNumberUtilWrapper.normalize(service, phoneNumber);
58 Log.d(Config.LOGTAG,"requesting verification for "+PhoneNumberUtilWrapper.normalize(service,phoneNumber));
59 Account account = new Account(Jid.of(local,"quick.conversations.im",null), CryptoHelper.createPassword(new SecureRandom()));
60 account.setOption(Account.OPTION_DISABLED, true);
61 account.setOption(Account.OPTION_UNVERIFIED, true);
62 service.createAccount(account);
63 synchronized (mOnVerificationRequested) {
64 for(OnVerificationRequested onVerificationRequested : mOnVerificationRequested) {
65 onVerificationRequested.onVerificationRequested();
66 }
67 }
68 }
69
70 public void verify(Account account, String pin) {
71 if (mVerificationInProgress.compareAndSet(false, true)) {
72 new Thread(() -> {
73 try {
74 Thread.sleep(5000);
75 synchronized (mOnVerification) {
76 for (OnVerification onVerification : mOnVerification) {
77 onVerification.onVerificationFailed();
78 }
79 }
80 } catch (InterruptedException e) {
81 e.printStackTrace();
82 } finally {
83 mVerificationInProgress.set(false);
84 }
85 }).start();
86 }
87 }
88
89 public boolean isVerifying() {
90 return mVerificationInProgress.get();
91 }
92
93 public interface OnVerificationRequested {
94 void onVerificationRequestFailed(int code);
95 void onVerificationRequested();
96 }
97
98 public interface OnVerification {
99 void onVerificationFailed();
100 void onVerificationSucceeded();
101 }
102}