Snap for 5821701 from ad94b0f3bdc5a1402d8ebdb7d92acbc4a2bb3c07 to qt-c2f2-release

Change-Id: Iea2699a6c58355082eccfbe3baaffcd45bca514d
diff --git a/src/com/android/car/dialer/telecom/InCallRouter.java b/src/com/android/car/dialer/telecom/InCallRouter.java
index 0704470..9447cd4 100644
--- a/src/com/android/car/dialer/telecom/InCallRouter.java
+++ b/src/com/android/car/dialer/telecom/InCallRouter.java
@@ -21,6 +21,8 @@
 import android.os.Handler;
 import android.telecom.Call;
 
+import androidx.annotation.MainThread;
+
 import com.android.car.dialer.log.L;
 import com.android.car.dialer.notification.InCallNotificationController;
 import com.android.car.dialer.ui.activecall.InCallActivity;
@@ -95,13 +97,15 @@
         }
     }
 
+    @MainThread
     void registerActiveCallListChangedCallback(
             InCallServiceImpl.ActiveCallListChangedCallback callback) {
-        mMainHandler.post(() -> mActiveCallListChangedCallbacks.add(callback));
+        mActiveCallListChangedCallbacks.add(callback);
     }
 
+    @MainThread
     void unregisterActiveCallHandler(InCallServiceImpl.ActiveCallListChangedCallback callback) {
-        mMainHandler.post(() -> mActiveCallListChangedCallbacks.remove(callback));
+        mActiveCallListChangedCallbacks.remove(callback);
     }
 
     /** Dispatches the call to {@link InCallServiceImpl.ActiveCallListChangedCallback}. */
diff --git a/src/com/android/car/dialer/ui/activecall/InCallFragment.java b/src/com/android/car/dialer/ui/activecall/InCallFragment.java
index 9a265dd..f130b67 100644
--- a/src/com/android/car/dialer/ui/activecall/InCallFragment.java
+++ b/src/com/android/car/dialer/ui/activecall/InCallFragment.java
@@ -16,7 +16,6 @@
 
 package com.android.car.dialer.ui.activecall;
 
-import android.graphics.Bitmap;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.os.SystemClock;
@@ -128,18 +127,17 @@
                 LetterTileDrawable letterTile = TelecomUtils.createLetterTile(
                         getContext(), info.getDisplayName());
 
-                Glide.with(getContext())
-                        .asBitmap()
+                Glide.with(this)
                         .load(info.getAvatarUri())
                         .apply(new RequestOptions().centerCrop().error(letterTile))
