conversation: add the ability to remove a conversation from the list

+ Now, the "Delete this conversation" is renamed and clear the history
+ "Remove conversation" now remove the conversation from the list
+ Note: fix some typos

Change-Id: I8873a0db87f416d3ed56d6495a2547da828b94e6
Gitlab: #511
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java
index 554ab51..2cdd0c4 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java
@@ -109,6 +109,7 @@
     public static final String KEY_ACCOUNT_ID = BuildConfig.APPLICATION_ID + "ACCOUNT_ID";
     public static final String KEY_PREFERENCE_PENDING_MESSAGE = "pendingMessage";
 
+    private static final String CONVERSATION_CLEAR = "CONVERSATION_CLEAR";
     private static final String CONVERSATION_DELETE = "CONVERSATION_DELETE";
 
     private static final int REQUEST_CODE_FILE_PICKER = 1000;
@@ -151,9 +152,14 @@
     @BindView(R.id.tvTrustRequestMessage)
     protected TextView mTvTrustRequestMessage;
 
+
     @BindView(R.id.pb_loading)
     protected ProgressBar mLoadingIndicator;
 
+    private AlertDialog mClearDialog;
+    private boolean mClearConversation = false;
+
+
     private AlertDialog mDeleteDialog;
     private boolean mDeleteConversation = false;
 
@@ -278,9 +284,13 @@
         setHasOptionsMenu(true);
 
         // reload delete conversation state (before rotation)
+        mClearConversation = savedInstanceState != null && savedInstanceState.getBoolean(CONVERSATION_CLEAR);
+        if (mClearConversation) {
+            presenter.clearAction();
+        }
         mDeleteConversation = savedInstanceState != null && savedInstanceState.getBoolean(CONVERSATION_DELETE);
         if (mDeleteConversation) {
-            presenter.deleteAction();
+            presenter.removeAction();
         }
     }
 
@@ -472,6 +482,9 @@
 
     @Override
     public void onDestroy() {
+        if (mClearConversation) {
+            mClearDialog.dismiss();
+        }
         if (mDeleteConversation) {
             mDeleteDialog.dismiss();
         }
@@ -483,6 +496,8 @@
         super.onSaveInstanceState(outState);
 
         // persist the delete popup state in case of Activity rotation
+        mClearConversation = mClearDialog != null && mClearDialog.isShowing();
+        outState.putBoolean(CONVERSATION_CLEAR, mClearConversation);
         mDeleteConversation = mDeleteDialog != null && mDeleteDialog.isShowing();
         outState.putBoolean(CONVERSATION_DELETE, mDeleteConversation);
     }
@@ -506,12 +521,15 @@
             case R.id.conv_action_videocall:
                 presenter.callWithAudioOnly(false);
                 return true;
-            case R.id.menuitem_delete:
-                presenter.deleteAction();
+            case R.id.menuitem_clean:
+                presenter.clearAction();
                 return true;
             case R.id.menuitem_copy_content:
                 presenter.copyToClipboard();
                 return true;
+            case R.id.menuitem_delete:
+                presenter.removeAction();
+                return true;
             case R.id.menuitem_block:
                 presenter.blockContact();
                 return true;
@@ -521,8 +539,13 @@
     }
 
     @Override
-    public void deleteConversation(CallContact callContact) {
-        presenter.deleteConversation();
+    public void removeConversation(CallContact callContact) {
+        presenter.removeConversation();
+    }
+
+    @Override
+    public void clearConversation(CallContact callContact) {
+        presenter.clearConversation();
     }
 
     @Override
@@ -593,6 +616,13 @@
     }
 
     @Override
+    public void displayClearDialog(final Conversation conversation) {
+        mClearDialog = ActionHelper.launchClearAction(getActivity(),
+                conversation.getContact(),
+                ConversationFragment.this);
+    }
+
+    @Override
     public void displayDeleteDialog(final Conversation conversation) {
         mDeleteDialog = ActionHelper.launchDeleteAction(getActivity(),
                 conversation.getContact(),
@@ -776,4 +806,4 @@
             }).start();
         }
     }
-}
\ No newline at end of file
+}
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/SmartListFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/SmartListFragment.java
index 9027a4a..5cf896d 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/SmartListFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/SmartListFragment.java
@@ -294,8 +294,13 @@
     }
 
     @Override
