diff options
author | Yiqun Wu <yiqunw@google.com> | 2021-10-28 01:07:50 -0700 |
---|---|---|
committer | Yiqun Wu <yiqunw@google.com> | 2021-11-03 01:25:33 -0700 |
commit | 666fb7e5555992ee537a69bd208ee8e221cad458 (patch) | |
tree | 45cca0490fab4d4c1b3c446b914ec50b2544753d | |
parent | 237760b7094b46f3d1a644ba027840463e0e9e6f (diff) | |
download | Dialer-666fb7e5555992ee537a69bd208ee8e221cad458.tar.gz |
Refresh phone number entries only when save to favorite
Before: refresh the whole list which will lost the focus
After: refresh phone numbers and retains the focus
Fixes: 204137829
Test: manually
Change-Id: Ica16eedb4783e3906be9e52105ee01cc72d76489
3 files changed, 27 insertions, 13 deletions
diff --git a/src/com/android/car/dialer/ui/contact/ContactDetailsAdapter.java b/src/com/android/car/dialer/ui/contact/ContactDetailsAdapter.java index 520c32c6..e3064d10 100644 --- a/src/com/android/car/dialer/ui/contact/ContactDetailsAdapter.java +++ b/src/com/android/car/dialer/ui/contact/ContactDetailsAdapter.java @@ -44,7 +44,7 @@ class ContactDetailsAdapter extends RecyclerView.Adapter<ContactDetailsViewHolde private static final String TAG = "CD.ContactDetailsAdapter"; private static final int ID_HEADER = 1; - private static final int ID_NUMBER = 2; + static final int ID_NUMBER = 2; private static final int ID_ADDRESS = 3; interface PhoneNumberPresenter { diff --git a/src/com/android/car/dialer/ui/contact/ContactDetailsFragment.java b/src/com/android/car/dialer/ui/contact/ContactDetailsFragment.java index 332df713..e1ee4ccb 100644 --- a/src/com/android/car/dialer/ui/contact/ContactDetailsFragment.java +++ b/src/com/android/car/dialer/ui/contact/ContactDetailsFragment.java @@ -67,6 +67,7 @@ public class ContactDetailsFragment extends Hilt_ContactDetailsFragment implemen private Contact mContact; private LiveData<FutureData<Contact>> mContactDetailsLiveData; private ContactDetailsViewModel mContactDetailsViewModel; + private LiveData<Boolean> mPhoneNumberRefreshEvent; private boolean mShowActionBarView; private boolean mShowActionBarAvatar; @@ -93,6 +94,7 @@ public class ContactDetailsFragment extends Hilt_ContactDetailsFragment implemen mContactDetailsViewModel = new ViewModelProvider(this).get( ContactDetailsViewModel.class); mContactDetailsLiveData = mContactDetailsViewModel.getContactDetails(mContact); + mPhoneNumberRefreshEvent = mContactDetailsViewModel.getPhoneNumberRefreshEvent(); mShowActionBarView = getResources().getBoolean( R.bool.config_show_contact_details_action_bar_view); @@ -115,6 +117,15 @@ public class ContactDetailsFragment extends Hilt_ContactDetailsFragment implemen showContent(); } }); + + mPhoneNumberRefreshEvent.observe(this, refresh -> { + int itemCount = contactDetailsAdapter.getItemCount(); + for (int i = 0; i < itemCount; i++) { + if (contactDetailsAdapter.getItemViewType(i) == ContactDetailsAdapter.ID_NUMBER) { + contactDetailsAdapter.notifyItemChanged(i); + } + } + }); } private void onContactChanged(Contact contact) { diff --git a/src/com/android/car/dialer/ui/contact/ContactDetailsViewModel.java b/src/com/android/car/dialer/ui/contact/ContactDetailsViewModel.java index 442f045b..4ae3127f 100644 --- a/src/com/android/car/dialer/ui/contact/ContactDetailsViewModel.java +++ b/src/com/android/car/dialer/ui/contact/ContactDetailsViewModel.java @@ -29,6 +29,7 @@ import androidx.lifecycle.ViewModel; import com.android.car.arch.common.FutureData; import com.android.car.arch.common.LiveDataFunctions; import com.android.car.dialer.storage.FavoriteNumberRepository; +import com.android.car.dialer.ui.common.SingleLiveEvent; import com.android.car.telephony.common.Contact; import com.android.car.telephony.common.InMemoryPhoneBook; import com.android.car.telephony.common.PhoneNumber; @@ -49,12 +50,17 @@ import dagger.hilt.android.qualifiers.ApplicationContext; public class ContactDetailsViewModel extends ViewModel { private final Context mContext; private final FavoriteNumberRepository mFavoriteNumberRepository; + private final SingleLiveEvent mPhoneNumberRefreshEvent; @Inject public ContactDetailsViewModel(@ApplicationContext Context context, - FavoriteNumberRepository favoriteNumberRepository) { + FavoriteNumberRepository favoriteNumberRepository) { mContext = context; mFavoriteNumberRepository = favoriteNumberRepository; + mPhoneNumberRefreshEvent = new SingleLiveEvent(); + mPhoneNumberRefreshEvent.addSource( + mFavoriteNumberRepository.getFavoriteContacts(), + contacts -> mPhoneNumberRefreshEvent.setValue(Boolean.TRUE)); } /** @@ -95,6 +101,14 @@ public class ContactDetailsViewModel extends ViewModel { mFavoriteNumberRepository.removeFromFavorite(contact, phoneNumber); } + /** + * Returns if the phone number entries need refresh when any favorite state of the numbers has + * changed. + */ + public LiveData<Boolean> getPhoneNumberRefreshEvent() { + return mPhoneNumberRefreshEvent; + } + private class ContactDetailsLiveData extends MediatorLiveData<Contact> { private final Uri mContactLookupUri; private final String mAccountName; @@ -110,8 +124,6 @@ public class ContactDetailsViewModel extends ViewModel { mContactLookupUri = mContact.getLookupUri(); mAccountName = mContact.getAccountName(); addSource(InMemoryPhoneBook.get().getContactsLiveData(), this::onContactListChanged); - addSource(mFavoriteNumberRepository.getFavoriteContacts(), - this::onFavoriteContactsChanged); } private void onContactListChanged(List<Contact> contacts) { @@ -146,15 +158,6 @@ public class ContactDetailsViewModel extends ViewModel { ); } - private void onFavoriteContactsChanged(List<Contact> favoriteContacts) { - if (mContact == null) { - return; - } - Contact inMemoryContact = InMemoryPhoneBook.get().lookupContactByKey( - mContact.getLookupKey(), mContact.getAccountName()); - setValue(inMemoryContact); - } - @Override public void setValue(Contact contact) { mContact = contact; |