DO NOT MERGE Enhance AVRCP Absolute Volume control implementation am: 1a1169dcb2 -s ours am: 68d4713d8a
am: 65284fb3d9 -s ours
* commit '65284fb3d9310f17ba6dff5c0cb07ead318c90d2':
DO NOT MERGE Enhance AVRCP Absolute Volume control implementation
diff --git a/Android.mk b/Android.mk
index 7b724d0..65f08b6 100644
--- a/Android.mk
+++ b/Android.mk
@@ -15,14 +15,16 @@
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := \
- $(call all-java-files-under, src)
+ $(call all-java-files-under, src) \
+ $(call all-proto-files-under, src)
LOCAL_PACKAGE_NAME := Bluetooth
LOCAL_CERTIFICATE := platform
LOCAL_JNI_SHARED_LIBRARIES := libbluetooth_jni
-LOCAL_JAVA_LIBRARIES := javax.obex telephony-common libprotobuf-java-micro
-LOCAL_STATIC_JAVA_LIBRARIES := com.android.vcard bluetooth.mapsapi sap-api-java-static android-support-v4
+LOCAL_JAVA_LIBRARIES := javax.obex telephony-common libprotobuf-java-micro services.net
+LOCAL_STATIC_JAVA_LIBRARIES := com.android.vcard bluetooth.mapsapi sap-api-java-static android-support-v4 services.net
+LOCAL_PROTOC_OPTIMIZE_TYPE := micro
LOCAL_REQUIRED_MODULES := bluetooth.default
LOCAL_MULTILIB := 32
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 3652fd3..04647a0 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -25,6 +25,7 @@
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" />
<uses-permission android:name="android.permission.BLUETOOTH_MAP" />
+ <uses-permission android:name="android.permission.DUMP" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
@@ -44,6 +45,7 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" />
+ <uses-permission android:name="android.permission.TETHER_PRIVILEGED" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
<uses-permission android:name="android.permission.BLUETOOTH_STACK" />
@@ -62,6 +64,8 @@
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.DEVICE_POWER" />
<uses-permission android:name="android.permission.REAL_GET_TASKS" />
+ <uses-permission android:name="android.permission.MODIFY_AUDIO_ROUTING" />
+ <uses-permission android:name="android.permission.UPDATE_DEVICE_STATS" />
<!-- For PBAP Owner Vcard Info -->
<uses-permission android:name="android.permission.READ_PROFILE"/>
@@ -133,7 +137,7 @@
</receiver>
<activity android:name=".opp.BluetoothOppLauncherActivity"
android:process="@string/process"
- android:theme="@android:style/Theme.Material.Light.Dialog"
+ android:theme="@*android:style/Theme.Material.DayNight.Dialog"
android:label="@string/bt_share_picker_label"
android:enabled="@bool/profile_supported_opp">
<intent-filter>
@@ -173,30 +177,30 @@
<activity android:name=".opp.BluetoothOppBtEnableActivity"
android:process="@string/process"
android:excludeFromRecents="true"
- android:theme="@android:style/Theme.Material.Light.Dialog.Alert"
+ android:theme="@*android:style/Theme.Material.DayNight.Dialog.Alert"
android:enabled="@bool/profile_supported_opp">
</activity>
<activity android:name=".opp.BluetoothOppBtErrorActivity"
android:process="@string/process"
android:excludeFromRecents="true"
- android:theme="@android:style/Theme.Material.Light.Dialog.Alert">
+ android:theme="@*android:style/Theme.Material.DayNight.Dialog.Alert">
</activity>
<activity android:name=".opp.BluetoothOppBtEnablingActivity"
android:process="@string/process"
android:excludeFromRecents="true"
- android:theme="@android:style/Theme.Material.Light.Dialog.Alert"
+ android:theme="@*android:style/Theme.Material.DayNight.Dialog.Alert"
android:enabled="@bool/profile_supported_opp">
</activity>
<activity android:name=".opp.BluetoothOppIncomingFileConfirmActivity"
android:process="@string/process"
android:excludeFromRecents="true"
- android:theme="@android:style/Theme.Material.Light.Dialog.Alert"
+ android:theme="@*android:style/Theme.Material.DayNight.Dialog.Alert"
android:enabled="@bool/profile_supported_opp">
</activity>
<activity android:name=".opp.BluetoothOppTransferActivity"
android:process="@string/process"
android:excludeFromRecents="true"
- android:theme="@android:style/Theme.Material.Light.Dialog.Alert"
+ android:theme="@*android:style/Theme.Material.DayNight.Dialog.Alert"
android:enabled="@bool/profile_supported_opp">
</activity>
<activity android:name=".opp.BluetoothOppTransferHistory"
@@ -209,7 +213,7 @@
<activity android:name=".pbap.BluetoothPbapActivity"
android:process="@string/process"
android:excludeFromRecents="true"
- android:theme="@android:style/Theme.Material.Light.Dialog.Alert"
+ android:theme="@*android:style/Theme.Material.DayNight.Dialog.Alert"
android:enabled="@bool/profile_supported_pbap">
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
diff --git a/AndroidManifest_test.xml b/AndroidManifest_test.xml
index ae21b88..8529ba5 100644
--- a/AndroidManifest_test.xml
+++ b/AndroidManifest_test.xml
@@ -46,7 +46,7 @@
</receiver>
<activity android:name=".opp.BluetoothOppLauncherActivity"
android:process="@string/process"
- android:theme="@android:style/Theme.Material.Light.Dialog"
+ android:theme="@*android:style/Theme.Material.DayNight.Dialog"
android:label="@string/bt_share_picker_label">
<intent-filter>
<action android:name="android.intent.action.SEND" />
@@ -76,7 +76,7 @@
</activity>
<activity android:name=".opp.BluetoothOppBtEnablingActivity"
android:process="@string/process"
- android:theme="@android:style/Theme.Material.Light.Dialog">
+ android:theme="@*android:style/Theme.Material.DayNight.Dialog">
</activity>
<activity android:name=".opp.BluetoothOppIncomingFileConfirmActivity"
android:process="@string/process">
@@ -87,7 +87,7 @@
<activity android:name=".pbap.BluetoothPbapActivity"
android:process="@string/process"
android:label=" "
- android:theme="@android:style/Theme.Material.Light.Dialog.Alert">
+ android:theme="@*android:style/Theme.Material.DayNight.Dialog.Alert">
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
diff --git a/jni/com_android_bluetooth_a2dp_sink.cpp b/jni/com_android_bluetooth_a2dp_sink.cpp
index f2bbb1b..1033e83 100644
--- a/jni/com_android_bluetooth_a2dp_sink.cpp
+++ b/jni/com_android_bluetooth_a2dp_sink.cpp
@@ -29,6 +29,7 @@
static jmethodID method_onConnectionStateChanged;
static jmethodID method_onAudioStateChanged;
static jmethodID method_onAudioConfigChanged;
+static jmethodID method_onAudioFocusRequested;
static const btav_interface_t *sBluetoothA2dpInterface = NULL;
static jobject mCallbacksObj = NULL;
@@ -116,11 +117,34 @@
sCallbackEnv->DeleteLocalRef(addr);
}
+static void bta2dp_audio_focus_request_callback(bt_bdaddr_t *bd_addr) {
+ jbyteArray addr;
+
+ ALOGI("%s", __FUNCTION__);
+
+ if (!checkCallbackThread()) { \
+ ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); \
+ return; \
+ }
+ addr = sCallbackEnv->NewByteArray(sizeof(bt_bdaddr_t));
+ if (!addr) {
+ ALOGE("Fail to new jbyteArray bd addr for connection state");
+ checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
+ return;
+ }
+
+ sCallbackEnv->SetByteArrayRegion(addr, 0, sizeof(bt_bdaddr_t), (jbyte*) bd_addr);
+ sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onAudioFocusRequested, addr);
+ checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
+ sCallbackEnv->DeleteLocalRef(addr);
+}
+
static btav_callbacks_t sBluetoothA2dpCallbacks = {
sizeof(sBluetoothA2dpCallbacks),
bta2dp_connection_state_callback,
bta2dp_audio_state_callback,
- bta2dp_audio_config_callback
+ bta2dp_audio_config_callback,
+ bta2dp_audio_focus_request_callback
};
static void classInitNative(JNIEnv* env, jclass clazz) {
@@ -137,6 +161,9 @@
method_onAudioConfigChanged =
env->GetMethodID(clazz, "onAudioConfigChanged", "([BII)V");
+ method_onAudioFocusRequested =
+ env->GetMethodID(clazz, "onAudioFocusRequested", "([B)V");
+
ALOGI("%s: succeeds", __FUNCTION__);
}
@@ -237,12 +264,19 @@
return (status == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE;
}
+static void informAudioFocusStateNative(JNIEnv *env, jobject object, jint focus_state) {
+ if (!sBluetoothA2dpInterface) return;
+
+ sBluetoothA2dpInterface->audio_focus_state((uint8_t)focus_state);
+
+}
static JNINativeMethod sMethods[] = {
{"classInitNative", "()V", (void *) classInitNative},
{"initNative", "()V", (void *) initNative},
{"cleanupNative", "()V", (void *) cleanupNative},
{"connectA2dpNative", "([B)Z", (void *) connectA2dpNative},
{"disconnectA2dpNative", "([B)Z", (void *) disconnectA2dpNative},
+ {"informAudioFocusStateNative", "(I)V", (void *) informAudioFocusStateNative},
};
int register_com_android_bluetooth_a2dp_sink(JNIEnv* env)
diff --git a/jni/com_android_bluetooth_avrcp_controller.cpp b/jni/com_android_bluetooth_avrcp_controller.cpp
index 9e32721..2c07a57 100644
--- a/jni/com_android_bluetooth_avrcp_controller.cpp
+++ b/jni/com_android_bluetooth_avrcp_controller.cpp
@@ -28,6 +28,17 @@
namespace android {
static jmethodID method_handlePassthroughRsp;
static jmethodID method_onConnectionStateChanged;
+static jmethodID method_getRcFeatures;
+static jmethodID method_setplayerappsettingrsp;
+static jmethodID method_handleplayerappsetting;
+static jmethodID method_handleplayerappsettingchanged;
+static jmethodID method_handleSetAbsVolume;
+static jmethodID method_handleRegisterNotificationAbsVol;
+static jmethodID method_handletrackchanged;
+static jmethodID method_handleplaypositionchanged;
+static jmethodID method_handleplaystatuschanged;
+static jmethodID method_handleGroupNavigationRsp;
+
static const btrc_ctrl_interface_t *sBluetoothAvrcpInterface = NULL;
static jobject mCallbacksObj = NULL;
@@ -59,6 +70,19 @@
checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
}
+static void btavrcp_groupnavigation_response_callback(int id, int pressed) {
+ ALOGI("%s", __FUNCTION__);
+
+ if (!checkCallbackThread()) {
+ ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__);
+ return;
+ }
+
+ sCallbackEnv->CallVoidMethod(mCallbacksObj, method_handleGroupNavigationRsp, (jint)id,
+ (jint)pressed);
+ checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
+}
+
static void btavrcp_connection_state_callback(bool state, bt_bdaddr_t* bd_addr) {
jbyteArray addr;
@@ -84,20 +108,361 @@
sCallbackEnv->DeleteLocalRef(addr);
}
+static void btavrcp_get_rcfeatures_callback(bt_bdaddr_t *bd_addr, int features) {
+ jbyteArray addr;
+
+ ALOGI("%s", __FUNCTION__);
+
+ if (!checkCallbackThread()) { \
+ ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); \
+ return; \
+ }
+
+ addr = sCallbackEnv->NewByteArray(sizeof(bt_bdaddr_t));
+ if (!addr) {
+ ALOGE("Fail to new jbyteArray bd addr ");
+ checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
+ return;
+ }
+
+ sCallbackEnv->SetByteArrayRegion(addr, 0, sizeof(bt_bdaddr_t), (jbyte*) bd_addr);
+ sCallbackEnv->CallVoidMethod(mCallbacksObj, method_getRcFeatures, addr, (jint)features);
+ checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
+ sCallbackEnv->DeleteLocalRef(addr);
+}
+
+static void btavrcp_setplayerapplicationsetting_rsp_callback(bt_bdaddr_t *bd_addr,
+ uint8_t accepted) {
+ jbyteArray addr;
+
+ ALOGI("%s", __FUNCTION__);
+
+ if (!checkCallbackThread()) { \
+ ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); \
+ return; \
+ }
+
+ addr = sCallbackEnv->NewByteArray(sizeof(bt_bdaddr_t));
+ if (!addr) {
+ ALOGE("Fail to new jbyteArray bd addr ");
+ checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
+ return;
+ }
+
+ sCallbackEnv->SetByteArrayRegion(addr, 0, sizeof(bt_bdaddr_t), (jbyte*) bd_addr);
+ sCallbackEnv->CallVoidMethod(mCallbacksObj, method_setplayerappsettingrsp, addr, (jint)accepted);
+ checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
+ sCallbackEnv->DeleteLocalRef(addr);
+}
+
+static void btavrcp_playerapplicationsetting_callback(bt_bdaddr_t *bd_addr, uint8_t num_attr,
+ btrc_player_app_attr_t *app_attrs, uint8_t num_ext_attr,
+ btrc_player_app_ext_attr_t *ext_attrs) {
+ ALOGI("%s", __FUNCTION__);
+ jbyteArray addr;
+ jbyteArray playerattribs;
+ jint arraylen;
+ int i,k;
+
+ if (!checkCallbackThread()) { \
+ ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); \
+ return; \
+ }
+
+ addr = sCallbackEnv->NewByteArray(sizeof(bt_bdaddr_t));
+ if (!addr) {
+ ALOGE("Fail to new jbyteArray bd addr ");
+ checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
+ return;
+ }
+ sCallbackEnv->SetByteArrayRegion(addr, 0, sizeof(bt_bdaddr_t), (jbyte*)bd_addr);
+ /* TODO ext attrs
+ * Flattening defined attributes: <id,num_values,values[]>
+ */
+ arraylen = 0;
+ for (i = 0; i < num_attr; i++)
+ {
+ /*2 bytes for id and num */
+ arraylen += 2 + app_attrs[i].num_val;
+ }
+ ALOGI(" arraylen %d", arraylen);
+ playerattribs = sCallbackEnv->NewByteArray(arraylen);
+ if(!playerattribs)
+ {
+ ALOGE("Fail to new jbyteArray playerattribs ");
+ checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
+ sCallbackEnv->DeleteLocalRef(addr);
+ return;
+ }
+ k= 0;
+ for (i = 0; (i < num_attr)&&(k < arraylen); i++)
+ {
+ sCallbackEnv->SetByteArrayRegion(playerattribs, k, 1, (jbyte*)&(app_attrs[i].attr_id));
+ k++;
+ sCallbackEnv->SetByteArrayRegion(playerattribs, k, 1, (jbyte*)&(app_attrs[i].num_val));
+ k++;
+ sCallbackEnv->SetByteArrayRegion(playerattribs, k, app_attrs[i].num_val,
+ (jbyte*)(app_attrs[i].attr_val));
+ k = k + app_attrs[i].num_val;
+ }
+ sCallbackEnv->CallVoidMethod(mCallbacksObj, method_handleplayerappsetting, addr,
+ playerattribs, (jint)arraylen);
+ checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
+ sCallbackEnv->DeleteLocalRef(addr);
+ sCallbackEnv->DeleteLocalRef(playerattribs);
+}
+
+static void btavrcp_playerapplicationsetting_changed_callback(bt_bdaddr_t *bd_addr,
+ btrc_player_settings_t *p_vals) {
+
+ jbyteArray addr;
+ jbyteArray playerattribs;
+ int i, k, arraylen;
+ ALOGI("%s", __FUNCTION__);
+
+ if (!checkCallbackThread()) { \
+ ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); \
+ return; \
+ }
+
+ addr = sCallbackEnv->NewByteArray(sizeof(bt_bdaddr_t));
+ if ((!addr)) {
+ ALOGE("Fail to get new array ");
+ checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
+ return;
+ }
+ sCallbackEnv->SetByteArrayRegion(addr, 0, sizeof(bt_bdaddr_t), (jbyte*)bd_addr);
+ arraylen = p_vals->num_attr*2;
+ playerattribs = sCallbackEnv->NewByteArray(arraylen);
+ if(!playerattribs)
+ {
+ ALOGE("Fail to new jbyteArray playerattribs ");
+ checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
+ sCallbackEnv->DeleteLocalRef(addr);
+ return;
+ }
+ /*
+ * Flatening format: <id,val>
+ */
+ k = 0;
+ for (i = 0; (i < p_vals->num_attr)&&( k < arraylen);i++)
+ {
+ sCallbackEnv->SetByteArrayRegion(playerattribs, k, 1, (jbyte*)&(p_vals->attr_ids[i]));
+ k++;
+ sCallbackEnv->SetByteArrayRegion(playerattribs, k, 1, (jbyte*)&(p_vals->attr_values[i]));
+ k++;
+ }
+ sCallbackEnv->CallVoidMethod(mCallbacksObj, method_handleplayerappsettingchanged, addr,
+ playerattribs, (jint)arraylen);
+ checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
+ sCallbackEnv->DeleteLocalRef(addr);
+ sCallbackEnv->DeleteLocalRef(playerattribs);
+}
+
+static void btavrcp_set_abs_vol_cmd_callback(bt_bdaddr_t *bd_addr, uint8_t abs_vol,
+ uint8_t label) {
+
+ jbyteArray addr;
+ ALOGI("%s", __FUNCTION__);
+
+ if (!checkCallbackThread()) { \
+ ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); \
+ return; \
+ }
+
+ addr = sCallbackEnv->NewByteArray(sizeof(bt_bdaddr_t));
+ if ((!addr)) {
+ ALOGE("Fail to get new array ");
+ checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
+ return;
+ }
+
+ sCallbackEnv->SetByteArrayRegion(addr, 0, sizeof(bt_bdaddr_t), (jbyte*)bd_addr);
+ sCallbackEnv->CallVoidMethod(mCallbacksObj, method_handleSetAbsVolume, addr, (jbyte)abs_vol,
+ (jbyte)label);
+ checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
+ sCallbackEnv->DeleteLocalRef(addr);
+}
+
+static void btavrcp_register_notification_absvol_callback(bt_bdaddr_t *bd_addr, uint8_t label) {
+ jbyteArray addr;
+
+ ALOGI("%s", __FUNCTION__);
+
+ if (!checkCallbackThread()) { \
+ ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); \
+ return; \
+ }
+
+ addr = sCallbackEnv->NewByteArray(sizeof(bt_bdaddr_t));
+ if ((!addr)) {
+ ALOGE("Fail to get new array ");
+ checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
+ return;
+ }
+
+ sCallbackEnv->SetByteArrayRegion(addr, 0, sizeof(bt_bdaddr_t), (jbyte*)bd_addr);
+ sCallbackEnv->CallVoidMethod(mCallbacksObj, method_handleRegisterNotificationAbsVol, addr,
+ (jbyte)label);
+ checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
+ sCallbackEnv->DeleteLocalRef(addr);
+}
+
+static void btavrcp_track_changed_callback(bt_bdaddr_t *bd_addr, uint8_t num_attr,
+ btrc_element_attr_val_t *p_attrs) {
+ /*
+ * byteArray will be formatted like this: id,len,string
+ * Assuming text feild to be null terminated.
+ */
+ jbyteArray addr;
+ jintArray attribIds;
+ jobjectArray stringArray;
+ jstring str;
+ jclass strclazz;
+ jint i;
+ ALOGI("%s", __FUNCTION__);
+ if (!checkCallbackThread()) { \
+ ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); \
+ return; \
+ }
+
+ addr = sCallbackEnv->NewByteArray(sizeof(bt_bdaddr_t));
+ if ((!addr)) {
+ ALOGE("Fail to get new array ");
+ checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
+ return;
+ }
+ attribIds = sCallbackEnv->NewIntArray(num_attr);
+ if(!attribIds) {
+ ALOGE(" failed to set new array for attribIds");
+ checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
+ sCallbackEnv->DeleteLocalRef(addr);
+ return;
+ }
+ sCallbackEnv->SetByteArrayRegion(addr, 0, sizeof(bt_bdaddr_t), (jbyte*)bd_addr);
+
+ strclazz = sCallbackEnv->FindClass("java/lang/String");
+ stringArray = sCallbackEnv->NewObjectArray((jint)num_attr, strclazz, 0);
+ if(!stringArray) {
+ ALOGE(" failed to get String array");
+ checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
+ sCallbackEnv->DeleteLocalRef(addr);
+ sCallbackEnv->DeleteLocalRef(attribIds);
+ return;
+ }
+ for(i = 0; i < num_attr; i++)
+ {
+ str = sCallbackEnv->NewStringUTF((char*)(p_attrs[i].text));
+ if(!str) {
+ ALOGE(" Unable to get str ");
+ checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
+ sCallbackEnv->DeleteLocalRef(addr);
+ sCallbackEnv->DeleteLocalRef(attribIds);
+ sCallbackEnv->DeleteLocalRef(stringArray);
+ return;
+ }
+ sCallbackEnv->SetIntArrayRegion(attribIds, i, 1, (jint*)&(p_attrs[i].attr_id));
+ sCallbackEnv->SetObjectArrayElement(stringArray, i,str);
+ sCallbackEnv->DeleteLocalRef(str);
+ }
+
+ sCallbackEnv->CallVoidMethod(mCallbacksObj, method_handletrackchanged, addr,
+ (jbyte)(num_attr), attribIds, stringArray);
+ checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
+ sCallbackEnv->DeleteLocalRef(addr);
+ sCallbackEnv->DeleteLocalRef(attribIds);
+ /* TODO check do we need to delete str seperately or not */
+ sCallbackEnv->DeleteLocalRef(stringArray);
+ sCallbackEnv->DeleteLocalRef(strclazz);
+}
+
+static void btavrcp_play_position_changed_callback(bt_bdaddr_t *bd_addr, uint32_t song_len,
+ uint32_t song_pos) {
+
+ jbyteArray addr;
+ ALOGI("%s", __FUNCTION__);
+
+ addr = sCallbackEnv->NewByteArray(sizeof(bt_bdaddr_t));
+ if ((!addr)) {
+ ALOGE("Fail to get new array ");
+ checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
+ return;
+ }
+ sCallbackEnv->SetByteArrayRegion(addr, 0, sizeof(bt_bdaddr_t), (jbyte*) bd_addr);
+ sCallbackEnv->CallVoidMethod(mCallbacksObj, method_handleplaypositionchanged, addr,
+ (jint)(song_len), (jint)song_pos);
+ sCallbackEnv->DeleteLocalRef(addr);
+}
+
+static void btavrcp_play_status_changed_callback(bt_bdaddr_t *bd_addr,
+ btrc_play_status_t play_status) {
+ jbyteArray addr;
+ ALOGI("%s", __FUNCTION__);
+
+ addr = sCallbackEnv->NewByteArray(sizeof(bt_bdaddr_t));
+ if ((!addr)) {
+ ALOGE("Fail to get new array ");
+ checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
+ return;
+ }
+ sCallbackEnv->SetByteArrayRegion(addr, 0, sizeof(bt_bdaddr_t), (jbyte*) bd_addr);
+ sCallbackEnv->CallVoidMethod(mCallbacksObj, method_handleplaystatuschanged, addr,
+ (jbyte)play_status);
+ sCallbackEnv->DeleteLocalRef(addr);
+}
static btrc_ctrl_callbacks_t sBluetoothAvrcpCallbacks = {
sizeof(sBluetoothAvrcpCallbacks),
btavrcp_passthrough_response_callback,
- btavrcp_connection_state_callback
+ btavrcp_groupnavigation_response_callback,
+ btavrcp_connection_state_callback,
+ btavrcp_get_rcfeatures_callback,
+ btavrcp_setplayerapplicationsetting_rsp_callback,
+ btavrcp_playerapplicationsetting_callback,
+ btavrcp_playerapplicationsetting_changed_callback,
+ btavrcp_set_abs_vol_cmd_callback,
+ btavrcp_register_notification_absvol_callback,
+ btavrcp_track_changed_callback,
+ btavrcp_play_position_changed_callback,
+ btavrcp_play_status_changed_callback
};
static void classInitNative(JNIEnv* env, jclass clazz) {
method_handlePassthroughRsp =
env->GetMethodID(clazz, "handlePassthroughRsp", "(II)V");
+ method_handleGroupNavigationRsp =
+ env->GetMethodID(clazz, "handleGroupNavigationRsp", "(II)V");
+
method_onConnectionStateChanged =
env->GetMethodID(clazz, "onConnectionStateChanged", "(Z[B)V");
+ method_getRcFeatures =
+ env->GetMethodID(clazz, "getRcFeatures", "([BI)V");
+
+ method_setplayerappsettingrsp =
+ env->GetMethodID(clazz, "setPlayerAppSettingRsp", "([BB)V");
+
+ method_handleplayerappsetting =
+ env->GetMethodID(clazz, "handlePlayerAppSetting", "([B[BI)V");
+
+ method_handleplayerappsettingchanged =
+ env->GetMethodID(clazz, "onPlayerAppSettingChanged", "([B[BI)V");
+
+ method_handleSetAbsVolume =
+ env->GetMethodID(clazz, "handleSetAbsVolume", "([BBB)V");
+
+ method_handleRegisterNotificationAbsVol =
+ env->GetMethodID(clazz, "handleRegisterNotificationAbsVol", "([BB)V");
+
+ method_handletrackchanged =
+ env->GetMethodID(clazz, "onTrackChanged", "([BB[I[Ljava/lang/String;)V");
+
+ method_handleplaypositionchanged =
+ env->GetMethodID(clazz, "onPlayPositionChanged", "([BII)V");
+
+ method_handleplaystatuschanged =
+ env->GetMethodID(clazz, "onPlayStatusChanged", "([BB)V");
ALOGI("%s: succeeds", __FUNCTION__);
}
@@ -183,12 +548,140 @@
return (status == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE;
}
+static jboolean sendGroupNavigationCommandNative(JNIEnv *env, jobject object, jbyteArray address,
+ jint key_code, jint key_state) {
+ jbyte *addr;
+ bt_status_t status;
+
+ if (!sBluetoothAvrcpInterface) return JNI_FALSE;
+
+ ALOGI("%s: sBluetoothAvrcpInterface: %p", __FUNCTION__, sBluetoothAvrcpInterface);
+
+ ALOGI("key_code: %d, key_state: %d", key_code, key_state);
+
+ addr = env->GetByteArrayElements(address, NULL);
+ if (!addr) {
+ jniThrowIOException(env, EINVAL);
+ return JNI_FALSE;
+ }
+
+ if ((status = sBluetoothAvrcpInterface->send_group_navigation_cmd((bt_bdaddr_t *)addr,
+ (uint8_t)key_code, (uint8_t)key_state))!= BT_STATUS_SUCCESS) {
+ ALOGE("Failed sending Grp Navigation command, status: %d", status);
+ }
+ env->ReleaseByteArrayElements(address, addr, 0);
+
+ return (status == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE;
+}
+
+static void setPlayerApplicationSettingValuesNative(JNIEnv *env, jobject object, jbyteArray address,
+ jbyte num_attrib, jbyteArray attrib_ids,
+ jbyteArray attrib_val) {
+ bt_status_t status;
+ jbyte *addr;
+ uint8_t *pAttrs = NULL;
+ uint8_t *pAttrsVal = NULL;
+ int i;
+ jbyte *attr;
+ jbyte *attr_val;
+
+ if (!sBluetoothAvrcpInterface) return;
+
+ addr = env->GetByteArrayElements(address, NULL);
+ if (!addr) {
+ jniThrowIOException(env, EINVAL);
+ return;
+ }
+
+ pAttrs = new uint8_t[num_attrib];
+ pAttrsVal = new uint8_t[num_attrib];
+ if ((!pAttrs) ||(!pAttrsVal)) {
+ delete[] pAttrs;
+ ALOGE("setPlayerApplicationSettingValuesNative: not have enough memeory");
+ return;
+ }
+ attr = env->GetByteArrayElements(attrib_ids, NULL);
+ attr_val = env->GetByteArrayElements(attrib_val, NULL);
+ if ((!attr)||(!attr_val)) {
+ delete[] pAttrs;
+ delete[] pAttrsVal;
+ jniThrowIOException(env, EINVAL);
+ return;
+ }
+ for (i = 0; i < num_attrib; ++i) {
+ pAttrs[i] = (uint8_t)attr[i];
+ pAttrsVal[i] = (uint8_t)attr_val[i];
+ }
+ if (i < num_attrib) {
+ delete[] pAttrs;
+ delete[] pAttrsVal;
+ env->ReleaseByteArrayElements(attrib_ids, attr, 0);
+ env->ReleaseByteArrayElements(attrib_val, attr_val, 0);
+ return;
+ }
+
+ ALOGI("%s: sBluetoothAvrcpInterface: %p", __FUNCTION__, sBluetoothAvrcpInterface);
+ if ((status = sBluetoothAvrcpInterface->set_player_app_setting_cmd((bt_bdaddr_t *)addr,
+ (uint8_t)num_attrib, pAttrs, pAttrsVal))!= BT_STATUS_SUCCESS) {
+ ALOGE("Failed sending setPlAppSettValNative command, status: %d", status);
+ }
+ delete[] pAttrs;
+ delete[] pAttrsVal;
+ env->ReleaseByteArrayElements(attrib_ids, attr, 0);
+ env->ReleaseByteArrayElements(attrib_val, attr_val, 0);
+ env->ReleaseByteArrayElements(address, addr, 0);
+}
+
+static void sendAbsVolRspNative(JNIEnv *env, jobject object, jbyteArray address,
+ jint abs_vol, jint label) {
+ bt_status_t status;
+ jbyte *addr;
+
+ if (!sBluetoothAvrcpInterface) return;
+ addr = env->GetByteArrayElements(address, NULL);
+ if (!addr) {
+ jniThrowIOException(env, EINVAL);
+ return;
+ }
+
+ ALOGI("%s: sBluetoothAvrcpInterface: %p", __FUNCTION__, sBluetoothAvrcpInterface);
+ if ((status = sBluetoothAvrcpInterface->set_volume_rsp((bt_bdaddr_t *)addr,
+ (uint8_t)abs_vol, (uint8_t)label))!= BT_STATUS_SUCCESS) {
+ ALOGE("Failed sending sendAbsVolRspNative command, status: %d", status);
+ }
+ env->ReleaseByteArrayElements(address, addr, 0);
+}
+
+static void sendRegisterAbsVolRspNative(JNIEnv *env, jobject object, jbyteArray address,
+ jbyte rsp_type, jint abs_vol, jint label) {
+ bt_status_t status;
+ jbyte *addr;
+
+ if (!sBluetoothAvrcpInterface) return;
+ addr = env->GetByteArrayElements(address, NULL);
+ if (!addr) {
+ jniThrowIOException(env, EINVAL);
+ return;
+ }
+ ALOGI("%s: sBluetoothAvrcpInterface: %p", __FUNCTION__, sBluetoothAvrcpInterface);
+ if ((status = sBluetoothAvrcpInterface->register_abs_vol_rsp((bt_bdaddr_t *)addr,
+ (btrc_notification_type_t)rsp_type,(uint8_t)abs_vol, (uint8_t)label))
+ != BT_STATUS_SUCCESS) {
+ ALOGE("Failed sending sendRegisterAbsVolRspNative command, status: %d", status);
+ }
+ env->ReleaseByteArrayElements(address, addr, 0);
+}
+
static JNINativeMethod sMethods[] = {
{"classInitNative", "()V", (void *) classInitNative},
{"initNative", "()V", (void *) initNative},
{"cleanupNative", "()V", (void *) cleanupNative},
- {"sendPassThroughCommandNative", "([BII)Z",
- (void *) sendPassThroughCommandNative},
+ {"sendPassThroughCommandNative", "([BII)Z",(void *) sendPassThroughCommandNative},
+ {"sendGroupNavigationCommandNative", "([BII)Z",(void *) sendGroupNavigationCommandNative},
+ {"setPlayerApplicationSettingValuesNative", "([BB[B[B)V",
+ (void *) setPlayerApplicationSettingValuesNative},
+ {"sendAbsVolRspNative", "([BII)V",(void *) sendAbsVolRspNative},
+ {"sendRegisterAbsVolRspNative", "([BBII)V",(void *) sendRegisterAbsVolRspNative},
};
int register_com_android_bluetooth_avrcp_controller(JNIEnv* env)
diff --git a/jni/com_android_bluetooth_btservice_AdapterService.cpp b/jni/com_android_bluetooth_btservice_AdapterService.cpp
index 9223157..e5cdd3f 100755
--- a/jni/com_android_bluetooth_btservice_AdapterService.cpp
+++ b/jni/com_android_bluetooth_btservice_AdapterService.cpp
@@ -31,6 +31,8 @@
namespace android {
+#define OOB_TK_SIZE 16
+
#define ADDITIONAL_NREFS 50
static jmethodID method_stateChangeCallback;
static jmethodID method_adapterPropertyChangedCallback;
@@ -46,6 +48,11 @@
static jmethodID method_releaseWakeLock;
static jmethodID method_energyInfo;
+static struct {
+ jclass clazz;
+ jmethodID constructor;
+} android_bluetooth_UidTraffic;
+
static const bt_interface_t *sBluetoothInterface = NULL;
static const btsock_interface_t *sBluetoothSocketInterface = NULL;
static JNIEnv *callbackEnv = NULL;
@@ -447,18 +454,36 @@
ALOGV("%s: status:%d packet_count:%d ", __FUNCTION__, status, packet_count);
}
-static void energy_info_recv_callback(bt_activity_energy_info *p_energy_info)
+static void energy_info_recv_callback(bt_activity_energy_info *p_energy_info,
+ bt_uid_traffic_t* uid_data)
{
if (!checkCallbackThread()) {
ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__);
return;
}
+ jsize len = 0;
+ for (bt_uid_traffic_t* data = uid_data; data->app_uid != -1; data++) {
+ len++;
+ }
+
+ jobjectArray array = callbackEnv->NewObjectArray(len, android_bluetooth_UidTraffic.clazz, NULL);
+ jsize i = 0;
+ for (bt_uid_traffic_t* data = uid_data; data->app_uid != -1; data++) {
+ jobject uidObj = callbackEnv->NewObject(android_bluetooth_UidTraffic.clazz,
+ android_bluetooth_UidTraffic.constructor,
+ (jint) data->app_uid, (jlong) data->rx_bytes,
+ (jlong) data->tx_bytes);
+ callbackEnv->SetObjectArrayElement(array, i++, uidObj);
+ callbackEnv->DeleteLocalRef(uidObj);
+ }
+
callbackEnv->CallVoidMethod(sJniAdapterServiceObj, method_energyInfo, p_energy_info->status,
p_energy_info->ctrl_state, p_energy_info->tx_time, p_energy_info->rx_time,
- p_energy_info->idle_time, p_energy_info->energy_used);
+ p_energy_info->idle_time, p_energy_info->energy_used, array);
checkAndClearExceptionFromCallback(callbackEnv, __FUNCTION__);
+ callbackEnv->DeleteLocalRef(array);
}
static bt_callbacks_t sBluetoothCallbacks = {
@@ -603,6 +628,11 @@
int err;
hw_module_t* module;
+
+ jclass jniUidTrafficClass = env->FindClass("android/bluetooth/UidTraffic");
+ android_bluetooth_UidTraffic.constructor = env->GetMethodID(jniUidTrafficClass,
+ "<init>", "(IJJ)V");
+
jclass jniCallbackClass =
env->FindClass("com/android/bluetooth/btservice/JniCallbacks");
sJniCallbacksField = env->GetFieldID(clazz, "mJniCallbacks",
@@ -634,7 +664,7 @@
method_setWakeAlarm = env->GetMethodID(clazz, "setWakeAlarm", "(JZ)Z");
method_acquireWakeLock = env->GetMethodID(clazz, "acquireWakeLock", "(Ljava/lang/String;)Z");
method_releaseWakeLock = env->GetMethodID(clazz, "releaseWakeLock", "(Ljava/lang/String;)Z");
- method_energyInfo = env->GetMethodID(clazz, "energyInfoCallback", "(IIJJJJ)V");
+ method_energyInfo = env->GetMethodID(clazz, "energyInfoCallback", "(IIJJJJ[Landroid/bluetooth/UidTraffic;)V");
char value[PROPERTY_VALUE_MAX];
property_get("bluetooth.mock_stack", value, "");
@@ -660,6 +690,9 @@
static bool initNative(JNIEnv* env, jobject obj) {
ALOGV("%s:",__FUNCTION__);
+ android_bluetooth_UidTraffic.clazz = (jclass) env->NewGlobalRef(
+ env->FindClass("android/bluetooth/UidTraffic"));
+
sJniAdapterServiceObj = env->NewGlobalRef(obj);
sJniCallbacksObj = env->NewGlobalRef(env->GetObjectField(obj, sJniCallbacksField));
@@ -699,6 +732,8 @@
env->DeleteGlobalRef(sJniCallbacksObj);
env->DeleteGlobalRef(sJniAdapterServiceObj);
+ env->DeleteGlobalRef(android_bluetooth_UidTraffic.clazz);
+ android_bluetooth_UidTraffic.clazz = NULL;
return JNI_TRUE;
}
@@ -771,6 +806,54 @@
return result;
}
+static jbyteArray callByteArrayGetter(JNIEnv* env, jobject object, char* className, char* methodName) {
+ jclass myClass = env->FindClass(className);
+ jmethodID myMethod = env->GetMethodID(myClass, methodName, "()[B");
+ return (jbyteArray) env->CallObjectMethod(object, myMethod);
+}
+
+static jboolean createBondOutOfBandNative(JNIEnv* env, jobject obj, jbyteArray address,
+ jint transport, jobject oobData) {
+ jbyte *addr;
+ jboolean result = JNI_FALSE;
+ bt_out_of_band_data_t oob_data;
+
+ memset(&oob_data, 0, sizeof(oob_data));
+
+ if (!sBluetoothInterface) return result;
+
+ addr = env->GetByteArrayElements(address, NULL);
+ if (addr == NULL) {
+ jniThrowIOException(env, EINVAL);
+ return result;
+ }
+
+ jbyte* smTKBytes = NULL;
+ jbyteArray smTK = callByteArrayGetter(env, oobData, "android/bluetooth/OobData", "getSecurityManagerTk");
+ if (smTK != NULL) {
+ smTKBytes = env->GetByteArrayElements(smTK, NULL);
+ int len = env->GetArrayLength(smTK);
+ if (len != OOB_TK_SIZE) {
+ ALOGI("%s: wrong length of smTK, should be empty or %d bytes.", __FUNCTION__, OOB_TK_SIZE);
+ jniThrowIOException(env, EINVAL);
+ goto done;
+ }
+ memcpy(oob_data.sm_tk, smTKBytes, len);
+ }
+
+ if (sBluetoothInterface->create_bond_out_of_band((bt_bdaddr_t *)addr, transport, &oob_data)
+ == BT_STATUS_SUCCESS)
+ result = JNI_TRUE;
+
+done:
+ env->ReleaseByteArrayElements(address, addr, 0);
+
+ if (smTK != NULL)
+ env->ReleaseByteArrayElements(smTK, smTKBytes, 0);
+
+ return result;
+}
+
static jboolean removeBondNative(JNIEnv* env, jobject obj, jbyteArray address) {
ALOGV("%s:",__FUNCTION__);
@@ -1002,7 +1085,7 @@
}
static int connectSocketNative(JNIEnv *env, jobject object, jbyteArray address, jint type,
- jbyteArray uuidObj, jint channel, jint flag) {
+ jbyteArray uuidObj, jint channel, jint flag, jint callingUid) {
jbyte *addr = NULL, *uuid = NULL;
int socket_fd;
bt_status_t status;
@@ -1024,7 +1107,8 @@
}
if ( (status = sBluetoothSocketInterface->connect((bt_bdaddr_t *) addr, (btsock_type_t) type,
- (const uint8_t*) uuid, channel, &socket_fd, flag)) != BT_STATUS_SUCCESS) {
+ (const uint8_t*) uuid, channel, &socket_fd, flag, callingUid))
+ != BT_STATUS_SUCCESS) {
ALOGE("Socket connection failed: %d", status);
goto Fail;
}
@@ -1047,7 +1131,7 @@
static int createSocketChannelNative(JNIEnv *env, jobject object, jint type,
jstring name_str, jbyteArray uuidObj,
- jint channel, jint flag) {
+ jint channel, jint flag, jint callingUid) {
const char *service_name = NULL;
jbyte *uuid = NULL;
int socket_fd;
@@ -1069,7 +1153,8 @@
}
}
if ( (status = sBluetoothSocketInterface->listen((btsock_type_t) type, service_name,
- (const uint8_t*) uuid, channel, &socket_fd, flag)) != BT_STATUS_SUCCESS) {
+ (const uint8_t*) uuid, channel, &socket_fd, flag, callingUid))
+ != BT_STATUS_SUCCESS) {
ALOGE("Socket listen failed: %d", status);
goto Fail;
}
@@ -1112,7 +1197,8 @@
return result;
}
-static void dumpNative(JNIEnv *env, jobject obj, jobject fdObj)
+static void dumpNative(JNIEnv *env, jobject obj, jobject fdObj,
+ jobjectArray argArray)
{
ALOGV("%s()", __FUNCTION__);
if (!sBluetoothInterface) return;
@@ -1120,7 +1206,26 @@
int fd = jniGetFDFromFileDescriptor(env, fdObj);
if (fd < 0) return;
- sBluetoothInterface->dump(fd);
+ int numArgs = env->GetArrayLength(argArray);
+
+ jstring *argObjs = new jstring[numArgs];
+ const char **args = nullptr;
+ if (numArgs > 0)
+ args = new const char*[numArgs];
+
+ for (int i = 0; i < numArgs; i++) {
+ argObjs[i] = (jstring) env->GetObjectArrayElement(argArray, i);
+ args[i] = env->GetStringUTFChars(argObjs[i], NULL);
+ }
+
+ sBluetoothInterface->dump(fd, args);
+
+ for (int i = 0; i < numArgs; i++) {
+ env->ReleaseStringUTFChars(argObjs[i], args[i]);
+ }
+
+ delete[] args;
+ delete[] argObjs;
}
static jboolean factoryResetNative(JNIEnv *env, jobject obj) {
@@ -1130,6 +1235,27 @@
return (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE;
}
+static void interopDatabaseClearNative(JNIEnv *env, jobject obj) {
+ ALOGV("%s()", __FUNCTION__);
+ if (!sBluetoothInterface) return;
+ sBluetoothInterface->interop_database_clear();
+}
+
+static void interopDatabaseAddNative(JNIEnv *env, jobject obj, int feature,
+ jbyteArray address, int length) {
+ ALOGV("%s()", __FUNCTION__);
+ if (!sBluetoothInterface) return;
+
+ jbyte *addr = env->GetByteArrayElements(address, NULL);
+ if (addr == NULL) {
+ jniThrowIOException(env, EINVAL);
+ return;
+ }
+
+ sBluetoothInterface->interop_database_add(feature, (bt_bdaddr_t *)addr, length);
+ env->ReleaseByteArrayElements(address, addr, 0);
+}
+
static JNINativeMethod sMethods[] = {
/* name, signature, funcPtr */
{"classInitNative", "()V", (void *) classInitNative},
@@ -1145,20 +1271,23 @@
{"startDiscoveryNative", "()Z", (void*) startDiscoveryNative},
{"cancelDiscoveryNative", "()Z", (void*) cancelDiscoveryNative},
{"createBondNative", "([BI)Z", (void*) createBondNative},
+ {"createBondOutOfBandNative", "([BILandroid/bluetooth/OobData;)Z", (void*) createBondOutOfBandNative},
{"removeBondNative", "([B)Z", (void*) removeBondNative},
{"cancelBondNative", "([B)Z", (void*) cancelBondNative},
{"getConnectionStateNative", "([B)I", (void*) getConnectionStateNative},
{"pinReplyNative", "([BZI[B)Z", (void*) pinReplyNative},
{"sspReplyNative", "([BIZI)Z", (void*) sspReplyNative},
{"getRemoteServicesNative", "([B)Z", (void*) getRemoteServicesNative},
- {"connectSocketNative", "([BI[BII)I", (void*) connectSocketNative},
- {"createSocketChannelNative", "(ILjava/lang/String;[BII)I",
+ {"connectSocketNative", "([BI[BIII)I", (void*) connectSocketNative},
+ {"createSocketChannelNative", "(ILjava/lang/String;[BIII)I",
(void*) createSocketChannelNative},
{"configHciSnoopLogNative", "(Z)Z", (void*) configHciSnoopLogNative},
{"alarmFiredNative", "()V", (void *) alarmFiredNative},
{"readEnergyInfo", "()I", (void*) readEnergyInfo},
- {"dumpNative", "(Ljava/io/FileDescriptor;)V", (void*) dumpNative},
- {"factoryResetNative", "()Z", (void*)factoryResetNative}
+ {"dumpNative", "(Ljava/io/FileDescriptor;[Ljava/lang/String;)V", (void*) dumpNative},
+ {"factoryResetNative", "()Z", (void*)factoryResetNative},
+ {"interopDatabaseClearNative", "()V", (void*) interopDatabaseClearNative},
+ {"interopDatabaseAddNative", "(I[BI)V", (void*) interopDatabaseAddNative}
};
int register_com_android_bluetooth_btservice_AdapterService(JNIEnv* env)
diff --git a/jni/com_android_bluetooth_hdp.cpp b/jni/com_android_bluetooth_hdp.cpp
index 81c8312..b602134 100644
--- a/jni/com_android_bluetooth_hdp.cpp
+++ b/jni/com_android_bluetooth_hdp.cpp
@@ -195,7 +195,10 @@
bthl_reg_param_t reg_param;
int app_id;
- if (!sBluetoothHdpInterface) return NULL;
+ if (!sBluetoothHdpInterface) {
+ ALOGE("Failed to register health app. No Bluetooth Health Interface available");
+ return -1;
+ }
mdep_cfg.mdep_role = (bthl_mdep_role_t) role;
mdep_cfg.data_type = data_type;
diff --git a/res/drawable-hdpi/bt_incomming_file_notification.png b/res/drawable-hdpi/bt_incomming_file_notification.png
deleted file mode 100644
index ff72837..0000000
--- a/res/drawable-hdpi/bt_incomming_file_notification.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/bt_incomming_file_notification.png b/res/drawable-mdpi/bt_incomming_file_notification.png
deleted file mode 100644
index d53e0eb..0000000
--- a/res/drawable-mdpi/bt_incomming_file_notification.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/bt_incomming_file_notification.png b/res/drawable-xhdpi/bt_incomming_file_notification.png
deleted file mode 100644
index 3762470..0000000
--- a/res/drawable-xhdpi/bt_incomming_file_notification.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/bt_incomming_file_notification.xml b/res/drawable/bt_incomming_file_notification.xml
new file mode 100644
index 0000000..ed45b3b
--- /dev/null
+++ b/res/drawable/bt_incomming_file_notification.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24.0dp"
+ android:height="24.0dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:pathData="M13.5 8.1l-6.2-6.1v8.9l-3.8-3.5-.9 1 4 3.6-3.9 3.7.9 1 3.8-3.5v8.8l6.2-6.1-3.9-4.3 3.8-3.5zm-4.5-2.6l2.6 2.6-2.6 2.2v-4.8zm2.6 10.4l-2.6 2.6v-5.5l2.6 2.9zm5.6-7.5h-1.7l2.7-3.6 2.7 3.6h-1.7v2.7h-2v-2.7zm0 4.6h2v2.7h1.7l-2.7 3.6-2.7-3.6h1.7v-2.7z"
+ android:fillColor="#FFFFFFFF"/>
+</vector>
diff --git a/res/drawable/ic_accept.xml b/res/drawable/ic_accept.xml
new file mode 100644
index 0000000..5ed8b4e
--- /dev/null
+++ b/res/drawable/ic_accept.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24.0dp"
+ android:height="24.0dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:pathData="M9 16.2L4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4L9 16.2z"
+ android:fillColor="#FF000000"/>
+</vector>
diff --git a/res/drawable/ic_decline.xml b/res/drawable/ic_decline.xml
new file mode 100644
index 0000000..6c7d83a
--- /dev/null
+++ b/res/drawable/ic_decline.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24.0dp"
+ android:height="24.0dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:pathData="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"
+ android:fillColor="#FF000000"/>
+</vector>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 41953a1..1abb2db 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Aanvaar"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Daar was \'n uittelling terwyl \'n inkomende lêer van \"<xliff:g id="SENDER">%1$s</xliff:g>\" aanvaar is"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth-deel: Inkomende lêer"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Wil jy hierdie lêer ontvang?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Inkomende lêer vanaf \'n ander toestel. Bevestig dat jy hierdie lêer wil ontvang."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Inkomende lêer"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> is gereed om <xliff:g id="FILE">%2$s</xliff:g> te stuur"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth-deling: Ontvang <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetooth-deling: Het \"<xliff:g id="FILE">%1$s</xliff:g>\" ontvang"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth-deling: Lêer <xliff:g id="FILE">%1$s</xliff:g> nie ontvang nie"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Vee uit"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Stoor"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Kanselleer"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Kies die rekeninge wat jy deur Bluetooth wil deel. Jy moet steeds enige toegang tot die rekeninge aanvaar wanneer jy koppel."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Kies die rekeninge wat jy deur Bluetooth wil deel. Jy moet steeds enige toegang tot die rekeninge aanvaar wanneer jy koppel."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Gleuwe oor:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Programikoon"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Bluetooth-boodskapdeelinstellings"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index bae6be9..2e2cea0 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"ተቀበል"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"እሺ"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"ከ \"<xliff:g id="SENDER">%1$s</xliff:g>\" ገቢ መልዕክት ፋይል እየተቀበለ ሳለ ጊዜ አልቆ ነበር።"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"የብሉቱዝ መጋሪያ፡ ገቢ ፋይል"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"ይህን ፋይል መቀበል ይፈልጋሉ?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"ከሌላ መሣሪያ የሚገባ ፋይል አለ፣ ይህን ፋይል ለመቀበል መፈለግዎን ያረጋግጡ።"</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"ገቢ ፋይል"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> <xliff:g id="FILE">%2$s</xliff:g>ን ለመላክ ዝግጁ ነው"</string>
<string name="notification_receiving" msgid="4674648179652543984">"ብሉቱዝ ማጋሪያ፡ <xliff:g id="FILE">%1$s</xliff:g> እየተቀበለ"</string>
<string name="notification_received" msgid="3324588019186687985">"ብሉቱዝ ማጋሪያ፡ <xliff:g id="FILE">%1$s</xliff:g> ደርሷል"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"ብሉቱዝ ማጋሪያ፡ ፋይል<xliff:g id="FILE">%1$s</xliff:g> አልደረሰም"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"አጽዳ"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"አስቀምጥ"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"ይቅር"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"በብሉቱዝ በኩል ማጋራት የሚፈልጓቸውን መለያዎች ይምረጡ። አሁንም በሚገናኙበት ወቅት ማንኛቸውም የመለያዎቹ መዳረሻ መፍቀድ አለብዎት።"</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"በብሉቱዝ በኩል ማጋራት የሚፈልጓቸውን መለያዎች ይምረጡ። አሁንም በሚገናኙበት ወቅት ማንኛቸውም የመለያዎቹ መዳረሻ መፍቀድ አለብዎት።"</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"የቀሩ መክተቻዎች፦"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"የመተግበሪያ አዶ"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"የብሉቱዝ የመልዕክት ማጋሪያ ቅንብሮች"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index ecb7c95..759542f 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"قبول"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"موافق"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"انتهت المهلة أثناء قبول ملف وراد من \"<xliff:g id="SENDER">%1$s</xliff:g>\""</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"مشاركة البلوتوث: ملف وارد"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"هل تريد تلقي هذا الملف؟"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"هناك ملف وارد من جهاز آخر. عليك تأكيد أنك تريد استلام هذا الملف."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"ملف وارد"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> جاهز لإرسال <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"مشاركة البلوتوث: يتم استلام <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"مشاركة البلوتوث: تم استلام <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"مشاركة البلوتوث: لم يتم استلام الملف <xliff:g id="FILE">%1$s</xliff:g>"</string>
@@ -132,7 +131,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"محو"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"حفظ"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"إلغاء"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"حدد الحسابات التي تريد مشاركتها عبر بلوتوث. لا يزال يتعين عليك قبول أي دخول إلى الحسابات أثناء الاتصال."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"حدد الحسابات التي تريد مشاركتها عبر البلوتوث. لا يزال يتعين عليك قبول أي دخول إلى الحسابات أثناء الاتصال."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"المنافذ المتبقية:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"رمز التطبيق"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"إعدادات مشاركة الرسائل عبر بلوتوث"</string>
diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml
index 2f9d291..1cc4131 100644
--- a/res/values-az-rAZ/strings.xml
+++ b/res/values-az-rAZ/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Qəbul edirəm"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"\"<xliff:g id="SENDER">%1$s</xliff:g>\" adlı istifadəçidən gələn faylı qəbul edərkən gecikmə baş verdi"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth paylaşım: Gələn fayl"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Bu faylı qəbul etmək istəyirsiniz?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Başqa cihazdan fayl gəlir. Qəbul etmə istəyinizi təsdiq edin."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Gələn fayl"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> <xliff:g id="FILE">%2$s</xliff:g> faylını göndərməyə hazırdır"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth paylaşım: <xliff:g id="FILE">%1$s</xliff:g> qəbul edilir"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetooth paylaşım: <xliff:g id="FILE">%1$s</xliff:g> qəbul edildi"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth paylaşım: <xliff:g id="FILE">%1$s</xliff:g> faylı qəbul edilmədi"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Silin"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Yadda saxlayın"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Ləğv edin"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Bluetooth vasitəsilə bölüşmək istəyirəm hesabı seçin. Siz hələ birləşdirən zaman hesablarına hər hansı bir acceess qəbul etmək lazımdır."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Bluetooth vasitəsilə paylaşmaq istədiyiniz hesabları seçin. Qoşulma zamanı hesablara olan istənilən girişi qəbul etməlisiniz."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Qalmış slotlar:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Tətbiq ikonası"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Bluetooth Mesaj Paylaşma Ayarları"</string>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 0000000..f409f8f
--- /dev/null
+++ b/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="permlab_bluetoothShareManager" msgid="311492132450338925">"Pristup menadžeru preuzimanja."</string>
+ <string name="permdesc_bluetoothShareManager" msgid="8930572979123190223">"Omogućava aplikaciji da pristupa menadžeru za deljenje preko Bluetooth-a i da ga koristi za prenos datoteka."</string>
+ <string name="permlab_bluetoothWhitelist" msgid="7091552898592306386">"Pristup Bluetooth uređaja sa bele liste."</string>
+ <string name="permdesc_bluetoothWhitelist" msgid="5494513855192170109">"Dozvoljava aplikaciji da privremeno stavi Bluetooth uređaj na belu listu, što omogućava tom uređaju da šalje datoteke ovom uređaju bez potvrde korisnika."</string>
+ <string name="bt_share_picker_label" msgid="6268100924487046932">"Bluetooth"</string>
+ <string name="unknown_device" msgid="9221903979877041009">"Nepoznati uređaj"</string>
+ <string name="unknownNumber" msgid="4994750948072751566">"Nepoznato"</string>
+ <string name="airplane_error_title" msgid="2683839635115739939">"Režim rada u avionu"</string>
+ <string name="airplane_error_msg" msgid="8698965595254137230">"Ne možete da koristite Bluetooth u režimu rada u avionu."</string>
+ <string name="bt_enable_title" msgid="8657832550503456572"></string>
+ <string name="bt_enable_line1" msgid="7203551583048149">"Da biste mogli da koristite Bluetooth usluge, najpre morate da uključite Bluetooth."</string>
+ <string name="bt_enable_line2" msgid="4341936569415937994">"Želite li odmah da uključite Bluetooth?"</string>
+ <string name="bt_enable_cancel" msgid="1988832367505151727">"Otkaži"</string>
+ <string name="bt_enable_ok" msgid="3432462749994538265">"Uključi"</string>
+ <string name="incoming_file_confirm_title" msgid="8139874248612182627">"Prenos datoteke"</string>
+ <string name="incoming_file_confirm_content" msgid="2752605552743148036">"Želite li da prihvatite dolaznu datoteku?"</string>
+ <string name="incoming_file_confirm_cancel" msgid="2973321832477704805">"Odbij"</string>
+ <string name="incoming_file_confirm_ok" msgid="281462442932231475">"Prihvati"</string>
+ <string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"Potvrdi"</string>
+ <string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Došlo je do vremenskog ograničenja tokom prijema dolazne datoteke od „<xliff:g id="SENDER">%1$s</xliff:g>“"</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Dolazna datoteka"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> je spreman/na da pošalje <xliff:g id="FILE">%2$s</xliff:g>"</string>
+ <string name="notification_receiving" msgid="4674648179652543984">"Bluetooth deljenje: prijem <xliff:g id="FILE">%1$s</xliff:g>"</string>
+ <string name="notification_received" msgid="3324588019186687985">"Bluetooth deljenje: primljeno <xliff:g id="FILE">%1$s</xliff:g>"</string>
+ <string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth deljenje: datoteka <xliff:g id="FILE">%1$s</xliff:g> nije primljena"</string>
+ <string name="notification_sending" msgid="3035748958534983833">"Bluetooth deljenje: slanje <xliff:g id="FILE">%1$s</xliff:g>"</string>
+ <string name="notification_sent" msgid="9218710861333027778">"Bluetooth deljenje: poslato <xliff:g id="FILE">%1$s</xliff:g>"</string>
+ <string name="notification_sent_complete" msgid="302943281067557969">"Dovršeno je 100%"</string>
+ <string name="notification_sent_fail" msgid="6696082233774569445">"Bluetooth deljenje: datoteka <xliff:g id="FILE">%1$s</xliff:g> nije poslata"</string>
+ <string name="download_title" msgid="3353228219772092586">"Prenos datoteke"</string>
+ <string name="download_line1" msgid="4926604799202134144">"Od: „<xliff:g id="SENDER">%1$s</xliff:g>“"</string>
+ <string name="download_line2" msgid="5876973543019417712">"Datoteka: <xliff:g id="FILE">%1$s</xliff:g>"</string>
+ <string name="download_line3" msgid="4384821622908676061">"Veličina datoteke: <xliff:g id="SIZE">%1$s</xliff:g>"</string>
+ <string name="download_line4" msgid="8535996869722666525"></string>
+ <string name="download_line5" msgid="3069560415845295386">"Primanje datoteke..."</string>
+ <string name="download_cancel" msgid="9177305996747500768">"Zaustavi"</string>
+ <string name="download_ok" msgid="5000360731674466039">"Sakrij"</string>
+ <string name="incoming_line1" msgid="2127419875681087545">"Od"</string>
+ <string name="incoming_line2" msgid="3348994249285315873">"Naziv datoteke"</string>
+ <string name="incoming_line3" msgid="7954237069667474024">"Veličina"</string>
+ <string name="download_fail_line1" msgid="3846450148862894552">"Datoteka nije primljena"</string>
+ <string name="download_fail_line2" msgid="8950394574689971071">"Datoteka: <xliff:g id="FILE">%1$s</xliff:g>"</string>
+ <string name="download_fail_line3" msgid="3451040656154861722">"Razlog: <xliff:g id="REASON">%1$s</xliff:g>"</string>
+ <string name="download_fail_ok" msgid="1521733664438320300">"Potvrdi"</string>
+ <string name="download_succ_line5" msgid="4509944688281573595">"Datoteka je primljena"</string>
+ <string name="download_succ_ok" msgid="7053688246357050216">"Otvori"</string>
+ <string name="upload_line1" msgid="2055952074059709052">"Kome: „<xliff:g id="RECIPIENT">%1$s</xliff:g>“"</string>
+ <string name="upload_line3" msgid="4920689672457037437">"Tip datoteke: <xliff:g id="TYPE">%1$s</xliff:g> (<xliff:g id="SIZE">%2$s</xliff:g>)"</string>
+ <string name="upload_line5" msgid="7759322537674229752">"Slanje datoteke..."</string>
+ <string name="upload_succ_line5" msgid="5687317197463383601">"Datoteka je poslata"</string>
+ <string name="upload_succ_ok" msgid="7705428476405478828">"Potvrdi"</string>
+ <string name="upload_fail_line1" msgid="7899394672421491701">"Datoteka nije poslata na <xliff:g id="RECIPIENT">%1$s</xliff:g>."</string>
+ <string name="upload_fail_line1_2" msgid="2108129204050841798">"Datoteka: <xliff:g id="FILE">%1$s</xliff:g>"</string>
+ <string name="upload_fail_ok" msgid="5807702461606714296">"Pokušaj ponovo"</string>
+ <string name="upload_fail_cancel" msgid="9118496285835687125">"Zatvori"</string>
+ <string name="bt_error_btn_ok" msgid="5965151173011534240">"Potvrdi"</string>
+ <string name="unknown_file" msgid="6092727753965095366">"Nepoznata datoteka"</string>
+ <string name="unknown_file_desc" msgid="480434281415453287">"Nema aplikacija za obradu ovog tipa datoteke. \n"</string>
+ <string name="not_exist_file" msgid="3489434189599716133">"Nema datoteke"</string>
+ <string name="not_exist_file_desc" msgid="4059531573790529229">"Datoteka ne postoji. \n"</string>
+ <string name="enabling_progress_title" msgid="436157952334723406">"Sačekajte…"</string>
+ <string name="enabling_progress_content" msgid="4601542238119927904">"Uključivanje Bluetooth-a…"</string>
+ <string name="bt_toast_1" msgid="972182708034353383">"Datoteka će biti primljena. Proveravajte tok na tabli sa obaveštenjima."</string>
+ <string name="bt_toast_2" msgid="8602553334099066582">"Nije moguće primiti datoteku."</string>
+ <string name="bt_toast_3" msgid="6707884165086862518">"Zaustavljen prijem datoteke od pošiljaoca „<xliff:g id="SENDER">%1$s</xliff:g>“"</string>
+ <string name="bt_toast_4" msgid="4678812947604395649">"Slanje datoteke primaocu „<xliff:g id="RECIPIENT">%1$s</xliff:g>“"</string>
+ <string name="bt_toast_5" msgid="2846870992823019494">"Slanje<xliff:g id="NUMBER">%1$s</xliff:g> datoteka primaocu „<xliff:g id="RECIPIENT">%2$s</xliff:g>“"</string>
+ <string name="bt_toast_6" msgid="1855266596936622458">"Zaustavljeno slanje primaocu „<xliff:g id="RECIPIENT">%1$s</xliff:g>“"</string>
+ <string name="bt_sm_2_1" product="nosdcard" msgid="352165168004521000">"Nema dovoljno prostora u USB memoriji da bi se sačuvala datoteka pošiljaoca „<xliff:g id="SENDER">%1$s</xliff:g>“"</string>
+ <string name="bt_sm_2_1" product="default" msgid="1989018443456803630">"Nema dovoljno prostora na SD kartici da bi se sačuvala datoteka pošiljaoca „<xliff:g id="SENDER">%1$s</xliff:g>“"</string>
+ <string name="bt_sm_2_2" msgid="2965243265852680543">"Potreban prostor: <xliff:g id="SIZE">%1$s</xliff:g>"</string>
+ <string name="ErrorTooManyRequests" msgid="8578277541472944529">"Previše zahteva se obrađuje. Pokušajte ponovo kasnije."</string>
+ <string name="status_pending" msgid="2503691772030877944">"Prenos datoteke još nije počeo."</string>
+ <string name="status_running" msgid="6562808920311008696">"Prenos datoteke je u toku."</string>
+ <string name="status_success" msgid="239573225847565868">"Prenos datoteke je dovršen."</string>
+ <string name="status_not_accept" msgid="1695082417193780738">"Sadržaj nije podržan."</string>
+ <string name="status_forbidden" msgid="613956401054050725">"Ciljni uređaj je zabranio prenos."</string>
+ <string name="status_canceled" msgid="6664490318773098285">"Korisnik je otkazao prenos."</string>
+ <string name="status_file_error" msgid="3671917770630165299">"Problem sa skladištem."</string>
+ <string name="status_no_sd_card" product="nosdcard" msgid="1112125377088421469">"Nema USB memorije."</string>
+ <string name="status_no_sd_card" product="default" msgid="5760944071743325592">"Nema SD kartice. Umetnite SD karticu da biste sačuvali prenete datoteke."</string>
+ <string name="status_connection_error" msgid="947681831523219891">"Povezivanje nije uspelo."</string>
+ <string name="status_protocol_error" msgid="3245444473429269539">"Nije moguće ispravno obraditi zahtev."</string>
+ <string name="status_unknown_error" msgid="8156660554237824912">"Nepoznata greška."</string>
+ <string name="btopp_live_folder" msgid="7967791481444474554">"Primljeno preko Bluetooth-a"</string>
+ <string name="download_success" msgid="7036160438766730871">"<xliff:g id="FILE_SIZE">%1$s</xliff:g> Primljeno u celosti."</string>
+ <string name="upload_success" msgid="4014469387779648949">"<xliff:g id="FILE_SIZE">%1$s</xliff:g> Slanje je dovršeno."</string>
+ <string name="inbound_history_title" msgid="6940914942271327563">"Dolazni prenosi"</string>
+ <string name="outbound_history_title" msgid="4279418703178140526">"Odlazni prenosi"</string>
+ <string name="no_transfers" msgid="3482965619151865672">"Istorija prenosa je prazna."</string>
+ <string name="transfer_clear_dlg_msg" msgid="1712376797268438075">"Sve stavke će biti izbrisane sa liste."</string>
+ <string name="outbound_noti_title" msgid="8051906709452260849">"Deljenje preko Bluetooth-a: poslate datoteke"</string>
+ <string name="inbound_noti_title" msgid="4143352641953027595">"Deljenje preko Bluetooth-a: primljene datoteke"</string>
+ <plurals name="noti_caption_unsuccessful" formatted="false" msgid="2020750076679526122">
+ <item quantity="one"><xliff:g id="UNSUCCESSFUL_NUMBER_1">%1$d</xliff:g> neuspešna.</item>
+ <item quantity="few"><xliff:g id="UNSUCCESSFUL_NUMBER_1">%1$d</xliff:g> neuspešne.</item>
+ <item quantity="other"><xliff:g id="UNSUCCESSFUL_NUMBER_1">%1$d</xliff:g> neuspešnih.</item>
+ </plurals>
+ <plurals name="noti_caption_success" formatted="false" msgid="1572472450257645181">
+ <item quantity="one"><xliff:g id="SUCCESSFUL_NUMBER_1">%1$d</xliff:g> uspešna, %2$s</item>
+ <item quantity="few"><xliff:g id="SUCCESSFUL_NUMBER_1">%1$d</xliff:g> uspešne, %2$s</item>
+ <item quantity="other"><xliff:g id="SUCCESSFUL_NUMBER_1">%1$d</xliff:g> uspešnih, %2$s</item>
+ </plurals>
+ <string name="transfer_menu_clear_all" msgid="790017462957873132">"Obriši listu"</string>
+ <string name="transfer_menu_open" msgid="3368984869083107200">"Otvori"</string>
+ <string name="transfer_menu_clear" msgid="5854038118831427492">"Obriši sa liste"</string>
+ <string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Brisanje"</string>
+ <string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Sačuvaj"</string>
+ <string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Otkaži"</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Izaberite naloge koje želite da delite preko Bluetooth-a. I dalje morate da prihvatite bilo kakav pristup nalozima pri povezivanju."</string>
+ <string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Preostalih mesta:"</string>
+ <string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Ikona aplikacije"</string>
+ <string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Podešavanja Bluetooth deljenja poruka"</string>
+ <string name="bluetooth_map_settings_no_account_slots_left" msgid="1796029082612965251">"Nije moguće izabrati nalog. Nema preostalih mesta"</string>
+</resources>
diff --git a/res/values-b+sr+Latn/strings_pbap.xml b/res/values-b+sr+Latn/strings_pbap.xml
new file mode 100644
index 0000000..4896295
--- /dev/null
+++ b/res/values-b+sr+Latn/strings_pbap.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="pbap_session_key_dialog_title" msgid="3580996574333882561">"Unesite ključ sesije za %1$s"</string>
+ <string name="pbap_session_key_dialog_header" msgid="2772472422782758981">"Potreban je ključ sesije za Bluetooth"</string>
+ <string name="pbap_acceptance_timeout_message" msgid="1107401415099814293">"Isteklo je vreme za prihvatanje veze sa uređajem %1$s"</string>
+ <string name="pbap_authentication_timeout_message" msgid="4166979525521902687">"Isteklo je vreme za unos ključa sesije pomoću %1$s"</string>
+ <string name="auth_notif_ticker" msgid="1575825798053163744">"Zahtev za potvrdu identiteta preko Obex protokola"</string>
+ <string name="auth_notif_title" msgid="7599854855681573258">"Ključ sesije"</string>
+ <string name="auth_notif_message" msgid="6667218116427605038">"Unesite ključ sesije za %1$s"</string>
+ <string name="defaultname" msgid="4821590500649090078">"Oprema za automobil"</string>
+ <string name="unknownName" msgid="2841414754740600042">"Nepoznato ime"</string>
+ <string name="localPhoneName" msgid="2349001318925409159">"Moje ime"</string>
+ <string name="defaultnumber" msgid="8520116145890867338">"000000"</string>
+</resources>
diff --git a/res/values-b+sr+Latn/strings_sap.xml b/res/values-b+sr+Latn/strings_sap.xml
new file mode 100644
index 0000000..7e36fb9
--- /dev/null
+++ b/res/values-b+sr+Latn/strings_sap.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="bluetooth_sap_notif_title" msgid="6877860822993195074">"Pristup SIM kartici preko Bluetooth-a"</string>
+ <string name="bluetooth_sap_notif_ticker" msgid="6807778527893726699">"Pristup SIM kartici preko Bluetooth-a"</string>
+ <string name="bluetooth_sap_notif_message" msgid="7138657801087500690">"Želite li da pošaljete klijentu zahtev za prekid veze?"</string>
+ <string name="bluetooth_sap_notif_disconnecting" msgid="819150843490233288">"Čeka se da klijent prekine vezu"</string>
+ <string name="bluetooth_sap_notif_disconnect_button" msgid="3678476872583356919">"Prekini vezu"</string>
+ <string name="bluetooth_sap_notif_force_disconnect_button" msgid="8144086340185532030">"Prinudno prekini vezu"</string>
+</resources>
diff --git a/res/values-b+sr+Latn/test_strings.xml b/res/values-b+sr+Latn/test_strings.xml
new file mode 100644
index 0000000..6e728d8
--- /dev/null
+++ b/res/values-b+sr+Latn/test_strings.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="hello" msgid="1740533743008967039">"Zdravo svima, proba"</string>
+ <string name="app_name" msgid="1203877025577761792">"Deljenje preko Bluetooth-a"</string>
+ <string name="insert_record" msgid="1450997173838378132">"Umetni zapis"</string>
+ <string name="update_record" msgid="2480425402384910635">"Potvrdi zapis"</string>
+ <string name="ack_record" msgid="6716152390978472184">"Ack zapis"</string>
+ <string name="deleteAll_record" msgid="4383349788485210582">"Izbriši sve zapise"</string>
+ <string name="ok_button" msgid="6519033415223065454">"Potvrdi"</string>
+ <string name="delete_record" msgid="4645040331967533724">"Izbriši zapis"</string>
+ <string name="start_server" msgid="9034821924409165795">"Pokreni TCP server"</string>
+ <string name="notify_server" msgid="4369106744022969655">"Obavesti TCP server"</string>
+</resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index c55c49a..40740e9 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Приемане"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Времето за изчакване изтече при приемането на входящ файл от „<xliff:g id="SENDER">%1$s</xliff:g>“"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Споделяне чрез Bluetooth: Вх. файл"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Искате ли да получите този файл?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Входящ файл от друго устройство. Потвърдете, че искате да го получите."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Входящ файл"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> има готовност да изпрати „<xliff:g id="FILE">%2$s</xliff:g>“"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Споделяне чрез Bluetooth: <xliff:g id="FILE">%1$s</xliff:g> се получава"</string>
<string name="notification_received" msgid="3324588019186687985">"Споделяне чрез Bluetooth: <xliff:g id="FILE">%1$s</xliff:g> се получи"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Споделяне чрез Bluetooth: Файлът <xliff:g id="FILE">%1$s</xliff:g> не е получен"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Изчистване"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Запазване"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Отказ"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Изберете профилите, които искате да споделите през Bluetooth. Пак трябва да приемете достъпа до тях при свързване."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Изберете профилите, които искате да споделите през Bluetooth. Пак трябва да приемете достъпа до тях при свързване."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Оставащи слотове:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Икона на приложението"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Настройки за споделяне на съобщения през Bluetooth"</string>
diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml
index 58216fa..89971f9 100644
--- a/res/values-bn-rBD/strings.xml
+++ b/res/values-bn-rBD/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"স্বীকার করুন"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"ঠিক আছে"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"\"<xliff:g id="SENDER">%1$s</xliff:g>\" এর থেকে ইনকামিং ফাইল গ্রহণ করার সময় অতিবাহিত হয়ে গেছে।"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth share: ইনকামিং ফাইল"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"আপনি কি এই ফাইলটি পেতে চান?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"অন্য ডিভাইস থেকে ইনকামিং ফাইল। আপনি যে ফাইলটি পেতে চান তা নিশ্চিত করুন।"</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"আগত ফাইল"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> <xliff:g id="FILE">%2$s</xliff:g> পাঠানোর জন্য প্রস্তুত"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth share: <xliff:g id="FILE">%1$s</xliff:g> প্রাপ্ত করা হচ্ছে"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetooth share: <xliff:g id="FILE">%1$s</xliff:g> প্রাপ্ত করা হয়েছে"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth share: <xliff:g id="FILE">%1$s</xliff:g> ফাইল প্রাপ্ত করা হয়নি"</string>
@@ -124,9 +123,9 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"সাফ করুন"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"সংরক্ষণ করুন"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"বাতিল করুন"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"আপনি Bluetooth এর মাধ্যমে যেই অ্যাকাউন্টগুলি ভাগ করতে চান সেগুলি নির্বাচন করুন। সংযোগের সময়ে আপনাকে এখনও পর্যন্ত অ্যাকাউন্টের যে কোনো অ্যাক্সেস গ্রহণ করতে হবে।"</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"আপনি Bluetooth এর মাধ্যমে যে অ্যাকাউন্টগুলি শেয়ার করতে চান সেগুলি নির্বাচন করুন। সংযোগের সময়ে আপনাকে এখনো অ্যাকাউন্টের যে কোনো অ্যাক্সেস গ্রহণ করতে হবে।"</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"যে স্লটগুলি বাকি আছে:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"অ্যাপ্লিকেশান আইকন"</string>
- <string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Bluetooth মারফত বার্তা ভাগ করার সেটিংস"</string>
+ <string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Bluetooth মারফত বার্তা শেয়ার করার সেটিংস"</string>
<string name="bluetooth_map_settings_no_account_slots_left" msgid="1796029082612965251">"অ্যাকাউন্ট নির্বাচন করা যাচ্ছে না। ০টি স্লট বাকি আছে"</string>
</resources>
diff --git a/res/values-bn-rBD/test_strings.xml b/res/values-bn-rBD/test_strings.xml
index 1e9145f..bc9c95a 100644
--- a/res/values-bn-rBD/test_strings.xml
+++ b/res/values-bn-rBD/test_strings.xml
@@ -2,7 +2,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="hello" msgid="1740533743008967039">"হ্যালো ওয়ার্ল্ড, TestActivity"</string>
- <string name="app_name" msgid="1203877025577761792">"Bluetooth ভাগ করা"</string>
+ <string name="app_name" msgid="1203877025577761792">"Bluetooth শেয়ার করা"</string>
<string name="insert_record" msgid="1450997173838378132">"রেকর্ড ঢোকান"</string>
<string name="update_record" msgid="2480425402384910635">"রেকর্ড নিশ্চিত করুন"</string>
<string name="ack_record" msgid="6716152390978472184">"Ack রেকর্ড"</string>
diff --git a/res/values-bs-rBA/strings.xml b/res/values-bs-rBA/strings.xml
new file mode 100644
index 0000000..f82e605
--- /dev/null
+++ b/res/values-bs-rBA/strings.xml
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="permlab_bluetoothShareManager" msgid="311492132450338925">"Pristupite upravitelju za preuzimanja."</string>
+ <string name="permdesc_bluetoothShareManager" msgid="8930572979123190223">"Dozvoljava aplikaciji da pristupa BluetoothShare upravitelju i koristi ga za prenošenje fajlova."</string>
+ <string name="permlab_bluetoothWhitelist" msgid="7091552898592306386">"Dozvoli pristup bluetooth uređaju."</string>
+ <string name="permdesc_bluetoothWhitelist" msgid="5494513855192170109">"Dozvoljava aplikaciji da privremeno stavi Bluetooth uređaj na spisak dopuštenih fajlova, omogućavajući tom uređaju da šalje fajlove na ovaj uređaj bez potvrde korisnika."</string>
+ <string name="bt_share_picker_label" msgid="6268100924487046932">"Bluetooth"</string>
+ <string name="unknown_device" msgid="9221903979877041009">"Nepoznat uređaj"</string>
+ <string name="unknownNumber" msgid="4994750948072751566">"Nepoznato"</string>
+ <string name="airplane_error_title" msgid="2683839635115739939">"Način rada u avionu"</string>
+ <string name="airplane_error_msg" msgid="8698965595254137230">"Ne možete koristiti Bluetooth u načinu rada u avionu."</string>
+ <string name="bt_enable_title" msgid="8657832550503456572"></string>
+ <string name="bt_enable_line1" msgid="7203551583048149">"Da biste koristili Bluetooth usluge, prvo morate uključiti Bluetooth."</string>
+ <string name="bt_enable_line2" msgid="4341936569415937994">"Želite uključiti Bluetooth sada?"</string>
+ <string name="bt_enable_cancel" msgid="1988832367505151727">"Otkaži"</string>
+ <string name="bt_enable_ok" msgid="3432462749994538265">"Uključi"</string>
+ <string name="incoming_file_confirm_title" msgid="8139874248612182627">"Prenošenje fajla"</string>
+ <string name="incoming_file_confirm_content" msgid="2752605552743148036">"Prihvatiti dolazni fajl?"</string>
+ <string name="incoming_file_confirm_cancel" msgid="2973321832477704805">"Odbij"</string>
+ <string name="incoming_file_confirm_ok" msgid="281462442932231475">"Prihvati"</string>
+ <string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"Uredu"</string>
+ <string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Isteklo je vrijeme prilikom prihvatanja dolaznog fajla koji šalje \"<xliff:g id="SENDER">%1$s</xliff:g>\""</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Dolazni fajl"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> sada može poslati <xliff:g id="FILE">%2$s</xliff:g>"</string>
+ <string name="notification_receiving" msgid="4674648179652543984">"Bluetooth dijeljenje: Prima se fajl <xliff:g id="FILE">%1$s</xliff:g>"</string>
+ <string name="notification_received" msgid="3324588019186687985">"Bluetooth dijeljenje: Primljen fajl <xliff:g id="FILE">%1$s</xliff:g>"</string>
+ <string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth dijeljenje: Fajl <xliff:g id="FILE">%1$s</xliff:g> nije primljen"</string>
+ <string name="notification_sending" msgid="3035748958534983833">"Bluetooth dijeljenje: Šalje se fajl <xliff:g id="FILE">%1$s</xliff:g>"</string>
+ <string name="notification_sent" msgid="9218710861333027778">"Bluetooth dijeljenje: Poslan fajl <xliff:g id="FILE">%1$s</xliff:g>"</string>
+ <string name="notification_sent_complete" msgid="302943281067557969">"Dovršeno 100%"</string>
+ <string name="notification_sent_fail" msgid="6696082233774569445">"Bluetooth dijeljenje: Fajl <xliff:g id="FILE">%1$s</xliff:g> nije poslan"</string>
+ <string name="download_title" msgid="3353228219772092586">"Prenošenje fajla"</string>
+ <string name="download_line1" msgid="4926604799202134144">"Šalje: \"<xliff:g id="SENDER">%1$s</xliff:g>\""</string>
+ <string name="download_line2" msgid="5876973543019417712">"Fajl: <xliff:g id="FILE">%1$s</xliff:g>"</string>
+ <string name="download_line3" msgid="4384821622908676061">"Veličina fajla: <xliff:g id="SIZE">%1$s</xliff:g>"</string>
+ <string name="download_line4" msgid="8535996869722666525"></string>
+ <string name="download_line5" msgid="3069560415845295386">"Primanje fajla…"</string>
+ <string name="download_cancel" msgid="9177305996747500768">"Zaustavi"</string>
+ <string name="download_ok" msgid="5000360731674466039">"Sakrij"</string>
+ <string name="incoming_line1" msgid="2127419875681087545">"Šalje"</string>
+ <string name="incoming_line2" msgid="3348994249285315873">"Naziv fajla"</string>
+ <string name="incoming_line3" msgid="7954237069667474024">"Veličina"</string>
+ <string name="download_fail_line1" msgid="3846450148862894552">"Fajl nije primljen"</string>
+ <string name="download_fail_line2" msgid="8950394574689971071">"Fajl: <xliff:g id="FILE">%1$s</xliff:g>"</string>
+ <string name="download_fail_line3" msgid="3451040656154861722">"Razlog: <xliff:g id="REASON">%1$s</xliff:g>"</string>
+ <string name="download_fail_ok" msgid="1521733664438320300">"Uredu"</string>
+ <string name="download_succ_line5" msgid="4509944688281573595">"Fajl primljen"</string>
+ <string name="download_succ_ok" msgid="7053688246357050216">"Otvori"</string>
+ <string name="upload_line1" msgid="2055952074059709052">"Prima: \"<xliff:g id="RECIPIENT">%1$s</xliff:g>\""</string>
+ <string name="upload_line3" msgid="4920689672457037437">"Vrsta fajla: <xliff:g id="TYPE">%1$s</xliff:g> (<xliff:g id="SIZE">%2$s</xliff:g>)"</string>
+ <string name="upload_line5" msgid="7759322537674229752">"Slanje fajla…"</string>
+ <string name="upload_succ_line5" msgid="5687317197463383601">"Fajl poslan"</string>
+ <string name="upload_succ_ok" msgid="7705428476405478828">"Uredu"</string>
+ <string name="upload_fail_line1" msgid="7899394672421491701">"Fajl kojeg prima \"<xliff:g id="RECIPIENT">%1$s</xliff:g>\" nije poslan."</string>
+ <string name="upload_fail_line1_2" msgid="2108129204050841798">"Fajl: <xliff:g id="FILE">%1$s</xliff:g>"</string>
+ <string name="upload_fail_ok" msgid="5807702461606714296">"Pokušajte ponovo"</string>
+ <string name="upload_fail_cancel" msgid="9118496285835687125">"Zatvori"</string>
+ <string name="bt_error_btn_ok" msgid="5965151173011534240">"Uredu"</string>
+ <string name="unknown_file" msgid="6092727753965095366">"Nepoznat fajl"</string>
+ <string name="unknown_file_desc" msgid="480434281415453287">"Nema aplikacije za rukovanje ovom vrstom fajla. \n"</string>
+ <string name="not_exist_file" msgid="3489434189599716133">"Nema fajla"</string>
+ <string name="not_exist_file_desc" msgid="4059531573790529229">"Fajl ne postoji. \n"</string>
+ <string name="enabling_progress_title" msgid="436157952334723406">"Pričekajte…"</string>
+ <string name="enabling_progress_content" msgid="4601542238119927904">"Uključuje se Bluetooth…"</string>
+ <string name="bt_toast_1" msgid="972182708034353383">"Fajl će biti primljen. Pratite napredak u Ploči s obavještenjima."</string>
+ <string name="bt_toast_2" msgid="8602553334099066582">"Nije moguće primiti fajl."</string>
+ <string name="bt_toast_3" msgid="6707884165086862518">"Zaustavljeno primanje fajla kojeg šalje \"<xliff:g id="SENDER">%1$s</xliff:g>\""</string>
+ <string name="bt_toast_4" msgid="4678812947604395649">"Slanje fajla kojeg prima \"<xliff:g id="RECIPIENT">%1$s</xliff:g>\""</string>
+ <string name="bt_toast_5" msgid="2846870992823019494">"Slanje <xliff:g id="NUMBER">%1$s</xliff:g> fajl(ov)a, prima \"<xliff:g id="RECIPIENT">%2$s</xliff:g>\""</string>
+ <string name="bt_toast_6" msgid="1855266596936622458">"Zaustavljeno slanje fajla kojeg prima \"<xliff:g id="RECIPIENT">%1$s</xliff:g>\""</string>
+ <string name="bt_sm_2_1" product="nosdcard" msgid="352165168004521000">"Nema dovoljno prostora na USB pohrani da se sačuva fajl koji šalje \"<xliff:g id="SENDER">%1$s</xliff:g>\""</string>
+ <string name="bt_sm_2_1" product="default" msgid="1989018443456803630">"Nema dovoljno prostora na SD kartici da se sačuva fajl koji šalje \"<xliff:g id="SENDER">%1$s</xliff:g>\""</string>
+ <string name="bt_sm_2_2" msgid="2965243265852680543">"Potrebni prostor: <xliff:g id="SIZE">%1$s</xliff:g>"</string>
+ <string name="ErrorTooManyRequests" msgid="8578277541472944529">"Obrađuje se previše zahtjeva. Pokušajte ponovo kasnije."</string>
+ <string name="status_pending" msgid="2503691772030877944">"Prenošenje fajla još nije započelo."</string>
+ <string name="status_running" msgid="6562808920311008696">"Prenošenje fajla je u toku."</string>
+ <string name="status_success" msgid="239573225847565868">"Prenošenje fajla je uspješno dovršeno."</string>
+ <string name="status_not_accept" msgid="1695082417193780738">"Sadržaj nije podržan."</string>
+ <string name="status_forbidden" msgid="613956401054050725">"Ciljni uređaj je zabranio prenošenje."</string>
+ <string name="status_canceled" msgid="6664490318773098285">"Korisnik je otkazao prenošenje."</string>
+ <string name="status_file_error" msgid="3671917770630165299">"Problem s pohranom."</string>
+ <string name="status_no_sd_card" product="nosdcard" msgid="1112125377088421469">"Nema USB pohrane."</string>
+ <string name="status_no_sd_card" product="default" msgid="5760944071743325592">"Nema SD kartice. Umetnite SD karticu kako biste sačuvali prenesene fajlove."</string>
+ <string name="status_connection_error" msgid="947681831523219891">"Povezivanje nije uspjelo."</string>
+ <string name="status_protocol_error" msgid="3245444473429269539">"Nije moguće pravilno obraditi zahtjev."</string>
+ <string name="status_unknown_error" msgid="8156660554237824912">"Nepoznata greška."</string>
+ <string name="btopp_live_folder" msgid="7967791481444474554">"Primljeno preko Bluetootha"</string>
+ <string name="download_success" msgid="7036160438766730871">"<xliff:g id="FILE_SIZE">%1$s</xliff:g> Primanje završeno."</string>
+ <string name="upload_success" msgid="4014469387779648949">"<xliff:g id="FILE_SIZE">%1$s</xliff:g> Slanje dovršeno."</string>
+ <string name="inbound_history_title" msgid="6940914942271327563">"Dolazna prenošenja"</string>
+ <string name="outbound_history_title" msgid="4279418703178140526">"Odlazna prenošenja"</string>
+ <string name="no_transfers" msgid="3482965619151865672">"Historija prenošenja je prazna."</string>
+ <string name="transfer_clear_dlg_msg" msgid="1712376797268438075">"Sve stavke će biti izbrisane sa spiska."</string>
+ <string name="outbound_noti_title" msgid="8051906709452260849">"Bluetooth dijeljenje: Poslani fajlovi"</string>
+ <string name="inbound_noti_title" msgid="4143352641953027595">"Bluetooth dijeljenje: Primljeni fajlovi"</string>
+ <plurals name="noti_caption_unsuccessful" formatted="false" msgid="2020750076679526122">
+ <item quantity="one"><xliff:g id="UNSUCCESSFUL_NUMBER_1">%1$d</xliff:g> neuspješan.</item>
+ <item quantity="few"><xliff:g id="UNSUCCESSFUL_NUMBER_1">%1$d</xliff:g> neuspješna.</item>
+ <item quantity="other"><xliff:g id="UNSUCCESSFUL_NUMBER_1">%1$d</xliff:g> neuspješnih.</item>
+ </plurals>
+ <plurals name="noti_caption_success" formatted="false" msgid="1572472450257645181">
+ <item quantity="one"><xliff:g id="SUCCESSFUL_NUMBER_1">%1$d</xliff:g> uspješan, %2$s</item>
+ <item quantity="few"><xliff:g id="SUCCESSFUL_NUMBER_1">%1$d</xliff:g> uspješna, %2$s</item>
+ <item quantity="other"><xliff:g id="SUCCESSFUL_NUMBER_1">%1$d</xliff:g> uspješnih, %2$s</item>
+ </plurals>
+ <string name="transfer_menu_clear_all" msgid="790017462957873132">"Obriši spisak"</string>
+ <string name="transfer_menu_open" msgid="3368984869083107200">"Otvori"</string>
+ <string name="transfer_menu_clear" msgid="5854038118831427492">"Obriši sa spiska"</string>
+ <string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Obriši"</string>
+ <string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Sačuvaj"</string>
+ <string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Otkaži"</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Odaberite račune koje želite dijeliti preko Bluetootha. I dalje morate prihvatiti bilo koji pristup računima prilikom povezivanja."</string>
+ <string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Preostalo utora:"</string>
+ <string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Ikona aplikacije"</string>
+ <string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Postavke za dijeljenje Bluetooth poruka"</string>
+ <string name="bluetooth_map_settings_no_account_slots_left" msgid="1796029082612965251">"Nije moguće odabrati račun. Preostalo je 0 utora"</string>
+</resources>
diff --git a/res/values-bs-rBA/strings_pbap.xml b/res/values-bs-rBA/strings_pbap.xml
new file mode 100644
index 0000000..3030c23
--- /dev/null
+++ b/res/values-bs-rBA/strings_pbap.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="pbap_session_key_dialog_title" msgid="3580996574333882561">"Unesite ključ sesije za uređaj %1$s"</string>
+ <string name="pbap_session_key_dialog_header" msgid="2772472422782758981">"Neophodan je ključ za Bluetooth sesiju"</string>
+ <string name="pbap_acceptance_timeout_message" msgid="1107401415099814293">"Isteklo je vrijeme za prihvatanje veze sa uređajem %1$s"</string>
+ <string name="pbap_authentication_timeout_message" msgid="4166979525521902687">"Isteklo je vrijeme za unošenje ključa sesije sa uređajem %1$s"</string>
+ <string name="auth_notif_ticker" msgid="1575825798053163744">"Zahtjev za Obex provjeru vjerodostojnosti"</string>
+ <string name="auth_notif_title" msgid="7599854855681573258">"Ključ sesije"</string>
+ <string name="auth_notif_message" msgid="6667218116427605038">"Unesite ključ sesije za %1$s"</string>
+ <string name="defaultname" msgid="4821590500649090078">"Komplet za automobil"</string>
+ <string name="unknownName" msgid="2841414754740600042">"Nepoznato ime"</string>
+ <string name="localPhoneName" msgid="2349001318925409159">"Moje ime"</string>
+ <string name="defaultnumber" msgid="8520116145890867338">"000000"</string>
+</resources>
diff --git a/res/values-bs-rBA/strings_sap.xml b/res/values-bs-rBA/strings_sap.xml
new file mode 100644
index 0000000..ab906d4
--- /dev/null
+++ b/res/values-bs-rBA/strings_sap.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="bluetooth_sap_notif_title" msgid="6877860822993195074">"Bluetooth pristup SIM-u"</string>
+ <string name="bluetooth_sap_notif_ticker" msgid="6807778527893726699">"Bluetooth pristup SIM-u"</string>
+ <string name="bluetooth_sap_notif_message" msgid="7138657801087500690">"Tražiti od klijenta da prekine vezu?"</string>
+ <string name="bluetooth_sap_notif_disconnecting" msgid="819150843490233288">"Čeka se da klijent prekine vezu"</string>
+ <string name="bluetooth_sap_notif_disconnect_button" msgid="3678476872583356919">"Prekini vezu"</string>
+ <string name="bluetooth_sap_notif_force_disconnect_button" msgid="8144086340185532030">"Prisilno prekini vezu"</string>
+</resources>
diff --git a/res/values-bs-rBA/test_strings.xml b/res/values-bs-rBA/test_strings.xml
new file mode 100644
index 0000000..0d40a91
--- /dev/null
+++ b/res/values-bs-rBA/test_strings.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="hello" msgid="1740533743008967039">"Hello World, TestActivity"</string>
+ <string name="app_name" msgid="1203877025577761792">"Bluetooth dijeljenje"</string>
+ <string name="insert_record" msgid="1450997173838378132">"Umetni zapis"</string>
+ <string name="update_record" msgid="2480425402384910635">"Potvrdi zapis"</string>
+ <string name="ack_record" msgid="6716152390978472184">"Evidencija Ack"</string>
+ <string name="deleteAll_record" msgid="4383349788485210582">"Izbriši svu evidenciju"</string>
+ <string name="ok_button" msgid="6519033415223065454">"Uredu"</string>
+ <string name="delete_record" msgid="4645040331967533724">"Izbriši evidenciju"</string>
+ <string name="start_server" msgid="9034821924409165795">"Pokreni TCP server"</string>
+ <string name="notify_server" msgid="4369106744022969655">"Obavijesti TCP server"</string>
+</resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 9bff9fb..4967b04 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Accepta"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"D\'acord"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"S\'ha esgotat el temps d\'espera mentre s\'acceptava un fitxer entrant de \"<xliff:g id="SENDER">%1$s</xliff:g>\""</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth: fitxer entrant"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Vols rebre aquest fitxer?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Està entrant un fitxer d\'un altre dispositiu. Confirma que vols rebre el fitxer."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Fitxer entrant"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> ja pot enviar <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth: s\'està rebent <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetooth: <xliff:g id="FILE">%1$s</xliff:g> rebut"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth: <xliff:g id="FILE">%1$s</xliff:g> no rebut"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Esborra"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Desa"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Cancel·la"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Selecciona els comptes que vulguis compartir mitjançant el Bluetooth. Cal que acceptis l\'accés als comptes en connectar-t\'hi."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Selecciona els comptes que vulguis compartir mitjançant el Bluetooth. Cal que acceptis l\'accés als comptes en connectar-t\'hi."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Espais que queden:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Icona d\'aplicació"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Configuració per compartir missatges mitjançant el Bluetooth"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 07b92ce..e5efdbd 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Přijmout"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Při příjmu příchozího souboru od uživatele <xliff:g id="SENDER">%1$s</xliff:g> vypršel časový limit."</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Sdílení Bluetooth: Příchozí soubor"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Chcete tento soubor přijmout?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Potvrďte prosím příjem příchozího souboru z jiného zařízení."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Příchozí soubor"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> – odeslání souboru <xliff:g id="FILE">%2$s</xliff:g> je připraveno"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Sdílení Bluetooth: Příjem souboru <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Sdílení Bluetooth: Soubor <xliff:g id="FILE">%1$s</xliff:g> byl přijat"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Sdílení Bluetooth: Soubor <xliff:g id="FILE">%1$s</xliff:g> nebyl přijat"</string>
@@ -128,7 +127,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Vymazat"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Uložit"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Zrušit"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Vyberte účty, které chcete sdílet prostřednictvím rozhraní Bluetooth. Při připojování bude třeba přístup k účtům i nadále schvalovat."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Vyberte účty, které chcete sdílet prostřednictvím rozhraní Bluetooth. Při připojování budete přístup k účtům muset i nadále schválit."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Zbývající sloty:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Ikona aplikace"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Nastavení sdílení zpráv přes Bluetooth"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index ea8c200..9d4661b 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Accepter"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Der opstod timeout ved modtagelse af indgående fil fra \"<xliff:g id="SENDER">%1$s</xliff:g>\""</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth-deling: indgående fil"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"VIl du modtage denne fil?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Indgående fil fra en anden enhed. Bekræft, at du vil modtage denne fil."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Indgående fil"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> er klar til at sende <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth-deling: Modtager <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetooth-deling: Modtog <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth-deling: Filen <xliff:g id="FILE">%1$s</xliff:g> blev ikke modtaget"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Ryd"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Gem"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Annuller"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Vælg de konti, du vil dele via Bluetooth. Du skal stadig acceptere adgang til kontiene, når du opretter forbindelse."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Vælg de konti, du vil dele via Bluetooth. Du skal stadig acceptere adgang til kontiene, når du opretter forbindelse."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Pladser tilbage:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Appens ikon"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Indstillinger for beskeddeling via Bluetooth"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 288a776..9165575 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Akzeptieren"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Die Zeit zum Empfang der eingehenden Datei von \"<xliff:g id="SENDER">%1$s</xliff:g>\" ist abgelaufen."</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth-Freigabe: Eingehende Datei"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Möchtest du diese Datei empfangen?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Ein anderes Gerät versucht, eine Datei zu übertragen. Bestätige, dass du diese Datei empfangen möchtest."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Eingehende Datei"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> kann jetzt <xliff:g id="FILE">%2$s</xliff:g> senden."</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth-Freigabe: <xliff:g id="FILE">%1$s</xliff:g> wird empfangen"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetooth-Freigabe: <xliff:g id="FILE">%1$s</xliff:g> wurde empfangen"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth-Freigabe: <xliff:g id="FILE">%1$s</xliff:g> wurde nicht empfangen"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Löschen"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Speichern"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Abbrechen"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Wähle die Konten aus, die du über Bluetooth freigeben möchtest. Du musst jedoch weiterhin jedem Zugriff auf die Konten zustimmen, wenn eine Verbindung hergestellt wird."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Wähle die Konten aus, die du über Bluetooth freigeben möchtest. Du musst jedoch weiterhin jedem Zugriff auf die Konten zustimmen, wenn eine Verbindung hergestellt wird."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Plätze frei:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"App-Symbol"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Einstellungen zur Bluetooth-Nachrichtenfreigabe"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 170e381..8be04ae 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Αποδοχή"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Σημειώθηκε διακοπή κατά την αποδοχή ενός εισερχόμενου αρχείου από τον αποστολέα \"<xliff:g id="SENDER">%1$s</xliff:g>\""</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Κοινή χρήση μέσω Bluetooth: Εισερχόμενο αρχείο"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Θέλετε να λάβετε αυτό το αρχείο;"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Εισερχόμενο αρχείο από άλλη συσκευή. Επιβεβαιώστε ότι θέλετε να λάβετε αυτό το αρχείο."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Εισερχόμενο αρχείο"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"Ο χρήστης <xliff:g id="SENDER">%1$s</xliff:g> πρόκειται να στείλει το αρχείο <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Κοινή χρήση μέσω Bluetooth: Λήψη του <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Κοινή χρήση μέσω Bluetooth: Ελήφθη το <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Κοινή χρήση μέσω Bluetooth: Το αρχείο <xliff:g id="FILE">%1$s</xliff:g> δεν ελήφθη"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Διαγραφή"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Αποθήκευση"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Ακύρωση"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Επιλέξτε τους λογαριασμούς που θέλετε να μοιραστείτε μέσω Bluetooth. Θα πρέπει ακόμη να αποδεχτείτε τυχόν αιτήματα πρόσβασης στους λογαριασμούς κατά τη σύνδεση."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Επιλέξτε τους λογαριασμούς που θέλετε να μοιραστείτε μέσω Bluetooth. Θα πρέπει ακόμη να αποδεχτείτε τυχόν αιτήματα πρόσβασης στους λογαριασμούς κατά τη σύνδεση."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Υποδοχές που απομένουν:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Εικονίδιο εφαρμογής"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Ρυθμίσεις κοινής χρήσης μηνυμάτων μέσω Bluetooth"</string>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index e200e4a..b432341 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Accept"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"There was a timeout while accepting an incoming file from \"<xliff:g id="SENDER">%1$s</xliff:g>\""</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth share: Incoming file"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Do you want to receive this file?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Incoming file from another device. Confirm that you want to receive this file."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Incoming file"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> is ready to send <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth share: Receiving <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetooth share: Received <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth share: File <xliff:g id="FILE">%1$s</xliff:g> not received"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Clear"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Save"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Cancel"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Select the accounts that you want to share through Bluetooth. You still have to accept any access to the accounts when connecting."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Select the accounts that you want to share through Bluetooth. You still have to accept any access to the accounts when connecting."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Slots left:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Application Icon"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Bluetooth Message Sharing Settings"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index e200e4a..b432341 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Accept"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"There was a timeout while accepting an incoming file from \"<xliff:g id="SENDER">%1$s</xliff:g>\""</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth share: Incoming file"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Do you want to receive this file?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Incoming file from another device. Confirm that you want to receive this file."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Incoming file"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> is ready to send <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth share: Receiving <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetooth share: Received <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth share: File <xliff:g id="FILE">%1$s</xliff:g> not received"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Clear"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Save"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Cancel"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Select the accounts that you want to share through Bluetooth. You still have to accept any access to the accounts when connecting."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Select the accounts that you want to share through Bluetooth. You still have to accept any access to the accounts when connecting."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Slots left:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Application Icon"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Bluetooth Message Sharing Settings"</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index e200e4a..b432341 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Accept"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"There was a timeout while accepting an incoming file from \"<xliff:g id="SENDER">%1$s</xliff:g>\""</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth share: Incoming file"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Do you want to receive this file?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Incoming file from another device. Confirm that you want to receive this file."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Incoming file"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> is ready to send <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth share: Receiving <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetooth share: Received <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth share: File <xliff:g id="FILE">%1$s</xliff:g> not received"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Clear"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Save"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Cancel"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Select the accounts that you want to share through Bluetooth. You still have to accept any access to the accounts when connecting."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Select the accounts that you want to share through Bluetooth. You still have to accept any access to the accounts when connecting."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Slots left:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Application Icon"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Bluetooth Message Sharing Settings"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 7bd205a..bdcfb78 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Aceptar"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"Aceptar"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Tiempo de espera agotado al aceptar un archivo entrante de \"<xliff:g id="SENDER">%1$s</xliff:g>\""</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Compartir por Bluetooth: Archivo entrante"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"¿Quieres recibir este archivo?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Hay un archivo entrante de otro dispositivo. Confirma que quieres recibirlo."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Archivo entrante"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> está listo para enviar <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth: recibiendo <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetooth: <xliff:g id="FILE">%1$s</xliff:g> recibido"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth: no se recibió el archivo <xliff:g id="FILE">%1$s</xliff:g>"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Eliminar"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Guardar"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Cancelar"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Selecciona las cuentas que deseas compartir a través de Bluetooth. Al conectarte, tendrás que aceptar cualquier acceso a las cuentas."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Selecciona las cuentas que deseas compartir mediante Bluetooth. Al conectarte, tendrás que aceptar cualquier acceso a las cuentas."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Espacios restantes:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Ícono de la aplicación"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Configuración de mensajes compartidos por Bluetooth"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index b9d08b8..b3db4c0 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Aceptar"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"Aceptar"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Se ha agotado el tiempo para aceptar el archivo entrante de \"<xliff:g id="SENDER">%1$s</xliff:g>\"."</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth: archivo entrante"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"¿Quieres recibir este archivo?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Otro dispositivo quiere enviarte un archivo. Confirma que quieres recibirlo."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Archivo entrante"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> ya puede enviar <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth: recibiendo <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Compartir con Bluetooth: <xliff:g id="FILE">%1$s</xliff:g> recibido"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth: <xliff:g id="FILE">%1$s</xliff:g> no recibido"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Borrar"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Guardar"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Cancelar"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Selecciona las cuentas que quieras compartir por Bluetooth. Tendrás que aceptar cualquier acceso a las cuentas al establecer conexión."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Selecciona las cuentas que quieras compartir por Bluetooth. Tendrás que aceptar cualquier acceso a las cuentas al establecer conexión."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Ranuras libres:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Icono de aplicación"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Ajustes de mensajes compartidos por Bluetooth"</string>
diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml
index a60d4b8..37bcf4b 100644
--- a/res/values-et-rEE/strings.xml
+++ b/res/values-et-rEE/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Nõustun"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Esines ajalõpp sissetuleva faili aktsepteerimisel saatjalt „<xliff:g id="SENDER">%1$s</xliff:g>”"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetoothi jagamine: sissetulev fail"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Kas soovite selle faili vastu võtta?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Sissetulev fail teisest seadmest. Kinnitage, et soovite selle faili vastu võtta."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Sissetulev fail"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"Saatja <xliff:g id="SENDER">%1$s</xliff:g> on faili <xliff:g id="FILE">%2$s</xliff:g> saatmiseks valmis"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetoothi jagamine: faili <xliff:g id="FILE">%1$s</xliff:g> vastuvõtmine"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetoothi jagamine: <xliff:g id="FILE">%1$s</xliff:g> vastu võetud"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetoothi jagamine: faili <xliff:g id="FILE">%1$s</xliff:g> pole saadud"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Kustuta"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Salvesta"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Tühista"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Valige kontod, mida soovite Bluetoothi kaudu jagada. Ühendamisel peate ikka lubama mis tahes juurdepääsu kontodele."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Valige kontod, mida soovite Bluetoothi kaudu jagada. Ühendamisel peate ikka lubama mis tahes juurdepääsu kontodele."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Järelejäänud vabu kohti:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Rakenduse ikoon"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Bluetoothi sõnumi jagamise seaded"</string>
diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml
index 95b7b4f..0947a3a 100644
--- a/res/values-eu-rES/strings.xml
+++ b/res/values-eu-rES/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Onartu"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"Ados"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"\"<xliff:g id="SENDER">%1$s</xliff:g>\" igorlearen sarrerako fitxategia onartzeko denbora-muga gainditu da"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth bidezko partekatzea: sarrerako fitxategia"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Fitxategi hau jaso nahi duzu?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Sarrerako fitxategi bat bidali dizute beste gailu batetik. Berretsi fitxategia jaso nahi duzun."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Sarrerako fitxategia"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> prest dago <xliff:g id="FILE">%2$s</xliff:g> bidaltzeko"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth bidezko partekatzea: <xliff:g id="FILE">%1$s</xliff:g> fitxategia jasotzen"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetooth bidezko partekatzea: <xliff:g id="FILE">%1$s</xliff:g> fitxategia jaso da"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth bidezko partekatzea: ez da <xliff:g id="FILE">%1$s</xliff:g> fitxategia jaso"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Garbitu"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Gorde"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Utzi"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Hautatu Bluetooth bidez partekatu nahi dituzun kontuak. Konektatzean, kontuetarako sarbidea eman behar duzu."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Hautatu Bluetooth bidez partekatu nahi dituzun kontuak. Konektatzean, berariaz eman beharko duzu kontuetarako sarbidea."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Geratzen diren erretenak:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Aplikazioaren ikonoa"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Bluetooth bidez mezuak partekatzeko ezarpenak"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index e462696..5c11b0e 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"پذیرفتن"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"تأیید"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"هنگام پذیرش یک فایل ورودی از \"<xliff:g id="SENDER">%1$s</xliff:g>\" وقفه زمانی پیش آمد"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"اشتراک بلوتوث: فایل ورودی"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"آیا میخواهید این فایل را دریافت کنید؟"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"فایل ورودی از یک دستگاه دیگر. لطفاً تأیید کنید که میخواهید این فایل را دریافت کنید."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"فایل ورودی"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> آماده ارسال <xliff:g id="FILE">%2$s</xliff:g> است"</string>
<string name="notification_receiving" msgid="4674648179652543984">"اشتراک بلوتوث: در حال دریافت <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"اشتراک بلوتوث: <xliff:g id="FILE">%1$s</xliff:g> دریافت شد"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"اشتراک بلوتوث: فایل <xliff:g id="FILE">%1$s</xliff:g>دریافت نشد"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"پاک کردن"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"ذخیره"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"لغو"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"حسابهایی را انتخاب کنید که میخواهید از طریق بلوتوث به اشتراک بگذارید. هنگام اتصال، همچنان باید با هر گونه دسترسی به حسابها موافقت کنید."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"حسابهایی را انتخاب کنید که میخواهید از طریق بلوتوث به اشتراک بگذارید. هنگام اتصال، همچنان باید با هر گونه دسترسی به حسابها موافقت کنید."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"شیارهای باقیمانده:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"نماد برنامه"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"تنظیمات اشتراکگذاری پیام بلوتوث"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 3aa4527..0bdd1c1 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Hyväksy"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Yhteys aikakatkaistiin vastaanotettaessa tiedostoa lähettäjältä <xliff:g id="SENDER">%1$s</xliff:g>"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth-jako: Saapuva tiedosto"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Haluatko vastaanottaa tämän tiedoston?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Toinen laite lähettää tiedostoa. Vahvista, että haluat vastaanottaa tämän tiedoston."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Saapuva tiedosto"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> on valmis lähettämään kohteen <xliff:g id="FILE">%2$s</xliff:g>."</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth-jako: vastaanotetaan tiedostoa <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetooth-jako: <xliff:g id="FILE">%1$s</xliff:g> vastaanotettu"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth-jako: tiedostoa <xliff:g id="FILE">%1$s</xliff:g> ei vastaanotettu"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Poista"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Tallenna"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Peruuta"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Valitse, mitkä tilit haluat jakaa Bluetoothin kautta. Tilien käyttöoikeus pitää silti hyväksyä yhdistettäessä."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Valitse tilit, jotka haluat jakaa Bluetoothin kautta. Tilien käyttöoikeus pitää silti hyväksyä yhdistettäessä."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Paikkoja jäljellä:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Sovelluskuvake"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Bluetoothin viestinjakoasetukset"</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 6295749..9c7c076 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Accepter"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Expiration du délai de réception du fichier de \"<xliff:g id="SENDER">%1$s</xliff:g>\""</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Partage Bluetooth : réception de fichier"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Voulez-vous recevoir ce fichier?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Fichier entrant provenant d\'un autre appareil. Confirmez que vous souhaitez recevoir ce fichier."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Fichier entrant"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> est prêt à envoyer le fichier « <xliff:g id="FILE">%2$s</xliff:g> »"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Partage Bluetooth : réception de <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Partage Bluetooth : <xliff:g id="FILE">%1$s</xliff:g> reçu(s)"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Partage Bluetooth : fichier <xliff:g id="FILE">%1$s</xliff:g> non reçu"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Effacer"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Enregistrer"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Annuler"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Sélectionnez les comptes que vous souhaitez partager par Bluetooth. Vous devez toujours accepter l\'accès à ces comptes lors de la connexion."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Sélectionnez les comptes que vous souhaitez partager par Bluetooth. Vous devez toujours accepter l\'accès à ces comptes lors de la connexion."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Espaces libres :"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Icône de l\'application"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Paramètres de partage des messages par Bluetooth"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 53c87fb..1adfff0 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Accepter"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Expiration du délai de réception du fichier de \"<xliff:g id="SENDER">%1$s</xliff:g>\""</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Partage Bluetooth : réception de fichier"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Voulez-vous recevoir ce fichier ?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Fichier entrant provenant d\'un autre appareil. Confirmez que vous souhaitez recevoir ce fichier."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Fichier entrant"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> est prêt à envoyer le fichier \"<xliff:g id="FILE">%2$s</xliff:g>\"."</string>
<string name="notification_receiving" msgid="4674648179652543984">"Partage Bluetooth : réception de <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Partage Bluetooth : <xliff:g id="FILE">%1$s</xliff:g> reçu"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Partage Bluetooth : fichier <xliff:g id="FILE">%1$s</xliff:g> non reçu"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Effacer"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Enregistrer"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Annuler"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Sélectionnez les comptes que vous voulez partager via le Bluetooth. Vous devez toujours accepter l\'accès à ces comptes lors de la connexion."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Sélectionnez les comptes que vous voulez partager via le Bluetooth. Vous devez toujours accepter l\'accès à ces comptes lors de la connexion."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Espaces libres :"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Icône de l\'application"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Paramètres de partage de la messagerie via le Bluetooth"</string>
diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml
index bb57651..5168ba4 100644
--- a/res/values-gl-rES/strings.xml
+++ b/res/values-gl-rES/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Aceptar"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"Aceptar"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Superouse o tempo de espera mentres se aceptaba un ficheiro entrante de \"<xliff:g id="SENDER">%1$s</xliff:g>\""</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Uso compartido por Bluetooth: ficheiro entrante"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Queres recibir este ficheiro?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Ficheiro entrante doutro dispositivo. Confirma que queres recibir este ficheiro."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Ficheiro entrante"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> está listo para enviar <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Uso compartido por Bluetooth: recibindo <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Uso compartido por Bluetooth: <xliff:g id="FILE">%1$s</xliff:g> recibido"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Uso compartido por Bluetooth: ficheiro <xliff:g id="FILE">%1$s</xliff:g> non recibido"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Borrar"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Gardar"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Cancelar"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Selecciona as contas que queres compartir a través de Bluetooth. Tes que aceptar o acceso ás contas cando te conectes."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Selecciona as contas que queres compartir a través de Bluetooth. Aínda así, tes que aceptar o acceso ás contas cando te conectes."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Rañuras restantes:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Icona da aplicación"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Configuración de mensaxes compartidas por Bluetooth"</string>
diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml
index f9ef2cb..dcea24f 100644
--- a/res/values-gu-rIN/strings.xml
+++ b/res/values-gu-rIN/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"સ્વીકારો"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"ઑકે"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"\"<xliff:g id="SENDER">%1$s</xliff:g>\" તરફની એક આવનારી ફાઇલ સ્વીકારતી વખતે સમયસમાપ્તિ થઈ હતી"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth શેર: આવનરી ફાઇલો"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"શું તમે આ ફાઇલ પ્રાપ્ત કરવા માંગો છો?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"બીજા ઉપકરણથી આવનારી ફાઇલ. પુષ્ટિ કરો કે તમે આ ફાઇલ પ્રાપ્ત કરવા માંગો છો."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"આવનારી ફાઇલ"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g>, <xliff:g id="FILE">%2$s</xliff:g> મોકલવા માટે તૈયાર છે"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth શેર: <xliff:g id="FILE">%1$s</xliff:g> પ્રાપ્ત કરી રહ્યું છે"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetooth શેર: <xliff:g id="FILE">%1$s</xliff:g> પ્રાપ્ત"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth શેર: ફાઇલ <xliff:g id="FILE">%1$s</xliff:g> પ્રાપ્ત થઈ નથી"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"સાફ કરો"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"સાચવો"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"રદ કરો"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"તમે Bluetooth મારફતે શેર કરવા માગતા હો તે એકાઉન્ટ્સ પસંદ કરો. તમારે હજી પણ કનેક્ટ કરતી વખતે એકાઉન્ટ્સ પરની કોઈપણ અૅક્સેસ સ્વીકારવી પડશે."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"તમે Bluetooth મારફતે શેર કરવા માગતા હો તે એકાઉન્ટ્સ પસંદ કરો. તમારે હજી પણ કનેક્ટ કરતી વખતે એકાઉન્ટ્સ પરની કોઈપણ અૅક્સેસ સ્વીકારવી પડશે."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"સ્લોટ્સ બાકી:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"એપ્લિકેશન આયકન"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Bluetooth સંદેશ શેરિંગ સેટિંગ્સ"</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 585fc5a..f6cacb4 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"स्वीकारें"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"ठीक है"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"\"<xliff:g id="SENDER">%1$s</xliff:g>\" से आने वाली फ़ाइल स्वीकार करते समय समयबाह्य हुआ."</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"ब्लूटूथ शेयर: आने वाली फ़ाइल"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"क्या आप यह फ़ाइल प्राप्त करना चाहते हैं?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"दूसरे डिवाइस से कोई फ़ाइल आ रही है. सुनिश्चित करें कि आप यह फ़ाइल प्राप्त करना चाहते हैं."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"आवक फ़ाइल"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> <xliff:g id="FILE">%2$s</xliff:g> भेजने के लिए तैयार है"</string>
<string name="notification_receiving" msgid="4674648179652543984">"ब्लूटूथ शेयर: <xliff:g id="FILE">%1$s</xliff:g> प्राप्त कर रहा है"</string>
<string name="notification_received" msgid="3324588019186687985">"ब्लूटूथ शेयर: <xliff:g id="FILE">%1$s</xliff:g> प्राप्त"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"ब्लूटूथ शेयर: फ़ाइल <xliff:g id="FILE">%1$s</xliff:g> प्राप्त नहीं हुई"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"साफ़ करें"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"सहेजें"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"अभी नहीं"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"वे खाते चुनें जिन्हें आप ब्लूटूथ के द्वारा साझा करना चाहते हैं. आपको अभी भी कनेक्ट करते समय खातों की सभी ऐक्सेस को स्वीकार करना होगा."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"वे खाते चुनें जिन्हें आप ब्लूटूथ के माध्यम से साझा करना चाहते हैं. आपको अभी भी कनेक्ट करते समय खातों के किसी भी एक्सेस को स्वीकार करना होगा."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"शेष स्लॉट:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"ऐप्लिकेशन आइकन"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"ब्लूटूथ संदेश साझाकरण सेटिंग"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 2bff6d3..8988708 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Prihvaćam"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"U redu"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Za vrijeme primanja datoteke koju šalje \"<xliff:g id="SENDER">%1$s</xliff:g>\" došlo je do privremenog prekida"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth dijeljenje: dolazna datoteka"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Želite li primiti ovu datoteku?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Dolazna datoteka s drugog uređaja. Potvrdite da želite primiti tu datoteku."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Dolazna datoteka"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> može poslati datoteku <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Dijeljenje Bluetoothom: Primanje datoteke <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Dijeljenje Bluetoothom: Primljena datoteka <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Dijeljenje Bluetoothom: Datoteka <xliff:g id="FILE">%1$s</xliff:g> nije primljena"</string>
@@ -126,7 +125,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Brisanje"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Spremi"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Odustani"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Odaberite račune koje želite dijeliti putem Bluetootha. I dalje morate prihvatiti svako pristupanje računima prilikom povezivanja."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Odaberite račune koje želite dijeliti putem Bluetootha. I dalje morate prihvatiti svako pristupanje računima prilikom povezivanja."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Preostala mjesta:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Ikona aplikacije"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Postavke dijeljenja poruka putem Bluetootha"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 7b75859..1ce8dec 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Fogadás"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Időtúllépés történt \"<xliff:g id="SENDER">%1$s</xliff:g>\" feladótól érkező fájl fogadása során"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth-megosztás: beérkező fájl"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Szeretné fogadni ezt a fájlt?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Fájl érkezik egy másik készülékről. Erősítse meg, hogy szeretné megkapni ezt a fájlt."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Beérkező fájl"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> készen áll a következő küldésére: <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth megosztás: <xliff:g id="FILE">%1$s</xliff:g> fogadása"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetooth megosztás: <xliff:g id="FILE">%1$s</xliff:g> fogadva"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth megosztás: <xliff:g id="FILE">%1$s</xliff:g> fájl fogadása nem sikerült"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Törlés"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Mentés"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Mégse"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Válassza ki a Bluetooth használatával megosztani kívánt fiókokat. Kapcsolódásnál még mindig el kell fogadnia a fiókokhoz való hozzáférést."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Válassza ki a Bluetooth használatával megosztani kívánt fiókokat. Kapcsolódásnál el kell fogadnia a fiókokhoz való hozzáférést is."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Szabadon maradt helyek száma:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Alkalmazás ikonja"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Bluetooth-kapcsolaton keresztüli üzenetmegosztás beállításai"</string>
diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml
index 412f909..ab63740 100644
--- a/res/values-hy-rAM/strings.xml
+++ b/res/values-hy-rAM/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Ընդունել"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"Լավ"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"«<xliff:g id="SENDER">%1$s</xliff:g>»-ից մուտքային ֆայլի ընդունման ժամանակը սպառվեց"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth համօգտագործում՝ մուտքային ֆայլ"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Ցանկանո՞ւմ եք ստանալ այս ֆայլը:"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Առկա է մուտքային ֆայլ այլ սարքից: Հաստատեք, որ ցանկանում եք ստանալ այս ֆայլը:"</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Մուտքային ֆայլ"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g>-ը պատրաստ է ուղարկելու <xliff:g id="FILE">%2$s</xliff:g> ֆայլը"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth համօգտագործում՝ <xliff:g id="FILE">%1$s</xliff:g>-ը ստացվում է"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetooth համօգտագործում՝ ստացվեց <xliff:g id="FILE">%1$s</xliff:g>-ը"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth համօգտագործում՝ <xliff:g id="FILE">%1$s</xliff:g> ֆայլը չի ստացվել"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Ջնջել"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Պահել"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Չեղարկել"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Ընտրեք հաշիվները, որոնք ցանկանում եք համօգտագործել Bluetooth-ի միջոցով: Ամեն դեպքում, կապակցվելիս պետք է ընդունեք հաշիվներն օգտագործելու թույլտվությունը:"</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Ընտրեք հաշիվները, որոնք ցանկանում եք հասանելի դարձնել Bluetooth-ի միջոցով: Ամեն դեպքում, կապակցվելիս պետք է ընդունեք հաշիվներն օգտագործելու թույլտվությունը:"</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Մնացած տողերի քանակը՝"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Հավելվածի պատկերակը"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Հաղորդագրությունների համօգտագործման Bluetooth-ի կարգավորումներ"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index a44f100..5d68b9e 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Terima"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"Oke"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Terjadi waktu tunggu saat menerima file masuk dari \"<xliff:g id="SENDER">%1$s</xliff:g>\""</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Berbagi bluetooth: File masuk"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Apakah Anda ingin menerima file ini?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"File masuk dari perangkat lain. Konfirmasikan bahwa Anda ingin menerima file ini."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"File masuk"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> siap mengirim <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Berbagi Bluetooth: Menerima <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Berbagi Bluetooth: Telah menerima <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Berbagi Bluetooth: File <xliff:g id="FILE">%1$s</xliff:g> tidak diterima"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Hapus"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Simpan"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Batal"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Pilih akun yang ingin Anda bagikan melalui Bluetooth. Anda harus menerima akses apa pun ke akun saat menyambungkan."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Pilih akun yang ingin Anda bagikan melalui Bluetooth. Anda masih harus menerima akses apa pun ke akun saat menghubungkan."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Sisa Slot:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Ikon Aplikasi"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Setelan Berbagi Pesan Bluetooth"</string>
diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml
index 86116ea..b25dd8e 100644
--- a/res/values-is-rIS/strings.xml
+++ b/res/values-is-rIS/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Samþykkja"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"Í lagi"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Rann út á tíma við að samþykkja skrá sem „<xliff:g id="SENDER">%1$s</xliff:g>“ sendi"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth-deiling: Skrá berst"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Viltu taka á móti þessari skrá?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Skrá berst frá öðru tæki. Staðfestu að þú viljir taka á móti þessari skrá."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Skrá á innleið"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> er tilbúin(n) að senda <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth-deiling: Tekur á móti <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetooth-deiling: Skráin <xliff:g id="FILE">%1$s</xliff:g> var móttekin"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth-deiling: Skráin <xliff:g id="FILE">%1$s</xliff:g> var ekki móttekin"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Hreinsa"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Vista"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Hætta við"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Veldu reikningana sem þú vilt deila í gegnum Bluetooth. Þú þarft samt að samþykkja allan aðgang að reikningunum við tengingu."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Veldu reikningana sem þú vilt deila í gegnum Bluetooth. Þú þarft samt að samþykkja allan aðgang að reikningunum við tengingu."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Hólf eftir:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Forritstákn"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Deilingarstillingar Bluetooth-skilaboða"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index d141c51..8995c8a 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Accetta"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Si è verificato un timeout durante l\'accettazione di un file in arrivo da \"<xliff:g id="SENDER">%1$s</xliff:g>\""</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth: file in arrivo"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Vuoi ricevere questo file?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"File in arrivo da un altro dispositivo. Conferma che vuoi ricevere il file."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"File in arrivo"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> è pronto per inviare <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth: ricezione <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetooth: <xliff:g id="FILE">%1$s</xliff:g> ricevuto"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth: file <xliff:g id="FILE">%1$s</xliff:g> non ricevuto"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Cancella"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Salva"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Annulla"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Seleziona gli account che desideri condividere tramite Bluetooth. Devi comunque accettare tutti gli accessi agli account durante la connessione."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Seleziona gli account che desideri condividere tramite Bluetooth. Devi comunque accettare tutti gli accessi agli account durante la connessione."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Slot rimanenti:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Icona applicazione"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Impostazioni di condivisione dei messaggi Bluetooth"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 0da2b69..90db58b 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"קבל"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"אישור"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"תם הזמן הקצוב לקבלת קובץ נכנס מאת \"<xliff:g id="SENDER">%1$s</xliff:g>\""</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"שיתוף Bluetooth: קובץ נכנס"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"האם ברצונך לקבל קובץ זה?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"מכשיר אחר שולח אליך קובץ. אשר את קבלת הקובץ."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"קובץ שהתקבל"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> מוכן לשלוח את <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"שיתוף Bluetooth: מקבל את <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"שיתוף Bluetooth: התקבל <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"שיתוף Bluetooth: הקובץ <xliff:g id="FILE">%1$s</xliff:g> לא התקבל"</string>
@@ -128,7 +127,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"נקה"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"שמור"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"בטל"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"בחר את חשבונות שברצונך לשתף באמצעות Bluetooth. עדיין יהיה עליך לאשר גישה אל החשבונות בעת החיבור."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"בחר בחשבונות שברצונך לשתף באמצעות Bluetooth. עדיין יהיה עליך לאשר גישה אל החשבונות בעת החיבור."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"מקומות נותרים:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"סמל אפליקציה"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"הגדרות לשיתוף הודעות ב-Bluetooth"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 4e5a5f7..16856da 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"承諾"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"「<xliff:g id="SENDER">%1$s</xliff:g>」からのファイル受信中に接続がタイムアウトしました"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth共有: ファイル着信"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"このファイルを受信しますか?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"別の端末からファイルが着信しました。このファイルを受信するかどうか確認してください。"</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"着信ファイル"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g>さんが<xliff:g id="FILE">%2$s</xliff:g>を送信できるようになりました"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth共有: <xliff:g id="FILE">%1$s</xliff:g>を受信中"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetooth共有: <xliff:g id="FILE">%1$s</xliff:g>を受信済み"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth共有: ファイル<xliff:g id="FILE">%1$s</xliff:g>の受信に失敗"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"消去"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"保存"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"キャンセル"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Bluetoothを介して共有するアカウントを選択してください。接続中はアカウントへのアクセスをすべて承認する必要があります。"</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Bluetooth を介して共有するアカウントを選択してください。接続中はアカウントへのアクセスをすべて承認する必要があります。"</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"残りスロット数:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"アプリアイコン"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Bluetoothメッセージ共有の設定"</string>
diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml
index 7067f38..77bdfaf 100644
--- a/res/values-ka-rGE/strings.xml
+++ b/res/values-ka-rGE/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"მიღება"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"კარგი"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"„<xliff:g id="SENDER">%1$s</xliff:g>“-გან ფაილის შემომავალი ფაილის მიღების დრო ამოიწურა"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth გაზიარება: შემომავალი ფაილი"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"გსურთ ამ ფაილის მიღება?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"შემომავალი ფაილი სხვა მოწყობილობიდან. დაადასტურეთ, რომ გსურთ ფაილის მიღება."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"შემომავალი ფაილი"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> მზად არის <xliff:g id="FILE">%2$s</xliff:g>-ის გასაგზავნად"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth გაზიარება: <xliff:g id="FILE">%1$s</xliff:g> ფაილის მიღება"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetooth გაზიარება: მიღებულია <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth გაზიარება: ფაილი <xliff:g id="FILE">%1$s</xliff:g> არ მიღებულა"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"ამოშლა"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"შენახვა"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"გაუქმება"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"აირჩიეთ ანგარიშები, რომელთა გაზიარებაც გსურთ Bluetooth-ის მეშვეობით. ანგარიშებზე ნებისმიერი წვდომის დადასტურება მაინც მოგიწევთ დაკავშირებისას."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"აირჩიეთ ანგარიშები, რომელთა გაზიარებაც Bluetooth-ის მეშვეობით გსურთ. დაკავშირებისას ანგარიშებზე წვდომის დადასტურება მაინც მოგიწევთ."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"დარჩენილი სლოტი:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"აპლიკაციის ხატულა"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Bluetooth შეტყობინების გაზიარების პარამეტრები"</string>
diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml
index 4475db1..4ba8465 100644
--- a/res/values-kk-rKZ/strings.xml
+++ b/res/values-kk-rKZ/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Қабылдау"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"Жарайды"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"\"<xliff:g id="SENDER">%1$s</xliff:g>\" жіберген файлды қабылдау барысында уақыт аяқталды."</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth бөлісу: Келген файл"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Бұл файлды алуды қалайсыз ба?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Басқа құрылғы арқылы келген файл. Бұл файлды қабылдауды қалайтыныңызды растаңыз."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Кіріс файл"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> <xliff:g id="FILE">%2$s</xliff:g> жіберуге дайын"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth бөлісу: <xliff:g id="FILE">%1$s</xliff:g> файлын қабылдауда"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetooth бөлісу: <xliff:g id="FILE">%1$s</xliff:g> файлы қабылданды"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth бөлісу: <xliff:g id="FILE">%1$s</xliff:g> файлы қабылданбады"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Өшіру"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Сақтау"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Бас тарту"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Bluetooth арқылы бөлісетін есептік жазбаларды таңдаңыз. Бұл жолы да қосылу кезінде есептік жазбаларға кіру мүмкіндігі болатынын қабылдау керек."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Bluetooth арқылы бөлісетін есептік жазбаларды таңдаңыз. Әлі де қосылу кезінде есептік жазбаларға кез келген қатынасуды қабылдау керек."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Қалған слоттар:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Қолданба белгішесі"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Bluetooth арқылы хабар бөлісу параметрлері"</string>
diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml
index 1198c12..c0fc7fe 100644
--- a/res/values-km-rKH/strings.xml
+++ b/res/values-km-rKH/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"ទទួល"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"យល់ព្រម"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"អស់ពេលទទួលឯកសារចូលពី \"<xliff:g id="SENDER">%1$s</xliff:g>\""</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"ការចែករំលែកប៊្លូធូស៖ ឯកសារចូល"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"តើអ្នកចង់ទទួលឯកសារនេះឬ?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"ឯកសារចូលពីឧបករណ៍ផ្សេងទៀត។ បញ្ជាក់ថាអ្នកចង់ទទួលបានឯកសារនេះ។"</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"ឯកសារចូល"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> ត្រៀមរួចរាល់ក្នុងការផ្ញើ <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"ការចែករំលែកប៊្លូធូស៖ ទទួល <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"ការចែករំលែកប៊្លូធូស៖ បានទទួល <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"ការចែករំលែកប៊្លូធូស៖ មិនបានទទួលឯកសារ <xliff:g id="FILE">%1$s</xliff:g>"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"សម្អាត"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"រក្សាទុក"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"បោះបង់"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"ជ្រើសគណនីដែលអ្នកចង់ចែករំលែកតាមរយៈប៊្លូធូស។ អ្នកនៅតែត្រូវទទួលការចូលដំណើរការទាំងឡាយទៅកាន់គណនីនេះដដែល នៅពេលភ្ជាប់។"</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"ជ្រើសគណនីដែលអ្នកចង់ចែករំលែកតាមរយៈប៊្លូធូស។ អ្នកនៅតែត្រូវទទួលយកលទ្ធភាពចូលដំណើរការទាំងឡាយទៅកាន់គណនីនេះដដែល នៅពេលភ្ជាប់។"</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"រន្ធនៅសល់៖"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"រូបតំណាងកម្មវិធី"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"កំណត់ការចែករំលែកសារតាមប៊្លូធូស"</string>
diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml
index 7ff9fb0..93dd452 100644
--- a/res/values-kn-rIN/strings.xml
+++ b/res/values-kn-rIN/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"ಸ್ವೀಕರಿಸಿ"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"ಸರಿ"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"\"<xliff:g id="SENDER">%1$s</xliff:g>\" ಅವರಿಂದ ಫೈಲ್ ಸ್ವೀಕರಿಸುವಾಗ ಕಾಲಾವಧಿ ಮುಕ್ತಾಯಗೊಂಡಿದೆ"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"ಬ್ಲೂಟೂತ್ ಹಂಚಿಕೆ: ಒಳಬರುವ ಫೈಲ್"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"ಈ ಫೈಲ್ ಅನ್ನು ಸ್ವೀಕರಿಸಲು ನೀವು ಬಯಸುವಿರಾ?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"ಮತ್ತೊಂದು ಸಾಧನದಿಂದ ಒಳಬರುವ ಫೈಲ್. ಈ ಫೈಲ್ ಸ್ವೀಕರಿಸಲು ನೀವು ಬಯಸುತ್ತೀರಾ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿ."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"ಒಳಬರುತ್ತಿರುವ ಫೈಲ್"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> ಅವರು <xliff:g id="FILE">%2$s</xliff:g> ಫೈಲ್ ಕಳುಹಿಸಲು ಸಿದ್ಧವಾಗಿದ್ದಾರೆ"</string>
<string name="notification_receiving" msgid="4674648179652543984">"ಬ್ಲೂಟೂತ್ ಹಂಚಿಕೆ: <xliff:g id="FILE">%1$s</xliff:g> ಸ್ವೀಕರಿಸಲಾಗುತ್ತಿದೆ"</string>
<string name="notification_received" msgid="3324588019186687985">"ಬ್ಲೂಟೂತ್ ಹಂಚಿಕೆ: <xliff:g id="FILE">%1$s</xliff:g> ಸ್ವೀಕರಿಸಲಾಗಿದೆ"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"ಬ್ಲೂಟೂತ್ ಹಂಚಿಕೆ: ಫೈಲ್ <xliff:g id="FILE">%1$s</xliff:g> ಸ್ವೀಕರಿಸಿಲ್ಲ"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"ತೆರವುಗೊಳಿಸು"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"ಉಳಿಸು"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"ರದ್ದುಮಾಡು"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"ಬ್ಲೂಟೂತ್ ಮೂಲಕ ಹಂಚಿಕೊಳ್ಳಲು ಬಯಸುವ ಖಾತೆಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ. ಸಂಪರ್ಕಿಸುವಾಗ ಖಾತೆಗಳಿಗೆ ಯಾವುದೇ ಪ್ರವೇಶವನ್ನು ನೀವು ಈಗಲೂ ಒಪ್ಪಿಕೊಳ್ಳಬೇಕಾಗುತ್ತದೆ."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"ಬ್ಲೂಟೂತ್ ಮೂಲಕ ಹಂಚಿಕೊಳ್ಳಲು ಬಯಸುವ ಖಾತೆಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ. ಸಂಪರ್ಕಪಡಿಸುವಾಗ ಖಾತೆಗಳಿಗೆ ಯಾವುದೇ ಪ್ರವೇಶವನ್ನು ನೀವು ಈಗಲೂ ಸಮ್ಮತಿಸಬೇಕಾಗುತ್ತದೆ."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"ಉಳಿದಿರುವ ಸ್ಲಾಟ್ಗಳು:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"ಅಪ್ಲಿಕೇಶನ್ ಐಕಾನ್"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"ಬ್ಲೂಟೂತ್ ಸಂದೇಶ ಹಂಚಿಕೆ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 1cd8ee2..0c421e8 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"수락"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"확인"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"\'<xliff:g id="SENDER">%1$s</xliff:g>\'님이 보내는 파일을 수락하는 동안 제한 시간을 초과했습니다."</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"블루투스 공유: 수신 파일"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"이 파일을 받으시겠습니까?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"다른 기기에서 파일을 전송 중입니다. 이 파일을 수신할 것인지 확인하세요."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"수신 파일"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g>님이 <xliff:g id="FILE">%2$s</xliff:g>을(를) 보낼 준비가 되었습니다."</string>
<string name="notification_receiving" msgid="4674648179652543984">"블루투스 공유: <xliff:g id="FILE">%1$s</xliff:g> 받는 중"</string>
<string name="notification_received" msgid="3324588019186687985">"블루투스 공유: <xliff:g id="FILE">%1$s</xliff:g> 받음"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"블루투스 공유: <xliff:g id="FILE">%1$s</xliff:g> 파일이 수신되지 않았습니다."</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"지우기"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"저장"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"취소"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"블루투스를 통해 공유하려는 계정을 선택하세요. 연결할 때 계정에 대한 모든 액세스를 수락해야 합니다."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"블루투스를 통해 공유하려는 계정을 선택하세요. 연결할 때 계정에 대한 모든 액세스를 수락해야 합니다."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"남은 슬롯:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"애플리케이션 아이콘"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"블루투스 메시지 공유 설정"</string>
diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml
index 36689c4..e6d9631 100644
--- a/res/values-ky-rKG/strings.xml
+++ b/res/values-ky-rKG/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Кабыл алуу"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"\"<xliff:g id="SENDER">%1$s</xliff:g>\" жөнөткөн файлды алуу мөөнөтү өтүп кетти."</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth бөлүшүү: Алынган файл"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Бул файлды алгыңыз келеби?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Башка түзмөктөн келген файл. Бул файлды алгыңыз келгенин ырастаңыз."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Кирүүчү файл"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> <xliff:g id="FILE">%2$s</xliff:g> жөнөтүүгө даяр"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth бөлүшүү: <xliff:g id="FILE">%1$s</xliff:g> алынууда"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetooth бөлүшүү: <xliff:g id="FILE">%1$s</xliff:g> алынды"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth бөлүшүү: <xliff:g id="FILE">%1$s</xliff:g> алынган жок"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Тазалоо"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Сактоо"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Жокко чыгаруу"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Bluetooth аркылуу бөлүшө турган каттоо эсептерин тандаңыз. Туташып жатканда, каттоо эсептерине кирүү мүмкүнчүлүгүн кабыл алышыңыз керек."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Bluetooth аркылуу бөлүшө турган каттоо эсептерин тандаңыз. Туташкан сайын каттоо эсептерине кирүү мүмкүнчүлүгүн ырастап турушуңуз керек."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Калган көзөнөктөр:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Колдонмонун сөлөкөтү"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Bluetooth билдирүү бөлүшүү жөндөөлөрү"</string>
diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml
index e91d853..af704fc 100644
--- a/res/values-lo-rLA/strings.xml
+++ b/res/values-lo-rLA/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"ຮັບເອົາ"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"ຕົກລົງ"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"ເກີດມີການໝົດເວລາໃນລະຫວ່າງທີ່ກຳລັງຮັບເອົາໄຟລ໌ທີ່ເຂົ້າມາຈາກ \"<xliff:g id="SENDER">%1$s</xliff:g>\""</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"ແບ່ງປັນໃນ Bluetooth: ມີໄຟລ໌ເຂົ້າມາ"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"ທ່ານຕ້ອງການທີ່ຮັບເອົາໄຟລ໌ນີ້ບໍ່?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"ມີໄຟລ໌ກຳລັງເຂົ້າມາຈາກອຸປະກອນອື່ນ. ຢືນຢັນວ່າທ່ານຕ້ອງການຮັບເອົາໄຟລ໌ນີ້."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"ໄຟລ໌ເຂົ້າມາ"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> ພ້ອມທີ່ຈະສົ່ງ <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"ແບ່ງປັນໃນ Bluetooth: ກຳລັງຮັບເອົາ <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"ແບ່ງປັນໃນ Bluetooth: ໄດ້ຮັບ <xliff:g id="FILE">%1$s</xliff:g> ແລ້ວ"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"ແບ່ງປັນໃນ Bluetooth: ບໍ່ໄດ້ຮັບ <xliff:g id="FILE">%1$s</xliff:g>"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"ລຶບ"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"ບັນທຶກ"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"ຍົກເລີກ"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"ເລືອກບັນຊີທີ່ທ່ານຕ້ອງການແບ່ງປັນຜ່ານ Bluetooth. ທ່ານຍັງຄົງຕ້ອງຍອມຮັບການເຂົ້າເຖິງໃດໆຕໍ່ບັນຊີຕ່າງໆເມື່ອທຳການເຊື່ອມຕໍ່."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"ເລືອກບັນຊີທີ່ທ່ານຕ້ອງການແບ່ງປັນຜ່ານ Bluetooth. ທ່ານຍັງຈຳເປັນຕ້ອງຍອມຮັບທຸກການເຂົ້າເຖິງບັນຊີຕ່າງໆໃນເວລາເຊື່ອມຕໍ່."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"ຊ່ອງຊ້າຍ:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"ໄອຄອນແອັບພລິເຄຊັນ"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"ການຕັ້ງຄ່າແບ່ງປັນຂໍ້ຄວາມ Bluetooth"</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 4596cbb..b687f60 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Priimti"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"Gerai"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Baigėsi laikas priimant gaunamą failą iš <xliff:g id="SENDER">%1$s</xliff:g>"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"„Bluetooth“ bendrinimas: gaunamas failas"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Ar norite gauti šį failą?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Gaunamas failas iš kito įrenginio. Patvirtinkite, kad norite gauti šį failą."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Gaunamas failas"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> pasiruošęs (-usi) siųsti <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"„Bluetooth“ bendrinimas: gaunamas <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"„Bluetooth“ bendrinimas: <xliff:g id="FILE">%1$s</xliff:g> gautas"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"„Bluetooth“ bendrinimas: <xliff:g id="FILE">%1$s</xliff:g> failas negautas"</string>
@@ -128,7 +127,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Išvalyti"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Išsaugoti"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Atšaukti"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Pasirinkite paskyras, kurias norite bendrinti per „Bluetooth“. Jungiantis vis tiek reikės suteikti prieigą prie paskyrų."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Pasirinkite o paskyras, kurias norite bendrinti per „Bluetooth“. Jungiantis vis tiek reikės suteikti prieigą prie paskyrų."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Liko sričių:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Programos piktograma"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"„Bluetooth“ pranešimų bendrinimo nustatymai"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index b1e99e8..43f24e0 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Piekrist"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"Labi"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Saņemot ienākošu failu no saņēmēja <xliff:g id="SENDER">%1$s</xliff:g>, radās noildze."</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth Share: ienākošais fails"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Vai vēlaties saņemt šo failu?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"No citas ierīces tiek sūtīts fails. Apstipriniet, ka vēlaties saņemt šo failu."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Ienākošais fails"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"Sūtītājs <xliff:g id="SENDER">%1$s</xliff:g> ir gatavs nosūtīt failu <xliff:g id="FILE">%2$s</xliff:g>."</string>
<string name="notification_receiving" msgid="4674648179652543984">"Kopīgošana, izmantojot Bluetooth: notiek faila <xliff:g id="FILE">%1$s</xliff:g> saņemšana"</string>
<string name="notification_received" msgid="3324588019186687985">"Kopīgošana, izmantojot Bluetooth: saņemts fails <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Kopīgošana, izmantojot Bluetooth: fails <xliff:g id="FILE">%1$s</xliff:g> netika saņemts"</string>
@@ -126,7 +125,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Notīrīšana"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Saglabāt"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Atcelt"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Atlasiet kontus, kurus vēlaties koplietot, izmantojot Bluetooth. Kad tiks izveidots savienojums, jums būs arī jāapstiprina piekļuve kontiem."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Atlasiet kontus, kurus vēlaties koplietot, izmantojot Bluetooth. Kad tiks izveidots savienojums, jums būs arī jāapstiprina piekļuve kontiem."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Atlikušie sloti:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Lietojumprogrammas ikona"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Bluetooth ziņojumu kopīgošanas iestatījumi"</string>
diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml
index ae817cc..a18f858 100644
--- a/res/values-mk-rMK/strings.xml
+++ b/res/values-mk-rMK/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Прифати"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"Во ред"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Времето истече додека се прифаќаше дојдовната датотека од „<xliff:g id="SENDER">%1$s</xliff:g>“."</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Сподели преку Bluetooth: Дојдовна датотека"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Сакате да ја примите оваа датотека?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Дојдовна датотека од друг уред. Потврдете дека сакате да ја примите оваа датотека."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Дојдовна датотека"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> е подготвен за испраќање на <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Сподели преку Bluetooth: Се прима <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Сподели преку Bluetooth: Примена <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Сподели преку Bluetooth: Датотеката <xliff:g id="FILE">%1$s</xliff:g> не е примена."</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Исчисти"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Зачувај"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Откажи"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Изберете ги сметките што сакате да ги споделите преку Bluetooth. Сепак, ќе мора да го прифаќате секој пристап до сметките при поврзувањето."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Изберете ги сметките што сакате да ги споделите преку Bluetooth. Сепак, ќе мора да го прифаќате секој пристап до сметките при поврзување."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Слободни отвори:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Икона на апликацијата"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Поставки за споделување пораки преку Bluetooth"</string>
diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml
index 3ca842d..7217019 100644
--- a/res/values-ml-rIN/strings.xml
+++ b/res/values-ml-rIN/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"സ്വീകരിക്കുക"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"ശരി"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"\"<xliff:g id="SENDER">%1$s</xliff:g>\" എന്നയാളിൽ നിന്നും ഒരു ഇൻകമിംഗ് ഫയൽ സ്വീകരിക്കുമ്പോൾ ഒരു കാലഹരണപ്പെടൽ സംഭവിച്ചു"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"ബ്ലൂടൂത്ത് പങ്കിടൽ: ഇൻകമിംഗ് ഫയൽ"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"നിങ്ങൾക്ക് ഈ ഫയൽ നേടണോ?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"മറ്റൊരു ഉപകരണത്തിൽ നിന്നുള്ള ഇൻകമിംഗ് ഫയൽ. ഈ ഫയൽ നിങ്ങൾക്ക് നേടണമെങ്കിൽ സ്ഥിരീകരിക്കുക."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"ഇൻകമിംഗ് ഫയൽ"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="FILE">%2$s</xliff:g> അയയ്ക്കാൻ <xliff:g id="SENDER">%1$s</xliff:g> തയ്യാറാണ്"</string>
<string name="notification_receiving" msgid="4674648179652543984">"ബ്ലൂടൂത്ത് പങ്കിടൽ: <xliff:g id="FILE">%1$s</xliff:g> എന്ന ഫയൽ ലഭിക്കുന്നു"</string>
<string name="notification_received" msgid="3324588019186687985">"ബ്ലൂടൂത്ത് പങ്കിടൽ: <xliff:g id="FILE">%1$s</xliff:g> ലഭിച്ചു"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"ബ്ലൂടൂത്ത് പങ്കിടൽ: <xliff:g id="FILE">%1$s</xliff:g> എന്ന ഫയൽ ലഭിച്ചില്ല."</string>
@@ -122,7 +121,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"മായ്ക്കുക"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"സംരക്ഷിക്കുക"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"റദ്ദാക്കുക"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"നിങ്ങൾക്ക് Bluetooth മുഖേന പങ്കിടേണ്ട അക്കൗണ്ടുകൾ തിരഞ്ഞെടുക്കുക. കണക്റ്റുചെയ്യുമ്പോൾ അക്കൗണ്ടുകളിലേക്കുള്ള ഏത് ആക്സസ്സും നിങ്ങൾ തുടർന്നും അംഗീകരിക്കേണ്ടതാണ്."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"നിങ്ങൾക്ക് Bluetooth വഴി പങ്കിടേണ്ട അക്കൗണ്ടുകൾ തിരഞ്ഞെടുക്കുക. കണക്റ്റുചെയ്യുമ്പോൾ അക്കൗണ്ടുകളിലേക്കുള്ള ഏത് ആക്സസും നിങ്ങൾ തുടർന്നും അംഗീകരിക്കേണ്ടതാണ്."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"ശേഷിക്കുന്ന സ്ലോട്ടുകൾ:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"അപ്ലിക്കേഷൻ ഐക്കൺ"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Bluetooth സന്ദേശ പങ്കിടൽ ക്രമീകരണം"</string>
diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml
index b824f42..a17f7ed 100644
--- a/res/values-mn-rMN/strings.xml
+++ b/res/values-mn-rMN/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Зөвшөөрөх"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"Тийм"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"\"<xliff:g id="SENDER">%1$s</xliff:g>\"-с ирж байгаа файлыг зөвшөөрөх явцад хугацаа хэтэрсэн байна"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth хуваалцах: Ирж байгаа файл"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Та энэ файлыг хүлээн авахыг хүсэж байна уу?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Өөр төхөөрөмжөөс ирж байгаа файл. Та энэ файлыг хүлээн авахыг хүсэж байгаагаа баталгаажуулна уу."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Ирж буй файл"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> нь <xliff:g id="FILE">%2$s</xliff:g>-г илгээхэд бэлэн"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth хуваалцах: Хүлээн авч байна <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetooth хуваалцах: Хүлээн авсан <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth хуваалцах: Файл <xliff:g id="FILE">%1$s</xliff:g> хүлээж аваагүй"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Арилгах"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Хадгалах"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Цуцлах"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Bluetooth-ээр дамжуулан хуваалцахыг хүсч буй дансаа сонго. Та холбогдож байх үедээ ч данс руу нэвтрэх ямар ч хандалтуудыг хүлээн авах боломжтой."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Bluetooth-ээр хуваалцахыг хүсч буй дансаа сонго. Холболт хийх үед данс руу нэвтрэх аливаа хандалтыг хүлээн зөвшөөрөх хэрэгтэй болно."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Үлдсэн слот:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Аппликешний дүрс"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Bluetooth мессеж хуваалцах тохиргоо"</string>
diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml
index b8e1788..1cf689a 100644
--- a/res/values-mr-rIN/strings.xml
+++ b/res/values-mr-rIN/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"स्वीकारा"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"ठीक"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"\"<xliff:g id="SENDER">%1$s</xliff:g>\" कडील फाइल स्वीकार करताना वेळ संपली."</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"ब्लूटुथ शेअर: येणारी फाइल"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"आपण ही फाइल प्राप्त करू इच्छिता?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"दुसर्या डिव्हाइस वरील येणारी फाइल. ही फाइल आपण प्राप्त करू इच्छिता याची पुष्टी करा."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"येणारी फाईल"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="FILE">%2$s</xliff:g> पाठविण्यासाठी <xliff:g id="SENDER">%1$s</xliff:g> तयार आहे"</string>
<string name="notification_receiving" msgid="4674648179652543984">"ब्लूटुथ शेअर: <xliff:g id="FILE">%1$s</xliff:g> प्राप्त करीत आहे"</string>
<string name="notification_received" msgid="3324588019186687985">"ब्लूटुथ शेअर: <xliff:g id="FILE">%1$s</xliff:g> प्राप्त केली"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"ब्लूटुथ शेअर: <xliff:g id="FILE">%1$s</xliff:g> फाइल प्राप्त केली नाही"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"साफ करा"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"जतन करा"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"रद्द करा"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"आपण ब्लूटुथद्वारे सामायिक करू इच्छित असलेली खाती निवडा. कनेक्ट करताना अद्याप आपल्याला खात्यांमधील कोणताही प्रवेश स्वीकारण्याची आवश्यकता आहे."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"आपण ब्लूटुथद्वारे सामायिक करू इच्छित असलेली खाती निवडा. कनेक्ट करताना अद्याप आपल्याला खात्यांमधील कोणताही प्रवेश स्वीकारण्याची आवश्यकता आहे."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"स्लॉट शिल्लक:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"अनुप्रयोग चिन्ह"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"ब्लूटुथ संदेश सामायिकरण सेटिंग्ज"</string>
diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml
index 4f52adb..2950198 100644
--- a/res/values-ms-rMY/strings.xml
+++ b/res/values-ms-rMY/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Terima"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Berlaku tamat masa semasa menerima fail masuk daripada \"<xliff:g id="SENDER">%1$s</xliff:g>\""</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Perkongsian Bluetooth: Fail masuk"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Adakah anda mahu menerima fail ini?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Fail masuk daripada peranti lain. Sila sahkan bahawa anda mahu menerima fail ini."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Fail masuk"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> sudah bersedia untuk menghantar <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Perkongsian Bluetooth: Menerima <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Perkongsian Bluetooth: Diterima <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Perkongsian Bluetooth: Fail <xliff:g id="FILE">%1$s</xliff:g> tidak diterima"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Padam bersih"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Simpan"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Batal"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Pilih akaun yang ingin anda kongsikan melalui Bluetooth. Anda masih perlu menerima sebarang akses kepada akaun semasa menyambung."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Pilih akaun yang anda ingin kongsikan melalui Bluetooth. Anda masih perlu menerima sebarang akses kepada akaun semasa menyambung."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Slot yang tinggal:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Ikon Aplikasi"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Tetapan Perkongsian Mesej Bluetooth"</string>
diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml
index 9be7b60..7952390 100644
--- a/res/values-my-rMM/strings.xml
+++ b/res/values-my-rMM/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"လက်ခံရန်"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"ကောင်းပြီ"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"\"<xliff:g id="SENDER">%1$s</xliff:g>\"မှ အဝင်ဖိုင်ကို လက်ခံနေစဥ် အချိန်ကုန်ဆုံးသွားပါပြီ"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"ဘလူးတုသ် ဝေမျှမှု - အဝင်ဖိုင်"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"ဤဖိုင်ကို လက်ခံမည်လား?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"အခြားစက်မှ ဝင်လာသော ဖိုင်ရှိသည်။ ထိုဖိုင်ကို လက်ခံရန် အတည်ပြုပါ။"</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"အဝင် ဖိုင်"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> က <xliff:g id="FILE">%2$s</xliff:g>ကို ပို့ရန် အသင့်ပါ"</string>
<string name="notification_receiving" msgid="4674648179652543984">"ဘလူးတုသ် ဝေမျှမှု - <xliff:g id="FILE">%1$s</xliff:g> လက်ခံနေသည်"</string>
<string name="notification_received" msgid="3324588019186687985">"ဘလူးတုသ် ဝေမျှမှု - ရရှိပြီး<xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"ဘလူးတုသ် ဝေမျှမှု - ဖိုင် <xliff:g id="FILE">%1$s</xliff:g> မရရှိပါ"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"ရှင်းလင်းရန်"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"သိမ်းဆည်းရန်"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"ဖျက်သိမ်းရန်"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"သင် ဘလူးတုသ်မှတဆင့် မျှဝေလိုသော အကောင့်အသစ်များအား ရွေးချယ်ပါ။ ချိတ်ဆက်နေစဉ် အကောင့်များအား ဝင်ရောက်သုံးခွင့်များကို သင်လက်ခံရန် လိုအပ်ပါဦးမည်။"</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"ဘလူးတုသ်မှ မျှဝေလိုသော အကောင့်များကို ရွေးပါ။ ချိတ်ဆက်သည့်အခါ အကောင့်များအား ဝင်ခွင့်ပြုဖို့ လက်ခံပေးရပါလိမ့်ဦးမည်။"</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"ကျန်နေသည့် အပေါက်များ:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"အပလီကေးရှင်း အိုင်ကွန်"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"ဘလူးတုသ် စာ မျှဝေရေး ဆက်တင်များ"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 91eb03d..9f64441 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Godta"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Det oppstod et tidsavbrudd under mottak av fil fra «<xliff:g id="SENDER">%1$s</xliff:g>»"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth-deling: Innkommende fil"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Vil du motta denne filen?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Innkommende fil fra en annen enhet. Bekreft at du ønsker å motta denne filen."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Innkommende fil"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> er klar til å sende <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth-deling: Mottar <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetooth-deling: <xliff:g id="FILE">%1$s</xliff:g> er mottatt"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth-deling: Filen <xliff:g id="FILE">%1$s</xliff:g> er ikke mottatt"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Tøm"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Lagre"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Avbryt"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Velg kontoene du vil dele via Bluetooth. Du må fortsatt godta eventuell tilgang til kontoene når du kobler til."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Velg kontoene du vil dele via Bluetooth. Du må fortsatt godta eventuell tilgang til kontoene når du kobler til."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Plasser igjen:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Appikon"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Innstillinger for meldingsdeling via Bluetooth"</string>
diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml
index da97be3..a78c644 100644
--- a/res/values-ne-rNP/strings.xml
+++ b/res/values-ne-rNP/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"स्वीकार्नुहोस्"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"ठीक छ"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"\"<xliff:g id="SENDER">%1$s</xliff:g>\" बाट आगमन फाइल स्वीकार्दा समय सकिएको थियो"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"ब्लुटुथ साझेदारी: आगमन फाइल"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"के तपाईँ यो फाइल प्राप्त गर्न चाहनु हुन्छ?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"अर्को उपकरणबाट आगमन फाइल। यो फाइल तपाईँ प्राप्त गर्न चाहनु हुन्छ भन्ने कुरा निश्चित गर्नुहोस्।"</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"आगमन फाइल"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> ले <xliff:g id="FILE">%2$s</xliff:g> पठाउन तयार छ"</string>
<string name="notification_receiving" msgid="4674648179652543984">"ब्लुटुथ साझेदारी:<xliff:g id="FILE">%1$s</xliff:g> प्राप्त गर्दै"</string>
<string name="notification_received" msgid="3324588019186687985">"ब्लुटुथ साझेदारी: <xliff:g id="FILE">%1$s</xliff:g> प्राप्त भयो"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"ब्लुटुथ साझेदारी: फाइल: <xliff:g id="FILE">%1$s</xliff:g> प्राप्त भएन"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"हटाउनुहोस्"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"सुरक्षित गर्नुहोस्"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"रद्द गर्नुहोस्"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"तपाईंले ब्लुटुथ मार्फत साझेदारी गर्न चाहेको खाता चयन गर्नुहोस्। तपाईंले अझै पनि खातामा जडान गर्दा कुनै पनि पहुँच स्वीकार गर्नुपर्छ।"</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"तपाईंले ब्लुटुथ मार्फत साझेदारी गर्न चाहेका खाताहरू चयन गर्नुहोस्। तपाईंले अझै पनि खाताहरूमा जडान गर्दा कुनै पनि पहुँच स्वीकार गर्नुपर्छ।"</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"स्लटहरू बाँकी:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"अनुप्रयोग आइकन"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"ब्लुटुथ सन्देश साझेदारी सेटिङहरू"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 45d784b..cd28ab4 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Accepteren"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Er is een time-out opgetreden bij het accepteren van een inkomend bestand van \'<xliff:g id="SENDER">%1$s</xliff:g>\'"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Delen via Bluetooth: inkomend bestand"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Wilt je dit bestand ontvangen?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Er is een inkomend bestand van een ander apparaat beschikbaar. Bevestig dat je dit bestand wilt ontvangen."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Inkomend bestand"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> is gereed om <xliff:g id="FILE">%2$s</xliff:g> te verzenden"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Delen via Bluetooth: <xliff:g id="FILE">%1$s</xliff:g> ontvangen"</string>
<string name="notification_received" msgid="3324588019186687985">"Delen via Bluetooth: <xliff:g id="FILE">%1$s</xliff:g> ontvangen"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Delen via Bluetooth: bestand <xliff:g id="FILE">%1$s</xliff:g> niet ontvangen"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Wissen"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Opslaan"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Annuleren"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Selecteer de accounts die je wilt delen via Bluetooth. Je moet nog steeds elke toegang tot de accounts accepteren wanneer er verbinding wordt gemaakt."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Selecteer de accounts die je wilt delen via Bluetooth. Je moet nog steeds elke toegang tot de accounts accepteren wanneer er verbinding wordt gemaakt."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Plaatsen over:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"App-pictogram"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Instellingen voor delen van berichten via Bluetooth"</string>
diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml
index d170e9f..7bbfdd0 100644
--- a/res/values-pa-rIN/strings.xml
+++ b/res/values-pa-rIN/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"ਸਵੀਕਾਰ ਕਰੋ"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"ਠੀਕ"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"\"<xliff:g id="SENDER">%1$s</xliff:g>\" ਦੀ ਇੱਕ ਇਨਕਮਿੰਗ ਫਾਈਲ ਸਵੀਕਾਰ ਕਰਨ ਵੇਲੇ ਇੱਕ ਟਾਈਮਆਊਟ ਹੋਇਆ ਸੀ।"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth ਸ਼ੇਅਰ: ਇਨਕਮਿੰਗ ਫਾਈਲ"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"ਕੀ ਤੁਸੀਂ ਇਹ ਫਾਈਲ ਪ੍ਰਾਪਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"ਦੂਜੀ ਡਿਵਾਈਸ ਤੋਂ ਇਨਕਮਿੰਗ ਫਾਈਲ। ਪੁਸ਼ਟੀ ਕਰੋ ਕਿ ਤੁਸੀਂ ਇਹ ਫਾਈਲ ਪ੍ਰਾਪਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ।"</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"ਇਨਕਮਿੰਗ ਫਾਈਲ"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> <xliff:g id="FILE">%2$s</xliff:g> ਭੇਜਣ ਲਈ ਤਿਆਰ ਹੈ"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth ਸ਼ੇਅਰ: <xliff:g id="FILE">%1$s</xliff:g> ਪ੍ਰਾਪਤ ਕਰ ਰਿਹਾ ਹੈ"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetooth ਸ਼ੇਅਰ: <xliff:g id="FILE">%1$s</xliff:g> ਪ੍ਰਾਪਤ ਕੀਤੀ"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth ਸ਼ੇਅਰ: ਫਾਈਲ <xliff:g id="FILE">%1$s</xliff:g> ਪ੍ਰਾਪਤ ਨਹੀਂ ਕੀਤੀ"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"ਹਟਾਓ"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"ਸੁਰੱਖਿਅਤ ਕਰੋ"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"ਰੱਦ ਕਰੋ"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"ਉਹ ਖਾਤੇ ਚੁਣੋ ਜਿਹਨਾਂ ਨੂੰ ਤੁਸੀਂ ਬਲੂਟੁੱਥ ਰਾਹੀਂ ਸ਼ੇਅਰ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ। ਤੁਹਾਨੂੰ ਤਦ ਵੀ ਕਨੈਕਟ ਕਰਨ ਵੇਲੇ ਖਾਤਿਆਂ ਤੱਕ ਕਿਸੇ ਵੀ ਪਹੁੰਚ ਨੂੰ ਸਵੀਕਾਰ ਕਰਨਾ ਪਵੇਗਾ।"</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"ਉਹਨਾਂ ਖਾਤਿਆਂ ਨੂੰ ਚੁਣੋ ਜਿਨ੍ਹਾਂ ਨੂੰ ਤੁਸੀਂ ਬਲੂਟੁੱਥ ਦੇ ਰਾਹੀਂ ਸਾਂਝਾ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ। ਤੁਹਾਨੂੰ ਹਾਲੇ ਵੀ ਕਨੈਕਟ ਕਰਨ ਦੌਰਾਨ ਖਾਤਿਆਂ \'ਤੇ ਕਿਸੇ ਵੀ ਪਹੁੰਚ ਨੂੰ ਸਵੀਕਾਰ ਕਰਨਾ ਹੋਵੇਗਾ।"</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"ਸਲੌਟ ਬਾਕੀ:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"ਐਪਲੀਕੇਸ਼ਨ ਆਈਕਨ"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"ਬਲੂਟੁੱਥ ਸੁਨੇਹਾ ਸ਼ੇਅਰਿੰਗ ਸੈੱਟਿੰਗਜ਼"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index ebab1ac..f450fc4 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Akceptuj"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Upłynął czas oczekiwania przy akceptowaniu przychodzącego pliku z urządzenia „<xliff:g id="SENDER">%1$s</xliff:g>”"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Udostępnianie Bluetooth: plik przychodzący"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Chcesz odebrać ten plik?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Przesłano plik z innego urządzenia. Potwierdź, że chcesz go odebrać."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Plik przychodzący"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> może wysłać plik <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Udostępnianie Bluetooth: odbieranie <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Udostępnianie Bluetooth: odebrano plik <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Udostępnianie Bluetooth: nie odebrano pliku <xliff:g id="FILE">%1$s</xliff:g>"</string>
@@ -128,7 +127,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Wyczyść"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Zapisz"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Anuluj"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Wybierz konta, które chcesz udostępnić przez Bluetooth. Przy łączeniu trzeba zgodzić się na dostęp do kont."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Wybierz konta, które chcesz udostępnić przez Bluetooth. Wymagana jest zgoda na dostęp do kont."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Wolne miejsca:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Ikona aplikacji"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Ustawienia udostępniania wiadomości przez Bluetooth"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index f0fb7e8..af923f2 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Aceitar"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Foi excedido o tempo limite durante a aceitação de um ficheiro de \"<xliff:g id="SENDER">%1$s</xliff:g>\""</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Partilha Bluetooth: ficheiro recebido"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Pretende receber este ficheiro?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"A receber ficheiro de outro aparelho. Confirme se pretende recebê-lo."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Ficheiro a receber"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> está pronto para enviar <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Partilha Bluetooth: a receber <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Partilha Bluetooth: <xliff:g id="FILE">%1$s</xliff:g> recebido"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Partilha Bluetooth: Ficheiro <xliff:g id="FILE">%1$s</xliff:g> não recebido"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Limpar"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Guardar"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Cancelar"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Selecione as contas que pretende partilhar através de Bluetooth. Ao ligar, ainda tem de aceitar eventuais acessos às contas."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Selecione as contas que pretende partilhar através de Bluetooth. Ao ligar, ainda tem de aceitar eventuais acessos às contas."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Ranhuras restantes:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Ícone de aplicação"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Definições de partilha de mensagens por Bluetooth"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index cf7f34c..0f5beb9 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Aceitar"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Tempo limite excedido ao receber um arquivo de \"<xliff:g id="SENDER">%1$s</xliff:g>\""</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Compartilhamento Bluetooth: arquivo recebido"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Deseja receber este arquivo?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Arquivo recebido de outro dispositivo. Confirme se deseja receber este arquivo."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Arquivo recebido"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> está pronto para enviar <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Compart. Bluetooth: recebendo <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Compart. Bluetooth: <xliff:g id="FILE">%1$s</xliff:g> recebido"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Compart. Bluetooth: o arquivo <xliff:g id="FILE">%1$s</xliff:g> não foi recebido"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Limpar"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Salvar"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Cancelar"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Selecione as contas que você deseja compartilhar via Bluetooth. Você ainda precisa aceitar qualquer acesso às contas ao conectar."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Selecione as contas que você deseja compartilhar via Bluetooth. Você ainda precisa aceitar qualquer acesso às contas ao se conectar."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Espaços disponíveis:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Ícone do app"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Configurações de compartilhamento de mensagens Bluetooth"</string>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 825db4d..2b528ae 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -19,12 +19,12 @@
<string name="permlab_bluetoothShareManager" msgid="311492132450338925">"Accesați managerul de descărcare."</string>
<string name="permdesc_bluetoothShareManager" msgid="8930572979123190223">"Permite aplicațiilor să acceseze managerul Distribuire prin Bluetooth și să-l utilizeze la transferul fișierelor."</string>
<string name="permlab_bluetoothWhitelist" msgid="7091552898592306386">"Acces la dispozitivele Bluetooth din lista albă."</string>
- <string name="permdesc_bluetoothWhitelist" msgid="5494513855192170109">"Permite aplicației să treacă temporar pe lista albă un dispozitiv Bluetooth, permițându-i să trimită fişiere la acest dispozitiv fără confirmare din partea utilizatorului."</string>
+ <string name="permdesc_bluetoothWhitelist" msgid="5494513855192170109">"Permite aplicației să treacă temporar pe lista albă un dispozitiv Bluetooth, permițându-i să trimită fișiere la acest dispozitiv fără confirmare din partea utilizatorului."</string>
<string name="bt_share_picker_label" msgid="6268100924487046932">"Bluetooth"</string>
<string name="unknown_device" msgid="9221903979877041009">"Dispozitiv necunoscut"</string>
<string name="unknownNumber" msgid="4994750948072751566">"Necunoscut"</string>
<string name="airplane_error_title" msgid="2683839635115739939">"Mod Avion"</string>
- <string name="airplane_error_msg" msgid="8698965595254137230">"Nu puteţi utiliza Bluetooth în modul Avion."</string>
+ <string name="airplane_error_msg" msgid="8698965595254137230">"Nu puteți utiliza Bluetooth în modul Avion."</string>
<string name="bt_enable_title" msgid="8657832550503456572"></string>
<string name="bt_enable_line1" msgid="7203551583048149">"Pentru a putea utiliza serviciile Bluetooth, trebuie mai întâi să le activați."</string>
<string name="bt_enable_line2" msgid="4341936569415937994">"Activați acum Bluetooth?"</string>
@@ -32,43 +32,42 @@
<string name="bt_enable_ok" msgid="3432462749994538265">"Activați"</string>
<string name="incoming_file_confirm_title" msgid="8139874248612182627">"Transfer de fișier"</string>
<string name="incoming_file_confirm_content" msgid="2752605552743148036">"Acceptați fișierul primit?"</string>
- <string name="incoming_file_confirm_cancel" msgid="2973321832477704805">"Refuzaţi"</string>
- <string name="incoming_file_confirm_ok" msgid="281462442932231475">"Acceptaţi"</string>
+ <string name="incoming_file_confirm_cancel" msgid="2973321832477704805">"Refuzați"</string>
+ <string name="incoming_file_confirm_ok" msgid="281462442932231475">"Acceptați"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"A fost atins timpul limită pentru acceptarea unui fișier primit de la „<xliff:g id="SENDER">%1$s</xliff:g>”"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth: se primeşte fişierul"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Doriți să primiţi acest fișier?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Un fișier de la alt dispozitiv se află în curs de primire. Confirmați dacă doriți primirea acestuia."</string>
- <string name="notification_receiving" msgid="4674648179652543984">"Distribuire prin Bluetooth: se primeşte <xliff:g id="FILE">%1$s</xliff:g>"</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Fișier primit"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> este gata să trimită <xliff:g id="FILE">%2$s</xliff:g>"</string>
+ <string name="notification_receiving" msgid="4674648179652543984">"Distribuire prin Bluetooth: se primește <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Distribuire prin Bluetooth: s-a primit <xliff:g id="FILE">%1$s</xliff:g>"</string>
- <string name="notification_received_fail" msgid="3619350997285714746">"Distribuire prin Bluetooth: fişierul <xliff:g id="FILE">%1$s</xliff:g> nu s-a primit"</string>
+ <string name="notification_received_fail" msgid="3619350997285714746">"Distribuire prin Bluetooth: fișierul <xliff:g id="FILE">%1$s</xliff:g> nu s-a primit"</string>
<string name="notification_sending" msgid="3035748958534983833">"Distribuire prin Bluetooth: se trimite <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_sent" msgid="9218710861333027778">"Distribuire prin Bluetooth: s-a trimis <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_sent_complete" msgid="302943281067557969">"100 % finalizat"</string>
- <string name="notification_sent_fail" msgid="6696082233774569445">"Distribuire prin Bluetooth: fişierul <xliff:g id="FILE">%1$s</xliff:g> nu a fost trimis"</string>
+ <string name="notification_sent_fail" msgid="6696082233774569445">"Distribuire prin Bluetooth: fișierul <xliff:g id="FILE">%1$s</xliff:g> nu a fost trimis"</string>
<string name="download_title" msgid="3353228219772092586">"Transfer de fișier"</string>
<string name="download_line1" msgid="4926604799202134144">"De la: „<xliff:g id="SENDER">%1$s</xliff:g>”"</string>
<string name="download_line2" msgid="5876973543019417712">"Fișier: <xliff:g id="FILE">%1$s</xliff:g>"</string>
- <string name="download_line3" msgid="4384821622908676061">"Dimensiunea fişierului: <xliff:g id="SIZE">%1$s</xliff:g>"</string>
+ <string name="download_line3" msgid="4384821622908676061">"Dimensiunea fișierului: <xliff:g id="SIZE">%1$s</xliff:g>"</string>
<string name="download_line4" msgid="8535996869722666525"></string>
- <string name="download_line5" msgid="3069560415845295386">"Se primeşte fişierul..."</string>
+ <string name="download_line5" msgid="3069560415845295386">"Se primește fișierul..."</string>
<string name="download_cancel" msgid="9177305996747500768">"Opriți"</string>
- <string name="download_ok" msgid="5000360731674466039">"Ascundeţi"</string>
+ <string name="download_ok" msgid="5000360731674466039">"Ascundeți"</string>
<string name="incoming_line1" msgid="2127419875681087545">"De la"</string>
<string name="incoming_line2" msgid="3348994249285315873">"Numele fișierului"</string>
<string name="incoming_line3" msgid="7954237069667474024">"Dimensiunea"</string>
- <string name="download_fail_line1" msgid="3846450148862894552">"Fişierul nu este primit"</string>
+ <string name="download_fail_line1" msgid="3846450148862894552">"Fișierul nu este primit"</string>
<string name="download_fail_line2" msgid="8950394574689971071">"Fișier: <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="download_fail_line3" msgid="3451040656154861722">"Motiv: <xliff:g id="REASON">%1$s</xliff:g>"</string>
<string name="download_fail_ok" msgid="1521733664438320300">"OK"</string>
<string name="download_succ_line5" msgid="4509944688281573595">"Fișier primit"</string>
- <string name="download_succ_ok" msgid="7053688246357050216">"Deschideţi"</string>
+ <string name="download_succ_ok" msgid="7053688246357050216">"Deschideți"</string>
<string name="upload_line1" msgid="2055952074059709052">"Către: „<xliff:g id="RECIPIENT">%1$s</xliff:g>”"</string>
<string name="upload_line3" msgid="4920689672457037437">"Tip de fișier: <xliff:g id="TYPE">%1$s</xliff:g> (<xliff:g id="SIZE">%2$s</xliff:g>)"</string>
- <string name="upload_line5" msgid="7759322537674229752">"Se trimite fişierul..."</string>
+ <string name="upload_line5" msgid="7759322537674229752">"Se trimite fișierul..."</string>
<string name="upload_succ_line5" msgid="5687317197463383601">"Fișier trimis"</string>
<string name="upload_succ_ok" msgid="7705428476405478828">"OK"</string>
- <string name="upload_fail_line1" msgid="7899394672421491701">"Fişierul nu a fost trimis la „<xliff:g id="RECIPIENT">%1$s</xliff:g>”."</string>
+ <string name="upload_fail_line1" msgid="7899394672421491701">"Fișierul nu a fost trimis la „<xliff:g id="RECIPIENT">%1$s</xliff:g>”."</string>
<string name="upload_fail_line1_2" msgid="2108129204050841798">"Fișier: <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="upload_fail_ok" msgid="5807702461606714296">"Încercați din nou"</string>
<string name="upload_fail_cancel" msgid="9118496285835687125">"Închideți"</string>
@@ -76,39 +75,39 @@
<string name="unknown_file" msgid="6092727753965095366">"Fișier necunoscut"</string>
<string name="unknown_file_desc" msgid="480434281415453287">"Nu există nicio aplicație care să gestioneze acest tip de fișier. \n"</string>
<string name="not_exist_file" msgid="3489434189599716133">"Niciun fișier"</string>
- <string name="not_exist_file_desc" msgid="4059531573790529229">"Fişierul nu există. \n"</string>
- <string name="enabling_progress_title" msgid="436157952334723406">"Aşteptaţi..."</string>
+ <string name="not_exist_file_desc" msgid="4059531573790529229">"Fișierul nu există. \n"</string>
+ <string name="enabling_progress_title" msgid="436157952334723406">"Așteptați..."</string>
<string name="enabling_progress_content" msgid="4601542238119927904">"Se activează Bluetooth..."</string>
- <string name="bt_toast_1" msgid="972182708034353383">"Se va primi fişierul. Verificaţi progresul în panoul de notificări."</string>
- <string name="bt_toast_2" msgid="8602553334099066582">"Fişierul nu poate fi primit."</string>
- <string name="bt_toast_3" msgid="6707884165086862518">"Primirea fişierului de la „<xliff:g id="SENDER">%1$s</xliff:g>” a fost anulată"</string>
- <string name="bt_toast_4" msgid="4678812947604395649">"Se trimite fişierul către „<xliff:g id="RECIPIENT">%1$s</xliff:g>”"</string>
- <string name="bt_toast_5" msgid="2846870992823019494">"Se trimit <xliff:g id="NUMBER">%1$s</xliff:g> (de) fişiere către „<xliff:g id="RECIPIENT">%2$s</xliff:g>”"</string>
- <string name="bt_toast_6" msgid="1855266596936622458">"Trimiterea fişierului către „<xliff:g id="RECIPIENT">%1$s</xliff:g>” a fost anulată"</string>
- <string name="bt_sm_2_1" product="nosdcard" msgid="352165168004521000">"Nu există spaţiu suficient pe stocarea USB pentru a salva fişierul de la „<xliff:g id="SENDER">%1$s</xliff:g>”"</string>
- <string name="bt_sm_2_1" product="default" msgid="1989018443456803630">"Nu există suficient spaţiu pe cardul SD pentru a salva fişierul de la „<xliff:g id="SENDER">%1$s</xliff:g>”"</string>
+ <string name="bt_toast_1" msgid="972182708034353383">"Se va primi fișierul. Verificați progresul în panoul de notificări."</string>
+ <string name="bt_toast_2" msgid="8602553334099066582">"Fișierul nu poate fi primit."</string>
+ <string name="bt_toast_3" msgid="6707884165086862518">"Primirea fișierului de la „<xliff:g id="SENDER">%1$s</xliff:g>” a fost anulată"</string>
+ <string name="bt_toast_4" msgid="4678812947604395649">"Se trimite fișierul către „<xliff:g id="RECIPIENT">%1$s</xliff:g>”"</string>
+ <string name="bt_toast_5" msgid="2846870992823019494">"Se trimit <xliff:g id="NUMBER">%1$s</xliff:g> (de) fișiere către „<xliff:g id="RECIPIENT">%2$s</xliff:g>”"</string>
+ <string name="bt_toast_6" msgid="1855266596936622458">"Trimiterea fișierului către „<xliff:g id="RECIPIENT">%1$s</xliff:g>” a fost anulată"</string>
+ <string name="bt_sm_2_1" product="nosdcard" msgid="352165168004521000">"Nu există spațiu suficient pe stocarea USB pentru a salva fișierul de la „<xliff:g id="SENDER">%1$s</xliff:g>”"</string>
+ <string name="bt_sm_2_1" product="default" msgid="1989018443456803630">"Nu există suficient spațiu pe cardul SD pentru a salva fișierul de la „<xliff:g id="SENDER">%1$s</xliff:g>”"</string>
<string name="bt_sm_2_2" msgid="2965243265852680543">"Spaţiu necesar: <xliff:g id="SIZE">%1$s</xliff:g>"</string>
<string name="ErrorTooManyRequests" msgid="8578277541472944529">"Există prea multe solicitări în curs de procesare. Încercați din nou mai târziu."</string>
- <string name="status_pending" msgid="2503691772030877944">"Transferul fişierului nu a început încă."</string>
- <string name="status_running" msgid="6562808920311008696">"Transferul fişierului este în curs de desfăşurare."</string>
- <string name="status_success" msgid="239573225847565868">"Transferul fişierului s-a încheiat."</string>
- <string name="status_not_accept" msgid="1695082417193780738">"Conţinutul nu este acceptat."</string>
- <string name="status_forbidden" msgid="613956401054050725">"Transfer interzis de dispozitivul de destinaţie."</string>
+ <string name="status_pending" msgid="2503691772030877944">"Transferul fișierului nu a început încă."</string>
+ <string name="status_running" msgid="6562808920311008696">"Transferul fișierului este în curs de desfășurare."</string>
+ <string name="status_success" msgid="239573225847565868">"Transferul fișierului s-a încheiat."</string>
+ <string name="status_not_accept" msgid="1695082417193780738">"Conținutul nu este acceptat."</string>
+ <string name="status_forbidden" msgid="613956401054050725">"Transfer interzis de dispozitivul de destinație."</string>
<string name="status_canceled" msgid="6664490318773098285">"Transfer anulat de către utilizator."</string>
<string name="status_file_error" msgid="3671917770630165299">"Problemă de stocare."</string>
- <string name="status_no_sd_card" product="nosdcard" msgid="1112125377088421469">"Nu există spaţiu de stocare USB."</string>
- <string name="status_no_sd_card" product="default" msgid="5760944071743325592">"Nu există card SD. Introduceţi un card SD pentru a salva fişierele transferate."</string>
- <string name="status_connection_error" msgid="947681831523219891">"Conectare eşuată."</string>
+ <string name="status_no_sd_card" product="nosdcard" msgid="1112125377088421469">"Nu există spațiu de stocare USB."</string>
+ <string name="status_no_sd_card" product="default" msgid="5760944071743325592">"Nu există card SD. Introduceți un card SD pentru a salva fișierele transferate."</string>
+ <string name="status_connection_error" msgid="947681831523219891">"Conectare eșuată."</string>
<string name="status_protocol_error" msgid="3245444473429269539">"Solicitarea nu poate fi gestionată corect."</string>
<string name="status_unknown_error" msgid="8156660554237824912">"Eroare necunoscută."</string>
<string name="btopp_live_folder" msgid="7967791481444474554">"Bluetooth recepționat"</string>
<string name="download_success" msgid="7036160438766730871">"Primire finalizată: <xliff:g id="FILE_SIZE">%1$s</xliff:g>."</string>
<string name="upload_success" msgid="4014469387779648949">"Trimitere finalizată: <xliff:g id="FILE_SIZE">%1$s</xliff:g>."</string>
<string name="inbound_history_title" msgid="6940914942271327563">"Transferuri de intrare"</string>
- <string name="outbound_history_title" msgid="4279418703178140526">"Transferuri de ieşire"</string>
+ <string name="outbound_history_title" msgid="4279418703178140526">"Transferuri de ieșire"</string>
<string name="no_transfers" msgid="3482965619151865672">"Istoricul de transferuri este gol."</string>
<string name="transfer_clear_dlg_msg" msgid="1712376797268438075">"Toate elementele din listă vor fi eliminate."</string>
- <string name="outbound_noti_title" msgid="8051906709452260849">"Distribuire prin Bluetooth: fişiere trimise"</string>
+ <string name="outbound_noti_title" msgid="8051906709452260849">"Distribuire prin Bluetooth: fișiere trimise"</string>
<string name="inbound_noti_title" msgid="4143352641953027595">"Bluetooth: fișiere primite"</string>
<plurals name="noti_caption_unsuccessful" formatted="false" msgid="2020750076679526122">
<item quantity="few"><xliff:g id="UNSUCCESSFUL_NUMBER_1">%1$d</xliff:g> fișiere netransferate.</item>
@@ -120,13 +119,13 @@
<item quantity="other"><xliff:g id="SUCCESSFUL_NUMBER_1">%1$d</xliff:g> de fișiere transferate, %2$s</item>
<item quantity="one"><xliff:g id="SUCCESSFUL_NUMBER_0">%1$d</xliff:g> fișier transferat, %2$s</item>
</plurals>
- <string name="transfer_menu_clear_all" msgid="790017462957873132">"Ștergeţi lista"</string>
- <string name="transfer_menu_open" msgid="3368984869083107200">"Deschideţi"</string>
- <string name="transfer_menu_clear" msgid="5854038118831427492">"Ștergeţi din listă"</string>
- <string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Ștergeţi"</string>
+ <string name="transfer_menu_clear_all" msgid="790017462957873132">"Ștergeți lista"</string>
+ <string name="transfer_menu_open" msgid="3368984869083107200">"Deschideți"</string>
+ <string name="transfer_menu_clear" msgid="5854038118831427492">"Ștergeți din listă"</string>
+ <string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Ștergeți"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Salvați"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Anulați"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Selectați conturile la care doriți să permiteți accesul prin Bluetooth. Va trebui să acceptați accesul la conturi la conectare."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Selectați conturile la care doriți să permiteți accesul prin Bluetooth. Va trebui să acceptați accesul la conturi la conectare."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Sloturi rămase:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Pictograma aplicației"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Setări de permitere a accesului la mesajele prin Bluetooth"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index a99f4f9..c38e425 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Принять"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"ОК"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"В процессе приема файла от \"<xliff:g id="SENDER">%1$s</xliff:g>\" произошел тайм-аут"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Передача по Bluetooth"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Принять файл?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Входящий файл с другого устройства. Подтвердите, что хотите загрузить его."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Входящий файл"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"Устройство \"<xliff:g id="SENDER">%1$s</xliff:g>\" готово к отправке файла \"<xliff:g id="FILE">%2$s</xliff:g>\""</string>
<string name="notification_receiving" msgid="4674648179652543984">"Передача по Bluetooth: <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Получено по Bluetooth: <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Файл не передан: <xliff:g id="FILE">%1$s</xliff:g>"</string>
@@ -128,7 +127,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Очистить"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Сохранить"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Отменить"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Выберите аккаунты, к которым нужно открыть доступ через Bluetooth. Доступ необходимо подтверждать при каждом подключении."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Выберите аккаунты, к которым нужно открыть доступ через Bluetooth. Доступ необходимо подтверждать при каждом подключении."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Осталось мест:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Значок приложения"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Настройки доступа к сообщениям через Bluetooth"</string>
diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml
index 2edcc43..742e288 100644
--- a/res/values-si-rLK/strings.xml
+++ b/res/values-si-rLK/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"පිළිගන්න"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"හරි"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"\"<xliff:g id="SENDER">%1$s</xliff:g>\" වෙතින් පැමිණෙන ගොනුවක් පිළිගන්නා අතරතුර කාල නිමාවක් විය"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"බ්ලූටූත් බෙදා ගැනීම: පැමිණෙන ගොනුව"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"ඔබට මෙම ගොනුව ලබා ගැනීමට අවශ්යද?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"වෙනත් උපාංගයක් වෙතින් පැමිණෙන ගොනුව. මෙම ගොනුව ලබා ගැනීමට ඔබට අවශ්ය බව තහවුරු කරන්න."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"ලැබෙන ගොනුව"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> <xliff:g id="FILE">%2$s</xliff:g> යැවීමට සූදානම්ය"</string>
<string name="notification_receiving" msgid="4674648179652543984">"බ්ලූටූත් බෙදා ගැනීම: <xliff:g id="FILE">%1$s</xliff:g> ලැබේ"</string>
<string name="notification_received" msgid="3324588019186687985">"බ්ලූටූත් බෙදා ගැනීම: <xliff:g id="FILE">%1$s</xliff:g> ලැබිණි"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"බ්ලූටූත් බෙදා ගැනීම: <xliff:g id="FILE">%1$s</xliff:g> ගොනුව නොලැබිණි"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"හිස් කරන්න"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"සුරකින්න"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"අවලංගු කරන්න"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"බ්ලූටූත් හරහා ඔබට බෙදාගැනීමට අවශ්ය ගිණුම් තෝරන්න. සම්බන්ධ වන විට ගිණුම් වෙත ඕනෑම ප්රවේශයක් ඔබ තවමත් පිළිගත යුතුයි."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"ඔබට බ්ලූටූත් හරහා බෙදා ගැනීමට අවශ්ය ගිණුම් තෝරන්න. සම්බන්ධ වන විට ඔබට තවම ගිණුම් වෙත ඕනෑම ප්රවේශයක් පිළිගැනීමට සිදු වේ."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"ඉතිරිව ඇති විවර:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"යෙදුම් නිරූපකය"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"බ්ලූටූත් පණිවිඩ බෙදාගැනීමේ සැකසීම්"</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 5550234..63cce4d 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Prijať"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Pri prijímaní prichádzajúceho súboru od používateľa <xliff:g id="SENDER">%1$s</xliff:g> vypršal časový limit."</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth: Prichádzajúci súbor"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Chcete prijať tento súbor?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Potvrďte príjem súboru prichádzajúceho z iného zariadenia."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Prichádzajúci súbor"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> je pripravený/-á odoslať súbor <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth: Prijíma sa <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetooth: <xliff:g id="FILE">%1$s</xliff:g> prijatý"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth: <xliff:g id="FILE">%1$s</xliff:g> neprijatý"</string>
@@ -128,7 +127,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Vymazať"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Uložiť"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Zrušiť"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Vyberte účty, ktoré chcete zdieľať prostredníctvom rozhrania Bluetooth. Počas pripájania budete musieť aj tak prijať akékoľvek prístupy k účtom."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Vyberte účty, ktoré chcete zdieľať prostredníctvom rozhrania Bluetooth. Počas pripájania budete musieť aj tak prijať akékoľvek prístupy k účtom."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Počet zostávajúcich slotov:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Ikona aplikácie"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Nastavenia zdieľania správ prostredníctvom rozhrania Bluetooth"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 1d5f9d3..94bd1b4 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Sprejmi"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"V redu"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Pri sprejemanju datoteke pošiljatelja »<xliff:g id="SENDER">%1$s</xliff:g>« je potekla časovna omejitev"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth: Prihajajoča datoteka"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Ali želite prejeti to datoteko?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Iz druge naprave prihaja datoteka. Potrdite, da jo želite prejeti."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Dohodna datoteka"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"Uporabnik <xliff:g id="SENDER">%1$s</xliff:g> je pripravljen za pošiljanje datoteke <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth: Prejemanje <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetooth: Prejeto <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth: Datoteka <xliff:g id="FILE">%1$s</xliff:g> ni bila prejeta"</string>
@@ -128,7 +127,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Počisti"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Shrani"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Prekliči"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Izberite račune, ki jih želite dati v skupno rabo prek Bluetootha. Pri vzpostavljanju povezave morate še vedno sprejeti morebiten dostop do računov."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Izberite račune, ki jih želite dati v skupno rabo prek Bluetootha. Pri vzpostavljanju povezave morate še vedno sprejeti morebiten dostop do računov."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Preostala mesta:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Ikona aplikacije"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Nastavitve skupne rabe sporočil prek Bluetootha"</string>
diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml
index 1c4e732..9e03478 100644
--- a/res/values-sq-rAL/strings.xml
+++ b/res/values-sq-rAL/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Prano"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"Në rregull!"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Përfundoi koha e veprimit për pranimin e skedarit hyrës nga \"<xliff:g id="SENDER">%1$s</xliff:g>\""</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Shpërndarja përmes bluetooth-it: Skedar hyrës"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Dëshiron ta marrësh këtë skedar?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Skedar hyrës nga një tjetër pajisje. Konfirmo që dëshiron ta marrësh këtë skedar."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Skedari në ardhje"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> është gati për të dërguar <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Shpërndarja përmes bluetooth-it: Po merret skedari <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Shpërndarja përmes bluetooth-it: U pranua skedari <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Shpërndarja përmes bluetooth-it: Skedari <xliff:g id="FILE">%1$s</xliff:g> nuk u pranua"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Pastro"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Ruaj"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Anulo"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Zgjidh llogaritë që dëshiron të ndash nëpërmjet Bluetooth-it. Duhet të pranosh përsëri çdo qasje te llogaritë kur të lidhesh."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Zgjidh llogaritë që dëshiron të ndash me Bluetooth. Duhet të pranosh përsëri çdo qasje te llogaritë kur të lidhesh."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Fole të mbetura:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Ikona e aplikacionit"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Cilësimet e ndarjes së mesazheve me Bluetooth"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index d873a8f..4802a5e 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Прихвати"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"Потврди"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Дошло је до временског ограничења током пријема долазне датотеке од „<xliff:g id="SENDER">%1$s</xliff:g>“"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Дељење преко Bluetooth-а: долазећа датотека"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Да ли желите да примите ову датотеку?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Долазна датотека са другог уређаја. Потврдите да желите да је примите."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Долазна датотека"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> је спреман/на да пошаље <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth дељење: пријем <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetooth дељење: примљено <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth дељење: датотека <xliff:g id="FILE">%1$s</xliff:g> није примљена"</string>
@@ -126,7 +125,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Брисање"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Сачувај"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Откажи"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Изаберите налоге које желите да делите преко Bluetooth-а. И даље морате да прихватите било какав приступ налозима при повезивању."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Изаберите налоге које желите да делите преко Bluetooth-а. И даље морате да прихватите било какав приступ налозима при повезивању."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Преосталих места:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Икона апликације"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Подешавања Bluetooth дељења порука"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 44db0c8..d5455aa 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Godkänn"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Tidsgränsen överskreds när en inkommande fil från <xliff:g id="SENDER">%1$s</xliff:g> skulle tas emot"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth-delning: inkommande fil"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Vill du ta emot den här filen?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Inkommande fil från en annan enhet. Bekräfta att du vill ta emot denna fil."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Inkommande fil"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> är klar att skicka <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth-delning: tar emot <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetooth-delning: <xliff:g id="FILE">%1$s</xliff:g> har tagits emot"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth-delning: filen <xliff:g id="FILE">%1$s</xliff:g> har inte tagits emot"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Rensa"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Spara"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Avbryt"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Välj de konton du vill dela via Bluetooth. Du måste fortfarande godkänna åtkomsten till kontona vid anslutning."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Välj de konton du vill dela via Bluetooth. Du måste fortfarande godkänna åtkomsten till kontona vid anslutning."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Platser kvar:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Appikon"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Inställningar för meddelandedelning via Bluetooth"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index bb744ca..9bf5af1 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Kubali"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"Sawa"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Muda ulikatika wakati wa kukubali faili inayoingia kutoka \"<xliff:g id="SENDER">%1$s</xliff:g>\""</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Shiriki Bluetooth: Faili inayoingia"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Je, unataka kupokea faili hii?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Faili zinazoingia kutoka kwa kifaa kingine. Thibitisha kuwa unataka kupokea faili hii."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Faili Zinazoingia"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> ako tayari kutuma <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Kushiriki kwa bluetooth: Inapokea <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Kushiriki kwa bluetooth: Imepokea <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Kushiriki kwa Bluetooth: Faili <xliff:g id="FILE">%1$s</xliff:g> haijapokewa"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Futa"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Hifadhi"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Ghairi"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Chagua akaunti unazotaka kushiriki kupitia Bluetooth. Bado unatakiwa kukubali ufikiaji wowote kwenye akaunti yako wakati unaunganisha."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Chagua akaunti unazotaka kushiriki kupitia Bluetooth. Bado unatakiwa kutoa idhini ya ufikiaji wowote kwenye akaunti yako wakati unaunganisha."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Nafasi zilizosalia:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Aikoni ya programu"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Mipangilio ya Kushiriki Ujumbe wa Bluetooth"</string>
diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml
index 98b284e..9a06227 100644
--- a/res/values-ta-rIN/strings.xml
+++ b/res/values-ta-rIN/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"ஏற்கிறேன்"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"சரி"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"\"<xliff:g id="SENDER">%1$s</xliff:g>\" இடமிருந்து வரும் கோப்பை ஏற்கும்போது நேரம் முடிந்தது"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"புளூடூத் பகிர்வு: உள்வரும் கோப்பு"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"கோப்பைப் பெறவா?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"வேறொரு சாதனத்திலிருந்து கோப்பு வருகிறது. அதைப் பெற விருப்பமா என்பதை உறுதிப்படுத்தவும்."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"உள்வரும் கோப்பு"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g>, <xliff:g id="FILE">%2$s</xliff:g> கோப்பை அனுப்புவதற்குத் தயாராக உள்ளார்"</string>
<string name="notification_receiving" msgid="4674648179652543984">"புளூடூத் பகிர்வு: <xliff:g id="FILE">%1$s</xliff:g> ஐப் பெறுகிறது"</string>
<string name="notification_received" msgid="3324588019186687985">"புளூடூத் பகிர்வு: <xliff:g id="FILE">%1$s</xliff:g> பெறப்பட்டது"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"புளூடூத் பகிர்வு: <xliff:g id="FILE">%1$s</xliff:g> ஐப் பெறவில்லை"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"அழி"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"சேமி"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"ரத்துசெய்"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"புளுடூத் வழியாகப் பகிர விரும்பும் மின்னஞ்சல் கணக்குகளைத் தேர்வுசெய்யவும். இணைக்கும்போது கணக்கிற்கான எந்த அணுகல்களையும் ஏற்க வேண்டும்."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"புளூடூத் வழியாகப் பகிர விரும்பும் கணக்குகளைத் தேர்ந்தெடுக்கவும். இணைக்கும் போது கணக்குகளுக்கான அணுகலை மீண்டும் ஏற்க வேண்டும்."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"மீதமுள்ள ஸ்லாட்கள்:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"பயன்பாட்டு ஐகான்"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"புளூடூத் செய்தி பகிர்தல் அமைப்புகள்"</string>
diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml
index 088f92f..5636ade 100644
--- a/res/values-te-rIN/strings.xml
+++ b/res/values-te-rIN/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"అంగీకరిస్తున్నాను"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"సరే"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"\"<xliff:g id="SENDER">%1$s</xliff:g>\" పంపిన ఇన్కమింగ్ ఫైల్ను అంగీకరిస్తున్నప్పుడు గడువు సమయం ముగిసింది"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"బ్లూటూత్ భాగస్వామ్యం: ఇన్కమింగ్ ఫైల్"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"మీరు ఈ ఫైల్ను స్వీకరించాలనుకుంటున్నారా?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"మరో పరికరం నుండి ఇన్కమింగ్ ఫైల్. మీరు ఈ ఫైల్ను స్వీకరించాలనుకుంటున్నట్లు నిర్ధారించండి."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"ఫైల్ స్వీకరణ"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> <xliff:g id="FILE">%2$s</xliff:g> ఫైల్ పంపడానికి సిద్ధంగా ఉన్నారు"</string>
<string name="notification_receiving" msgid="4674648179652543984">"బ్లూటూత్ భాగస్వామ్యం: <xliff:g id="FILE">%1$s</xliff:g>ను స్వీకరిస్తోంది"</string>
<string name="notification_received" msgid="3324588019186687985">"బ్లూటూత్ భాగస్వామ్యం: <xliff:g id="FILE">%1$s</xliff:g> స్వీకరించబడింది"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"బ్లూటూత్ భాగస్వామ్యం: <xliff:g id="FILE">%1$s</xliff:g> ఫైల్ స్వీకరించబడలేదు"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"క్లియర్ చేయి"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"సేవ్ చేయి"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"రద్దు చేయి"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"మీరు బ్లూటూత్ ద్వారా భాగస్వామ్యం చేయాలనుకునే ఖాతాలను ఎంచుకోండి. మీరు ఇప్పటికీ కనెక్ట్ చేస్తున్నప్పుడు ఖాతాలకు అందించే ఏ ప్రాప్యతనైనా ఆమోదించాలి."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"మీరు బ్లూటూత్ ద్వారా భాగస్వామ్యం చేయాలనుకునే ఖాతాలను ఎంచుకోండి. మీరు ఇప్పటికీ కనెక్ట్ చేస్తున్నప్పుడు ఖాతాలకు అందించే ఏ ప్రాప్యతనైనా ఆమోదించాల్సి ఉంటుంది."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"మిగిలిన స్లాట్లు:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"అనువర్తన చిహ్నం"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"బ్లూటూత్ సందేశ భాగస్వామ్య సెట్టింగ్లు"</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 1fe1795..14b7741 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"ยอมรับ"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"ตกลง"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"มีการหมดเวลาเกิดขึ้นขณะยอมรับไฟล์ขาเข้าจาก \"<xliff:g id="SENDER">%1$s</xliff:g>\""</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"การแชร์ทางบลูทูธ: ไฟล์ขาเข้า"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"คุณต้องการรับไฟล์นี้หรือไม่"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"ไฟล์ขาเข้าจากอุปกรณ์อื่น ยืนยันว่าคุณต้องการรับไฟล์นี้"</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"ไฟล์ที่เข้ามา"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> พร้อมที่จะส่ง <xliff:g id="FILE">%2$s</xliff:g> แล้ว"</string>
<string name="notification_receiving" msgid="4674648179652543984">"การแชร์ทางบลูทูธ: กำลังรับ <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"การแชร์ทางบลูทูธ: รับ <xliff:g id="FILE">%1$s</xliff:g> แล้ว"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"การแชร์ทางบลูทูธ: ไม่ได้รับไฟล์ <xliff:g id="FILE">%1$s</xliff:g>"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"ล้าง"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"บันทึก"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"ยกเลิก"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"เลือกบัญชีที่คุณต้องการแชร์ผ่านบลูทูธ คุณยังคงต้องยอมรับการเข้าถึงบัญชีทั้งหมดเมื่อเชื่อมต่อ"</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"เลือกบัญชีที่คุณต้องการแชร์ผ่านบลูทูธ คุณยังคงต้องยอมรับการเข้าถึงบัญชีทั้งหมดเมื่อเชื่อมต่อ"</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"ช่องที่เหลือ:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"ไอคอนแอปพลิเคชัน"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"การตั้งค่าการแชร์ข้อความผ่านบลูทูธ"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 7033d1c..8355692 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Tanggapin"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Nagkaroon ng timeout habang tinatanggap ang papasok na file mula kay \"<xliff:g id="SENDER">%1$s</xliff:g>\""</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth share: Paparating na file"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Nais mo bang tanggapin ang file na ito?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Papasok na file mula sa isa pang device. Kumpirmahing nais mong tanggapin ang file na ito."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Papasok na file"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"Handa nang ipadala ni <xliff:g id="SENDER">%1$s</xliff:g> ang <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Pagbahagi sa Bluetooth: Tinatanggap ang <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Pagbahagi sa Bluetooth: Natanggap ang <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Pagbahagi sa Bluetooth: Hindi natanggap ang file na <xliff:g id="FILE">%1$s</xliff:g>"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"I-clear"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"I-save"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Kanselahin"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Piliin ang mga account na gusto mong ibahagi sa pamamagitan ng Bluetooth. Kailangan mo pa ring tumanggap ng access sa mga account kapag kumokonekta."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Piliin ang mga account na gusto mong ibahagi sa pamamagitan ng Bluetooth. Kailangan mo pa ring tanggapin ang anumang pag-access sa mga account kapag kumokonekta."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Mga slot na natitira:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Icon ng Application"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Mga Setting ng Pagbabahagi ng Mensahe sa Bluetooth"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index f539c97..84eb7c4 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Kabul Et"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"Tamam"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"\"<xliff:g id="SENDER">%1$s</xliff:g>\" kaynağından gelen dosyayı kabul etme süresi doldu"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth paylaşımı: Gelen dosya"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Bu dosyayı almak istiyor musunuz?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Başka cihazdan gelen bir dosya. Bu dosyayı almak istediğinizi onaylayın."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Gelen dosya"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g>, <xliff:g id="FILE">%2$s</xliff:g> adlı dosyayı göndermeye hazır"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth paylaşımı: <xliff:g id="FILE">%1$s</xliff:g> alınıyor"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetooth paylaşımı: <xliff:g id="FILE">%1$s</xliff:g> alındı"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Bluetooth paylaşımı: <xliff:g id="FILE">%1$s</xliff:g> dosyası alınamadı"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Temizle"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Kaydet"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"İptal"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Bluetooth üzerinden paylaşmak istediğiniz hesapları seçin. Bağlanırken yine de hesaplara erişimi kabul etmeniz gerekmektedir."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Bluetooth üzerinden paylaşmak istediğiniz hesapları seçin. Bağlanırken yine de hesaplara erişimi kabul etmeniz gerekmektedir."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Kalan yuva sayısı:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Uygulama Simgesi"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Bluetooth İleti Paylaşımı Ayarları"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index b951c4d..82c51ea 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Прийняти"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Під час приймання вхідного файлу від \"<xliff:g id="SENDER">%1$s</xliff:g>\" виникла затримка"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Через Bluetooth: вхідний файл"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Отримати цей файл?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Вхідний файл з іншого пристрою. Підтвердьте, що хочете отримати цей файл."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Вхідний файл"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"Користувач <xliff:g id="SENDER">%1$s</xliff:g> готовий надіслати файл <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Через Bluetooth: отримання <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Через Bluetooth: отримано <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Через Bluetooth: файл <xliff:g id="FILE">%1$s</xliff:g> не отримано"</string>
@@ -128,7 +127,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Очистити"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Зберегти"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Скасувати"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Виберіть облікові записи, до яких ви хочете надати доступ через Bluetooth. Під час підключення все одно потрібно буде схвалити доступ до облікових записів."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Виберіть облікові записи, до яких ви хочете надати доступ через Bluetooth. Під час підключення все одно потрібно буде схвалити доступ до облікових записів."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Залишилося місць:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Значок додатка"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Параметри надсилання повідомлень через Bluetooth"</string>
diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml
index fbf2136..3a9c243 100644
--- a/res/values-ur-rPK/strings.xml
+++ b/res/values-ur-rPK/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"قبول کریں"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"ٹھیک ہے"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"\"<xliff:g id="SENDER">%1$s</xliff:g>\" کی جانب سے ایک موصول ہونے والی فائل کو قبول کرتے وقت ایک ٹائم آؤٹ پیش آگیا"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"بلوٹوتھ اشتراک: موصول ہونے والی فائل"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"کیا آپ اس فائل کو موصول کرنا چاہتے ہیں؟"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"کسی دوسرے آلہ سے موصول ہونے والی فائل۔ توثیق کریں کہ آپ اس فائل کو موصول کرنا چاہتے ہیں۔"</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"آنے والی فائل"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> <xliff:g id="FILE">%2$s</xliff:g> بھیجنے کے لئے تیار ہے"</string>
<string name="notification_receiving" msgid="4674648179652543984">"بلوٹوتھ اشتراک: <xliff:g id="FILE">%1$s</xliff:g> موصول ہو رہی ہے"</string>
<string name="notification_received" msgid="3324588019186687985">"بلوٹوتھ اشتراک: <xliff:g id="FILE">%1$s</xliff:g> موصول ہوئی"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"بلوٹوتھ اشتراک: فائل <xliff:g id="FILE">%1$s</xliff:g> موصول نہیں ہوئی"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"صاف کریں"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"محفوظ کریں"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"منسوخ کریں"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"ان اکاؤنٹس کو منتخب کریں جن کا آپ بلوٹوتھ کے ذریعے اشتراک کرنا چاہتے ہیں۔ آپ کو ابھی بھی منسلک ہوتے وقت اکاؤنٹس تک کسی رسائی کو قبول کرنا ہوگا۔"</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"ان اکاؤنٹس کو منتخب کریں جن کا آپ بلوٹوتھ کے ذریعے اشتراک کرنا چاہتے ہیں۔ آپ کو ابھی بھی منسلک ہوتے وقت اکاؤنٹس تک کسی بھی رسائی کو قبول کرنا ہوگا۔"</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"بچے ہوئے سلاٹس:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"ایپلیکیشن کا آئیکن"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"بلوٹوتھ پیغام کے اشتراک کی ترتیبات"</string>
diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml
index 040aa55..fb49844 100644
--- a/res/values-uz-rUZ/strings.xml
+++ b/res/values-uz-rUZ/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Qabul qilish"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"\"<xliff:g id="SENDER">%1$s</xliff:g>\"dan kiruvchi xabarni olishga rozilik bildirilayotganda, kutish vaqti o‘tib ketdi."</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Bluetooth o‘tkazmalari"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Fayl qabul qilinsinmi?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Boshqa qurilmadan kiruvchi fayl. Ushbu faylni qabul qilmoqchi bo‘lsangiz, tasdiqlang."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Kiruvchi fayl"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"“<xliff:g id="SENDER">%1$s</xliff:g>” qurilmasi “<xliff:g id="FILE">%2$s</xliff:g>” faylini yuborishga tayyor"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Bluetooth orqali yuborildi: <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Bluetooth orqali olindi: <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Fayl qabul qilinmadi: <xliff:g id="FILE">%1$s</xliff:g>"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Tozalash"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Saqlash"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Bekor qilish"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Bluetooth orqali o‘tkazmoqchi bo‘lgan hisoblarni tanlang. Har safar ulanishda so‘rovni tasdiqlash talab qilinadi."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Bluetooth orqali narsa o‘tkazmoqchi bo‘lgan hisoblarni tanlang. Har safar ulanishda so‘rovni tasdiqlash talab qilinadi."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Qolgan joylar:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Ilova ikonkasi"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Bluetooth orqali xabar ulashish sozlamalari"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index e34224e..8d5afbe 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Chấp nhận"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"OK"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Có thời gian chờ trong khi chấp nhận tệp tới từ \"<xliff:g id="SENDER">%1$s</xliff:g>\""</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Chia sẻ qua Bluetooth: Tệp đến"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Bạn có muốn nhận tệp này không?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Có tệp đến từ một thiết bị khác. Hãy xác nhận bạn muốn nhận tệp này."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Tệp đến"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> đã sẵn sàng gửi <xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Chia sẻ qua Bluetooth: Đang nhận <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Chia sẻ qua Bluetooth: Đã nhận <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Chia sẻ qua Bluetooth: Chưa nhận được tệp <xliff:g id="FILE">%1$s</xliff:g>"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Xóa"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Lưu"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Hủy"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Chọn tài khoản mà bạn muốn chia sẻ qua Bluetooth. Bạn vẫn phải chấp nhận mọi quyền truy cập vào tài khoản khi kết nối."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Chọn tài khoản mà bạn muốn chia sẻ qua Bluetooth. Bạn vẫn phải chấp nhận mọi quyền truy cập vào tài khoản khi kết nối."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Số khe cắm còn lại:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Biểu tượng ứng dụng"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Cài đặt chia sẻ thư qua Bluetooth"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index d9f5a1f..bb840f3 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"接受"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"确定"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"接受来自“<xliff:g id="SENDER">%1$s</xliff:g>”的文件时发生超时"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"蓝牙共享:传入文件"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"要接收该文件吗?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"从其他设备传入了文件,请确认是否要接收。"</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"有人发送文件给您"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g>已准备好发送<xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"蓝牙共享:正在接收“<xliff:g id="FILE">%1$s</xliff:g>”"</string>
<string name="notification_received" msgid="3324588019186687985">"蓝牙共享:已接收“<xliff:g id="FILE">%1$s</xliff:g>”"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"蓝牙共享:未收到文件“<xliff:g id="FILE">%1$s</xliff:g>”"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"清除"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"保存"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"取消"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"选中您要通过蓝牙共享的帐号。建立连接后,您仍需接受对这些帐号的所有访问请求。"</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"选择您要通过蓝牙共享的帐号。连接时,您仍必须接受所有帐号访问请求。"</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"剩余空档数:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"应用图标"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"蓝牙消息共享设置"</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 666b7dc..eeb1d25 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"接受"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"確定"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"接收來自「<xliff:g id="SENDER">%1$s</xliff:g>」的檔案時發生作業逾時"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"藍牙分享:外來檔案"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"您要接收這個檔案嗎?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"來自另一部裝置的檔案,請確認您要接收這個外來檔案。"</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"收到的檔案"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g>準備傳送<xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"藍牙分享:正在接收 <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"藍牙分享:已接收 <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"藍牙分享:未收到檔案 <xliff:g id="FILE">%1$s</xliff:g>"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"清除"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"儲存"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"取消"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"選取您要透過藍牙分享的帳戶。連線時,您仍然必須接受所有帳戶存取要求。"</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"選取您要透過藍牙分享的帳戶。連線時,您仍然必須接受所有帳戶存取要求。"</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"剩餘插槽數:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"應用程式圖示"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"藍牙訊息分享設定"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 54d4052..3ac1e19 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"接受"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"確定"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"接收來自「<xliff:g id="SENDER">%1$s</xliff:g>」的檔案時發生作業逾時"</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"藍牙分享:外來檔案"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"您要接收這個檔案嗎?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"其他裝置傳來檔案,請確認是否要接收這個檔案。"</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"有人傳送檔案給您"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g>已準備好傳送<xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"藍牙分享:正在接收 <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"藍牙分享:已接收 <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"藍牙分享:未收到檔案 <xliff:g id="FILE">%1$s</xliff:g>"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"清除"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"儲存"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"取消"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"選取您要透過藍牙分享的帳戶。連線時,您仍須接受所有帳戶存取要求。"</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"選取您要透過藍牙分享的帳戶。連線時,您仍須接受所有帳戶存取要求。"</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"剩餘插槽數:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"應用程式圖示"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"藍牙郵件分享設定"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 04b7936..5d95c60 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -36,9 +36,8 @@
<string name="incoming_file_confirm_ok" msgid="281462442932231475">"Yamukela"</string>
<string name="incoming_file_confirm_timeout_ok" msgid="1414676773249857278">"Kulungile"</string>
<string name="incoming_file_confirm_timeout_content" msgid="172779756093975981">"Isikhathi siphelile ngenkathi yamukela ifayela engenayo esuka ku- \"<xliff:g id="SENDER">%1$s</xliff:g>\""</string>
- <string name="incoming_file_confirm_Notification_title" msgid="2958227698135117210">"Abelana ne-Bluetooth: Ifayela engenayo"</string>
- <string name="incoming_file_confirm_Notification_caption" msgid="6671081128475981157">"Ngabe uyafuna ukuthola leli fayela?"</string>
- <string name="incoming_file_toast_msg" msgid="1733710749992901811">"Kunefayela engenayo esuka kwenye idivayisi. Qiniseka ukuthi ufuna ukuthola lefayela."</string>
+ <string name="incoming_file_confirm_Notification_title" msgid="5573329005298936903">"Ifayela elingenayo"</string>
+ <string name="incoming_file_confirm_Notification_content" msgid="3359694069319644738">"<xliff:g id="SENDER">%1$s</xliff:g> ulungele ukuthumela i-<xliff:g id="FILE">%2$s</xliff:g>"</string>
<string name="notification_receiving" msgid="4674648179652543984">"Abelana ne-Bluetooth: Ithola<xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received" msgid="3324588019186687985">"Abelana ne-Bluetooth: Itholakele <xliff:g id="FILE">%1$s</xliff:g>"</string>
<string name="notification_received_fail" msgid="3619350997285714746">"Abelana ne-Bluetooth: Ifayela <xliff:g id="FILE">%1$s</xliff:g> ayitholakalanga"</string>
@@ -124,7 +123,7 @@
<string name="transfer_clear_dlg_title" msgid="2953444575556460386">"Sula"</string>
<string name="bluetooth_map_settings_save" msgid="7635491847388074606">"Londoloza"</string>
<string name="bluetooth_map_settings_cancel" msgid="9205350798049865699">"Khansela"</string>
- <string name="bluetooth_map_settings_intro" msgid="6793938602201480648">"Khetha ama-akhawunti ofuna ukwabelana ngawo nge-Bluetooth. Kusazomele wamukele noma yikuphi ukufinyelela kuma-akhawunti uma uxhumeka."</string>
+ <string name="bluetooth_map_settings_intro" msgid="6482369468223987562">"Khetha ama-akhawunti ofuna ukwabelana nawo nge-Bluetooth. Kusazomele wamukele noma yikuphi ukufinyelelwa kuma-akhawunti uma kuxhunywa."</string>
<string name="bluetooth_map_settings_count" msgid="4557473074937024833">"Izikhala ezisele:"</string>
<string name="bluetooth_map_settings_app_icon" msgid="7105805610929114707">"Isithonjana sohlelo lokusebenza"</string>
<string name="bluetooth_map_settings_title" msgid="7420332483392851321">"Izilungiselelo zokwabelana ngomlayezo we-Bluetooth"</string>
diff --git a/res/values/config.xml b/res/values/config.xml
index 42ab4b9..408432a 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -23,7 +23,7 @@
<bool name="profile_supported_pan">true</bool>
<bool name="profile_supported_pbap">true</bool>
<bool name="profile_supported_gatt">true</bool>
- <bool name="pbap_include_photos_in_vcard">false</bool>
+ <bool name="pbap_include_photos_in_vcard">true</bool>
<bool name="pbap_use_profile_for_owner_vcard">true</bool>
<bool name="profile_supported_map">true</bool>
<bool name="profile_supported_avrcp_controller">false</bool>
@@ -43,4 +43,10 @@
<integer name="gatt_low_power_max_interval">100</integer>
<bool name="headset_client_initial_audio_route_allowed">true</bool>
+
+ <!-- For AVRCP absolute volume feature. If the threshold is non-zero,
+ restrict the initial volume to the threshold.
+ Valid value is 1-14, and recommended value is 8 -->
+ <integer name="a2dp_absolute_volume_initial_threshold">8</integer>
+
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index c47aaf2..1e7f285 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -79,10 +79,8 @@
<string name="incoming_file_confirm_timeout_content">There was a timeout while accepting an incoming file from \u0022<xliff:g id="sender">%1$s</xliff:g>\u0022</string>
<!-- Bluetooth File Transfer Acceptance Notification item -->
- <string name="incoming_file_confirm_Notification_title">Bluetooth share: Incoming file</string>
- <string name="incoming_file_confirm_Notification_caption">Do you want to receive this file?</string>
- <string name="incoming_file_toast_msg">Incoming file from another device.
- Confirm you want to receive this file.</string>
+ <string name="incoming_file_confirm_Notification_title">Incoming file</string>
+ <string name="incoming_file_confirm_Notification_content"><xliff:g id="sender">%1$s</xliff:g> is ready to send <xliff:g id="file">%2$s</xliff:g></string>
<!-- Inbound File Transfer Progress Notification item -->
<!-- label for the notification item of receiving file -->
@@ -240,7 +238,7 @@
<string name="bluetooth_map_settings_save">Save</string>
<string name="bluetooth_map_settings_cancel">Cancel</string>
- <string name="bluetooth_map_settings_intro">Select the accounts you want to share through Bluetooth. You still have to accept any acceess to the accounts when connecting.</string>
+ <string name="bluetooth_map_settings_intro">Select the accounts you want to share through Bluetooth. You still have to accept any access to the accounts when connecting.</string>
<string name="bluetooth_map_settings_count">Slots left:</string>
<string name="bluetooth_map_settings_app_icon">Application Icon</string>
<string name="bluetooth_map_settings_title">Bluetooth Message Sharing Settings</string>
diff --git a/services/A2dpMediaBrowserService/Android.mk b/services/A2dpMediaBrowserService/Android.mk
new file mode 100644
index 0000000..f7a5e97
--- /dev/null
+++ b/services/A2dpMediaBrowserService/Android.mk
@@ -0,0 +1,19 @@
+# Copyright 2015 Google Inc. All Rights Reserved.
+
+LOCAL_PATH := $(call my-dir)
+
+# Build the application.
+include $(CLEAR_VARS)
+
+LOCAL_PACKAGE_NAME := A2dpMediaBrowserService
+LOCAL_MODULE_TAGS := optional
+LOCAL_CERTIFICATE := platform
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_RESOURCE_DIR = $(LOCAL_PATH)/res
+
+LOCAL_PROGUARD_ENABLED := disabled
+
+include $(BUILD_PACKAGE)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/services/A2dpMediaBrowserService/AndroidManifest.xml b/services/A2dpMediaBrowserService/AndroidManifest.xml
new file mode 100644
index 0000000..fa63ff4
--- /dev/null
+++ b/services/A2dpMediaBrowserService/AndroidManifest.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright 2015, 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.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.google.android.a2dpsink.mbs" >
+
+ <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="21" />
+
+ <uses-permission android:name="android.permission.BLUETOOTH" />
+ <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
+ <uses-permission android:name="android.permission.MODIFY_AUDIO_ROUTING" />
+ <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
+
+ <application
+ android:allowBackup="false"
+ android:icon="@drawable/ic_launcher"
+ android:label="@string/app_name"
+ android:theme="@style/AppTheme" >
+ <meta-data android:name="com.google.android.gms.car.application"
+ android:resource="@xml/automotive_app_desc" />
+
+ <meta-data android:name="com.google.android.gms.car.notification.SmallIcon"
+ android:resource="@drawable/ic_notification" />
+
+ <service android:name=".A2dpMediaBrowserService" android:exported="true">
+ <intent-filter>
+ <action android:name="android.media.browse.MediaBrowserService" />
+ </intent-filter>
+ </service>
+
+ <receiver android:name=".BootCompleteReceiver">
+ <intent-filter>
+ <action android:name="android.intent.action.BOOT_COMPLETED" />
+ </intent-filter>
+ </receiver>
+
+ </application>
+</manifest>
diff --git a/services/A2dpMediaBrowserService/res/drawable-hdpi/ic_launcher.png b/services/A2dpMediaBrowserService/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000..9075ff1
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/services/A2dpMediaBrowserService/res/drawable-hdpi/ic_notification.png b/services/A2dpMediaBrowserService/res/drawable-hdpi/ic_notification.png
new file mode 100644
index 0000000..9075ff1
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/drawable-hdpi/ic_notification.png
Binary files differ
diff --git a/services/A2dpMediaBrowserService/res/values-af/strings.xml b/services/A2dpMediaBrowserService/res/values-af/strings.xml
new file mode 100644
index 0000000..7bc9fb4
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-af/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth-oudio"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth-oudio is gekoppel"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Bluetooth-oudio is ontkoppel"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-am/strings.xml b/services/A2dpMediaBrowserService/res/values-am/strings.xml
new file mode 100644
index 0000000..ee1d283
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-am/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"የብሉቱዝ ኦዲዮ"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"የብሉቱዝ ኦዲዮ ተገናኝቷል"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"የብሉቱዝ ኦዲዮ ግንኙነት ተቋርጧል"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-ar/strings.xml b/services/A2dpMediaBrowserService/res/values-ar/strings.xml
new file mode 100644
index 0000000..acc0daf
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-ar/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"بث صوتي عبر البلوتوث"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"تم الاتصال بالبث الصوتي عبر البلوتوث."</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"انقطع الاتصال بالبث الصوتي عبر البلوتوث."</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-az-rAZ/strings.xml b/services/A2dpMediaBrowserService/res/values-az-rAZ/strings.xml
new file mode 100644
index 0000000..160c78c
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-az-rAZ/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth audio"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth audio bağlantısı yaradıldı"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Bluetooth audio ilə bağlantı kəsildi"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-b+sr+Latn/strings.xml b/services/A2dpMediaBrowserService/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 0000000..5c823df
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth audio"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth audio je povezan"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Veza sa Bluetooth audijom je prekinuta"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-bg/strings.xml b/services/A2dpMediaBrowserService/res/values-bg/strings.xml
new file mode 100644
index 0000000..15e0130
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-bg/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth Audio"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Установена е аудиовръзка през Bluetooth"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Аудиовръзката през Bluetooth е прекратена"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-bn-rBD/strings.xml b/services/A2dpMediaBrowserService/res/values-bn-rBD/strings.xml
new file mode 100644
index 0000000..4a1616d
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-bn-rBD/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth অডিও"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth অডিও সংযুক্ত হয়েছে"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Bluetooth অডিওর সংযোগ বিচ্ছিন্ন হয়েছে৷"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-bs-rBA/strings.xml b/services/A2dpMediaBrowserService/res/values-bs-rBA/strings.xml
new file mode 100644
index 0000000..3129e8e
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-bs-rBA/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth Audio"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth audio je povezan"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Bluetooth audio je isključen"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-ca/strings.xml b/services/A2dpMediaBrowserService/res/values-ca/strings.xml
new file mode 100644
index 0000000..f26e6a2
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-ca/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Àudio per Bluetooth"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Àudio per Bluetooth connectat"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Àudio per Bluetooth desconnectat"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-cs/strings.xml b/services/A2dpMediaBrowserService/res/values-cs/strings.xml
new file mode 100644
index 0000000..aa0fb47
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-cs/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth Audio"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth Audio – připojeno"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Bluetooth Audio – odpojeno"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-da/strings.xml b/services/A2dpMediaBrowserService/res/values-da/strings.xml
new file mode 100644
index 0000000..3090b92
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-da/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth-lyd"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth-lyden blev tilsluttet"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Bluetooth-lyden blev afbrudt"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-de/strings.xml b/services/A2dpMediaBrowserService/res/values-de/strings.xml
new file mode 100644
index 0000000..5225d81
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-de/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth-Audio"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth-Audio verbunden"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Bluetooth-Audio-Verbindung aufgehoben"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-el/strings.xml b/services/A2dpMediaBrowserService/res/values-el/strings.xml
new file mode 100644
index 0000000..95924ea
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-el/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Ήχος Bluetooth"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Ο ήχος Bluetooth συνδέθηκε"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Ο ήχος Bluetooth αποσυνδέθηκε"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-en-rAU/strings.xml b/services/A2dpMediaBrowserService/res/values-en-rAU/strings.xml
new file mode 100644
index 0000000..a9f1439
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-en-rAU/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth Audio"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth audio connected"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Bluetooth audio disconnected"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-en-rGB/strings.xml b/services/A2dpMediaBrowserService/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..a9f1439
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-en-rGB/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth Audio"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth audio connected"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Bluetooth audio disconnected"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-en-rIN/strings.xml b/services/A2dpMediaBrowserService/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..a9f1439
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-en-rIN/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth Audio"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth audio connected"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Bluetooth audio disconnected"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-es-rUS/strings.xml b/services/A2dpMediaBrowserService/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000..fa2d594
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-es-rUS/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Audio Bluetooth"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Audio Bluetooth conectado"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Audio Bluetooth desconectado"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-es/strings.xml b/services/A2dpMediaBrowserService/res/values-es/strings.xml
new file mode 100644
index 0000000..2685b36
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-es/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Audio por Bluetooth"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Audio por Bluetooth conectado"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Audio por Bluetooth desconectado"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-et-rEE/strings.xml b/services/A2dpMediaBrowserService/res/values-et-rEE/strings.xml
new file mode 100644
index 0000000..2a343e3
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-et-rEE/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetoothi heli"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetoothi heli on ühendatud"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Bluetoothi heli ühendus on katkestatud"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-eu-rES/strings.xml b/services/A2dpMediaBrowserService/res/values-eu-rES/strings.xml
new file mode 100644
index 0000000..d8d96d0
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-eu-rES/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth bidezko audioa"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Konektatu da Bluetooth bidezko audioa"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Deskonektatu da Bluetooth bidezko audioa"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-fa/strings.xml b/services/A2dpMediaBrowserService/res/values-fa/strings.xml
new file mode 100644
index 0000000..f6c0225
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-fa/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"بلوتوث صوتی"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"بلوتوث صوتی متصل شد"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"ارتباط بلوتوث صوتی قطع شد"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-fi/strings.xml b/services/A2dpMediaBrowserService/res/values-fi/strings.xml
new file mode 100644
index 0000000..996d03c
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-fi/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth-ääni"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth-ääni liitetty"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Bluetooth-äänen yhteys katkaistu"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-fr-rCA/strings.xml b/services/A2dpMediaBrowserService/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..a42170c
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-fr-rCA/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Audio Bluetooth"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Audio Bluetooth connecté"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Audio Bluetooth déconnecté"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-fr/strings.xml b/services/A2dpMediaBrowserService/res/values-fr/strings.xml
new file mode 100644
index 0000000..a42170c
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-fr/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Audio Bluetooth"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Audio Bluetooth connecté"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Audio Bluetooth déconnecté"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-gl-rES/strings.xml b/services/A2dpMediaBrowserService/res/values-gl-rES/strings.xml
new file mode 100644
index 0000000..2685b36
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-gl-rES/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Audio por Bluetooth"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Audio por Bluetooth conectado"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Audio por Bluetooth desconectado"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-gu-rIN/strings.xml b/services/A2dpMediaBrowserService/res/values-gu-rIN/strings.xml
new file mode 100644
index 0000000..7e2844f
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-gu-rIN/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth ઑડિઓ"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth ઑડિઓ કનેક્ટ થયું"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Bluetooth ઑડિઓ ડિસ્કનેક્ટ થયું"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-hi/strings.xml b/services/A2dpMediaBrowserService/res/values-hi/strings.xml
new file mode 100644
index 0000000..ff7521d
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-hi/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"ब्लूटूथ ऑडियो"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"ब्लूटूथ ऑडियो कनेक्ट किया गया"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"ब्लूटूथ ऑडियो डिस्कनेक्ट किया गया"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-hr/strings.xml b/services/A2dpMediaBrowserService/res/values-hr/strings.xml
new file mode 100644
index 0000000..99d1c47
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-hr/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth Audio"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth Audio povezan"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Veza Bluetooth Audija prekinuta"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-hu/strings.xml b/services/A2dpMediaBrowserService/res/values-hu/strings.xml
new file mode 100644
index 0000000..a3abf17
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-hu/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth audió"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth audió csatlakoztatva"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Bluetooth audió leválasztva"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-hy-rAM/strings.xml b/services/A2dpMediaBrowserService/res/values-hy-rAM/strings.xml
new file mode 100644
index 0000000..7a7a12a
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-hy-rAM/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth աուդիո"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth աուդիոն կապակցված է"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Bluetooth աուդիոն անջատված է"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-in/strings.xml b/services/A2dpMediaBrowserService/res/values-in/strings.xml
new file mode 100644
index 0000000..a887958
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-in/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth Audio"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth audio terhubung"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Bluetooth audio terputus"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-is-rIS/strings.xml b/services/A2dpMediaBrowserService/res/values-is-rIS/strings.xml
new file mode 100644
index 0000000..6c32524
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-is-rIS/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth-hljóð"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth-hljóð tengt"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Bluetooth-hljóð aftengt"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-it/strings.xml b/services/A2dpMediaBrowserService/res/values-it/strings.xml
new file mode 100644
index 0000000..a37185e
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-it/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth Audio"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"App Bluetooth Audio connessa"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"App Bluetooth Audio disconnessa"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-iw/strings.xml b/services/A2dpMediaBrowserService/res/values-iw/strings.xml
new file mode 100644
index 0000000..ac83911
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-iw/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"אודיו Bluetooth"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"אודיו Bluetooth מחובר"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"אודיו Bluetooth מנותק"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-ja/strings.xml b/services/A2dpMediaBrowserService/res/values-ja/strings.xml
new file mode 100644
index 0000000..5401f82
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-ja/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth オーディオ"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth オーディオは接続されています"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Bluetooth オーディオは接続を解除されています"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-ka-rGE/strings.xml b/services/A2dpMediaBrowserService/res/values-ka-rGE/strings.xml
new file mode 100644
index 0000000..75c0526
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-ka-rGE/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth აუდიო"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth აუდიო დაკავშირებულია"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Bluetooth აუდიო გათიშულია"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-kk-rKZ/strings.xml b/services/A2dpMediaBrowserService/res/values-kk-rKZ/strings.xml
new file mode 100644
index 0000000..ee66941
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-kk-rKZ/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth aудиосы"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth аудиосы қосылды"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Bluetooth аудиосы ажыратылды"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-km-rKH/strings.xml b/services/A2dpMediaBrowserService/res/values-km-rKH/strings.xml
new file mode 100644
index 0000000..4751152
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-km-rKH/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"សំឡេងប៊្លូធូស"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"សំឡេងប៊្លូធូសត្រូវបានភ្ជាប់"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"សំឡេងប៊្លូធូសត្រូវបានផ្តាច់"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-kn-rIN/strings.xml b/services/A2dpMediaBrowserService/res/values-kn-rIN/strings.xml
new file mode 100644
index 0000000..dc009e6
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-kn-rIN/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"ಬ್ಲೂಟೂತ್ ಆಡಿಯೊ"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"ಬ್ಲೂಟೂತ್ ಆಡಿಯೊ ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"ಬ್ಲೂಟೂತ್ ಆಡಿಯೊ ಸಂಪರ್ಕ ಕಡಿತಗೊಂಡಿದೆ"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-ko/strings.xml b/services/A2dpMediaBrowserService/res/values-ko/strings.xml
new file mode 100644
index 0000000..e4b652f
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-ko/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"블루투스 오디오"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"블루투스 오디오가 연결됨"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"블루투스 오디오가 연결 해제됨"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-ky-rKG/strings.xml b/services/A2dpMediaBrowserService/res/values-ky-rKG/strings.xml
new file mode 100644
index 0000000..26459e3
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-ky-rKG/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth аудио"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth аудио туташты"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Bluetooth аудио ажыратылды"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-lo-rLA/strings.xml b/services/A2dpMediaBrowserService/res/values-lo-rLA/strings.xml
new file mode 100644
index 0000000..e6d4e4e
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-lo-rLA/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"ສຽງ Bluetooth"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"ເຊື່ອມຕໍ່ສຽງ Bluetooth ແລ້ວ"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"ຕັດການເຊື່ອມຕໍ່ສຽງ Bluetooth ແລ້ວ"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-lt/strings.xml b/services/A2dpMediaBrowserService/res/values-lt/strings.xml
new file mode 100644
index 0000000..75a0969
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-lt/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"„Bluetooth“ garsas"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"„Bluetooth“ garsas prijungtas"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"„Bluetooth“ garsas atjungtas"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-lv/strings.xml b/services/A2dpMediaBrowserService/res/values-lv/strings.xml
new file mode 100644
index 0000000..de0ae72
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-lv/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth audio"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Izveidots savienojums ar Bluetooth audio"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Pārtraukts savienojums ar Bluetooth audio"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-mk-rMK/strings.xml b/services/A2dpMediaBrowserService/res/values-mk-rMK/strings.xml
new file mode 100644
index 0000000..831a7c6
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-mk-rMK/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Аудио преку Bluetooth"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Аудиото преку Bluetooth е поврзано"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Аудиото преку Bluetooth е исклучено"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-ml-rIN/strings.xml b/services/A2dpMediaBrowserService/res/values-ml-rIN/strings.xml
new file mode 100644
index 0000000..b2fa7e2
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-ml-rIN/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth ഓഡിയോ"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth ഓഡിയോ ബന്ധിപ്പിച്ചു"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Bluetooth ഓഡിയോ വിച്ഛേദിച്ചു"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-mn-rMN/strings.xml b/services/A2dpMediaBrowserService/res/values-mn-rMN/strings.xml
new file mode 100644
index 0000000..ff494eb
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-mn-rMN/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth Аудио"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth аудио холбогдсон"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Bluetooth аудио тасарсан"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-mr-rIN/strings.xml b/services/A2dpMediaBrowserService/res/values-mr-rIN/strings.xml
new file mode 100644
index 0000000..596928d
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-mr-rIN/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"ब्लूटुथ ऑडिओ"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"ब्लूटुथ ऑडिओ कनेक्ट केला"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"ब्लूटुथ ऑडिओ डिस्कनेक्ट केला"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-ms-rMY/strings.xml b/services/A2dpMediaBrowserService/res/values-ms-rMY/strings.xml
new file mode 100644
index 0000000..4d982ae
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-ms-rMY/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Audio Bluetooth"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Audio Bluetooth disambungkan"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Audio Bluetooth diputuskan sambungannya"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-my-rMM/strings.xml b/services/A2dpMediaBrowserService/res/values-my-rMM/strings.xml
new file mode 100644
index 0000000..e013a66
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-my-rMM/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"ဘလူးတုသ် အသံ"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"ဘလူးတုသ်အသံ ချိတ်ဆက်ပြီးပါပြီ"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"ဘလူးတုသ်အသံ မချိတ်ဆက်ထားပါ"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-nb/strings.xml b/services/A2dpMediaBrowserService/res/values-nb/strings.xml
new file mode 100644
index 0000000..94d4d09
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-nb/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth-lyd"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth-lyd er tilkoblet"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Bluetooth-lyd er frakoblet"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-ne-rNP/strings.xml b/services/A2dpMediaBrowserService/res/values-ne-rNP/strings.xml
new file mode 100644
index 0000000..6d05c88
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-ne-rNP/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"ब्लुटुथ अडियो"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"ब्लुटुथ अडियो जडान भयो"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"ब्लुटुथ अडियोको जडान विच्छेद भयो"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-nl/strings.xml b/services/A2dpMediaBrowserService/res/values-nl/strings.xml
new file mode 100644
index 0000000..6d724d8
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-nl/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth-audio"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth-audio gekoppeld"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Bluetooth-audio ontkoppeld"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-pa-rIN/strings.xml b/services/A2dpMediaBrowserService/res/values-pa-rIN/strings.xml
new file mode 100644
index 0000000..0660c08
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-pa-rIN/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"ਬਲੂਟੁੱਥ ਔਡੀਓ"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"ਬਲੂਟੁੱਥ ਔਡੀਓ ਕਨੈਕਟ ਹੋਈ"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"ਬਲੂਟੁੱਥ ਔਡੀਓ ਡਿਸਕਨੈਕਟ ਹੋਈ"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-pl/strings.xml b/services/A2dpMediaBrowserService/res/values-pl/strings.xml
new file mode 100644
index 0000000..07e4ac1
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-pl/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Dźwięk Bluetooth"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Dźwięk Bluetooth podłączony"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Dźwięk Bluetooth odłączony"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-pt-rPT/strings.xml b/services/A2dpMediaBrowserService/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..7ace614
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-pt-rPT/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Áudio Bluetooth"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Áudio Bluetooth ligado"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Áudio Bluetooth desligado"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-pt/strings.xml b/services/A2dpMediaBrowserService/res/values-pt/strings.xml
new file mode 100644
index 0000000..7311898
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-pt/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Áudio Bluetooth"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Áudio Bluetooth ativado"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Áudio Bluetooth desativado"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-ro/strings.xml b/services/A2dpMediaBrowserService/res/values-ro/strings.xml
new file mode 100644
index 0000000..72be463
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-ro/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth Audio"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Audio prin Bluetooth conectat"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Audio prin Bluetooth deconectat"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-ru/strings.xml b/services/A2dpMediaBrowserService/res/values-ru/strings.xml
new file mode 100644
index 0000000..133a2e3
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-ru/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Звук через Bluetooth"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Звук через Bluetooth включен"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Звук через Bluetooth отключен"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-si-rLK/strings.xml b/services/A2dpMediaBrowserService/res/values-si-rLK/strings.xml
new file mode 100644
index 0000000..1640f59
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-si-rLK/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"බ්ලූටූත් ශ්රව්යය"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"බ්ලූටූත් ශ්රව්යය සම්බන්ධ කරන ලදී"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"බ්ලූටූත් ශ්රව්යය විසන්ධි කරන ලදී"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-sk/strings.xml b/services/A2dpMediaBrowserService/res/values-sk/strings.xml
new file mode 100644
index 0000000..6059fa9
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-sk/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth Audio"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Rozhranie Bluetooth Audio je pripojené"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Rozhranie Bluetooth Audio je odpojené"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-sl/strings.xml b/services/A2dpMediaBrowserService/res/values-sl/strings.xml
new file mode 100644
index 0000000..9736408
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-sl/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Zvok prek Bluetootha"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Zvok prek Bluetootha je povezan"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Zvok prek Bluetootha ni povezan"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-sq-rAL/strings.xml b/services/A2dpMediaBrowserService/res/values-sq-rAL/strings.xml
new file mode 100644
index 0000000..1d64d82
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-sq-rAL/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Audioja e \"bluetooth-it\""</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Audioja e \"bluetooth-it\" e lidhur"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Audioja e \"bluetooth-it\" e shkëputur"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-sr/strings.xml b/services/A2dpMediaBrowserService/res/values-sr/strings.xml
new file mode 100644
index 0000000..de08d66
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-sr/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth аудио"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth аудио је повезан"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Веза са Bluetooth аудијом је прекинута"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-sv/strings.xml b/services/A2dpMediaBrowserService/res/values-sv/strings.xml
new file mode 100644
index 0000000..01712a8
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-sv/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth-ljud"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth-ljud är anslutet"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Bluetooth-ljud är frånkopplat"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-sw/strings.xml b/services/A2dpMediaBrowserService/res/values-sw/strings.xml
new file mode 100644
index 0000000..e9bd391
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-sw/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Sauti ya Bluetooth"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Sauti ya Bluetooth imeunganishwa"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Sauti ya Bluetooth imeondolewa"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-ta-rIN/strings.xml b/services/A2dpMediaBrowserService/res/values-ta-rIN/strings.xml
new file mode 100644
index 0000000..a1eab9e
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-ta-rIN/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"புளூடூத் ஆடியோ"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"புளூடூத் ஆடியோ இணைக்கப்பட்டது"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"புளூடூத் ஆடியோ துண்டிக்கப்பட்டது"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-te-rIN/strings.xml b/services/A2dpMediaBrowserService/res/values-te-rIN/strings.xml
new file mode 100644
index 0000000..f1b043e
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-te-rIN/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"బ్లూటూత్ ఆడియో"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"బ్లూటూత్ ఆడియో కనెక్ట్ చేయబడింది"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"బ్లూటూత్ ఆడియో డిస్కనెక్ట్ చేయబడింది"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-th/strings.xml b/services/A2dpMediaBrowserService/res/values-th/strings.xml
new file mode 100644
index 0000000..e43b2d0
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-th/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth Audio"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"เชื่อมต่อ Bluetooth Audio แล้ว"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"ยกเลิกการเชื่อมต่อ Bluetooth Audio แล้ว"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-tl/strings.xml b/services/A2dpMediaBrowserService/res/values-tl/strings.xml
new file mode 100644
index 0000000..270f6d1
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-tl/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth Audio"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Nakakonekta ang bluetooth audio"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Nadiskonekta ang bluetooth audio"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-tr/strings.xml b/services/A2dpMediaBrowserService/res/values-tr/strings.xml
new file mode 100644
index 0000000..ffd8a80
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-tr/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth Ses"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth ses bağlandı"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Bluetooth ses bağlantısı kesildi"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-uk/strings.xml b/services/A2dpMediaBrowserService/res/values-uk/strings.xml
new file mode 100644
index 0000000..852fd19
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-uk/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth Audio"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth Audio під’єднано"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Bluetooth Audio від’єднано"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-ur-rPK/strings.xml b/services/A2dpMediaBrowserService/res/values-ur-rPK/strings.xml
new file mode 100644
index 0000000..5c08fe7
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-ur-rPK/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"بلوٹوتھ آڈیو"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"بلوٹوتھ آڈیو منسلک ہے"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"بلوٹوت آڈیو غیر منسلک ہے"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-uz-rUZ/strings.xml b/services/A2dpMediaBrowserService/res/values-uz-rUZ/strings.xml
new file mode 100644
index 0000000..2ea8a6a
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-uz-rUZ/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Bluetooth Audio"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Bluetooth audio ulandi"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Bluetooth audio uzildi"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-v21/styles.xml b/services/A2dpMediaBrowserService/res/values-v21/styles.xml
new file mode 100644
index 0000000..7caef1f
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-v21/styles.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright 2015, 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.
+-->
+<resources>
+ <style name="AppBaseTheme" parent="android:Theme.Material">
+ <item name="android:colorPrimary">#ffff5722</item>
+ <item name="android:colorPrimaryDark">#ffbf360c</item>
+ <item name="android:colorAccent">#ffff5722</item>
+ </style>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-vi/strings.xml b/services/A2dpMediaBrowserService/res/values-vi/strings.xml
new file mode 100644
index 0000000..e9c276d5
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-vi/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Âm thanh Bluetooth"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Đã kết nối âm thanh Bluetooth"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Đã ngắt kết nối âm thanh Bluetooth"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-zh-rCN/strings.xml b/services/A2dpMediaBrowserService/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..c70e4dd
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-zh-rCN/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"蓝牙音频"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"蓝牙音频已连接"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"蓝牙音频已断开连接"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-zh-rHK/strings.xml b/services/A2dpMediaBrowserService/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..57500e0
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-zh-rHK/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"藍牙音訊"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"已與藍牙音訊連線"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"已中斷與藍牙音訊的連線"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-zh-rTW/strings.xml b/services/A2dpMediaBrowserService/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..57500e0
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-zh-rTW/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"藍牙音訊"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"已與藍牙音訊連線"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"已中斷與藍牙音訊的連線"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values-zu/strings.xml b/services/A2dpMediaBrowserService/res/values-zu/strings.xml
new file mode 100644
index 0000000..a76b199
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values-zu/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2015, 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="7637007031221185740">"Umsindo we-Bluetooth"</string>
+ <string name="bluetooth_connected" msgid="3291279285094874956">"Umsindo we-Bluetooth uxhunyiwe"</string>
+ <string name="bluetooth_disconnected" msgid="3120207091461306364">"Umsindo we-Bluetooth unqanyuliwe"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values/strings.xml b/services/A2dpMediaBrowserService/res/values/strings.xml
new file mode 100644
index 0000000..588a124
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright 2015, 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.
+-->
+<resources>
+ <string name="app_name">Bluetooth Audio</string>
+ <string name="bluetooth_connected">Bluetooth audio connected</string>
+ <string name="bluetooth_disconnected">Bluetooth audio disconnected"</string>
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/values/styles.xml b/services/A2dpMediaBrowserService/res/values/styles.xml
new file mode 100644
index 0000000..45c2579
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/values/styles.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright 2015, 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.
+-->
+<resources>
+ <style name="AppTheme" parent="AppBaseTheme" />
+ <style name="AppBaseTheme" parent="android:Theme.Light" />
+</resources>
diff --git a/services/A2dpMediaBrowserService/res/xml/automotive_app_desc.xml b/services/A2dpMediaBrowserService/res/xml/automotive_app_desc.xml
new file mode 100644
index 0000000..a5bac63
--- /dev/null
+++ b/services/A2dpMediaBrowserService/res/xml/automotive_app_desc.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright 2015, 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.
+-->
+<automotiveApp>
+ <uses name="media"/>
+</automotiveApp>
diff --git a/services/A2dpMediaBrowserService/src/com/google/android/a2dpsink/mbs/A2dpMediaBrowserService.java b/services/A2dpMediaBrowserService/src/com/google/android/a2dpsink/mbs/A2dpMediaBrowserService.java
new file mode 100644
index 0000000..2a6baa8
--- /dev/null
+++ b/services/A2dpMediaBrowserService/src/com/google/android/a2dpsink/mbs/A2dpMediaBrowserService.java
@@ -0,0 +1,385 @@
+/*
+ * Copyright (C) 2015 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.google.android.a2dpsink.mbs;
+
+import android.bluetooth.BluetoothA2dpSink;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothAvrcpController;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothProfile;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.media.MediaMetadata;
+import android.media.browse.MediaBrowser.MediaItem;
+import android.media.session.MediaSession;
+import android.media.session.PlaybackState;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.os.ResultReceiver;
+import android.service.media.MediaBrowserService;
+import android.util.Pair;
+import android.util.Log;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.List;
+
+public class A2dpMediaBrowserService extends MediaBrowserService {
+ private static final String TAG = "A2dpMediaBrowserService";
+ private static final String MEDIA_ID_ROOT = "__ROOT__";
+ private static final String UNKNOWN_BT_AUDIO = "__UNKNOWN_BT_AUDIO__";
+ private static final float PLAYBACK_SPEED = 1.0f;
+
+ // Message sent when A2DP device is disconnected.
+ private static final int MSG_DEVICE_DISCONNECT = 0;
+ // Message snet when the AVRCP profile is disconnected = 1;
+ private static final int MSG_PROFILE_DISCONNECT = 1;
+ // Message sent when A2DP device is connected.
+ private static final int MSG_DEVICE_CONNECT = 2;
+ // Message sent when AVRCP profile is connected (note AVRCP profile may be connected before or
+ // after A2DP device is connected).
+ private static final int MSG_PROFILE_CONNECT = 3;
+ // Message sent when we recieve a TRACK update from AVRCP profile over a connected A2DP device.
+ private static final int MSG_TRACK = 4;
+ // Internal message sent to trigger a AVRCP action.
+ private static final int MSG_AVRCP_PASSTHRU = 5;
+
+ private MediaSession mSession;
+ private MediaMetadata mA2dpMetadata;
+
+ private BluetoothAdapter mAdapter;
+ private BluetoothAvrcpController mAvrcpProfile;
+ private BluetoothDevice mA2dpDevice = null;
+ private Handler mAvrcpCommandQueue;
+
+ private long mTransportControlFlags = PlaybackState.ACTION_PAUSE | PlaybackState.ACTION_PLAY
+ | PlaybackState.ACTION_SKIP_TO_NEXT | PlaybackState.ACTION_SKIP_TO_PREVIOUS;
+
+ private static final class AvrcpCommandQueueHandler extends Handler {
+ WeakReference<A2dpMediaBrowserService> mInst;
+
+ AvrcpCommandQueueHandler(Looper looper, A2dpMediaBrowserService sink) {
+ super(looper);
+ mInst = new WeakReference<A2dpMediaBrowserService>(sink);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ A2dpMediaBrowserService inst = mInst.get();
+ if (inst == null) {
+ Log.e(TAG, "Parent class has died; aborting.");
+ return;
+ }
+
+ switch (msg.what) {
+ case MSG_DEVICE_CONNECT:
+ inst.msgDeviceConnect((BluetoothDevice) msg.obj);
+ break;
+ case MSG_PROFILE_CONNECT:
+ inst.msgProfileConnect((BluetoothProfile) msg.obj);
+ break;
+ case MSG_DEVICE_DISCONNECT:
+ inst.msgDeviceDisconnect((BluetoothDevice) msg.obj);
+ break;
+ case MSG_PROFILE_DISCONNECT:
+ inst.msgProfileDisconnect();
+ break;
+ case MSG_TRACK:
+ Pair<PlaybackState, MediaMetadata> pair =
+ (Pair<PlaybackState, MediaMetadata>) (msg.obj);
+ inst.msgTrack(pair.first, pair.second);
+ break;
+ case MSG_AVRCP_PASSTHRU:
+ inst.msgPassThru((int) msg.obj);
+ break;
+ }
+ }
+ }
+
+ @Override
+ public void onCreate() {
+ Log.d(TAG, "onCreate");
+ super.onCreate();
+ mSession = new MediaSession(this, TAG);
+ setSessionToken(mSession.getSessionToken());
+ mSession.setCallback(mSessionCallbacks);
+ mSession.setFlags(MediaSession.FLAG_HANDLES_MEDIA_BUTTONS |
+ MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS);
+ mAvrcpCommandQueue = new AvrcpCommandQueueHandler(Looper.getMainLooper(), this);
+
+ mAdapter = BluetoothAdapter.getDefaultAdapter();
+ mAdapter.getProfileProxy(this, mServiceListener, BluetoothProfile.AVRCP_CONTROLLER);
+
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(BluetoothA2dpSink.ACTION_CONNECTION_STATE_CHANGED);
+ filter.addAction(BluetoothAvrcpController.ACTION_TRACK_EVENT);
+ registerReceiver(mBtReceiver, filter);
+ }
+
+ @Override
+ public void onDestroy() {
+ Log.d(TAG, "onDestroy");
+ mSession.release();
+ unregisterReceiver(mBtReceiver);
+ super.onDestroy();
+ }
+
+ @Override
+ public BrowserRoot onGetRoot(String clientPackageName, int clientUid, Bundle rootHints) {
+ return new BrowserRoot(MEDIA_ID_ROOT, null);
+ }
+
+ @Override
+ public void onLoadChildren(final String parentMediaId, final Result<List<MediaItem>> result) {
+ Log.d(TAG, "onLoadChildren parentMediaId=" + parentMediaId);
+ List<MediaItem> items = new ArrayList<MediaItem>();
+ result.sendResult(items);
+ }
+
+ BluetoothProfile.ServiceListener mServiceListener = new BluetoothProfile.ServiceListener() {
+ public void onServiceConnected(int profile, BluetoothProfile proxy) {
+ Log.d(TAG, "onServiceConnected");
+ if (profile == BluetoothProfile.AVRCP_CONTROLLER) {
+ mAvrcpCommandQueue.obtainMessage(MSG_PROFILE_CONNECT, proxy).sendToTarget();
+ List<BluetoothDevice> devices = proxy.getConnectedDevices();
+ if (devices != null && devices.size() > 0) {
+ BluetoothDevice device = devices.get(0);
+ Log.d(TAG, "got AVRCP device " + device);
+ }
+ }
+ }
+
+ public void onServiceDisconnected(int profile) {
+ Log.d(TAG, "onServiceDisconnected " + profile);
+ if (profile == BluetoothProfile.AVRCP_CONTROLLER) {
+ mAvrcpProfile = null;
+ mAvrcpCommandQueue.obtainMessage(MSG_PROFILE_DISCONNECT).sendToTarget();
+ }
+ }
+ };
+
+ // Media Session Stuff.
+ private MediaSession.Callback mSessionCallbacks = new MediaSession.Callback() {
+ @Override
+ public void onPlay() {
+ Log.d(TAG, "onPlay");
+ mAvrcpCommandQueue.obtainMessage(
+ MSG_AVRCP_PASSTHRU, BluetoothAvrcpController.PASS_THRU_CMD_ID_PLAY).sendToTarget();
+ // TRACK_EVENT should be fired eventually and the UI should be hence updated.
+ }
+
+ @Override
+ public void onPause() {
+ Log.d(TAG, "onPause");
+ mAvrcpCommandQueue.obtainMessage(
+ MSG_AVRCP_PASSTHRU, BluetoothAvrcpController.PASS_THRU_CMD_ID_PAUSE).sendToTarget();
+ // TRACK_EVENT should be fired eventually and the UI should be hence updated.
+ }
+
+ @Override
+ public void onSkipToNext() {
+ Log.d(TAG, "onSkipToNext");
+ mAvrcpCommandQueue.obtainMessage(
+ MSG_AVRCP_PASSTHRU, BluetoothAvrcpController.PASS_THRU_CMD_ID_FORWARD)
+ .sendToTarget();
+ // TRACK_EVENT should be fired eventually and the UI should be hence updated.
+ }
+
+ @Override
+ public void onSkipToPrevious() {
+ Log.d(TAG, "onSkipToPrevious");
+
+ mAvrcpCommandQueue.obtainMessage(
+ MSG_AVRCP_PASSTHRU, BluetoothAvrcpController.PASS_THRU_CMD_ID_BACKWARD)
+ .sendToTarget();
+ // TRACK_EVENT should be fired eventually and the UI should be hence updated.
+ }
+
+ // These are not yet supported.
+ @Override
+ public void onStop() {
+ Log.d(TAG, "onStop");
+ }
+
+ @Override
+ public void onCustomAction(String action, Bundle extras) {
+ Log.d(TAG, "onCustomAction action=" + action + " extras=" + extras);
+ }
+
+ @Override
+ public void onPlayFromSearch(String query, Bundle extras) {
+ Log.d(TAG, "playFromSearch not supported in AVRCP");
+ }
+
+ @Override
+ public void onCommand(String command, Bundle args, ResultReceiver cb) {
+ Log.d(TAG, "onCommand command=" + command + " args=" + args);
+ }
+
+ @Override
+ public void onSkipToQueueItem(long queueId) {
+ Log.d(TAG, "onSkipToQueueItem");
+ }
+
+ @Override
+ public void onPlayFromMediaId(String mediaId, Bundle extras) {
+ Log.d(TAG, "onPlayFromMediaId mediaId=" + mediaId + " extras=" + extras);
+ }
+
+ };
+
+ private BroadcastReceiver mBtReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Log.d(TAG, "onReceive intent=" + intent);
+ String action = intent.getAction();
+ BluetoothDevice btDev =
+ (BluetoothDevice) intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
+ int state = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, -1);
+
+ if (BluetoothA2dpSink.ACTION_CONNECTION_STATE_CHANGED.equals(action)) {
+ Log.d(TAG, "handleConnectionStateChange: newState="
+ + state + " btDev=" + btDev);
+
+ // Connected state will be handled when AVRCP BluetoothProfile gets connected.
+ if (state == BluetoothProfile.STATE_CONNECTED) {
+ mAvrcpCommandQueue.obtainMessage(MSG_DEVICE_CONNECT, btDev).sendToTarget();
+ } else if (state == BluetoothProfile.STATE_DISCONNECTED) {
+ // Set the playback state to unconnected.
+ mAvrcpCommandQueue.obtainMessage(MSG_DEVICE_DISCONNECT, btDev).sendToTarget();
+ }
+ } else if (BluetoothAvrcpController.ACTION_TRACK_EVENT.equals(action)) {
+ PlaybackState pbb =
+ intent.getParcelableExtra(BluetoothAvrcpController.EXTRA_PLAYBACK);
+ MediaMetadata mmd =
+ intent.getParcelableExtra(BluetoothAvrcpController.EXTRA_METADATA);
+ mAvrcpCommandQueue.obtainMessage(
+ MSG_TRACK, new Pair<PlaybackState, MediaMetadata>(pbb, mmd)).sendToTarget();
+ }
+ }
+ };
+
+ private void msgDeviceConnect(BluetoothDevice device) {
+ Log.d(TAG, "msgDeviceConnect");
+ // We are connected to a new device via A2DP now.
+ mA2dpDevice = device;
+ }
+
+ private void msgProfileConnect(BluetoothProfile profile) {
+ Log.d(TAG, "msgProfileConnect");
+ if (profile != null) {
+ mAvrcpProfile = (BluetoothAvrcpController) profile;
+ }
+
+ List<BluetoothDevice> devices = mAvrcpProfile.getConnectedDevices();
+ if (devices.size() == 0) {
+ Log.w(TAG, "No devices connected yet");
+ return;
+ }
+
+ if (mA2dpDevice != null && !mA2dpDevice.equals(devices.get(0))) {
+ Log.e(TAG, "A2dp device : " + mA2dpDevice + " avrcp device " + devices.get(0));
+ }
+ mA2dpDevice = devices.get(0);
+
+ PlaybackState playbackState = mAvrcpProfile.getPlaybackState(mA2dpDevice);
+ // Add actions required for playback and rebuild the object.
+ PlaybackState.Builder pbb = new PlaybackState.Builder(playbackState);
+ playbackState = pbb.setActions(mTransportControlFlags).build();
+
+ MediaMetadata mediaMetadata = mAvrcpProfile.getMetadata(mA2dpDevice);
+ Log.d(TAG, "Media metadata " + mediaMetadata + " playback state " + playbackState);
+ mSession.setMetadata(mAvrcpProfile.getMetadata(mA2dpDevice));
+ mSession.setPlaybackState(playbackState);
+ }
+
+ private void msgDeviceDisconnect(BluetoothDevice device) {
+ Log.d(TAG, "msgDeviceDisconnect");
+ if (mA2dpDevice == null) {
+ Log.w(TAG, "Already disconnected - nothing to do here.");
+ return;
+ } else if (!mA2dpDevice.equals(device)) {
+ Log.e(TAG, "Not the right device to disconnect current " +
+ mA2dpDevice + " dc " + device);
+ return;
+ }
+
+ // Unset the session.
+ PlaybackState.Builder pbb = new PlaybackState.Builder();
+ pbb = pbb.setState(PlaybackState.STATE_ERROR, PlaybackState.PLAYBACK_POSITION_UNKNOWN,
+ PLAYBACK_SPEED)
+ .setActions(mTransportControlFlags)
+ .setErrorMessage(getString(R.string.bluetooth_disconnected));
+ mSession.setPlaybackState(pbb.build());
+ }
+
+ private void msgProfileDisconnect() {
+ Log.d(TAG, "msgProfileDisconnect");
+ // The profile is disconnected - even if the device is still connected we cannot really have
+ // a functioning UI so reset the session.
+ mAvrcpProfile = null;
+
+ // Unset the session.
+ PlaybackState.Builder pbb = new PlaybackState.Builder();
+ pbb = pbb.setState(PlaybackState.STATE_ERROR, PlaybackState.PLAYBACK_POSITION_UNKNOWN,
+ PLAYBACK_SPEED)
+ .setActions(mTransportControlFlags)
+ .setErrorMessage(getString(R.string.bluetooth_disconnected));
+ mSession.setPlaybackState(pbb.build());
+ }
+
+ private void msgTrack(PlaybackState pb, MediaMetadata mmd) {
+ Log.d(TAG, "msgTrack: playback: " + pb + " mmd: " + mmd);
+ if (mmd != null) {
+ Log.d(TAG, "msgTrack() mmd " + mmd.getDescription());
+ mSession.setMetadata(mmd);
+ }
+
+ if (pb != null) {
+ Log.d(TAG, "msgTrack() playbackstate " + pb);
+ PlaybackState.Builder pbb = new PlaybackState.Builder(pb);
+ pb = pbb.setActions(mTransportControlFlags).build();
+ mSession.setPlaybackState(pb);
+ }
+ }
+
+ private void msgPassThru(int cmd) {
+ Log.d(TAG, "msgPassThru " + cmd);
+ if (mA2dpDevice == null) {
+ // We should have already disconnected - ignore this message.
+ Log.e(TAG, "Already disconnected ignoring.");
+ return;
+ }
+
+ if (mAvrcpProfile == null) {
+ // We may be disconnected with the profile but there is not much we can do for now but
+ // to wait for the profile to come back up.
+ Log.e(TAG, "Profile disconnected; ignoring.");
+ return;
+ }
+
+ // Send the pass through.
+ mAvrcpProfile.sendPassThroughCmd(
+ mA2dpDevice, cmd, BluetoothAvrcpController.KEY_STATE_PRESSED);
+ mAvrcpProfile.sendPassThroughCmd(
+ mA2dpDevice, cmd, BluetoothAvrcpController.KEY_STATE_RELEASED);
+ }
+}
diff --git a/services/A2dpMediaBrowserService/src/com/google/android/a2dpsink/mbs/BootCompleteReceiver.java b/services/A2dpMediaBrowserService/src/com/google/android/a2dpsink/mbs/BootCompleteReceiver.java
new file mode 100644
index 0000000..0c86b84
--- /dev/null
+++ b/services/A2dpMediaBrowserService/src/com/google/android/a2dpsink/mbs/BootCompleteReceiver.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2015 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.google.android.a2dpsink.mbs;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+public class BootCompleteReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ // We want to keep a track of bluetooth state so start up the service
+ // on boot and keep making a note of all bluetooth related state changes.
+ Intent startIntent = new Intent(context, A2dpMediaBrowserService.class);
+ context.startService(startIntent);
+ }
+}
diff --git a/src/com/android/bluetooth/Utils.java b/src/com/android/bluetooth/Utils.java
index 6a467f9..e78341a 100644
--- a/src/com/android/bluetooth/Utils.java
+++ b/src/com/android/bluetooth/Utils.java
@@ -211,8 +211,9 @@
ok = (foregroundUser == callingUser);
if (!ok) {
// Always allow SystemUI/System access.
- int systemUiUid = ActivityThread.getPackageManager().getPackageUid(
- "com.android.systemui", UserHandle.USER_OWNER);
+ final int systemUiUid = ActivityThread.getPackageManager().getPackageUid(
+ "com.android.systemui", PackageManager.MATCH_SYSTEM_ONLY,
+ UserHandle.USER_SYSTEM);
ok = (systemUiUid == callingUid) || (Process.SYSTEM_UID == callingUid);
}
} catch (Exception ex) {
@@ -245,8 +246,9 @@
(foregroundUser == parentUser);
if (!ok) {
// Always allow SystemUI/System access.
- int systemUiUid = ActivityThread.getPackageManager().getPackageUid(
- "com.android.systemui", UserHandle.USER_OWNER);
+ final int systemUiUid = ActivityThread.getPackageManager().getPackageUid(
+ "com.android.systemui", PackageManager.MATCH_SYSTEM_ONLY,
+ UserHandle.USER_SYSTEM);
ok = (systemUiUid == callingUid) || (Process.SYSTEM_UID == callingUid);
}
} catch (Exception ex) {
diff --git a/src/com/android/bluetooth/a2dp/A2dpService.java b/src/com/android/bluetooth/a2dp/A2dpService.java
index e14302c..a278927 100755
--- a/src/com/android/bluetooth/a2dp/A2dpService.java
+++ b/src/com/android/bluetooth/a2dp/A2dpService.java
@@ -213,6 +213,10 @@
mAvrcp.setA2dpAudioState(state);
}
+ public void resetAvrcpBlacklist(BluetoothDevice device) {
+ mAvrcp.resetBlackList(device.getAddress());
+ }
+
synchronized boolean isA2dpPlaying(BluetoothDevice device) {
enforceCallingOrSelfPermission(BLUETOOTH_PERM,
"Need BLUETOOTH permission");
diff --git a/src/com/android/bluetooth/a2dp/A2dpSinkService.java b/src/com/android/bluetooth/a2dp/A2dpSinkService.java
index 5dcec73..8c60fe0 100644
--- a/src/com/android/bluetooth/a2dp/A2dpSinkService.java
+++ b/src/com/android/bluetooth/a2dp/A2dpSinkService.java
@@ -20,6 +20,7 @@
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothProfile;
import android.bluetooth.IBluetoothA2dpSink;
+import android.provider.Settings;
import android.util.Log;
import com.android.bluetooth.btservice.ProfileService;
import com.android.bluetooth.Utils;
@@ -143,6 +144,47 @@
return mStateMachine.getConnectionState(device);
}
+ public boolean setPriority(BluetoothDevice device, int priority) {
+ enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM,
+ "Need BLUETOOTH_ADMIN permission");
+ Settings.Global.putInt(getContentResolver(),
+ Settings.Global.getBluetoothA2dpSrcPriorityKey(device.getAddress()),
+ priority);
+ if (DBG) {
+ Log.d(TAG,"Saved priority " + device + " = " + priority);
+ }
+ return true;
+ }
+
+ public int getPriority(BluetoothDevice device) {
+ enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM,
+ "Need BLUETOOTH_ADMIN permission");
+ int priority = Settings.Global.getInt(getContentResolver(),
+ Settings.Global.getBluetoothA2dpSrcPriorityKey(device.getAddress()),
+ BluetoothProfile.PRIORITY_UNDEFINED);
+ return priority;
+ }
+
+ public void informAvrcpStatePlaying(BluetoothDevice device) {
+ if(mStateMachine != null)
+ mStateMachine.informAvrcpStatePlaying(device);
+ }
+
+ public void informAvrcpPassThroughCmd(BluetoothDevice device, int keyCode,
+ int keyState) {
+ if(mStateMachine != null)
+ mStateMachine.informAvrcpPassThroughCmd(device, keyCode, keyState);
+ }
+
+ synchronized boolean isA2dpPlaying(BluetoothDevice device) {
+ enforceCallingOrSelfPermission(BLUETOOTH_PERM,
+ "Need BLUETOOTH permission");
+ if (DBG) {
+ Log.d(TAG, "isA2dpPlaying(" + device + ")");
+ }
+ return mStateMachine.isPlaying(device);
+ }
+
BluetoothAudioConfig getAudioConfig(BluetoothDevice device) {
enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
return mStateMachine.getAudioConfig(device);
@@ -204,6 +246,24 @@
return service.getConnectionState(device);
}
+ public boolean isA2dpPlaying(BluetoothDevice device) {
+ A2dpSinkService service = getService();
+ if (service == null) return false;
+ return service.isA2dpPlaying(device);
+ }
+
+ public boolean setPriority(BluetoothDevice device, int priority) {
+ A2dpSinkService service = getService();
+ if (service == null) return false;
+ return service.setPriority(device, priority);
+ }
+
+ public int getPriority(BluetoothDevice device) {
+ A2dpSinkService service = getService();
+ if (service == null) return BluetoothProfile.PRIORITY_UNDEFINED;
+ return service.getPriority(device);
+ }
+
public BluetoothAudioConfig getAudioConfig(BluetoothDevice device) {
A2dpSinkService service = getService();
if (service == null) return null;
diff --git a/src/com/android/bluetooth/a2dp/A2dpSinkStateMachine.java b/src/com/android/bluetooth/a2dp/A2dpSinkStateMachine.java
index d57a0ca..29b8bc8 100644
--- a/src/com/android/bluetooth/a2dp/A2dpSinkStateMachine.java
+++ b/src/com/android/bluetooth/a2dp/A2dpSinkStateMachine.java
@@ -29,15 +29,23 @@
package com.android.bluetooth.a2dp;
import android.bluetooth.BluetoothA2dpSink;
+import android.bluetooth.BluetoothAvrcpController;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothAudioConfig;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothProfile;
import android.bluetooth.BluetoothUuid;
import android.bluetooth.IBluetooth;
+import android.content.BroadcastReceiver;
import android.content.Context;
import android.media.AudioFormat;
import android.media.AudioManager;
+import android.media.AudioManager.OnAudioFocusChangeListener;
+import android.media.AudioDevicePort;
+import android.media.AudioPatch;
+import android.media.AudioSystem;
+import android.media.AudioPortConfig;
+import android.media.AudioPort;
import android.os.Handler;
import android.os.Message;
import android.os.ParcelUuid;
@@ -52,6 +60,7 @@
import com.android.bluetooth.Utils;
import com.android.bluetooth.btservice.AdapterService;
import com.android.bluetooth.btservice.ProfileService;
+import com.android.bluetooth.avrcp.AvrcpControllerService;
import com.android.internal.util.IState;
import com.android.internal.util.State;
import com.android.internal.util.StateMachine;
@@ -61,13 +70,21 @@
import java.util.Set;
final class A2dpSinkStateMachine extends StateMachine {
- private static final boolean DBG = false;
+ private static final boolean DBG = true;
static final int CONNECT = 1;
static final int DISCONNECT = 2;
+ final private static int EVENT_TYPE_REQUEST_AUDIO_FOCUS = 4;
private static final int STACK_EVENT = 101;
private static final int CONNECT_TIMEOUT = 201;
+ private static final int IS_INVALID_DEVICE = 0;
+ private static final int IS_VALID_DEVICE = 1;
+ public static final int AVRC_ID_PLAY = 0x44;
+ public static final int AVRC_ID_PAUSE = 0x46;
+ public static final int KEY_STATE_PRESSED = 0;
+ public static final int KEY_STATE_RELEASED = 1;
+
private Disconnected mDisconnected;
private Pending mPending;
private Connected mConnected;
@@ -81,6 +98,29 @@
private static final int MSG_CONNECTION_STATE_CHANGED = 0;
+ private static final int AUDIO_FOCUS_LOSS = 0;
+ private static final int AUDIO_FOCUS_GAIN = 1;
+ private static final int AUDIO_FOCUS_LOSS_TRANSIENT = 2;
+ private static final int AUDIO_FOCUS_LOSS_CAN_DUCK = 3;
+ private static final int AUDIO_FOCUS_REQUEST_MESSAGE_DELAYED = 500;
+ private static final boolean USE_AUDIOTRACK = true;
+ private static final boolean BLOCK_REMOTE_INITIATED_STREAMING = true;
+ private static boolean mAvrcpPlaySent = false;
+
+ private int mAudioFocusAcquired = AUDIO_FOCUS_LOSS;
+
+ /* Used to indicate focus lost */
+ private static final int STATE_FOCUS_LOST = 0;
+ /* Used to inform bluedroid about AVRCP State changes */
+ private static final int STATE_FOCUS_READY = 1;
+ /* Used to inform bluedroid that focus is granted */
+ private static final int STATE_FOCUS_GRANTED = 3;
+
+ private final Object mLockForPatch = new Object();
+ private AudioDevicePort mInPortA2dpSink;
+ private AudioDevicePort mOutPortSpeaker;
+ private AudioPatch mA2dpSinkAudioPatch;
+
// mCurrentDevice is the device connected before the state changes
// mTargetDevice is the device to be connected
// mIncomingDevice is the device connecting to us, valid only in Pending state
@@ -106,6 +146,7 @@
private BluetoothDevice mCurrentDevice = null;
private BluetoothDevice mTargetDevice = null;
private BluetoothDevice mIncomingDevice = null;
+ private BluetoothDevice mPlayingDevice = null;
private final HashMap<BluetoothDevice,BluetoothAudioConfig> mAudioConfigs
= new HashMap<BluetoothDevice,BluetoothAudioConfig>();
@@ -138,7 +179,111 @@
mIntentBroadcastHandler = new IntentBroadcastHandler();
mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
+ if(!USE_AUDIOTRACK)
+ mAudioManager.registerAudioPortUpdateListener(mAudioPortListener);
}
+ private void releasePatch() {
+ if(USE_AUDIOTRACK) {
+ log(" releasePatch: AudioTrack, inform focus loss");
+ informAudioFocusStateNative(STATE_FOCUS_LOST);
+ return;
+ }
+ synchronized (mLockForPatch){
+ log("releaseAudioPatch AudioPatch = " + mA2dpSinkAudioPatch);
+ if(mA2dpSinkAudioPatch != null) {
+ mAudioManager.releaseAudioPatch(mA2dpSinkAudioPatch);
+ mA2dpSinkAudioPatch = null;
+ }
+ }
+ }
+ private void patchPorts() {
+ /* If we are using AudioTrack, we need to broadcast and inform bluedroid from here */
+ if(USE_AUDIOTRACK){
+ log(" patchPorts: AudioTrack, inform focus gain");
+ broadcastAudioState(mPlayingDevice, BluetoothA2dpSink.STATE_PLAYING,
+ BluetoothA2dpSink.STATE_NOT_PLAYING);
+ informAudioFocusStateNative(STATE_FOCUS_GRANTED);
+ return;
+ }
+ synchronized (mLockForPatch) {
+ log("patchPorts : mA2dpSinkAudioPatch: " + mA2dpSinkAudioPatch +
+ " mPlayingDevice " + mPlayingDevice + "mOutPortSpeaker" + mOutPortSpeaker);
+ if((mA2dpSinkAudioPatch == null) && (mPlayingDevice != null) &&
+ (mOutPortSpeaker != null) && (mInPortA2dpSink != null)) {
+ if((mAudioConfigs == null)||(!mAudioConfigs.containsKey(mPlayingDevice))) {
+ log(" AudioConfigs not yet received, returning");
+ return;
+ }
+ int sampleRate = getAudioConfig(mPlayingDevice).getSampleRate();
+ int channelMask = getAudioConfig(mPlayingDevice).getChannelConfig();
+ int format = getAudioConfig(mPlayingDevice).getAudioFormat();
+
+ AudioPortConfig sourcePortArray[] =
+ {mInPortA2dpSink.buildConfig(sampleRate, channelMask, format, null)};
+ AudioPortConfig sinkPortArray[] =
+ {mOutPortSpeaker.buildConfig(sampleRate, channelMask, format, null)};
+ AudioPatch patchPortArray[] = {null};
+ /* broadCast Audio State */
+ broadcastAudioState(mPlayingDevice, BluetoothA2dpSink.STATE_PLAYING,
+ BluetoothA2dpSink.STATE_NOT_PLAYING);
+
+ int ret = mAudioManager.createAudioPatch(patchPortArray, sourcePortArray,
+ sinkPortArray);
+ if (ret == 0) {
+ mA2dpSinkAudioPatch = patchPortArray[0];
+ log("PatchCreated success: " + ret + " mA2dpSinkAudioPatch: "
+ + mA2dpSinkAudioPatch);
+ } else {
+ log("PatchCreated failed returned: " + ret);
+ }
+ }
+ }
+ }
+
+ private final AudioManager.OnAudioPortUpdateListener mAudioPortListener =
+ new AudioManager.OnAudioPortUpdateListener(){
+ public void onAudioPortListUpdate(AudioPort[] portList) {
+ synchronized (mLockForPatch){
+ log("onAudioPortListUpdate");
+ mOutPortSpeaker = null;
+ mInPortA2dpSink = null;
+
+ for (int i = 0; i < portList.length; i++) {
+ AudioPort port = portList[i];
+ if(port instanceof AudioDevicePort) {
+ AudioDevicePort devicePort = (AudioDevicePort)port;
+ if(devicePort.type() == AudioSystem.DEVICE_OUT_SPEAKER) {
+ log("Updating Speaker Port");
+ mOutPortSpeaker = devicePort;
+ } else if(devicePort.type() == AudioSystem.DEVICE_IN_BLUETOOTH_A2DP) {
+ log("Updating In Port A2DP Sink");
+ mInPortA2dpSink = devicePort;
+ /* Check if we still have focus */
+ if ((mAudioFocusAcquired == AUDIO_FOCUS_GAIN) &&
+ (mInPortA2dpSink != null) && (mA2dpSinkAudioPatch == null)) {
+ /* This is the case of Port available
+ * later than focus acquired. Try patching ports now
+ */
+ log(" Sink Port updated, but patch not made");
+ patchPorts();
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public void onAudioPatchListUpdate(AudioPatch[] patchList){
+ log("onAudioPatchListUpdate");
+ for(int i = 0; i < patchList.length; i++) {
+ log("Patch List " + i +" : "+ patchList[i]);
+ }
+ }
+
+ public void onServiceDied() {
+ log(" Service Died");
+ }
+ };
static A2dpSinkStateMachine make(A2dpSinkService svc, Context context) {
Log.d("A2dpSinkStateMachine", "make");
@@ -152,8 +297,18 @@
}
public void cleanup() {
+ /*
+ * remove cleanup of resources
+ * not acquired in AudioTrack approach
+ */
+ if(!USE_AUDIOTRACK)
+ releasePatch();
cleanupNative();
mAudioConfigs.clear();
+ if(USE_AUDIOTRACK) return;
+ if (mContext != null)
+ mContext.unregisterReceiver(mA2dpReceiver);
+ mAudioManager.unregisterAudioPortUpdateListener(mAudioPortListener);
}
public void dump(StringBuilder sb) {
@@ -167,6 +322,11 @@
@Override
public void enter() {
log("Enter Disconnected: " + getCurrentMessage().what);
+ /*
+ * Remove audio focus request when not in connected state
+ */
+ removeMessages(EVENT_TYPE_REQUEST_AUDIO_FOCUS);
+ mAvrcpPlaySent = false;
}
@Override
@@ -289,6 +449,11 @@
@Override
public void enter() {
log("Enter Pending: " + getCurrentMessage().what);
+ /*
+ * Remove audio focus request when not in connected state
+ */
+ removeMessages(EVENT_TYPE_REQUEST_AUDIO_FOCUS);
+ mAvrcpPlaySent = false;
}
@Override
@@ -477,6 +642,7 @@
// Upon connected, the audio starts out as stopped
broadcastAudioState(mCurrentDevice, BluetoothA2dpSink.STATE_NOT_PLAYING,
BluetoothA2dpSink.STATE_PLAYING);
+ mAvrcpPlaySent = false;
}
@Override
@@ -523,9 +689,22 @@
BluetoothProfile.STATE_DISCONNECTED);
break;
}
+
+ if (mAudioFocusAcquired != AUDIO_FOCUS_LOSS) {
+ releasePatch();
+ int status = mAudioManager.abandonAudioFocus(mAudioFocusListener);
+ if (status == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
+ mAudioFocusAcquired = AUDIO_FOCUS_LOSS;
+ }
+ }
+ mPlayingDevice = null;
+
transitionTo(mPending);
}
break;
+ case EVENT_TYPE_REQUEST_AUDIO_FOCUS:
+ processAudioFocusRequestEvent(1, (BluetoothDevice) message.obj);
+ break;
case STACK_EVENT:
StackEvent event = (StackEvent) message.obj;
switch (event.type) {
@@ -554,6 +733,9 @@
switch (state) {
case CONNECTION_STATE_DISCONNECTED:
mAudioConfigs.remove(device);
+ if ((mPlayingDevice != null) && (device.equals(mPlayingDevice))) {
+ mPlayingDevice = null;
+ }
if (mCurrentDevice.equals(device)) {
broadcastConnectionState(mCurrentDevice, BluetoothProfile.STATE_DISCONNECTED,
BluetoothProfile.STATE_CONNECTED);
@@ -561,6 +743,14 @@
mCurrentDevice = null;
transitionTo(mDisconnected);
}
+ releasePatch();
+ int status = mAudioManager.abandonAudioFocus(mAudioFocusListener);
+ if (status == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
+ mAudioFocusAcquired = AUDIO_FOCUS_LOSS;
+ /* Check if we need to release patch here
+ * Would we ever get disconnect directly without
+ * Suspend or Stoppped being called before */
+ }
} else {
loge("Disconnected from unknown device: " + device);
}
@@ -576,24 +766,89 @@
mCurrentDevice);
return;
}
+ log(" processAudioStateEvent in state " + state);
switch (state) {
case AUDIO_STATE_STARTED:
- broadcastAudioState(device, BluetoothA2dpSink.STATE_PLAYING,
- BluetoothA2dpSink.STATE_NOT_PLAYING);
+ if (mPlayingDevice == null) {
+ mPlayingDevice = device;
+ }
+ if(!USE_AUDIOTRACK)
+ requestAudioFocus(true, device, 0);
break;
case AUDIO_STATE_REMOTE_SUSPEND:
case AUDIO_STATE_STOPPED:
+ mPlayingDevice = null;
+ releasePatch();
broadcastAudioState(device, BluetoothA2dpSink.STATE_NOT_PLAYING,
BluetoothA2dpSink.STATE_PLAYING);
+ if (mAudioFocusAcquired == AUDIO_FOCUS_LOSS) {
+ /* Audio Focus was already lost, no need to do it again */
+ return;
+ }
+ if ((mAudioFocusAcquired == AUDIO_FOCUS_LOSS_TRANSIENT) &&
+ (state == AUDIO_STATE_REMOTE_SUSPEND)) {
+ log(" Dont't Loose audiofocus in case of suspend ");
+ break;
+ }
+ int status = mAudioManager.abandonAudioFocus(mAudioFocusListener);
+ if (status == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
+ mAudioFocusAcquired = AUDIO_FOCUS_LOSS;
+ }
break;
default:
loge("Audio State Device: " + device + " bad state: " + state);
break;
}
}
+
+ private void processAudioFocusRequestEvent(int enable, BluetoothDevice device) {
+ if ((mCurrentDevice != null) && (mCurrentDevice.equals(device))
+ && (1 == enable)) {
+
+ if (BLOCK_REMOTE_INITIATED_STREAMING) {
+ /*
+ * If play command is not send from UI
+ * don't rquest focus.
+ */
+ if (!mAvrcpPlaySent) {
+ log(" AVRCP Play not sent from UI, send Pause");
+ SendPassThruPause(device);
+ if(USE_AUDIOTRACK)
+ informAudioFocusStateNative(STATE_FOCUS_LOST);
+ /*
+ * TODO, any additional intent that we want to send
+ */
+ return;
+ }
+ }
+ if (mAudioFocusAcquired == AUDIO_FOCUS_LOSS_TRANSIENT) {
+ log(" Transient Loss Still, Don't acquire focus, Send PAUSE");
+ SendPassThruPause(device);
+ if(USE_AUDIOTRACK)
+ informAudioFocusStateNative(STATE_FOCUS_LOST);
+ return;
+ }
+ else if (mAudioFocusAcquired == AUDIO_FOCUS_GAIN) {
+ patchPorts();
+ return; /* if we already have focus, don't request again */
+ }
+ int status = mAudioManager.requestAudioFocus(mAudioFocusListener,
+ AudioManager.STREAM_MUSIC,AudioManager.AUDIOFOCUS_GAIN);
+ log(" Audio Focus Request returned " + status);
+ if (status == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
+ mAudioFocusAcquired = AUDIO_FOCUS_GAIN;
+ patchPorts();
+ }
+ else {
+ log("Can't acquire Focus, request with delay");
+ requestAudioFocus(true, device, AUDIO_FOCUS_REQUEST_MESSAGE_DELAYED);
+ }
+ }
+ }
}
private void processAudioConfigEvent(BluetoothAudioConfig audioConfig, BluetoothDevice device) {
+ log("processAudioConfigEvent: " + device);
mAudioConfigs.put(device, audioConfig);
broadcastAudioConfig(device, audioConfig);
}
@@ -644,6 +899,59 @@
return devices;
}
+ boolean isPlaying(BluetoothDevice device) {
+ synchronized(this) {
+ if ((mPlayingDevice != null) && (device.equals(mPlayingDevice))) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ void informAvrcpStatePlaying(BluetoothDevice device) {
+ if ((mPlayingDevice != null) && (device.equals(mPlayingDevice))) {
+ log(" AVRCP State is Playing");
+ /* If call is ongoing, Focus already acquired, no need to
+ * send this info to bluedroid
+ */
+ /*
+ * If Flag is set, this info should not be used
+ * to request focus.
+ */
+ if (BLOCK_REMOTE_INITIATED_STREAMING)
+ return;
+ if(mAudioFocusAcquired == AUDIO_FOCUS_LOSS_TRANSIENT)
+ SendPassThruPause(device);
+ if((USE_AUDIOTRACK) && (mAudioFocusAcquired == AUDIO_FOCUS_LOSS))
+ informAudioFocusStateNative(STATE_FOCUS_READY);
+ }
+ }
+ void informAvrcpPassThroughCmd(BluetoothDevice device, int keyCode,
+ int keyState) {
+ if (!BLOCK_REMOTE_INITIATED_STREAMING)
+ return;
+ log(" informAvrcpPassThroughCmd device: " + device + " key: " + keyCode
+ + " keyState: " + keyState);
+ if ((keyCode == BluetoothAvrcpController.PASS_THRU_CMD_ID_PLAY) &&
+ (keyState == BluetoothAvrcpController.KEY_STATE_RELEASED)) {
+ mAvrcpPlaySent = true;
+ /*
+ * SO that if packets are received, we can request for focus
+ * from bluedroid
+ */
+ informAudioFocusStateNative(STATE_FOCUS_READY);
+ }
+ if (((keyCode == BluetoothAvrcpController.PASS_THRU_CMD_ID_PAUSE)||
+ (keyCode == BluetoothAvrcpController.PASS_THRU_CMD_ID_STOP)) &&
+ (keyState == BluetoothAvrcpController.KEY_STATE_RELEASED)) {
+ mAvrcpPlaySent = false;
+ /*
+ * emulate a remote initiaited suspend.
+ */
+ onAudioStateChanged(AUDIO_STATE_REMOTE_SUSPEND,
+ getByteAddress(device));
+ }
+ }
boolean okToConnect(BluetoothDevice device) {
AdapterService adapterService = AdapterService.getAdapterService();
boolean ret = true;
@@ -680,7 +988,9 @@
// This method does not check for error conditon (newState == prevState)
private void broadcastConnectionState(BluetoothDevice device, int newState, int prevState) {
- int delay = mAudioManager.setBluetoothA2dpDeviceConnectionState(device, newState,
+ int delay = 0;
+ if(!USE_AUDIOTRACK)
+ delay = mAudioManager.setBluetoothA2dpDeviceConnectionState(device, newState,
BluetoothProfile.A2DP_SINK);
mWakeLock.acquire();
@@ -741,6 +1051,27 @@
sendMessage(STACK_EVENT, event);
}
+ private void onAudioFocusRequested(byte[] address) {
+ BluetoothDevice device = getDevice(address);
+ if (BLOCK_REMOTE_INITIATED_STREAMING) {
+ /*
+ * IN this case we mPlayingDevice can be null
+ */
+ requestAudioFocus(true, device, 0);
+ }
+ else if(device.equals(mPlayingDevice))
+ requestAudioFocus(true, device, 0);
+ }
+
+ private void requestAudioFocus(boolean enable, BluetoothDevice device, int delay) {
+ log(" requestAudioFocus for " + device + " enable " + enable);
+ if (enable) {
+ // send a request for audio_focus
+ Message posMsg = obtainMessage(EVENT_TYPE_REQUEST_AUDIO_FOCUS, device);
+ sendMessageDelayed(posMsg, delay);
+ }
+ }
+
private BluetoothDevice getDevice(byte[] address) {
return mAdapter.getRemoteDevice(Utils.getAddressStringFromByte(address));
}
@@ -781,6 +1112,142 @@
}
}
+ public boolean SendPassThruPlay(BluetoothDevice mDevice) {
+ log("SendPassThruPlay + ");
+ AvrcpControllerService avrcpCtrlService = AvrcpControllerService.getAvrcpControllerService();
+ if ((avrcpCtrlService != null) && (mDevice != null) &&
+ (avrcpCtrlService.getConnectedDevices().contains(mDevice))){
+ avrcpCtrlService.sendPassThroughCmd(mDevice,
+ BluetoothAvrcpController.PASS_THRU_CMD_ID_PLAY,
+ BluetoothAvrcpController.KEY_STATE_PRESSED);
+ avrcpCtrlService.sendPassThroughCmd(mDevice,
+ BluetoothAvrcpController.PASS_THRU_CMD_ID_PLAY,
+ BluetoothAvrcpController.KEY_STATE_RELEASED);
+ log(" SendPassThruPlay command sent - ");
+ return true;
+ } else {
+ log("passthru command not sent, connection unavailable");
+ return false;
+ }
+ }
+
+ public boolean SendPassThruPause(BluetoothDevice mDevice) {
+ log("SendPassThruPause + ");
+ AvrcpControllerService avrcpCtrlService = AvrcpControllerService.getAvrcpControllerService();
+ if ((avrcpCtrlService != null) && (mDevice != null) &&
+ (avrcpCtrlService.getConnectedDevices().contains(mDevice))){
+
+ avrcpCtrlService.sendPassThroughCmd(mDevice,
+ BluetoothAvrcpController.PASS_THRU_CMD_ID_PAUSE,
+ BluetoothAvrcpController.KEY_STATE_PRESSED);
+ avrcpCtrlService.sendPassThroughCmd(mDevice,
+ BluetoothAvrcpController.PASS_THRU_CMD_ID_PAUSE,
+ BluetoothAvrcpController.KEY_STATE_RELEASED);
+ log(" SendPassThruPause command sent - ");
+ return true;
+ } else {
+ log("passthru command not sent, connection unavailable");
+ return false;
+ }
+ }
+
+ private final BroadcastReceiver mA2dpReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ log("onReceive " + action);
+ if (action.equals("com.android.music.musicservicecommand")) {
+ String cmd = intent.getStringExtra("command");
+ log("Command Received " + cmd);
+ if (cmd.equals("pause")) {
+ if (mCurrentDevice != null) {
+ if (SendPassThruPause(mCurrentDevice)) {
+ log(" Sending AVRCP Pause");
+ } else {
+ log(" Sending Disconnect AVRCP Not Up");
+ disconnectA2dpNative(getByteAddress(mCurrentDevice));
+ }
+ releasePatch();
+ if (mAudioFocusAcquired != AUDIO_FOCUS_LOSS) {
+ int status = mAudioManager.abandonAudioFocus(mAudioFocusListener);
+ log("abandonAudioFocus returned" + status);
+ if (status == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
+ mAudioFocusAcquired = AUDIO_FOCUS_LOSS;
+ }
+ }
+ }
+ }
+ }
+ }
+ };
+
+ private OnAudioFocusChangeListener mAudioFocusListener = new OnAudioFocusChangeListener() {
+ public void onAudioFocusChange(int focusChange){
+ log("onAudioFocusChangeListener focuschange " + focusChange);
+ switch(focusChange){
+ case AudioManager.AUDIOFOCUS_LOSS:
+ if (mCurrentDevice != null) {
+ /* First Release the Patch Anyways */
+ if (SendPassThruPause(mCurrentDevice)) {
+ log(" Sending AVRCP Pause");
+ } else {
+ log(" Sending Disconnect AVRCP Not Up");
+ disconnectA2dpNative(getByteAddress(mCurrentDevice));
+ }
+ if(USE_AUDIOTRACK)
+ informAudioFocusStateNative(STATE_FOCUS_LOST);
+ int status = mAudioManager.abandonAudioFocus(mAudioFocusListener);
+ log("abandonAudioFocus returned" + status);
+ if (status == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
+ mAudioFocusAcquired = AUDIO_FOCUS_LOSS;
+ }
+ }
+ break;
+ case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
+ if ((mCurrentDevice != null) && (getCurrentState() == mConnected)) {
+ /* don't abandon focus, but fake focus loss */
+ mAudioFocusAcquired = AUDIO_FOCUS_LOSS_TRANSIENT;
+ if (SendPassThruPause(mCurrentDevice)) {
+ log(" Sending AVRCP Pause");
+ } else {
+ log(" AVRCP Connection not UP");
+ disconnectA2dpNative(getByteAddress(mCurrentDevice));
+ /* TODO what shld we do in case AVRCP connection is not there */
+ }
+ if(USE_AUDIOTRACK)
+ informAudioFocusStateNative(STATE_FOCUS_LOST);
+ }
+ break;
+ case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
+ log(" Received AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK ");
+ mAudioFocusAcquired = AUDIO_FOCUS_LOSS_CAN_DUCK;
+ // TODO(sanketa): Currently we do not honor this and keep playing music at the
+ // previous volume. This should be changed to implement ducking.
+ break;
+ case AudioManager.AUDIOFOCUS_GAIN:
+ // we got focus gain
+ if ((mCurrentDevice != null) && (getCurrentState() == mConnected)) {
+ if (mAudioFocusAcquired == AUDIO_FOCUS_LOSS_CAN_DUCK) {
+ log(" Received Can_Duck earlier, Ignore Now ");
+ mAudioFocusAcquired = AUDIO_FOCUS_GAIN;
+ break;
+ }
+ mAudioFocusAcquired = AUDIO_FOCUS_GAIN;
+ if (SendPassThruPlay(mCurrentDevice)) {
+ log(" Sending AVRCP Play");
+ } else {
+ log(" AVRCP Connection not up");
+ /* TODO what shld we do in case AVRCP connection is not there */
+ }
+ if(USE_AUDIOTRACK)
+ informAudioFocusStateNative(STATE_FOCUS_GRANTED);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ };
// Event types for STACK_EVENT message
final private static int EVENT_TYPE_NONE = 0;
@@ -806,4 +1273,5 @@
private native void cleanupNative();
private native boolean connectA2dpNative(byte[] address);
private native boolean disconnectA2dpNative(byte[] address);
+ private native void informAudioFocusStateNative(int focusGranted);
}
diff --git a/src/com/android/bluetooth/avrcp/Avrcp.java b/src/com/android/bluetooth/avrcp/Avrcp.java
index abc0b84..450574a 100755
--- a/src/com/android/bluetooth/avrcp/Avrcp.java
+++ b/src/com/android/bluetooth/avrcp/Avrcp.java
@@ -19,14 +19,14 @@
import java.util.Timer;
import java.util.TimerTask;
-import android.app.PendingIntent;
import android.bluetooth.BluetoothA2dp;
import android.bluetooth.BluetoothAvrcp;
import android.content.Context;
import android.content.Intent;
+import android.content.res.Resources;
+import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.media.AudioManager;
-import android.media.IRemoteControlDisplay;
import android.media.MediaMetadataRetriever;
import android.media.RemoteControlClient;
import android.media.RemoteController;
@@ -45,6 +45,7 @@
import android.util.Log;
import android.view.KeyEvent;
+import com.android.bluetooth.R;
import com.android.bluetooth.btservice.AdapterService;
import com.android.bluetooth.btservice.ProfileService;
import com.android.bluetooth.Utils;
@@ -54,6 +55,7 @@
import java.lang.ref.WeakReference;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
import java.util.Set;
/**
@@ -63,6 +65,7 @@
public final class Avrcp {
private static final boolean DEBUG = false;
private static final String TAG = "Avrcp";
+ private static final String ABSOLUTE_VOLUME_BLACKLIST = "absolute_volume_blacklist";
private Context mContext;
private final AudioManager mAudioManager;
@@ -84,12 +87,23 @@
private long mPrevPosMs;
private long mSkipStartTime;
private int mFeatures;
- private int mAbsoluteVolume;
- private int mLastSetVolume;
+ private int mRemoteVolume;
+ private int mLastRemoteVolume;
+ private int mInitialRemoteVolume;
+
+ /* Local volume in audio index 0-15 */
+ private int mLocalVolume;
+ private int mLastLocalVolume;
+ private int mAbsVolThreshold;
+
+ private String mAddress;
+ private HashMap<Integer, Integer> mVolumeMapping;
+
private int mLastDirection;
private final int mVolumeStep;
private final int mAudioStreamMax;
- private boolean mVolCmdInProgress;
+ private boolean mVolCmdAdjustInProgress;
+ private boolean mVolCmdSetInProgress;
private int mAbsVolRetryTimes;
private int mSkipAmount;
@@ -153,11 +167,17 @@
mPlaybackIntervalMs = 0L;
mPlayPosChangedNT = NOTIFICATION_TYPE_CHANGED;
mFeatures = 0;
- mAbsoluteVolume = -1;
- mLastSetVolume = -1;
+ mRemoteVolume = -1;
+ mInitialRemoteVolume = -1;
+ mLastRemoteVolume = -1;
mLastDirection = 0;
- mVolCmdInProgress = false;
+ mVolCmdAdjustInProgress = false;
+ mVolCmdSetInProgress = false;
mAbsVolRetryTimes = 0;
+ mLocalVolume = -1;
+ mLastLocalVolume = -1;
+ mAbsVolThreshold = 0;
+ mVolumeMapping = new HashMap<Integer, Integer>();
mContext = context;
@@ -166,6 +186,10 @@
mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
mAudioStreamMax = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
mVolumeStep = Math.max(AVRCP_BASE_VOLUME_STEP, AVRCP_MAX_VOL/mAudioStreamMax);
+ Resources resources = context.getResources();
+ if (resources != null) {
+ mAbsVolThreshold = resources.getInteger(R.integer.a2dp_absolute_volume_initial_threshold);
+ }
}
private void start() {
@@ -197,6 +221,8 @@
public void cleanup() {
cleanupNative();
+ if (mVolumeMapping != null)
+ mVolumeMapping.clear();
}
private static class RemoteControllerWeak implements RemoteController.OnClientUpdateListener {
@@ -283,7 +309,15 @@
if (DEBUG) Log.v(TAG, "MESSAGE_GET_RC_FEATURES: address="+address+
", features="+msg.arg1);
mFeatures = msg.arg1;
+ mFeatures = modifyRcFeatureFromBlacklist(mFeatures, address);
mAudioManager.avrcpSupportsAbsoluteVolume(address, isAbsoluteVolumeSupported());
+ mLastLocalVolume = -1;
+ mRemoteVolume = -1;
+ mLocalVolume = -1;
+ mInitialRemoteVolume = -1;
+ mAddress = address;
+ if (mVolumeMapping != null)
+ mVolumeMapping.clear();
break;
case MESSAGE_GET_PLAY_STATUS:
@@ -321,47 +355,158 @@
break;
case MESSAGE_VOLUME_CHANGED:
+ if (!isAbsoluteVolumeSupported()) {
+ if (DEBUG) Log.v(TAG, "ignore MESSAGE_VOLUME_CHANGED");
+ break;
+ }
+
if (DEBUG) Log.v(TAG, "MESSAGE_VOLUME_CHANGED: volume=" + ((byte)msg.arg1 & 0x7f)
+ " ctype=" + msg.arg2);
+
+ boolean volAdj = false;
if (msg.arg2 == AVRC_RSP_ACCEPT || msg.arg2 == AVRC_RSP_REJ) {
- if (mVolCmdInProgress == false) {
+ if (mVolCmdAdjustInProgress == false && mVolCmdSetInProgress == false) {
Log.e(TAG, "Unsolicited response, ignored");
break;
}
removeMessages(MESSAGE_ABS_VOL_TIMEOUT);
- mVolCmdInProgress = false;
+
+ volAdj = mVolCmdAdjustInProgress;
+ mVolCmdAdjustInProgress = false;
+ mVolCmdSetInProgress = false;
mAbsVolRetryTimes = 0;
}
- if (mAbsoluteVolume != msg.arg1 && (msg.arg2 == AVRC_RSP_ACCEPT ||
+
+ byte absVol = (byte)((byte)msg.arg1 & 0x7f); // discard MSB as it is RFD
+ // convert remote volume to local volume
+ int volIndex = convertToAudioStreamVolume(absVol);
+ if (mInitialRemoteVolume == -1) {
+ mInitialRemoteVolume = absVol;
+ if (mAbsVolThreshold > 0 && mAbsVolThreshold < mAudioStreamMax && volIndex > mAbsVolThreshold) {
+ if (DEBUG) Log.v(TAG, "remote inital volume too high " + volIndex + ">" + mAbsVolThreshold);
+ Message msg1 = mHandler.obtainMessage(MESSAGE_SET_ABSOLUTE_VOLUME, mAbsVolThreshold , 0);
+ mHandler.sendMessage(msg1);
+ mRemoteVolume = absVol;
+ mLocalVolume = volIndex;
+ break;
+ }
+ }
+
+ if (mLocalVolume != volIndex &&
+ (msg.arg2 == AVRC_RSP_ACCEPT ||
msg.arg2 == AVRC_RSP_CHANGED ||
msg.arg2 == AVRC_RSP_INTERIM)) {
- byte absVol = (byte)((byte)msg.arg1 & 0x7f); // discard MSB as it is RFD
- notifyVolumeChanged(absVol);
- mAbsoluteVolume = absVol;
+ /* If the volume has successfully changed */
+ mLocalVolume = volIndex;
+ if (mLastLocalVolume != -1 && msg.arg2 == AVRC_RSP_ACCEPT) {
+ if (mLastLocalVolume != volIndex) {
+ /* remote volume changed more than requested due to
+ * local and remote has different volume steps */
+ if (DEBUG) Log.d(TAG, "Remote returned volume does not match desired volume "
+ + mLastLocalVolume + " vs "
+ + volIndex);
+ mLastLocalVolume = mLocalVolume;
+ }
+ }
+ // remember the remote volume value, as it's the one supported by remote
+ if (volAdj) {
+ synchronized (mVolumeMapping) {
+ mVolumeMapping.put(volIndex, (int)absVol);
+ if (DEBUG) Log.v(TAG, "remember volume mapping " +volIndex+ "-"+absVol);
+ }
+ }
+
+ notifyVolumeChanged(mLocalVolume);
+ mRemoteVolume = absVol;
long pecentVolChanged = ((long)absVol * 100) / 0x7f;
Log.e(TAG, "percent volume changed: " + pecentVolChanged + "%");
} else if (msg.arg2 == AVRC_RSP_REJ) {
Log.e(TAG, "setAbsoluteVolume call rejected");
+ } else if (volAdj && mLastRemoteVolume > 0 && mLastRemoteVolume < AVRCP_MAX_VOL &&
+ mLocalVolume == volIndex &&
+ (msg.arg2 == AVRC_RSP_ACCEPT )) {
+ /* oops, the volume is still same, remote does not like the value
+ * retry a volume one step up/down */
+ if (DEBUG) Log.d(TAG, "Remote device didn't tune volume, let's try one more step.");
+ int retry_volume = Math.min(AVRCP_MAX_VOL,
+ Math.max(0, mLastRemoteVolume + mLastDirection));
+ if (setVolumeNative(retry_volume)) {
+ mLastRemoteVolume = retry_volume;
+ sendMessageDelayed(obtainMessage(MESSAGE_ABS_VOL_TIMEOUT),
+ CMD_TIMEOUT_DELAY);
+ mVolCmdAdjustInProgress = true;
+ }
}
break;
case MESSAGE_ADJUST_VOLUME:
+ if (!isAbsoluteVolumeSupported()) {
+ if (DEBUG) Log.v(TAG, "ignore MESSAGE_ADJUST_VOLUME");
+ break;
+ }
+
if (DEBUG) Log.d(TAG, "MESSAGE_ADJUST_VOLUME: direction=" + msg.arg1);
- if (mVolCmdInProgress) {
+
+ if (mVolCmdAdjustInProgress || mVolCmdSetInProgress) {
if (DEBUG) Log.w(TAG, "There is already a volume command in progress.");
break;
}
+
+ // Remote device didn't set initial volume. Let's black list it
+ if (mInitialRemoteVolume == -1) {
+ Log.d(TAG, "remote " + mAddress + " never tell us initial volume, black list it.");
+ blackListCurrentDevice();
+ break;
+ }
+
// Wait on verification on volume from device, before changing the volume.
- if (mAbsoluteVolume != -1 && (msg.arg1 == -1 || msg.arg1 == 1)) {
- int setVol = Math.min(AVRCP_MAX_VOL,
- Math.max(0, mAbsoluteVolume + msg.arg1*mVolumeStep));
+ if (mRemoteVolume != -1 && (msg.arg1 == -1 || msg.arg1 == 1)) {
+ int setVol = -1;
+ int targetVolIndex = -1;
+ if (mLocalVolume == 0 && msg.arg1 == -1) {
+ if (DEBUG) Log.w(TAG, "No need to Vol down from 0.");
+ break;
+ }
+ if (mLocalVolume == mAudioStreamMax && msg.arg1 == 1) {
+ if (DEBUG) Log.w(TAG, "No need to Vol up from max.");
+ break;
+ }
+
+ targetVolIndex = mLocalVolume + msg.arg1;
+ if (DEBUG) Log.d(TAG, "Adjusting volume to " + targetVolIndex);
+
+ Integer i;
+ synchronized (mVolumeMapping) {
+ i = mVolumeMapping.get(targetVolIndex);
+ }
+
+ if (i != null) {
+ /* if we already know this volume mapping, use it */
+ setVol = i.byteValue();
+ if (setVol == mRemoteVolume) {
+ if (DEBUG) Log.d(TAG, "got same volume from mapping for " + targetVolIndex + ", ignore.");
+ setVol = -1;
+ }
+ if (DEBUG) Log.d(TAG, "set volume from mapping " + targetVolIndex + "-" + setVol);
+ }
+
+ if (setVol == -1) {
+ /* otherwise use phone steps */
+ setVol = Math.min(AVRCP_MAX_VOL,
+ convertToAvrcpVolume(Math.max(0, targetVolIndex)));
+ if (DEBUG) Log.d(TAG, "set volume from local volume "+ targetVolIndex+"-"+ setVol);
+ }
+
if (setVolumeNative(setVol)) {
sendMessageDelayed(obtainMessage(MESSAGE_ABS_VOL_TIMEOUT),
CMD_TIMEOUT_DELAY);
- mVolCmdInProgress = true;
+ mVolCmdAdjustInProgress = true;
mLastDirection = msg.arg1;
- mLastSetVolume = setVol;
+ mLastRemoteVolume = setVol;
+ mLastLocalVolume = targetVolIndex;
+ } else {
+ if (DEBUG) Log.d(TAG, "setVolumeNative failed");
}
} else {
Log.e(TAG, "Unknown direction in MESSAGE_ADJUST_VOLUME");
@@ -369,29 +514,50 @@
break;
case MESSAGE_SET_ABSOLUTE_VOLUME:
+ if (!isAbsoluteVolumeSupported()) {
+ if (DEBUG) Log.v(TAG, "ignore MESSAGE_SET_ABSOLUTE_VOLUME");
+ break;
+ }
+
if (DEBUG) Log.v(TAG, "MESSAGE_SET_ABSOLUTE_VOLUME");
- if (mVolCmdInProgress) {
+
+ if (mVolCmdSetInProgress || mVolCmdAdjustInProgress) {
if (DEBUG) Log.w(TAG, "There is already a volume command in progress.");
break;
}
- if (setVolumeNative(msg.arg1)) {
+
+ // Remote device didn't set initial volume. Let's black list it
+ if (mInitialRemoteVolume == -1) {
+ if (DEBUG) Log.d(TAG, "remote " + mAddress + " never tell us initial volume, black list it.");
+ blackListCurrentDevice();
+ break;
+ }
+
+ int avrcpVolume = convertToAvrcpVolume(msg.arg1);
+ avrcpVolume = Math.min(AVRCP_MAX_VOL, Math.max(0, avrcpVolume));
+ if (DEBUG) Log.d(TAG, "Setting volume to " + msg.arg1+"-"+avrcpVolume);
+ if (setVolumeNative(avrcpVolume)) {
sendMessageDelayed(obtainMessage(MESSAGE_ABS_VOL_TIMEOUT), CMD_TIMEOUT_DELAY);
- mVolCmdInProgress = true;
- mLastSetVolume = msg.arg1;
+ mVolCmdSetInProgress = true;
+ mLastRemoteVolume = avrcpVolume;
+ mLastLocalVolume = msg.arg1;
+ } else {
+ if (DEBUG) Log.d(TAG, "setVolumeNative failed");
}
break;
case MESSAGE_ABS_VOL_TIMEOUT:
if (DEBUG) Log.v(TAG, "MESSAGE_ABS_VOL_TIMEOUT: Volume change cmd timed out.");
- mVolCmdInProgress = false;
+ mVolCmdAdjustInProgress = false;
+ mVolCmdSetInProgress = false;
if (mAbsVolRetryTimes >= MAX_ERROR_RETRY_TIMES) {
mAbsVolRetryTimes = 0;
} else {
mAbsVolRetryTimes += 1;
- if (setVolumeNative(mLastSetVolume)) {
+ if (setVolumeNative(mLastRemoteVolume)) {
sendMessageDelayed(obtainMessage(MESSAGE_ABS_VOL_TIMEOUT),
CMD_TIMEOUT_DELAY);
- mVolCmdInProgress = true;
+ mVolCmdSetInProgress = true;
}
}
break;
@@ -799,10 +965,13 @@
}
public void setAbsoluteVolume(int volume) {
- int avrcpVolume = convertToAvrcpVolume(volume);
- avrcpVolume = Math.min(AVRCP_MAX_VOL, Math.max(0, avrcpVolume));
+ if (volume == mLocalVolume) {
+ if (DEBUG) Log.v(TAG, "setAbsoluteVolume is setting same index, ignore "+volume);
+ return;
+ }
+
mHandler.removeMessages(MESSAGE_ADJUST_VOLUME);
- Message msg = mHandler.obtainMessage(MESSAGE_SET_ABSOLUTE_VOLUME, avrcpVolume, 0);
+ Message msg = mHandler.obtainMessage(MESSAGE_SET_ABSOLUTE_VOLUME, volume, 0);
mHandler.sendMessage(msg);
}
@@ -819,20 +988,50 @@
}
private void notifyVolumeChanged(int volume) {
- volume = convertToAudioStreamVolume(volume);
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, volume,
AudioManager.FLAG_SHOW_UI | AudioManager.FLAG_BLUETOOTH_ABS_VOLUME);
}
private int convertToAudioStreamVolume(int volume) {
// Rescale volume to match AudioSystem's volume
- return (int) Math.round((double) volume*mAudioStreamMax/AVRCP_MAX_VOL);
+ return (int) Math.floor((double) volume*mAudioStreamMax/AVRCP_MAX_VOL);
}
private int convertToAvrcpVolume(int volume) {
return (int) Math.ceil((double) volume*AVRCP_MAX_VOL/mAudioStreamMax);
}
+ private void blackListCurrentDevice() {
+ mFeatures &= ~BTRC_FEAT_ABSOLUTE_VOLUME;
+ mAudioManager.avrcpSupportsAbsoluteVolume(mAddress, isAbsoluteVolumeSupported());
+
+ SharedPreferences pref = mContext.getSharedPreferences(ABSOLUTE_VOLUME_BLACKLIST,
+ Context.MODE_PRIVATE);
+ SharedPreferences.Editor editor = pref.edit();
+ editor.putBoolean(mAddress, true);
+ editor.commit();
+ }
+
+ private int modifyRcFeatureFromBlacklist(int feature, String address) {
+ SharedPreferences pref = mContext.getSharedPreferences(ABSOLUTE_VOLUME_BLACKLIST,
+ Context.MODE_PRIVATE);
+ if (!pref.contains(address)) {
+ return feature;
+ }
+ if (pref.getBoolean(address, false)) {
+ feature &= ~BTRC_FEAT_ABSOLUTE_VOLUME;
+ }
+ return feature;
+ }
+
+ public void resetBlackList(String address) {
+ SharedPreferences pref = mContext.getSharedPreferences(ABSOLUTE_VOLUME_BLACKLIST,
+ Context.MODE_PRIVATE);
+ SharedPreferences.Editor editor = pref.edit();
+ editor.remove(address);
+ editor.commit();
+ }
+
/**
* This is called from A2dpStateMachine to set A2dp audio state.
*/
@@ -858,14 +1057,16 @@
ProfileService.println(sb, "mPrevPosMs: " + mPrevPosMs);
ProfileService.println(sb, "mSkipStartTime: " + mSkipStartTime);
ProfileService.println(sb, "mFeatures: " + mFeatures);
- ProfileService.println(sb, "mAbsoluteVolume: " + mAbsoluteVolume);
- ProfileService.println(sb, "mLastSetVolume: " + mLastSetVolume);
+ ProfileService.println(sb, "mRemoteVolume: " + mRemoteVolume);
+ ProfileService.println(sb, "mLastRemoteVolume: " + mLastRemoteVolume);
ProfileService.println(sb, "mLastDirection: " + mLastDirection);
ProfileService.println(sb, "mVolumeStep: " + mVolumeStep);
ProfileService.println(sb, "mAudioStreamMax: " + mAudioStreamMax);
- ProfileService.println(sb, "mVolCmdInProgress: " + mVolCmdInProgress);
+ ProfileService.println(sb, "mVolCmdAdjustInProgress: " + mVolCmdAdjustInProgress);
+ ProfileService.println(sb, "mVolCmdSetInProgress: " + mVolCmdSetInProgress);
ProfileService.println(sb, "mAbsVolRetryTimes: " + mAbsVolRetryTimes);
ProfileService.println(sb, "mSkipAmount: " + mSkipAmount);
+ ProfileService.println(sb, "mVolumeMapping: " + mVolumeMapping.toString());
}
// Do not modify without updating the HAL bt_rc.h files.
diff --git a/src/com/android/bluetooth/avrcp/AvrcpControllerClasses.java b/src/com/android/bluetooth/avrcp/AvrcpControllerClasses.java
new file mode 100644
index 0000000..422bcfe
--- /dev/null
+++ b/src/com/android/bluetooth/avrcp/AvrcpControllerClasses.java
@@ -0,0 +1,500 @@
+/*
+ * Copyright (C) 2015 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.avrcp;
+
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothAvrcpPlayerSettings;
+import com.android.bluetooth.Utils;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.HashMap;
+import android.util.Log;
+import java.nio.charset.Charset;
+import java.nio.ByteBuffer;
+import android.media.session.PlaybackState;
+import android.media.MediaMetadata;
+/**
+ * Provides helper classes used by other AvrcpControllerClasses.
+ */
+class AvrcpUtils {
+
+ private static final String TAG = "AvrcpUtils";
+ /*
+ * First 2 apis are utility functions to converts values from AvrcpPlayerSettings defined
+ * in BluetoothAvrcpPlayerSettings to BT spec defined Id and Vals.
+ */
+ public static int mapAttribIdValtoAvrcpPlayerSetting( byte attribId, byte attribVal) {
+ if(AvrcpControllerConstants.VDBG) Log.d(TAG, "attribId: " + attribId + " attribVal: " + attribVal);
+ if (attribId == AvrcpControllerConstants.ATTRIB_EQUALIZER_STATUS) {
+ switch(attribVal) {
+ case AvrcpControllerConstants.EQUALIZER_STATUS_OFF:
+ return BluetoothAvrcpPlayerSettings.STATE_OFF;
+ case AvrcpControllerConstants.EQUALIZER_STATUS_ON:
+ return BluetoothAvrcpPlayerSettings.STATE_ON;
+ }
+ }
+ else if (attribId == AvrcpControllerConstants.ATTRIB_REPEAT_STATUS) {
+ switch(attribVal) {
+ case AvrcpControllerConstants.REPEAT_STATUS_ALL_TRACK_REPEAT:
+ return BluetoothAvrcpPlayerSettings.STATE_ALL_TRACK;
+ case AvrcpControllerConstants.REPEAT_STATUS_GROUP_REPEAT:
+ return BluetoothAvrcpPlayerSettings.STATE_GROUP;
+ case AvrcpControllerConstants.REPEAT_STATUS_OFF:
+ return BluetoothAvrcpPlayerSettings.STATE_OFF;
+ case AvrcpControllerConstants.REPEAT_STATUS_SINGLE_TRACK_REPEAT:
+ return BluetoothAvrcpPlayerSettings.STATE_SINGLE_TRACK;
+ }
+ }
+ else if (attribId == AvrcpControllerConstants.ATTRIB_SCAN_STATUS) {
+ switch(attribVal) {
+ case AvrcpControllerConstants.SCAN_STATUS_ALL_TRACK_SCAN:
+ return BluetoothAvrcpPlayerSettings.STATE_ALL_TRACK;
+ case AvrcpControllerConstants.SCAN_STATUS_GROUP_SCAN:
+ return BluetoothAvrcpPlayerSettings.STATE_GROUP;
+ case AvrcpControllerConstants.SCAN_STATUS_OFF:
+ return BluetoothAvrcpPlayerSettings.STATE_OFF;
+ }
+ }
+ else if (attribId == AvrcpControllerConstants.ATTRIB_SHUFFLE_STATUS) {
+ switch(attribVal) {
+ case AvrcpControllerConstants.SHUFFLE_STATUS_ALL_TRACK_SHUFFLE:
+ return BluetoothAvrcpPlayerSettings.STATE_ALL_TRACK;
+ case AvrcpControllerConstants.SHUFFLE_STATUS_GROUP_SHUFFLE:
+ return BluetoothAvrcpPlayerSettings.STATE_GROUP;
+ case AvrcpControllerConstants.SHUFFLE_STATUS_OFF:
+ return BluetoothAvrcpPlayerSettings.STATE_OFF;
+ }
+ }
+ return BluetoothAvrcpPlayerSettings.STATE_INVALID;
+ }
+ public static int mapAvrcpPlayerSettingstoBTAttribVal(int mSetting, int mSettingVal) {
+ if (mSetting == BluetoothAvrcpPlayerSettings.SETTING_EQUALIZER) {
+ switch(mSettingVal) {
+ case BluetoothAvrcpPlayerSettings.STATE_OFF:
+ return AvrcpControllerConstants.EQUALIZER_STATUS_OFF;
+ case BluetoothAvrcpPlayerSettings.STATE_ON:
+ return AvrcpControllerConstants.EQUALIZER_STATUS_ON;
+ }
+ }
+ else if (mSetting == BluetoothAvrcpPlayerSettings.SETTING_REPEAT) {
+ switch(mSettingVal) {
+ case BluetoothAvrcpPlayerSettings.STATE_OFF:
+ return AvrcpControllerConstants.REPEAT_STATUS_OFF;
+ case BluetoothAvrcpPlayerSettings.STATE_SINGLE_TRACK:
+ return AvrcpControllerConstants.REPEAT_STATUS_SINGLE_TRACK_REPEAT;
+ case BluetoothAvrcpPlayerSettings.STATE_ALL_TRACK:
+ return AvrcpControllerConstants.REPEAT_STATUS_ALL_TRACK_REPEAT;
+ case BluetoothAvrcpPlayerSettings.STATE_GROUP:
+ return AvrcpControllerConstants.REPEAT_STATUS_GROUP_REPEAT;
+ }
+ }
+ else if (mSetting == BluetoothAvrcpPlayerSettings.SETTING_SHUFFLE) {
+ switch(mSettingVal) {
+ case BluetoothAvrcpPlayerSettings.STATE_OFF:
+ return AvrcpControllerConstants.SHUFFLE_STATUS_OFF;
+ case BluetoothAvrcpPlayerSettings.STATE_ALL_TRACK:
+ return AvrcpControllerConstants.SHUFFLE_STATUS_ALL_TRACK_SHUFFLE;
+ case BluetoothAvrcpPlayerSettings.STATE_GROUP:
+ return AvrcpControllerConstants.SHUFFLE_STATUS_GROUP_SHUFFLE;
+ }
+ }
+ else if (mSetting == BluetoothAvrcpPlayerSettings.SETTING_SCAN) {
+ switch(mSettingVal) {
+ case BluetoothAvrcpPlayerSettings.STATE_OFF:
+ return AvrcpControllerConstants.SCAN_STATUS_OFF;
+ case BluetoothAvrcpPlayerSettings.STATE_ALL_TRACK:
+ return AvrcpControllerConstants.SCAN_STATUS_ALL_TRACK_SCAN;
+ case BluetoothAvrcpPlayerSettings.STATE_GROUP:
+ return AvrcpControllerConstants.SCAN_STATUS_GROUP_SCAN;
+ }
+ }
+ return AvrcpControllerConstants.STATUS_INVALID;
+ }
+ /*
+ * This api converts btPlayStatus to PlaybackState
+ */
+ public static PlaybackState mapBtPlayStatustoPlayBackState(byte btPlayStatus, long btPlayPos) {
+ int mState = PlaybackState.STATE_NONE;
+ long position = btPlayPos;
+ float speed = 1;
+ switch(btPlayStatus) {
+ case AvrcpControllerConstants.PLAY_STATUS_STOPPED:
+ mState = PlaybackState.STATE_STOPPED;
+ position = 0;
+ speed = 0;
+ break;
+ case AvrcpControllerConstants.PLAY_STATUS_PLAYING:
+ mState = PlaybackState.STATE_PLAYING;
+ break;
+ case AvrcpControllerConstants.PLAY_STATUS_PAUSED:
+ mState = PlaybackState.STATE_PAUSED;
+ speed = 0;
+ break;
+ case AvrcpControllerConstants.PLAY_STATUS_FWD_SEEK:
+ mState = PlaybackState.STATE_FAST_FORWARDING;
+ speed = 3;
+ break;
+ case AvrcpControllerConstants.PLAY_STATUS_REV_SEEK:
+ mState = PlaybackState.STATE_REWINDING;
+ speed = -3;
+ break;
+ }
+ return new PlaybackState.Builder().setState(mState, position, speed).build();
+ }
+ /*
+ * This api converts meta info into MediaMetaData
+ */
+ public static MediaMetadata getMediaMetaData(TrackInfo mTrackInfo) {
+ if(AvrcpControllerConstants.VDBG) Log.d(TAG, " TrackInfo " + mTrackInfo.toString());
+ MediaMetadata.Builder mMetaDataBuilder = new MediaMetadata.Builder();
+ mMetaDataBuilder.putString(MediaMetadata.METADATA_KEY_ARTIST,
+ mTrackInfo.mArtistName);
+ mMetaDataBuilder.putString(MediaMetadata.METADATA_KEY_TITLE,
+ mTrackInfo.mTrackTitle);
+ mMetaDataBuilder.putString(MediaMetadata.METADATA_KEY_ALBUM,
+ mTrackInfo.mAlbumTitle);
+ mMetaDataBuilder.putString(MediaMetadata.METADATA_KEY_GENRE,
+ mTrackInfo.mGenre);
+ mMetaDataBuilder.putLong(MediaMetadata.METADATA_KEY_TRACK_NUMBER,
+ mTrackInfo.mTrackNum);
+ mMetaDataBuilder.putLong(MediaMetadata.METADATA_KEY_NUM_TRACKS,
+ mTrackInfo.mTotalTracks);
+ mMetaDataBuilder.putLong(MediaMetadata.METADATA_KEY_DURATION,
+ mTrackInfo.mTrackLen);
+ mMetaDataBuilder.putString(MediaMetadata.METADATA_KEY_MEDIA_ID,
+ String.valueOf(mTrackInfo.mItemUid));
+ return mMetaDataBuilder.build();
+ }
+ /*
+ * Display Apis
+ */
+ public static String displayMetaData(MediaMetadata mMetaData) {
+ StringBuffer sb = new StringBuffer();
+ /* this will only show artist, title and album */
+ sb.append(mMetaData.getDescription().toString() + " ");
+ if(mMetaData.containsKey(MediaMetadata.METADATA_KEY_GENRE))
+ sb.append(mMetaData.getString(MediaMetadata.METADATA_KEY_GENRE) + " ");
+ if(mMetaData.containsKey(MediaMetadata.METADATA_KEY_MEDIA_ID))
+ sb.append(mMetaData.getString(MediaMetadata.METADATA_KEY_MEDIA_ID) + " ");
+ if(mMetaData.containsKey(MediaMetadata.METADATA_KEY_TRACK_NUMBER))
+ sb.append(Long.toString(mMetaData.getLong(MediaMetadata.METADATA_KEY_TRACK_NUMBER)) + " ");
+ if(mMetaData.containsKey(MediaMetadata.METADATA_KEY_NUM_TRACKS))
+ sb.append(Long.toString(mMetaData.getLong(MediaMetadata.METADATA_KEY_NUM_TRACKS)) + " ");
+ if(mMetaData.containsKey(MediaMetadata.METADATA_KEY_TRACK_NUMBER))
+ sb.append(Long.toString(mMetaData.getLong(MediaMetadata.METADATA_KEY_DURATION)) + " ");
+ if(mMetaData.containsKey(MediaMetadata.METADATA_KEY_TRACK_NUMBER))
+ sb.append(Long.toString(mMetaData.getLong(MediaMetadata.METADATA_KEY_DURATION)) + " ");
+ return sb.toString();
+ }
+ public static String displayBluetoothAvrcpSettings(BluetoothAvrcpPlayerSettings mSett) {
+ StringBuffer sb = new StringBuffer();
+ int supportedSetting = mSett.getSettings();
+ if(AvrcpControllerConstants.VDBG) Log.d(TAG," setting: " + supportedSetting);
+ if((supportedSetting & BluetoothAvrcpPlayerSettings.SETTING_EQUALIZER) != 0) {
+ sb.append(" EQ : ");
+ sb.append(Integer.toString(mSett.getSettingValue(BluetoothAvrcpPlayerSettings.
+ SETTING_EQUALIZER)));
+ }
+ if((supportedSetting & BluetoothAvrcpPlayerSettings.SETTING_REPEAT) != 0) {
+ sb.append(" REPEAT : ");
+ sb.append(Integer.toString(mSett.getSettingValue(BluetoothAvrcpPlayerSettings.
+ SETTING_REPEAT)));
+ }
+ if((supportedSetting & BluetoothAvrcpPlayerSettings.SETTING_SHUFFLE) != 0) {
+ sb.append(" SHUFFLE : ");
+ sb.append(Integer.toString(mSett.getSettingValue(BluetoothAvrcpPlayerSettings.
+ SETTING_SHUFFLE)));
+ }
+ if((supportedSetting & BluetoothAvrcpPlayerSettings.SETTING_SCAN) != 0) {
+ sb.append(" SCAN : ");
+ sb.append(Integer.toString(mSett.getSettingValue(BluetoothAvrcpPlayerSettings.
+ SETTING_SCAN)));
+ }
+ return sb.toString();
+ }
+}
+/*
+ * Contains information about remote device
+ */
+class RemoteDevice {
+ BluetoothDevice mBTDevice;
+ int mRemoteFeatures;
+ int mBatteryStatus;
+ int mSystemStatus;
+ int mAbsVolNotificationState;
+ int mNotificationLabel;
+ boolean mFirstAbsVolCmdRecvd;
+
+ public void cleanup() {
+ mBTDevice = null;
+ mRemoteFeatures = AvrcpControllerConstants.BTRC_FEAT_NONE;
+ mBatteryStatus = AvrcpControllerConstants.BATT_POWER_UNDEFINED;
+ mSystemStatus = AvrcpControllerConstants.SYSTEM_STATUS_UNDEFINED;
+ mAbsVolNotificationState = AvrcpControllerConstants.DEFER_VOLUME_CHANGE_RSP;
+ mNotificationLabel = AvrcpControllerConstants.VOLUME_LABEL_UNDEFINED;
+ mFirstAbsVolCmdRecvd = false;
+ }
+
+ public RemoteDevice(BluetoothDevice mDevice) {
+ mBTDevice = mDevice;
+ mRemoteFeatures = AvrcpControllerConstants.BTRC_FEAT_NONE;
+ mBatteryStatus = AvrcpControllerConstants.BATT_POWER_UNDEFINED;
+ mSystemStatus = AvrcpControllerConstants.SYSTEM_STATUS_UNDEFINED;
+ mAbsVolNotificationState = AvrcpControllerConstants.DEFER_VOLUME_CHANGE_RSP;
+ mNotificationLabel = AvrcpControllerConstants.VOLUME_LABEL_UNDEFINED;
+ mFirstAbsVolCmdRecvd = false;
+ }
+
+ public boolean isBrowsingSupported() {
+ if((mRemoteFeatures & AvrcpControllerConstants.BTRC_FEAT_BROWSE) != 0)
+ return true;
+ else
+ return false;
+ }
+ public boolean isMetaDataSupported() {
+ if((mRemoteFeatures & AvrcpControllerConstants.BTRC_FEAT_METADATA) != 0)
+ return true;
+ else
+ return false;
+ }
+}
+
+/*
+ * Base Class for Media Item
+ */
+class MediaItem {
+ /*
+ * This is a combination of locaiton and item. Spec Snippet
+ * In VFS if same item is in different location it may have same uid.
+ * In Now Playing same item should have differnt UID
+ * Can never be 0, used only for GetElementAttributes
+ * TODO: UID counter, which is used for database aware player
+ */
+ double mItemUid;
+}
+
+/*
+ * Contains information Player Application Setting
+ */
+class PlayerApplicationSettings {
+ public byte attr_Id;
+ public byte attr_val;
+ public byte [] supported_values;
+ public String attr_text;
+ public String [] supported_values_text;// This is to keep displayable text in UTF-8
+}
+/*
+ * Contains information about remote player
+ */
+class PlayerInfo {
+ private static final String TAG = "PlayerInfo";
+ byte mPlayStatus;
+ long mPlayTime;
+ /*
+ * 2 byte player id to identify player.
+ * In 1.3 this value will be set to zero
+ */
+ char mPlayerId;
+ ArrayList<PlayerApplicationSettings> mPlayerAppSetting;
+ private void resetPlayer() {
+ mPlayStatus = AvrcpControllerConstants.PLAY_STATUS_STOPPED;
+ mPlayTime = AvrcpControllerConstants.PLAYING_TIME_INVALID;
+ mPlayerId = 0;
+ mPlayerAppSetting = new ArrayList<PlayerApplicationSettings>();
+ }
+ public PlayerInfo() {
+ resetPlayer();
+ }
+ public void setSupportedPlayerAppSetting (ByteBuffer bb) {
+ /* ByteBuffer has to be of the following format
+ * id, num_values, values[]
+ */
+ while(bb.hasRemaining()) {
+ PlayerApplicationSettings plAppSetting = new PlayerApplicationSettings();
+ plAppSetting.attr_Id = bb.get();
+ byte numSupportedVals = bb.get();
+ plAppSetting.supported_values = new byte[numSupportedVals];
+ for (int i = 0; i<numSupportedVals; i++) {
+ plAppSetting.supported_values[i] = bb.get();
+ }
+ mPlayerAppSetting.add(plAppSetting);
+ }
+ }
+ public void updatePlayerAppSetting(ByteBuffer bb) {
+ /* ByteBuffer has to be of the following format
+ * <id, value>
+ */
+ if(mPlayerAppSetting.isEmpty())
+ return;
+ while(bb.hasRemaining()) {
+ byte attribId = bb.get();
+ for(PlayerApplicationSettings plAppSetting: mPlayerAppSetting) {
+ if(plAppSetting.attr_Id == attribId)
+ plAppSetting.attr_val = bb.get();
+ }
+ }
+ }
+
+ public BluetoothAvrcpPlayerSettings getSupportedPlayerAppSetting() {
+ /*
+ * Here we create PlayerAppSetting
+ * based on BluetoothAvrcpPlayerSettings
+ */
+ int supportedSettings = 0; // Player App Setting used by BluetoothAvrcpPlayerSettings.
+ for(PlayerApplicationSettings plAppSetting: mPlayerAppSetting) {
+ switch(plAppSetting.attr_Id) {
+ case AvrcpControllerConstants.ATTRIB_EQUALIZER_STATUS:
+ supportedSettings |= BluetoothAvrcpPlayerSettings.SETTING_EQUALIZER;
+ break;
+ case AvrcpControllerConstants.ATTRIB_REPEAT_STATUS:
+ supportedSettings |= BluetoothAvrcpPlayerSettings.SETTING_REPEAT;
+ break;
+ case AvrcpControllerConstants.ATTRIB_SCAN_STATUS:
+ supportedSettings |= BluetoothAvrcpPlayerSettings.SETTING_SCAN;
+ break;
+ case AvrcpControllerConstants.ATTRIB_SHUFFLE_STATUS:
+ supportedSettings |= BluetoothAvrcpPlayerSettings.SETTING_SHUFFLE;
+ break;
+ }
+ }
+ BluetoothAvrcpPlayerSettings mAvrcpPlayerAppSetting = new
+ BluetoothAvrcpPlayerSettings(supportedSettings);
+ for(PlayerApplicationSettings plAppSetting: mPlayerAppSetting) {
+ switch(plAppSetting.attr_Id) {
+ case AvrcpControllerConstants.ATTRIB_EQUALIZER_STATUS:
+ mAvrcpPlayerAppSetting.addSettingValue(BluetoothAvrcpPlayerSettings.SETTING_EQUALIZER,
+ AvrcpUtils.mapAttribIdValtoAvrcpPlayerSetting(plAppSetting.attr_Id,
+ plAppSetting.attr_val));
+ break;
+ case AvrcpControllerConstants.ATTRIB_REPEAT_STATUS:
+ mAvrcpPlayerAppSetting.addSettingValue(BluetoothAvrcpPlayerSettings.SETTING_REPEAT,
+ AvrcpUtils.mapAttribIdValtoAvrcpPlayerSetting(plAppSetting.attr_Id,
+ plAppSetting.attr_val));
+ break;
+ case AvrcpControllerConstants.ATTRIB_SCAN_STATUS:
+ mAvrcpPlayerAppSetting.addSettingValue(BluetoothAvrcpPlayerSettings.SETTING_SCAN,
+ AvrcpUtils.mapAttribIdValtoAvrcpPlayerSetting(plAppSetting.attr_Id,
+ plAppSetting.attr_val));
+ break;
+ case AvrcpControllerConstants.ATTRIB_SHUFFLE_STATUS:
+ mAvrcpPlayerAppSetting.addSettingValue(BluetoothAvrcpPlayerSettings.SETTING_SHUFFLE,
+ AvrcpUtils.mapAttribIdValtoAvrcpPlayerSetting(plAppSetting.attr_Id,
+ plAppSetting.attr_val));
+ break;
+ }
+ }
+ return mAvrcpPlayerAppSetting;
+ }
+ public byte getCurrentPlayerAppSettingValue(byte mPlayerAppAttrId) {
+ for(PlayerApplicationSettings plAppSetting: mPlayerAppSetting) {
+ if(mPlayerAppAttrId == plAppSetting.attr_Id)
+ return plAppSetting.attr_val;
+ }
+ return 0;
+ }
+ /*
+ * Checks if current setting is supported by remote.
+ * input would be in form of flattened strucuture <id,val>
+ */
+ public boolean isPlayerAppSettingSupported(byte numAttributes, byte[] playerAppSetting) {
+ for( int i = 0; (i < 2*numAttributes);) {
+ byte id = playerAppSetting[i++];
+ byte val = playerAppSetting[i++];
+ boolean found = false;
+ for(PlayerApplicationSettings plAppSetting: mPlayerAppSetting) {
+ if(plAppSetting.attr_Id == id) {
+ for(int j = 0; j < plAppSetting.supported_values.length; j++) {
+ if(val == plAppSetting.supported_values[j]) {
+ found = true;
+ break;
+ }
+ }
+ }
+ }
+ if(!found)
+ return false;
+ }
+ return true;
+ }
+}
+
+/*
+ * Contains information about track
+ */
+class TrackInfo extends MediaItem {
+ String mArtistName;
+ String mTrackTitle;
+ String mAlbumTitle;
+ String mGenre;
+ long mTrackNum; // number of audio file on original recording.
+ long mTotalTracks;// total number of tracks on original recording
+ long mTrackLen;// full length of AudioFile.
+ /* In case of 1.3 we have to set itemUid explicitly to 0 */
+
+ /* reset it to default values */
+ private void resetTrackInfo() {
+ mArtistName = AvrcpControllerConstants.ARTIST_NAME_INVALID;;
+ mTrackTitle = AvrcpControllerConstants.TITLE_INVALID;;
+ mAlbumTitle = AvrcpControllerConstants.ALBUM_NAME_INVALID;
+ mGenre = AvrcpControllerConstants.GENRE_INVALID;
+ mTrackNum = AvrcpControllerConstants.TRACK_NUM_INVALID;
+ mTotalTracks = AvrcpControllerConstants.TOTAL_TRACK_TIME_INVALID;
+ mTrackLen = AvrcpControllerConstants.TOTAL_TRACK_TIME_INVALID;
+ }
+ public TrackInfo() {
+ resetTrackInfo();
+ }
+ public TrackInfo(int mTrackId, byte mNumAttributes, int[] mAttribIds, String[] mAttribs) {
+ mItemUid = mTrackId;
+ resetTrackInfo();
+ for (int i = 0; i < mNumAttributes; i++) {
+ switch(mAttribIds[i]) {
+ case AvrcpControllerConstants.MEDIA_ATTRIBUTE_TITLE:
+ mTrackTitle = mAttribs[i];
+ break;
+ case AvrcpControllerConstants.MEDIA_ATTRIBUTE_ARTIST_NAME:
+ mArtistName = mAttribs[i];
+ break;
+ case AvrcpControllerConstants.MEDIA_ATTRIBUTE_ALBUM_NAME:
+ mAlbumTitle = mAttribs[i];
+ break;
+ case AvrcpControllerConstants.MEDIA_ATTRIBUTE_TRACK_NUMBER:
+ if(!mAttribs[i].isEmpty())
+ mTrackNum = Long.valueOf(mAttribs[i]);
+ break;
+ case AvrcpControllerConstants.MEDIA_ATTRIBUTE_TOTAL_TRACK_NUMBER:
+ if(!mAttribs[i].isEmpty())
+ mTotalTracks = Long.valueOf(mAttribs[i]);
+ break;
+ case AvrcpControllerConstants.MEDIA_ATTRIBUTE_GENRE:
+ mGenre = mAttribs[i];
+ break;
+ case AvrcpControllerConstants.MEDIA_ATTRIBUTE_PLAYING_TIME:
+ if(!mAttribs[i].isEmpty())
+ mTrackLen = Long.valueOf(mAttribs[i]);
+ break;
+ }
+ }
+ }
+ public String toString() {
+ return "Metadata [artist=" + mArtistName + " trackTitle= " + mTrackTitle +
+ " albumTitle= " + mAlbumTitle + " genre= " +mGenre+" trackNum= "+
+ Long.toString(mTrackNum) + " track_len : "+ Long.toString(mTrackLen) +
+ " TotalTracks " + Long.toString(mTotalTracks) + "]";
+ }
+}
diff --git a/src/com/android/bluetooth/avrcp/AvrcpControllerConstants.java b/src/com/android/bluetooth/avrcp/AvrcpControllerConstants.java
new file mode 100644
index 0000000..45dfd0a
--- /dev/null
+++ b/src/com/android/bluetooth/avrcp/AvrcpControllerConstants.java
@@ -0,0 +1,211 @@
+/*
+ * Copyright (C) 2015 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.avrcp;
+
+import android.util.Log;
+
+import com.android.bluetooth.Utils;
+
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * Provides helper classes used by other AvrcpControllerClasses.
+ * Don't change this file without changing HAL Constants in bt_rc.h
+ */
+
+final class AvrcpControllerConstants {
+
+ /*
+ * Debug flags
+ */
+ public static final boolean DBG = true;
+ public static final boolean VDBG = true;
+ /*
+ * Scopes of operation
+ */
+ public static final int AVRCP_SCOPE_NOW_PLAYING = 0;
+ public static final int AVRCP_SCOPE_VFS = 1;
+ /*
+ * Remote features
+ */
+ public static final byte BTRC_FEAT_NONE = 0;
+ public static final byte BTRC_FEAT_METADATA = 1;
+ public static final byte BTRC_FEAT_ABSOLUTE_VOLUME = 2;
+ public static final byte BTRC_FEAT_BROWSE = 4;
+
+ /*
+ *Element Id Values for GetMetaData
+ */
+ public static final int MEDIA_ATTRIBUTE_TITLE = 0x01;
+ public static final int MEDIA_ATTRIBUTE_ARTIST_NAME = 0x02;
+ public static final int MEDIA_ATTRIBUTE_ALBUM_NAME = 0x03;
+ public static final int MEDIA_ATTRIBUTE_TRACK_NUMBER = 0x04;
+ public static final int MEDIA_ATTRIBUTE_TOTAL_TRACK_NUMBER = 0x05;
+ public static final int MEDIA_ATTRIBUTE_GENRE = 0x06;
+ public static final int MEDIA_ATTRIBUTE_PLAYING_TIME = 0x07;
+
+ /*
+ * Default values for each of the items
+ */
+ public static final int TRACK_NUM_INVALID = 0xFF;
+ public static final int STATUS_INVALID = 0xFF;
+ public static final String TITLE_INVALID = "NOT_SUPPORTED";
+ public static final String ARTIST_NAME_INVALID = "NOT_SUPPORTED";
+ public static final String ALBUM_NAME_INVALID = "NOT_SUPPORTED";
+ public static final int TOTAL_TRACKS_INVALID = 0xFFFFFFFF;
+ public static final String GENRE_INVALID = "NOT_SUPPORTED";
+ public static final int PLAYING_TIME_INVALID = 0xFF;
+ public static final int TOTAL_TRACK_TIME_INVALID = 0xFF;
+ public static final String REPEAT_STATUS_INVALID = "NOT_SUPPORTED";
+ public static final String SHUFFLE_STATUS_INVALID = "NOT_SUPPORTED";
+ public static final String SCAN_STATUS_INVALID = "NOT_SUPPORTED";
+ public static final String EQUALIZER_STATUS_INVALID = "NOT_SUPPORTED";
+ public static final String BATTERY_STATUS_INVALID = "NOT_SUPPORTED";
+ public static final String SYSTEM_STATUS_INVALID = "NOT_SUPPORTED";
+
+ /*
+ * Values for SetPlayerApplicationSettings
+ */
+ public static final byte ATTRIB_EQUALIZER_STATUS = 0x01;
+ public static final byte ATTRIB_REPEAT_STATUS = 0x02;
+ public static final byte ATTRIB_SHUFFLE_STATUS = 0x03;
+ public static final byte ATTRIB_SCAN_STATUS = 0x04;
+
+ public static final byte EQUALIZER_STATUS_OFF = 0x01;
+ public static final byte EQUALIZER_STATUS_ON = 0x02;
+
+ public static final byte REPEAT_STATUS_OFF = 0x01;
+ public static final byte REPEAT_STATUS_SINGLE_TRACK_REPEAT = 0x02;
+ public static final byte REPEAT_STATUS_ALL_TRACK_REPEAT = 0x03;
+ public static final byte REPEAT_STATUS_GROUP_REPEAT = 0x04;
+
+ public static final byte SHUFFLE_STATUS_OFF = 0x01;
+ public static final byte SHUFFLE_STATUS_ALL_TRACK_SHUFFLE = 0x02;
+ public static final byte SHUFFLE_STATUS_GROUP_SHUFFLE = 0x03;
+
+ public static final byte SCAN_STATUS_OFF = 0x01;
+ public static final byte SCAN_STATUS_ALL_TRACK_SCAN = 0x02;
+ public static final byte SCAN_STATUS_GROUP_SCAN = 0x03;
+
+ /*
+ * Play State Values
+ */
+ public static final int PLAY_STATUS_STOPPED = 0x00;
+ public static final int PLAY_STATUS_PLAYING = 0x01;
+ public static final int PLAY_STATUS_PAUSED = 0x02;
+ public static final int PLAY_STATUS_FWD_SEEK = 0x03;
+ public static final int PLAY_STATUS_REV_SEEK = 0x04;
+ public static final int PLAY_STATUS_ERROR = 0xFF;
+ /*
+ * System Status
+ */
+ public static final int SYSTEM_POWER_ON = 0x00;
+ public static final int SYSTEM_POWER_OFF = 0x01;
+ public static final int SYSTEM_UNPLUGGED = 0x02;
+ public static final int SYSTEM_STATUS_UNDEFINED = 0xFF;
+ /*
+ * Battery Status
+ */
+ public static final int BATT_POWER_NORMAL = 0x00;
+ public static final int BATT_POWER_WARNING = 0x01;
+ public static final int BATT_POWER_CRITICAL = 0x02;
+ public static final int BATT_POWER_EXTERNAL = 0x03;
+ public static final int BATT_POWER_FULL_CHARGE = 0x04;
+ public static final int BATT_POWER_UNDEFINED = 0xFF;
+
+ public static final int NOTIFICATION_RSP_TYPE_INTERIM = 0x00;
+ public static final int NOTIFICATION_RSP_TYPE_CHANGED = 0x01;
+ /*
+ * Base value for absolute volume
+ */
+ static final int ABS_VOL_BASE = 127;
+
+ public static final int MESSAGE_SEND_PASS_THROUGH_CMD = 1;
+ public static final int MESSAGE_SEND_SET_CURRENT_PLAYER_APPLICATION_SETTINGS = 2;
+ public static final int MESSAGE_SEND_GROUP_NAVIGATION_CMD = 3;
+
+ public static final int MESSAGE_PROCESS_SUPPORTED_PLAYER_APP_SETTING = 101;
+ public static final int MESSAGE_PROCESS_PLAYER_APP_SETTING_CHANGED = 102;
+ public static final int MESSAGE_PROCESS_SET_ABS_VOL_CMD = 103;
+ public static final int MESSAGE_PROCESS_REGISTER_ABS_VOL_NOTIFICATION = 104;
+ public static final int MESSAGE_PROCESS_TRACK_CHANGED = 105;
+ public static final int MESSAGE_PROCESS_PLAY_POS_CHANGED = 106;
+ public static final int MESSAGE_PROCESS_PLAY_STATUS_CHANGED = 107;
+
+ public static final int MESSAGE_PROCESS_RC_FEATURES = 1100;
+ public static final int MESSAGE_PROCESS_CONNECTION_CHANGE = 1200;
+
+ public static String dumpMessageString(int message)
+ {
+ String str = "UNKNOWN";
+ switch(message)
+ {
+ case MESSAGE_SEND_PASS_THROUGH_CMD:
+ str = "REQ_PASS_THROUGH_CMD";
+ break;
+ case MESSAGE_SEND_SET_CURRENT_PLAYER_APPLICATION_SETTINGS:
+ str = "REQ_SET_PLAYER_APP_SETTING";
+ break;
+ case MESSAGE_SEND_GROUP_NAVIGATION_CMD:
+ str = "REQ_GRP_NAV_CMD";
+ break;
+ case MESSAGE_PROCESS_SUPPORTED_PLAYER_APP_SETTING:
+ str = "CB_SUPPORTED_PLAYER_APP_SETTING";
+ break;
+ case MESSAGE_PROCESS_PLAYER_APP_SETTING_CHANGED:
+ str = "CB_PLAYER_APP_SETTING_CHANGED";
+ break;
+ case MESSAGE_PROCESS_SET_ABS_VOL_CMD:
+ str = "CB_SET_ABS_VOL_CMD";
+ break;
+ case MESSAGE_PROCESS_REGISTER_ABS_VOL_NOTIFICATION:
+ str = "CB_REGISTER_ABS_VOL";
+ break;
+ case MESSAGE_PROCESS_TRACK_CHANGED:
+ str = "CB_TRACK_CHANGED";
+ break;
+ case MESSAGE_PROCESS_PLAY_POS_CHANGED:
+ str = "CB_PLAY_POS_CHANGED";
+ break;
+ case MESSAGE_PROCESS_PLAY_STATUS_CHANGED:
+ str = "CB_PLAY_STATUS_CHANGED";
+ break;
+ case MESSAGE_PROCESS_RC_FEATURES:
+ str = "CB_RC_FEATURES";
+ break;
+ case MESSAGE_PROCESS_CONNECTION_CHANGE:
+ str = "CB_CONN_CHANGED";
+ break;
+ default:
+ str = Integer.toString(message);
+ break;
+ }
+ return str;
+ }
+
+ /* Absolute Volume Notification State */
+ /* if we are in this state, we would send vol update to remote */
+ public static final int SEND_VOLUME_CHANGE_RSP = 0;
+ /* if we are in this state, we would not send vol update to remote */
+ public static final int DEFER_VOLUME_CHANGE_RSP = 1;
+ public static final int VOLUME_LABEL_UNDEFINED = 0xFF;
+}
diff --git a/src/com/android/bluetooth/avrcp/AvrcpControllerService.java b/src/com/android/bluetooth/avrcp/AvrcpControllerService.java
index ed426ec..d18cfc2 100644
--- a/src/com/android/bluetooth/avrcp/AvrcpControllerService.java
+++ b/src/com/android/bluetooth/avrcp/AvrcpControllerService.java
@@ -18,35 +18,51 @@
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothAvrcpController;
+import android.bluetooth.BluetoothAvrcpPlayerSettings;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothProfile;
import android.bluetooth.IBluetoothAvrcpController;
+import android.content.BroadcastReceiver;
+import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
+import android.media.MediaMetadata;
+import android.media.session.PlaybackState;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
-
+import android.media.AudioManager;
+import com.android.bluetooth.a2dp.A2dpSinkService;
import com.android.bluetooth.btservice.ProfileService;
import com.android.bluetooth.Utils;
-
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import java.util.HashMap;
-
+import java.nio.charset.Charset;
+import java.nio.ByteBuffer;
/**
* Provides Bluetooth AVRCP Controller profile, as a service in the Bluetooth application.
* @hide
*/
public class AvrcpControllerService extends ProfileService {
- private static final boolean DBG = false;
+ private static final boolean DBG = AvrcpControllerConstants.DBG;
+ private static final boolean VDBG = AvrcpControllerConstants.VDBG;
private static final String TAG = "AvrcpControllerService";
- private static final int MESSAGE_SEND_PASS_THROUGH_CMD = 1;
+/*
+ * Messages handled by mHandler
+ */
+
+ RemoteDevice mAvrcpRemoteDevice;
+ RemoteMediaPlayers mRemoteMediaPlayers;
+ NowPlaying mRemoteNowPlayingList;
private AvrcpMessageHandler mHandler;
private static AvrcpControllerService sAvrcpControllerService;
+ private static AudioManager mAudioManager;
private final ArrayList<BluetoothDevice> mConnectedDevices
= new ArrayList<BluetoothDevice>();
@@ -74,10 +90,40 @@
mHandler = new AvrcpMessageHandler(looper);
setAvrcpControllerService(this);
+ mAudioManager = (AudioManager)sAvrcpControllerService.
+ getSystemService(Context.AUDIO_SERVICE);
return true;
}
+ protected void resetRemoteData() {
+ try {
+ unregisterReceiver(mBroadcastReceiver);
+ }
+ catch (IllegalArgumentException e) {
+ Log.e(TAG,"Receiver not registered");
+ }
+ if(mAvrcpRemoteDevice != null) {
+ mAvrcpRemoteDevice.cleanup();
+ mAvrcpRemoteDevice = null;
+ }
+ if(mRemoteMediaPlayers != null) {
+ mRemoteMediaPlayers.cleanup();
+ mRemoteMediaPlayers = null;
+ }
+ if(mRemoteNowPlayingList != null) {
+ mRemoteNowPlayingList.cleanup();
+ mRemoteNowPlayingList = null;
+ }
+ }
protected boolean stop() {
+ if (mHandler != null) {
+ mHandler.removeCallbacksAndMessages(null);
+ Looper looper = mHandler.getLooper();
+ if (looper != null) {
+ looper.quit();
+ }
+ }
+ resetRemoteData();
return true;
}
@@ -87,7 +133,7 @@
Looper looper = mHandler.getLooper();
if (looper != null) looper.quit();
}
-
+ resetRemoteData();
clearAvrcpControllerService();
cleanupNative();
@@ -152,18 +198,177 @@
: BluetoothProfile.STATE_DISCONNECTED);
}
- public void sendPassThroughCmd(BluetoothDevice device, int keyCode, int keyState) {
- if (DBG) Log.d(TAG, "sendPassThroughCmd");
- Log.v(TAG, "keyCode: " + keyCode + " keyState: " + keyState);
+ public void sendGroupNavigationCmd(BluetoothDevice device, int keyCode, int keyState) {
+ Log.v(TAG, "sendGroupNavigationCmd keyCode: " + keyCode + " keyState: " + keyState);
if (device == null) {
throw new NullPointerException("device == null");
}
+ if (!(mConnectedDevices.contains(device))) {
+ for (BluetoothDevice cdevice : mConnectedDevices) {
+ Log.e(TAG, "Device: " + cdevice);
+ }
+ Log.e(TAG," Device does not match " + device);
+ return;
+ }
enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
- Message msg = mHandler.obtainMessage(MESSAGE_SEND_PASS_THROUGH_CMD,
- keyCode, keyState, device);
+ Message msg = mHandler.obtainMessage(AvrcpControllerConstants.
+ MESSAGE_SEND_GROUP_NAVIGATION_CMD,keyCode, keyState, device);
mHandler.sendMessage(msg);
}
+ public void sendPassThroughCmd(BluetoothDevice device, int keyCode, int keyState) {
+ Log.v(TAG, "sendPassThroughCmd keyCode: " + keyCode + " keyState: " + keyState);
+ if (device == null) {
+ throw new NullPointerException("device == null");
+ }
+ if (!(mConnectedDevices.contains(device))) {
+ Log.d(TAG," Device does not match");
+ return;
+ }
+ if ((mAvrcpRemoteDevice == null)||
+ (mAvrcpRemoteDevice.mRemoteFeatures == AvrcpControllerConstants.BTRC_FEAT_NONE)||
+ (mRemoteMediaPlayers == null) ||
+ (mRemoteMediaPlayers.getAddressedPlayer() == null)){
+ Log.d(TAG," Device connected but PlayState not present ");
+ enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
+ Message msg = mHandler.obtainMessage(AvrcpControllerConstants.MESSAGE_SEND_PASS_THROUGH_CMD,
+ keyCode, keyState, device);
+ mHandler.sendMessage(msg);
+ return;
+ }
+ boolean sendCommand = false;
+ switch(keyCode) {
+ case BluetoothAvrcpController.PASS_THRU_CMD_ID_PLAY:
+ sendCommand = (mRemoteMediaPlayers.getPlayStatus() ==
+ AvrcpControllerConstants.PLAY_STATUS_STOPPED)||
+ (mRemoteMediaPlayers.getPlayStatus() ==
+ AvrcpControllerConstants.PLAY_STATUS_PAUSED) ||
+ (mRemoteMediaPlayers.getPlayStatus() ==
+ AvrcpControllerConstants.PLAY_STATUS_PLAYING);
+ break;
+ case BluetoothAvrcpController.PASS_THRU_CMD_ID_PAUSE:
+ /*
+ * allowing pause command in pause state to handle A2DP Sink Concurrency
+ * If call is ongoing and Start is initiated from remote, we will send pause again
+ * If acquireFocus fails, we will send Pause again
+ * To Stop sending multiple Pause, check in application.
+ */
+ sendCommand = (mRemoteMediaPlayers.getPlayStatus() ==
+ AvrcpControllerConstants.PLAY_STATUS_PLAYING)||
+ (mRemoteMediaPlayers.getPlayStatus() ==
+ AvrcpControllerConstants.PLAY_STATUS_FWD_SEEK)||
+ (mRemoteMediaPlayers.getPlayStatus() ==
+ AvrcpControllerConstants.PLAY_STATUS_STOPPED)||
+ (mRemoteMediaPlayers.getPlayStatus() ==
+ AvrcpControllerConstants.PLAY_STATUS_PAUSED)||
+ (mRemoteMediaPlayers.getPlayStatus() ==
+ AvrcpControllerConstants.PLAY_STATUS_REV_SEEK);
+ break;
+ case BluetoothAvrcpController.PASS_THRU_CMD_ID_STOP:
+ sendCommand = (mRemoteMediaPlayers.getPlayStatus() ==
+ AvrcpControllerConstants.PLAY_STATUS_PLAYING)||
+ (mRemoteMediaPlayers.getPlayStatus() ==
+ AvrcpControllerConstants.PLAY_STATUS_FWD_SEEK)||
+ (mRemoteMediaPlayers.getPlayStatus() ==
+ AvrcpControllerConstants.PLAY_STATUS_REV_SEEK)||
+ (mRemoteMediaPlayers.getPlayStatus() ==
+ AvrcpControllerConstants.PLAY_STATUS_STOPPED)||
+ (mRemoteMediaPlayers.getPlayStatus() ==
+ AvrcpControllerConstants.PLAY_STATUS_PAUSED);
+ break;
+ case BluetoothAvrcpController.PASS_THRU_CMD_ID_BACKWARD:
+ case BluetoothAvrcpController.PASS_THRU_CMD_ID_FORWARD:
+ case BluetoothAvrcpController.PASS_THRU_CMD_ID_FF:
+ case BluetoothAvrcpController.PASS_THRU_CMD_ID_REWIND:
+ sendCommand = true; // we can send this command in all states
+ break;
+ }
+ if (sendCommand) {
+ enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
+ Message msg = mHandler.obtainMessage(AvrcpControllerConstants.MESSAGE_SEND_PASS_THROUGH_CMD,
+ keyCode, keyState, device);
+ mHandler.sendMessage(msg);
+ }
+ else {
+ Log.e(TAG," Not in right state, don't send Pass Thru cmd ");
+ }
+ }
+
+ public MediaMetadata getMetaData(BluetoothDevice device) {
+ Log.d(TAG, "getMetaData = ");
+ enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
+ if((mRemoteNowPlayingList != null) && (mRemoteNowPlayingList.getCurrentTrack() != null)) {
+ return getCurrentMetaData(AvrcpControllerConstants.AVRCP_SCOPE_NOW_PLAYING, 0);
+ }
+ else
+ return null;
+ }
+ public PlaybackState getPlaybackState(BluetoothDevice device) {
+ if (DBG) Log.d(TAG, "getPlayBackState device = "+ device);
+ enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
+ return getCurrentPlayBackState();
+ }
+ public BluetoothAvrcpPlayerSettings getPlayerSettings(BluetoothDevice device) {
+ if (DBG) Log.d(TAG, "getPlayerApplicationSetting ");
+ enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
+ return getCurrentPlayerAppSetting();
+ }
+ public boolean setPlayerApplicationSetting(BluetoothAvrcpPlayerSettings plAppSetting) {
+ if ((mAvrcpRemoteDevice == null)||(mRemoteMediaPlayers == null)) {
+ return false;
+ }
+ enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
+ /*
+ * We have to extract values from BluetoothAvrcpPlayerSettings
+ */
+ int mSettings = plAppSetting.getSettings();
+ int numAttributes = 0;
+ /* calculate number of attributes in request */
+ while(mSettings > 0) {
+ numAttributes += ((mSettings & 0x01)!= 0)?1: 0;
+ mSettings = mSettings >> 1;
+ }
+ byte[] attribArray = new byte [2*numAttributes];
+ mSettings = plAppSetting.getSettings();
+ /*
+ * Now we will flatten it <id, val>
+ */
+ int i = 0;
+ if((mSettings & BluetoothAvrcpPlayerSettings.SETTING_EQUALIZER) != 0) {
+ attribArray[i++] = AvrcpControllerConstants.ATTRIB_EQUALIZER_STATUS;
+ attribArray[i++] = (byte)AvrcpUtils.mapAvrcpPlayerSettingstoBTAttribVal(
+ BluetoothAvrcpPlayerSettings.SETTING_EQUALIZER, plAppSetting.
+ getSettingValue(BluetoothAvrcpPlayerSettings.SETTING_EQUALIZER));
+ }
+ if((mSettings & BluetoothAvrcpPlayerSettings.SETTING_REPEAT) != 0) {
+ attribArray[i++] = AvrcpControllerConstants.ATTRIB_REPEAT_STATUS;
+ attribArray[i++] = (byte)AvrcpUtils.mapAvrcpPlayerSettingstoBTAttribVal(
+ BluetoothAvrcpPlayerSettings.SETTING_REPEAT, plAppSetting.
+ getSettingValue(BluetoothAvrcpPlayerSettings.SETTING_REPEAT));
+ }
+ if((mSettings & BluetoothAvrcpPlayerSettings.SETTING_SHUFFLE) != 0) {
+ attribArray[i++] = AvrcpControllerConstants.ATTRIB_SHUFFLE_STATUS;
+ attribArray[i++] = (byte)AvrcpUtils.mapAvrcpPlayerSettingstoBTAttribVal(
+ BluetoothAvrcpPlayerSettings.SETTING_SHUFFLE, plAppSetting.
+ getSettingValue(BluetoothAvrcpPlayerSettings.SETTING_SHUFFLE));
+ }
+ if((mSettings & BluetoothAvrcpPlayerSettings.SETTING_SCAN) != 0) {
+ attribArray[i++] = AvrcpControllerConstants.ATTRIB_SCAN_STATUS;
+ attribArray[i++] = (byte)AvrcpUtils.mapAvrcpPlayerSettingstoBTAttribVal(
+ BluetoothAvrcpPlayerSettings.SETTING_SCAN, plAppSetting.
+ getSettingValue(BluetoothAvrcpPlayerSettings.SETTING_SCAN));
+ }
+ boolean isSettingSupported = mRemoteMediaPlayers.getAddressedPlayer().
+ isPlayerAppSettingSupported((byte)numAttributes, attribArray);
+ if(isSettingSupported) {
+ ByteBuffer bb = ByteBuffer.wrap(attribArray, 0, (2*numAttributes));
+ Message msg = mHandler.obtainMessage(AvrcpControllerConstants.
+ MESSAGE_SEND_SET_CURRENT_PLAYER_APPLICATION_SETTINGS, numAttributes, 0, bb);
+ mHandler.sendMessage(msg);
+ }
+ return isSettingSupported;
+ }
+
//Binder object: Must be static class or memory leak may occur
private static class BluetoothAvrcpControllerBinder extends IBluetoothAvrcpController.Stub
implements IProfileServiceBinder {
@@ -214,8 +419,107 @@
if (service == null) return;
service.sendPassThroughCmd(device, keyCode, keyState);
}
+
+ @Override
+ public void sendGroupNavigationCmd(BluetoothDevice device, int keyCode, int keyState) {
+ Log.v(TAG,"Binder Call: sendGroupNavigationCmd");
+ AvrcpControllerService service = getService();
+ if (service == null) return;
+ service.sendGroupNavigationCmd(device, keyCode, keyState);
+ }
+
+ @Override
+ public BluetoothAvrcpPlayerSettings getPlayerSettings(BluetoothDevice device) {
+ Log.v(TAG,"Binder Call: getPlayerApplicationSetting ");
+ AvrcpControllerService service = getService();
+ if (service == null) return null;
+ return service.getPlayerSettings(device);
+ }
+
+ @Override
+ public MediaMetadata getMetadata(BluetoothDevice device) {
+ Log.v(TAG,"Binder Call: getMetaData ");
+ AvrcpControllerService service = getService();
+ if (service == null) return null;
+ return service.getMetaData(device);
+ }
+
+ @Override
+ public PlaybackState getPlaybackState(BluetoothDevice device) {
+ Log.v(TAG,"Binder Call: getPlaybackState");
+ AvrcpControllerService service = getService();
+ if (service == null) return null;
+ return service.getPlaybackState(device);
+ }
+
+ @Override
+ public boolean setPlayerApplicationSetting(BluetoothAvrcpPlayerSettings plAppSetting) {
+ Log.v(TAG,"Binder Call: setPlayerApplicationSetting " );
+ AvrcpControllerService service = getService();
+ if (service == null) return false;
+ return service.setPlayerApplicationSetting(plAppSetting);
+ }
};
+ private String utf8ToString(byte[] input)
+ {
+ Charset UTF8_CHARSET = Charset.forName("UTF-8");
+ return new String(input,UTF8_CHARSET);
+ }
+ private int asciiToInt(int len, byte[] array)
+ {
+ return Integer.parseInt(utf8ToString(array));
+ }
+ private BluetoothAvrcpPlayerSettings getCurrentPlayerAppSetting() {
+ if((mRemoteMediaPlayers == null) || (mRemoteMediaPlayers.getAddressedPlayer() == null))
+ return null;
+ return mRemoteMediaPlayers.getAddressedPlayer().getSupportedPlayerAppSetting();
+ }
+ private PlaybackState getCurrentPlayBackState() {
+ if ((mRemoteMediaPlayers == null) || (mRemoteMediaPlayers.getAddressedPlayer() == null)) {
+ return new PlaybackState.Builder().setState(PlaybackState.STATE_ERROR,
+ PlaybackState.PLAYBACK_POSITION_UNKNOWN,
+ 0).build();
+ }
+ return AvrcpUtils.mapBtPlayStatustoPlayBackState(
+ mRemoteMediaPlayers.getAddressedPlayer().mPlayStatus,
+ mRemoteMediaPlayers.getAddressedPlayer().mPlayTime);
+ }
+ private MediaMetadata getCurrentMetaData(int scope, int trackId) {
+ /* if scope is now playing */
+ if(scope == AvrcpControllerConstants.AVRCP_SCOPE_NOW_PLAYING) {
+ if((mRemoteNowPlayingList == null) || (mRemoteNowPlayingList.
+ getTrackFromId(trackId) == null))
+ return null;
+ TrackInfo mNowPlayingTrack = mRemoteNowPlayingList.getTrackFromId(trackId);
+ return AvrcpUtils.getMediaMetaData(mNowPlayingTrack);
+ }
+ /* if scope is now playing */
+ else if(scope == AvrcpControllerConstants.AVRCP_SCOPE_VFS) {
+ /* TODO for browsing */
+ }
+ return null;
+ }
+ private void broadcastMetaDataChanged(MediaMetadata mMetaData) {
+ Intent intent = new Intent(BluetoothAvrcpController.ACTION_TRACK_EVENT);
+ intent.putExtra(BluetoothAvrcpController.EXTRA_METADATA, mMetaData);
+ if(DBG) Log.d(TAG," broadcastMetaDataChanged = " +
+ AvrcpUtils.displayMetaData(mMetaData));
+ sendBroadcast(intent, ProfileService.BLUETOOTH_PERM);
+ }
+ private void broadcastPlayBackStateChanged(PlaybackState mState) {
+ Intent intent = new Intent(BluetoothAvrcpController.ACTION_TRACK_EVENT);
+ intent.putExtra(BluetoothAvrcpController.EXTRA_PLAYBACK, mState);
+ if(DBG) Log.d(TAG," broadcastPlayBackStateChanged = " + mState.toString());
+ sendBroadcast(intent, ProfileService.BLUETOOTH_PERM);
+ }
+ private void broadcastPlayerAppSettingChanged(BluetoothAvrcpPlayerSettings mPlAppSetting) {
+ Intent intent = new Intent(BluetoothAvrcpController.ACTION_PLAYER_SETTING);
+ intent.putExtra(BluetoothAvrcpController.EXTRA_PLAYER_SETTING, mPlAppSetting);
+ if(DBG) Log.d(TAG," broadcastPlayerAppSettingChanged = " +
+ AvrcpUtils.displayBluetoothAvrcpSettings(mPlAppSetting));
+ sendBroadcast(intent, ProfileService.BLUETOOTH_PERM);
+ }
/** Handles Avrcp messages. */
private final class AvrcpMessageHandler extends Handler {
private AvrcpMessageHandler(Looper looper) {
@@ -224,39 +528,365 @@
@Override
public void handleMessage(Message msg) {
+ Log.d(TAG," HandleMessage: "+ AvrcpControllerConstants.dumpMessageString(msg.what) +
+ " Remote Connected " + !mConnectedDevices.isEmpty());
switch (msg.what) {
- case MESSAGE_SEND_PASS_THROUGH_CMD:
- if (DBG) Log.v(TAG, "MESSAGE_SEND_PASS_THROUGH_CMD");
+ case AvrcpControllerConstants.MESSAGE_SEND_PASS_THROUGH_CMD:
BluetoothDevice device = (BluetoothDevice)msg.obj;
sendPassThroughCommandNative(getByteAddress(device), msg.arg1, msg.arg2);
+ A2dpSinkService a2dpSnkService = A2dpSinkService.getA2dpSinkService();
+ if((a2dpSnkService != null)&&(!mConnectedDevices.isEmpty())) {
+ Log.d(TAG," inform AVRCP Commands to A2DP Sink ");
+ a2dpSnkService.informAvrcpPassThroughCmd(device,
+ msg.arg1, msg.arg2);
+ }
+ break;
+ case AvrcpControllerConstants.MESSAGE_SEND_GROUP_NAVIGATION_CMD:
+ BluetoothDevice peerDevice = (BluetoothDevice)msg.obj;
+ sendGroupNavigationCommandNative(getByteAddress(peerDevice), msg.arg1, msg.arg2);
+ break;
+ case AvrcpControllerConstants.MESSAGE_SEND_SET_CURRENT_PLAYER_APPLICATION_SETTINGS:
+ byte numAttributes = (byte)msg.arg1;
+ ByteBuffer bbRsp = (ByteBuffer)msg.obj;
+ byte[] attributeIds = new byte [numAttributes];
+ byte[] attributeVals = new byte [numAttributes];
+ for(int i = 0; (bbRsp.hasRemaining())&&(i < numAttributes); i++) {
+ attributeIds[i] = bbRsp.get();
+ attributeVals[i] = bbRsp.get();
+ }
+ setPlayerApplicationSettingValuesNative(getByteAddress(mAvrcpRemoteDevice.mBTDevice),
+ numAttributes, attributeIds, attributeVals);
+ break;
+
+ case AvrcpControllerConstants.MESSAGE_PROCESS_CONNECTION_CHANGE:
+ int newState = msg.arg1;
+ int oldState = msg.arg2;
+ BluetoothDevice rtDevice = (BluetoothDevice)msg.obj;
+ if ((newState == BluetoothProfile.STATE_CONNECTED) &&
+ (oldState == BluetoothProfile.STATE_DISCONNECTED)) {
+ /* We create RemoteDevice and MediaPlayerList here
+ * Now playing list after RC features
+ */
+ if(mAvrcpRemoteDevice == null){
+ mAvrcpRemoteDevice = new RemoteDevice(rtDevice);
+ /* Remote will have a player irrespective of AVRCP Version
+ * Create a Default player, we will add entries in case Browsing
+ * is supported by remote
+ */
+ if(mRemoteMediaPlayers == null) {
+ mRemoteMediaPlayers = new RemoteMediaPlayers(mAvrcpRemoteDevice);
+ PlayerInfo mPlayer = new PlayerInfo();
+ mPlayer.mPlayerId = 0;
+ mRemoteMediaPlayers.addPlayer(mPlayer);
+ mRemoteMediaPlayers.setAddressedPlayer(mPlayer);
+ }
+ }
+ }
+ else if ((newState == BluetoothProfile.STATE_DISCONNECTED) &&
+ (oldState == BluetoothProfile.STATE_CONNECTED)) /* connection down */
+ {
+ resetRemoteData();
+ mHandler.removeCallbacksAndMessages(null);
+ }
+ /*
+ * Send intent now
+ */
+ Intent intent = new Intent(BluetoothAvrcpController.ACTION_CONNECTION_STATE_CHANGED);
+ intent.putExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, oldState);
+ intent.putExtra(BluetoothProfile.EXTRA_STATE, newState);
+ intent.putExtra(BluetoothDevice.EXTRA_DEVICE, rtDevice);
+// intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
+ sendBroadcast(intent, ProfileService.BLUETOOTH_PERM);
+ break;
+ case AvrcpControllerConstants.MESSAGE_PROCESS_RC_FEATURES:
+ if(mAvrcpRemoteDevice == null)
+ break;
+ mAvrcpRemoteDevice.mRemoteFeatures = msg.arg1;
+ /* in case of AVRCP version < 1.3, no need to add track info */
+ if(mAvrcpRemoteDevice.isMetaDataSupported()) {
+ if(mRemoteNowPlayingList == null)
+ mRemoteNowPlayingList = new NowPlaying(mAvrcpRemoteDevice);
+ TrackInfo mTrack = new TrackInfo();
+ /* First element of NowPlayingList will be current Track
+ * for 1.3 this will be the only song
+ * for >= 1.4, others songs will have non-zero UID
+ */
+ mTrack.mItemUid = 0;
+ mRemoteNowPlayingList.addTrack(mTrack);
+ mRemoteNowPlayingList.setCurrTrack(mTrack);
+ }
+ break;
+ case AvrcpControllerConstants.MESSAGE_PROCESS_SET_ABS_VOL_CMD:
+ mAvrcpRemoteDevice.mAbsVolNotificationState =
+ AvrcpControllerConstants.DEFER_VOLUME_CHANGE_RSP;
+ setAbsVolume(msg.arg1, msg.arg2);
+ break;
+ case AvrcpControllerConstants.MESSAGE_PROCESS_REGISTER_ABS_VOL_NOTIFICATION:
+ /* start BroadcastReceiver now */
+ IntentFilter filter = new IntentFilter(AudioManager.VOLUME_CHANGED_ACTION);
+ mAvrcpRemoteDevice.mNotificationLabel = msg.arg1;
+ mAvrcpRemoteDevice.mAbsVolNotificationState =
+ AvrcpControllerConstants.SEND_VOLUME_CHANGE_RSP;
+ registerReceiver(mBroadcastReceiver, filter);
+ int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
+ int currIndex = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
+ int percentageVol = ((currIndex* AvrcpControllerConstants.ABS_VOL_BASE)/maxVolume);
+ Log.d(TAG," Sending Interim Response = "+ percentageVol + " label " + msg.arg1);
+ sendRegisterAbsVolRspNative(getByteAddress(mAvrcpRemoteDevice.mBTDevice),
+ (byte)AvrcpControllerConstants.NOTIFICATION_RSP_TYPE_INTERIM, percentageVol,
+ mAvrcpRemoteDevice.mNotificationLabel);
+ break;
+ case AvrcpControllerConstants.MESSAGE_PROCESS_TRACK_CHANGED:
+ if(mRemoteNowPlayingList != null) {
+ mRemoteNowPlayingList.updateCurrentTrack((TrackInfo)msg.obj);
+ broadcastMetaDataChanged(AvrcpUtils.getMediaMetaData
+ (mRemoteNowPlayingList.getCurrentTrack()));
+ }
+ break;
+ case AvrcpControllerConstants.MESSAGE_PROCESS_PLAY_POS_CHANGED:
+ if(mRemoteMediaPlayers != null) {
+ mRemoteMediaPlayers.getAddressedPlayer().mPlayTime = msg.arg2;
+ broadcastPlayBackStateChanged(AvrcpUtils.mapBtPlayStatustoPlayBackState
+ (mRemoteMediaPlayers.getAddressedPlayer().mPlayStatus,
+ mRemoteMediaPlayers.getAddressedPlayer().mPlayTime));
+ }
+ if(mRemoteNowPlayingList != null) {
+ mRemoteNowPlayingList.getCurrentTrack().mTrackLen = msg.arg1;
+ }
+ break;
+ case AvrcpControllerConstants.MESSAGE_PROCESS_PLAY_STATUS_CHANGED:
+ if(mRemoteMediaPlayers != null) {
+ mRemoteMediaPlayers.getAddressedPlayer().mPlayStatus = (byte)msg.arg1;
+ broadcastPlayBackStateChanged(AvrcpUtils.mapBtPlayStatustoPlayBackState
+ (mRemoteMediaPlayers.getAddressedPlayer().mPlayStatus,
+ mRemoteMediaPlayers.getAddressedPlayer().mPlayTime));
+ if(mRemoteMediaPlayers.getPlayStatus() == AvrcpControllerConstants.
+ PLAY_STATUS_PLAYING) {
+ A2dpSinkService a2dpSinkService = A2dpSinkService.getA2dpSinkService();
+ if((a2dpSinkService != null)&&(!mConnectedDevices.isEmpty())) {
+ Log.d(TAG," State = PLAYING, inform A2DP SINK");
+ a2dpSinkService.informAvrcpStatePlaying(mConnectedDevices.get(0));
+ }
+ }
+ }
+ break;
+ case AvrcpControllerConstants.MESSAGE_PROCESS_SUPPORTED_PLAYER_APP_SETTING:
+ if(mRemoteMediaPlayers != null)
+ mRemoteMediaPlayers.getAddressedPlayer().
+ setSupportedPlayerAppSetting((ByteBuffer)msg.obj);
+ break;
+ case AvrcpControllerConstants.MESSAGE_PROCESS_PLAYER_APP_SETTING_CHANGED:
+ if(mRemoteMediaPlayers != null) {
+ mRemoteMediaPlayers.getAddressedPlayer().
+ updatePlayerAppSetting((ByteBuffer)msg.obj);
+ broadcastPlayerAppSettingChanged(getCurrentPlayerAppSetting());
+ }
break;
}
}
}
+ private void setAbsVolume(int absVol, int label)
+ {
+ int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
+ int currIndex = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
+ if (mAvrcpRemoteDevice.mFirstAbsVolCmdRecvd) {
+ int newIndex = (maxVolume*absVol)/AvrcpControllerConstants.ABS_VOL_BASE;
+ Log.d(TAG," setAbsVolume ="+absVol + " maxVol = " + maxVolume + " cur = " + currIndex +
+ " new = "+newIndex);
+ /*
+ * In some cases change in percentage is not sufficient enough to warrant
+ * change in index values which are in range of 0-15. For such cases
+ * no action is required
+ */
+ if (newIndex != currIndex) {
+ mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, newIndex,
+ AudioManager.FLAG_SHOW_UI);
+ }
+ }
+ else {
+ mAvrcpRemoteDevice.mFirstAbsVolCmdRecvd = true;
+ absVol = (currIndex*AvrcpControllerConstants.ABS_VOL_BASE)/maxVolume;
+ Log.d(TAG," SetAbsVol recvd for first time, respond with " + absVol);
+ }
+ sendAbsVolRspNative(getByteAddress(mAvrcpRemoteDevice.mBTDevice), absVol, label);
+ }
+
+ private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (action.equals(AudioManager.VOLUME_CHANGED_ACTION)) {
+ int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1);
+ if (streamType == AudioManager.STREAM_MUSIC) {
+ int streamValue = intent
+ .getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, -1);
+ int streamPrevValue = intent.getIntExtra(
+ AudioManager.EXTRA_PREV_VOLUME_STREAM_VALUE, -1);
+ if (streamValue != -1 && streamValue != streamPrevValue) {
+ if ((mAvrcpRemoteDevice == null)
+ ||((mAvrcpRemoteDevice.mRemoteFeatures &
+ AvrcpControllerConstants.BTRC_FEAT_ABSOLUTE_VOLUME) == 0)
+ ||(mConnectedDevices.isEmpty()))
+ return;
+ if(mAvrcpRemoteDevice.mAbsVolNotificationState ==
+ AvrcpControllerConstants.SEND_VOLUME_CHANGE_RSP) {
+ int maxVol = mAudioManager.
+ getStreamMaxVolume(AudioManager.STREAM_MUSIC);
+ int currIndex = mAudioManager.
+ getStreamVolume(AudioManager.STREAM_MUSIC);
+ int percentageVol = ((currIndex*
+ AvrcpControllerConstants.ABS_VOL_BASE)/maxVol);
+ Log.d(TAG," Abs Vol Notify Rsp Changed vol = "+ percentageVol);
+ sendRegisterAbsVolRspNative(getByteAddress(mAvrcpRemoteDevice.mBTDevice),
+ (byte)AvrcpControllerConstants.NOTIFICATION_RSP_TYPE_CHANGED,
+ percentageVol, mAvrcpRemoteDevice.mNotificationLabel);
+ }
+ else if (mAvrcpRemoteDevice.mAbsVolNotificationState ==
+ AvrcpControllerConstants.DEFER_VOLUME_CHANGE_RSP) {
+ Log.d(TAG," Don't Complete Notification Rsp. ");
+ mAvrcpRemoteDevice.mAbsVolNotificationState =
+ AvrcpControllerConstants.SEND_VOLUME_CHANGE_RSP;
+ }
+ }
+ }
+ }
+ }
+ };
+
+ private void handlePassthroughRsp(int id, int keyState) {
+ Log.d(TAG, "passthrough response received as: key: "
+ + id + " state: " + keyState);
+ }
+
private void onConnectionStateChanged(boolean connected, byte[] address) {
BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice
(Utils.getAddressStringFromByte(address));
- Log.d(TAG, "onConnectionStateChanged " + connected + " " + device);
- Intent intent = new Intent(BluetoothAvrcpController.ACTION_CONNECTION_STATE_CHANGED);
+ Log.d(TAG, "onConnectionStateChanged " + connected + " " + device+ " size "+
+ mConnectedDevices.size());
+ if (device == null)
+ return;
int oldState = (mConnectedDevices.contains(device) ? BluetoothProfile.STATE_CONNECTED
: BluetoothProfile.STATE_DISCONNECTED);
int newState = (connected ? BluetoothProfile.STATE_CONNECTED
: BluetoothProfile.STATE_DISCONNECTED);
- intent.putExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, oldState);
- intent.putExtra(BluetoothProfile.EXTRA_STATE, newState);
- intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
-// intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
- sendBroadcast(intent, ProfileService.BLUETOOTH_PERM);
+
if (connected && oldState == BluetoothProfile.STATE_DISCONNECTED) {
+ /* AVRCPControllerService supports single connection */
+ if(mConnectedDevices.size() > 0) {
+ Log.d(TAG,"A Connection already exists, returning");
+ return;
+ }
mConnectedDevices.add(device);
+ Message msg = mHandler.obtainMessage(
+ AvrcpControllerConstants.MESSAGE_PROCESS_CONNECTION_CHANGE, newState,
+ oldState, device);
+ mHandler.sendMessage(msg);
} else if (!connected && oldState == BluetoothProfile.STATE_CONNECTED) {
mConnectedDevices.remove(device);
+ Message msg = mHandler.obtainMessage(
+ AvrcpControllerConstants.MESSAGE_PROCESS_CONNECTION_CHANGE, newState,
+ oldState, device);
+ mHandler.sendMessage(msg);
}
}
- private void handlePassthroughRsp(int id, int keyState) {
- Log.d(TAG, "passthrough response received as: key: "
+ private void getRcFeatures(byte[] address, int features) {
+ BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice
+ (Utils.getAddressStringFromByte(address));
+ Message msg = mHandler.obtainMessage(
+ AvrcpControllerConstants.MESSAGE_PROCESS_RC_FEATURES, features, 0, device);
+ mHandler.sendMessage(msg);
+ }
+ private void setPlayerAppSettingRsp(byte[] address, byte accepted) {
+ /* TODO do we need to do anything here */
+ }
+ private void handleRegisterNotificationAbsVol(byte[] address, byte label)
+ {
+ Log.d(TAG,"handleRegisterNotificationAbsVol ");
+ BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice
+ (Utils.getAddressStringFromByte(address));
+ if (!mConnectedDevices.contains(device))
+ return;
+ Message msg = mHandler.obtainMessage(AvrcpControllerConstants.
+ MESSAGE_PROCESS_REGISTER_ABS_VOL_NOTIFICATION, label, 0);
+ mHandler.sendMessage(msg);
+ }
+
+ private void handleSetAbsVolume(byte[] address, byte absVol, byte label)
+ {
+ Log.d(TAG,"handleSetAbsVolume ");
+ BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice
+ (Utils.getAddressStringFromByte(address));
+ if (!mConnectedDevices.contains(device))
+ return;
+ Message msg = mHandler.obtainMessage(
+ AvrcpControllerConstants.MESSAGE_PROCESS_SET_ABS_VOL_CMD, absVol, label);
+ mHandler.sendMessage(msg);
+ }
+
+ private void onTrackChanged(byte[] address, byte numAttributes, int[] attributes,
+ String[] attribVals)
+ {
+ Log.d(TAG,"onTrackChanged ");
+ BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice
+ (Utils.getAddressStringFromByte(address));
+ if (!mConnectedDevices.contains(device))
+ return;
+ TrackInfo mTrack = new TrackInfo(0, numAttributes, attributes, attribVals);
+ Message msg = mHandler.obtainMessage(AvrcpControllerConstants.
+ MESSAGE_PROCESS_TRACK_CHANGED, numAttributes, 0, mTrack);
+ mHandler.sendMessage(msg);
+ }
+
+ private void onPlayPositionChanged(byte[] address, int songLen, int currSongPosition) {
+ Log.d(TAG,"onPlayPositionChanged ");
+ BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice
+ (Utils.getAddressStringFromByte(address));
+ if (!mConnectedDevices.contains(device))
+ return;
+ Message msg = mHandler.obtainMessage(AvrcpControllerConstants.
+ MESSAGE_PROCESS_PLAY_POS_CHANGED, songLen, currSongPosition);
+ mHandler.sendMessage(msg);
+ }
+
+ private void onPlayStatusChanged(byte[] address, byte playStatus) {
+ if(DBG) Log.d(TAG,"onPlayStatusChanged " + playStatus);
+ BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice
+ (Utils.getAddressStringFromByte(address));
+ if (!mConnectedDevices.contains(device))
+ return;
+ Message msg = mHandler.obtainMessage(AvrcpControllerConstants.
+ MESSAGE_PROCESS_PLAY_STATUS_CHANGED, playStatus, 0);
+ mHandler.sendMessage(msg);
+ }
+
+ private void handlePlayerAppSetting(byte[] address, byte[] playerAttribRsp, int rspLen) {
+ Log.d(TAG,"handlePlayerAppSetting rspLen = " + rspLen);
+ BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice
+ (Utils.getAddressStringFromByte(address));
+ if (!mConnectedDevices.contains(device))
+ return;
+ ByteBuffer bb = ByteBuffer.wrap(playerAttribRsp, 0, rspLen);
+ Message msg = mHandler.obtainMessage(AvrcpControllerConstants.
+ MESSAGE_PROCESS_SUPPORTED_PLAYER_APP_SETTING, 0, 0, bb);
+ mHandler.sendMessage(msg);
+ }
+
+ private void onPlayerAppSettingChanged(byte[] address, byte[] playerAttribRsp, int rspLen) {
+ Log.d(TAG,"onPlayerAppSettingChanged ");
+ BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice
+ (Utils.getAddressStringFromByte(address));
+ if (!mConnectedDevices.contains(device))
+ return;
+ ByteBuffer bb = ByteBuffer.wrap(playerAttribRsp, 0, rspLen);
+ Message msg = mHandler.obtainMessage(AvrcpControllerConstants.
+ MESSAGE_PROCESS_PLAYER_APP_SETTING_CHANGED, 0, 0, bb);
+ mHandler.sendMessage(msg);
+ }
+
+ private void handleGroupNavigationRsp(int id, int keyState) {
+ Log.d(TAG, "group navigation response received as: key: "
+ id + " state: " + keyState);
}
@@ -273,4 +903,13 @@
private native void initNative();
private native void cleanupNative();
private native boolean sendPassThroughCommandNative(byte[] address, int keyCode, int keyState);
+ private native boolean sendGroupNavigationCommandNative(byte[] address, int keyCode,
+ int keyState);
+ private native void setPlayerApplicationSettingValuesNative(byte[] address, byte numAttrib,
+ byte[] atttibIds, byte[]attribVal);
+ /* This api is used to send response to SET_ABS_VOL_CMD */
+ private native void sendAbsVolRspNative(byte[] address, int absVol, int label);
+ /* This api is used to inform remote for any volume level changes */
+ private native void sendRegisterAbsVolRspNative(byte[] address, byte rspType, int absVol,
+ int label);
}
diff --git a/src/com/android/bluetooth/avrcp/NowPlaying.java b/src/com/android/bluetooth/avrcp/NowPlaying.java
new file mode 100644
index 0000000..f78d7a6
--- /dev/null
+++ b/src/com/android/bluetooth/avrcp/NowPlaying.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2015 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.avrcp;
+
+import android.util.Log;
+
+import com.android.bluetooth.Utils;
+
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * Provides Bluetooth AVRCP Controller profile, as a service in the Bluetooth application.
+ * TODO(sanketa): Rip out this feature as this is part of 1.6.
+ * @hide
+ */
+public class NowPlaying {
+ private static final boolean DBG = true;
+ private static final String TAG = "NowPlaying";
+
+ RemoteDevice mDevice;
+ private TrackInfo mCurrTrack;
+
+ private ArrayList<TrackInfo> mNowPlayingList;
+
+ public NowPlaying(RemoteDevice mRemoteDevice) {
+ mDevice = mRemoteDevice;
+ mNowPlayingList = new ArrayList<TrackInfo>();
+ mCurrTrack = null;
+ }
+
+ public void cleanup() {
+ mDevice = null;
+ if(mNowPlayingList != null) {
+ mNowPlayingList.clear();
+ }
+ mCurrTrack = null;
+ }
+
+ public RemoteDevice getDeviceRecords() {
+ return mDevice;
+ }
+
+ public void addTrack (TrackInfo mTrack) {
+ if(mNowPlayingList != null) {
+ mNowPlayingList.add(mTrack);
+ }
+ }
+
+ public void setCurrTrack (TrackInfo mTrack) {
+ mCurrTrack = mTrack;
+ }
+
+ public TrackInfo getCurrentTrack() {
+ return mCurrTrack;
+ }
+
+ public void updateCurrentTrack(TrackInfo mTrack) {
+ mCurrTrack.mAlbumTitle = mTrack.mAlbumTitle;
+ mCurrTrack.mArtistName = mTrack.mArtistName;
+ mCurrTrack.mGenre = mTrack.mGenre;
+ mCurrTrack.mTotalTracks = mTrack.mTotalTracks;
+ mCurrTrack.mTrackLen = mTrack.mTrackLen;
+ mCurrTrack.mTrackTitle = mTrack.mTrackTitle;
+ mCurrTrack.mTrackNum = mTrack.mTrackNum;
+ }
+
+ public TrackInfo getTrackFromId(int mTrackId) {
+ if(mTrackId == 0)
+ return getCurrentTrack();
+ else {
+ for(TrackInfo mTrackInfo: mNowPlayingList) {
+ if(mTrackInfo.mItemUid == mTrackId)
+ return mTrackInfo;
+ }
+ return null;
+ }
+ }
+}
diff --git a/src/com/android/bluetooth/avrcp/RemoteMediaPlayers.java b/src/com/android/bluetooth/avrcp/RemoteMediaPlayers.java
new file mode 100644
index 0000000..177742a
--- /dev/null
+++ b/src/com/android/bluetooth/avrcp/RemoteMediaPlayers.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2015 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.avrcp;
+
+import android.util.Log;
+
+import com.android.bluetooth.Utils;
+
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * Provides Bluetooth AVRCP Controller profile, as a service in the Bluetooth application.
+ * TODO(sanketa): Rip out this feature as this is part of 1.6.
+ * @hide
+ */
+public class RemoteMediaPlayers {
+ private static final boolean DBG = true;
+ private static final String TAG = "RemoteMediaPlayers";
+
+ RemoteDevice mDevice;
+ private PlayerInfo mAddressedPlayer;
+ private PlayerInfo mBrowsedPlayer;
+ ArrayList<PlayerInfo> mMediaPlayerList;
+
+ public RemoteMediaPlayers (RemoteDevice mRemoteDevice) {
+ mDevice = mRemoteDevice;
+ mAddressedPlayer = null;
+ mBrowsedPlayer = null;
+ mMediaPlayerList = new ArrayList<PlayerInfo>();
+ }
+
+ public void cleanup() {
+ mDevice = null;
+ mAddressedPlayer = null;
+ mBrowsedPlayer = null;
+ if(mMediaPlayerList != null)
+ mMediaPlayerList.clear();
+ }
+ /*
+ * add a Player
+ */
+ public void addPlayer (PlayerInfo mPlayer) {
+ if(mMediaPlayerList != null)
+ mMediaPlayerList.add(mPlayer);
+ }
+ /*
+ * add players and Set AddressedPlayer and BrowsePlayer
+ */
+ public void setAddressedPlayer(PlayerInfo mPlayer) {
+ mAddressedPlayer = mPlayer;
+ }
+
+ public void setBrowsedPlayer(PlayerInfo mPlayer) {
+ mBrowsedPlayer = mPlayer;
+ }
+ /*
+ * Returns the currently addressed, browsed player
+ */
+ public PlayerInfo getAddressedPlayer() {
+ return mAddressedPlayer;
+ }
+
+ /*
+ * getPlayStatus of addressed player
+ */
+ public byte getPlayStatus() {
+ if(getAddressedPlayer() != null)
+ return getAddressedPlayer().mPlayStatus;
+ else
+ return AvrcpControllerConstants.PLAY_STATUS_STOPPED;
+ }
+
+ /*
+ * getPlayStatus of addressed player
+ */
+ public long getPlayPosition() {
+ if(getAddressedPlayer() != null)
+ return getAddressedPlayer().mPlayTime;
+ else
+ return AvrcpControllerConstants.PLAYING_TIME_INVALID;
+ }
+
+}
diff --git a/src/com/android/bluetooth/btservice/AdapterService.java b/src/com/android/bluetooth/btservice/AdapterService.java
index 5e60ee4..bfe22f2 100644
--- a/src/com/android/bluetooth/btservice/AdapterService.java
+++ b/src/com/android/bluetooth/btservice/AdapterService.java
@@ -33,12 +33,15 @@
import android.bluetooth.IBluetoothManager;
import android.bluetooth.IBluetoothManagerCallback;
import android.bluetooth.BluetoothActivityEnergyInfo;
+import android.bluetooth.OobData;
+import android.bluetooth.UidTraffic;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
+import android.os.BatteryStats;
import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
@@ -52,11 +55,15 @@
import android.os.RemoteException;
import android.os.SystemClock;
import android.provider.Settings;
+import android.text.TextUtils;
+import android.util.Base64;
import android.util.EventLog;
import android.util.Log;
import android.util.Pair;
+import android.util.SparseArray;
import com.android.bluetooth.a2dp.A2dpService;
+import com.android.bluetooth.a2dp.A2dpSinkService;
import com.android.bluetooth.hid.HidService;
import com.android.bluetooth.hfp.HeadsetService;
import com.android.bluetooth.hdp.HealthService;
@@ -67,9 +74,13 @@
import com.android.bluetooth.btservice.RemoteDevices.DeviceProperties;
import java.io.FileDescriptor;
+import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
+import java.io.PrintWriter;
+import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.Set;
import java.util.Map;
@@ -79,6 +90,7 @@
import android.content.pm.PackageManager;
import android.os.ServiceManager;
+import com.android.internal.app.IBatteryStats;
public class AdapterService extends Service {
private static final String TAG = "BluetoothAdapterService";
@@ -95,6 +107,7 @@
private int mRxTimeTotalMs;
private int mIdleTimeTotalMs;
private int mEnergyUsedTotalVoltAmpSecMicro;
+ private SparseArray<UidTraffic> mUidTraffic = new SparseArray<>();
private final ArrayList<ProfileService> mProfiles = new ArrayList<ProfileService>();
@@ -125,6 +138,13 @@
private static final int ADAPTER_SERVICE_TYPE=Service.START_STICKY;
+ private static final String[] DEVICE_TYPE_NAMES = new String[] {
+ "???",
+ "BR/EDR",
+ "LE",
+ "DUAL"
+ };
+
static {
classInitNative();
}
@@ -184,6 +204,7 @@
private AlarmManager mAlarmManager;
private PendingIntent mPendingAlarm;
+ private IBatteryStats mBatteryStats;
private PowerManager mPowerManager;
private PowerManager.WakeLock mWakeLock;
private String mWakeLockName;
@@ -198,6 +219,12 @@
debugLog("AdapterService() - REFCOUNT: CREATED. INSTANCE_COUNT" + sRefCount);
}
}
+
+ // This is initialized at the beginning in order to prevent
+ // NullPointerException from happening if AdapterService
+ // functions are called before BLE is turned on due to
+ // |mRemoteDevices| being null.
+ mRemoteDevices = new RemoteDevices(this);
}
public void onProfileConnectionStateChanged(BluetoothDevice device, int profileId, int newState, int prevState) {
@@ -227,6 +254,7 @@
private void processInitProfilePriorities (BluetoothDevice device, ParcelUuid[] uuids){
HidService hidService = HidService.getHidService();
A2dpService a2dpService = A2dpService.getA2dpService();
+ A2dpSinkService a2dpSinkService = A2dpSinkService.getA2dpSinkService();
HeadsetService headsetService = HeadsetService.getHeadsetService();
// Set profile priorities only for the profiles discovered on the remote device.
@@ -261,6 +289,9 @@
connectOtherProfile(device, PROFILE_CONN_CONNECTED);
setProfileAutoConnectionPriority(device, profileId);
}
+ if ((profileId == BluetoothProfile.A2DP_SINK) && (newState == BluetoothProfile.STATE_CONNECTED)) {
+ setProfileAutoConnectionPriority(device, profileId);
+ }
IBluetooth.Stub binder = mBinder;
if (binder != null) {
try {
@@ -362,6 +393,8 @@
mAdapterStateMachine.sendMessage(mAdapterStateMachine.obtainMessage(AdapterState.BREDR_STOPPED));
} else if (isTurningOn) {
+ updateInteropDatabase();
+
//Process start pending
//Check if all services are started if so, update state
synchronized (mProfileServicesState) {
@@ -387,6 +420,59 @@
}
}
+ private void updateInteropDatabase() {
+ interopDatabaseClearNative();
+
+ String interop_string = Settings.Global.getString(getContentResolver(),
+ Settings.Global.BLUETOOTH_INTEROPERABILITY_LIST);
+ if (interop_string == null) return;
+ Log.d(TAG, "updateInteropDatabase: [" + interop_string + "]");
+
+ String[] entries = interop_string.split(";");
+ for (String entry : entries) {
+ String[] tokens = entry.split(",");
+ if (tokens.length != 2) continue;
+
+ // Get feature
+ int feature = 0;
+ try {
+ feature = Integer.parseInt(tokens[1]);
+ } catch (NumberFormatException e) {
+ Log.e(TAG, "updateInteropDatabase: Invalid feature '" + tokens[1] + "'");
+ continue;
+ }
+
+ // Get address bytes and length
+ int length = (tokens[0].length() + 1) / 3;
+ if (length < 1 || length > 6) {
+ Log.e(TAG, "updateInteropDatabase: Malformed address string '" + tokens[0] + "'");
+ continue;
+ }
+
+ byte[] addr = new byte[6];
+ int offset = 0;
+ for (int i = 0; i < tokens[0].length(); ) {
+ if (tokens[0].charAt(i) == ':') {
+ i += 1;
+ } else {
+ try {
+ addr[offset++] = (byte) Integer.parseInt(tokens[0].substring(i, i + 2), 16);
+ } catch (NumberFormatException e) {
+ offset = 0;
+ break;
+ }
+ i += 2;
+ }
+ }
+
+ // Check if address was parsed ok, otherwise, move on...
+ if (offset == 0) continue;
+
+ // Add entry
+ interopDatabaseAddNative(feature, addr, length);
+ }
+ }
+
@Override
public void onCreate() {
super.onCreate();
@@ -403,6 +489,8 @@
getAdapterPropertyNative(AbstractionLayer.BT_PROPERTY_BDNAME);
mAlarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
+ mBatteryStats = IBatteryStats.Stub.asInterface(ServiceManager.getService(
+ BatteryStats.SERVICE_NAME));
mSdpManager = SdpManager.init(this);
registerReceiver(mAlarmBroadcastReceiver, new IntentFilter(ACTION_ALARM_WAKEUP));
@@ -439,7 +527,17 @@
for (int i=0; i < supportedProfileServices.length;i++) {
mProfileServicesState.put(supportedProfileServices[i].getName(),BluetoothAdapter.STATE_OFF);
}
- mRemoteDevices = new RemoteDevices(this);
+
+ // Reset |mRemoteDevices| whenever BLE is turned off then on
+ // This is to replace the fact that |mRemoteDevices| was
+ // reinitialized in previous code.
+ //
+ // TODO(apanicke): The reason is unclear but
+ // I believe it is to clear the variable every time BLE was
+ // turned off then on. The same effect can be achieved by
+ // calling cleanup but this may not be necessary at all
+ // We should figure out why this is needed later
+ mRemoteDevices.cleanup();
mAdapterProperties.init(mRemoteDevices);
debugLog("BleOnProcessStart() - Make Bond State Machine");
@@ -447,6 +545,12 @@
mJniCallbacks.init(mBondStateMachine,mRemoteDevices);
+ try {
+ mBatteryStats.noteResetBleScan();
+ } catch (RemoteException e) {
+ // Ignore.
+ }
+
//FIXME: Set static instance here???
setAdapterService(this);
@@ -951,7 +1055,18 @@
AdapterService service = getService();
if (service == null) return false;
- return service.createBond(device, transport);
+ return service.createBond(device, transport, null);
+ }
+
+ public boolean createBondOutOfBand(BluetoothDevice device, int transport, OobData oobData) {
+ if (!Utils.checkCaller()) {
+ Log.w(TAG, "createBondOutOfBand() - Not allowed for non-active user");
+ return false;
+ }
+
+ AdapterService service = getService();
+ if (service == null) return false;
+ return service.createBond(device, transport, oobData);
}
public boolean cancelBondProcess(BluetoothDevice device) {
@@ -1284,12 +1399,6 @@
return service.reportActivityInfo();
}
- public void dump(ParcelFileDescriptor fd) {
- AdapterService service = getService();
- if (service == null) return;
- service.dump(fd.getFileDescriptor());
- }
-
public void onLeServiceUp(){
AdapterService service = getService();
if (service == null) return;
@@ -1301,6 +1410,12 @@
if (service == null) return;
service.onBrEdrDown();
}
+
+ public void dump(FileDescriptor fd, String[] args) {
+ PrintWriter writer = new PrintWriter(new FileOutputStream(fd));
+ AdapterService service = getService();
+ service.dump(fd, writer, args);
+ }
};
// ----API Methods--------
@@ -1448,8 +1563,7 @@
}
}
-
- boolean createBond(BluetoothDevice device, int transport) {
+ boolean createBond(BluetoothDevice device, int transport, OobData oobData) {
enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM,
"Need BLUETOOTH ADMIN permission");
DeviceProperties deviceProp = mRemoteDevices.getDeviceProperties(device);
@@ -1464,6 +1578,12 @@
Message msg = mBondStateMachine.obtainMessage(BondStateMachine.CREATE_BOND);
msg.obj = device;
msg.arg1 = transport;
+
+ if (oobData != null) {
+ Bundle oobDataBundle = new Bundle();
+ oobDataBundle.putParcelable(BondStateMachine.OOBDATA, oobData);
+ msg.setData(oobDataBundle);
+ }
mBondStateMachine.sendMessage(msg);
return true;
}
@@ -1482,6 +1602,7 @@
debugLog( "autoConnect() - Initiate auto connection on BT on...");
autoConnectHeadset();
autoConnectA2dp();
+ autoConnectA2dpSink();
}
else {
debugLog( "autoConnect() - BT is in quiet mode. Not initiating auto connections");
@@ -1516,6 +1637,17 @@
}
}
}
+ private void autoConnectA2dpSink(){
+ A2dpSinkService a2dpSinkService = A2dpSinkService.getA2dpSinkService();
+ BluetoothDevice bondedDevices[] = getBondedDevices();
+ if ((bondedDevices == null) ||(a2dpSinkService == null)) {
+ return;
+ }
+ for (BluetoothDevice device : bondedDevices) {
+ debugLog("autoConnectA2dp() - Connecting A2DP Sink with " + device.toString());
+ a2dpSinkService.connect(device);
+ }
+ }
public void connectOtherProfile(BluetoothDevice device, int firstProfileStatus){
if ((mHandler.hasMessages(MESSAGE_CONNECT_OTHER_PROFILES) == false) &&
@@ -1589,14 +1721,6 @@
hsService.setPriority(device,BluetoothProfile.PRIORITY_AUTO_CONNECT);
}
}
- else if (profileId == BluetoothProfile.A2DP) {
- A2dpService a2dpService = A2dpService.getA2dpService();
- if ((a2dpService != null) &&
- (BluetoothProfile.PRIORITY_AUTO_CONNECT != a2dpService.getPriority(device))){
- adjustOtherSinkPriorities(a2dpService, device);
- a2dpService.setPriority(device,BluetoothProfile.PRIORITY_AUTO_CONNECT);
- }
- }
}
boolean cancelBondProcess(BluetoothDevice device) {
@@ -1634,6 +1758,7 @@
String getRemoteName(BluetoothDevice device) {
enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
+ if (mRemoteDevices == null) return null;
DeviceProperties deviceProp = mRemoteDevices.getDeviceProperties(device);
if (deviceProp == null) return null;
return deviceProp.getName();
@@ -1812,7 +1937,7 @@
ParcelUuid uuid, int port, int flag) {
enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
int fd = connectSocketNative(Utils.getBytesFromAddress(device.getAddress()),
- type, Utils.uuidToByteArray(uuid), port, flag);
+ type, Utils.uuidToByteArray(uuid), port, flag, Binder.getCallingUid());
if (fd < 0) {
errorLog("Failed to connect socket");
return null;
@@ -1824,7 +1949,7 @@
ParcelUuid uuid, int port, int flag) {
enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
int fd = createSocketChannelNative(type, serviceName,
- Utils.uuidToByteArray(uuid), port, flag);
+ Utils.uuidToByteArray(uuid), port, flag, Binder.getCallingUid());
if (fd < 0) {
errorLog("Failed to create socket channel");
return null;
@@ -1900,7 +2025,32 @@
enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED, "Need BLUETOOTH permission");
BluetoothActivityEnergyInfo info =
new BluetoothActivityEnergyInfo(SystemClock.elapsedRealtime(), mStackReportedState,
- mTxTimeTotalMs, mRxTimeTotalMs, mIdleTimeTotalMs, mEnergyUsedTotalVoltAmpSecMicro);
+ mTxTimeTotalMs, mRxTimeTotalMs, mIdleTimeTotalMs,
+ mEnergyUsedTotalVoltAmpSecMicro);
+
+ // Count the number of entries that have byte counts > 0
+ int arrayLen = 0;
+ for (int i = 0; i < mUidTraffic.size(); i++) {
+ final UidTraffic traffic = mUidTraffic.valueAt(i);
+ if (traffic.getTxBytes() != 0 || traffic.getRxBytes() != 0) {
+ arrayLen++;
+ }
+ }
+
+ // Copy the traffic objects whose byte counts are > 0 and reset the originals.
+ final UidTraffic[] result = arrayLen > 0 ? new UidTraffic[arrayLen] : null;
+ int putIdx = 0;
+ for (int i = 0; i < mUidTraffic.size(); i++) {
+ final UidTraffic traffic = mUidTraffic.valueAt(i);
+ if (traffic.getTxBytes() != 0 || traffic.getRxBytes() != 0) {
+ result[putIdx++] = traffic.clone();
+ traffic.setRxBytes(0);
+ traffic.setTxBytes(0);
+ }
+ }
+
+ info.setUidTraffic(result);
+
// Read on clear values; a record of data is created with
// timstamp and new samples are collected until read again
mStackReportedState = 0;
@@ -2015,9 +2165,9 @@
return true;
}
- private void energyInfoCallback (int status, int ctrl_state,
- long tx_time, long rx_time, long idle_time, long energy_used)
- throws RemoteException {
+ private void energyInfoCallback(int status, int ctrl_state, long tx_time, long rx_time,
+ long idle_time, long energy_used, UidTraffic[] data)
+ throws RemoteException {
if (ctrl_state >= BluetoothActivityEnergyInfo.BT_STACK_STATE_INVALID &&
ctrl_state <= BluetoothActivityEnergyInfo.BT_STACK_STATE_STATE_IDLE) {
mStackReportedState = ctrl_state;
@@ -2032,12 +2182,23 @@
+ mIdleTimeTotalMs * getIdleCurrentMa()) * getOperatingVolt());
}
mEnergyUsedTotalVoltAmpSecMicro += energy_used;
+
+ for (UidTraffic traffic : data) {
+ UidTraffic existingTraffic = mUidTraffic.get(traffic.getUid());
+ if (existingTraffic == null) {
+ mUidTraffic.put(traffic.getUid(), traffic);
+ } else {
+ existingTraffic.addRxBytes(traffic.getRxBytes());
+ existingTraffic.addTxBytes(traffic.getTxBytes());
+ }
+ }
}
debugLog("energyInfoCallback() status = " + status +
"tx_time = " + tx_time + "rx_time = " + rx_time +
"idle_time = " + idle_time + "energy_used = " + energy_used +
- "ctrl_state = " + ctrl_state);
+ "ctrl_state = " + ctrl_state +
+ "traffic = " + Arrays.toString(data));
}
private int getIdleCurrentMa() {
@@ -2056,8 +2217,37 @@
return getResources().getInteger(R.integer.config_bluetooth_operating_voltage_mv) / 1000.0;
}
- private void dump(FileDescriptor fd) {
- // Collect profile information
+ @Override
+ protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
+ enforceCallingOrSelfPermission(android.Manifest.permission.DUMP, TAG);
+
+ if (args.length > 0) {
+ debugLog("dumpsys arguments, skipping normal dumpsys: " +
+ TextUtils.join(" ", args));
+ if (args[0].startsWith("--proto")) {
+ if (args[0].equals("--proto-java-bin")) {
+ dumpJava(fd);
+ } else {
+ dumpNative(fd, args);
+ }
+ }
+ return;
+ }
+
+ writer.println("Bluetooth Status");
+ writer.println(" enabled: " + isEnabled());
+ writer.println(" state: " + getState());
+ writer.println(" address: " + getAddress());
+ writer.println(" name: " + getName() + "\n");
+
+ writer.println("Bonded devices:");
+ for (BluetoothDevice device : getBondedDevices()) {
+ writer.println(" " + device.getAddress() +
+ " [" + DEVICE_TYPE_NAMES[device.getType()] + "] " +
+ device.getName());
+ }
+
+ // Dump profile information
StringBuilder sb = new StringBuilder();
synchronized (mProfiles) {
for (ProfileService profile : mProfiles) {
@@ -2065,25 +2255,28 @@
}
}
- // Dump Java based profiles first
- FileWriter fw = null;
- try {
- fw = new FileWriter(fd);
- fw.write(sb.toString());
- } catch (IOException ex) {
- errorLog("IOException writing profile status!");
- } finally {
- if (fw != null) {
- try {
- fw.close();
- } catch (IOException ex) {
- debugLog("IOException closing a file after writing the profile status");
- }
- }
+ writer.write(sb.toString());
+ writer.flush();
+
+ dumpNative(fd, args);
+ }
+
+ private void dumpJava(FileDescriptor fd) {
+ BluetoothProto.BluetoothLog log = new BluetoothProto.BluetoothLog();
+
+ for (ProfileService profile : mProfiles) {
+ profile.dumpProto(log);
}
- // Add native logs
- dumpNative(fd);
+ try {
+ FileOutputStream protoOut = new FileOutputStream(fd);
+ String protoOutString =
+ Base64.encodeToString(log.toByteArray(), Base64.DEFAULT);
+ protoOut.write(protoOutString.getBytes(StandardCharsets.UTF_8));
+ protoOut.close();
+ } catch (IOException e) {
+ errorLog("Unable to write Java protobuf to file descriptor.");
+ }
}
private void debugLog(String msg) {
@@ -2118,6 +2311,7 @@
/*package*/ native boolean getDevicePropertyNative(byte[] address, int type);
/*package*/ native boolean createBondNative(byte[] address, int transport);
+ /*package*/ native boolean createBondOutOfBandNative(byte[] address, int transport, OobData oobData);
/*package*/ native boolean removeBondNative(byte[] address);
/*package*/ native boolean cancelBondNative(byte[] address);
/*package*/ native boolean sdpSearchNative(byte[] address, byte[] uuid);
@@ -2137,15 +2331,18 @@
private native int readEnergyInfo();
// TODO(BT) move this to ../btsock dir
private native int connectSocketNative(byte[] address, int type,
- byte[] uuid, int port, int flag);
+ byte[] uuid, int port, int flag, int callingUid);
private native int createSocketChannelNative(int type, String serviceName,
- byte[] uuid, int port, int flag);
+ byte[] uuid, int port, int flag, int callingUid);
/*package*/ native boolean configHciSnoopLogNative(boolean enable);
/*package*/ native boolean factoryResetNative();
private native void alarmFiredNative();
- private native void dumpNative(FileDescriptor fd);
+ private native void dumpNative(FileDescriptor fd, String[] arguments);
+
+ private native void interopDatabaseClearNative();
+ private native void interopDatabaseAddNative(int feature, byte[] address, int length);
protected void finalize() {
cleanup();
diff --git a/src/com/android/bluetooth/btservice/BondStateMachine.java b/src/com/android/bluetooth/btservice/BondStateMachine.java
index 7bed94a..790597f 100644
--- a/src/com/android/bluetooth/btservice/BondStateMachine.java
+++ b/src/com/android/bluetooth/btservice/BondStateMachine.java
@@ -23,6 +23,8 @@
import com.android.bluetooth.a2dp.A2dpService;
import com.android.bluetooth.hid.HidService;
import com.android.bluetooth.hfp.HeadsetService;
+
+import android.bluetooth.OobData;
import android.content.Context;
import android.content.Intent;
import android.os.Message;
@@ -66,6 +68,8 @@
private PendingCommandState mPendingCommandState = new PendingCommandState();
private StableState mStableState = new StableState();
+ public static final String OOBDATA = "oobdata";
+
private BondStateMachine(AdapterService service,
AdapterProperties prop, RemoteDevices remoteDevices) {
super("BondStateMachine:");
@@ -110,7 +114,11 @@
switch(msg.what) {
case CREATE_BOND:
- createBond(dev, msg.arg1, true);
+ OobData oobData = null;
+ if (msg.getData() != null)
+ oobData = msg.getData().getParcelable(OOBDATA);
+
+ createBond(dev, msg.arg1, oobData, true);
break;
case REMOVE_BOND:
removeBond(dev, true);
@@ -171,7 +179,11 @@
switch (msg.what) {
case CREATE_BOND:
- result = createBond(dev, msg.arg1, false);
+ OobData oobData = null;
+ if (msg.getData() != null)
+ oobData = msg.getData().getParcelable(OOBDATA);
+
+ result = createBond(dev, msg.arg1, oobData, false);
break;
case REMOVE_BOND:
result = removeBond(dev, false);
@@ -288,11 +300,19 @@
return false;
}
- private boolean createBond(BluetoothDevice dev, int transport, boolean transition) {
+ private boolean createBond(BluetoothDevice dev, int transport, OobData oobData,
+ boolean transition) {
if (dev.getBondState() == BluetoothDevice.BOND_NONE) {
infoLog("Bond address is:" + dev);
byte[] addr = Utils.getBytesFromAddress(dev.getAddress());
- if (!mAdapterService.createBondNative(addr, transport)) {
+ boolean result;
+ if (oobData != null) {
+ result = mAdapterService.createBondOutOfBandNative(addr, transport, oobData);
+ } else {
+ result = mAdapterService.createBondNative(addr, transport);
+ }
+
+ if (!result) {
sendIntent(dev, BluetoothDevice.BOND_NONE,
BluetoothDevice.UNBOND_REASON_REMOVED);
return false;
@@ -462,6 +482,10 @@
a2dpService.setPriority(device,BluetoothProfile.PRIORITY_UNDEFINED);
if(headsetService != null)
headsetService.setPriority(device,BluetoothProfile.PRIORITY_UNDEFINED);
+
+ // Clear Absolute Volume black list
+ if(a2dpService != null)
+ a2dpService.resetAvrcpBlacklist(device);
}
private void infoLog(String msg) {
diff --git a/src/com/android/bluetooth/btservice/ProfileService.java b/src/com/android/bluetooth/btservice/ProfileService.java
index 7a6908f..0202947 100644
--- a/src/com/android/bluetooth/btservice/ProfileService.java
+++ b/src/com/android/bluetooth/btservice/ProfileService.java
@@ -164,6 +164,10 @@
sb.append("\nProfile: " + mName + "\n");
}
+ public void dumpProto(BluetoothProto.BluetoothLog proto) {
+ // Do nothing
+ }
+
// with indenting for subclasses
public static void println(StringBuilder sb, String s) {
sb.append(" ");
diff --git a/src/com/android/bluetooth/btservice/bluetooth.proto b/src/com/android/bluetooth/btservice/bluetooth.proto
new file mode 100644
index 0000000..11311ea
--- /dev/null
+++ b/src/com/android/bluetooth/btservice/bluetooth.proto
@@ -0,0 +1,202 @@
+// Copyright 2014 Google Inc. All Rights Reserved.
+// Author: pkanwar@google.com (Pankaj Kanwar)
+// Protos for uploading bluetooth metrics.
+
+syntax = "proto2";
+
+package com.android.bluetooth.btservice;
+
+option java_package = "com.android.bluetooth.btservice";
+option java_outer_classname = "BluetoothProto";
+//option (datapol.file_vetting_status) = "latest";
+
+// import "storage/datapol/annotations/proto/semantic_annotations.proto";
+
+message BluetoothLog {
+
+ // Session information that gets logged for every BT connection.
+ repeated BluetoothSession session = 1;
+
+ // Session information that gets logged for every Pair event.
+ repeated PairEvent pair_event = 2;
+
+ // Information for Wake locks.
+ repeated WakeEvent wake_event = 3;
+
+ // Scan event information.
+ repeated ScanEvent scan_event = 4;
+}
+
+// The information about the device.
+message DeviceInfo {
+
+ // Device type.
+ enum DeviceType {
+
+ // Type is unknown.
+ DEVICE_TYPE_UNKNOWN = 0;
+
+ DEVICE_TYPE_BREDR = 1;
+
+ DEVICE_TYPE_LE = 2;
+
+ DEVICE_TYPE_DUMO = 3;
+ }
+
+ // Device class
+ // https://cs.corp.google.com/#android/system/bt/stack/include/btm_api.h&q=major_computer.
+ optional int32 device_class = 1;
+
+ // Device type.
+ optional DeviceType device_type = 2;
+}
+
+// Information that gets logged for every Bluetooth connection.
+message BluetoothSession {
+
+ // Type of technology used in the connection.
+ enum ConnectionTechnologyType {
+
+ CONNECTION_TECHNOLOGY_TYPE_UNKNOWN = 0;
+
+ CONNECTION_TECHNOLOGY_TYPE_LE = 1;
+
+ CONNECTION_TECHNOLOGY_TYPE_BREDR = 2;
+ }
+
+ // Duration of the session.
+ optional int64 session_duration_sec = 2;
+
+ // Technology type.
+ optional ConnectionTechnologyType connection_technology_type = 3;
+
+ // Reason for disconnecting.
+ optional string disconnect_reason = 4;
+
+ // The information about the device which it is connected to.
+ optional DeviceInfo device_connected_to = 5;
+
+ // The information about the RFComm session.
+ optional RFCommSession rfcomm_session = 6;
+
+ // The information about the A2DP session.
+ optional A2DPSession a2dp_session = 7;
+}
+
+message RFCommSession {
+
+ // bytes transmitted.
+ optional int32 rx_bytes = 1;
+
+ // bytes transmitted.
+ optional int32 tx_bytes = 2;
+}
+
+// Session information that gets logged for every A2DP session.
+message A2DPSession {
+
+ // Media timer in milliseconds.
+ optional int32 media_timer_min_millis = 1;
+
+ // Media timer in milliseconds.
+ optional int32 media_timer_max_millis = 2;
+
+ // Media timer in milliseconds.
+ optional int32 media_timer_avg_millis = 3;
+
+ // Buffer overruns count.
+ optional int32 buffer_overruns_max_count = 4;
+
+ // Buffer overruns total.
+ optional int32 buffer_overruns_total = 5;
+
+ // Buffer underruns average.
+ optional float buffer_underruns_average = 6;
+
+ // Buffer underruns count.
+ optional int32 buffer_underruns_count = 7;
+}
+
+message PairEvent {
+
+ // The reason for disconnecting
+ // https://cs.corp.google.com/#android/system/bt/stack/include/hcidefs.h&q=failed_establish.
+ optional int32 disconnect_reason = 1;
+
+ // Pair event time
+ optional int64 event_time_millis = 2; // [(datapol.semantic_type) = ST_TIMESTAMP];
+
+ // The information about the device which it is paired to.
+ optional DeviceInfo device_paired_with = 3;
+}
+
+message WakeEvent {
+
+ // Information about the wake event type.
+ enum WakeEventType {
+
+ // Type is unknown.
+ UNKNOWN = 0;
+
+ // WakeLock was acquired.
+ ACQUIRED = 1;
+
+ // WakeLock was released.
+ RELEASED = 2;
+ }
+
+ // Information about the wake event type.
+ optional WakeEventType wake_event_type = 1;
+
+ // Initiator of the scan. Only the first three names will be stored.
+ // e.g. com.google.gms.
+ optional string requestor = 2;
+
+ // Name of the wakelock (e.g. bluedroid_timer).
+ optional string name = 3;
+
+ // Time of the event.
+ optional int64 event_time_millis = 4; // [(datapol.semantic_type) = ST_TIMESTAMP];
+}
+
+message ScanEvent {
+
+ // Scan type.
+ enum ScanTechnologyType {
+
+ // Scan Type is unknown.
+ SCAN_TYPE_UNKNOWN = 0;
+
+ SCAN_TECH_TYPE_LE = 1;
+
+ SCAN_TECH_TYPE_BREDR = 2;
+
+ SCAN_TECH_TYPE_BOTH = 3;
+ }
+
+ // Scan event type.
+ enum ScanEventType {
+
+ // Scan started.
+ SCAN_EVENT_START = 0;
+
+ // Scan stopped.
+ SCAN_EVENT_STOP = 1;
+ }
+
+ // Scan event type.
+ optional ScanEventType scan_event_type = 1;
+
+ // Initiator of the scan. Only the first three names will be stored.
+ // e.g. com.google.gms.
+ optional string initiator = 2;
+
+ // Technology used for scanning.
+ optional ScanTechnologyType scan_technology_type = 3;
+
+ // Number of results returned.
+ optional int32 number_results = 4;
+
+ // Time of the event.
+ optional int64 event_time_millis = 5; // [(datapol.semantic_type) = ST_TIMESTAMP];
+}
diff --git a/src/com/android/bluetooth/gatt/ContextMap.java b/src/com/android/bluetooth/gatt/ContextMap.java
index f492237..bb797d1 100644
--- a/src/com/android/bluetooth/gatt/ContextMap.java
+++ b/src/com/android/bluetooth/gatt/ContextMap.java
@@ -15,6 +15,8 @@
*/
package com.android.bluetooth.gatt;
+import android.content.Context;
+import android.os.Binder;
import android.os.IBinder;
import android.os.IBinder.DeathRecipient;
import android.os.IInterface;
@@ -23,6 +25,7 @@
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
+import java.util.LinkedList;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Set;
@@ -30,6 +33,8 @@
import java.util.HashMap;
import java.util.Map;
+import com.android.bluetooth.btservice.BluetoothProto;
+
/**
* Helper class that keeps track of registered GATT applications.
* This class manages application callbacks and keeps track of GATT connections.
@@ -38,6 +43,77 @@
/*package*/ class ContextMap<T> {
private static final String TAG = GattServiceConfig.TAG_PREFIX + "ContextMap";
+ static final int NUM_SCAN_EVENTS_KEPT = 20;
+ ArrayList<BluetoothProto.ScanEvent> mScanEvents =
+ new ArrayList<BluetoothProto.ScanEvent>(NUM_SCAN_EVENTS_KEPT);
+
+ /**
+ * ScanStats class helps keep track of information about scans
+ * on a per application basis.
+ */
+ class ScanStats {
+ static final int NUM_SCAN_DURATIONS_KEPT = 5;
+
+ String appName;
+ int scansStarted = 0;
+ int scansStopped = 0;
+ boolean isScanning = false;
+ boolean isRegistered = false;
+ long minScanTime = Long.MAX_VALUE;
+ long maxScanTime = 0;
+ long totalScanTime = 0;
+ List<Long> lastScans = new ArrayList<Long>(NUM_SCAN_DURATIONS_KEPT + 1);
+ long startTime = 0;
+ long stopTime = 0;
+
+ public ScanStats(String name) {
+ appName = name;
+ }
+
+ void startScan() {
+ this.scansStarted++;
+ isScanning = true;
+ startTime = System.currentTimeMillis();
+
+ BluetoothProto.ScanEvent scanEvent = new BluetoothProto.ScanEvent();
+ scanEvent.setScanEventType(BluetoothProto.ScanEvent.SCAN_EVENT_START);
+ scanEvent.setScanTechnologyType(BluetoothProto.ScanEvent.SCAN_TECH_TYPE_LE);
+ scanEvent.setInitiator(appName);
+ scanEvent.setEventTimeMillis(System.currentTimeMillis());
+ synchronized(mScanEvents) {
+ if(mScanEvents.size() == NUM_SCAN_EVENTS_KEPT)
+ mScanEvents.remove(0);
+ mScanEvents.add(scanEvent);
+ }
+ }
+
+ void stopScan() {
+ this.scansStopped++;
+ isScanning = false;
+ stopTime = System.currentTimeMillis();
+ long currTime = stopTime - startTime;
+
+ minScanTime = Math.min(currTime, minScanTime);
+ maxScanTime = Math.max(currTime, maxScanTime);
+ totalScanTime += currTime;
+ lastScans.add(currTime);
+ if (lastScans.size() > NUM_SCAN_DURATIONS_KEPT) {
+ lastScans.remove(0);
+ }
+
+ BluetoothProto.ScanEvent scanEvent = new BluetoothProto.ScanEvent();
+ scanEvent.setScanEventType(BluetoothProto.ScanEvent.SCAN_EVENT_STOP);
+ scanEvent.setScanTechnologyType(BluetoothProto.ScanEvent.SCAN_TECH_TYPE_LE);
+ scanEvent.setInitiator(appName);
+ scanEvent.setEventTimeMillis(System.currentTimeMillis());
+ synchronized(mScanEvents) {
+ if (mScanEvents.size() == NUM_SCAN_EVENTS_KEPT)
+ mScanEvents.remove(0);
+ mScanEvents.add(scanEvent);
+ }
+ }
+ }
+
/**
* Connection class helps map connection IDs to device addresses.
*/
@@ -63,6 +139,9 @@
/** The id of the application */
int id;
+ /** The package name of the application */
+ String name;
+
/** Application callbacks */
T callback;
@@ -78,9 +157,10 @@
/**
* Creates a new app context.
*/
- App(UUID uuid, T callback) {
+ App(UUID uuid, T callback, String name) {
this.uuid = uuid;
this.callback = callback;
+ this.name = name;
}
/**
@@ -123,15 +203,30 @@
/** Our internal application list */
List<App> mApps = new ArrayList<App>();
+ /** Internal map to keep track of logging information by app name */
+ HashMap<String, ScanStats> mScanStats = new HashMap<String, ScanStats>();
+
/** Internal list of connected devices **/
Set<Connection> mConnections = new HashSet<Connection>();
/**
* Add an entry to the application context list.
*/
- void add(UUID uuid, T callback) {
+ void add(UUID uuid, T callback, Context context) {
+ String appName = context.getPackageManager().getNameForUid(
+ Binder.getCallingUid());
+ if (appName == null) {
+ // Assign an app name if one isn't found
+ appName = "Unknown App (UID: " + Binder.getCallingUid() + ")";
+ }
synchronized (mApps) {
- mApps.add(new App(uuid, callback));
+ mApps.add(new App(uuid, callback, appName));
+ ScanStats scanStats = mScanStats.get(appName);
+ if (scanStats == null) {
+ scanStats = new ScanStats(appName);
+ mScanStats.put(appName, scanStats);
+ }
+ scanStats.isRegistered = true;
}
}
@@ -141,10 +236,11 @@
void remove(UUID uuid) {
synchronized (mApps) {
Iterator<App> i = mApps.iterator();
- while(i.hasNext()) {
+ while (i.hasNext()) {
App entry = i.next();
if (entry.uuid.equals(uuid)) {
entry.unlinkToDeath();
+ mScanStats.get(entry.name).isRegistered = false;
i.remove();
break;
}
@@ -158,10 +254,11 @@
void remove(int id) {
synchronized (mApps) {
Iterator<App> i = mApps.iterator();
- while(i.hasNext()) {
+ while (i.hasNext()) {
App entry = i.next();
if (entry.id == id) {
entry.unlinkToDeath();
+ mScanStats.get(entry.name).isRegistered = false;
i.remove();
break;
}
@@ -187,7 +284,7 @@
void removeConnection(int id, int connId) {
synchronized (mConnections) {
Iterator<Connection> i = mConnections.iterator();
- while(i.hasNext()) {
+ while (i.hasNext()) {
Connection connection = i.next();
if (connection.connId == connId) {
i.remove();
@@ -202,7 +299,7 @@
*/
App getById(int id) {
Iterator<App> i = mApps.iterator();
- while(i.hasNext()) {
+ while (i.hasNext()) {
App entry = i.next();
if (entry.id == id) return entry;
}
@@ -215,7 +312,7 @@
*/
App getByUuid(UUID uuid) {
Iterator<App> i = mApps.iterator();
- while(i.hasNext()) {
+ while (i.hasNext()) {
App entry = i.next();
if (entry.uuid.equals(uuid)) return entry;
}
@@ -224,12 +321,43 @@
}
/**
+ * Get an application context by the calling Apps name.
+ */
+ App getByName(String name) {
+ Iterator<App> i = mApps.iterator();
+ while (i.hasNext()) {
+ App entry = i.next();
+ if (entry.name.equals(name)) return entry;
+ }
+ Log.e(TAG, "Context not found for name " + name);
+ return null;
+ }
+
+ /**
+ * Get Logging info by ID
+ */
+ ScanStats getScanStatsById(int id) {
+ App temp = getById(id);
+ if (temp != null) {
+ return mScanStats.get(temp.name);
+ }
+ return null;
+ }
+
+ /**
+ * Get Logging info by application name
+ */
+ ScanStats getScanStatsByName(String name) {
+ return mScanStats.get(name);
+ }
+
+ /**
* Get the device addresses for all connected devices
*/
Set<String> getConnectedDevices() {
Set<String> addresses = new HashSet<String>();
Iterator<Connection> i = mConnections.iterator();
- while(i.hasNext()) {
+ while (i.hasNext()) {
Connection connection = i.next();
addresses.add(connection.address);
}
@@ -241,7 +369,7 @@
*/
App getByConnId(int connId) {
Iterator<Connection> ii = mConnections.iterator();
- while(ii.hasNext()) {
+ while (ii.hasNext()) {
Connection connection = ii.next();
if (connection.connId == connId){
return getById(connection.appId);
@@ -258,7 +386,7 @@
if (entry == null) return null;
Iterator<Connection> i = mConnections.iterator();
- while(i.hasNext()) {
+ while (i.hasNext()) {
Connection connection = i.next();
if (connection.address.equals(address) && connection.appId == id)
return connection.connId;
@@ -271,7 +399,7 @@
*/
String addressByConnId(int connId) {
Iterator<Connection> i = mConnections.iterator();
- while(i.hasNext()) {
+ while (i.hasNext()) {
Connection connection = i.next();
if (connection.connId == connId) return connection.address;
}
@@ -281,7 +409,7 @@
List<Connection> getConnectionByApp(int appId) {
List<Connection> currentConnections = new ArrayList<Connection>();
Iterator<Connection> i = mConnections.iterator();
- while(i.hasNext()) {
+ while (i.hasNext()) {
Connection connection = i.next();
if (connection.appId == appId)
currentConnections.add(connection);
@@ -295,7 +423,7 @@
void clear() {
synchronized (mApps) {
Iterator<App> i = mApps.iterator();
- while(i.hasNext()) {
+ while (i.hasNext()) {
App entry = i.next();
entry.unlinkToDeath();
i.remove();
@@ -322,21 +450,93 @@
* Logs debug information.
*/
void dump(StringBuilder sb) {
- sb.append(" Entries: " + mApps.size() + "\n");
+ long currTime = System.currentTimeMillis();
- Iterator<App> i = mApps.iterator();
- while(i.hasNext()) {
- App entry = i.next();
- List<Connection> connections = getConnectionByApp(entry.id);
+ sb.append(" Entries: " + mScanStats.size() + "\n\n");
- sb.append("\n Application Id: " + entry.id + "\n");
- sb.append(" UUID: " + entry.uuid + "\n");
- sb.append(" Connections: " + connections.size() + "\n");
+ Iterator<Map.Entry<String,ScanStats>> i = mScanStats.entrySet().iterator();
+ while (i.hasNext()) {
+ Map.Entry<String, ScanStats> entry = i.next();
- Iterator<Connection> ii = connections.iterator();
- while(ii.hasNext()) {
- Connection connection = ii.next();
- sb.append(" " + connection.connId + ": " + connection.address + "\n");
+ String name = entry.getKey();
+ ScanStats scanStats = entry.getValue();
+
+ long maxScanTime = scanStats.maxScanTime;
+ long minScanTime = scanStats.minScanTime;
+ long currScanTime = 0;
+
+ if (scanStats.isScanning) {
+ currScanTime = currTime - scanStats.startTime;
+ minScanTime = Math.min(currScanTime, minScanTime);
+ maxScanTime = Math.max(currScanTime, maxScanTime);
+ }
+
+ if (minScanTime == Long.MAX_VALUE) {
+ minScanTime = 0;
+ }
+
+ long lastScan = 0;
+ if (scanStats.stopTime != 0) {
+ lastScan = currTime - scanStats.stopTime;
+ }
+
+ long avgScanTime = 0;
+ if (scanStats.scansStarted > 0) {
+ avgScanTime = (scanStats.totalScanTime + currScanTime) /
+ scanStats.scansStarted;
+ }
+
+ sb.append(" Application Name: " + name);
+ if (scanStats.isRegistered) sb.append(" (Registered)");
+ sb.append("\n");
+
+ sb.append(" LE scans (started/stopped) : " +
+ scanStats.scansStarted + " / " +
+ scanStats.scansStopped + "\n");
+ sb.append(" Scan time in ms (min/max/avg) : " +
+ minScanTime + " / " +
+ maxScanTime + " / " +
+ avgScanTime + "\n");
+
+ sb.append(" Time since last scan ended in ms : " + lastScan + "\n");
+
+ sb.append(" Last " + scanStats.lastScans.size() +
+ " scans in ms (oldest first): ");
+ for (Long time : scanStats.lastScans) {
+ sb.append(time + " ");
+ }
+ sb.append("\n");
+
+ if (scanStats.isRegistered) {
+ App appEntry = getByName(name);
+ sb.append(" Application ID : " +
+ appEntry.id + "\n");
+ sb.append(" UUID : " +
+ appEntry.uuid + "\n");
+
+ if (scanStats.isScanning) {
+ sb.append(" Current scan duration : " +
+ currScanTime + "\n");
+ }
+
+ List<Connection> connections = getConnectionByApp(appEntry.id);
+ sb.append(" Connections: " + connections.size() + "\n");
+
+ Iterator<Connection> ii = connections.iterator();
+ while(ii.hasNext()) {
+ Connection connection = ii.next();
+ sb.append(" " + connection.connId + ": " +
+ connection.address + "\n");
+ }
+ }
+ sb.append("\n");
+ }
+ }
+
+ void dumpProto(BluetoothProto.BluetoothLog proto) {
+ synchronized(mScanEvents) {
+ for (BluetoothProto.ScanEvent event : mScanEvents) {
+ proto.addScanEvent(event);
}
}
}
diff --git a/src/com/android/bluetooth/gatt/GattService.java b/src/com/android/bluetooth/gatt/GattService.java
index 4847c53..ed0a1d9 100644
--- a/src/com/android/bluetooth/gatt/GattService.java
+++ b/src/com/android/bluetooth/gatt/GattService.java
@@ -39,13 +39,14 @@
import android.os.ParcelUuid;
import android.os.RemoteException;
import android.os.SystemClock;
-import android.os.UserHandle;
+import android.os.WorkSource;
import android.provider.Settings;
import android.util.Log;
import com.android.bluetooth.R;
import com.android.bluetooth.Utils;
import com.android.bluetooth.btservice.AdapterService;
+import com.android.bluetooth.btservice.BluetoothProto;
import com.android.bluetooth.btservice.ProfileService;
import com.android.bluetooth.util.NumberUtils;
import com.android.internal.annotations.VisibleForTesting;
@@ -90,6 +91,10 @@
UUID.fromString("00002A4D-0000-1000-8000-00805F9B34FB")
};
+ private static final UUID[] FIDO_UUIDS = {
+ UUID.fromString("0000FFFD-0000-1000-8000-00805F9B34FB") // U2F
+ };
+
/**
* Search queue to serialize remote onbject inspection.
*/
@@ -310,10 +315,12 @@
@Override
public void startScan(int appIf, boolean isServer, ScanSettings settings,
- List<ScanFilter> filters, List storages, String callingPackage) {
+ List<ScanFilter> filters, WorkSource workSource, List storages,
+ String callingPackage) {
GattService service = getService();
if (service == null) return;
- service.startScan(appIf, isServer, settings, filters, storages, callingPackage);
+ service.startScan(appIf, isServer, settings, filters, workSource, storages,
+ callingPackage);
}
public void stopScan(int appIf, boolean isServer) {
@@ -850,7 +857,7 @@
+ ", charUuid=" + charUuid + ", length=" + data.length);
- if (isHidUuid(charUuid) &&
+ if (isRestrictedCharUuid(charUuid) || isRestrictedSrvcUuid(srvcUuid) &&
(0 != checkCallingOrSelfPermission(BLUETOOTH_PRIVILEGED))) {
return;
}
@@ -1372,19 +1379,27 @@
}
void startScan(int appIf, boolean isServer, ScanSettings settings,
- List<ScanFilter> filters, List<List<ResultStorageDescriptor>> storages,
- String callingPackage) {
+ List<ScanFilter> filters, WorkSource workSource,
+ List<List<ResultStorageDescriptor>> storages, String callingPackage) {
if (DBG) Log.d(TAG, "start scan with filters");
enforceAdminPermission();
if (needsPrivilegedPermissionForScan(settings)) {
enforcePrivilegedPermission();
}
- final ScanClient scanClient = new ScanClient(appIf, isServer, settings, filters, storages);
+ if (workSource != null) {
+ enforceImpersonatationPermission();
+ } else {
+ // Blame the caller if the work source is unspecified.
+ workSource = new WorkSource(Binder.getCallingUid(), callingPackage);
+ }
+ final ScanClient scanClient = new ScanClient(appIf, isServer, settings, filters, workSource,
+ storages);
scanClient.hasLocationPermission = Utils.checkCallerHasLocationPermission(this, mAppOps,
callingPackage);
scanClient.hasPeersMacAddressPermission = Utils.checkCallerHasPeersMacAddressPermission(
this);
scanClient.legacyForegroundApp = Utils.isLegacyForegroundApp(this, callingPackage);
+ mClientMap.getScanStatsById(appIf).startScan();
mScanManager.startScan(scanClient);
}
@@ -1399,6 +1414,7 @@
int scanQueueSize = mScanManager.getBatchScanQueue().size() +
mScanManager.getRegularScanQueue().size();
if (DBG) Log.d(TAG, "stopScan() - queue size =" + scanQueueSize);
+ mClientMap.getScanStatsById(client.clientIf).stopScan();
mScanManager.stopScan(client);
}
@@ -1427,7 +1443,7 @@
enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
if (DBG) Log.d(TAG, "registerClient() - UUID=" + uuid);
- mClientMap.add(uuid, callback);
+ mClientMap.add(uuid, callback, this);
gattClientRegisterAppNative(uuid.getLeastSignificantBits(),
uuid.getMostSignificantBits());
}
@@ -1515,7 +1531,9 @@
int srvcInstanceId, UUID srvcUuid,
int charInstanceId, UUID charUuid, int authReq) {
enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
- if (isHidUuid(charUuid)) enforcePrivilegedPermission();
+ if (isRestrictedCharUuid(charUuid) || isRestrictedSrvcUuid(srvcUuid)) {
+ enforcePrivilegedPermission();
+ }
if (VDBG) Log.d(TAG, "readCharacteristic() - address=" + address);
@@ -1535,7 +1553,9 @@
int charInstanceId, UUID charUuid, int writeType,
int authReq, byte[] value) {
enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
- if (isHidUuid(charUuid)) enforcePrivilegedPermission();
+ if (isRestrictedCharUuid(charUuid) || isRestrictedSrvcUuid(srvcUuid)) {
+ enforcePrivilegedPermission();
+ }
if (VDBG) Log.d(TAG, "writeCharacteristic() - address=" + address);
@@ -1558,7 +1578,9 @@
int descrInstanceId, UUID descrUuid,
int authReq) {
enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
- if (isHidUuid(charUuid)) enforcePrivilegedPermission();
+ if (isRestrictedCharUuid(charUuid) || isRestrictedSrvcUuid(srvcUuid)) {
+ enforcePrivilegedPermission();
+ }
if (VDBG) Log.d(TAG, "readDescriptor() - address=" + address);
@@ -1582,7 +1604,9 @@
int descrInstanceId, UUID descrUuid,
int writeType, int authReq, byte[] value) {
enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
- if (isHidUuid(charUuid)) enforcePrivilegedPermission();
+ if (isRestrictedCharUuid(charUuid) || isRestrictedSrvcUuid(srvcUuid)) {
+ enforcePrivilegedPermission();
+ }
if (VDBG) Log.d(TAG, "writeDescriptor() - address=" + address);
@@ -1623,7 +1647,9 @@
int charInstanceId, UUID charUuid,
boolean enable) {
enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
- if (isHidUuid(charUuid)) enforcePrivilegedPermission();
+ if (isRestrictedCharUuid(charUuid) || isRestrictedSrvcUuid(srvcUuid)) {
+ enforcePrivilegedPermission();
+ }
if (DBG) Log.d(TAG, "registerForNotification() - address=" + address + " enable: " + enable);
@@ -1955,7 +1981,7 @@
enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
if (DBG) Log.d(TAG, "registerServer() - UUID=" + uuid);
- mServerMap.add(uuid, callback);
+ mServerMap.add(uuid, callback, this);
gattServerRegisterAppNative(uuid.getLeastSignificantBits(),
uuid.getMostSignificantBits());
}
@@ -2097,6 +2123,14 @@
* Private functions
*************************************************************************/
+ private boolean isRestrictedCharUuid(final UUID charUuid) {
+ return isHidUuid(charUuid);
+ }
+
+ private boolean isRestrictedSrvcUuid(final UUID srvcUuid) {
+ return isFidoUUID(srvcUuid);
+ }
+
private boolean isHidUuid(final UUID uuid) {
for (UUID hid_uuid : HID_UUIDS) {
if (hid_uuid.equals(uuid)) return true;
@@ -2104,6 +2138,13 @@
return false;
}
+ private boolean isFidoUUID(final UUID uuid) {
+ for (UUID fido_uuid : FIDO_UUIDS) {
+ if (fido_uuid.equals(uuid)) return true;
+ }
+ return false;
+ }
+
private int getDeviceType(BluetoothDevice device) {
int type = gattClientGetDeviceTypeNative(device.getAddress());
if (DBG) Log.d(TAG, "getDeviceType() - device=" + device
@@ -2137,8 +2178,29 @@
"Need BLUETOOTH_PRIVILEGED permission");
}
+ // Enforce caller has UPDATE_DEVICE_STATS permission, which allows the caller to blame other
+ // apps for Bluetooth usage. A {@link SecurityException} will be thrown if the caller app does
+ // not have UPDATE_DEVICE_STATS permission.
+ private void enforceImpersonatationPermission() {
+ enforceCallingOrSelfPermission(android.Manifest.permission.UPDATE_DEVICE_STATS,
+ "Need UPDATE_DEVICE_STATS permission");
+ }
+
private void continueSearch(int connId, int status) throws RemoteException {
- if (status == 0 && !mSearchQueue.isEmpty()) {
+
+ // Search is complete when there was error, or nothing more to process
+ if (status != 0 || mSearchQueue.isEmptyFor(connId)) {
+ // In case we complete because of error, clean up
+ // any remaining operations for this connection.
+ mSearchQueue.removeConnId(connId);
+
+ ClientMap.App app = mClientMap.getByConnId(connId);
+ if (app != null) {
+ app.callback.onSearchComplete(mClientMap.addressByConnId(connId), status);
+ }
+ }
+
+ if (!mSearchQueue.isEmpty()) {
SearchQueue.Entry svc = mSearchQueue.pop();
if (svc.charUuidLsb == 0) {
@@ -2151,11 +2213,6 @@
svc.srvcInstId, svc.srvcUuidLsb, svc.srvcUuidMsb,
svc.charInstId, svc.charUuidLsb, svc.charUuidMsb, 0, 0, 0);
}
- } else {
- ClientMap.App app = mClientMap.getByConnId(connId);
- if (app != null) {
- app.callback.onSearchComplete(mClientMap.addressByConnId(connId), status);
- }
}
}
@@ -2330,6 +2387,12 @@
mHandleMap.dump(sb);
}
+ @Override
+ public void dumpProto(BluetoothProto.BluetoothLog proto) {
+ mClientMap.dumpProto(proto);
+ mServerMap.dumpProto(proto);
+ }
+
/**************************************************************************
* GATT Test functions
*************************************************************************/
diff --git a/src/com/android/bluetooth/gatt/ScanClient.java b/src/com/android/bluetooth/gatt/ScanClient.java
index 64d3e1f..af61c46 100644
--- a/src/com/android/bluetooth/gatt/ScanClient.java
+++ b/src/com/android/bluetooth/gatt/ScanClient.java
@@ -19,6 +19,7 @@
import android.bluetooth.le.ResultStorageDescriptor;
import android.bluetooth.le.ScanFilter;
import android.bluetooth.le.ScanSettings;
+import android.os.WorkSource;
import java.util.List;
import java.util.Objects;
@@ -43,34 +44,45 @@
// Pre-M apps are allowed to get scan results even if location is disabled
boolean legacyForegroundApp;
+ // Who is responsible for this scan.
+ WorkSource workSource;
+
private static final ScanSettings DEFAULT_SCAN_SETTINGS = new ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build();
ScanClient(int appIf, boolean isServer) {
- this(appIf, isServer, new UUID[0], DEFAULT_SCAN_SETTINGS, null, null);
+ this(appIf, isServer, new UUID[0], DEFAULT_SCAN_SETTINGS, null, null, null);
}
ScanClient(int appIf, boolean isServer, UUID[] uuids) {
- this(appIf, isServer, uuids, DEFAULT_SCAN_SETTINGS, null, null);
+ this(appIf, isServer, uuids, DEFAULT_SCAN_SETTINGS, null, null, null);
}
ScanClient(int appIf, boolean isServer, ScanSettings settings,
List<ScanFilter> filters) {
- this(appIf, isServer, new UUID[0], settings, filters, null);
+ this(appIf, isServer, new UUID[0], settings, filters, null, null);
}
ScanClient(int appIf, boolean isServer, ScanSettings settings,
List<ScanFilter> filters, List<List<ResultStorageDescriptor>> storages) {
- this(appIf, isServer, new UUID[0], settings, filters, storages);
+ this(appIf, isServer, new UUID[0], settings, filters, null, storages);
+ }
+
+ ScanClient(int appIf, boolean isServer, ScanSettings settings,
+ List<ScanFilter> filters, WorkSource workSource,
+ List<List<ResultStorageDescriptor>> storages) {
+ this(appIf, isServer, new UUID[0], settings, filters, workSource, storages);
}
private ScanClient(int appIf, boolean isServer, UUID[] uuids, ScanSettings settings,
- List<ScanFilter> filters, List<List<ResultStorageDescriptor>> storages) {
+ List<ScanFilter> filters, WorkSource workSource,
+ List<List<ResultStorageDescriptor>> storages) {
this.clientIf = appIf;
this.isServer = isServer;
this.uuids = uuids;
this.settings = settings;
this.filters = filters;
+ this.workSource = workSource;
this.storages = storages;
}
diff --git a/src/com/android/bluetooth/gatt/ScanManager.java b/src/com/android/bluetooth/gatt/ScanManager.java
index 4ddbac0..8bf1419 100644
--- a/src/com/android/bluetooth/gatt/ScanManager.java
+++ b/src/com/android/bluetooth/gatt/ScanManager.java
@@ -31,11 +31,13 @@
import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
+import android.os.ServiceManager;
import android.os.SystemClock;
import android.util.Log;
import com.android.bluetooth.Utils;
import com.android.bluetooth.btservice.AdapterService;
+import com.android.internal.app.IBatteryStats;
import java.util.ArrayDeque;
import java.util.Deque;
@@ -77,6 +79,7 @@
private Integer curUsedTrackableAdvertisements;
private GattService mService;
+ private IBatteryStats mBatteryStats;
private BroadcastReceiver mBatchAlarmReceiver;
private boolean mBatchAlarmReceiverRegistered;
private ScanNative mScanNative;
@@ -96,6 +99,7 @@
}
void start() {
+ mBatteryStats = IBatteryStats.Stub.asInterface(ServiceManager.getService("batterystats"));
HandlerThread thread = new HandlerThread("BluetoothScanManager");
thread.start();
mHandler = new ClientHandler(thread.getLooper());
@@ -217,17 +221,37 @@
if (!mScanNative.isOpportunisticScanClient(client)) {
mScanNative.configureRegularScanParams();
}
+
+ // Update BatteryStats with this workload.
+ try {
+ mBatteryStats.noteBleScanStarted(client.workSource);
+ } catch (RemoteException e) {
+ /* ignore */
+ }
}
}
void handleStopScan(ScanClient client) {
Utils.enforceAdminPermission(mService);
if (client == null) return;
+
+ // The ScanClient passed in just holds the clientIf. We retrieve the real client,
+ // which may have workSource set.
+ client = mScanNative.getClient(client.clientIf);
+ if (client == null) return;
+
if (mRegularScanClients.contains(client)) {
mScanNative.stopRegularScan(client);
if (!mScanNative.isOpportunisticScanClient(client)) {
mScanNative.configureRegularScanParams();
}
+
+ // Update BatteryStats with this workload.
+ try {
+ mBatteryStats.noteBleScanStopped(client.workSource);
+ } catch (RemoteException e) {
+ /* ignore */
+ }
} else {
mScanNative.stopBatchScan(client);
}
@@ -598,7 +622,6 @@
void stopRegularScan(ScanClient client) {
// Remove scan filters and recycle filter indices.
- client = getClient(client.clientIf);
if (client == null) return;
int deliveryMode = getDeliveryMode(client);
if (deliveryMode == DELIVERY_MODE_ON_FOUND_LOST) {
diff --git a/src/com/android/bluetooth/gatt/SearchQueue.java b/src/com/android/bluetooth/gatt/SearchQueue.java
index 3064a51..c784415 100644
--- a/src/com/android/bluetooth/gatt/SearchQueue.java
+++ b/src/com/android/bluetooth/gatt/SearchQueue.java
@@ -86,6 +86,16 @@
return mEntries.isEmpty();
}
+ boolean isEmptyFor(int connId) {
+ for (Iterator<Entry> it = mEntries.iterator(); it.hasNext();) {
+ Entry entry = it.next();
+ if (entry.connId == connId) {
+ return false;
+ }
+ }
+ return true;
+ }
+
void clear() {
mEntries.clear();
}
diff --git a/src/com/android/bluetooth/hfp/HeadsetPhoneState.java b/src/com/android/bluetooth/hfp/HeadsetPhoneState.java
index 33aea70..bc9f56f 100644
--- a/src/com/android/bluetooth/hfp/HeadsetPhoneState.java
+++ b/src/com/android/bluetooth/hfp/HeadsetPhoneState.java
@@ -117,9 +117,9 @@
}
private void startListenForPhoneState() {
- if (!mListening && mSlcReady) {
+ if (!mListening && mSlcReady && mTelephonyManager != null) {
- int subId = SubscriptionManager.getDefaultSubId();
+ int subId = SubscriptionManager.getDefaultSubscriptionId();
if (SubscriptionManager.isValidSubscriptionId(subId)) {
mPhoneStateListener = getPhoneStateListener(subId);
@@ -133,7 +133,7 @@
}
private void stopListenForPhoneState() {
- if (mListening) {
+ if (mListening && mTelephonyManager != null) {
mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
mListening = false;
diff --git a/src/com/android/bluetooth/hfpclient/HeadsetClientService.java b/src/com/android/bluetooth/hfpclient/HeadsetClientService.java
index b0e026b..6300d01 100644
--- a/src/com/android/bluetooth/hfpclient/HeadsetClientService.java
+++ b/src/com/android/bluetooth/hfpclient/HeadsetClientService.java
@@ -98,9 +98,16 @@
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
+ // We handle the volume changes for Voice calls here since HFP audio volume control does
+ // not go through audio manager (audio mixer). We check if the voice call volume has
+ // changed and subsequently change the SCO volume see
+ // ({@link HeadsetClientStateMachine#SET_SPEAKER_VOLUME} in
+ // {@link HeadsetClientStateMachine} for details.
if (action.equals(AudioManager.VOLUME_CHANGED_ACTION)) {
+ Log.d(TAG, "Volume changed for stream: " +
+ intent.getExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE));
int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1);
- if (streamType == AudioManager.STREAM_BLUETOOTH_SCO) {
+ if (streamType == AudioManager.STREAM_VOICE_CALL) {
int streamValue = intent
.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, -1);
int streamPrevValue = intent.getIntExtra(
diff --git a/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java b/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java
index 9ae7ba3..162a536 100644
--- a/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java
+++ b/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java
@@ -105,6 +105,9 @@
// special action to handle terminating specific call from multiparty call
static final int TERMINATE_SPECIFIC_CALL = 53;
+ static final int MAX_HFP_SCO_VOICE_CALL_VOLUME = 15; // HFP 1.5 spec.
+ static final int MIN_HFP_SCO_VOICE_CALL_VOLUME = 1; // HFP 1.5 spec.
+
private static final int STACK_EVENT = 100;
private final Disconnected mDisconnected;
@@ -135,6 +138,9 @@
private int mVoiceRecognitionActive;
private int mInBandRingtone;
+ private int mMaxAmVcVol;
+ private int mMinAmVcVol;
+
// queue of send actions (pair action, action_data)
private Queue<Pair<Integer, Object>> mQueuedActions;
@@ -307,15 +313,6 @@
if (state == c.getState()) {
return;
}
- //abandon focus here
- if (state == BluetoothHeadsetClientCall.CALL_STATE_TERMINATED) {
- if (mAudioManager.getMode() != AudioManager.MODE_NORMAL) {
- mAudioManager.setMode(AudioManager.MODE_NORMAL);
- Log.d(TAG, "abandonAudioFocus ");
- // abandon audio focus after the mode has been set back to normal
- mAudioManager.abandonAudioFocusForCall();
- }
- }
c.setState(state);
sendCallChangedIntent(c);
}
@@ -1227,6 +1224,9 @@
mIndicatorCallSetup = -1;
mIndicatorCallHeld = -1;
+ mMaxAmVcVol = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL);
+ mMinAmVcVol = mAudioManager.getStreamMinVolume(AudioManager.STREAM_VOICE_CALL);
+
mOperatorName = null;
mSubscriberInfo = null;
@@ -1274,6 +1274,25 @@
}
}
+ private int hfToAmVol(int hfVol) {
+ int amRange = mMaxAmVcVol - mMinAmVcVol;
+ int hfRange = MAX_HFP_SCO_VOICE_CALL_VOLUME - MIN_HFP_SCO_VOICE_CALL_VOLUME;
+ int amOffset =
+ (amRange * (hfVol - MIN_HFP_SCO_VOICE_CALL_VOLUME)) / hfRange;
+ int amVol = mMinAmVcVol + amOffset;
+ Log.d(TAG, "HF -> AM " + hfVol + " " + amVol);
+ return amVol;
+ }
+
+ private int amToHfVol(int amVol) {
+ int amRange = mMaxAmVcVol - mMinAmVcVol;
+ int hfRange = MAX_HFP_SCO_VOICE_CALL_VOLUME - MIN_HFP_SCO_VOICE_CALL_VOLUME;
+ int hfOffset = (hfRange * (amVol - mMinAmVcVol)) / amRange;
+ int hfVol = MIN_HFP_SCO_VOICE_CALL_VOLUME + hfOffset;
+ Log.d(TAG, "AM -> HF " + amVol + " " + hfVol);
+ return hfVol;
+ }
+
private class Disconnected extends State {
@Override
public void enter() {
@@ -1493,9 +1512,11 @@
}
transitionTo(mConnected);
- // TODO get max stream volume and scale 0-15
- sendMessage(obtainMessage(HeadsetClientStateMachine.SET_SPEAKER_VOLUME,
- mAudioManager.getStreamVolume(AudioManager.STREAM_BLUETOOTH_SCO), 0));
+ int amVol = mAudioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL);
+ sendMessage(
+ obtainMessage(HeadsetClientStateMachine.SET_SPEAKER_VOLUME, amVol, 0));
+ // Mic is either in ON state (full volume) or OFF state. There is no way in
+ // Android to change the MIC volume.
sendMessage(obtainMessage(HeadsetClientStateMachine.SET_MIC_VOLUME,
mAudioManager.isMicrophoneMute() ? 0 : 15, 0));
@@ -1615,6 +1636,7 @@
}
}
break;
+ // Called only for Mute/Un-mute - Mic volume change is not allowed.
case SET_MIC_VOLUME:
if (mVgmFromStack) {
mVgmFromStack = false;
@@ -1625,13 +1647,16 @@
}
break;
case SET_SPEAKER_VOLUME:
- Log.d(TAG,"Volume is set to " + message.arg1);
- mAudioManager.setParameters("hfp_volume=" + message.arg1);
+ // This message should always contain the volume in AudioManager max normalized.
+ int amVol = message.arg1;
+ int hfVol = amToHfVol(amVol);
+ Log.d(TAG,"HF volume is set to " + hfVol);
+ mAudioManager.setParameters("hfp_volume=" + hfVol);
if (mVgsFromStack) {
mVgsFromStack = false;
break;
}
- if (setVolumeNative(HeadsetClientHalConstants.VOLUME_TYPE_SPK, message.arg1)) {
+ if (setVolumeNative(HeadsetClientHalConstants.VOLUME_TYPE_SPK, hfVol)) {
addQueuedAction(SET_SPEAKER_VOLUME);
}
break;
@@ -1841,11 +1866,17 @@
break;
case EVENT_TYPE_VOLUME_CHANGED:
if (event.valueInt == HeadsetClientHalConstants.VOLUME_TYPE_SPK) {
- mAudioManager.setStreamVolume(AudioManager.STREAM_BLUETOOTH_SCO,
- event.valueInt2, AudioManager.FLAG_SHOW_UI);
+ Log.d(TAG, "AM volume set to " +
+ hfToAmVol(event.valueInt2));
+ mAudioManager.setStreamVolume(
+ AudioManager.STREAM_VOICE_CALL,
+ hfToAmVol(event.valueInt2),
+ AudioManager.FLAG_SHOW_UI);
mVgsFromStack = true;
- } else if (event.valueInt == HeadsetClientHalConstants.VOLUME_TYPE_MIC) {
+ } else if (event.valueInt ==
+ HeadsetClientHalConstants.VOLUME_TYPE_MIC) {
mAudioManager.setMicrophoneMute(event.valueInt2 == 0);
+
mVgmFromStack = true;
}
break;
@@ -1965,6 +1996,9 @@
mService.sendBroadcast(intent, ProfileService.BLUETOOTH_PERM);
break;
case EVENT_TYPE_RING_INDICATION:
+ // Ringing is not handled at this indication and rather should be
+ // implemented (by the client of this service). Use the
+ // CALL_STATE_INCOMING (and similar) handle ringing.
break;
default:
Log.e(TAG, "Unknown stack event: " + event.type);
@@ -2028,23 +2062,21 @@
break;
}
+ // Audio state is split in two parts, the audio focus is maintained by the
+ // entity exercising this service (typically the Telecom stack) and audio
+ // routing is handled by the bluetooth stack itself. The only reason to do so is
+ // because Bluetooth SCO connection from the HF role is not entirely supported
+ // for routing and volume purposes.
+ // NOTE: All calls here are routed via the setParameters which changes the
+ // routing at the Audio HAL level.
mAudioState = BluetoothHeadsetClient.STATE_AUDIO_CONNECTED;
- // request audio focus for call
- int newAudioMode = AudioManager.MODE_IN_CALL;
- int currMode = mAudioManager.getMode();
- if (currMode != newAudioMode) {
- // request audio focus before setting the new mode
- mAudioManager.requestAudioFocusForCall(AudioManager.STREAM_VOICE_CALL,
- AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
- Log.d(TAG, "setAudioMode Setting audio mode from "
- + currMode + " to " + newAudioMode);
- mAudioManager.setMode(newAudioMode);
- }
// We need to set the volume after switching into HFP mode as some Audio HALs
// reset the volume to a known-default on mode switch.
- final int volume =
- mAudioManager.getStreamVolume(AudioManager.STREAM_BLUETOOTH_SCO);
+ final int amVol =
+ mAudioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL);
+ final int hfVol = amToHfVol(amVol);
+
Log.d(TAG,"hfp_enable=true");
Log.d(TAG,"mAudioWbs is " + mAudioWbs);
if (mAudioWbs) {
@@ -2055,8 +2087,9 @@
Log.d(TAG,"Setting sampling rate as 8000");
mAudioManager.setParameters("hfp_set_sampling_rate=8000");
}
+ Log.d(TAG, "hf_volume " + hfVol);
mAudioManager.setParameters("hfp_enable=true");
- mAudioManager.setParameters("hfp_volume=" + volume);
+ mAudioManager.setParameters("hfp_volume=" + hfVol);
transitionTo(mAudioOn);
break;
case HeadsetClientHalConstants.AUDIO_STATE_CONNECTING:
@@ -2088,9 +2121,6 @@
@Override
public void enter() {
Log.d(TAG, "Enter AudioOn: " + getCurrentMessage().what);
-
- mAudioManager.setStreamSolo(AudioManager.STREAM_BLUETOOTH_SCO, true);
-
broadcastAudioState(mCurrentDevice, BluetoothHeadsetClient.STATE_AUDIO_CONNECTED,
BluetoothHeadsetClient.STATE_AUDIO_CONNECTING);
}
@@ -2124,13 +2154,6 @@
*/
if (disconnectAudioNative(getByteAddress(mCurrentDevice))) {
mAudioState = BluetoothHeadsetClient.STATE_AUDIO_DISCONNECTED;
- //abandon audio focus
- if (mAudioManager.getMode() != AudioManager.MODE_NORMAL) {
- mAudioManager.setMode(AudioManager.MODE_NORMAL);
- Log.d(TAG, "abandonAudioFocus");
- // abandon audio focus after the mode has been set back to normal
- mAudioManager.abandonAudioFocusForCall();
- }
Log.d(TAG,"hfp_enable=false");
mAudioManager.setParameters("hfp_enable=false");
broadcastAudioState(mCurrentDevice,
@@ -2197,13 +2220,10 @@
case HeadsetClientHalConstants.AUDIO_STATE_DISCONNECTED:
if (mAudioState != BluetoothHeadsetClient.STATE_AUDIO_DISCONNECTED) {
mAudioState = BluetoothHeadsetClient.STATE_AUDIO_DISCONNECTED;
- //abandon audio focus for call
- if (mAudioManager.getMode() != AudioManager.MODE_NORMAL) {
- mAudioManager.setMode(AudioManager.MODE_NORMAL);
- Log.d(TAG, "abandonAudioFocus");
- // abandon audio focus after the mode has been set back to normal
- mAudioManager.abandonAudioFocusForCall();
- }
+ // Audio focus may still be held by the entity controlling the actual call
+ // (such as Telecom) and hence this will still keep the call around, there
+ // is not much we can do here since dropping the call without user consent
+ // even if the audio connection snapped may not be a good idea.
Log.d(TAG,"hfp_enable=false");
mAudioManager.setParameters("hfp_enable=false");
broadcastAudioState(device,
@@ -2222,8 +2242,6 @@
@Override
public void exit() {
Log.d(TAG, "Exit AudioOn: " + getCurrentMessage().what);
-
- mAudioManager.setStreamSolo(AudioManager.STREAM_BLUETOOTH_SCO, false);
}
}
diff --git a/src/com/android/bluetooth/map/BluetoothMapContentObserver.java b/src/com/android/bluetooth/map/BluetoothMapContentObserver.java
index 9aae8cf..f465e5f 100644
--- a/src/com/android/bluetooth/map/BluetoothMapContentObserver.java
+++ b/src/com/android/bluetooth/map/BluetoothMapContentObserver.java
@@ -48,7 +48,6 @@
import android.telephony.SmsMessage;
import android.telephony.TelephonyManager;
import android.text.format.DateUtils;
-import android.util.EventLog;
import android.util.Log;
import android.util.Xml;
import android.text.TextUtils;
@@ -3231,7 +3230,6 @@
(context.checkCallingOrSelfPermission("android.Manifest.permission.WRITE_SMS")
!= PackageManager.PERMISSION_GRANTED)) {
Log.w(TAG, "actionSmsSentDisconnected: Not allowed to delete SMS/MMS messages");
- EventLog.writeEvent(0x534e4554, "b/22343270", Binder.getCallingUid(), "");
return;
}
diff --git a/src/com/android/bluetooth/map/BluetoothMapUtils.java b/src/com/android/bluetooth/map/BluetoothMapUtils.java
index 66ceecc..f10c4ec 100755
--- a/src/com/android/bluetooth/map/BluetoothMapUtils.java
+++ b/src/com/android/bluetooth/map/BluetoothMapUtils.java
@@ -394,15 +394,16 @@
static public byte[] truncateUtf8StringToBytearray(String utf8String, int maxLength)
throws UnsupportedEncodingException {
- byte[] utf8Bytes = null;
+ byte[] utf8Bytes = new byte[utf8String.length() + 1];
try {
- utf8Bytes = utf8String.getBytes("UTF-8");
+ System.arraycopy(utf8String.getBytes("UTF-8"), 0,
+ utf8Bytes, 0, utf8String.length());
} catch (UnsupportedEncodingException e) {
Log.e(TAG,"truncateUtf8StringToBytearray: getBytes exception ", e);
throw e;
}
- if (utf8Bytes.length > (maxLength - 1)) {
+ if (utf8Bytes.length > maxLength) {
/* if 'continuation' byte is in place 200,
* then strip previous bytes until utf-8 start byte is found */
if ( (utf8Bytes[maxLength - 1] & 0xC0) == 0x80 ) {
diff --git a/src/com/android/bluetooth/opp/BluetoothOppNotification.java b/src/com/android/bluetooth/opp/BluetoothOppNotification.java
index 32c8b52..da7a0c6 100644
--- a/src/com/android/bluetooth/opp/BluetoothOppNotification.java
+++ b/src/com/android/bluetooth/opp/BluetoothOppNotification.java
@@ -41,10 +41,12 @@
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
+import android.text.format.Formatter;
import android.util.Log;
import android.os.Handler;
import android.os.Message;
import android.os.Process;
+
import java.util.HashMap;
/**
@@ -495,37 +497,42 @@
}
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
- CharSequence title =
- mContext.getText(R.string.incoming_file_confirm_Notification_title);
- CharSequence caption = mContext
- .getText(R.string.incoming_file_confirm_Notification_caption);
- int id = cursor.getInt(cursor.getColumnIndexOrThrow(BluetoothShare._ID));
- long timeStamp = cursor.getLong(cursor.getColumnIndexOrThrow(BluetoothShare.TIMESTAMP));
- Uri contentUri = Uri.parse(BluetoothShare.CONTENT_URI + "/" + id);
+ BluetoothOppTransferInfo info = new BluetoothOppTransferInfo();
+ BluetoothOppUtility.fillRecord(mContext, cursor, info);
+ Uri contentUri = Uri.parse(BluetoothShare.CONTENT_URI + "/" + info.mID);
+ Intent baseIntent = new Intent().setDataAndNormalize(contentUri)
+ .setClassName(Constants.THIS_PACKAGE_NAME, BluetoothOppReceiver.class.getName());
- Notification n = new Notification();
- n.icon = R.drawable.bt_incomming_file_notification;
- n.flags |= Notification.FLAG_ONLY_ALERT_ONCE;
- n.flags |= Notification.FLAG_ONGOING_EVENT;
- n.defaults = Notification.DEFAULT_SOUND;
- n.tickerText = title;
-
- Intent intent = new Intent(Constants.ACTION_INCOMING_FILE_CONFIRM);
- intent.setClassName(Constants.THIS_PACKAGE_NAME, BluetoothOppReceiver.class.getName());
- intent.setDataAndNormalize(contentUri);
-
- n.when = timeStamp;
- n.color = mContext.getResources().getColor(
- com.android.internal.R.color.system_notification_accent_color);
- n.setLatestEventInfo(mContext, title, caption, PendingIntent.getBroadcast(mContext, 0,
- intent, 0));
-
- intent = new Intent(Constants.ACTION_HIDE);
- intent.setClassName(Constants.THIS_PACKAGE_NAME, BluetoothOppReceiver.class.getName());
- intent.setDataAndNormalize(contentUri);
- n.deleteIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0);
-
- mNotificationMgr.notify(id, n);
+ Notification n = new Notification.Builder(mContext)
+ .setOnlyAlertOnce(true)
+ .setOngoing(true)
+ .setVibrate(new long[] { 200 })
+ .setWhen(info.mTimeStamp)
+ .setDefaults(Notification.DEFAULT_SOUND)
+ .setPriority(Notification.PRIORITY_HIGH)
+ .addAction(R.drawable.ic_decline,
+ mContext.getText(R.string.incoming_file_confirm_cancel),
+ PendingIntent.getBroadcast(mContext, 0,
+ new Intent(baseIntent).setAction(Constants.ACTION_DECLINE), 0))
+ .addAction(R.drawable.ic_accept,
+ mContext.getText(R.string.incoming_file_confirm_ok),
+ PendingIntent.getBroadcast(mContext, 0,
+ new Intent(baseIntent).setAction(Constants.ACTION_ACCEPT), 0))
+ .setContentIntent(PendingIntent.getBroadcast(mContext, 0,
+ new Intent(baseIntent).setAction(Constants.ACTION_INCOMING_FILE_CONFIRM), 0))
+ .setDeleteIntent(PendingIntent.getBroadcast(mContext, 0,
+ new Intent(baseIntent).setAction(Constants.ACTION_HIDE), 0))
+ .setColor(mContext.getResources().getColor(
+ com.android.internal.R.color.system_notification_accent_color))
+ .setContentTitle(mContext.getText(R.string.incoming_file_confirm_Notification_title))
+ .setContentText(info.mFileName)
+ .setStyle(new Notification.BigTextStyle().bigText(mContext.getString(
+ R.string.incoming_file_confirm_Notification_content,
+ info.mDeviceName, info.mFileName)))
+ .setContentInfo(Formatter.formatFileSize(mContext, info.mTotalBytes))
+ .setSmallIcon(R.drawable.bt_incomming_file_notification)
+ .build();
+ mNotificationMgr.notify(info.mID, n);
}
cursor.close();
}
diff --git a/src/com/android/bluetooth/opp/BluetoothOppObexClientSession.java b/src/com/android/bluetooth/opp/BluetoothOppObexClientSession.java
index 1a8ac6c..7590632 100644
--- a/src/com/android/bluetooth/opp/BluetoothOppObexClientSession.java
+++ b/src/com/android/bluetooth/opp/BluetoothOppObexClientSession.java
@@ -337,7 +337,7 @@
private int sendFile(BluetoothOppSendFileInfo fileInfo) {
boolean error = false;
int responseCode = -1;
- int position = 0;
+ long position = 0;
int status = BluetoothShare.STATUS_SUCCESS;
Uri contentUri = Uri.parse(BluetoothShare.CONTENT_URI + "/" + mInfo.mId);
ContentValues updateValues;
@@ -393,6 +393,8 @@
if (!error) {
int readLength = 0;
+ long percent = 0;
+ long prevPercent = 0;
boolean okToProceed = false;
long timestamp = 0;
int outputBufferSize = putOperation.getMaxPacketSize();
@@ -465,10 +467,15 @@
+ " readLength " + readLength + " bytes took "
+ (System.currentTimeMillis() - timestamp) + " ms");
}
- updateValues = new ContentValues();
- updateValues.put(BluetoothShare.CURRENT_BYTES, position);
- mContext1.getContentResolver().update(contentUri, updateValues,
- null, null);
+ // Update the Progress Bar only if there is change in percentage
+ percent = position * 100 / fileInfo.mLength;
+ if (percent > prevPercent) {
+ updateValues = new ContentValues();
+ updateValues.put(BluetoothShare.CURRENT_BYTES, position);
+ mContext1.getContentResolver().update(contentUri, updateValues,
+ null, null);
+ prevPercent = percent;
+ }
}
}
}
diff --git a/src/com/android/bluetooth/opp/BluetoothOppObexServerSession.java b/src/com/android/bluetooth/opp/BluetoothOppObexServerSession.java
index ffb00e9..2843249 100644
--- a/src/com/android/bluetooth/opp/BluetoothOppObexServerSession.java
+++ b/src/com/android/bluetooth/opp/BluetoothOppObexServerSession.java
@@ -93,8 +93,6 @@
private BluetoothOppReceiveFileInfo mFileInfo;
- private WakeLock mWakeLock;
-
private WakeLock mPartialWakeLock;
boolean mTimeoutMsgSent = false;
@@ -103,8 +101,6 @@
mContext = context;
mTransport = transport;
PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
- mWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP
- | PowerManager.ON_AFTER_RELEASE, TAG);
mPartialWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
}
@@ -276,43 +272,27 @@
values.put(BluetoothShare.DIRECTION, BluetoothShare.DIRECTION_INBOUND);
values.put(BluetoothShare.TIMESTAMP, mTimestamp);
- boolean needConfirm = true;
/** It's not first put if !serverBlocking, so we auto accept it */
if (!mServerBlocking && (mAccepted == BluetoothShare.USER_CONFIRMATION_CONFIRMED ||
mAccepted == BluetoothShare.USER_CONFIRMATION_AUTO_CONFIRMED)) {
values.put(BluetoothShare.USER_CONFIRMATION,
BluetoothShare.USER_CONFIRMATION_AUTO_CONFIRMED);
- needConfirm = false;
}
if (isWhitelisted) {
values.put(BluetoothShare.USER_CONFIRMATION,
BluetoothShare.USER_CONFIRMATION_HANDOVER_CONFIRMED);
- needConfirm = false;
}
Uri contentUri = mContext.getContentResolver().insert(BluetoothShare.CONTENT_URI, values);
mLocalShareInfoId = Integer.parseInt(contentUri.getPathSegments().get(1));
- if (needConfirm) {
- if (V) Log.d(TAG, "acquire full WakeLock");
- mWakeLock.acquire();
-
- Intent in = new Intent(BluetoothShare.INCOMING_FILE_CONFIRMATION_REQUEST_ACTION);
- in.setClassName(Constants.THIS_PACKAGE_NAME, BluetoothOppReceiver.class.getName());
- mContext.sendBroadcast(in);
- }
-
if (V) Log.v(TAG, "insert contentUri: " + contentUri);
if (V) Log.v(TAG, "mLocalShareInfoId = " + mLocalShareInfoId);
synchronized (this) {
- if (mWakeLock.isHeld()) {
- if (V) Log.v(TAG, "acquire partial WakeLock");
- mPartialWakeLock.acquire();
- mWakeLock.release();
- }
+ mPartialWakeLock.acquire();
mServerBlocking = true;
try {
@@ -454,7 +434,10 @@
mContext.getContentResolver().update(contentUri, updateValues, null, null);
}
- int position = 0;
+ long position = 0;
+ long percent = 0;
+ long prevPercent = 0;
+
if (!error) {
bos = new BufferedOutputStream(fileInfo.mOutputStream, 0x10000);
}
@@ -478,6 +461,7 @@
bos.write(b, 0, readLength);
position += readLength;
+ percent = position * 100 / fileInfo.mLength;
if (V) {
Log.v(TAG, "Receive file position = " + position + " readLength "
@@ -485,9 +469,13 @@
+ (System.currentTimeMillis() - timestamp) + " ms");
}
- ContentValues updateValues = new ContentValues();
- updateValues.put(BluetoothShare.CURRENT_BYTES, position);
- mContext.getContentResolver().update(contentUri, updateValues, null, null);
+ // Update the Progress Bar only if there is change in percentage
+ if (percent > prevPercent) {
+ ContentValues updateValues = new ContentValues();
+ updateValues.put(BluetoothShare.CURRENT_BYTES, position);
+ mContext.getContentResolver().update(contentUri, updateValues, null, null);
+ prevPercent = percent;
+ }
}
} catch (IOException e1) {
Log.e(TAG, "Error when receiving file");
@@ -588,9 +576,6 @@
}
private synchronized void releaseWakeLocks() {
- if (mWakeLock.isHeld()) {
- mWakeLock.release();
- }
if (mPartialWakeLock.isHeld()) {
mPartialWakeLock.release();
}
diff --git a/src/com/android/bluetooth/opp/BluetoothOppReceiver.java b/src/com/android/bluetooth/opp/BluetoothOppReceiver.java
index f4c8d9c..f0c3d83 100644
--- a/src/com/android/bluetooth/opp/BluetoothOppReceiver.java
+++ b/src/com/android/bluetooth/opp/BluetoothOppReceiver.java
@@ -118,18 +118,25 @@
in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
in.setDataAndNormalize(uri);
context.startActivity(in);
+ cancelNotification(context, uri);
- NotificationManager notMgr = (NotificationManager)context
- .getSystemService(Context.NOTIFICATION_SERVICE);
- if (notMgr != null) {
- notMgr.cancel((int)ContentUris.parseId(intent.getData()));
- if (V) Log.v(TAG, "notMgr.cancel called");
- }
- } else if (action.equals(BluetoothShare.INCOMING_FILE_CONFIRMATION_REQUEST_ACTION)) {
- if (V) Log.v(TAG, "Receiver INCOMING_FILE_NOTIFICATION");
+ } else if (action.equals(Constants.ACTION_DECLINE)) {
+ if (V) Log.v(TAG, "Receiver ACTION_DECLINE");
- Toast.makeText(context, context.getString(R.string.incoming_file_toast_msg),
- Toast.LENGTH_SHORT).show();
+ Uri uri = intent.getData();
+ ContentValues values = new ContentValues();
+ values.put(BluetoothShare.USER_CONFIRMATION, BluetoothShare.USER_CONFIRMATION_DENIED);
+ context.getContentResolver().update(uri, values, null, null);
+ cancelNotification(context, uri);
+
+ } else if (action.equals(Constants.ACTION_ACCEPT)) {
+ if (V) Log.v(TAG, "Receiver ACTION_ACCEPT");
+
+ Uri uri = intent.getData();
+ ContentValues values = new ContentValues();
+ values.put(BluetoothShare.USER_CONFIRMATION, BluetoothShare.USER_CONFIRMATION_CONFIRMED);
+ context.getContentResolver().update(uri, values, null, null);
+ cancelNotification(context, uri);
} else if (action.equals(Constants.ACTION_OPEN) || action.equals(Constants.ACTION_LIST)) {
if (V) {
@@ -161,12 +168,7 @@
context.startActivity(in);
}
- NotificationManager notMgr = (NotificationManager)context
- .getSystemService(Context.NOTIFICATION_SERVICE);
- if (notMgr != null) {
- notMgr.cancel((int)ContentUris.parseId(intent.getData()));
- if (V) Log.v(TAG, "notMgr.cancel called");
- }
+ cancelNotification(context, uri);
} else if (action.equals(Constants.ACTION_OPEN_OUTBOUND_TRANSFER)) {
if (V) Log.v(TAG, "Received ACTION_OPEN_OUTBOUND_TRANSFER.");
@@ -279,4 +281,13 @@
}
}
}
+
+ private void cancelNotification(Context context, Uri uri) {
+ NotificationManager notMgr = (NotificationManager)context
+ .getSystemService(Context.NOTIFICATION_SERVICE);
+ if (notMgr != null) {
+ notMgr.cancel((int)ContentUris.parseId(uri));
+ if (V) Log.v(TAG, "notMgr.cancel called");
+ }
+ }
}
diff --git a/src/com/android/bluetooth/opp/BluetoothOppService.java b/src/com/android/bluetooth/opp/BluetoothOppService.java
index f952bec..edec7c8 100755
--- a/src/com/android/bluetooth/opp/BluetoothOppService.java
+++ b/src/com/android/bluetooth/opp/BluetoothOppService.java
@@ -868,7 +868,8 @@
mServerTransfer = new BluetoothOppTransfer(this, mPowerManager, nextBatch,
mServerSession);
mServerTransfer.start();
- if (nextBatch.getPendingShare().mConfirm ==
+ if (nextBatch.getPendingShare() != null
+ && nextBatch.getPendingShare().mConfirm ==
BluetoothShare.USER_CONFIRMATION_CONFIRMED) {
mServerTransfer.confirmStatusChanged();
}
diff --git a/src/com/android/bluetooth/opp/BluetoothOppUtility.java b/src/com/android/bluetooth/opp/BluetoothOppUtility.java
index 58f4677..ab4613f 100644
--- a/src/com/android/bluetooth/opp/BluetoothOppUtility.java
+++ b/src/com/android/bluetooth/opp/BluetoothOppUtility.java
@@ -67,59 +67,11 @@
= new ConcurrentHashMap<Uri, BluetoothOppSendFileInfo>();
public static BluetoothOppTransferInfo queryRecord(Context context, Uri uri) {
- BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
BluetoothOppTransferInfo info = new BluetoothOppTransferInfo();
Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
- info.mID = cursor.getInt(cursor.getColumnIndexOrThrow(BluetoothShare._ID));
- info.mStatus = cursor.getInt(cursor.getColumnIndexOrThrow(BluetoothShare.STATUS));
- info.mDirection = cursor.getInt(cursor
- .getColumnIndexOrThrow(BluetoothShare.DIRECTION));
- info.mTotalBytes = cursor.getLong(cursor
- .getColumnIndexOrThrow(BluetoothShare.TOTAL_BYTES));
- info.mCurrentBytes = cursor.getLong(cursor
- .getColumnIndexOrThrow(BluetoothShare.CURRENT_BYTES));
- info.mTimeStamp = cursor.getLong(cursor
- .getColumnIndexOrThrow(BluetoothShare.TIMESTAMP));
- info.mDestAddr = cursor.getString(cursor
- .getColumnIndexOrThrow(BluetoothShare.DESTINATION));
-
- info.mFileName = cursor.getString(cursor
- .getColumnIndexOrThrow(BluetoothShare._DATA));
- if (info.mFileName == null) {
- info.mFileName = cursor.getString(cursor
- .getColumnIndexOrThrow(BluetoothShare.FILENAME_HINT));
- }
- if (info.mFileName == null) {
- info.mFileName = context.getString(R.string.unknown_file);
- }
-
- info.mFileUri = cursor.getString(cursor.getColumnIndexOrThrow(BluetoothShare.URI));
-
- if (info.mFileUri != null) {
- Uri u = Uri.parse(info.mFileUri);
- info.mFileType = context.getContentResolver().getType(u);
- } else {
- Uri u = Uri.parse(info.mFileName);
- info.mFileType = context.getContentResolver().getType(u);
- }
- if (info.mFileType == null) {
- info.mFileType = cursor.getString(cursor
- .getColumnIndexOrThrow(BluetoothShare.MIMETYPE));
- }
-
- BluetoothDevice remoteDevice = adapter.getRemoteDevice(info.mDestAddr);
- info.mDeviceName =
- BluetoothOppManager.getInstance(context).getDeviceName(remoteDevice);
-
- int confirmationType = cursor.getInt(
- cursor.getColumnIndexOrThrow(BluetoothShare.USER_CONFIRMATION));
- info.mHandoverInitiated =
- confirmationType == BluetoothShare.USER_CONFIRMATION_HANDOVER_CONFIRMED;
-
- if (V) Log.v(TAG, "Get data from db:" + info.mFileName + info.mFileType
- + info.mDestAddr);
+ fillRecord(context, cursor, info);
}
cursor.close();
} else {
@@ -129,6 +81,58 @@
return info;
}
+ public static void fillRecord(Context context, Cursor cursor, BluetoothOppTransferInfo info) {
+ BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+ info.mID = cursor.getInt(cursor.getColumnIndexOrThrow(BluetoothShare._ID));
+ info.mStatus = cursor.getInt(cursor.getColumnIndexOrThrow(BluetoothShare.STATUS));
+ info.mDirection = cursor.getInt(cursor
+ .getColumnIndexOrThrow(BluetoothShare.DIRECTION));
+ info.mTotalBytes = cursor.getLong(cursor
+ .getColumnIndexOrThrow(BluetoothShare.TOTAL_BYTES));
+ info.mCurrentBytes = cursor.getLong(cursor
+ .getColumnIndexOrThrow(BluetoothShare.CURRENT_BYTES));
+ info.mTimeStamp = cursor.getLong(cursor
+ .getColumnIndexOrThrow(BluetoothShare.TIMESTAMP));
+ info.mDestAddr = cursor.getString(cursor
+ .getColumnIndexOrThrow(BluetoothShare.DESTINATION));
+
+ info.mFileName = cursor.getString(cursor
+ .getColumnIndexOrThrow(BluetoothShare._DATA));
+ if (info.mFileName == null) {
+ info.mFileName = cursor.getString(cursor
+ .getColumnIndexOrThrow(BluetoothShare.FILENAME_HINT));
+ }
+ if (info.mFileName == null) {
+ info.mFileName = context.getString(R.string.unknown_file);
+ }
+
+ info.mFileUri = cursor.getString(cursor.getColumnIndexOrThrow(BluetoothShare.URI));
+
+ if (info.mFileUri != null) {
+ Uri u = Uri.parse(info.mFileUri);
+ info.mFileType = context.getContentResolver().getType(u);
+ } else {
+ Uri u = Uri.parse(info.mFileName);
+ info.mFileType = context.getContentResolver().getType(u);
+ }
+ if (info.mFileType == null) {
+ info.mFileType = cursor.getString(cursor
+ .getColumnIndexOrThrow(BluetoothShare.MIMETYPE));
+ }
+
+ BluetoothDevice remoteDevice = adapter.getRemoteDevice(info.mDestAddr);
+ info.mDeviceName =
+ BluetoothOppManager.getInstance(context).getDeviceName(remoteDevice);
+
+ int confirmationType = cursor.getInt(
+ cursor.getColumnIndexOrThrow(BluetoothShare.USER_CONFIRMATION));
+ info.mHandoverInitiated =
+ confirmationType == BluetoothShare.USER_CONFIRMATION_HANDOVER_CONFIRMED;
+
+ if (V) Log.v(TAG, "Get data from db:" + info.mFileName + info.mFileType
+ + info.mDestAddr);
+ }
+
/**
* Organize Array list for transfers in one batch
*/
diff --git a/src/com/android/bluetooth/opp/BluetoothShare.java b/src/com/android/bluetooth/opp/BluetoothShare.java
index d033325..94c1fc2 100644
--- a/src/com/android/bluetooth/opp/BluetoothShare.java
+++ b/src/com/android/bluetooth/opp/BluetoothShare.java
@@ -64,12 +64,6 @@
/**
* This is sent by the Bluetooth Share component to indicate there is an
- * incoming file need user to confirm.
- */
- public static final String INCOMING_FILE_CONFIRMATION_REQUEST_ACTION = "android.btopp.intent.action.INCOMING_FILE_NOTIFICATION";
-
- /**
- * This is sent by the Bluetooth Share component to indicate there is an
* incoming file request timeout and need update UI.
*/
public static final String USER_CONFIRMATION_TIMEOUT_ACTION = "android.btopp.intent.action.USER_CONFIRMATION_TIMEOUT";
diff --git a/src/com/android/bluetooth/opp/Constants.java b/src/com/android/bluetooth/opp/Constants.java
index e15f13e..acabb49 100644
--- a/src/com/android/bluetooth/opp/Constants.java
+++ b/src/com/android/bluetooth/opp/Constants.java
@@ -153,12 +153,21 @@
"com.android.intent.extra.CONNECTION_HANDOVER";
/**
- * the intent that gets sent when deleting the incoming file confirmation
- * notification
+ * the intent that gets sent when deleting the incoming file confirmation notification
*/
public static final String ACTION_HIDE = "android.btopp.intent.action.HIDE";
/**
+ * the intent that gets sent when accepting the incoming file confirmation notification
+ */
+ public static final String ACTION_ACCEPT = "android.btopp.intent.action.ACCEPT";
+
+ /**
+ * the intent that gets sent when declining the incoming file confirmation notification
+ */
+ public static final String ACTION_DECLINE = "android.btopp.intent.action.DECLINE";
+
+ /**
* the intent that gets sent when deleting the notifications of outbound and
* inbound completed transfer
*/
diff --git a/src/com/android/bluetooth/pan/BluetoothTetheringNetworkFactory.java b/src/com/android/bluetooth/pan/BluetoothTetheringNetworkFactory.java
index 9437794..22b3bc6 100644
--- a/src/com/android/bluetooth/pan/BluetoothTetheringNetworkFactory.java
+++ b/src/com/android/bluetooth/pan/BluetoothTetheringNetworkFactory.java
@@ -27,7 +27,8 @@
import android.net.NetworkInfo;
import android.net.NetworkInfo.DetailedState;
import android.net.NetworkRequest;
-import android.net.NetworkUtils;
+import android.net.ip.IpManager;
+import android.net.ip.IpManager.WaitForProvisioningCallback;
import android.os.Looper;
import android.os.Message;
import android.os.Messenger;
@@ -56,7 +57,8 @@
// All accesses to these must be synchronized(this).
private final NetworkInfo mNetworkInfo;
- private LinkProperties mLinkProperties;
+ private IpManager mIpManager;
+ private String mInterfaceName;
private NetworkAgent mNetworkAgent;
public BluetoothTetheringNetworkFactory(Context context, Looper looper, PanService panService) {
@@ -66,54 +68,72 @@
mPanService = panService;
mNetworkInfo = new NetworkInfo(ConnectivityManager.TYPE_BLUETOOTH, 0, NETWORK_TYPE, "");
- mLinkProperties = new LinkProperties();
mNetworkCapabilities = new NetworkCapabilities();
initNetworkCapabilities();
setCapabilityFilter(mNetworkCapabilities);
}
+ private void stopIpManagerLocked() {
+ if (mIpManager != null) {
+ mIpManager.shutdown();
+ mIpManager = null;
+ }
+ }
+
// Called by NetworkFactory when PanService and NetworkFactory both desire a Bluetooth
// reverse-tether connection. A network interface for Bluetooth reverse-tethering can be
// assumed to be available because we only register our NetworkFactory when it is so.
@Override
protected void startNetwork() {
- // TODO: Handle DHCP renew.
- Thread dhcpThread = new Thread(new Runnable() {
+ // TODO: Figure out how to replace this thread with simple invocations
+ // of IpManager. This will likely necessitate a rethink about
+ // NetworkAgent, NetworkInfo, and associated instance lifetimes.
+ Thread ipProvisioningThread = new Thread(new Runnable() {
public void run() {
LinkProperties linkProperties;
+ final WaitForProvisioningCallback ipmCallback = new WaitForProvisioningCallback() {
+ @Override
+ public void onLinkPropertiesChange(LinkProperties newLp) {
+ synchronized (BluetoothTetheringNetworkFactory.this) {
+ if (mNetworkAgent != null && mNetworkInfo.isConnected()) {
+ mNetworkAgent.sendLinkProperties(newLp);
+ }
+ }
+ }
+ };
+
synchronized (BluetoothTetheringNetworkFactory.this) {
- linkProperties = mLinkProperties;
- if (linkProperties.getInterfaceName() == null) {
+ if (TextUtils.isEmpty(mInterfaceName)) {
Slog.e(TAG, "attempted to reverse tether without interface name");
return;
}
- log("dhcpThread(+" + linkProperties.getInterfaceName() +
- "): mNetworkInfo=" + mNetworkInfo);
+ log("ipProvisioningThread(+" + mInterfaceName + "): " +
+ "mNetworkInfo=" + mNetworkInfo);
+ mIpManager = new IpManager(mContext, mInterfaceName, ipmCallback);
+ mIpManager.startProvisioning(
+ mIpManager.buildProvisioningConfiguration()
+ .withoutIpReachabilityMonitor()
+ .build());
+ mNetworkInfo.setDetailedState(DetailedState.OBTAINING_IPADDR, null, null);
}
- DhcpResults dhcpResults = new DhcpResults();
- // TODO: Handle DHCP renewals better.
- // In general runDhcp handles DHCP renewals for us, because
- // the dhcp client stays running, but if the renewal fails,
- // we will lose our IP address and connectivity without
- // noticing.
- if (!NetworkUtils.runDhcp(linkProperties.getInterfaceName(), dhcpResults)) {
- Slog.e(TAG, "DHCP request error:" + NetworkUtils.getDhcpError());
+ linkProperties = ipmCallback.waitForProvisioning();
+ if (linkProperties == null) {
+ Slog.e(TAG, "IP provisioning error.");
synchronized(BluetoothTetheringNetworkFactory.this) {
+ stopIpManagerLocked();
setScoreFilter(-1);
}
return;
}
synchronized(BluetoothTetheringNetworkFactory.this) {
- mLinkProperties = dhcpResults.toLinkProperties(
- linkProperties.getInterfaceName());
mNetworkInfo.setIsAvailable(true);
mNetworkInfo.setDetailedState(DetailedState.CONNECTED, null, null);
// Create our NetworkAgent.
mNetworkAgent = new NetworkAgent(getLooper(), mContext, NETWORK_TYPE,
- mNetworkInfo, mNetworkCapabilities, mLinkProperties, NETWORK_SCORE) {
+ mNetworkInfo, mNetworkCapabilities, linkProperties, NETWORK_SCORE) {
public void unwanted() {
BluetoothTetheringNetworkFactory.this.onCancelRequest();
};
@@ -121,7 +141,7 @@
}
}
});
- dhcpThread.start();
+ ipProvisioningThread.start();
}
// Called from NetworkFactory to indicate ConnectivityService no longer desires a Bluetooth
@@ -133,10 +153,9 @@
// Called by the NetworkFactory, NetworkAgent or PanService to tear down network.
private synchronized void onCancelRequest() {
- if (!TextUtils.isEmpty(mLinkProperties.getInterfaceName())) {
- NetworkUtils.stopDhcp(mLinkProperties.getInterfaceName());
- }
- mLinkProperties.clear();
+ stopIpManagerLocked();
+ mInterfaceName = "";
+
mNetworkInfo.setDetailedState(DetailedState.DISCONNECTED, null, null);
if (mNetworkAgent != null) {
mNetworkAgent.sendNetworkInfo(mNetworkInfo);
@@ -155,12 +174,11 @@
return;
}
synchronized(this) {
- if (mLinkProperties.getInterfaceName() != null) {
+ if (!TextUtils.isEmpty(mInterfaceName)) {
Slog.e(TAG, "attempted to reverse tether while already in process");
return;
}
- mLinkProperties = new LinkProperties();
- mLinkProperties.setInterfaceName(iface);
+ mInterfaceName = iface;
// Advertise ourselves to ConnectivityService.
register();
setScoreFilter(NETWORK_SCORE);
@@ -170,7 +188,7 @@
// Called by PanService when a network interface for Bluetooth reverse-tethering
// goes away. We stop advertising ourselves to ConnectivityService at this point.
public synchronized void stopReverseTether() {
- if (TextUtils.isEmpty(mLinkProperties.getInterfaceName())) {
+ if (TextUtils.isEmpty(mInterfaceName)) {
Slog.e(TAG, "attempted to stop reverse tether with nothing tethered");
return;
}
diff --git a/src/com/android/bluetooth/pbap/BluetoothPbapVcardManager.java b/src/com/android/bluetooth/pbap/BluetoothPbapVcardManager.java
index 748e7a5..09c489f 100644
--- a/src/com/android/bluetooth/pbap/BluetoothPbapVcardManager.java
+++ b/src/com/android/bluetooth/pbap/BluetoothPbapVcardManager.java
@@ -33,41 +33,38 @@
package com.android.bluetooth.pbap;
+import com.android.bluetooth.R;
+import com.android.bluetooth.util.DevicePolicyUtils;
+import com.android.vcard.VCardComposer;
+import com.android.vcard.VCardConfig;
+import com.android.vcard.VCardPhoneNumberTranslationCallback;
+
import android.content.ContentResolver;
import android.content.Context;
-import android.database.CursorWindowAllocationException;
import android.database.Cursor;
+import android.database.CursorWindowAllocationException;
import android.database.MatrixCursor;
import android.net.Uri;
import android.provider.CallLog;
-import android.provider.ContactsContract;
import android.provider.CallLog.Calls;
import android.provider.ContactsContract.CommonDataKinds;
+import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Data;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.PhoneLookup;
import android.provider.ContactsContract.RawContactsEntity;
import android.telephony.PhoneNumberUtils;
import android.text.TextUtils;
import android.util.Log;
-import com.android.bluetooth.R;
-import com.android.vcard.VCardComposer;
-import com.android.vcard.VCardConfig;
-import com.android.vcard.VCardPhoneNumberTranslationCallback;
-
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collections;
-import javax.obex.ServerOperation;
import javax.obex.Operation;
import javax.obex.ResponseCodes;
-
-import com.android.bluetooth.Utils;
-import com.android.bluetooth.util.DevicePolicyUtils;
+import javax.obex.ServerOperation;
public class BluetoothPbapVcardManager {
private static final String TAG = "BluetoothPbapVcardManager";
@@ -170,7 +167,8 @@
if (contactCursor == null) {
return 0;
}
- return getDistinctContactIdSize(contactCursor) + 1; // always has the 0.vcf
+ return getDistinctContactIdSize(contactCursor, Phone.CONTACT_ID)
+ + 1; // always has the 0.vcf
} catch (CursorWindowAllocationException e) {
Log.e(TAG, "CursorWindowAllocationException while getting Contacts size");
} finally {
@@ -266,8 +264,8 @@
null, Phone.CONTACT_ID);
if (contactCursor != null) {
appendDistinctNameIdList(nameList,
- mContext.getString(android.R.string.unknownName),
- contactCursor);
+ mContext.getString(android.R.string.unknownName), contactCursor,
+ Phone.CONTACT_ID, Phone.DISPLAY_NAME);
if (orderByWhat == BluetoothPbapObexServer.ORDER_BY_INDEXED) {
if (V) Log.v(TAG, "getPhonebookNameList, order by index");
// Do not need to do anything, as we sort it by index already
@@ -292,26 +290,28 @@
ArrayList<String> tempNameList = new ArrayList<String>();
Cursor contactCursor = null;
- Uri uri = null;
- String[] projection = null;
-
+ Uri uri;
+ final String[] projection;
+ final String contactIdColumn, displayNameColumn;
if (TextUtils.isEmpty(phoneNumber)) {
uri = DevicePolicyUtils.getEnterprisePhoneUri(mContext);
- projection = PHONES_CONTACTS_PROJECTION;
+ contactIdColumn = Phone.CONTACT_ID;
+ displayNameColumn = Phone.DISPLAY_NAME;
} else {
- uri = Uri.withAppendedPath(getPhoneLookupFilterUri(),
- Uri.encode(phoneNumber));
- projection = PHONE_LOOKUP_PROJECTION;
+ uri = Uri.withAppendedPath(getPhoneLookupFilterUri(), Uri.encode(phoneNumber));
+ contactIdColumn = PhoneLookup._ID;
+ displayNameColumn = PhoneLookup.DISPLAY_NAME;
}
+ projection = new String[]{contactIdColumn, displayNameColumn};
try {
- contactCursor = mResolver.query(uri, projection, CLAUSE_ONLY_VISIBLE, null,
- Phone.CONTACT_ID);
+ contactCursor = mResolver
+ .query(uri, projection, CLAUSE_ONLY_VISIBLE, null, contactIdColumn);
if (contactCursor != null) {
appendDistinctNameIdList(nameList,
mContext.getString(android.R.string.unknownName),
- contactCursor);
+ contactCursor, contactIdColumn, displayNameColumn);
if (V) {
for (String nameIdStr : nameList) {
Log.v(TAG, "got name " + nameIdStr + " by number " + phoneNumber);
@@ -827,19 +827,23 @@
private static final Uri getPhoneLookupFilterUri() {
return PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI;
}
-
/**
* Get size of the cursor without duplicated contact id. This assumes the
* given cursor is sorted by CONATCT_ID.
*/
- private static final int getDistinctContactIdSize(Cursor cursor) {
- final int contactIdColumn = cursor.getColumnIndex(Data.CONTACT_ID);
- final int idColumn = cursor.getColumnIndex(Data._ID);
+ /**
+ * Count number of rows having distinct contact id. It assumes
+ * @param cursor cursor to be counted.
+ * @param contactIdColumn column name of contact id
+ * @return number of rows that have distinct contact id.
+ */
+ private static final int getDistinctContactIdSize(Cursor cursor, String contactIdColumn) {
+ final int contactIdColumnIndex = cursor.getColumnIndexOrThrow(contactIdColumn);
long previousContactId = -1;
int count = 0;
cursor.moveToPosition(-1);
while (cursor.moveToNext()) {
- final long contactId = cursor.getLong(contactIdColumn != -1 ? contactIdColumn : idColumn);
+ final long contactId = cursor.getLong(contactIdColumnIndex);
if (previousContactId != contactId) {
count++;
previousContactId = contactId;
@@ -852,19 +856,25 @@
}
/**
- * Append "display_name,contact_id" string array from cursor to ArrayList.
- * This assumes the given cursor is sorted by CONATCT_ID.
+ * Construct "display_name,contact_id" strings and insert into a arraylist.
+ *
+ * @param resultList list to be inserted.
+ * @param defaultName default name if the name of contact is empty.
+ * @param cursor a cursor containing contact id and display name.
+ * @param contactIdColumnName name of column that stores contact id.
+ * @param displayNameColumnName name of column that stores display name.
*/
private static void appendDistinctNameIdList(ArrayList<String> resultList,
- String defaultName, Cursor cursor) {
- final int contactIdColumn = cursor.getColumnIndex(Data.CONTACT_ID);
- final int idColumn = cursor.getColumnIndex(Data._ID);
- final int nameColumn = cursor.getColumnIndex(Data.DISPLAY_NAME);
+ String defaultName, Cursor cursor, String contactIdColumnName,
+ String displayNameColumnName) {
+ final int contactIdColumnIndex = cursor.getColumnIndexOrThrow(contactIdColumnName);
+ final int displayNameColumnIndex = cursor.getColumnIndexOrThrow(displayNameColumnName);
+
long previousContactId = -1;
cursor.moveToPosition(-1);
while (cursor.moveToNext()) {
- final long contactId = cursor.getLong(contactIdColumn != -1 ? contactIdColumn : idColumn);
- String displayName = nameColumn != -1 ? cursor.getString(nameColumn) : defaultName;
+ final long contactId = cursor.getLong(contactIdColumnIndex);
+ String displayName = cursor.getString(displayNameColumnIndex);
if (TextUtils.isEmpty(displayName)) {
displayName = defaultName;
}
diff --git a/tests/src/com/android/bluetooth/tests/pbap/BluetoothPhabVcardManagerTest.java b/tests/src/com/android/bluetooth/tests/pbap/BluetoothPbapVcardManagerTest.java
similarity index 86%
rename from tests/src/com/android/bluetooth/tests/pbap/BluetoothPhabVcardManagerTest.java
rename to tests/src/com/android/bluetooth/tests/pbap/BluetoothPbapVcardManagerTest.java
index 72168b5..ec000a0 100644
--- a/tests/src/com/android/bluetooth/tests/pbap/BluetoothPhabVcardManagerTest.java
+++ b/tests/src/com/android/bluetooth/tests/pbap/BluetoothPbapVcardManagerTest.java
@@ -16,26 +16,43 @@
package com.android.bluetooth.tests.pbap;
-import android.database.Cursor;
-import android.database.MatrixCursor;
-import android.provider.ContactsContract;
-import android.test.AndroidTestCase;
-import android.test.mock.MockContentProvider;
-import android.test.mock.MockContentResolver;
-
import com.android.bluetooth.pbap.BluetoothPbapObexServer;
import com.android.bluetooth.pbap.BluetoothPbapVcardManager;
import com.android.bluetooth.tests.mock.BluetoothMockContext;
import com.android.bluetooth.tests.mock.SimpleMockContentProvider;
+import android.database.Cursor;
+import android.database.MatrixCursor;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.PhoneLookup;
+import android.test.AndroidTestCase;
+import android.test.mock.MockContentProvider;
+import android.test.mock.MockContentResolver;
+import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.text.TextUtils;
+
+
import java.util.ArrayList;
-public class BluetoothPhabVcardManagerTest extends AndroidTestCase {
+public class BluetoothPbapVcardManagerTest extends AndroidTestCase {
- public void testGetContactNamesByNumber() {
- MatrixCursor mc = new MatrixCursor(
- new String[]{ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
- ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME});
+ public void testGetContactNamesByNumberWithEmptyPhoneNumber() {
+ getContactNamesByNumberInternal("");
+ }
+
+ public void testGetContactNamesByNumberWithPhoneNumber() {
+ getContactNamesByNumberInternal("111-111-111");
+ }
+
+ private void getContactNamesByNumberInternal(String phoneNumber) {
+ String[] columnNames;
+ if (TextUtils.isEmpty(phoneNumber)) {
+ columnNames = new String[]{Phone.CONTACT_ID, Phone.DISPLAY_NAME};
+ } else {
+ columnNames = new String[]{PhoneLookup._ID, PhoneLookup.DISPLAY_NAME};
+ }
+
+ MatrixCursor mc = new MatrixCursor(columnNames);
mc.addRow(new Object[]{1L, "A"});
mc.addRow(new Object[]{1L, "A (1)"});
mc.addRow(new Object[]{2L, "B"});
@@ -45,7 +62,7 @@
mc.addRow(new Object[]{3L, "C (2)"});
mc.addRow(new Object[]{4L, "D"});
BluetoothPbapVcardManager manager = createBluetoothPbapVcardManager(mc);
- ArrayList<String> nameList = manager.getContactNamesByNumber("111-111-111");
+ ArrayList<String> nameList = manager.getContactNamesByNumber(phoneNumber);
// If there are multiple display name per id, first one is picked.
assertEquals("A,1", nameList.get(0));