mirror of
https://github.com/oxen-io/session-android.git
synced 2025-12-03 13:13:44 +00:00
@@ -69,22 +69,24 @@ public class DirectoryHelper {
|
||||
public static void refreshDirectory(@NonNull Context context, @Nullable MasterSecret masterSecret)
|
||||
throws IOException
|
||||
{
|
||||
List<String> newUsers = refreshDirectory(context,
|
||||
AccountManagerFactory.createManager(context),
|
||||
TextSecurePreferences.getLocalNumber(context));
|
||||
RefreshResult result = refreshDirectory(context,
|
||||
AccountManagerFactory.createManager(context),
|
||||
TextSecurePreferences.getLocalNumber(context));
|
||||
|
||||
if (!newUsers.isEmpty() && TextSecurePreferences.isMultiDevice(context)) {
|
||||
if (!result.getNewUsers().isEmpty() && TextSecurePreferences.isMultiDevice(context)) {
|
||||
ApplicationContext.getInstance(context)
|
||||
.getJobManager()
|
||||
.add(new MultiDeviceContactUpdateJob(context));
|
||||
}
|
||||
|
||||
notifyNewUsers(context, masterSecret, newUsers);
|
||||
if (!result.isFresh()) {
|
||||
notifyNewUsers(context, masterSecret, result.getNewUsers());
|
||||
}
|
||||
}
|
||||
|
||||
public static @NonNull List<String> refreshDirectory(@NonNull Context context,
|
||||
@NonNull SignalServiceAccountManager accountManager,
|
||||
@NonNull String localNumber)
|
||||
public static @NonNull RefreshResult refreshDirectory(@NonNull Context context,
|
||||
@NonNull SignalServiceAccountManager accountManager,
|
||||
@NonNull String localNumber)
|
||||
throws IOException
|
||||
{
|
||||
TextSecureDirectory directory = TextSecureDirectory.getInstance(context);
|
||||
@@ -101,7 +103,7 @@ public class DirectoryHelper {
|
||||
return updateContactsDatabase(context, localNumber, activeTokens, true);
|
||||
}
|
||||
|
||||
return new LinkedList<>();
|
||||
return new RefreshResult(new LinkedList<String>(), false);
|
||||
}
|
||||
|
||||
public static UserCapabilities refreshDirectoryFor(@NonNull Context context,
|
||||
@@ -119,13 +121,15 @@ public class DirectoryHelper {
|
||||
if (details.isPresent()) {
|
||||
directory.setNumber(details.get(), true);
|
||||
|
||||
List<String> newUsers = updateContactsDatabase(context, localNumber, details.get());
|
||||
RefreshResult result = updateContactsDatabase(context, localNumber, details.get());
|
||||
|
||||
if (!newUsers.isEmpty() && TextSecurePreferences.isMultiDevice(context)) {
|
||||
if (!result.getNewUsers().isEmpty() && TextSecurePreferences.isMultiDevice(context)) {
|
||||
ApplicationContext.getInstance(context).getJobManager().add(new MultiDeviceContactUpdateJob(context));
|
||||
}
|
||||
|
||||
notifyNewUsers(context, masterSecret, newUsers);
|
||||
if (!result.isFresh()) {
|
||||
notifyNewUsers(context, masterSecret, result.getNewUsers());
|
||||
}
|
||||
|
||||
return new UserCapabilities(Capability.SUPPORTED, details.get().isVoice() ? Capability.SUPPORTED : Capability.UNSUPPORTED);
|
||||
} else {
|
||||
@@ -181,32 +185,34 @@ public class DirectoryHelper {
|
||||
}
|
||||
}
|
||||
|
||||
private static @NonNull List<String> updateContactsDatabase(@NonNull Context context,
|
||||
@NonNull String localNumber,
|
||||
@NonNull final ContactTokenDetails activeToken)
|
||||
private static @NonNull RefreshResult updateContactsDatabase(@NonNull Context context,
|
||||
@NonNull String localNumber,
|
||||
@NonNull final ContactTokenDetails activeToken)
|
||||
{
|
||||
return updateContactsDatabase(context, localNumber,
|
||||
new LinkedList<ContactTokenDetails>() {{add(activeToken);}},
|
||||
false);
|
||||
}
|
||||
|
||||
private static @NonNull List<String> updateContactsDatabase(@NonNull Context context,
|
||||
@NonNull String localNumber,
|
||||
@NonNull List<ContactTokenDetails> activeTokens,
|
||||
boolean removeMissing)
|
||||
private static @NonNull RefreshResult updateContactsDatabase(@NonNull Context context,
|
||||
@NonNull String localNumber,
|
||||
@NonNull List<ContactTokenDetails> activeTokens,
|
||||
boolean removeMissing)
|
||||
{
|
||||
Optional<Account> account = getOrCreateAccount(context);
|
||||
Optional<AccountHolder> account = getOrCreateAccount(context);
|
||||
|
||||
if (account.isPresent()) {
|
||||
try {
|
||||
return DatabaseFactory.getContactsDatabase(context)
|
||||
.setRegisteredUsers(account.get(), localNumber, activeTokens, removeMissing);
|
||||
List<String> newUsers = DatabaseFactory.getContactsDatabase(context)
|
||||
.setRegisteredUsers(account.get().getAccount(), localNumber, activeTokens, removeMissing);
|
||||
|
||||
return new RefreshResult(newUsers, account.get().isFresh());
|
||||
} catch (RemoteException | OperationApplicationException e) {
|
||||
Log.w(TAG, e);
|
||||
}
|
||||
}
|
||||
|
||||
return new LinkedList<>();
|
||||
return new RefreshResult(new LinkedList<String>(), false);
|
||||
}
|
||||
|
||||
private static void notifyNewUsers(@NonNull Context context,
|
||||
@@ -230,33 +236,73 @@ public class DirectoryHelper {
|
||||
}
|
||||
}
|
||||
|
||||
private static Optional<Account> getOrCreateAccount(Context context) {
|
||||
private static Optional<AccountHolder> getOrCreateAccount(Context context) {
|
||||
AccountManager accountManager = AccountManager.get(context);
|
||||
Account[] accounts = accountManager.getAccountsByType("org.thoughtcrime.securesms");
|
||||
|
||||
Optional<Account> account;
|
||||
Optional<AccountHolder> account;
|
||||
|
||||
if (accounts.length == 0) account = createAccount(context);
|
||||
else account = Optional.of(accounts[0]);
|
||||
else account = Optional.of(new AccountHolder(accounts[0], false));
|
||||
|
||||
if (account.isPresent() && !ContentResolver.getSyncAutomatically(account.get(), ContactsContract.AUTHORITY)) {
|
||||
ContentResolver.setSyncAutomatically(account.get(), ContactsContract.AUTHORITY, true);
|
||||
if (account.isPresent() && !ContentResolver.getSyncAutomatically(account.get().getAccount(), ContactsContract.AUTHORITY)) {
|
||||
ContentResolver.setSyncAutomatically(account.get().getAccount(), ContactsContract.AUTHORITY, true);
|
||||
}
|
||||
|
||||
return account;
|
||||
}
|
||||
|
||||
private static Optional<Account> createAccount(Context context) {
|
||||
private static Optional<AccountHolder> createAccount(Context context) {
|
||||
AccountManager accountManager = AccountManager.get(context);
|
||||
Account account = new Account(context.getString(R.string.app_name), "org.thoughtcrime.securesms");
|
||||
|
||||
if (accountManager.addAccountExplicitly(account, null, null)) {
|
||||
Log.w(TAG, "Created new account...");
|
||||
ContentResolver.setIsSyncable(account, ContactsContract.AUTHORITY, 1);
|
||||
return Optional.of(account);
|
||||
return Optional.of(new AccountHolder(account, true));
|
||||
} else {
|
||||
Log.w(TAG, "Failed to create account!");
|
||||
return Optional.absent();
|
||||
}
|
||||
}
|
||||
|
||||
private static class AccountHolder {
|
||||
|
||||
private final boolean fresh;
|
||||
private final Account account;
|
||||
|
||||
private AccountHolder(Account account, boolean fresh) {
|
||||
this.fresh = fresh;
|
||||
this.account = account;
|
||||
}
|
||||
|
||||
public boolean isFresh() {
|
||||
return fresh;
|
||||
}
|
||||
|
||||
public Account getAccount() {
|
||||
return account;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static class RefreshResult {
|
||||
|
||||
private final List<String> newUsers;
|
||||
private final boolean fresh;
|
||||
|
||||
private RefreshResult(List<String> newUsers, boolean fresh) {
|
||||
this.newUsers = newUsers;
|
||||
this.fresh = fresh;
|
||||
}
|
||||
|
||||
public List<String> getNewUsers() {
|
||||
return newUsers;
|
||||
}
|
||||
|
||||
public boolean isFresh() {
|
||||
return fresh;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -455,4 +455,8 @@ public class Util {
|
||||
return (int)value;
|
||||
}
|
||||
|
||||
public static boolean isStringEquals(String first, String second) {
|
||||
if (first == null) return second == null;
|
||||
return first.equals(second);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user