├── .gitignore
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── LICENSE.txt
├── README.md
├── docs
├── build.gradle
└── src
│ └── orchid
│ └── resources
│ ├── assets
│ ├── css
│ │ └── jacquard.scss
│ ├── js
│ │ └── jacquard.js
│ └── media
│ │ ├── apis
│ │ ├── connect.png
│ │ └── connected.png
│ │ ├── dfu
│ │ ├── dfu_complete.png
│ │ ├── dfu_progress.png
│ │ ├── fw_check.png
│ │ └── jq_onboarding_complete.png
│ │ ├── logo.svg
│ │ ├── search-icon.svg
│ │ └── tutorial
│ │ ├── activity_main.png
│ │ ├── create_conected_activity.png
│ │ ├── create_main_activity.png
│ │ └── create_new_project.png
│ ├── config.yml
│ ├── homepage.md
│ ├── templates
│ ├── includes
│ │ └── sidebar.peb
│ └── layouts
│ │ └── index.peb
│ └── wiki
│ ├── apis.md
│ ├── cloud-api-terms.md
│ ├── codelabs.md
│ ├── conduct.md
│ ├── contributing.md
│ ├── firmware_update.md
│ ├── generate-docs.md
│ ├── integration.md
│ ├── license.md
│ ├── releases.md
│ ├── summary.md
│ └── tutorial.md
├── sample
├── .gitignore
├── app
│ ├── .gitignore
│ ├── build.gradle
│ ├── lint.xml
│ ├── proguard-rules.pro
│ └── src
│ │ ├── androidTest
│ │ └── java
│ │ │ └── com
│ │ │ └── google
│ │ │ └── android
│ │ │ └── jacquard
│ │ │ └── sample
│ │ │ └── ExampleInstrumentedTest.java
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── ic_launcher-playstore.png
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── google
│ │ │ │ └── android
│ │ │ │ └── jacquard
│ │ │ │ └── sample
│ │ │ │ ├── ActivityResult.kt
│ │ │ │ ├── BluetoothStateChangeReceiver.kt
│ │ │ │ ├── ConnectivityManager.kt
│ │ │ │ ├── KnownTag.kt
│ │ │ │ ├── MainActivity.kt
│ │ │ │ ├── MainActivityViewModel.kt
│ │ │ │ ├── Preferences.kt
│ │ │ │ ├── ResourceLocator.kt
│ │ │ │ ├── SampleApplication.kt
│ │ │ │ ├── ViewModelFactory.kt
│ │ │ │ ├── dialog
│ │ │ │ ├── BottomSheetDialogFragment.kt
│ │ │ │ ├── BottomSheetItem.kt
│ │ │ │ ├── DFUUtil.kt
│ │ │ │ ├── DefaultDialog.kt
│ │ │ │ └── DialogUtils.kt
│ │ │ │ ├── firmwareupdate
│ │ │ │ ├── ApplyFirmwareListener.kt
│ │ │ │ ├── FirmwareManager.kt
│ │ │ │ ├── FirmwareUpdateFragment.kt
│ │ │ │ └── FirmwareUpdateViewModel.kt
│ │ │ │ ├── fragment
│ │ │ │ └── extensions
│ │ │ │ │ └── FragmentExtension.kt
│ │ │ │ ├── gesture
│ │ │ │ ├── GestureAdapter.kt
│ │ │ │ ├── GestureFragment.kt
│ │ │ │ ├── GestureInfo.kt
│ │ │ │ ├── GestureInfoAdapter.kt
│ │ │ │ ├── GestureInfoFragment.kt
│ │ │ │ ├── GestureView.kt
│ │ │ │ └── GestureViewModel.kt
│ │ │ │ ├── haptics
│ │ │ │ ├── HapticPatternType.kt
│ │ │ │ ├── HapticsAdapter.kt
│ │ │ │ ├── HapticsFragment.kt
│ │ │ │ └── HapticsViewModel.kt
│ │ │ │ ├── home
│ │ │ │ ├── HomeFragment.kt
│ │ │ │ ├── HomeTileModel.kt
│ │ │ │ ├── HomeTilesListAdapter.kt
│ │ │ │ ├── HomeViewModel.kt
│ │ │ │ ├── ItemClickListener.kt
│ │ │ │ └── ItemOffsetDecoration.kt
│ │ │ │ ├── imu
│ │ │ │ ├── IMUFragment.kt
│ │ │ │ ├── ImuDataListAdapter.kt
│ │ │ │ ├── ImuSamplesListFragment.kt
│ │ │ │ ├── ImuSamplesListViewModel.kt
│ │ │ │ ├── ImuSessionListAdapter.kt
│ │ │ │ ├── ImuStreamingFragment.kt
│ │ │ │ ├── ImuStreamingViewModel.kt
│ │ │ │ ├── ImuViewModel.kt
│ │ │ │ └── db
│ │ │ │ │ ├── ImuSessionDao.kt
│ │ │ │ │ └── JqSessionInfo.kt
│ │ │ │ ├── ledpattern
│ │ │ │ ├── LedPatternAdapter.kt
│ │ │ │ ├── LedPatternFragment.kt
│ │ │ │ ├── LedPatternItem.kt
│ │ │ │ └── LedPatternViewModel.kt
│ │ │ │ ├── musicalthreads
│ │ │ │ ├── MusicalThreadsFragment.kt
│ │ │ │ ├── MusicalThreadsViewModel.kt
│ │ │ │ ├── audio
│ │ │ │ │ ├── Fader.kt
│ │ │ │ │ ├── SoundPlayer.kt
│ │ │ │ │ ├── SoundPoolPlayer.kt
│ │ │ │ │ └── Stream.kt
│ │ │ │ └── player
│ │ │ │ │ ├── Constants.kt
│ │ │ │ │ ├── PluckThreadsPlayerImpl.kt
│ │ │ │ │ └── ThreadsPlayer.kt
│ │ │ │ ├── places
│ │ │ │ ├── GestureAdapter.kt
│ │ │ │ ├── GestureItem.kt
│ │ │ │ ├── PlacesConfigFragment.kt
│ │ │ │ ├── PlacesConfigViewModel.kt
│ │ │ │ ├── PlacesDetailsFragment.kt
│ │ │ │ ├── PlacesDetailsViewModel.kt
│ │ │ │ ├── PlacesItem.kt
│ │ │ │ ├── PlacesListAdapter.kt
│ │ │ │ ├── PlacesListFragment.kt
│ │ │ │ ├── PlacesListViewModel.kt
│ │ │ │ └── db
│ │ │ │ │ ├── PlaceItem.kt
│ │ │ │ │ └── PlaceItemDao.kt
│ │ │ │ ├── renametag
│ │ │ │ ├── RenameTagFragment.kt
│ │ │ │ └── RenameTagViewModel.kt
│ │ │ │ ├── scan
│ │ │ │ ├── AdapterItem.kt
│ │ │ │ ├── ScanAdapter.kt
│ │ │ │ ├── ScanFragment.kt
│ │ │ │ └── ScanViewModel.kt
│ │ │ │ ├── splash
│ │ │ │ ├── SplashFragment.kt
│ │ │ │ └── SplashViewModel.kt
│ │ │ │ ├── storage
│ │ │ │ ├── ImuSessionsRepository.kt
│ │ │ │ ├── JQRoomDatabase.kt
│ │ │ │ └── PlacesRepository.kt
│ │ │ │ ├── tagmanager
│ │ │ │ ├── TagDetailsFragment.kt
│ │ │ │ ├── TagDetailsViewModel.kt
│ │ │ │ ├── TagManagerAdapter.kt
│ │ │ │ ├── TagManagerFragment.kt
│ │ │ │ └── TagManagerViewModel.kt
│ │ │ │ ├── touchdata
│ │ │ │ ├── TouchDataViewModel.kt
│ │ │ │ └── TouchYourThreadsFragment.kt
│ │ │ │ └── utilities
│ │ │ │ ├── AbilityConstants.kt
│ │ │ │ ├── CustomBottomProgress.kt
│ │ │ │ ├── CustomProgressLoader.kt
│ │ │ │ ├── DateUtil.kt
│ │ │ │ ├── JacquardRelativeLayout.kt
│ │ │ │ ├── Recipe.kt
│ │ │ │ ├── RecipeManager.kt
│ │ │ │ ├── ShakeDetector.kt
│ │ │ │ ├── TwoFingerDoubleTapDetector.kt
│ │ │ │ └── Util.kt
│ │ └── res
│ │ │ ├── anim
│ │ │ ├── enter_from_left.xml
│ │ │ ├── enter_from_right.xml
│ │ │ ├── exit_to_left.xml
│ │ │ └── exit_to_right.xml
│ │ │ ├── color
│ │ │ ├── red_green_activated_color.xml
│ │ │ ├── solid_black_bg_color.xml
│ │ │ └── solid_black_text_color.xml
│ │ │ ├── drawable-hdpi
│ │ │ ├── jq_tag.webp
│ │ │ └── product_blur_image_hear.webp
│ │ │ ├── drawable-mdpi
│ │ │ └── jq_tag.webp
│ │ │ ├── drawable-xhdpi
│ │ │ ├── jq_tag.webp
│ │ │ └── product_blur_image_hear.webp
│ │ │ ├── drawable-xxhdpi
│ │ │ ├── jq_tag.webp
│ │ │ └── product_blur_image_hear.webp
│ │ │ ├── drawable-xxxhdpi
│ │ │ └── jq_tag.webp
│ │ │ ├── drawable
│ │ │ ├── button_background_gradient.xml
│ │ │ ├── button_update_all_selector.xml
│ │ │ ├── clear_icon.xml
│ │ │ ├── config_button_gradient.xml
│ │ │ ├── delete.xml
│ │ │ ├── download.xml
│ │ │ ├── font_color_with_states.xml
│ │ │ ├── gray_outline.xml
│ │ │ ├── green_indicator.xml
│ │ │ ├── haptics_icon.xml
│ │ │ ├── ic_add_24px.xml
│ │ │ ├── ic_blink.xml
│ │ │ ├── ic_blue.xml
│ │ │ ├── ic_brush_in.xml
│ │ │ ├── ic_brush_out.xml
│ │ │ ├── ic_chevron_left_24px.xml
│ │ │ ├── ic_close_24px.xml
│ │ │ ├── ic_cover.xml
│ │ │ ├── ic_double_tap.xml
│ │ │ ├── ic_green.xml
│ │ │ ├── ic_group_607.xml
│ │ │ ├── ic_info_icon.xml
│ │ │ ├── ic_led_duration.xml
│ │ │ ├── ic_more.xml
│ │ │ ├── ic_pink.xml
│ │ │ ├── ic_play.xml
│ │ │ ├── ic_settings_suggest_disable.xml
│ │ │ ├── ic_settings_suggest_enable.xml
│ │ │ ├── ic_shine.xml
│ │ │ ├── ic_stop_all.xml
│ │ │ ├── ic_strobe.xml
│ │ │ ├── ic_toggle_off_24px.xml
│ │ │ ├── ic_toggle_on_24px.xml
│ │ │ ├── led_duration_selected_background.xml
│ │ │ ├── led_duration_selector.xml
│ │ │ ├── led_duration_unselected_background.xml
│ │ │ ├── list_view_divider.xml
│ │ │ ├── overflow.xml
│ │ │ ├── paired_icon.xml
│ │ │ ├── play_circle_filled_24px.xml
│ │ │ ├── product_backpack_outline.xml
│ │ │ ├── product_blur_image_hear.webp
│ │ │ ├── product_jacket_outline.xml
│ │ │ ├── protokit_a0.xml
│ │ │ ├── protokit_b0.xml
│ │ │ ├── red_indicator.xml
│ │ │ ├── round_corner_places.xml
│ │ │ ├── scan_item_selected_background.xml
│ │ │ ├── scan_item_unselected_background.xml
│ │ │ ├── scan_list_item_selector.xml
│ │ │ ├── scan_list_item_serial_number_selector.xml
│ │ │ ├── scan_list_item_tag_name_selector.xml
│ │ │ ├── scan_tag_icon_selector.xml
│ │ │ ├── setting_suggest.xml
│ │ │ ├── shape_tile_disabled.xml
│ │ │ ├── shape_tile_enabled.xml
│ │ │ ├── share.xml
│ │ │ ├── splash_logo.xml
│ │ │ ├── stop_reacording.xml
│ │ │ ├── stop_recording_button_drawable.xml
│ │ │ ├── switch_selector.xml
│ │ │ ├── tag_indicator_icon.xml
│ │ │ ├── tag_unselected_icon.xml
│ │ │ ├── thread_line.xml
│ │ │ ├── thread_line0.xml
│ │ │ ├── thread_line_off.xml
│ │ │ ├── thread_line_on_1.xml
│ │ │ ├── thread_line_on_2.xml
│ │ │ ├── thread_line_on_3.xml
│ │ │ ├── thread_line_on_4.xml
│ │ │ ├── thread_line_on_5.xml
│ │ │ ├── thread_line_on_6.xml
│ │ │ ├── thread_line_on_7.xml
│ │ │ ├── thread_line_on_8.xml
│ │ │ ├── thread_line_on_9.xml
│ │ │ ├── top_shadow_gradient.xml
│ │ │ └── view_session_data.xml
│ │ │ ├── font
│ │ │ └── sf_pro_display_medium.otf
│ │ │ ├── layout
│ │ │ ├── activity_main.xml
│ │ │ ├── assign_button.xml
│ │ │ ├── container_bottom_sheet.xml
│ │ │ ├── current_imu_session.xml
│ │ │ ├── custom_progress_bar_holder.xml
│ │ │ ├── fragment_custom_dialog.xml
│ │ │ ├── fragment_firmware_update.xml
│ │ │ ├── fragment_gesture.xml
│ │ │ ├── fragment_gesture_info.xml
│ │ │ ├── fragment_haptics.xml
│ │ │ ├── fragment_home.xml
│ │ │ ├── fragment_imu.xml
│ │ │ ├── fragment_led_pattern.xml
│ │ │ ├── fragment_musical_threads.xml
│ │ │ ├── fragment_places_config.xml
│ │ │ ├── fragment_places_details.xml
│ │ │ ├── fragment_places_list.xml
│ │ │ ├── fragment_rename_tag.xml
│ │ │ ├── fragment_scan.xml
│ │ │ ├── fragment_splash.xml
│ │ │ ├── fragment_tag_details.xml
│ │ │ ├── fragment_tag_manager.xml
│ │ │ ├── fragment_touch_data.xml
│ │ │ ├── gesture_item.xml
│ │ │ ├── gesture_list_item.xml
│ │ │ ├── gesture_overlay.xml
│ │ │ ├── gesture_overview_item.xml
│ │ │ ├── haptic_item.xml
│ │ │ ├── imu_bottom_sheet.xml
│ │ │ ├── imu_fragment_rtstream.xml
│ │ │ ├── imu_sample_list_item.xml
│ │ │ ├── imu_samples_list.xml
│ │ │ ├── imu_session_list_item.xml
│ │ │ ├── item_bottom_sheet.xml
│ │ │ ├── item_dfu_progress.xml
│ │ │ ├── item_product_section.xml
│ │ │ ├── item_product_tile_api.xml
│ │ │ ├── item_product_tile_sample_use_case.xml
│ │ │ ├── led_pattern_item.xml
│ │ │ ├── places_list_item.xml
│ │ │ ├── places_section_item.xml
│ │ │ ├── scan_list_section_header.xml
│ │ │ ├── scan_list_tag.xml
│ │ │ └── threads.xml
│ │ │ ├── mipmap-hdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-mdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xhdpi
│ │ │ ├── ic_launcher.png
│ │ │ ├── ic_launcher_round.png
│ │ │ └── tag_image.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ ├── ic_launcher.png
│ │ │ ├── ic_launcher_round.png
│ │ │ └── tag_image.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── navigation
│ │ │ └── navigation_graph.xml
│ │ │ ├── raw
│ │ │ ├── b2_3.mp3
│ │ │ ├── b3_4.mp3
│ │ │ ├── d3_5.mp3
│ │ │ ├── d4_10.mp3
│ │ │ ├── d4_6.mp3
│ │ │ ├── d4_9.mp3
│ │ │ ├── g2_1.mp3
│ │ │ ├── g3_2.mp3
│ │ │ ├── g3_7.mp3
│ │ │ ├── g4_11.mp3
│ │ │ ├── g4_12.mp3
│ │ │ └── g4_8.mp3
│ │ │ ├── values
│ │ │ ├── colors.xml
│ │ │ ├── dimens.xml
│ │ │ ├── strings.xml
│ │ │ ├── styles.xml
│ │ │ └── themes.xml
│ │ │ └── xml
│ │ │ └── file_paths.xml
│ │ └── test
│ │ └── java
│ │ └── com
│ │ └── google
│ │ └── android
│ │ └── jacquard
│ │ └── sample
│ │ ├── ExampleUnitTest.java
│ │ └── utilities
│ │ └── RecipeManagerTest.java
├── build.gradle
├── gradle.properties
├── gradle
│ └── wrapper
│ │ └── gradle-wrapper.properties
└── settings.gradle
├── scripts
└── generate_docs.sh
├── sdk
├── .gitignore
├── build.gradle
├── gradle.properties
├── sdk
│ ├── .gitignore
│ ├── build.gradle
│ ├── generateMavenArtifacts.sh
│ ├── libs
│ │ ├── libjacquard_core_proto-lite.jar
│ │ └── libjacquard_proto-lite.jar
│ ├── lint.xml
│ ├── proguard-rules.pro
│ └── src
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── google
│ │ │ │ └── android
│ │ │ │ └── jacquard
│ │ │ │ └── sdk
│ │ │ │ ├── BleAdapter.java
│ │ │ │ ├── BleGattCallback.java
│ │ │ │ ├── BleQueue.java
│ │ │ │ ├── BleScanCallback.java
│ │ │ │ ├── ConnectState.java
│ │ │ │ ├── JacquardManager.java
│ │ │ │ ├── JacquardManagerImpl.java
│ │ │ │ ├── JqExtensionRegistry.java
│ │ │ │ ├── ManagerScanningException.java
│ │ │ │ ├── MemoryCache.java
│ │ │ │ ├── SdkInitProvider.java
│ │ │ │ ├── StateMachine.java
│ │ │ │ ├── command
│ │ │ │ ├── AttachedNotificationSubscription.java
│ │ │ │ ├── BatteryStatus.java
│ │ │ │ ├── BatteryStatusCommand.java
│ │ │ │ ├── BatteryStatusNotificationSubscription.java
│ │ │ │ ├── ContinuousTouchNotificationSubscription.java
│ │ │ │ ├── DCErrorNotificationSubscription.java
│ │ │ │ ├── DataCollectionStatusCommand.java
│ │ │ │ ├── DeviceInfo.java
│ │ │ │ ├── DeviceInfoCommand.java
│ │ │ │ ├── DfuExecuteUpdateNotificationSubscription.java
│ │ │ │ ├── EraseImuSessionCommand.java
│ │ │ │ ├── GestureNotificationSubscription.java
│ │ │ │ ├── GetConfigCommand.java
│ │ │ │ ├── GetImuSessionDataCommand.java
│ │ │ │ ├── HapticCommand.java
│ │ │ │ ├── ImuSessionListCommand.java
│ │ │ │ ├── ImuSessionListNotification.java
│ │ │ │ ├── InnerAttachedNotificationSubscription.java
│ │ │ │ ├── InnerBatteryStatusNotificationSubscription.java
│ │ │ │ ├── InnerContinuousTouchNotificationSubscription.java
│ │ │ │ ├── InnerDCErrorNotificationSubscription.java
│ │ │ │ ├── InnerDfuExecuteUpdateNotificationSubscription.java
│ │ │ │ ├── InnerGestureNotificationSubscription.java
│ │ │ │ ├── InnerImuSessionListNotificationSubscription.java
│ │ │ │ ├── InnerLoadModuleNotificationSubscription.java
│ │ │ │ ├── InnerNotification.java
│ │ │ │ ├── ListModulesCommand.java
│ │ │ │ ├── LoadModuleCommand.java
│ │ │ │ ├── LoadModuleNotificationSubscription.java
│ │ │ │ ├── NotificationSubscription.java
│ │ │ │ ├── PlayLedPatternCommand.java
│ │ │ │ ├── ProtoCommandRequest.java
│ │ │ │ ├── RenameTagCommand.java
│ │ │ │ ├── SetConfigCommand.java
│ │ │ │ ├── SetTouchModeCommand.java
│ │ │ │ ├── StartImuSessionCommand.java
│ │ │ │ ├── StartImuStreamingCommand.java
│ │ │ │ ├── StopImuSessionCommand.java
│ │ │ │ ├── UjtReadConfigCommand.java
│ │ │ │ ├── UjtWriteConfigCommand.java
│ │ │ │ └── UnloadModuleCommand.java
│ │ │ │ ├── connection
│ │ │ │ ├── ConnectionEvent.java
│ │ │ │ ├── ConnectionState.java
│ │ │ │ ├── Result.java
│ │ │ │ └── TagConnectionStateMachine.java
│ │ │ │ ├── datastore
│ │ │ │ ├── ComponentMetaData.java
│ │ │ │ └── DataProvider.java
│ │ │ │ ├── dfu
│ │ │ │ ├── CacheRepository.java
│ │ │ │ ├── CacheRepositoryImpl.java
│ │ │ │ ├── CloudManager.java
│ │ │ │ ├── DFUChecker.java
│ │ │ │ ├── DFUInfo.java
│ │ │ │ ├── DfuExecuteCommand.java
│ │ │ │ ├── DfuManager.java
│ │ │ │ ├── DfuManagerImpl.java
│ │ │ │ ├── DfuPrepareCommand.java
│ │ │ │ ├── DfuStatusCommand.java
│ │ │ │ ├── DfuUtil.java
│ │ │ │ ├── DfuWriteCommand.java
│ │ │ │ ├── DownloadManager.java
│ │ │ │ ├── DownloadManagerImpl.java
│ │ │ │ ├── FirmwareImageWriterEvent.java
│ │ │ │ ├── FirmwareImageWriterState.java
│ │ │ │ ├── FirmwareImageWriterStateMachine.java
│ │ │ │ ├── FirmwareUpdateEvents.java
│ │ │ │ ├── FirmwareUpdateState.java
│ │ │ │ ├── FirmwareUpdateStateMachine.java
│ │ │ │ ├── RemoteDfuInfo.java
│ │ │ │ ├── execption
│ │ │ │ │ ├── FirmwareUpdateStoppedException.java
│ │ │ │ │ ├── InsufficientBatteryException.java
│ │ │ │ │ ├── UpdateMismatchException.java
│ │ │ │ │ └── UpdatedFirmwareNotFoundException.java
│ │ │ │ └── model
│ │ │ │ │ ├── FileDescriptor.java
│ │ │ │ │ ├── PlatformSettings.java
│ │ │ │ │ └── TransferState.java
│ │ │ │ ├── imu
│ │ │ │ ├── ImuModule.java
│ │ │ │ ├── Sensors.java
│ │ │ │ ├── exception
│ │ │ │ │ ├── DCException.java
│ │ │ │ │ ├── InprogressDCException.java
│ │ │ │ │ └── InvalidStateDCException.java
│ │ │ │ ├── model
│ │ │ │ │ ├── ImuSessionInfo.java
│ │ │ │ │ └── ImuStream.java
│ │ │ │ └── parser
│ │ │ │ │ ├── ImuParser.java
│ │ │ │ │ ├── ImuParserException.java
│ │ │ │ │ ├── ImuParserImpl.java
│ │ │ │ │ ├── ImuSessionData.java
│ │ │ │ │ └── JQImuParser.java
│ │ │ │ ├── initialization
│ │ │ │ ├── InitializationEvent.java
│ │ │ │ ├── InitializationState.java
│ │ │ │ ├── PendingRequest.java
│ │ │ │ ├── ProtocolInitializationStateMachine.java
│ │ │ │ ├── Transport.java
│ │ │ │ ├── TransportImpl.java
│ │ │ │ ├── TransportState.java
│ │ │ │ └── command
│ │ │ │ │ ├── BeginCommand.java
│ │ │ │ │ ├── DeviceInfoCommand.java
│ │ │ │ │ └── HelloCommand.java
│ │ │ │ ├── lm
│ │ │ │ ├── InitState.java
│ │ │ │ └── LoadableModule.java
│ │ │ │ ├── log
│ │ │ │ ├── LogLevel.java
│ │ │ │ ├── Logger.java
│ │ │ │ ├── LoggerImpl.java
│ │ │ │ └── PrintLogger.java
│ │ │ │ ├── model
│ │ │ │ ├── CharacteristicUpdate.java
│ │ │ │ ├── Component.java
│ │ │ │ ├── ComponentCapability.java
│ │ │ │ ├── ComponentKey.java
│ │ │ │ ├── DeviceConfigElement.java
│ │ │ │ ├── FailedToConnect.java
│ │ │ │ ├── GearState.java
│ │ │ │ ├── Gesture.java
│ │ │ │ ├── InternalComponent.java
│ │ │ │ ├── JacquardError.java
│ │ │ │ ├── Module.java
│ │ │ │ ├── Peripheral.java
│ │ │ │ ├── Product.java
│ │ │ │ ├── ProtocolSpec.java
│ │ │ │ ├── Revision.java
│ │ │ │ ├── RssiUpdate.java
│ │ │ │ ├── SdkConfig.java
│ │ │ │ ├── ServicesDiscovered.java
│ │ │ │ ├── TouchData.java
│ │ │ │ ├── TouchMode.java
│ │ │ │ ├── Vendor.java
│ │ │ │ └── VidPidMid.java
│ │ │ │ ├── pairing
│ │ │ │ ├── RequiredCharacteristics.java
│ │ │ │ ├── TagPairingEvent.java
│ │ │ │ ├── TagPairingState.java
│ │ │ │ └── TagPairingStateMachine.java
│ │ │ │ ├── remote
│ │ │ │ ├── LocalJsonParserImpl.java
│ │ │ │ ├── LocalParser.java
│ │ │ │ ├── LocalRemoteFunctionImpl.java
│ │ │ │ ├── MetaDataModel.java
│ │ │ │ ├── RemoteFactory.java
│ │ │ │ └── RemoteFunction.java
│ │ │ │ ├── rx
│ │ │ │ ├── Consumer.java
│ │ │ │ ├── Executors.java
│ │ │ │ ├── Fn.java
│ │ │ │ ├── Fn2.java
│ │ │ │ ├── Pred.java
│ │ │ │ ├── Producer.java
│ │ │ │ └── Signal.java
│ │ │ │ ├── tag
│ │ │ │ ├── AdvertisedJacquardTag.java
│ │ │ │ ├── AdvertisedJacquardTagImpl.java
│ │ │ │ ├── ConnectedJacquardTag.java
│ │ │ │ ├── ConnectedJacquardTagImpl.java
│ │ │ │ └── JacquardTag.java
│ │ │ │ └── util
│ │ │ │ ├── BluetoothSig.java
│ │ │ │ ├── BluetoothUtils.java
│ │ │ │ ├── FileLogger.java
│ │ │ │ ├── Fragmenter.java
│ │ │ │ ├── Function.java
│ │ │ │ ├── JQUtils.java
│ │ │ │ ├── Lists.java
│ │ │ │ ├── Objects.java
│ │ │ │ ├── SdkTypeAdapterFactory.java
│ │ │ │ └── StringUtils.java
│ │ └── res
│ │ │ └── raw
│ │ │ ├── badfirmwareversion.json
│ │ │ └── metadata.json
│ │ └── test
│ │ ├── java
│ │ └── com
│ │ │ └── google
│ │ │ └── android
│ │ │ └── jacquard
│ │ │ └── sdk
│ │ │ ├── BleAdapterTest.java
│ │ │ ├── BleGattCallbackTest.java
│ │ │ ├── BleQueueTest.java
│ │ │ ├── BleScanCallbackTest.java
│ │ │ ├── CommonContextStub.java
│ │ │ ├── ExampleUnitTest.java
│ │ │ ├── FakeBleAdapter.java
│ │ │ ├── FakeBluetoothGattCharacteristic.java
│ │ │ ├── FakeBluetoothGattDescriptor.java
│ │ │ ├── FakeCommand.java
│ │ │ ├── FakeConnectState.java
│ │ │ ├── FakeJacquardManagerImpl.java
│ │ │ ├── JacquardManagerImplTest.java
│ │ │ ├── JacquardManagerInitialization.java
│ │ │ ├── command
│ │ │ ├── AttachedNotificationSubscriptionTest.java
│ │ │ ├── BatteryStatusCommandTest.java
│ │ │ ├── BatteryStatusNotificationSubscriptionTest.java
│ │ │ ├── ContinuousTouchNotificationSubscriptionTest.java
│ │ │ ├── DeviceInfoCommandTest.java
│ │ │ ├── FakeComponent.java
│ │ │ ├── GestureNotificationSubscriptionTest.java
│ │ │ ├── HapticCommandTest.java
│ │ │ ├── InnerAttachedNotificationSubscriptionTest.java
│ │ │ ├── InnerBatteryStatusNotificationSubscriptionTest.java
│ │ │ ├── InnerContinuousTouchNotificationSubscriptionTest.java
│ │ │ ├── InnerGestureNotificationSubscriptionTest.java
│ │ │ ├── PlayLedPatternCommandTest.java
│ │ │ ├── RenameTagCommandTest.java
│ │ │ ├── SetTouchModeCommandTest.java
│ │ │ ├── UjtReadConfigCommandTest.java
│ │ │ └── UjtWriteConfigCommandTest.java
│ │ │ ├── connection
│ │ │ ├── ResultTest.java
│ │ │ └── TagConnectionStateMachineTest.java
│ │ │ ├── datastore
│ │ │ └── DataProviderTest.java
│ │ │ ├── dfu
│ │ │ ├── CacheRepositoryImplTest.java
│ │ │ ├── CacheRepositoryTest.java
│ │ │ ├── DFUCheckerTest.java
│ │ │ ├── DFUInfoTest.java
│ │ │ ├── DfuExecuteCommandTest.java
│ │ │ ├── DfuManagerImplTest.java
│ │ │ ├── DfuPrepareCommandTest.java
│ │ │ ├── DfuStatusCommandTest.java
│ │ │ ├── DfuUtilTest.java
│ │ │ ├── DfuWriteCommandTest.java
│ │ │ ├── DownloadCallbackTest.java
│ │ │ ├── DownloadManagerImplTest.java
│ │ │ ├── DummyDFUChecker.java
│ │ │ ├── FakeCall.java
│ │ │ ├── FakeCloudManager.java
│ │ │ ├── FakeDownloadCallback.java
│ │ │ ├── FakeDownloadManager.java
│ │ │ ├── FirmwareImageWriterStateMachineTest.java
│ │ │ └── model
│ │ │ │ └── FileDescriptorTest.java
│ │ │ ├── imu
│ │ │ ├── FakeDfuManager.java
│ │ │ └── ImuModuleTest.java
│ │ │ ├── initialization
│ │ │ ├── FakeProtocolInitializationStateMachine.java
│ │ │ ├── FakeTransportImpl.java
│ │ │ ├── FakeTransportState.java
│ │ │ ├── ProtocolInitializationStateMachineTest.java
│ │ │ └── TransportTest.java
│ │ │ ├── log
│ │ │ ├── LoggerImplTest.java
│ │ │ └── PrintLoggerTest.java
│ │ │ ├── model
│ │ │ ├── FakeDCTrialListNotification.java
│ │ │ ├── FakeImuModule.java
│ │ │ └── FakePeripheral.java
│ │ │ ├── pairing
│ │ │ ├── FakeTagPairingStateMachine.java
│ │ │ └── TagPairingStateMachineTest.java
│ │ │ ├── remote
│ │ │ ├── FakeLocalRemoteFunction.java
│ │ │ └── RemoteFunctionInitialization.java
│ │ │ ├── rx
│ │ │ └── SignalTest.java
│ │ │ ├── tag
│ │ │ ├── AdvertisedJacquardTagImplTest.java
│ │ │ ├── ConnectedJacquardTagImplTest.java
│ │ │ ├── ConnectedJacquardTagInitialization.java
│ │ │ ├── FakeAdvertisedJacquardTag.java
│ │ │ ├── FakeConnectedJacquardTagImpl.java
│ │ │ └── JacquardTagFactory.java
│ │ │ └── util
│ │ │ ├── FakeFragmenter.java
│ │ │ ├── FragmenterTest.java
│ │ │ └── StringUtilsTests.java
│ │ └── resources
│ │ ├── 1627344030.bin
│ │ ├── badfirmwareversion.json
│ │ └── metadata.json
└── settings.gradle
└── version.gradle
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/caches
5 | /.idea/libraries
6 | /.idea/modules.xml
7 | /.idea/workspace.xml
8 | /.idea/navEditor.xml
9 | /.idea/assetWizardSettings.xml
10 | /sample/.idea/gradle.xml
11 | .DS_Store
12 | /build
13 | /captures
14 | .externalNativeBuild
15 | .cxx
16 | local.properties
17 | docs/build
18 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Jacquard SDK
2 |
3 | Contributions to this project are welcomed. We request that you
4 | read through the guidelines before getting started.
5 |
6 | ## Contributor License Agreement
7 |
8 | Contributions to this project must be accompanied by a Contributor License
9 | Agreement (CLA). You (or your employer) retain the copyright to your
10 | contribution; this simply gives us permission to use and redistribute your
11 | contributions as part of the project. Head over to
12 |
T -> ()
*/
19 | public interface ConsumerT
. */
19 | public interface Producer
24 | * A connection to the tag can be established by calling
25 | * {@link JacquardManager#connect(AdvertisedJacquardTag)}.
26 | */
27 | public interface AdvertisedJacquardTag extends JacquardTag {
28 |
29 | /** The tag as a {@link BluetoothDevice}. */
30 | BluetoothDevice bluetoothDevice();
31 |
32 | /** Serial number used during pairing. The last 4 digit of the UJT serial number */
33 | String pairingSerialNumber();
34 | }
35 |
--------------------------------------------------------------------------------
/sdk/sdk/src/main/java/com/google/android/jacquard/sdk/tag/JacquardTag.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2021 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * https://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 | package com.google.android.jacquard.sdk.tag;
17 |
18 | import androidx.annotation.Nullable;
19 | import com.google.android.jacquard.sdk.rx.Signal;
20 | import java.io.Serializable;
21 |
22 | /** Based interface for Jacquard tags. */
23 | public interface JacquardTag extends Serializable {
24 |
25 | /** The bluetooth address of the tag. */
26 | String address();
27 |
28 | /** The name of the tag to display in the UI. */
29 | String displayName();
30 |
31 | /**
32 | * Returns the rssi signal strength for the tag. This is a functional interface whose functional method is {@link #run(T)}.
22 | *
23 | * @param
During ble scanning as and when available
33 | * will be notified. When tag get connected, rssi value will be notified every second.
34 | */
35 | @Nullable
36 | Signal