From b34c9486e60749fe0e0cda5c72c41be86afe6e59 Mon Sep 17 00:00:00 2001 From: Jose Carlos Hernandez Date: Thu, 5 Oct 2023 13:03:23 -0600 Subject: [PATCH] FreeBuds Pro 1 Gen Compat - Add compatibility for FreeBuds Pro 1 Gen - Add png image for free buds pro - Change regex device implementation --- README.md | 2 +- assets/app_icons/freebuds_pro_one.png | Bin 0 -> 24865 bytes dump.rdb | Bin 0 -> 88 bytes ios/Flutter/Debug.xcconfig | 1 + ios/Flutter/Release.xcconfig | 1 + ios/Podfile | 44 ++++++++++++++++++ .../cubit/headphones_connection_cubit.dart | 6 +-- lib/headphones/headphones_mocks.dart | 2 +- lib/headphones/huawei/mbb.dart | 3 ++ .../huawei/otter/otter_constants.dart | 20 +++++++- lib/l10n/app_en.arb | 4 +- lib/l10n/app_pl.arb | 4 +- .../controls/headphones_controls_widget.dart | 22 +++++++-- .../pages/home/controls/headphones_image.dart | 5 +- macos/Flutter/Flutter-Debug.xcconfig | 1 + macos/Flutter/Flutter-Release.xcconfig | 1 + macos/Podfile | 43 +++++++++++++++++ macos/Runner.xcodeproj/project.pbxproj | 11 +++-- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- pubspec.yaml | 3 +- test/unit/device_constants_test.dart | 8 ++-- 21 files changed, 155 insertions(+), 28 deletions(-) create mode 100644 assets/app_icons/freebuds_pro_one.png create mode 100644 dump.rdb create mode 100644 ios/Podfile create mode 100644 macos/Podfile diff --git a/README.md b/README.md index 889a52f..81d6ac6 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [![resolved Github issues](https://img.shields.io/github/issues-closed/TheLastGimbus/FreeBuddy?label=resolved%20issues)](https://github.com/TheLastGimbus/FreeBuddy/issues) [![commit activity](https://img.shields.io/github/commit-activity/y/TheLastGimbus/FreeBuddy)](https://github.com/TheLastGimbus/FreeBuddy/graphs/contributors) -Free and open source app for Huawei Freebuds 4i headphones 🎧 +Free and open source app for Huawei Freebuds 4i/ FreeBudsPro headphones 🎧 ## Why 🧐 diff --git a/assets/app_icons/freebuds_pro_one.png b/assets/app_icons/freebuds_pro_one.png new file mode 100644 index 0000000000000000000000000000000000000000..17a65cabc890d9ab7fe103947c72efb03c3653ef GIT binary patch literal 24865 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 literal 0 HcmV?d00001 diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig index 592ceee..ec97fc6 100644 --- a/ios/Flutter/Debug.xcconfig +++ b/ios/Flutter/Debug.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig index 592ceee..c4855bf 100644 --- a/ios/Flutter/Release.xcconfig +++ b/ios/Flutter/Release.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Podfile b/ios/Podfile new file mode 100644 index 0000000..fdcc671 --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,44 @@ +# Uncomment this line to define a global platform for your project +# platform :ios, '11.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/lib/headphones/cubit/headphones_connection_cubit.dart b/lib/headphones/cubit/headphones_connection_cubit.dart index 34aaf7d..8e4aeb2 100644 --- a/lib/headphones/cubit/headphones_connection_cubit.dart +++ b/lib/headphones/cubit/headphones_connection_cubit.dart @@ -67,7 +67,7 @@ class HeadphonesConnectionCubit extends Cubit { } if (_connection != null) return; // already connected and working, skip final otter = devices - .firstWhereOrNull((d) => OtterConst.btDevNameRegex.hasMatch(d.name)); + .firstWhereOrNull((d) => OtterConst.btDevNameRegex.any((regex) => regex.hasMatch(d.name))); if (otter == null) { emit(HeadphonesNotPaired()); return; @@ -106,8 +106,8 @@ class HeadphonesConnectionCubit extends Cubit { if (!_btEnabledCache) return; emit( ((await _bluetooth.pairedDevices) - .firstWhereOrNull( - (d) => OtterConst.btDevNameRegex.hasMatch(d.name)) + .firstWhereOrNull( + (d) => OtterConst.btDevNameRegex.any((regex) => regex.hasMatch(d.name))) ?.isConnected ?? false) ? HeadphonesConnectedClosed() diff --git a/lib/headphones/headphones_mocks.dart b/lib/headphones/headphones_mocks.dart index c791b53..a9f8eb6 100644 --- a/lib/headphones/headphones_mocks.dart +++ b/lib/headphones/headphones_mocks.dart @@ -69,7 +69,7 @@ class HeadphonesMockPrettyFake extends HeadphonesBase { } @override - String? get alias => "Freebuds 4i😺"; + String? get alias => "Freebuds😺"; @override ValueStream get batteryData => _batteryData.stream; diff --git a/lib/headphones/huawei/mbb.dart b/lib/headphones/huawei/mbb.dart index c29139a..dedffe9 100644 --- a/lib/headphones/huawei/mbb.dart +++ b/lib/headphones/huawei/mbb.dart @@ -2,6 +2,7 @@ import 'dart:typed_data'; import 'package:collection/collection.dart'; import 'package:crclib/catalog.dart'; +import '../../../logger.dart'; import '../headphones_data_objects.dart'; @@ -98,6 +99,7 @@ class MbbCommand { commandId, ...dataBytes, // Make sure they are >0 and <256 ]; + logg.t("⬆ data: ${Uint8List.fromList(bytesList..addAll(MbbUtils.checksum(bytesList)))}"); return Uint8List.fromList(bytesList..addAll(MbbUtils.checksum(bytesList))); } @@ -106,6 +108,7 @@ class MbbCommand { bool verify = true, bool smartDivide = true, }) { + logg.t("📥 received: ${payload}"); final divided = []; if (smartDivide) { while (payload.length >= 8) { diff --git a/lib/headphones/huawei/otter/otter_constants.dart b/lib/headphones/huawei/otter/otter_constants.dart index d17df34..efb101d 100644 --- a/lib/headphones/huawei/otter/otter_constants.dart +++ b/lib/headphones/huawei/otter/otter_constants.dart @@ -1,10 +1,26 @@ class OtterConst { - static const String name = 'Huawei Freebuds 4i'; + + static const BUDS_4I = 0; + static const BUDS_PRO = 1; @Deprecated("This seems to not work... use [btDevNameRegex] instead") static final btMacRegex = RegExp(r'60:AA:..:..:..:7E', caseSensitive: false); // Copied straight from decompiled app static final btDevNameRegex = - RegExp(r'^(?=(HUAWEI FreeBuds 4i))', caseSensitive: true); + [ + RegExp(r'^(?=(HUAWEI FreeBuds 4i))', caseSensitive: true), + RegExp(r'^(?=(HUAWEI FreeBuds Pro))', caseSensitive: true) + ]; + + static final names = + [ + 'Huawei Freebuds 4i', + 'Huawei Freebuds Pro' + ]; + + static final imageAsset = [ + 'assets/app_icons/ic_launcher.png', + 'assets/app_icons/freebuds_pro_one.png', + ]; } diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 2920217..e2858a5 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -18,7 +18,7 @@ "pageHomeBluetoothDisabled": "Bluetooth is disabled 📶🚫", "pageHomeBluetoothDisabledEnable": "Enable ☝", "pageHomeBluetoothDisabledOpenSettings": "Open settings to enable 💙", - "pageHomeNotPaired": "You don't have Freebuds 4i paired to your phone 😿", + "pageHomeNotPaired": "You don't have Freebuds 4i or Freebuds Pro paired to your phone 😿", "pageHomeNotPairedPairOpenSettings": "Open bluetooth settings to pair 🔌", "pageHomeNotPairedPairOpenDemo": "Try app without headphones 🌐", "pageHomeConnectedClosed": "Headphones are connected, but not with FreeBuddy 🤨", @@ -66,7 +66,7 @@ "pageAboutOpenSourceLicensesBtn": "Open source licenses", "pageIntroTitle": "Welcome to FreeBuddy 👋", "pageIntroWhatIsThis": "FreeBuddy is open source app for your headphones 🎧", - "pageIntroSupported": "Currently supported are:\n - Huawei Freebuds 4i", + "pageIntroSupported": "Currently supported are:\n - Huawei Freebuds 4i \n - Huawei FreeBuds Pro", "pageIntroShortPrivacyPolicy": "This app doesn't collect any emails, identifiers, or any personal data 🎉 You can read more about it here: ", "pageIntroAnyQuestions": "If you have any questions, feel free to contact me 💌 Look at \"Settings->About\" for my socials!", "pageIntroQuit": "Okay 👍" diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb index d413828..f04d308 100644 --- a/lib/l10n/app_pl.arb +++ b/lib/l10n/app_pl.arb @@ -18,7 +18,7 @@ "pageHomeBluetoothDisabled": "Bluetooth jest wyłączony 📶🚫", "pageHomeBluetoothDisabledEnable": "Włącz ☝", "pageHomeBluetoothDisabledOpenSettings": "Otwórz ustawienia żeby włączyć 💙", - "pageHomeNotPaired": "Nie masz sparowanych Freebuds 4i z telefonem 😿", + "pageHomeNotPaired": "Nie masz sparowanych Freebuds 4i/ Freebuds Pro z telefonem 😿", "pageHomeNotPairedPairOpenSettings": "Otwórz ustawienia bluetooth żeby sparować 🔌", "pageHomeNotPairedPairOpenDemo": "Wypróbuj apke bez słuchawek 🌐", "pageHomeConnectedClosed": "Słuchawki są połączone, ale nie z FreeBuddy 🤨", @@ -66,7 +66,7 @@ "pageAboutOpenSourceLicensesBtn": "Licencje open source", "pageIntroTitle": "Witaj we FreeBuddy 👋", "pageIntroWhatIsThis": "FreeBuddy to open-source aplikacja do twoich słuchaweczek 🎧", - "pageIntroSupported": "Obecnie wspierane są:\n - Huawei Freebuds 4i", + "pageIntroSupported": "Obecnie wspierane są:\n - Huawei Freebuds 4i\n - Huawei Freebuds Pro", "pageIntroShortPrivacyPolicy": "Ta aplikacja nie zbiera żadnych maili, identyfikatorów, czy innych osobistych danych 🎉 Możesz o tym poczytać tutaj: ", "pageIntroAnyQuestions": "Jeśli masz jakiekolwiek pytania, napisz do mnie śmiało 💌 Wejdź w \"Ustawienia->O aplikacji\" po moje socjale!", "pageIntroQuit": "Oki doki 👍" diff --git a/lib/ui/pages/home/controls/headphones_controls_widget.dart b/lib/ui/pages/home/controls/headphones_controls_widget.dart index 23e1995..bbf8ec1 100644 --- a/lib/ui/pages/home/controls/headphones_controls_widget.dart +++ b/lib/ui/pages/home/controls/headphones_controls_widget.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import '../../../../headphones/headphones_base.dart'; +import '../../../../headphones/huawei/otter/otter_constants.dart'; import '../../../theme/layouts.dart'; import 'anc_card.dart'; import 'battery_card.dart'; @@ -33,10 +34,10 @@ class HeadphonesControlsWidget extends StatelessWidget { children: [ Text( // TODO: This hardcode - headphones.alias ?? 'FreeBuds 4i', + headphones.alias ?? 'FreeBuds', style: tt.headlineMedium, ), - HeadphonesImage(headphones), + HeadphonesImage(headphones, getAsset(headphones.alias?? 'FreeBuds')), Align( alignment: Alignment.centerRight, child: _HeadphonesSettingsButton(headphones), @@ -53,10 +54,10 @@ class HeadphonesControlsWidget extends StatelessWidget { children: [ Text( // TODO: This hardcode - headphones.alias ?? 'FreeBuds 4i', + headphones.alias ?? 'FreeBuds', style: tt.headlineMedium, ), - HeadphonesImage(headphones), + HeadphonesImage(headphones, getAsset(headphones.alias ?? 'FreeBus')), ], ), ), @@ -79,6 +80,19 @@ class HeadphonesControlsWidget extends StatelessWidget { ), ); } + + String getAsset(String name) { + + int pos = 0; + + for (int i = 0; i < OtterConst.btDevNameRegex.length; i++) { + if (OtterConst.btDevNameRegex[i].hasMatch(name)) { + pos = i ; + } + } + return OtterConst.imageAsset[pos]; + } + } /// Simple button leading to headphones settings page diff --git a/lib/ui/pages/home/controls/headphones_image.dart b/lib/ui/pages/home/controls/headphones_image.dart index 61173d8..5086751 100644 --- a/lib/ui/pages/home/controls/headphones_image.dart +++ b/lib/ui/pages/home/controls/headphones_image.dart @@ -9,8 +9,9 @@ import '../../../../headphones/headphones_base.dart'; /// ...well, in the future :D class HeadphonesImage extends StatelessWidget { final HeadphonesBase headphones; + final String assetPath; - const HeadphonesImage(this.headphones, {Key? key}) : super(key: key); + const HeadphonesImage(this.headphones, this.assetPath, {Key? key}) : super(key: key); @override Widget build(BuildContext context) { @@ -19,7 +20,7 @@ class HeadphonesImage extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(horizontal: 64), child: Image.asset( - 'assets/app_icons/ic_launcher.png', + assetPath, fit: BoxFit.contain, filterQuality: FilterQuality.none, ), diff --git a/macos/Flutter/Flutter-Debug.xcconfig b/macos/Flutter/Flutter-Debug.xcconfig index c2efd0b..4b81f9b 100644 --- a/macos/Flutter/Flutter-Debug.xcconfig +++ b/macos/Flutter/Flutter-Debug.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Flutter/Flutter-Release.xcconfig b/macos/Flutter/Flutter-Release.xcconfig index c2efd0b..5caa9d1 100644 --- a/macos/Flutter/Flutter-Release.xcconfig +++ b/macos/Flutter/Flutter-Release.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Podfile b/macos/Podfile new file mode 100644 index 0000000..c795730 --- /dev/null +++ b/macos/Podfile @@ -0,0 +1,43 @@ +platform :osx, '10.14' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_macos_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_macos_build_settings(target) + end +end diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index 4885ef0..50975b0 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 51; + objectVersion = 54; objects = { /* Begin PBXAggregateTarget section */ @@ -182,7 +182,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1430; ORGANIZATIONNAME = ""; TargetAttributes = { 33CC10EC2044A3C60003C045 = { @@ -235,6 +235,7 @@ /* Begin PBXShellScriptBuildPhase section */ 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -344,7 +345,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.11; + MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; @@ -423,7 +424,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.11; + MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; @@ -470,7 +471,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.11; + MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index d830a68..ea47b24 100644 --- a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ regex.hasMatch("HUAWEI FreeBuds 4i")), true); + expect(OtterConst.btDevNameRegex.any((regex) => regex.hasMatch("HUAWEI FreeBuds 4i ")), true); + expect(OtterConst.btDevNameRegex.any((regex) => regex.hasMatch("huawei freebuds 4i")), false); + expect(OtterConst.btDevNameRegex.any((regex) => regex.hasMatch("HUAWEI FreeBuds Pro")), true); }); }); }