blob: 85c226635331381e0f2203c064b3ef41398cefed [file] [log] [blame]
/*
* Copyright 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.bluetooth.btservice.storage;
import android.bluetooth.BluetoothA2dp;
import android.bluetooth.BluetoothA2dp.OptionalCodecsPreferenceStatus;
import android.bluetooth.BluetoothA2dp.OptionalCodecsSupportStatus;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothProfile;
import androidx.annotation.NonNull;
import androidx.room.Embedded;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
import java.util.ArrayList;
import java.util.List;
@Entity(tableName = "metadata")
class Metadata {
@PrimaryKey
@NonNull
private String address;
public boolean migrated;
@Embedded
public ProfilePrioritiesEntity profileConnectionPolicies;
@Embedded
@NonNull
public CustomizedMetadataEntity publicMetadata;
public @OptionalCodecsSupportStatus int a2dpSupportsOptionalCodecs;
public @OptionalCodecsPreferenceStatus int a2dpOptionalCodecsEnabled;
public long last_active_time;
public boolean is_active_a2dp_device;
Metadata(String address) {
this.address = address;
migrated = false;
profileConnectionPolicies = new ProfilePrioritiesEntity();
publicMetadata = new CustomizedMetadataEntity();
a2dpSupportsOptionalCodecs = BluetoothA2dp.OPTIONAL_CODECS_SUPPORT_UNKNOWN;
a2dpOptionalCodecsEnabled = BluetoothA2dp.OPTIONAL_CODECS_PREF_UNKNOWN;
last_active_time = MetadataDatabase.sCurrentConnectionNumber++;
is_active_a2dp_device = true;
}
String getAddress() {
return address;
}
void setProfileConnectionPolicy(int profile, int connectionPolicy) {
// We no longer support BluetoothProfile.PRIORITY_AUTO_CONNECT and are merging it into
// BluetoothProfile.CONNECTION_POLICY_ALLOWED
if (connectionPolicy > BluetoothProfile.CONNECTION_POLICY_ALLOWED) {
connectionPolicy = BluetoothProfile.CONNECTION_POLICY_ALLOWED;
}
switch (profile) {
case BluetoothProfile.A2DP:
profileConnectionPolicies.a2dp_connection_policy = connectionPolicy;
break;
case BluetoothProfile.A2DP_SINK:
profileConnectionPolicies.a2dp_sink_connection_policy = connectionPolicy;
break;
case BluetoothProfile.HEADSET:
profileConnectionPolicies.hfp_connection_policy = connectionPolicy;
break;
case BluetoothProfile.HEADSET_CLIENT:
profileConnectionPolicies.hfp_client_connection_policy = connectionPolicy;
break;
case BluetoothProfile.HID_HOST:
profileConnectionPolicies.hid_host_connection_policy = connectionPolicy;
break;
case BluetoothProfile.PAN:
profileConnectionPolicies.pan_connection_policy = connectionPolicy;
break;
case BluetoothProfile.PBAP:
profileConnectionPolicies.pbap_connection_policy = connectionPolicy;
break;
case BluetoothProfile.PBAP_CLIENT:
profileConnectionPolicies.pbap_client_connection_policy = connectionPolicy;
break;
case BluetoothProfile.MAP:
profileConnectionPolicies.map_connection_policy = connectionPolicy;
break;
case BluetoothProfile.MAP_CLIENT:
profileConnectionPolicies.map_client_connection_policy = connectionPolicy;
break;
case BluetoothProfile.SAP:
profileConnectionPolicies.sap_connection_policy = connectionPolicy;
break;
case BluetoothProfile.HEARING_AID:
profileConnectionPolicies.hearing_aid_connection_policy = connectionPolicy;
break;
case BluetoothProfile.LE_AUDIO:
profileConnectionPolicies.le_audio_connection_policy = connectionPolicy;
break;
default:
throw new IllegalArgumentException("invalid profile " + profile);
}
}
int getProfileConnectionPolicy(int profile) {
switch (profile) {
case BluetoothProfile.A2DP:
return profileConnectionPolicies.a2dp_connection_policy;
case BluetoothProfile.A2DP_SINK:
return profileConnectionPolicies.a2dp_sink_connection_policy;
case BluetoothProfile.HEADSET:
return profileConnectionPolicies.hfp_connection_policy;
case BluetoothProfile.HEADSET_CLIENT:
return profileConnectionPolicies.hfp_client_connection_policy;
case BluetoothProfile.HID_HOST:
return profileConnectionPolicies.hid_host_connection_policy;
case BluetoothProfile.PAN:
return profileConnectionPolicies.pan_connection_policy;
case BluetoothProfile.PBAP:
return profileConnectionPolicies.pbap_connection_policy;
case BluetoothProfile.PBAP_CLIENT:
return profileConnectionPolicies.pbap_client_connection_policy;
case BluetoothProfile.MAP:
return profileConnectionPolicies.map_connection_policy;
case BluetoothProfile.MAP_CLIENT:
return profileConnectionPolicies.map_client_connection_policy;
case BluetoothProfile.SAP:
return profileConnectionPolicies.sap_connection_policy;
case BluetoothProfile.HEARING_AID:
return profileConnectionPolicies.hearing_aid_connection_policy;
case BluetoothProfile.LE_AUDIO:
return profileConnectionPolicies.le_audio_connection_policy;
}
return BluetoothProfile.CONNECTION_POLICY_UNKNOWN;
}
void setCustomizedMeta(int key, byte[] value) {
switch (key) {
case BluetoothDevice.METADATA_MANUFACTURER_NAME:
publicMetadata.manufacturer_name = value;
break;
case BluetoothDevice.METADATA_MODEL_NAME:
publicMetadata.model_name = value;
break;
case BluetoothDevice.METADATA_SOFTWARE_VERSION:
publicMetadata.software_version = value;
break;
case BluetoothDevice.METADATA_HARDWARE_VERSION:
publicMetadata.hardware_version = value;
break;
case BluetoothDevice.METADATA_COMPANION_APP:
publicMetadata.companion_app = value;
break;
case BluetoothDevice.METADATA_MAIN_ICON:
publicMetadata.main_icon = value;
break;
case BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET:
publicMetadata.is_untethered_headset = value;
break;
case BluetoothDevice.METADATA_UNTETHERED_LEFT_ICON:
publicMetadata.untethered_left_icon = value;
break;
case BluetoothDevice.METADATA_UNTETHERED_RIGHT_ICON:
publicMetadata.untethered_right_icon = value;
break;
case BluetoothDevice.METADATA_UNTETHERED_CASE_ICON:
publicMetadata.untethered_case_icon = value;
break;
case BluetoothDevice.METADATA_UNTETHERED_LEFT_BATTERY:
publicMetadata.untethered_left_battery = value;
break;
case BluetoothDevice.METADATA_UNTETHERED_RIGHT_BATTERY:
publicMetadata.untethered_right_battery = value;
break;
case BluetoothDevice.METADATA_UNTETHERED_CASE_BATTERY:
publicMetadata.untethered_case_battery = value;
break;
case BluetoothDevice.METADATA_UNTETHERED_LEFT_CHARGING:
publicMetadata.untethered_left_charging = value;
break;
case BluetoothDevice.METADATA_UNTETHERED_RIGHT_CHARGING:
publicMetadata.untethered_right_charging = value;
break;
case BluetoothDevice.METADATA_UNTETHERED_CASE_CHARGING:
publicMetadata.untethered_case_charging = value;
break;
case BluetoothDevice.METADATA_ENHANCED_SETTINGS_UI_URI:
publicMetadata.enhanced_settings_ui_uri = value;
break;
case BluetoothDevice.METADATA_DEVICE_TYPE:
publicMetadata.device_type = value;
break;
case BluetoothDevice.METADATA_MAIN_BATTERY:
publicMetadata.main_battery = value;
break;
case BluetoothDevice.METADATA_MAIN_CHARGING:
publicMetadata.main_charging = value;
break;
case BluetoothDevice.METADATA_MAIN_LOW_BATTERY_THRESHOLD:
publicMetadata.main_low_battery_threshold = value;
break;
case BluetoothDevice.METADATA_UNTETHERED_LEFT_LOW_BATTERY_THRESHOLD:
publicMetadata.untethered_left_low_battery_threshold = value;
break;
case BluetoothDevice.METADATA_UNTETHERED_RIGHT_LOW_BATTERY_THRESHOLD:
publicMetadata.untethered_right_low_battery_threshold = value;
break;
case BluetoothDevice.METADATA_UNTETHERED_CASE_LOW_BATTERY_THRESHOLD:
publicMetadata.untethered_case_low_battery_threshold = value;
break;
}
}
byte[] getCustomizedMeta(int key) {
byte[] value = null;
switch (key) {
case BluetoothDevice.METADATA_MANUFACTURER_NAME:
value = publicMetadata.manufacturer_name;
break;
case BluetoothDevice.METADATA_MODEL_NAME:
value = publicMetadata.model_name;
break;
case BluetoothDevice.METADATA_SOFTWARE_VERSION:
value = publicMetadata.software_version;
break;
case BluetoothDevice.METADATA_HARDWARE_VERSION:
value = publicMetadata.hardware_version;
break;
case BluetoothDevice.METADATA_COMPANION_APP:
value = publicMetadata.companion_app;
break;
case BluetoothDevice.METADATA_MAIN_ICON:
value = publicMetadata.main_icon;
break;
case BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET:
value = publicMetadata.is_untethered_headset;
break;
case BluetoothDevice.METADATA_UNTETHERED_LEFT_ICON:
value = publicMetadata.untethered_left_icon;
break;
case BluetoothDevice.METADATA_UNTETHERED_RIGHT_ICON:
value = publicMetadata.untethered_right_icon;
break;
case BluetoothDevice.METADATA_UNTETHERED_CASE_ICON:
value = publicMetadata.untethered_case_icon;
break;
case BluetoothDevice.METADATA_UNTETHERED_LEFT_BATTERY:
value = publicMetadata.untethered_left_battery;
break;
case BluetoothDevice.METADATA_UNTETHERED_RIGHT_BATTERY:
value = publicMetadata.untethered_right_battery;
break;
case BluetoothDevice.METADATA_UNTETHERED_CASE_BATTERY:
value = publicMetadata.untethered_case_battery;
break;
case BluetoothDevice.METADATA_UNTETHERED_LEFT_CHARGING:
value = publicMetadata.untethered_left_charging;
break;
case BluetoothDevice.METADATA_UNTETHERED_RIGHT_CHARGING:
value = publicMetadata.untethered_right_charging;
break;
case BluetoothDevice.METADATA_UNTETHERED_CASE_CHARGING:
value = publicMetadata.untethered_case_charging;
break;
case BluetoothDevice.METADATA_ENHANCED_SETTINGS_UI_URI:
value = publicMetadata.enhanced_settings_ui_uri;
break;
case BluetoothDevice.METADATA_DEVICE_TYPE:
value = publicMetadata.device_type;
break;
case BluetoothDevice.METADATA_MAIN_BATTERY:
value = publicMetadata.main_battery;
break;
case BluetoothDevice.METADATA_MAIN_CHARGING:
value = publicMetadata.main_charging;
break;
case BluetoothDevice.METADATA_MAIN_LOW_BATTERY_THRESHOLD:
value = publicMetadata.main_low_battery_threshold;
break;
case BluetoothDevice.METADATA_UNTETHERED_LEFT_LOW_BATTERY_THRESHOLD:
value = publicMetadata.untethered_left_low_battery_threshold;
break;
case BluetoothDevice.METADATA_UNTETHERED_RIGHT_LOW_BATTERY_THRESHOLD:
value = publicMetadata.untethered_right_low_battery_threshold;
break;
case BluetoothDevice.METADATA_UNTETHERED_CASE_LOW_BATTERY_THRESHOLD:
value = publicMetadata.untethered_case_low_battery_threshold;
break;
}
return value;
}
List<Integer> getChangedCustomizedMeta() {
List<Integer> list = new ArrayList<>();
for (int key = 0; key <= BluetoothDevice.getMaxMetadataKey(); key++) {
if (getCustomizedMeta(key) != null) {
list.add(key);
}
}
return list;
}
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append(address)
.append(" {profile connection policy(")
.append(profileConnectionPolicies)
.append("), optional codec(support=")
.append(a2dpSupportsOptionalCodecs)
.append("|enabled=")
.append(a2dpOptionalCodecsEnabled)
.append("), custom metadata(")
.append(publicMetadata)
.append(")}");
return builder.toString();
}
}