Display contacts and call log for only one HFP device.

The device will be the first one on the connected device list.

Bug: 158870450
Test: Manually.
Change-Id: I6c44ce385f512c72198bd3a28afb17cd1f9c9d2c
diff --git a/src/com/android/car/dialer/bluetooth/UiBluetoothMonitor.java b/src/com/android/car/dialer/bluetooth/UiBluetoothMonitor.java
index 1bae04b..d232216 100644
--- a/src/com/android/car/dialer/bluetooth/UiBluetoothMonitor.java
+++ b/src/com/android/car/dialer/bluetooth/UiBluetoothMonitor.java
@@ -16,10 +16,12 @@
 
 package com.android.car.dialer.bluetooth;
 
+import android.bluetooth.BluetoothDevice;
 import android.content.Context;
 
 import androidx.lifecycle.LiveData;
 import androidx.lifecycle.Observer;
+import androidx.lifecycle.Transformations;
 
 import com.android.car.dialer.livedata.BluetoothHfpStateLiveData;
 import com.android.car.dialer.livedata.BluetoothPairListLiveData;
@@ -132,6 +134,17 @@
         return mHfpDeviceListLiveData;
     }
 
+    /**
+     * Returns a LiveData which monitors the first HFP Bluetooth device on the connected device
+     * list.
+     */
+    public LiveData<BluetoothDevice> getFirstHfpConnectedDevice() {
+        return Transformations.map(mHfpDeviceListLiveData, (devices) ->
+                devices != null && !devices.isEmpty()
+                        ? devices.get(0)
+                        : null);
+    }
+
     private void removeObserver(LiveData liveData, Observer observer) {
         if (liveData != null && liveData.hasObservers()) {
             liveData.removeObserver(observer);
diff --git a/src/com/android/car/dialer/livedata/CallHistoryLiveData.java b/src/com/android/car/dialer/livedata/CallHistoryLiveData.java
index 857a53e..565928d 100644
--- a/src/com/android/car/dialer/livedata/CallHistoryLiveData.java
+++ b/src/com/android/car/dialer/livedata/CallHistoryLiveData.java
@@ -59,27 +59,25 @@
      * Creates a new instance of call history live data which loads all types of call history
      * with a limit of 100 logs.
      */
-    public static CallHistoryLiveData newInstance(Context context) {
-        return newInstance(context, CALL_TYPE_ALL, DEFAULT_CALL_LOG_LIMIT);
+    public static CallHistoryLiveData newInstance(Context context, String accountName) {
+        return newInstance(context, CALL_TYPE_ALL, DEFAULT_CALL_LOG_LIMIT, accountName);
     }
 
-    /**
-     * Returns a new instance of last call live data.
-     */
-    public static CallHistoryLiveData newLastCallLiveData(Context context) {
-        return newInstance(context, CALL_TYPE_ALL, 1);
-    }
-
-    private static CallHistoryLiveData newInstance(Context context, int callType, int limit) {
+    private static CallHistoryLiveData newInstance(Context context, int callType, int limit,
+            String accountName) {
         StringBuilder where = new StringBuilder();
         List<String> selectionArgs = new ArrayList<>();
-        limit = limit < 0 ? 0 : limit;
+        limit = Math.max(limit, 0);
 
         if (callType != CALL_TYPE_ALL) {
             // add a filter for call type
-            where.append(String.format("(%s = ?)", CallLog.Calls.TYPE));
+            where.append("(" + CallLog.Calls.TYPE + " = ?)");
             selectionArgs.add(Integer.toString(callType));
+            where.append(" AND ");
         }
+        where.append("(" + CallLog.Calls.PHONE_ACCOUNT_ID + " = ?)");
+        selectionArgs.add(accountName);
+
         String selection = where.length() > 0 ? where.toString() : null;
 
         Uri uri = CallLog.Calls.CONTENT_URI.buildUpon()
diff --git a/src/com/android/car/dialer/ui/calllog/CallHistoryViewModel.java b/src/com/android/car/dialer/ui/calllog/CallHistoryViewModel.java
index d92da88..8e84f22 100644
--- a/src/com/android/car/dialer/ui/calllog/CallHistoryViewModel.java
+++ b/src/com/android/car/dialer/ui/calllog/CallHistoryViewModel.java
@@ -17,18 +17,23 @@
 package com.android.car.dialer.ui.calllog;
 
 import android.app.Application;
+import android.content.Context;
 import android.text.format.DateUtils;
 
 import androidx.annotation.NonNull;
 import androidx.lifecycle.AndroidViewModel;
 import androidx.lifecycle.LiveData;
+import androidx.lifecycle.MutableLiveData;
+import androidx.lifecycle.Transformations;
 
 import com.android.car.arch.common.FutureData;
 import com.android.car.arch.common.LiveDataFunctions;
+import com.android.car.dialer.bluetooth.UiBluetoothMonitor;
 import com.android.car.dialer.livedata.CallHistoryLiveData;
 import com.android.car.dialer.livedata.HeartBeatLiveData;
 import com.android.car.dialer.ui.common.UiCallLogLiveData;
 import com.android.car.telephony.common.InMemoryPhoneBook;
+import com.android.car.telephony.common.PhoneCallLog;
 
 import java.util.List;
 
@@ -41,7 +46,7 @@
         super(application);
         mUiCallLogLiveData = new UiCallLogLiveData(application.getApplicationContext(),
                 new HeartBeatLiveData(DateUtils.MINUTE_IN_MILLIS),
-                CallHistoryLiveData.newInstance(application.getApplicationContext()),
+                getFirstHfpDeviceCallLog(application.getApplicationContext()),
                 InMemoryPhoneBook.get().getContactsLiveData());
 
         mUiCallLogFutureData = LiveDataFunctions.loadingSwitchMap(mUiCallLogLiveData,
@@ -52,4 +57,11 @@
     public LiveData<FutureData<List<Object>>> getCallHistory() {
         return mUiCallLogFutureData;
     }
+
+    private LiveData<List<PhoneCallLog>> getFirstHfpDeviceCallLog(Context context) {
+        return Transformations.switchMap(
+                UiBluetoothMonitor.get().getFirstHfpConnectedDevice(), (device) -> device != null
+                        ? CallHistoryLiveData.newInstance(context, device.getAddress())
+                        : new MutableLiveData<>());
+    }
 }
diff --git a/src/com/android/car/dialer/ui/common/ContactResultsLiveData.java b/src/com/android/car/dialer/ui/common/ContactResultsLiveData.java
index 4f82d7f..cf2855f 100644
--- a/src/com/android/car/dialer/ui/common/ContactResultsLiveData.java
+++ b/src/com/android/car/dialer/ui/common/ContactResultsLiveData.java
@@ -26,7 +26,10 @@
 import androidx.annotation.Nullable;
 import androidx.lifecycle.LiveData;
 import androidx.lifecycle.MediatorLiveData;
+import androidx.lifecycle.MutableLiveData;
+import androidx.lifecycle.Transformations;
 
+import com.android.car.dialer.bluetooth.UiBluetoothMonitor;
 import com.android.car.dialer.livedata.SharedPreferencesLiveData;
 import com.android.car.dialer.ui.common.entity.ContactSortingInfo;
 import com.android.car.telephony.common.Contact;
@@ -74,7 +77,11 @@
         mObservableAsyncQuery = new ObservableAsyncQuery(mSearchQueryParamProvider,
                 context.getContentResolver(), this::onQueryFinished);
 
-        mContactListLiveData = InMemoryPhoneBook.get().getContactsLiveData();
+        mContactListLiveData = Transformations.switchMap(
+                UiBluetoothMonitor.get().getFirstHfpConnectedDevice(), (device) -> device != null
+                        ? InMemoryPhoneBook.get()
+                            .getContactsLiveDataByAccount(device.getAddress())
+                        : new MutableLiveData<>());
         addSource(mContactListLiveData, this::onContactsChange);
         mSearchQueryLiveData = searchQueryLiveData;
         addSource(mSearchQueryLiveData, this::onSearchQueryChanged);
diff --git a/src/com/android/car/dialer/ui/common/UiCallLogLiveData.java b/src/com/android/car/dialer/ui/common/UiCallLogLiveData.java
index 1c48f1a..556de4c 100644
--- a/src/com/android/car/dialer/ui/common/UiCallLogLiveData.java
+++ b/src/com/android/car/dialer/ui/common/UiCallLogLiveData.java
@@ -31,7 +31,6 @@
 import androidx.lifecycle.MediatorLiveData;
 
 import com.android.car.dialer.R;
-import com.android.car.dialer.livedata.CallHistoryLiveData;
 import com.android.car.dialer.livedata.HeartBeatLiveData;
 import com.android.car.dialer.log.L;
 import com.android.car.dialer.ui.common.entity.UiCallLog;
@@ -67,7 +66,7 @@
 
     public UiCallLogLiveData(Context context,
             HeartBeatLiveData heartBeatLiveData,
-            CallHistoryLiveData callHistoryLiveData,
+            LiveData<List<PhoneCallLog>> callHistoryLiveData,
             LiveData<List<Contact>> contactListLiveData) {
         mContext = context;
         mExecutorService = Executors.newSingleThreadExecutor();
@@ -184,10 +183,9 @@
                             int typeColumn = cursor.getColumnIndex(PhoneLookup.TYPE);
                             int labelColumn = cursor.getColumnIndex(PhoneLookup.LABEL);
 
-                            List<Contact> lookupResults =
-                                    InMemoryPhoneBook.get().lookupContactByKey(
-                                            cursor.getString(lookupKeyColIdx));
-                            contact = lookupResults.size() > 0 ? lookupResults.get(0) : null;
+                            contact = inMemoryPhoneBook.lookupContactByKey(
+                                    cursor.getString(lookupKeyColIdx),
+                                    phoneCallLog.getAccountName());
                             int type = cursor.getInt(typeColumn);
                             String label = cursor.getString(labelColumn);
                             typeLabel = ContactsContract.CommonDataKinds.Phone.getTypeLabel(
diff --git a/src/com/android/car/dialer/ui/contact/ContactListViewModel.java b/src/com/android/car/dialer/ui/contact/ContactListViewModel.java
index 9ff50ef..8157ac2 100644
--- a/src/com/android/car/dialer/ui/contact/ContactListViewModel.java
+++ b/src/com/android/car/dialer/ui/contact/ContactListViewModel.java
@@ -24,10 +24,13 @@
 import androidx.lifecycle.AndroidViewModel;
 import androidx.lifecycle.LiveData;
 import androidx.lifecycle.MediatorLiveData;
+import androidx.lifecycle.MutableLiveData;
+import androidx.lifecycle.Transformations;
 
 import com.android.car.arch.common.FutureData;
 import com.android.car.arch.common.LiveDataFunctions;
 import com.android.car.dialer.R;
+import com.android.car.dialer.bluetooth.UiBluetoothMonitor;
 import com.android.car.dialer.livedata.SharedPreferencesLiveData;
 import com.android.car.dialer.ui.common.entity.ContactSortingInfo;
 import com.android.car.telephony.common.Contact;
@@ -54,7 +57,10 @@
 
         SharedPreferencesLiveData preferencesLiveData =
                 new SharedPreferencesLiveData(mContext, R.string.sort_order_key);
-        LiveData<List<Contact>> contactListLiveData = InMemoryPhoneBook.get().getContactsLiveData();
+        LiveData<List<Contact>> contactListLiveData = Transformations.switchMap(
+                UiBluetoothMonitor.get().getFirstHfpConnectedDevice(), (device) -> device != null
+                        ? InMemoryPhoneBook.get().getContactsLiveDataByAccount(device.getAddress())
+                        : new MutableLiveData<>());
         mSortedContactListLiveData = new SortedContactListLiveData(
                 mContext, contactListLiveData, preferencesLiveData);
         mContactList = LiveDataFunctions.loadingSwitchMap(mSortedContactListLiveData,
diff --git a/src/com/android/car/dialer/ui/settings/DialerSettingsViewModel.java b/src/com/android/car/dialer/ui/settings/DialerSettingsViewModel.java
index eb3dad8..13f2f8b 100644
--- a/src/com/android/car/dialer/ui/settings/DialerSettingsViewModel.java
+++ b/src/com/android/car/dialer/ui/settings/DialerSettingsViewModel.java
@@ -17,24 +17,25 @@
 package com.android.car.dialer.ui.settings;
 
 import android.app.Application;
+import android.bluetooth.BluetoothDevice;
 
 import androidx.annotation.NonNull;
 import androidx.lifecycle.AndroidViewModel;
 import androidx.lifecycle.LiveData;
 import androidx.lifecycle.Transformations;
 
-import com.android.car.dialer.livedata.HfpDeviceListLiveData;
+import com.android.car.dialer.bluetooth.UiBluetoothMonitor;
 
 /**
  * ViewModel for {@link DialerSettingsFragment}
  */
 public class DialerSettingsViewModel extends AndroidViewModel {
     private static final String EMPTY_STRING = "";
-    private final HfpDeviceListLiveData mHfpDeviceListLiveData;
+    private final LiveData<BluetoothDevice> mFirstHfpDeviceLiveData;
 
     public DialerSettingsViewModel(@NonNull Application application) {
         super(application);
-        mHfpDeviceListLiveData = new HfpDeviceListLiveData(application.getApplicationContext());
+        mFirstHfpDeviceLiveData = UiBluetoothMonitor.get().getFirstHfpConnectedDevice();
     }
 
     /**
@@ -42,9 +43,7 @@
      * device connected.
      */
     public LiveData<String> getFirstHfpConnectedDeviceName() {
-        return Transformations.map(mHfpDeviceListLiveData, (devices) ->
-                devices != null && !devices.isEmpty()
-                        ? devices.get(0).getName()
-                        : EMPTY_STRING);
+        return Transformations.map(mFirstHfpDeviceLiveData, (device) ->
+                device != null ? device.getName() : EMPTY_STRING);
     }
 }