-    public void deleteConversation(CallContact callContact) {
-        presenter.deleteConversation(callContact);
+    public void removeConversation(CallContact callContact) {
+        presenter.removeConversation(callContact);
+    }
+
+    @Override
+    public void clearConversation(CallContact callContact) {
+        presenter.clearConversation(callContact);
     }
 
     @Override
@@ -405,11 +410,14 @@
                         case ActionHelper.ACTION_COPY:
                             presenter.copyNumber(smartListViewModel);
                             break;
+                        case ActionHelper.ACTION_CLEAR:
+                            presenter.clearConversation(smartListViewModel);
+                            break;
                         case ActionHelper.ACTION_DELETE:
-                            presenter.deleteConversation(smartListViewModel);
+                            presenter.removeConversation(smartListViewModel);
                             break;
                         case ActionHelper.ACTION_BLOCK:
-                            presenter.removeContact(smartListViewModel);
+                            presenter.banContact(smartListViewModel);
                             break;
                     }
                 })
@@ -417,6 +425,11 @@
     }
 
     @Override
+    public void displayClearDialog(CallContact callContact) {
+        ActionHelper.launchClearAction(getActivity(), callContact, SmartListFragment.this);
+    }
+
+    @Override
     public void displayDeleteDialog(CallContact callContact) {
         ActionHelper.launchDeleteAction(getActivity(), callContact, SmartListFragment.this);
     }
diff --git a/ring-android/app/src/main/java/cx/ring/utils/ActionHelper.java b/ring-android/app/src/main/java/cx/ring/utils/ActionHelper.java
index 135e0d1..80f070e 100644
--- a/ring-android/app/src/main/java/cx/ring/utils/ActionHelper.java
+++ b/ring-android/app/src/main/java/cx/ring/utils/ActionHelper.java
@@ -39,12 +39,40 @@
 
     public static final String TAG = ActionHelper.class.getSimpleName();
     public static final int ACTION_COPY = 0;
-    public static final int ACTION_DELETE = 1;
-    public static final int ACTION_BLOCK = 2;
+    public static final int ACTION_CLEAR = 1;
+    public static final int ACTION_DELETE = 2;
+    public static final int ACTION_BLOCK = 3;
 
     private ActionHelper() {
     }
 
+    public static AlertDialog launchClearAction(final Context context,
+                                                 final CallContact callContact,
+                                                 final Conversation.ConversationActionCallback callback) {
+        if (context == null) {
+            Log.d(TAG, "launchClearAction: activity is null");
+            return null;
+        }
+
+        if (callContact == null) {
+            Log.d(TAG, "launchClearAction: conversation is null");
+            return null;
+        }
+
+        return new AlertDialog.Builder(context)
+                .setTitle(R.string.conversation_action_history_clear_title)
+                .setMessage(R.string.conversation_action_history_clear_message)
+                .setPositiveButton(android.R.string.ok, (dialog, whichButton) -> {
+                    if (callback != null) {
+                        callback.clearConversation(callContact);
+                    }
+                })
+                .setNegativeButton(android.R.string.cancel, (dialog, whichButton) -> {
+                    /* Terminate with no action */
+                })
+                .show();
+    }
+
     public static AlertDialog launchDeleteAction(final Context context,
                                                  final CallContact callContact,
                                                  final Conversation.ConversationActionCallback callback) {
@@ -59,11 +87,11 @@
         }
 
         return new AlertDialog.Builder(context)