-                        .into(new SimpleTarget<Bitmap>() {
+                        .into(new SimpleTarget<Drawable>() {
                             @Override
-                            public void onResourceReady(Bitmap resource,
-                                    Transition<? super Bitmap> glideAnimation) {
+                            public void onResourceReady(Drawable resource,
+                                    Transition<? super Drawable> glideAnimation) {
                                 // set showAnimation to false mostly because bindUserProfileView
                                 // called several times, and we don't want the image to flicker
-                                mBackgroundImage.setBackgroundImage(resource, false);
-                                mAvatarView.setImageBitmap(resource);
+                                mBackgroundImage.setBackgroundDrawable(resource);
+                                mAvatarView.setImageDrawable(resource);
                             }
 
                             @Override
diff --git a/src/com/android/car/dialer/ui/contact/ContactListViewModel.java b/src/com/android/car/dialer/ui/contact/ContactListViewModel.java
index 90e4517..d6dd8c6 100644
--- a/src/com/android/car/dialer/ui/contact/ContactListViewModel.java
+++ b/src/com/android/car/dialer/ui/contact/ContactListViewModel.java
@@ -51,9 +51,8 @@
         super(application);
         mContext = application.getApplicationContext();
 
-        String key = mContext.getString(R.string.sort_order_key);
         SharedPreferencesLiveData preferencesLiveData =
-                new SharedPreferencesLiveData(mContext, key);
+                new SharedPreferencesLiveData(mContext, R.string.sort_order_key);
         LiveData<List<Contact>> contactListLiveData = InMemoryPhoneBook.get().getContactsLiveData();
         mSortedContactListLiveData = new SortedContactListLiveData(
                 mContext, contactListLiveData, preferencesLiveData);
@@ -114,15 +113,15 @@
             }
 
             String key = mPreferencesLiveData.getKey();
-            String defaultValue = mContext.getResources().getStringArray(
-                    R.array.contact_order_entry_values)[0];
+            String firstNameSort = mContext.getResources().getString(
+                    R.string.give_name_first_title);
 
             List<Contact> contactList = mContactListLiveData.getValue();
             Comparator<Contact> comparator;
             Integer sortMethod;
             if (mPreferencesLiveData.getValue() == null
-                    || mPreferencesLiveData.getValue().getString(key, defaultValue)
-                    .equals(defaultValue)) {
+                    || firstNameSort.equals(
+                    mPreferencesLiveData.getValue().getString(key, firstNameSort))) {
                 comparator = mFirstNameComparator;
                 sortMethod = SORT_BY_FIRST_NAME;
             } else {
diff --git a/src/com/android/car/dialer/ui/search/ContactResultsViewModel.java b/src/com/android/car/dialer/ui/search/ContactResultsViewModel.java
index 0792198..4710dc3 100644
--- a/src/com/android/car/dialer/ui/search/ContactResultsViewModel.java
+++ b/src/com/android/car/dialer/ui/search/ContactResultsViewModel.java
@@ -17,7 +17,8 @@
 package com.android.car.dialer.ui.search;
 
 import android.app.Application;
-import android.content.ContentResolver;
+import android.content.Context;
+import android.content.SharedPreferences;
 import android.database.Cursor;
 import android.net.Uri;
 import android.provider.ContactsContract;
@@ -30,6 +31,8 @@
 import androidx.lifecycle.MediatorLiveData;
 import androidx.lifecycle.MutableLiveData;
 
+import com.android.car.dialer.R;
+import com.android.car.dialer.livedata.SharedPreferencesLiveData;
 import com.android.car.telephony.common.Contact;
 import com.android.car.telephony.common.InMemoryPhoneBook;
 import com.android.car.telephony.common.ObservableAsyncQuery;
@@ -37,6 +40,7 @@
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 
 /** {link AndroidViewModel} used for search functionality. */
@@ -48,12 +52,15 @@
 
     private final ContactResultsLiveData mContactSearchResultsLiveData;
     private final MutableLiveData<String> mSearchQueryLiveData;
+    private final SharedPreferencesLiveData mSharedPreferencesLiveData;
 
     public ContactResultsViewModel(@NonNull Application application) {
         super(application);
         mSearchQueryLiveData = new MutableLiveData<>();
-        mContactSearchResultsLiveData = new ContactResultsLiveData(application.getContentResolver(),
-                mSearchQueryLiveData);
+        mSharedPreferencesLiveData =
+                new SharedPreferencesLiveData(application, R.string.sort_order_key);
+        mContactSearchResultsLiveData = new ContactResultsLiveData(application,
+                mSearchQueryLiveData, mSharedPreferencesLiveData);
     }
 
     void setSearchQuery(String searchQuery) {
@@ -73,17 +80,28 @@
     }
 
     private static class ContactResultsLiveData extends MediatorLiveData<List<Contact>> {
+        private final Context mContext;
         private final SearchQueryParamProvider mSearchQueryParamProvider;
         private final ObservableAsyncQuery mObservableAsyncQuery;
+        private final SharedPreferencesLiveData mSharedPreferencesLiveData;
+        private final Comparator<Contact> mFirstNameComparator =
+                (o1, o2) -> o1.compareByDisplayName(o2);
+        private final Comparator<Contact> mLastNameComparator =
+                (o1, o2) -> o1.compareByAltDisplayName(o2);
 
-        ContactResultsLiveData(ContentResolver contentResolver,
-                LiveData<String> searchQueryLiveData) {
+        ContactResultsLiveData(Context context,
+                LiveData<String> searchQueryLiveData,
+                SharedPreferencesLiveData sharedPreferencesLiveData) {
+            mContext = context;
             mSearchQueryParamProvider = new SearchQueryParamProvider(searchQueryLiveData);
             mObservableAsyncQuery = new ObservableAsyncQuery(mSearchQueryParamProvider,
-                    contentResolver, this::onQueryFinished);
+                    context.getContentResolver(), this::onQueryFinished);
 
             addSource(InMemoryPhoneBook.get().getContactsLiveData(), this::onContactsChange);
             addSource(searchQueryLiveData, this::onSearchQueryChanged);
+
+            mSharedPreferencesLiveData = sharedPreferencesLiveData;
+            addSource(mSharedPreferencesLiveData, this::onSortOrderChanged);
         }
 
         private void onContactsChange(List<Contact> contactList) {
@@ -104,6 +122,17 @@
             }
         }
 
+        private void onSortOrderChanged(SharedPreferences unusedSharedPreferences) {
+            if (getValue() == null) {
+                return;
+            }
+
+            List<Contact> contacts = new ArrayList<>();
+            contacts.addAll(getValue());
+            Collections.sort(contacts, getComparator());
+            setValue(contacts);
+        }
+
         private void onQueryFinished(@Nullable Cursor cursor) {
             if (cursor == null) {
                 setValue(Collections.emptyList());
@@ -119,9 +148,22 @@
                     contacts.add(contact);
                 }
             }
+            Collections.sort(contacts, getComparator());
             setValue(contacts);
             cursor.close();
         }
+
+        private Comparator<Contact> getComparator() {
+            String firstNameSort = mContext.getResources().getString(
+                    R.string.give_name_first_title);
+            String key = mSharedPreferencesLiveData.getKey();
+            if (firstNameSort.equals(
+                    mSharedPreferencesLiveData.getValue().getString(key, firstNameSort))) {
+                return mFirstNameComparator;
+            } else {
+                return mLastNameComparator;
+            }
+        }
     }
 
     private static class SearchQueryParamProvider implements QueryParam.Provider {