QuickConversationsService.java

  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}