-                .setTitle(R.string.conversation_action_delete_this_title)
-                .setMessage(R.string.conversation_action_delete_this_message)
+                .setTitle(R.string.conversation_action_remove_this_title)
+                .setMessage(R.string.conversation_action_remove_this_message)
                 .setPositiveButton(android.R.string.ok, (dialog, whichButton) -> {
                     if (callback != null) {
-                        callback.deleteConversation(callContact);
+                        callback.removeConversation(callContact);
                     }
                 })
                 .setNegativeButton(android.R.string.cancel, (dialog, whichButton) -> {
diff --git a/ring-android/app/src/main/res/menu/conversation_actions.xml b/ring-android/app/src/main/res/menu/conversation_actions.xml
index c9ff1c8..7c87da9 100644
--- a/ring-android/app/src/main/res/menu/conversation_actions.xml
+++ b/ring-android/app/src/main/res/menu/conversation_actions.xml
@@ -23,9 +23,14 @@
         app:showAsAction="never" />
 
     <item
+        android:id="@+id/menuitem_clean"
+        android:title="@string/conversation_action_history_clear"
+        app:showAsAction="never" />
+
+    <item
         android:id="@+id/menuitem_delete"
         android:icon="@drawable/ic_delete_white"
-        android:title="@string/conversation_action_delete_this"
+        android:title="@string/conversation_action_remove_this"
         app:showAsAction="never" />
 
     <item
@@ -34,4 +39,4 @@
         android:title="@string/conversation_action_block_this"
         app:showAsAction="never" />
 
-</menu>
\ No newline at end of file
+</menu>
diff --git a/ring-android/app/src/main/res/values/arrays.xml b/ring-android/app/src/main/res/values/arrays.xml
index 6ab5491..f13d6a0 100644
--- a/ring-android/app/src/main/res/values/arrays.xml
+++ b/ring-android/app/src/main/res/values/arrays.xml
@@ -22,7 +22,8 @@
 
     <string-array name="conversation_actions">
         <item>@string/conversation_action_copy_peer_number</item>
-        <item>@string/conversation_action_delete_this</item>
+        <item>@string/conversation_action_history_clear</item>
+        <item>@string/conversation_action_remove_this</item>
         <item>@string/conversation_action_block_this</item>
     </string-array>
 
diff --git a/ring-android/app/src/main/res/values/strings.xml b/ring-android/app/src/main/res/values/strings.xml
index 7b3e1bd..b17a2f9 100644
--- a/ring-android/app/src/main/res/values/strings.xml
+++ b/ring-android/app/src/main/res/values/strings.xml
@@ -129,7 +129,7 @@
     <string name="action_call_decline">Decline</string>
     <string name="ab_action_speakerphone">Enable speaker</string>
     <string name="ab_action_contact_add">Add to contacts</string>
-    <string name="ab_action_contact_add_question">Add to contacts ?</string>
+    <string name="ab_action_contact_add_question">Add to contacts?</string>
     <string name="hist_contact_added">Contact added</string>
     <string name="hist_invitation_received">Invitation received</string>
     <string name="ab_action_audio_call">Audio call</string>
@@ -166,22 +166,28 @@
     <string name="scan_qr_account_message">Scan the QR Code of the account you want to add.</string>
 
     <!-- Settings -->
-    <string name="clear_history_dialog_title">Clear history ?</string>
-    <string name="clear_history_dialog_message">This action can not be undone.</string>
+    <string name="clear_history_dialog_title">Clear history?</string>
+    <string name="clear_history_dialog_message">This action cannot be undone.</string>
     <string name="clear_history_completed">History has been cleared.</string>
 
     <!-- Conversation -->
     <string name="conversation_action_delete_this">Delete this conversation</string>
     <string name="conversation_action_delete_this_title">Delete this conversation ?</string>
     <string name="conversation_action_delete_this_message">This action can not be undone.</string>
+    <string name="conversation_action_history_clear">Clear history</string>
+    <string name="conversation_action_history_clear_title">Clear the conversation history?</string>
+    <string name="conversation_action_history_clear_message">This will definitely clear the conversation history.</string>
+    <string name="conversation_action_remove_this">Delete contact</string>
+    <string name="conversation_action_remove_this_title">Delete this contact?</string>
+    <string name="conversation_action_remove_this_message">This will delete the contact and definitely clear the conversation history.</string>
     <string name="conversation_action_copy_peer_number">Copy number</string>
     <string name="conversation_action_copied_peer_number_clipboard">%1$s copied to clipboard</string>
     <string name="conversation_action_select_peer_number">Select a number</string>
-    <string name="conversation_action_block_this">Block this contact</string>
+    <string name="conversation_action_block_this">Block contact</string>
     <string name="conversation_action_go_to_call">Return to ongoing call</string>
 
     <!-- Contacts -->
-    <string name="add_call_contact_number_to_contacts">Add %1$s ?</string>
+    <string name="add_call_contact_number_to_contacts">Add %1$s?</string>
     <string name="prompt_new_password">New password</string>
     <string name="prompt_new_password_optional">New password (optional)</string>
     <string name="prompt_new_password_repeat">Repeat new password</string>
diff --git a/ring-android/libringclient/src/main/java/cx/ring/conversation/ConversationPresenter.java b/ring-android/libringclient/src/main/java/cx/ring/conversation/ConversationPresenter.java
index 1862cca..6918d53 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/conversation/ConversationPresenter.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/conversation/ConversationPresenter.java
@@ -211,7 +211,11 @@
         getView().goToAddContact(mConversation.getContact());
     }
 
-    public void deleteAction() {
+    public void clearAction() {
+        getView().displayClearDialog(mConversation);
+    }
+
+    public void removeAction() {
         getView().displayDeleteDialog(mConversation);
     }
 
@@ -288,6 +292,11 @@
         getView().goToHome();
     }
 
+    public void removeConversation() {
+        mConversationFacade.removeConversation(mAccountId, mContactRingId).subscribe();
+        getView().goToHome();
+    }
+
     public void clickOnGoingPane() {
         Conference conf = mConversation.getCurrentCall();
         if (conf != null) {
@@ -319,7 +328,7 @@
         }
     }
 
-    public void deleteConversation() {
+    public void clearConversation() {
         mConversationFacade.clearHistory(mAccountId, mContactRingId).subscribe();
         getView().goToHome();
     }
@@ -367,4 +376,4 @@
         Log.e(TAG, "configureForFileInfoTextMessage: no space left on device");
         getView().displayErrorToast(RingError.NO_SPACE_LEFT);
     }
-}
\ No newline at end of file
+}
diff --git a/ring-android/libringclient/src/main/java/cx/ring/conversation/ConversationView.java b/ring-android/libringclient/src/main/java/cx/ring/conversation/ConversationView.java
index 0aa17d2..75e039b 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/conversation/ConversationView.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/conversation/ConversationView.java
@@ -41,6 +41,8 @@
 
     void displayNumberSpinner(Conversation conversation, Uri number);
 
