conversations: support searching raw ID and ignore case

Change-Id: Ic1f070930d1b49a09f73f957fd91578d9e142411
diff --git a/ring-android/app/src/main/java/cx/ring/services/ContactServiceImpl.java b/ring-android/app/src/main/java/cx/ring/services/ContactServiceImpl.java
index fd51b33..955a29b 100644
--- a/ring-android/app/src/main/java/cx/ring/services/ContactServiceImpl.java
+++ b/ring-android/app/src/main/java/cx/ring/services/ContactServiceImpl.java
@@ -399,7 +399,9 @@
             Single<Tuple<String, Object>> profile = callContact.isFromSystem() ? loadSystemContactData(callContact) : loadVCardContactData(callContact, accountId);
             return profile
                     .doOnSuccess(p -> callContact.setProfile(p.first, p.second))
-                    .doOnError(e -> callContact.setProfile(null, null)).ignoreElement();
+                    .doOnError(e -> callContact.setProfile(null, null))
+                    .ignoreElement()
+                    .onErrorComplete();
         }
         return Completable.complete();
     }
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 5912128..7ff4ac1 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
@@ -367,7 +367,15 @@
                         .toList()));
     }
     private Single<List<Observable<SmartListViewModel>>> getSearchResults(Account account, String query) {
-        if (account.canSearch()) {
+        Uri uri = new Uri(query);
+        if (account.isSip()) {
+            CallContact contact = account.getContactFromCache(uri);
+            return mContactService.loadContactData(contact, account.getAccountID())
+                    .andThen(Single.just(Collections.singletonList(Observable.just(new SmartListViewModel(account.getAccountID(), contact, null)))));
+        } else if (uri.isRingId()) {
+            return mContactService.getLoadedContact(account.getAccountID(), account.getContactFromCache(uri))
+                    .map(contact -> Collections.singletonList(Observable.just(new SmartListViewModel(account.getAccountID(), contact, null))));
+        } else if (account.canSearch()) {
             return mAccountService.searchUser(account.getAccountID(), query)
                     .map(AccountService.UserSearchResult::getResultsViewModels);
         } else {
@@ -397,10 +405,11 @@
                             for (Conversation conversation : conversations)
                                 newList.add(observeConversation(account, conversation));
                         } else {
+                            String lq = q.toLowerCase();
                             newList.add(SmartListViewModel.TITLE_CONVERSATIONS);
                             int nRes = 0;
                             for (Conversation conversation : conversations) {
-                                if (conversation.getContact().matches(q)) {
+                                if (conversation.getContact().matches(lq)) {
                                     newList.add(observeConversation(account, conversation));
                                     nRes++;
                                 }
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 fb3ea56..fb25169 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
@@ -200,7 +200,7 @@
                     }
                     view.hideNoConversationMessage();
                     view.updateList(viewModels);
-                }));
+                }, e -> Log.w(TAG, "showConversations error ", e)));
     }
 
     private void loadConversations() {