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);
}
}