account: refactor getting account name

Change-Id: I158c37b2765ffb77bcb1ef41a1386bd0ec7a5e87
diff --git a/ring-android/app/src/main/java/cx/ring/account/JamiAccountSummaryFragment.java b/ring-android/app/src/main/java/cx/ring/account/JamiAccountSummaryFragment.java
index a7aa444..b8837f8 100644
--- a/ring-android/app/src/main/java/cx/ring/account/JamiAccountSummaryFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/account/JamiAccountSummaryFragment.java
@@ -27,7 +27,6 @@
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.graphics.Bitmap;
-import android.graphics.Typeface;
 import android.net.Uri;
 import android.os.Bundle;
 
@@ -38,26 +37,14 @@
 import androidx.annotation.Nullable;
 
 import android.provider.MediaStore;
-import android.text.Editable;
-import android.text.Layout;
-import android.text.Spannable;
-import android.text.SpannableString;
 import android.text.TextUtils;
-import android.text.TextWatcher;
-import android.text.style.AlignmentSpan;
-import android.text.style.RelativeSizeSpan;
-import android.text.style.StyleSpan;
 import android.util.Log;
-import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.ViewTreeObserver;
-import android.view.inputmethod.EditorInfo;
-import android.widget.EditText;
 import android.widget.ImageButton;
 import android.widget.ImageView;
-import android.widget.TextView;
 import android.widget.Toast;
 
 import java.io.File;
@@ -66,7 +53,6 @@
 import javax.inject.Inject;
 
 import androidx.core.content.FileProvider;
-import androidx.core.util.Pair;
 
 import cx.ring.R;
 import cx.ring.application.JamiApplication;
@@ -188,13 +174,10 @@
 
         mProfileDisposable.clear();
         mProfileDisposable.add(AvatarDrawable.load(context, account)
-                .map(avatar -> new Pair<>(account, avatar))
                 .observeOn(AndroidSchedulers.mainThread())
-                .subscribe(d -> {
-                    mBinding.userPhoto.setImageDrawable(d.second);
-                    if (!mBinding.username.getText().equals(getAccountAlias(d.first))) {
-                        mBinding.username.setText(getAccountAlias(d.first));
-                    }
+                .subscribe(avatar -> {
+                    mBinding.userPhoto.setImageDrawable(avatar);
+                    mBinding.username.setText(account.getLoadedProfile().blockingGet().first);
                 }, e -> Log.e(TAG, "Error loading avatar", e)));
     }
 
@@ -271,7 +254,7 @@
         mAccountId = account.getAccountID();
         mBestName = account.getRegisteredName();
         if (mBestName.isEmpty()) {
-            mBestName = account.getAlias();
+            mBestName = account.getDisplayUsername();
             if (mBestName.isEmpty()) {
                 mBestName = account.getUsername();
             }
@@ -635,40 +618,6 @@
                 .subscribe(avatar -> mProfilePhoto.setImageDrawable(avatar), e-> Log.e(TAG, "Error loading image", e)));
     }
 
-    private String getAccountAlias(Account account) {
-        if (account == null) {
-            cx.ring.utils.Log.e(TAG, "Not able to get account alias");
-            return null;
-        }
-        String alias = getAlias(account);
-        return (alias == null) ? account.getAlias() : alias;
-    }
-
-    private String getAlias(Account account) {
-        if (account == null) {
-            cx.ring.utils.Log.e(TAG, "Not able to get alias");
-            return null;
-        }
-        VCard vcard = account.getProfile();
-        if (vcard != null) {
-            FormattedName name = vcard.getFormattedName();
-            if (name != null) {
-                String name_value = name.getValue();
-                if (name_value != null && !name_value.isEmpty()) {
-                    return name_value;
-                }
-            }
-        }
-        return null;
-    }
-
-    private String getUri(Account account, CharSequence defaultNameSip) {
-        if (account.isIP2IP()) {
-            return defaultNameSip.toString();
-        }
-        return account.getDisplayUri();
-    }
-
     @Override
     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
         super.onRequestPermissionsResult(requestCode, permissions, grantResults);
