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);