+    void displayClearDialog(Conversation conversation);
+
     void displayDeleteDialog(Conversation conversation);
 
     void displayCopyToClipboard(CallContact callContact);
diff --git a/ring-android/libringclient/src/main/java/cx/ring/facades/ConversationFacade.java b/ring-android/libringclient/src/main/java/cx/ring/facades/ConversationFacade.java
index 3976643..3641903 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/facades/ConversationFacade.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/facades/ConversationFacade.java
@@ -442,4 +442,14 @@
         if (transfer != null)
             deleteFile(transfer);
     }
+
+    public Completable removeConversation(String accountId, Uri contact) {
+        return mHistoryService
+                .clearHistory(contact.getRawUriString(), accountId)
+                .doOnSubscribe(s -> {
+                    Account account = mAccountService.getAccount(accountId);
+                    account.clearHistory(contact);
+                    mAccountService.removeContact(accountId, contact.getRawRingId(), false);
+                });
+    }
 }
\ No newline at end of file
diff --git a/ring-android/libringclient/src/main/java/cx/ring/model/Conversation.java b/ring-android/libringclient/src/main/java/cx/ring/model/Conversation.java
index d2c6cac..1e59264 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/model/Conversation.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/model/Conversation.java
@@ -360,7 +360,9 @@
 
     public interface ConversationActionCallback {
 
-        void deleteConversation(CallContact callContact);
+        void removeConversation(CallContact callContact);
+
+        void clearConversation(CallContact callContact);
 
         void copyContactNumberToClipboard(String contactNumber);
 
diff --git a/ring-android/libringclient/src/main/java/cx/ring/smartlist/SmartListPresenter.java b/ring-android/libringclient/src/main/java/cx/ring/smartlist/SmartListPresenter.java
index 5f75f0c..9bb0a5c 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/smartlist/SmartListPresenter.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/smartlist/SmartListPresenter.java
@@ -227,13 +227,23 @@
         getView().copyNumber(smartListViewModel.getContact());
     }
 
-    public void deleteConversation(SmartListViewModel smartListViewModel) {
+    public void clearConversation(SmartListViewModel smartListViewModel) {
+        getView().displayClearDialog(smartListViewModel.getContact());
+    }
+
+    public void clearConversation(final CallContact callContact) {
+        mConversationDisposable.add(mConversationFacade
+                .clearHistory(mAccount.getAccountID(), callContact.getPrimaryUri())
+                .subscribeOn(Schedulers.computation()).subscribe());
+    }
+
+    public void removeConversation(SmartListViewModel smartListViewModel) {
         getView().displayDeleteDialog(smartListViewModel.getContact());
     }
 
-    public void deleteConversation(final CallContact callContact) {
+    public void removeConversation(CallContact callContact) {
         mConversationDisposable.add(mConversationFacade
-                .clearHistory(mAccount.getAccountID(), callContact.getPrimaryUri())
+                .removeConversation(mAccount.getAccountID(), callContact.getPrimaryUri())
                 .subscribeOn(Schedulers.computation()).subscribe());
     }
 
@@ -325,7 +335,7 @@
         getView().setLoading(false);
     }
 
-    public void removeContact(SmartListViewModel smartListViewModel) {
+    public void banContact(SmartListViewModel smartListViewModel) {
         CallContact contact = smartListViewModel.getContact();
         mAccountService.removeContact(mAccount.getAccountID(), contact.getPrimaryNumber(), true);
         mSmartListViewModels.remove(smartListViewModel);
diff --git a/ring-android/libringclient/src/main/java/cx/ring/smartlist/SmartListView.java b/ring-android/libringclient/src/main/java/cx/ring/smartlist/SmartListView.java
index 3fc8745..7860225 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/smartlist/SmartListView.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/smartlist/SmartListView.java
@@ -39,6 +39,8 @@
 
     void displayConversationDialog(SmartListViewModel smartListViewModel);
 
+    void displayClearDialog(CallContact callContact);
+
     void displayDeleteDialog(CallContact callContact);
 
     void copyNumber(CallContact callContact);