diff --git a/ring-android/app/src/main/java/cx/ring/client/ToolbarSpinnerAdapter.java b/ring-android/app/src/main/java/cx/ring/client/AccountSpinnerAdapter.java
similarity index 76%
rename from ring-android/app/src/main/java/cx/ring/client/ToolbarSpinnerAdapter.java
rename to ring-android/app/src/main/java/cx/ring/client/AccountSpinnerAdapter.java
index 9dccb11..148b7e4 100644
--- a/ring-android/app/src/main/java/cx/ring/client/ToolbarSpinnerAdapter.java
+++ b/ring-android/app/src/main/java/cx/ring/client/AccountSpinnerAdapter.java
@@ -35,21 +35,19 @@
 import cx.ring.databinding.ItemToolbarSpinnerBinding;
 import cx.ring.model.Account;
 import cx.ring.views.AvatarDrawable;
-import ezvcard.VCard;
-import ezvcard.property.FormattedName;
 import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.Disposable;
+import io.reactivex.disposables.CompositeDisposable;
 import io.reactivex.schedulers.Schedulers;
 
-public class ToolbarSpinnerAdapter extends ArrayAdapter<Account> {
-    private static final String TAG = ToolbarSpinnerAdapter.class.getSimpleName();
+public class AccountSpinnerAdapter extends ArrayAdapter<Account> {
+    private static final String TAG = AccountSpinnerAdapter.class.getSimpleName();
     public static final int TYPE_ACCOUNT = 0;
     public static final int TYPE_CREATE_JAMI = 1;
     public static final int TYPE_CREATE_SIP = 2;
     private final LayoutInflater mInflater;
     private final int logoSize;
 
-    public ToolbarSpinnerAdapter(@NonNull Context context, List<Account> accounts){
+    public AccountSpinnerAdapter(@NonNull Context context, List<Account> accounts){
         super(context, R.layout.item_toolbar_spinner, accounts);
         mInflater = LayoutInflater.from(context);
         logoSize = context.getResources().getDimensionPixelSize(R.dimen.list_medium_icon_size);
@@ -68,9 +66,7 @@
             convertView.setTag(holder);
         } else {
             holder = (ViewHolder) convertView.getTag();
-            if (holder.loader != null)  {
-                holder.loader.dispose();
-            }
+            holder.loader.clear();
         }
 
         holder.binding.logo.setVisibility(View.GONE);
@@ -80,7 +76,9 @@
         holder.binding.title.setLayoutParams(params);
         if (type == TYPE_ACCOUNT) {
             Account account = getItem(position);
-            holder.binding.title.setText(getAccountAlias(account));
+            holder.loader.add(account.getAccountAlias()
+                    .observeOn(AndroidSchedulers.mainThread())
+                    .subscribe(alias -> holder.binding.title.setText(alias)));
         }
 
         return convertView;
@@ -98,28 +96,36 @@
             rowView.setTag(holder);
         } else {
             holder = (ViewHolder) rowView.getTag();
-            if (holder.loader != null)  {
-                holder.loader.dispose();
-            }
+            holder.loader.clear();
         }
 
         holder.binding.logo.setVisibility(View.VISIBLE);
         ViewGroup.LayoutParams logoParam = holder.binding.logo.getLayoutParams();
         if (type == TYPE_ACCOUNT) {
             Account account = getItem(position);
-            holder.binding.subtitle.setVisibility(View.VISIBLE);
-            holder.binding.title.setText(getAccountAlias(account));
-            holder.binding.subtitle.setText(getUri(account, rowView.getContext().getString(R.string.account_type_ip2ip)));
+            CharSequence ip2ipString = rowView.getContext().getString(R.string.account_type_ip2ip);
+            holder.loader.add(account.getAccountAlias()
+                    .observeOn(AndroidSchedulers.mainThread())
+                    .subscribe(alias -> {
+                        String subtitle = getUri(account, ip2ipString);
+                        holder.binding.title.setText(alias);
+                        if (alias.equals(subtitle)) {
+                            holder.binding.subtitle.setVisibility(View.GONE);
+                        } else {
+                            holder.binding.subtitle.setVisibility(View.VISIBLE);
+                            holder.binding.subtitle.setText(subtitle);
+                        }
+                    }));
             RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) holder.binding.title.getLayoutParams();
             params.removeRule(RelativeLayout.CENTER_VERTICAL);
             holder.binding.title.setLayoutParams(params);
             logoParam.width = logoSize;
             logoParam.height = logoSize;
             holder.binding.logo.setLayoutParams(logoParam);
-            holder.loader = AvatarDrawable.load(getContext(), account)
+            holder.loader.add(AvatarDrawable.load(getContext(), account)
                     .subscribeOn(Schedulers.io())
                     .observeOn(AndroidSchedulers.mainThread())
-                    .subscribe(avatar -> holder.binding.logo.setImageDrawable(avatar), e -> Log.e(TAG, "Error loading avatar", e));
+                    .subscribe(avatar -> holder.binding.logo.setImageDrawable(avatar), e -> Log.e(TAG, "Error loading avatar", e)));
         } else {
             if (type == TYPE_CREATE_JAMI)
                 holder.binding.title.setText(R.string.add_ring_account_title);
@@ -157,34 +163,7 @@
 
     private static class ViewHolder {
         ItemToolbarSpinnerBinding binding;
-        Disposable loader;
-    }
-
-    private String getAccountAlias(Account account) {
-        if (account == null) {
-            Log.e(TAG, "Not able to get account alias");
-            return null;
-        }
-        String alias = getAlias(account);
-        return (alias == null) ? account.getAlias() : alias;
-    }
-
-    private String getAlias(Account account) {
-        if (account == null) {
-            Log.e(TAG, "Not able to get alias");
-            return null;
-        }
-        VCard vcard = account.getProfile();
-        if (vcard != null) {
-            FormattedName name = vcard.getFormattedName();
-            if (name != null) {
-                String name_value = name.getValue();
-                if (name_value != null && !name_value.isEmpty()) {
-                    return name_value;
-                }
-            }
-        }
-        return null;
+        final CompositeDisposable loader = new CompositeDisposable();
     }
 
     private String getUri(Account account, CharSequence defaultNameSip) {
diff --git a/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java b/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java
index f4d9ac2..411aba7 100644
--- a/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java
@@ -112,7 +112,7 @@
     protected Fragment fContent;
     protected ConversationFragment fConversation;
 
-    private ToolbarSpinnerAdapter mAccountAdapter;
+    private AccountSpinnerAdapter mAccountAdapter;
     private BackHandlerInterface mAccountFragmentBackHandlerInterface;
 
     private ViewOutlineProvider mOutlineProvider;
@@ -317,7 +317,7 @@
                 .observeOn(AndroidSchedulers.mainThread())
                 .subscribe(accounts -> {
                     if (mAccountAdapter == null) {
-                        mAccountAdapter = new ToolbarSpinnerAdapter(HomeActivity.this, accounts);
+                        mAccountAdapter = new AccountSpinnerAdapter(HomeActivity.this, accounts);
                         mAccountAdapter.setNotifyOnChange(false);
                         binding.spinnerToolbar.setAdapter(mAccountAdapter);
                     } else {
@@ -561,11 +561,11 @@
     @Override
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
         int type = mAccountAdapter.getItemViewType(position);
-        if (type == ToolbarSpinnerAdapter.TYPE_ACCOUNT) {
+        if (type == AccountSpinnerAdapter.TYPE_ACCOUNT) {
             mAccountService.setCurrentAccount(mAccountAdapter.getItem(position));
         } else {
             Intent intent = new Intent(HomeActivity.this, AccountWizardActivity.class);
-            if (type == ToolbarSpinnerAdapter.TYPE_CREATE_SIP) {
+            if (type == AccountSpinnerAdapter.TYPE_CREATE_SIP) {
                 intent.setAction(AccountConfig.ACCOUNT_TYPE_SIP);
             }
             startActivity(intent);
diff --git a/ring-android/app/src/main/java/cx/ring/services/VCardServiceImpl.java b/ring-android/app/src/main/java/cx/ring/services/VCardServiceImpl.java
index 944dfd9..c374624 100644
--- a/ring-android/app/src/main/java/cx/ring/services/VCardServiceImpl.java
+++ b/ring-android/app/src/main/java/cx/ring/services/VCardServiceImpl.java
@@ -45,7 +45,7 @@
 
 public class VCardServiceImpl extends VCardService {
 
-    private Context mContext;
+    private final Context mContext;
 
     public VCardServiceImpl(Context context) {
         this.mContext = context;
diff --git a/ring-android/app/src/main/java/cx/ring/tv/account/TVProfileEditingFragment.java b/ring-android/app/src/main/java/cx/ring/tv/account/TVProfileEditingFragment.java
index 79216d7..5edbd10 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/account/TVProfileEditingFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/account/TVProfileEditingFragment.java
@@ -123,7 +123,7 @@
         String title = getString(R.string.profile);
         String breadcrumb = "";
         String description = getString(R.string.profile_message_warning);
-        Drawable icon = getResources().getDrawable(R.drawable.ic_contact_picture_fallback);
+        Drawable icon = requireContext().getDrawable(R.drawable.ic_contact_picture_fallback);
         return new GuidanceStylist.Guidance(title, description, breadcrumb, icon);
     }
 
@@ -169,7 +169,7 @@
             return;
         }
 
-        String alias = presenter.getAlias(account);
+        String alias = viewModel.getAlias();
         GuidedAction action = actions.isEmpty() ? null : actions.get(0);
         if (action != null && action.getId() == USER_NAME) {
             if (TextUtils.isEmpty(alias)) {
diff --git a/ring-android/app/src/main/java/cx/ring/tv/main/MainPresenter.java b/ring-android/app/src/main/java/cx/ring/tv/main/MainPresenter.java
index 744499a..357a4a6 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/main/MainPresenter.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/main/MainPresenter.java
@@ -189,7 +189,7 @@
                 .observeOn(mUiScheduler)
                 .subscribe(
                         accounts -> getView().displayAccountInfos(
-                                new HomeNavigationViewModel(accounts.isEmpty() ? null : accounts.get(0), accounts)),
+                                new HomeNavigationViewModel(accounts.isEmpty() ? null : accounts.get(0), null)),
                         e-> Log.d(TAG, "reloadAccountInfos getProfileAccountList onError", e)));
         mCompositeDisposable.add(mAccountService.getObservableAccounts()
                 .observeOn(mUiScheduler)
@@ -197,7 +197,7 @@
                     MainView v = getView();
                     if (v != null)
                         v.updateModel(account);
-                }, e ->  cx.ring.utils.Log.e(TAG, "Error loading account list !", e)));
+                }, e ->  Log.e(TAG, "Error loading account list !", e)));
     }
 
     public void onExportClicked() {
diff --git a/ring-android/libringclient/src/main/java/cx/ring/account/JamiAccountSummaryPresenter.java b/ring-android/libringclient/src/main/java/cx/ring/account/JamiAccountSummaryPresenter.java
index ef46ece..3e31037 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/account/JamiAccountSummaryPresenter.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/account/JamiAccountSummaryPresenter.java
@@ -226,32 +226,4 @@
         }
     }
 
-    public String getAlias(Account account) {
-        if (account == null) {
-            Log.e(TAG, "Not able to get alias");
-            return null;
-        }
-        VCard vcard = account.getProfile();
-        if (vcard != null) {
-            FormattedName name = vcard.getFormattedName();
-            if (name != null) {
-                String name_value = name.getValue();
-                if (name_value != null && !name_value.isEmpty()) {
-                    return name_value;
-                }
-            }
-        }
-        return null;
-    }
-
-    public String getAccountAlias(Account account) {
-        if (account == null) {
-            cx.ring.utils.Log.e(TAG, "Not able to get account alias");
-            return null;
-        }
-        String alias = getAlias(account);
-        return (alias == null) ? account.getAlias() : alias;
-    }
-
-
 }
diff --git a/ring-android/libringclient/src/main/java/cx/ring/model/Account.java b/ring-android/libringclient/src/main/java/cx/ring/model/Account.java
index 45a5d83..b88e337 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/model/Account.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/model/Account.java
@@ -988,9 +988,26 @@
     }
 
     public Single<String> getAccountAlias() {
-        if (mLoadedProfile == null)
-            return Single.just(getAlias());
-        return mLoadedProfile.map(p -> StringUtils.isEmpty(p.first) ? getAlias() : p.first);
+        if (isJami()) {
+            if (mLoadedProfile == null)
+                return Single.just(getJamiAlias());
+            return mLoadedProfile.map(p -> StringUtils.isEmpty(p.first) ? getJamiAlias() : p.first);
+        } else {
+            if (mLoadedProfile == null)
+                return Single.just(getAlias());
+            return mLoadedProfile.map(p -> StringUtils.isEmpty(p.first) ? getAlias() : p.first);
+        }
+    }
+
+    /**
+     * Registered name, fallback to Alias
+     */
+    private String getJamiAlias() {
+        String registeredName = getRegisteredName();
+        if (StringUtils.isEmpty(registeredName))
+            return getAlias();
+        else
+            return registeredName;
     }
 
     public void setProfile(VCard vcard) {
diff --git a/ring-android/libringclient/src/main/java/cx/ring/navigation/HomeNavigationPresenter.java b/ring-android/libringclient/src/main/java/cx/ring/navigation/HomeNavigationPresenter.java
index d8deffe..8746d13 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/navigation/HomeNavigationPresenter.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/navigation/HomeNavigationPresenter.java
@@ -33,9 +33,8 @@
 import cx.ring.services.HardwareService;
 import cx.ring.utils.Log;
 import cx.ring.utils.StringUtils;
+import cx.ring.utils.Tuple;
 import cx.ring.utils.VCardUtils;
-import ezvcard.VCard;
-import ezvcard.property.FormattedName;
 import ezvcard.property.Photo;
 import ezvcard.property.RawProperty;
 import ezvcard.property.Uid;
@@ -68,11 +67,13 @@
     public void bindView(HomeNavigationView view) {
         super.bindView(view);
         mCompositeDisposable.add(mAccountService.getProfileAccountList()
+                .filter(accounts -> !accounts.isEmpty())
+                .switchMapSingle(accounts -> accounts.get(0).getAccountAlias().map(alias -> new Tuple<>(accounts.get(0), alias)))
                 .observeOn(mUiScheduler)
-                .subscribe(accounts -> {
+                .subscribe(alias -> {
                     HomeNavigationView v = getView();
                     if (v != null)
-                        v.showViewModel(new HomeNavigationViewModel(accounts.isEmpty() ? null : accounts.get(0), accounts));
+                        v.showViewModel(new HomeNavigationViewModel(alias.first, alias.second));
                 }, e ->  Log.e(TAG, "Error loading account list !", e)));
         mCompositeDisposable.add(mAccountService.getObservableAccounts()
                 .observeOn(mUiScheduler)
@@ -143,10 +144,8 @@
                     if (!StringUtils.isEmpty(username)) {
                         vcard.setFormattedName(username);
                     }
-                    if (photo != null) {
-                        vcard.removeProperties(Photo.class);
-                        vcard.addPhoto(pic);
-                    }
+                    vcard.removeProperties(Photo.class);
+                    vcard.addPhoto(pic);
                     vcard.removeProperties(RawProperty.class);
                     return vcard;
                 })
@@ -158,33 +157,6 @@
                 }, e -> Log.e(TAG, "Error saving vCard !", e)));
     }
 
