diff --git a/CLAUDE.md b/CLAUDE.md
index 34abc43..997bb1c 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -87,6 +87,11 @@ lib/
# tickerText when extras body is empty or a "содержимое скрыто"
# stub — VTB puts the real text ONLY in ticker, no second post),
# NotificationIngestWorker + ParsingWorker.
+ # data/native/companion_device_channel.dart + канал в
+ # MainActivity.kt: привязка «часов» через CompanionDeviceManager
+ # (DEVICE_PROFILE_WATCH → роль COMPANION_DEVICE_WATCH →
+ # RECEIVE_SENSITIVE_NOTIFICATIONS, снимает заглушку
+ # «Конфиденциально»); карточка в parsing_settings.
# Screens: inbox, rules_list, rule_editor, parsing_settings, ai_consent, parsing_log
profile/ # theme switcher screen
shared/
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 746e915..57ab3a8 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -2,6 +2,17 @@
+
+
+
+
+
+ when (call.method) {
+ "getStatus" -> result.success(companionStatus())
+ "getBondedDevices" -> getBondedDevices(result)
+ "requestAssociation" ->
+ requestAssociation(call.argument("address"), result)
+ else -> result.notImplemented()
+ }
+ }
+ }
+
+ /**
+ * unsupported | notBound | bound. Профили ассоциаций читаемы с API 33
+ * (`myAssociations`); на 31–32 профиль недоступен — считаем привязанной
+ * любую ассоциацию (других мы не создаём).
+ */
+ private fun companionStatus(): String {
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) return "unsupported"
+ val cdm = getSystemService(Context.COMPANION_DEVICE_SERVICE) as CompanionDeviceManager
+ val bound = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+ cdm.myAssociations.any {
+ it.deviceProfile == AssociationRequest.DEVICE_PROFILE_WATCH
+ }
+ } else {
+ @Suppress("DEPRECATION")
+ cdm.associations.isNotEmpty()
+ }
+ return if (bound) "bound" else "notBound"
+ }
+
+ /**
+ * Сопряжённые Bluetooth-устройства для in-app пикера часов: [{name,
+ * address, isWearable}]. Чтение имён требует runtime-разрешения
+ * BLUETOOTH_CONNECT — при отсутствии запрашиваем его и отвечаем из
+ * [onRequestPermissionsResult].
+ */
+ private fun getBondedDevices(result: MethodChannel.Result) {
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
+ result.success(emptyList