1818import org .thoughtcrime .securesms .database .DatabaseFactory ;
1919import org .thoughtcrime .securesms .database .NotInDirectoryException ;
2020import org .thoughtcrime .securesms .database .TextSecureDirectory ;
21- import org .thoughtcrime .securesms .jobs .DirectoryRefreshJob ;
2221import org .thoughtcrime .securesms .jobs .MultiDeviceContactUpdateJob ;
2322import org .thoughtcrime .securesms .notifications .MessageNotifier ;
2423import org .thoughtcrime .securesms .push .TextSecureCommunicationFactory ;
2524import org .thoughtcrime .securesms .recipients .Recipients ;
26- import org .thoughtcrime .securesms .sms .IncomingGroupMessage ;
2725import org .thoughtcrime .securesms .sms .IncomingJoinedMessage ;
28- import org .thoughtcrime .securesms .sms .MessageSender ;
2926import org .thoughtcrime .securesms .util .DirectoryHelper .UserCapabilities .Capability ;
3027import org .whispersystems .libaxolotl .util .guava .Optional ;
3128import org .whispersystems .textsecure .api .TextSecureAccountManager ;
@@ -80,11 +77,7 @@ public static void refreshDirectory(@NonNull Context context, @Nullable MasterSe
8077 .add (new MultiDeviceContactUpdateJob (context ));
8178 }
8279
83- for (String newUser : newUsers ) {
84- IncomingJoinedMessage message = new IncomingJoinedMessage (newUser );
85- Pair <Long , Long > smsAndThreadId = DatabaseFactory .getSmsDatabase (context ).insertMessageInbox (message );
86- MessageNotifier .updateNotification (context , masterSecret , smsAndThreadId .second );
87- }
80+ notifyNewUsers (context , masterSecret , newUsers );
8881 }
8982
9083 public static @ NonNull List <String > refreshDirectory (@ NonNull Context context ,
@@ -93,7 +86,6 @@ public static void refreshDirectory(@NonNull Context context, @Nullable MasterSe
9386 throws IOException
9487 {
9588 TextSecureDirectory directory = TextSecureDirectory .getInstance (context );
96- Optional <Account > account = getOrCreateAccount (context );
9789 Set <String > eligibleContactNumbers = directory .getPushEligibleContactNumbers (localNumber );
9890 List <ContactTokenDetails > activeTokens = accountManager .getContacts (eligibleContactNumbers );
9991
@@ -104,33 +96,35 @@ public static void refreshDirectory(@NonNull Context context, @Nullable MasterSe
10496 }
10597
10698 directory .setNumbers (activeTokens , eligibleContactNumbers );
107-
108- if (account .isPresent ()) {
109- try {
110- return DatabaseFactory .getContactsDatabase (context )
111- .setRegisteredUsers (account .get (), localNumber , activeTokens );
112- } catch (RemoteException | OperationApplicationException e ) {
113- Log .w (TAG , e );
114- }
115- }
99+ return updateContactsDatabase (context , localNumber , activeTokens , true );
116100 }
117101
118102 return new LinkedList <>();
119103 }
120104
121- public static UserCapabilities refreshDirectoryFor (Context context , Recipients recipients )
105+ public static UserCapabilities refreshDirectoryFor (@ NonNull Context context ,
106+ @ Nullable MasterSecret masterSecret ,
107+ @ NonNull Recipients recipients ,
108+ @ NonNull String localNumber )
122109 throws IOException
123110 {
124111 try {
125- TextSecureDirectory directory = TextSecureDirectory .getInstance (context );
126- TextSecureAccountManager accountManager = TextSecureCommunicationFactory .createManager (context );
127- String number = Util .canonicalizeNumber (context , recipients .getPrimaryRecipient ().getNumber ());
128-
129- Optional <ContactTokenDetails > details = accountManager .getContact (number );
112+ TextSecureDirectory directory = TextSecureDirectory .getInstance (context );
113+ TextSecureAccountManager accountManager = TextSecureCommunicationFactory .createManager (context );
114+ String number = Util .canonicalizeNumber (context , recipients .getPrimaryRecipient ().getNumber ());
115+ Optional <ContactTokenDetails > details = accountManager .getContact (number );
130116
131117 if (details .isPresent ()) {
132118 directory .setNumber (details .get (), true );
133- ApplicationContext .getInstance (context ).getJobManager ().add (new DirectoryRefreshJob (context ));
119+
120+ List <String > newUsers = updateContactsDatabase (context , localNumber , details .get ());
121+
122+ if (!newUsers .isEmpty () && TextSecurePreferences .isMultiDevice (context )) {
123+ ApplicationContext .getInstance (context ).getJobManager ().add (new MultiDeviceContactUpdateJob (context ));
124+ }
125+
126+ notifyNewUsers (context , masterSecret , newUsers );
127+
134128 return new UserCapabilities (Capability .SUPPORTED , details .get ().isVoice () ? Capability .SUPPORTED : Capability .UNSUPPORTED );
135129 } else {
136130 ContactTokenDetails absent = new ContactTokenDetails ();
@@ -185,6 +179,45 @@ public static UserCapabilities refreshDirectoryFor(Context context, Recipients r
185179 }
186180 }
187181
182+ private static @ NonNull List <String > updateContactsDatabase (@ NonNull Context context ,
183+ @ NonNull String localNumber ,
184+ @ NonNull final ContactTokenDetails activeToken )
185+ {
186+ return updateContactsDatabase (context , localNumber ,
187+ new LinkedList <ContactTokenDetails >() {{add (activeToken );}},
188+ false );
189+ }
190+
191+ private static @ NonNull List <String > updateContactsDatabase (@ NonNull Context context ,
192+ @ NonNull String localNumber ,
193+ @ NonNull List <ContactTokenDetails > activeTokens ,
194+ boolean removeMissing )
195+ {
196+ Optional <Account > account = getOrCreateAccount (context );
197+
198+ if (account .isPresent ()) {
199+ try {
200+ return DatabaseFactory .getContactsDatabase (context )
201+ .setRegisteredUsers (account .get (), localNumber , activeTokens , removeMissing );
202+ } catch (RemoteException | OperationApplicationException e ) {
203+ Log .w (TAG , e );
204+ }
205+ }
206+
207+ return new LinkedList <>();
208+ }
209+
210+ private static void notifyNewUsers (@ NonNull Context context ,
211+ @ Nullable MasterSecret masterSecret ,
212+ @ NonNull List <String > newUsers )
213+ {
214+ for (String newUser : newUsers ) {
215+ IncomingJoinedMessage message = new IncomingJoinedMessage (newUser );
216+ Pair <Long , Long > smsAndThreadId = DatabaseFactory .getSmsDatabase (context ).insertMessageInbox (message );
217+ MessageNotifier .updateNotification (context , masterSecret , smsAndThreadId .second );
218+ }
219+ }
220+
188221 private static Optional <Account > getOrCreateAccount (Context context ) {
189222 AccountManager accountManager = AccountManager .get (context );
190223 Account [] accounts = accountManager .getAccountsByType ("org.thoughtcrime.securesms" );
0 commit comments