-    public String getAlias(Account account) {
-        if (account == null) {
-            Log.e(TAG, "Not able to get alias");
-            return null;
-        }
-        VCard vcard = account.getProfile();
-        if (vcard != null) {
-            FormattedName name = vcard.getFormattedName();
-            if (name != null) {
-                String name_value = name.getValue();
-                if (name_value != null && !name_value.isEmpty()) {
-                    return name_value;
-                }
-            }
-        }
-        return null;
-    }
-
-    public String getAccountAlias(Account account) {
-        if (account == null) {
-            Log.e(TAG, "Not able to get account alias");
-            return null;
-        }
-        String alias = getAlias(account);
-        return (alias == null) ? account.getAlias() : alias;
-    }
-
     public String getUri(Account account, CharSequence defaultNameSip) {
         if (account.isIP2IP()) {
             return defaultNameSip.toString();
diff --git a/ring-android/libringclient/src/main/java/cx/ring/navigation/HomeNavigationViewModel.java b/ring-android/libringclient/src/main/java/cx/ring/navigation/HomeNavigationViewModel.java
index 30a7c44..69c5b55 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/navigation/HomeNavigationViewModel.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/navigation/HomeNavigationViewModel.java
@@ -1,7 +1,8 @@
 /*
- *  Copyright (C) 2004-2019 Savoir-faire Linux Inc.
+ *  Copyright (C) 2004-2020 Savoir-faire Linux Inc.
  *
  *  Author: Aline Bonnet <aline.bonnet@savoirfairelinux.com>
+ *  Author: Adrien Béraud <adrien.beraud@savoirfairelinux.com>
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -20,24 +21,22 @@
 
 package cx.ring.navigation;
 
-import java.util.List;
-
 import cx.ring.model.Account;
 
 public class HomeNavigationViewModel {
     final private Account mAccount;
-    final private List<Account> mAccounts;
+    final private String mAlias;
 
-    public HomeNavigationViewModel(Account account, List<Account> accounts) {
+    public HomeNavigationViewModel(Account account, String alias) {
         mAccount = account;
-        mAccounts = accounts;
+        mAlias = alias;
     }
 
     public Account getAccount() {
         return mAccount;
     }
 
-    public List<Account> getAccounts() {
-        return mAccounts;
+    public String getAlias() {
+        return mAlias;
     }
 }