|  |  |  | @ -68,6 +68,7 @@ import org.thoughtcrime.securesms.contactshare.ContactUtil; | 
		
	
		
			
				|  |  |  |  | import org.thoughtcrime.securesms.contactshare.SharedContactDetailsActivity; | 
		
	
		
			
				|  |  |  |  | import org.thoughtcrime.securesms.conversation.ConversationAdapter.HeaderViewHolder; | 
		
	
		
			
				|  |  |  |  | import org.thoughtcrime.securesms.conversation.ConversationAdapter.ItemClickListener; | 
		
	
		
			
				|  |  |  |  | import org.thoughtcrime.securesms.crypto.IdentityKeyUtil; | 
		
	
		
			
				|  |  |  |  | import org.thoughtcrime.securesms.database.Address; | 
		
	
		
			
				|  |  |  |  | import org.thoughtcrime.securesms.database.DatabaseFactory; | 
		
	
		
			
				|  |  |  |  | import org.thoughtcrime.securesms.database.MmsSmsDatabase; | 
		
	
	
		
			
				
					|  |  |  | @ -80,6 +81,8 @@ import org.thoughtcrime.securesms.jobs.DirectoryRefreshJob; | 
		
	
		
			
				|  |  |  |  | import org.thoughtcrime.securesms.linkpreview.LinkPreview; | 
		
	
		
			
				|  |  |  |  | import org.thoughtcrime.securesms.logging.Log; | 
		
	
		
			
				|  |  |  |  | import org.thoughtcrime.securesms.loki.FriendRequestViewDelegate; | 
		
	
		
			
				|  |  |  |  | import org.thoughtcrime.securesms.loki.LokiAPIDatabase; | 
		
	
		
			
				|  |  |  |  | import org.thoughtcrime.securesms.loki.LokiUserDatabase; | 
		
	
		
			
				|  |  |  |  | import org.thoughtcrime.securesms.longmessage.LongMessageActivity; | 
		
	
		
			
				|  |  |  |  | import org.thoughtcrime.securesms.mediasend.Media; | 
		
	
		
			
				|  |  |  |  | import org.thoughtcrime.securesms.mms.GlideApp; | 
		
	
	
		
			
				
					|  |  |  | @ -101,6 +104,8 @@ import org.thoughtcrime.securesms.util.ViewUtil; | 
		
	
		
			
				|  |  |  |  | import org.thoughtcrime.securesms.util.concurrent.SimpleTask; | 
		
	
		
			
				|  |  |  |  | import org.thoughtcrime.securesms.util.task.ProgressDialogAsyncTask; | 
		
	
		
			
				|  |  |  |  | import org.whispersystems.libsignal.util.guava.Optional; | 
		
	
		
			
				|  |  |  |  | import org.whispersystems.signalservice.internal.util.concurrent.SettableFuture; | 
		
	
		
			
				|  |  |  |  | import org.whispersystems.signalservice.loki.api.LokiGroupChatAPI; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | import java.io.IOException; | 
		
	
		
			
				|  |  |  |  | import java.io.InputStream; | 
		
	
	
		
			
				
					|  |  |  | @ -112,6 +117,7 @@ import java.util.List; | 
		
	
		
			
				|  |  |  |  | import java.util.Locale; | 
		
	
		
			
				|  |  |  |  | import java.util.Set; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | import kotlin.Unit; | 
		
	
		
			
				|  |  |  |  | import network.loki.messenger.R; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | @SuppressLint("StaticFieldLeak") | 
		
	
	
		
			
				
					|  |  |  | @ -403,8 +409,9 @@ public class ConversationFragment extends Fragment | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     if (isLokiPublicChat) { | 
		
	
		
			
				|  |  |  |  |       menu.findItem(R.id.menu_context_reply).setVisible(false); | 
		
	
		
			
				|  |  |  |  |       menu.findItem(R.id.menu_context_delete_message).setVisible(false); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     menu.findItem(R.id.menu_context_delete_message).setVisible(true); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   private ConversationAdapter getListAdapter() { | 
		
	
	
		
			
				
					|  |  |  | @ -488,6 +495,8 @@ public class ConversationFragment extends Fragment | 
		
	
		
			
				|  |  |  |  |     builder.setMessage(getActivity().getResources().getQuantityString(R.plurals.ConversationFragment_this_will_permanently_delete_all_n_selected_messages, messagesCount, messagesCount)); | 
		
	
		
			
				|  |  |  |  |     builder.setCancelable(true); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     boolean isLokiPublicChat = this.recipient.isGroupRecipient(); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     builder.setPositiveButton(R.string.delete, new DialogInterface.OnClickListener() { | 
		
	
		
			
				|  |  |  |  |       @Override | 
		
	
		
			
				|  |  |  |  |       public void onClick(DialogInterface dialog, int which) { | 
		
	
	
		
			
				
					|  |  |  | @ -498,15 +507,52 @@ public class ConversationFragment extends Fragment | 
		
	
		
			
				|  |  |  |  |           @Override | 
		
	
		
			
				|  |  |  |  |           protected Void doInBackground(MessageRecord... messageRecords) { | 
		
	
		
			
				|  |  |  |  |             for (MessageRecord messageRecord : messageRecords) { | 
		
	
		
			
				|  |  |  |  |               boolean threadDeleted; | 
		
	
		
			
				|  |  |  |  |               boolean isThreadDeleted; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |               if (isLokiPublicChat) { | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                 final SettableFuture<?>[] future = { new SettableFuture<Unit>() }; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                 String userHexEncodedPublicKey = TextSecurePreferences.getLocalNumber(getContext()); | 
		
	
		
			
				|  |  |  |  |                 LokiAPIDatabase lokiAPIDatabase = DatabaseFactory.getLokiAPIDatabase(getContext()); | 
		
	
		
			
				|  |  |  |  |                 LokiUserDatabase lokiUserDatabase = DatabaseFactory.getLokiUserDatabase(getContext()); | 
		
	
		
			
				|  |  |  |  |                 byte[] userPrivateKey = IdentityKeyUtil.getIdentityKeyPair(getContext()).getPrivateKey().serialize(); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                 Long serverID = DatabaseFactory.getLokiMessageDatabase(getContext()).getServerID(messageRecord.id); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                 if (serverID != null) { | 
		
	
		
			
				|  |  |  |  |                   new LokiGroupChatAPI(userHexEncodedPublicKey, userPrivateKey, lokiAPIDatabase, lokiUserDatabase) | 
		
	
		
			
				|  |  |  |  |                   .deleteMessage(serverID, LokiGroupChatAPI.getPublicChatServerID(), LokiGroupChatAPI.getPublicChatServer(), true) | 
		
	
		
			
				|  |  |  |  |                   .success(l -> { | 
		
	
		
			
				|  |  |  |  |                     @SuppressWarnings("unchecked") SettableFuture<Unit> f = (SettableFuture<Unit>) future[0]; | 
		
	
		
			
				|  |  |  |  |                     f.set(Unit.INSTANCE); | 
		
	
		
			
				|  |  |  |  |                     return Unit.INSTANCE; | 
		
	
		
			
				|  |  |  |  |                   }).fail(e -> { | 
		
	
		
			
				|  |  |  |  |                     @SuppressWarnings("unchecked") SettableFuture<Unit> f = (SettableFuture<Unit>) future[0]; | 
		
	
		
			
				|  |  |  |  |                     f.setException(e); | 
		
	
		
			
				|  |  |  |  |                     return Unit.INSTANCE; | 
		
	
		
			
				|  |  |  |  |                   }); | 
		
	
		
			
				|  |  |  |  |                 } else { | 
		
	
		
			
				|  |  |  |  |                   @SuppressWarnings("unchecked") SettableFuture<Unit> f = (SettableFuture<Unit>) future[0]; | 
		
	
		
			
				|  |  |  |  |                   f.setException(new Exception("Missing message server ID.")); | 
		
	
		
			
				|  |  |  |  |                 } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                 try { | 
		
	
		
			
				|  |  |  |  |                   @SuppressWarnings("unchecked") SettableFuture<Unit> f = (SettableFuture<Unit>)future[0]; | 
		
	
		
			
				|  |  |  |  |                   f.get(); | 
		
	
		
			
				|  |  |  |  |                 } catch (Exception exception) { | 
		
	
		
			
				|  |  |  |  |                   Log.d("Loki", "Couldn't delete message due to error: " + exception.toString() + "."); | 
		
	
		
			
				|  |  |  |  |                   return null; | 
		
	
		
			
				|  |  |  |  |                 } | 
		
	
		
			
				|  |  |  |  |               } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |               if (messageRecord.isMms()) { | 
		
	
		
			
				|  |  |  |  |                 threadDeleted = DatabaseFactory.getMmsDatabase(getActivity()).delete(messageRecord.getId()); | 
		
	
		
			
				|  |  |  |  |                 isThreadDeleted = DatabaseFactory.getMmsDatabase(getActivity()).delete(messageRecord.getId()); | 
		
	
		
			
				|  |  |  |  |               } else { | 
		
	
		
			
				|  |  |  |  |                 threadDeleted = DatabaseFactory.getSmsDatabase(getActivity()).deleteMessage(messageRecord.getId()); | 
		
	
		
			
				|  |  |  |  |                 isThreadDeleted = DatabaseFactory.getSmsDatabase(getActivity()).deleteMessage(messageRecord.getId()); | 
		
	
		
			
				|  |  |  |  |               } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |               if (threadDeleted) { | 
		
	
		
			
				|  |  |  |  |               if (isThreadDeleted) { | 
		
	
		
			
				|  |  |  |  |                 threadId = -1; | 
		
	
		
			
				|  |  |  |  |                 listener.setThreadId(threadId); | 
		
	
		
			
				|  |  |  |  |               } | 
		
	
	
		
			
				
					|  |  |  | 
 |