contacts: unblock a contact

In the blocked contacts list, the user can unblock a contact by click
on the button.

Change-Id: I53f88b335ff1e80b39828c0ee815a8ea64ad7306
Reviewed-by: Hadrien De Sousa <hadrien.desousa@savoirfairelinux.com>
Tuleap: #1500
diff --git a/ring-android/app/src/main/java/cx/ring/contactrequests/BlackListAdapter.java b/ring-android/app/src/main/java/cx/ring/contactrequests/BlackListAdapter.java
index f4f5f4f..e2dace3 100644
--- a/ring-android/app/src/main/java/cx/ring/contactrequests/BlackListAdapter.java
+++ b/ring-android/app/src/main/java/cx/ring/contactrequests/BlackListAdapter.java
@@ -32,10 +32,12 @@
 
 public class BlackListAdapter extends RecyclerView.Adapter<BlackListViewHolder> {
 
+    private BlackListViewHolder.BlackListListeners mListener;
     private ArrayList<BlackListViewModel> mViewModels;
 
-    public BlackListAdapter(ArrayList<BlackListViewModel> viewModels) {
+    public BlackListAdapter(ArrayList<BlackListViewModel> viewModels, BlackListViewHolder.BlackListListeners listener) {
         mViewModels = new ArrayList<>(viewModels);
+        mListener = listener;
     }
 
     public void replaceAll(ArrayList<BlackListViewModel> viewModels) {
@@ -61,6 +63,8 @@
                 .into(holder.mPhoto);
 
         holder.mDisplayname.setText(viewModel.getDisplayName());
+
+        holder.bind(mListener, viewModel);
     }
 
     @Override
diff --git a/ring-android/app/src/main/java/cx/ring/contactrequests/BlackListFragment.java b/ring-android/app/src/main/java/cx/ring/contactrequests/BlackListFragment.java
index c28980d..974d27e 100644
--- a/ring-android/app/src/main/java/cx/ring/contactrequests/BlackListFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/contactrequests/BlackListFragment.java
@@ -42,7 +42,8 @@
 import cx.ring.client.AccountEditionActivity;
 import cx.ring.mvp.BaseFragment;
 
-public class BlackListFragment extends BaseFragment<BlackListPresenter> implements BlackListView {
+public class BlackListFragment extends BaseFragment<BlackListPresenter> implements BlackListView,
+        BlackListViewHolder.BlackListListeners {
 
     public static final String TAG = BlackListFragment.class.getSimpleName();
 
@@ -109,6 +110,11 @@
     }
 
     @Override
+    public void onUnblockClick(BlackListViewModel viewModel) {
+        mBlackListPresenter.unblockClicked(viewModel);
+    }
+
+    @Override
     public void updateView(final ArrayList<BlackListViewModel> list) {
         RingApplication.uiHandler.post(new Runnable() {
             @Override
@@ -116,7 +122,7 @@
                 if (mBlacklist.getAdapter() != null) {
                     mAdapter.replaceAll(list);
                 } else {
-                    mAdapter = new BlackListAdapter(list);
+                    mAdapter = new BlackListAdapter(list, BlackListFragment.this);
                     LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
                     mBlacklist.setLayoutManager(layoutManager);
                     mBlacklist.setAdapter(mAdapter);
diff --git a/ring-android/app/src/main/java/cx/ring/contactrequests/BlackListViewHolder.java b/ring-android/app/src/main/java/cx/ring/contactrequests/BlackListViewHolder.java
index 5a4edc0..ddf1763 100644
--- a/ring-android/app/src/main/java/cx/ring/contactrequests/BlackListViewHolder.java
+++ b/ring-android/app/src/main/java/cx/ring/contactrequests/BlackListViewHolder.java
@@ -21,6 +21,7 @@
 
 import android.support.v7.widget.RecyclerView;
 import android.view.View;
+import android.widget.ImageButton;
 import android.widget.ImageView;
 import android.widget.TextView;
 
@@ -29,6 +30,9 @@
 import cx.ring.R;
 
 public class BlackListViewHolder extends RecyclerView.ViewHolder {
+    @BindView(R.id.unblock)
+    protected ImageButton mButtonUnblock;
+
     @BindView(R.id.photo)
     protected ImageView mPhoto;
 
@@ -40,4 +44,17 @@
         super(view);
         ButterKnife.bind(this, view);
     }
+
+    public void bind(final BlackListListeners clickListener, final BlackListViewModel viewModel) {
+        mButtonUnblock.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                clickListener.onUnblockClick(viewModel);
+            }
+        });
+    }
+
+    public interface BlackListListeners {
+        void onUnblockClick(BlackListViewModel viewModel);
+    }
 }
diff --git a/ring-android/app/src/main/res/drawable/ic_person_add_black.xml b/ring-android/app/src/main/res/drawable/ic_person_add_black.xml
new file mode 100644
index 0000000..9972ad6
--- /dev/null
+++ b/ring-android/app/src/main/res/drawable/ic_person_add_black.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:pathData="M15,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM6,10L6,7L4,7v3L1,10v2h3v3h2v-3h3v-2L6,10zM15,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z"
+        android:fillColor="#000000"/>
+</vector>
diff --git a/ring-android/app/src/main/res/layout/item_contact_blacklist.xml b/ring-android/app/src/main/res/layout/item_contact_blacklist.xml
index 3d035ed..7f2ab72 100644
--- a/ring-android/app/src/main/res/layout/item_contact_blacklist.xml
+++ b/ring-android/app/src/main/res/layout/item_contact_blacklist.xml
@@ -24,7 +24,9 @@
         android:layout_height="wrap_content"
         android:layout_centerVertical="true"
         android:layout_toEndOf="@+id/photo"
+        android:layout_toLeftOf="@+id/unblock"
         android:layout_toRightOf="@+id/photo"
+        android:layout_toStartOf="@+id/unblock"
         android:ellipsize="middle"
         android:gravity="start"
         android:maxLines="1"
@@ -35,4 +37,16 @@
         android:textSize="16sp"
         tools:text="display name" />
 
+    <ImageButton
+        android:id="@+id/unblock"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentEnd="true"
+        android:layout_alignParentRight="true"
+        android:layout_centerVertical="true"
+        android:background="?selectableItemBackgroundBorderless"
+        android:contentDescription="@string/contact_unblock"
+        android:padding="16dp"
+        android:src="@drawable/ic_person_add_black" />
+
 </RelativeLayout>
\ No newline at end of file
diff --git a/ring-android/app/src/main/res/menu/account_edition.xml b/ring-android/app/src/main/res/menu/account_edition.xml
index 6bef2be..e1f1984 100644
--- a/ring-android/app/src/main/res/menu/account_edition.xml
+++ b/ring-android/app/src/main/res/menu/account_edition.xml
@@ -17,7 +17,7 @@
     <item
         android:id="@+id/menuitem_blacklist"
         android:icon="@drawable/ic_block_white"
-        android:title="@string/menu_item_blacklist"
+        android:title="@string/ic_blacklist_menu"
         app:showAsAction="ifRoom" />
 
 </menu>
\ No newline at end of file
diff --git a/ring-android/app/src/main/res/values/strings_content_description.xml b/ring-android/app/src/main/res/values/strings_content_description.xml
index e70dc9b..d45dc74 100644
--- a/ring-android/app/src/main/res/values/strings_content_description.xml
+++ b/ring-android/app/src/main/res/values/strings_content_description.xml
@@ -4,5 +4,6 @@
     <string name="contact_quick_call_description">Quick Call</string>
     <string name="contact_picture_description">Contact Picture</string>
     <string name="dial_numeric_pad">Numeric dialpad</string>
+    <string name="contact_unblock">Unblock</string>
 
 </resources>
\ No newline at end of file
diff --git a/ring-android/libringclient/src/main/java/cx/ring/contactrequests/BlackListPresenter.java b/ring-android/libringclient/src/main/java/cx/ring/contactrequests/BlackListPresenter.java
index f0a95b1..e3a9386 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/contactrequests/BlackListPresenter.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/contactrequests/BlackListPresenter.java
@@ -106,6 +106,17 @@
         updateList();
     }
 
+    public void unblockClicked(BlackListViewModel viewModel) {
+        Account account = mAccountService.getAccount(mAccountID);
+        String contactId = viewModel.getDisplayName();
+        if (account == null || contactId == null) {
+            return;
+        }
+
+        mContactService.addContact(account.getAccountID(), contactId);
+        updateList();
+    }
+
     @Override
     public void update(Observable observable, ServiceEvent event) {
         if (event == null) {