Filter
-
Content Type
-
Category
Mobile/Wearable
Visual Display
Digital Appliance
Platform
Mobile/Wearable
Visual Display
Digital Appliance
Platform
Filter
FAQ health
docfaq what are the main features of the samsung health sensor sdk? the main features of the samsung health sensor sdk include track raw and processed health sensor data on galaxy watch receive data from multiple health sensors for information about the available trackers, see what data is provided the continuous health tracker types are accelerometer heart rate photoplethysmogram ppg skin temperature continuous tracker types measured sensor data and periodically invokes a tracking event listener this enables the watch’s sensor data to be tracked continuously and provide more granular results while conserving battery life how do i get access to the samsung health sensor sdk? you can download the samsung health sensor sdk on the samsung developer portal and develop your app with enabling the developer mode of health sensor service note, the developer mode is intended only for testing or debugging your app it is not intended for app users please request a partnership before distributing your app see app creation process for more information to distribute your application using the samsung health sensor sdk, request for the samsung partner program when your request is reviewed, you receive information about how to access the sdk content for more information, see process does the samsung health sensor sdk work on android phones? no the samsung health sensor sdk supports only galaxy watch4 and later models running wear os powered by samsung it does not support other mobile devices, such as smartphones can supported health tracker types of the samsung health sensor sdk differ depending on the galaxy watch model or wear os version? yes the supported health tracker types can differ depending on the specific galaxy watch model and the watch software version the samsung health sensor sdk provides a capability check api it retrieves which tracker types are available on the user’s watch and can therefore be used by your application why do i get an sdk_policy_error when using samsung health sensor sdk? this error occurs when your app's package name or sha-256 signature does not match the information registered with samsung to use samsung health sensor sdk in a publicly distributed app, you must register your app by submitting a partnership request and providing the correct package name and sha-256 signature if the app is not registered or the information does not match, the sdk will return a policy error during development, you can use the sdk without registration by enabling the developer mode for more details, refer to app verification can i read data from more than one health tracker type simultaneously? yes, depending on the tracker type there are two tracker types on-demand tracker type, such as bia body composition and ecg electrocardiogram continuous tracker type, such as accelerometer and heart rate only one on-demand tracker type can be used at a time multiple continuous tracker types can be used simultaneously the measure blood oxygen level and heart rate on galaxy watch code lab demonstrates how to implement running on-demand and continuous tracker types is an emulator available for developing applications with the samsung health sensor sdk? no the samsung health sensor sdk doesn't support the emulator development with the sdk requires the galaxy watch device can i detect when users take the galaxy watch off their wrist? yes, depending on the tracker for the heart rate, spo2, bia body composition , and sweat loss trackers, you can use the samsung health sensor sdk to monitor the status field with the update listener for example, a heart rate status value of “-3” means that the wearable is not being worn for information about other status values and trackers, refer to the api reference alternatively, you can check the sensor type_low_latency_offbody_detect value for more information, see heart rate tracking with the off-body sensor does the samsung health sensor sdk receive its data through samsung health? no the samsung health sensor sdk does not share data with samsung health health services also provides heart rate tracking how is heart rate tracking with the samsung health sensor sdk different? the samsung health sensor sdk provides heart rate data tracking with ibi inter-beat interval , which can be used to calculate hrv heart rate variability this information can be used for more detailed analysis the android sensor manager also provides accelerometer tracking how is accelerometer tracking with the samsung health sensor sdk different? the accelerometer tracking provided by the samsung health sensor sdk records data samples with 25hz resolution continuously the sdk gathers sensor data in an application processor without waking up the cpu and sends an event at specific periods to a watch application this minimizes the watch's battery consumption and enables a watch application to track the user's status for the entire day
web
discover and developwith samsung use our tools and services to providean exceptional experience to samsung users around the world. view all products subscribe newsletter what’s new latest updates for developers stay updated with recent news, feature changes, and key announcements that highlight new additions and improvements. write exercise data to samsung health discover how to use samsung health data sdk to write health data directly into the samsung health app. switch to galaxy z fold8 moving your data is easier than ever. simply scan a qr code to transfer photos, apps, and accounts wirelessly. experience the all-new galaxy z series download the galaxy emulator skins for z flip8, z fold8, and z fold8 ultra to give your android studio emulator a galaxy device look. learn learn easily, build confidently visit code lab blog blog integrating revenuecat with samsung in-app purchase for galaxy store applications galaxy store, iap updated aug 13, 2026 blog how to manage buyer comments in galaxy store using the developer api galaxy store updated jul 23, 2026 blog introduce subscriptions for your games using the samsung iap unreal engine plugin samsung iap updated jun 30, 2026 blog never get caught off-guard again: samsung wallet brings real-time weather forecasts to your tickets samsung wallet updated jun 24, 2026 develop mobile / wearable get set up to use samsung mobile sdks in your apps. mobile / wearable visual display digital appliance platform galaxy gamedev build games for galaxy devices - the world's largest mobile gaming platform galaxy themes with galaxy themes, you can personalize galaxy devices' screens galaxy watch optimize your application performance health create a useful health app on galaxy watch and a smartphone samsung iap sdk make it possible to sell a variety of items in samsung galaxy apps samsung browser web developer guides for samsung browser samsung wallet an all-in-one, single-swipe solution for tickets, boarding passes, coupons, and more galaxy emulator skin app design guide for foldable phones remote test lab build apps to control desktops with smartphones smart tv build apps for samsung smart tvs smart hospitality display enhance guest experiences smart signage transform displays in business family hub make the kitchen the center of your home bixby apply voice to your apps smartthings add smartness to your user’s lives knox secure your devices tizen build apps that connect everything samsung see more mobile docs (15) see more mobile docs (15) galaxy sdk get started create your own applications with a variety of samsung galaxy sdks, services, and tools. galaxy ar emoji sdk create your own avatar in your app galaxy performance sdk optimize your application performance galaxy s pen remote sdk control apps remotely with your s pen galaxy z (foldable) app design guide for foldable phones samsung automation studio develop your apps using samsung automation studio samsung blockchain build blockchain-enabled services for mobile devices samsung dex build apps to control desktops with smartphones samsung ese sdk provides a way for service providers to deploy services using ese on samsung devices samsung teegris a powerful solution to run applications in a trusted execution environment apv codec advanced professional video codec mobile accessories major component placement for galaxy s/z phones samsung app management a solution to manage background applications for better system health samsung log video create professional videos with galaxy camera starting from s25 series samsung wireless fast charge enables samsung mobile devices to be fast-charged with the wireless fast charger design creating the future get in-depth information and resourcesto design high quality apps for samsung’s products and services. design system samsung design system is samsung eco’s design system for consistent and clear communication. one ui design guideline one ui helps you focus on what really matter to you one ui watch galaxy watch provides you new ux components, which allows you to use it to build new user experiences. distribute share with millions bring your apps and games to samsungreach hundreds of millions of galaxy users distribute your apps submit your apps to galaxy store and use key samsung programs to promote your apps. samsung apps tv seller office with demand for video servies constantly growing, now is the perfect opportunity to publish application for samsung smart tvs. redefine your game distribution stream your games on samsung mobile devices using instant plays 2.0, bringing users instant fun and excitement. connect and share more than on your ownsamsung developer forums visit the forums to ask questionsand exchange ideas with other developer. visit forums experts and tools with our support team we're here to help you be successful in the samsung developer ecosystem. learn more about our tools and how to communicate with our support team search faq by keyword and category submit a 1:1 support request and receive a responds explore testing tools and software resources get insights with recommended articles get support for partner samsung developerbusiness account join samsung business account to experience most of the service. add members, measure user engagement, streamline your onboarding process and much more - all at no cost create business account newsletter get monthly digest of the latest highlights from our developer products and programs email address first name last name 뉴스레터 전송을 위한 개인정보 수집∙이용에 동의합니다(필수). detail 광고성 정보 수신에 동의합니다(필수). detail i agree to data processing for sending newsletters. (required) detail i consent to receiving newsletters via email. (required) i consent to receiving newsletters via email. detail subscribe
tutorials iot
blogmatter is an open-source connectivity standard for smart home and internet of things (iot) devices. it is a secure, reliable, and seamless cross-platform protocol for connecting compatible devices and systems with one another. smartthings provides the matter virtual device application and smartthings home apis to help you quickly develop matter devices and use the smartthings ecosystem without needing to build your own iot ecosystem. supporting iot devices that can be operated from outside the home requires significant infrastructure investment. a cloud server must be built and maintained to deliver commands to the home, and if the device uses a mesh network technology such as thread, the user needs to have a supported hub in the home. users are also typically uninterested in purchasing multiple hubs to support all the brands of iot devices that they own. the smartthings home api, announced at sdc 2023, allows you to leverage the smartthings infrastructure for your own matter and iot products. the api enables you to use the smartthings cloud, which means your application can support matter devices connected to any of the 1.7 million smartthings hubs worldwide. in this tutorial, you will learn how to use the smartthings home apis to develop an iot application that onboards, controls, shares, and removes a smart lock device. for more information about smartthings matter, see matter in smartthings. prerequisites to follow along with this tutorial, you need the following hardware and software: host pc running on windows 10 (or higher) or ubuntu 20.04 (x64) android studio (latest version recommended) java se development kit (jdk) 11 or later mobile devices & smartthings station connected on the same network: mobile device with matter virtual device application installed mobile device with developer mode and usb debugging enabled matter-enabled smartthings station onboarded with the samsung account used for smartthings notethe smartthings home api materials, including the sample application project for this tutorial, are distributed only to authorized users. if you want permission to use the apis, contact st.matter@samsung.com. commission the device to onboard a matter-compatible device to your iot application, you must commission the device, joining it to the smartthings fabric. download the sample application project and open it in android studio. the following steps are implemented in the mainviewmodel.kt file at the path app > java > com.samsung.android.matter.home.sample > feature > main. step 1. create an instance of the matter commissioning client. step 2. call the commissiondevice() function to launch the onboarding activity in home service. step 3. set the value of _intentsender.value to the returned value. // todo 1 val commissioningclient = matter.getcommissioningclient() val intentsender = commissioningclient.commissiondevice(context) _intentsender.value = intentsender notefor all code examples in this tutorial, look for "todo #' in the sample application to find the location where you need to add the code. control the device capabilities are the core of the smartthings architecture. they abstract devices into their underlying functionalities, which allows you to retrieve the state of a specific device component or control specific functionality. each device has its own set of appropriate capabilities, each controlled with its own api function. consequently, the more capabilities the device supports, the more application code is needed to implement it. the following steps demonstrate implementing the capabilities for a smart lock device. they are implemented in the smartlockviewmodel.kt file at the path app > java > com.samsung.android.matter.home.sample > feature > device. step 1. to retrieve lock, tamper and battery status of a device capability: a. retrieve the appropriate capability from the device instance. b. extract the stream value for the appropriate feature from the capability. c. store the retrieved value for updating the ui. // todo 2 device.readcapability(lock)?.lock?.collect { lockunlock -> _lockstatus.value = lockunlock } // todo 3 device.readcapability(tamperalert)?.tamper?.collect { tamperalert -> _tamperstatus.value = tamperalert } // todo 4 device.readcapability(battery)?.battery?.collect { battery -> _batterystatus.value = battery } step 2. to control the lock status: a. retrieve the lock capability from the device instance. b. if lockstatus is unlock, call lock() function to close it. c. if lockstatus is not unlock, call unlock() function to open it. // todo 5 device.readcapability(lock)?.let { lock -> when (_lockstatus.value) { lockstatus.unlocked.statusname -> lock.lock() else -> lock.unlock() } } share the device using the smartthings home api, you can share matter devices connected to smartthings with other matter-compatible iot platforms without resetting the device. this enables the user to control the same device through additional controller applications, such as google home. the following steps are implemented in the baseviewmodel.kt file at the path app > java > com.samsung.android.matter.home.sample > feature > device > base. step 1. create an instance of the matter commissioning client. step 2. to launch the sharedevice activity in home service, call the sharedevice() function. step 3. set the value of _intentsenderforsharedevice.value to the returned value. // todo 6 val commissioningclient = matter.getcommissioningclient() val intentsender = commissioningclient.sharedevice( context, commissioningclient.sharedevicerequest(deviceid) ) _intentsenderforsharedevice.value = intentsender remove the device you can remove the device from the iot application and the smartthings fabric. the following steps are implemented in the baseviewmodel.kt file at the path app > java > com.samsung.android.matter.home.sample > feature > device > base. step 1. create an instance of the matter commissioning client. step 2. to launch the removedevice activity in home service, call the removedevice() function. step 3. set the value of _intentsenderforremovedevice.value to the returned value. // todo 7 val commissioningclient = matter.getcommissioningclient() val intentsender = commissioningclient.removedevice( context, commissioningclient.removedevicerequest(deviceid) ) _intentsenderforremovedevice.value = intentsender test the application to test the sample iot application with a virtual smart lock device: step 1. build and run the project on your android device. when you launch the application, it is synced to the smartthings application and your connected matter devices and hubs are listed on the home screen. step 2. to create a virtual smart lock device: a. launch the matter virtual device application on your other mobile device. b. select “door lock,” then tap “save” and “start” to receive a qr code. step 3. within the sample iot application, to onboard the virtual smart lock, tap “+” and scan the qr code. step 4. to lock and unlock the virtual smart lock, tap the button in the iot application. conclusion this tutorial has demonstrated how you can create an application to onboard and control a smart lock using the smartthings home api. to learn about onboarding and controlling other device types, go to code lab (matter: build a matter iot app with smartthings home api). for more information about smartthings matter, see matter in smartthings.
HyoJung Lee
Learn Code Lab
codelaboptimize your watch face design objective learn how to optimize watch face designs created in watch face studio by minimizing memory usage and reducing the on pixel ratio overview starting from watch face studio wfs version 1 6, watch face developers can now utilize the memory usage plugin during development to monitor the memory consumption of their watch faces this tool ensures that projects adhere to google's defined memory requirements another valuable feature of wfs is the aod always-on display analyzer, which evaluates the contribution of each component to the on pixel ratio opr the opr indicates the number of pixels that remain lit in aod mode since a higher opr results in more lit pixels, it directly impacts battery life the aod analyzer helps identify which layers, colors, or visual elements consume the most power, enabling developers to optimize designs for better energy efficiency both tools are essential for enhancing overall performance and user experience excessive memory usage can lead to lag and instability, while a high opr accelerates battery drain by understanding and balancing these metrics, developers can create visually dynamic and appealing watch faces while ensuring they remain optimized for power consumption and system efficiency set up your environment you will need the following watch face studio version 1 9 5 or higher memory usage plugin galaxy watch or smartwatch running on wear os 5 or higher adobe photoshop or any photo editing software noteto add the memory usage plugin to wfs, refer to the plugin installation guide sample project here is a sample project for this code lab download it and start your learning experience! optimize watch face sample project 1 1 mb start your project to load the sample project in watch face studio click open project in watch face studio locate the downloaded sample project and click open the sample project includes a design with high memory usage and opr check watch face’s initial memory usage and run aod analyzer click the diagnosis button to check the memory usage of the watch face while the diagnosis result indicates that the current memory usage of the watch face is significantly below the memory budget, which is 100 mb for normal mode and 10 mb for always-on mode see wo-p8 in performance and functionality requirements , it still consumes a considerable amount of memory this is notable given its simple design and lack of complex graphics next, go to the run pane and click the preview watch face icon in the preview watch face window, toggle the always-on state to see the watch face in ambient mode the current opr of the watch face is 59 7% it is recommended that your design uses no more than 15% of the available pixels in always-on states see wo-p7 in performance and functionality requirements click analyze to open the aod analyzer, a tool that checks each watch face component and color-codes how much each component contributes to the opr the aod analyzer indicates that the watch face design contains pixel-intensive components, which increase the opr adjusting these components to stay within the 15% opr limit for both aod mode and normal mode can improve power efficiency and battery life adjust colors and sizes of components using dark colors in your watch face reduces power consumption, which applies to both always-on and normal modes additionally, higher-resolution bitmap assets consume more memory in the sample project, you can find very bright-colored and unnecessarily high-resolution images with extra transparent pixels that can be optimized go to the layer list and hide the gif_halfcircle layer temporarily to view the components behind it click on any empty space in the layer list to view the canvas color of the watch face currently, the color is set to #fbf5f5ff off-white , which is a very light color and can significantly increase the opr change the canvas color to #000000ff black you can also select other dark colors that you prefer next, select the image_squaregradient layer this image is unnecessarily high-resolution, with only a portion of it displayed on the screen you need to crop images like this first using photo editing software before importing them into the studio an optimized version of this image is ready for you to add go to add component > preset image select the image_halfcircletop png file from optimized resources folder included in the sample project drag the newly added image layer and place it above the image_squaregradient layer then, delete the image_squaregradient layer select the image_halfcircletop layer and, in the placement properties, choose align top next, select the image_circle layer by hiding the layer on top of it, you can see that half of the image is covered but still takes up space and affects performance as it is partially rendered additionally, the image has extra transparent pixels that are unnecessary crop this image or, from the optimized resources folder, add the image_halfcirclebottom png file adjust it placement like below drag the image_halfcirclebottom layer above the image_circle layer then, delete the image_circle layer you can combine images with the same purpose using any photo editing software, as this consumes less memory, particularly when working with high-quality complex graphics such as logos, illustrations, and textures from the optimized resources folder, add the image_backgroundcombined png file and align it as shown below drag the newly added image layer above the image_halfcircletop layer, and then delete both the image_halfcircletop and image_halfcirclebottom layers noteyou can optimize your images while preserving the bright colors of your watch face in normal mode by simply adding a dark version of your resources in the always-on tab this approach can still significantly reduce the opr while maintaining your color preferences utilize shapes whenever possible shapes are vector-based elements in wfs, defined by mathematical properties such as color, size, and position not pixel data like images they are lightweight, scale perfectly without pixelation, and have minimal impact on memory and storage additionally, shapes are fully adjustable in wfs, allowing you to easily tweak or animate them directly to further optimize the watch face, you can replace simple images in the sample project with shapes select image_outlinecircle this image is a plain white circle outline, which can be replicated using a shape go to add component > shape > ellipse rename the ellipse component to ellipse_outline and adjust its properties as follows delete the image_outlinecircle layer and drag the ellipse_outline layer on top of the image_center layer next, select the image_center layer this is an imported gradient image that consumes a significant amount of memory to improve the efficiency of the design, you can replace it with a shape filled with gradients add a component by selecting shapes > ellipse rename the newly added shape component to ellipse_center open the fill color properties of ellipse_center there are three available gradient types linear, radial, and angular choose radial and adjust the color stops and colors as follows drag the ellipse_center layer above the image_center layer then, delete the image_center layer unhide the gif_halfcircle layer and rerun diagnosis and aod analyzer to see how much the watch face has improved limit constantly updating complications and components having too many complications and components, especially those that update every second, can impact the overall performance and efficiency of a watch face when multiple components update simultaneously, the watch performs more background tasks to keep everything current this can lead to higher power consumption, increased memory usage, and slower interface responsiveness to ensure a smooth, energy-efficient, and visually clear user experience, it is generally advisable to keep the number of complications below eight and remove any unnecessary components temporarily hide the gif_halfcircle again select complication_wordclock, complication_unreadnotification, and complication_dayofweek, along with their background components ellipse_left, ellipse_right, and ellipse_top right-click on these layers and choose delete it is still possible for users to customize and set these complications in any quadrant edge complication slot, as these complications are designed to be editable directly on the device delete the progressbar_seconds and digital_clock unnecessary components that serve a similar purpose as other existing components, such as analogclock 1, can be removed to streamline the design and improve efficiency next, delete the ellipse_bottom_copy layer instead of hiding components using a tag expression, it is more effective to delete them, as components hidden in this manner are still partially rendered and can impact performance improve animated components animation can greatly enhance the overall aesthetic of a watch face when done thoughtfully smooth and well-timed animations can make the design feel more dynamic, premium, and engaging, adding a sense of liveliness that static designs often lack when incorporating animations, it's essential to use them purposefully for example, in the sample project, the component ellipse_bottom is set to blink every second while this adds visual interest, it also updates continuously, requiring the watch face to refresh each second this can lead to higher battery consumption without necessarily enhancing the user experience to optimize this, consider adding specific conditions for when the animation should occur in the ellipse_bottom fill opacity property, click on tags and change the tag expression to blink only every second when the heart rate is not normal i e , less than 60 or greater than 100 [hr]<60 + [hr]>100 ? [sec]%2==0 ?-100 0 0 unhide gif_halfcircle this component is a half-circle with a wipe animation that reveals the components underneath when the watch face is turned on it is a gif file while this file type is supported by wfs, it is still recommended to import webp animations, as they are smaller in file size, lighter to render, offer better image quality, and consume less power you can add the webp file from the optimized resources folder by going to add component > animation > animated gif/webp add the webp_halfcircle and position it as shown below drag the webp_halfcircle layer below the ellipse_center layer and delete the gif_halfcircle layer set the trigger property noteif possible, consider using tag expressions to animate your components this approach allows you to achieve visually appealing effects without putting unnecessary strain on the watch's memory and battery additionally, components with similar purposes, such as the hour hand and its shadow, should be grouped together, and a tag expression should be applied to the group for cohesive animation check the memory usage of the optimized watch face and rerun the aod analyzer run the diagnosis and aod analyzer to see how much the watch face improved you can reduce the opr further by hiding layers in always-on tab, as shown below notesince the second hand components sec_simple and sec_shadow_simple does not update in aod, it is recommended to hide it test the watch face to test your watch face on a smartwatch, you need to connect your watch to the same network as your computer in watch face studio, select run on device select the connected watch you want to test with if your watch is not detected automatically, click scan devices to detect your device or enter its ip address manually by clicking the + button the watch face launches upon successful installation you're done! congratulations! you have successfully achieved the goal of this code lab now, you can optimize a watch face using watch face studio! if you’re having trouble, you may download this file optimize watch face complete project 418 1 kb to learn more, explore watch face studio
tutorials digital payments
blogintegrating payments into a mobile app is a security-critical and ux-sensitive task. while flutter simplifies cross-platform development, platform-specific payment systems like samsung pay still require careful handling. samsung provides an official samsung pay sdk flutter plugin, which allows flutter applications to integrate samsung pay without writing custom platform channels. however, for production-grade integration, using the plugin correctly is essential, especially when it comes to checking samsung pay readiness. in this blog, you learn how to build a sample flutter application by using the official samsung pay sdk flutter plugin and following samsung-recommended best practices. you can download the complete sample project at the end of this blog. why use the official samsung pay sdk flutter plugin? integrating payment systems requires careful handling of platform constraints, security, and long-term maintainability. the samsung pay sdk flutter plugin addresses these concerns by providing an official abstraction over the native samsung pay sdk, enabling flutter applications to leverage samsung wallet features without direct interaction with platform-specific apis. by exposing supported dart apis and managing native sdk communication internally, the flutter plugin removes the need for custom methodchannel implementations and reduces integration risk. for flutter applications targeting samsung galaxy devices, this approach offers the most stable and maintainable path to samsung pay integration. the following diagram illustrates the high-level architecture of the samsung pay integration. figure 1: samsung pay integration architecture prerequisites before starting, ensure the following requirements are met: you are an approved samsung pay partner (approval typically takes a few days) a service is created in the samsung pay partner portal. find details from here. the latest version of android studio is installed the flutter sdk is installed and configured the samsung pay sdk flutter plugin is downloaded set up the integration code to start the integration process, add the samsung pay sdk flutter plugin to your project dependencies: dependencies: samsung_pay_sdk_flutter: path: ./samsungpaysdkflutter_v1.03.00/samsungpaysdkflutter next, configure the samsung pay sdk api level by setting a valid samsung pay sdk api version (latest version: 2.22) by opening android > app > src > main > androidmanifest.xml and adding the api level in the metadata inside the <application> tag. <meta-data android:name="spay_sdk_api_level" android:value="2.22" /> <!-- use the most recent sdk version to leverage the latest apis --> initialize samsung pay in flutter create an instance of samsungpaysdkflutter with valid partnerinfo (which contains the service id and service type). if you are a merchant, then the service type must be set to inapp_payment. the following code snippet initializes the samsung pay sdk using your service id and in-app payment configuration. import 'package:samsung_pay_sdk_flutter/samsung_pay_sdk_flutter.dart'; static final samsungpaysdkflutter sdk = samsungpaysdkflutter( partnerinfo( serviceid: service_id, data: { spaysdk.partner_service_type: servicetype.inapp_payment.name } ) ); check samsung pay availability samsung pay readiness must be checked before calling any api of the samsung pay sdk flutter plugin. there are several reasons why samsung pay might not be in the ready state, such as an unsupported device, unsupported region, or incomplete samsung wallet setup, so this check is mandatory. samsungpayconfig.sdk.getsamsungpaystatus( statuslistener( onsuccess: (status, bundle) { // status "2" means samsung pay is ready onresult(status == "2"); }, onfail: (errorcode, bundle) { // if status check fails, samsung pay is not ready onresult(false); } ) ); notedo not show the samsung pay button if the samsung pay status is not ready. create payment information with a custom payment sheet to initiate a transaction, you must create a payment request using a custom payment sheet. the amountboxcontrol object is mandatory for building a customsheet. it provides the monetary details of the transaction. amountboxcontrol amountcontrol = amountboxcontrol( strings.amount_control_id, strings.currency ); // add product item to the payment sheet amountcontrol.additem( product.productid, product.name, product.price, "" ); // set total amount (product price + additional fees) // you can add tax, shipping, or other fees here amountcontrol.setamounttotal( product.price + 5.00, // add $5 for shipping/fees as example spaysdk.format_total_price_only ); next, add the amountboxcontrol to the customsheet instance. customsheet customsheet = customsheet(); customsheet.addcontrol(amountcontrol); finally, create the payment information by populating the customsheetpaymentinfo instance // configure merchant information for the payment customsheetpaymentinfo paymentinfo = customsheetpaymentinfo( merchantname: "samsung pay flutter app", customsheet: customsheet ); // set merchant details paymentinfo.merchantid = "123456"; paymentinfo.setmerchantname("sample merchant"); paymentinfo.setmerchantcountrycode("us"); request payment to start the payment process, call the startinapppaywithcustomsheet() api. this api requires customsheetpaymentinfo and customsheettransactioninfolistener instances set up in the last step. when this api is called, a custom payment sheet is displayed on the merchant application screen. the user can select a registered card for the payment and change the billing and shipping addresses if needed. payment results are delivered to the customsheettransactioninfolistener. the oncardinfoupdated() callback is triggered when the user changes the payment card. in this callback, the updatesheet() method must be called to update current payment sheet. customsheettransactioninfolistener listener = customsheettransactioninfolistener( oncardinfoupdated: (paymentcardinfo cardinfo, customsheet sheet) { // called when user changes the selected card on payment sheet // you can update the sheet here if needed (e.g., change fees based on card) samsungpayconfig.sdk.updatesheet(sheet); }, onsuccess: (paymentinfo, paymentcredential, extradata) { // payment completed successfully // paymentcredential contains the encrypted card details to send to your backend print("payment successful!"); print("payment credential: $paymentcredential"); onsuccess(); }, onfail: (errorcode, bundle) { // payment failed or user cancelled print("payment failed: $errorcode"); onfail(errorcode); } ); lastly, call startinapppaywithcustomsheet() api to start the payment: samsungpayconfig.sdk.startinapppaywithcustomsheet(paymentinfo, listener); testing samsung pay integration follow the steps below to test samsung pay integration configure the stg environment: add tester accounts to your service and generate a debug expiration date for the test accounts. install samsung wallet test application: to test your application in the staging environment, the latest version of the samsung wallet test application is required. you can install it from the samsung pay partner portal. however, to test your app in production mode, you need to use a market released application. test cards: to thoroughly test your application, you must add at least one payment card to the samsung wallet application. samsung provides test cards for this purpose. keep in mind that the test cards only work in staging environments, not in production. run the application: after setting up the environment, build the application and test it on any supported galaxy device. figure 2: samsung pay flutter sample application release your application after successful testing, submit your application for release approval through the samsung pay developers portal. once approved, your app can be published for your users. conclusion using the official samsung pay sdk flutter plugin makes it simpler to create a secure and reliable payment integration for flutter applications on galaxy devices. by following samsung-recommended practices, such as checking samsung pay readiness and handling custom payment sheets correctly, you can build a production-ready and maintainable payment experience. additional resources samsung pay documentation provides an overview of the key features and highlights the benefits of using samsung pay. samsung pay partner onboarding is an end-to-end guide of becoming a partner to release your app. samsung pay – code lab is an interactive, hands-on tutorial that teaches you to how to integrate samsung pay sdk. samsung developer forums is an open community for developers where you can post your query and get support from other developers. samsung developer tech support channel is a 1-on-1 support channel where you can get assistance from the samsung engineers. download the complete sample project here.
Jakia Sultana
tutorials web, mobile
blogfoldable devices are here! these smartphones allow different form factors with just one device, which can lead to new opportunities for innovation. as developers should be able to detect what is the current posture of the device, the physical position in which a device holds, samsung is putting an effort within the w3c on making a new web standard called device posture api. this api allows web applications to request and be notified of changes in the device posture. web apps can take advantage of the new form factors and improve users’ experience. we’ve created this codelab to show you how you can take advantage of this new feature. before we start, if you would like to learn more about it in a different format, here is a video that we’ve created with more information about this api and foldables. 👉 would you like to do this codelab with mentors and in person? if you are in london we will have a first meetup to try this with real foldable devices, feel free to register here! (ed. this event has already occurred, but we're leaving the link intact.) what is the w3c and why you should care in the meantime, as i’ve mentioned before, there is a current proposal about how to take advantage of these foldable devices called ‘device posture api’. its current state is ‘draft’, which means that is still open to changes and discussion and has been published for review by the community, including w3c members, the public (you!), and other technical organizations. we’ve created a demo to show you how to use this api, hear your thoughts and teach you some capabilities of the web. at the end of this codelab you can send us your feedback here. let’s start working… 🛠️ hands on 1. set up your environment you will need the following: samsung internet latest version samsung galaxy z fold2, z fold3, z flip, or z flip3 if a physical device is not available for testing, use a) remote test lab requirements: samsung account java runtime environment (jre) 7 or later with java web start b) device posture api polyfill for testing using a non-foldable smartphone, just implement a polyfill to the project. 2. start your project open a new browser tab, go to https://glitch.com, and log in click new project, then select import from github enter the url of this repository 3. add html video markup note: take a look and check the files of your project before starting to code. in index.html, you will have two main sections, one is dedicated to the video camera and the other one to the camera controls. you can identify the video section as it contains the class video-container. complete the html markup by adding the <video> element, width, height, and id attributes. <div class="video-container"> <video id="video" width="1280" height="200" > video stream not available. </video> </div> once the video markup is added, the html file is complete. besides this, you can find: a <canvas> element into which the captured frames are stored and kept hidden since users don’t need to see it. an <img> element where the pictures will be displayed. 4. enable front and back cameras with facingmode in index.js, you'll find a startup() function, here is where you will be doing the following: initialize most values grab element references to use later set up the camera and image start by setting up the camera. you will have access to both front and back cameras by using facingmode, a domstring that indicates which camera is being used to capture images. it's always a good practice to check if this function is available for use. add the following lines of code in startup(): `let supports = navigator.mediadevices.getsupportedconstraints(); if (supports["facingmode"] === true) { flip_button.disabled = false; }` 5. link the media stream to the video element if you are able to use facingmode, the camera web app will use this option in the capture function to detect which is the current camera used and later send it to the flip button. now, the camera should be activated, insert this block of code after retrieving defaultopts.video value using facingmode: `navigator.mediadevices .getusermedia(defaultsopts) .then(_stream => { stream = _stream; video.srcobject = stream; video.play(); }) .catch(error => console.error(error));` in order to get the media stream, you call navigator.mediadevices.getusermedia() and request a video stream that returns a promise. the success callback receives a stream object as input. it is the <video> element's source to the new stream. once the stream is linked to the <video> element, start it playing by calling video.play(). it's always a good practice to include the error callback too, just in case the camera is not available or the permissions are denied. 6. take a look at the implementations in index.js at this point, the functionality of the web app is complete. before moving to the next step, let’s review the rest of the javascript code: there is an event listener video for the canplay event that will check when the video playback begins. if it's the first time running, it will set up video attributes like width and height. for the snip button, there is an event listener for click that will capture the picture. the flip button will be waiting for a click event to assign the flag about which camera is being used, front or back camera, within the variable shouldfaceuser, and initialize the camera again. clearpicture() creates an image and converts it to a format that will be displayed in the <img> element. finally, takepicture() captures the currently displayed video frame, converts it into a png file, and displays it in the captured frame box. 7. use the device posture api at this point, you should have a working prototype of a camera web app. the video camera should be displayed and a picture may be taken using the snip button. in addition, it will show a preview of the picture taken through the small preview display. the flip button allows you also to switch between front and back cameras. now, it’s time to play around with the layout of the web app and take advantage of the features available on a foldable device. in order to do that, you will implement the device posture api that allows developers to detect what is the current posture of the phone. in order to change the layout when the device is partially folded, the device posture that you will look for is in a form of a book or laptop. in style.css, apply the following media query: @media (device-posture: folded) { body { display: flex; flex-flow: column nowrap; } .video-container .camera-controls { flex: 1 1 env(fold-bottom); } .msg { display:block; margin: 5em; } using modern css features like display:flex and grid, you can change the layout of the body element and the elements with the class video-container and camera-controls when the phone is flipped. 8. test your app whether you test on a real foldable phone or on a remote test lab device, you need to enable the device posture api in the latest version of samsung internet. to do this, open the browser and type internet://flags in the url bar and search for either device posture api or screen fold api, then select enable. test in a real device if you have a real physical device, you can test it directly on samsung internet using the url that glitch provides you by clicking on show in a new window menu. just partially fold your phone and you will see how the layout changes and even discover a hidden message! use remote test lab the other option, if you don’t have a physical device, is by using remote test lab. you can choose any galaxy foldable devices from the list and follow the same instructions as you would with a real device. just make sure to enable the device posture api and have the latest version of samsung internet. use the buttons provided by remote test lab to partially fold your remote galaxy device. implement polyfill polyfill allows you to emulate behavior on devices that do not have folding capabilities. it helps you visualize how the content responds to the different angle and posture configurations. just include sfold-polyfill.js directly into your code and use the polyfill settings (screenfold-settings.js) of the web component that will emulate the angle of the device and therefore, it will change its posture. moreover, add the following code in index.html <head> … <script type='module' defer src="screenfold-settings.js"></script> <script src="sfold-polyfill.js"></script> … </head> <body> <section> <screenfold-settings></screenfold-settings> </section> … </body> 🥳 you did it! you’ve created a web app that detects when a foldable device change its posture. please let us know how it went here, we would like to hear your thoughts around this api, future codelabs and more! this feedback will go directly to the w3c devices and sensors group, so you will be part of the conversation around this draft too! thanks a lot for reading.
Laura Morinigo
events ai, iot, uiux, game, web, mobile, galaxy watch
blogthe samsung developer conference (sdc) for 2021 kicked off on october 26, 2021, and we hope you enjoyed the keynote and highlight sessions. as with many events, there is so much information to digest. fortunately, with the virtual format this year, developers can go back and review the sessions they've watched and study how they might take advantage of all the opportunities available with samsung platforms, sdks, and services. while there are too many announcements and technologies to cover in one post, here are some moments from the conference that should be interesting to developers. keynote samsung electronics president dj koh began the conference, as he's done in previous years. the keynote session included overviews of announcements that were described in more detail during the highlight sessions, tech talks, and code labs. voice control of iot devices (bixby/smartthings) samsung mobile senior vice president daniel ahn kicked off the announcements at sdc with a keynote session highlighting the integration of bixby voice control to the smartthings ecosystem with details from smartthings vice president samantha fein. technical talks with more details of the integration for developers and device manufacturers are also available. bixby : best voice interface for connected experience enabling intelligent voice control on your iot devices further, the smartthings platform team provided technical talks on the new smartthings edge platform and smartthings build for use in multi-family home environments. support for the matter standard was announced during the highlight session. samsung electronics vice president jaeyong jung and smartthings vice president samantha fein talked about the bright future for home automation with matter in this highlight session. the samsung newsroom has more information on the bixby and smartthings integration as well as the matter standard support. security and privacy with samsung knox samsung executive vice president kc choi details how samsung knox unlocks the $80b enterprise market with devices and services to ensure that critical data is secure and employee information is kept confidential. in the tech talk sessions below, samsung b2b product experts give developers the information they need to integrate their own apps and services for this lucrative market segment. samsung ese: a trusted partner for enhanced security redefining edge computing & foldables for b2b beyond a limit with the mobile b2b partner program developers with solutions for the enterprise market should sign up for the knox partner program. services and solutions for smarttv platform at sdc21, developers interested in smart tv solutions had plenty to learn. in the keynote, samsung eelectronics senior vice president yongjae kim and samsung research vice president bill mandel discussed many new and exciting opportunities for developers with the tizen platform, which are available for viewers to watch in these sessions. what's new in samsung smart tv services what’s new in tizen 6.5 what's next for tizen: smart screen for business build a trusted service with samsung tizen security what's new in the tizen web platform for smart tv game developers are rising stars with samsung the experience of the last 18 months has shown that self-care is important to our well-being. by allowing us to disconnect from reality, games help reduce stress and give a temporary reprieve from the stresses of daily life. samsung support for gamers and game developers comes to the forefront at sdc21 with these important sessions. galaxy store: games-focused, developer-friendly games for everyone: samsung instant plays in addition to mobile gaming, the announcement of hdr10+ for gaming will delight gamers looking forward to top-quality experiences on smart tvs. building better web experiences with samsung internet the samsung internet browser ships with every samsung galaxy phone. the developers and advocates for samsung internet want to ensure that consumers have the best possible experiences, mixing web content with mobile hardware. how to build browser extensions on samsung internet unfolding the future of responsive web design one ui brings beautiful and secure interactions to your mobile world samsung electronics executive vice president janghyun yoon unveiled the one ui 4 platform, showing numerous examples of beautifully designed cross-device experiences, such as taking a photograph from galaxy z flip3, sharing to the galaxy book, and editing using a galaxy tab s with s pen. while beauty is only skin deep, one ui 4 adds layers of security to these experiences. learn more about one ui 4 in these sessions. one ui 4 design: focus, comfort, self-expression one ui: designing a more approachable experience designers and developers explore new worlds with one ui watch platform galaxy watch4 was introduced at galaxy unpacked in august 2021. the one ui watch platform uses wear os powered by samsung. developers interested in bringing their ideas to the new platform should check out these talks. watch ecosystem: a new era build your app in the new watch ecosystem galaxy watch4 for enterprise business new health platform based on wear os powered by samsung further, designers who are interested in expressing their creative side with watch face designs should view this session on how to use watch face studio to create beautiful designs without writing code. rewarding successful developers with the best of galaxy store awards samsung sr. developer evangelist tony morelan presents the best of galaxy store awards, now in their 4th year. these awards are samsung's way to express gratitude to those developers and designers who are bringing beautiful and exciting apps, games, and themes to galaxy store. for the second year, the bixby team recognized the top developer and capsule for their platform. following up with samsung this site has many resources for developers looking to build for and integrate with samsung devices and services. stay in touch with the latest news by creating a free account and subscribing to our monthly newsletter. visit the marketing resources page for information on promoting and distributing your apps through the galaxy store. finally, our developer forum is an excellent way to stay up-to-date on all things related to the galaxy ecosystem. thank you for joining us for sdc21 and we look forward to seeing you in 2022.
Samsung Developers
tutorials mobile
blogsamsung wallet enables users to easily access various digital content, such as boarding passes, tickets, and coupons, on their samsung device. users can save the content to their samsung wallet by clicking an “add to wallet” button or link. this article describes how to integrate your digital content with samsung wallet. each piece of digital content is represented by a wallet card which you must create and launch within the samsung wallet portal. after successfully launching the card, you can create an “add to wallet” link for it. prerequisites before you can create wallet cards for samsung wallet, complete the samsung wallet partner registration and onboarding process, including encryption setup. after onboarding, you receive an email with your public key and signed security certificate. keep this information in a safe place. important your company can only obtain partnership for a single samsung account. store your private key securely, as it is needed for wallet card management. your encryption settings cannot be modified without administrator approval. creating wallet cards samsung wallet supports the following wallet card types: boarding pass event ticket coupon gift card loyalty card id card create your wallet card at the samsung wallet portal. you can create as many cards as you need. the samsung wallet portal also allows you to manage your cards and monitor their performance. testing wallet cards use the “add to wallet” test tool to test the card at any time, before or after launching it: in the samsung wallet portal, enable testing mode for the card you want to test. skip this step if you have already launched the card. on your samsung device, go to the “add to wallet” test tool and sign in with your samsung account. select the card from the list and provide test data in the appropriate fields. in the “partner’s private key” field, paste your decrypted private key. this must be the same private key that was used during onboarding. noteif your private key is encrypted, you must first decode it with the ssl command. an encrypted key starts with the following text: -----begin encrypted private key----- once decoded, the key starts with the following text: -----begin private key----- 5. tap the “add to samsung wallet” button to add the card to samsung wallet on your device. for more information about testing wallet cards, see “add to wallet” test tool. launching wallet cards when you are ready to make the wallet card accessible to users, click “launch” to start the verification process. launching a card cannot be canceled. figure 1: wallet card launched the samsung wallet administrator reviews the card and approves or rejects it. if your card is rejected, check the rejection email for the reason. modify the card to address the issue and launch it again. for more information about wallet card verification, see launch wallet cards (verifying status) and launch wallet cards (rejected status). implementing “add to wallet” links after launching your wallet card, create a link that users can click to add the content to their samsung wallet. to include the card data in tokenized form, use the following url format: https://a.swallet.link/atw/v1/{card id}#clip?cdata={cdata token} where: {card id} path parameter is the unique identifier for the wallet card in the samsung wallet portal. #clip hash parameter is case-sensitive. cdata query parameter contains the encrypted card data in jwt format. for more information, see the "cdata token generation" section below. if the encrypted card data is longer than 2048 bytes, or you do not want to include the tokenized data in the url, store and reference the card data on your server. create the url in the following format: https://a.swallet.link/atw/v1/{card id}#clip?pdata={reference id} where: {card id} path parameter is the unique identifier for the wallet card in the samsung wallet portal. #clip hash parameter is case-sensitive. pdata query parameter is the unique identifier for the card data stored on your server. for more information on “add to wallet” links, see add to wallet interface. cdata token generation the card data in basic json format must be provided as a jwt (json web token). for token generation details, see security. you can also study the cdata generation sample code. to ensure your cdata token is valid, keep the following requirements in mind: pay attention to the mandatory fields in the card object. all timestamps are utc epoch time in milliseconds. card data attributes vary based on the card type. for detailed card data specifications, see wallet cards. your private key must match the key used for the security certificate signed by samsung. if you are using the correct private key, the following commands generate the same hash: $ openssl rsa -noout -modulus -in partner.key | openssl md5 $ openssl x509 -noout -modulus -in partner.crt | openssl md5 generated jwt tokens expire in 30 seconds. the “add to wallet” link must be used within this time. otherwise, you must generate a new token and new link. next steps to integrate the “add to wallet” feature as a button in your application or website, see implement the button. you can update the information on a card that has been stored in a user’s samsung wallet by communicating between your server and the samsung server. for information, see server interaction. if you have any questions or face difficulties implementing the content in this article, you can contact samsung developer support. related resources samsung wallet documentation integrate “add to samsung wallet” button into partner services code lab
M. A. Hasan Molla
tutorials digital payments
blogthe samsung pay sdk offers developers the ability to seamlessly incorporate mobile and online payment solutions and push provisioning capabilities into their applications, enhancing functionality and user experience. for samsung pay partners, mastering the development lifecycle and proactively addressing potential challenges are essential best practices for ensuring a smooth and successful integration. by adopting these strategies, developers can enhance the reliability of their implementations and minimize disruptions, ultimately delivering a superior user experience. this guide outlines the partnership process, best practices for development, testing strategies, and release process to ensure a smooth integration experience. setting up your partnership to begin integrating the samsung pay sdk, follow these steps: create a samsung account: use your company email to register your samsung account. personal emails may lead to rejection. register in the partner portal: to prevent rejection of your partnership request, ensure the following mandatory company details are provided accurately: business account name company name company legal structure company country number of employees company address company phone number company introduction company data universal numbering system (duns) number company website url collaborator access: your colleagues can also sign up to be a member of your business account using either the business account name or the manager's email address to collaborate on your projects. review process: a relationship manager (rm) will review your application within 2-3 business days. if no response is received, contact samsung developer support with your company name, country, and samsung account details. while awaiting for approval, you can explore the samsung pay sdk programming guide. once your partnership request has been approved, you're ready to configure your project by creating a new service and registering your application. you can find more details of the service creation process in the samsung pay documentation. key considerations and troubleshooting in the development phase follow the development guide, sample applications and code labs while integrating the samsung pay sdk. to avoid common pitfalls during implementation, make sure the following preparations have been implemented: verify the manifest configuration: verify the inclusion of necessary queries. <queries> <package android:name="com.samsung.android.spay" /> </queries> apply optimizer rules: make sure you have applied the correct proguard or dexguard rules to prevent runtime errors. proguard rules: dontwarn com.samsung.android.sdk.samsungpay.** -keep class com.samsung.android.sdk.** { *; } -keep interface com.samsung.android.sdk.** { *; } dexguard rules: -keepresourcexmlelements manifest/application/meta-data@name=spay_sdk_api_level for banks and financial institutions, verify the issuer name for push provisioning: confirm the issuer name matches your setup. if you are getting an empty list from the getallcard() method, check that the issuer name on the samsung pay portal matches the issuer name of the card. you can ensure the correct issuer name is used by adding the card to the samsung wallet application and retrieve the information from it: open the samsung wallet. tap on the card. tap on the three-dot menu. select the customer services option. the issuer name can be found under the title. figure 1: retrieving the issuer name from the samsung wallet application for merchants/payment gateways supporting samsung pay online payment, check the service id and package name configuration: ensure alignment with partner portal configuration. detailed information about the configuration can be found in the partner onboarding guide. check the allow list configuration: ensure you have added the samsung test accounts in the allow list. follow these steps to add the test accounts to your service: log into the partner portal. go to my projects > service management. click on your service name > add samsung account on the service details page. figure 2:adding test accounts to the allow list check the service expiration date: make sure that your service id is currently valid. to generate or extend the validity date of the service: go to my projects > service management. select the service name to open the service details page. click generate new date. provide samsung accounts for testing the application. these accounts are placed on the allow list for testing. click generate. the new expiration date of your service appears on the page. remember to extend the date after 90 days if you continue testing your application past that point. figure 3: generating the service expiration date for merchants supporting samsung pay online payment, provide a valid csr: for in-app payment services, you must upload a valid certificate signing request (csr) in the partner portal. this csr is provided to you by your payment gateway (pg). if issues persist check the faq: samsung pay guide has an extensive list of common error codes and solutions for common issues. check this faq to help you resolve your issue: samsung pay faq submit a support ticket: you can reach out to the samsung engineers directly by creating a support ticket from samsung developer support. include detailed issue descriptions, affected apis, expected vs. actual responses from the api, and attach dumpstate logs. to capture dumpstate logs, follow the below steps: dial *#9900# > set debug level to mid > restart the device. reproduce the issue and re-enter *#9900# > run dumpstate/logcat > save logs to sd card. package the logs in a zip file and submit them. notelogs expire after 15 minutes. testing with the samsung wallet application the service status flow for samsung pay sdk begins with the debugging stage, where the service is still under internal testing and can only be accessed by authorized samsung accounts in the allow list. once testing is complete, the partner submits the service along with the release version of the apk for approval, transitioning it to the pending state. at this stage, the service still remains accessible only to the authorized samsung accounts while awaiting review. the relationship manager (rm) then evaluates the submission. if the service meets all requirements, it is marked as approved and becomes eligible for public use. however, if the service fails to meet the necessary standards, it is rejected, indicating that further improvements are needed before resubmission. samsung offers both production and staging environments to test your application with the samsung pay partner portal. for testing using the staging environment, you need the service id from the partner portal, the staging version of the samsung wallet application, and test cards. you can find the staging version of the samsung wallet application from the partner portal by navigating to support > request test app then clicking galaxy app url to copy the test application link. make sure that you have registered your test accounts to use the samsung pay stg application. you can access the test cards for the staging environment at test cards on samsung pay. release your application the release process of your application can begin as soon as you upload a release version of your application. after that, keep an eye on the status of the release version under app details on your portal dashboard. to begin the release process, upload a new release version of your application: go to my projects > app management. click on the application name to open its details, then click add new release version. you can also click the add new version button corresponding to the application from the app management dashboard. drag and drop your apk file in the field provided or click the paperclip icon to browse for it. drag and drop up to three screenshots demonstrating your application's compliance with samsung pay's branding guidelines. click register. when the service status is approved, you're ready to publish the application. summary integrating the samsung pay sdk streamlines mobile payment solutions, offering partners a robust and scalable platform. by adhering to the onboarding guidelines, addressing development challenges proactively, and rigorously testing in both environments, you can ensure a successful deployment. samsung’s dedicated support team and resources are readily available to assist at every stage. leverage them to optimize your integration journey. visit the samsung pay developer portal for official documentation and additional resources.
Ummey Habiba Bristy
Learn Code Lab
codelabmatter create a virtual device and make an open source contribution objective learn how to create a matter virtual device, which you can control using the smartthings app also, know how to contribute your code to matter open source overview matter is an open-source connectivity standard for smart home and internet of things iot devices it is a secure, reliable, and seamless cross-platform protocol for connecting compatible devices and systems with one another smartthings provides the matter virtual device app and smartthings home apis to help you quickly develop matter devices and use the smartthings ecosystem without needing to build your own iot ecosystem you can use smartthings home apis to onboard, control, remove, and share all matter devices when building your application other iot ecosystems can use the matter devices onboarded on your iot app through the multi-admin function notethis code lab focuses only on creating a matter virtual device you can control using the smartthings app to learn how to make your controller app, see build a matter iot app with smartthings home apis set up your environment you will need the following host pc running on windows 10 or higher or ubuntu 20 04 x64 android studio latest version recommended java se development kit jdk 11 or later devices connected on the same network mobile device with android 8 0 oreo or higher operating system os mobile device with smartthings app installed matter-enabled smartthings station onboarded with samsung account used for smartthings app initial setup turn on developer mode and enable usb debugging option on your mobile device install a few os-specific dependencies by entering the below command in your terminal window $ sudo apt-get install git gcc g++ pkg-config libssl-dev libdbus-1-dev \ libglib2 0-dev libavahi-client-dev ninja-build python3-venv python3-dev \ python3-pip unzip libgirepository1 0-dev libcairo2-dev libreadline-dev to build the matter virtual device app, install sdk platform 26 and ndk version 22 1 7171670 using sdk manager in android studio after installing ndk, register the ndk path to the env path export android_ndk_home=[ndk path] export path=$path ${android_ndk_home} install kotlin compiler kotlinc version 1 5 10 after installing kotlinc, register the kotlinc path to the env path export kotlinc_home=[kotlinc path]/bin export path=$path ${kotlinc_home} sample code here is a sample code for you to start coding in this codelab download it and start your learning experience! matter virtual device sample code 11 42 mb start your project after downloading the sample code containing the project files, open your android studio and click open to open an existing project locate the downloaded android project from the directory and click ok select and create the device type when you build and run the sample matter virtual device app, you can see the already added on/off switch aside from the switch, other types of devices you can create are already prepared in the sample app noterefer to the matter device library specification for the list of matter devices you can create go to feature > main > java > com matter virtual device app feature main in the mainfragment kt file, select the device type you want to create mainuistate start -> { // =================================================================================== // codelab // todo uncomment the following lines to add your own device type // ----------------------------------------------------------------------------------- val itemlist = listof device onoffswitch, // sample // device occupancysensor, // level 1 8+ mins // device contactsensor, // level 2 8+ mins // device videoplayer, // level 2 10+ mins // device doorlock, // level 3 15+ mins // device extendedcolorlight, // level 3 15+ mins // device windowcovering, // level 4 17+ mins // device thermostat, // level 5 20+ mins // =================================================================================== depending on the device type you selected at this step, the part you need to modify at the next step will vary the level of modification complexity is assigned per each device get cluster value clusters are the functional building block elements of the data model a cluster can be an interface, a service, or an object class, and it is the lowest independent functional element in the data model a matter device supports a set of appropriate clusters, which can interact with your preferred controller such as smartthings this allows for easy information retrieval, behavior setting, event notifications, and more through the viewmodel, get the value of the cluster used in the device you created noteto learn more about clusters, see matter application cluster specification occupancy sensorlevel 1 file path feature > sensor > java > com matter virtual device app feature sensor file name occupancysensorviewmodel kt // =================================================================================== // codelab level 1 // the current status of the occupancy the boolean value is used by the [occupancyfragment] // to react to update ui // todo 1 uncomment the following code blocks // ----------------------------------------------------------------------------------- //private val _occupancy stateflow<boolean> = getoccupancyflowusecase //val occupancy livedata<boolean> // get = _occupancy aslivedata // =================================================================================== // =================================================================================== // codelab level 1 // the current status of the battery the int value is used by the [occupancyfragment] // to react to update fragment's ui // todo 2 uncomment the following code blocks // ----------------------------------------------------------------------------------- //private val _batterystatus mutablestateflow<int> = // getbatpercentremainingusecase as mutablestateflow<int> //val batterystatus livedata<int> // get = _batterystatus aslivedata // =================================================================================== // =================================================================================== // codelab level 1 // triggered by the "occupancy" button in the [occupancyfragment] // [setoccupancyusecase] will update the boolean value of the new occupancy status // todo 3 uncomment the following code blocks // ----------------------------------------------------------------------------------- //viewmodelscope launch { // timber d "current value = ${_occupancy value}" // if _occupancy value { // timber d "set value = false" // setoccupancyusecase false // } else { // timber d "set value = true" // setoccupancyusecase true // } //} // =================================================================================== // =================================================================================== // codelab level 1 // triggered by the "battery" seekbar in the [occupancyfragment] // [batterystatus] store the current status of the battery to indicate the progress // todo 4 uncomment the following code blocks // ----------------------------------------------------------------------------------- //_batterystatus value = progress // =================================================================================== // =================================================================================== // codelab level 1 // triggered by the "battery" seekbar in the [occupancyfragment] // [updatebatteryseekbarprogress] update the current status of the battery to indicate the // progress // [setbatpercentremainingusecase] will update the int value of the new battery status // todo 5 uncomment the following code blocks // ----------------------------------------------------------------------------------- //viewmodelscope launch { // updatebatteryseekbarprogress progress // setbatpercentremainingusecase progress //} // =================================================================================== contact sensorlevel 2 file path feature > sensor > java > com matter virtual device app feature sensor file name contactsensorviewmodel kt // =================================================================================== // codelab level 2 // the current status of the contact the boolean value is used by the [contactsensorfragment] // to react to update ui // todo 1 uncomment the following code blocks // ----------------------------------------------------------------------------------- //private val _statevalue stateflow<boolean> = getstatevalueflowusecase //val statevalue livedata<boolean> // get = _statevalue aslivedata // =================================================================================== // =================================================================================== // codelab level 2 // the current status of the battery the int value is used by the [contactsensorfragment] // to react to update fragment's ui // todo 2 uncomment the following code blocks // ----------------------------------------------------------------------------------- //private val _batterystatus mutablestateflow<int> = // getbatpercentremainingusecase as mutablestateflow<int> //val batterystatus livedata<int> // get = _batterystatus aslivedata // =================================================================================== // =================================================================================== // codelab level 2 // triggered by the "contact" button in the [contactsensorfragment] // [setstatevalueusecase] will update the boolean value of the new contact status // todo 3 uncomment the following code blocks // ----------------------------------------------------------------------------------- //viewmodelscope launch { // timber d "current value = ${_statevalue value}" // if _statevalue value { // timber d "set value = false" // setstatevalueusecase false // } else { // timber d "set value = true" // setstatevalueusecase true // } //} // =================================================================================== // =================================================================================== // codelab level 2 // triggered by the "battery" seekbar in the [contactsensorfragment] // [batterystatus] store the current status of the battery to indicate the progress // todo 4 uncomment the following code blocks // ----------------------------------------------------------------------------------- //_batterystatus value = progress // =================================================================================== // =================================================================================== // codelab level 2 // triggered by the "battery" seekbar in the [contactsensorfragment] // [updatebatteryseekbarprogress] update the current status of the battery to indicate the // progress // [setbatpercentremainingusecase] will update the int value of the new battery status // todo 5 uncomment the following code blocks // ----------------------------------------------------------------------------------- //viewmodelscope launch { // updatebatteryseekbarprogress progress // setbatpercentremainingusecase progress //} // =================================================================================== video playerlevel 2 file path feature > media > java > com matter virtual device app feature media file name videoplayerviewmodel kt // =================================================================================== // codelab level 2 // the current status of the on/off the boolean value is used by the [videoplayerfragment] // to react to update fragment's ui // todo 1 uncomment the following code blocks // ----------------------------------------------------------------------------------- //private val _onoff stateflow<boolean> = getonoffflowusecase //val onoff livedata<boolean> // get = _onoff aslivedata // =================================================================================== // =================================================================================== // codelab level 2 // the current status of the playback state the int value is used by the [videoplayerfragment] // to react to update fragment's ui // todo 2 uncomment the following code blocks // ----------------------------------------------------------------------------------- //private val _playbackstate stateflow<int> = getplaybackstateflowusecase //val playbackstate livedata<int> // get = _playbackstate aslivedata // =================================================================================== // =================================================================================== // codelab level 2 // the current status of the playback speed the int value is used by the [videoplayerfragment] // to react to update fragment's ui // todo 3 uncomment the following code blocks // ----------------------------------------------------------------------------------- //private val _playbackspeed stateflow<int> = getplaybackspeedflowusecase //val playbackspeed livedata<int> // get = _playbackspeed aslivedata // =================================================================================== // =================================================================================== // codelab level 2 // the current status of the key code the enum value is used by the [videoplayerfragment] // to react to update fragment's ui // todo 4 uncomment the following code blocks // ----------------------------------------------------------------------------------- //private val _keycode stateflow<keycode> = getkeycodestateflowusecase //val keycode livedata<keycode> // get = _keycode aslivedata // =================================================================================== // =================================================================================== // codelab level 2 // triggered by the "on/off" button in the [videoplayerfragment] // [setonoffusecase] will update the boolean value of the new on/off status // todo 5 uncomment the following code blocks // ----------------------------------------------------------------------------------- //viewmodelscope launch { // timber d "current value = ${_onoff value}" // if _onoff value { // timber d "set value = false" // setonoffusecase false // } else { // timber d "set value = true" // setonoffusecase true // } //} // =================================================================================== door locklevel 3 file path feature > closure > java > com matter virtual device app feature closure file name doorlockviewmodel kt // =================================================================================== // codelab level 3 // the current status of the lock the boolean value is used by the [doorlockfragment] // to react to update fragment's ui // ----------------------------------------------------------------------------------- // todo 1 copy code below private val _lockstate stateflow<boolean> = getlockstateflowusecase val lockstate livedata<boolean> get = _lockstate aslivedata // ============================================================================== // =================================================================================== // codelab level 3 // the current status of the battery the int value is used by the [doorlockfragment] // to react to update fragment's ui // ----------------------------------------------------------------------------------- // todo 2 copy code below private val _batterystatus mutablestateflow<int> = getbatpercentremainingusecase as mutablestateflow<int> val batterystatus livedata<int> get = _batterystatus aslivedata // ============================================================================== // =================================================================================== // codelab level 3 // triggered by the "lock" button in the [doorlockfragment] // [setlockstateusecase] will update the boolean value of the new lock status // ----------------------------------------------------------------------------------- // todo 3 copy code below viewmodelscope launch { timber d "current lockstate value = ${_lockstate value}" if _lockstate value == lock_state_locked { timber d "set value = unlocked" setlockstateusecase lock_state_unlocked } else { timber d "set value = locked" setlockstateusecase lock_state_locked } } // ============================================================================== // =================================================================================== // codelab level 3 // triggered by the "send alarm" button in the [doorlockfragment] // [sendlockalarmeventusecase] will send alarm event // [setlockstateusecase] will update the boolean value of the unlock status // ----------------------------------------------------------------------------------- // todo 4 copy code below viewmodelscope launch { if !_lockstate value { // if lockstate == locked, send alarm event and change the lockstate to unlocked sendlockalarmeventusecase setlockstateusecase lock_state_unlocked } } // ============================================================================== // =================================================================================== // codelab level 3 // triggered by the "battery" seekbar in the [doorlockfragment] // [batterystatus] store the current status of the battery to indicate the progress // ----------------------------------------------------------------------------------- // todo 5 copy code below _batterystatus value = progress // ============================================================================== // =================================================================================== // codelab level 3 // triggered by the "battery" seekbar in the [doorlockfragment] // [updatebatteryseekbarprogress] update the current status of the battery to indicate the // progress // [setbatpercentremainingusecase] will update the int value of the new battery status // ----------------------------------------------------------------------------------- // todo 6 copy code below viewmodelscope launch { updatebatteryseekbarprogress progress setbatpercentremainingusecase progress } // ============================================================================== extended color lightlevel 3 file path feature > lighting > java > com matter virtual device app feature lighting file name extendedcolorlightviewmodel kt // =================================================================================== // codelab level 3 // the current status of the on/off the boolean value is used by the [extendedcolorlightfragment] // to react to update ui // ----------------------------------------------------------------------------------- // todo 1 copy code below private val _onoff stateflow<boolean> = getonoffflowusecase val onoff livedata<boolean> get = _onoff aslivedata // =================================================================================== // =================================================================================== // codelab level 3 // the current status of the color level the int value is used by the // [extendedcolorlightfragment] // to react to update ui // ----------------------------------------------------------------------------------- // todo 2 copy code below private val _level stateflow<int> = getlevelflowusecase val level livedata<int> get = _level aslivedata // =================================================================================== // =================================================================================== // codelab level 3 // the current status of the color the enum value is used by the [extendedcolorlightfragment] // to react to update ui // ----------------------------------------------------------------------------------- // todo 3 copy code below private val _currenthue stateflow<int> = getcurrenthueflowusecase private val _currentsaturation stateflow<int> = getcurrentsaturationflowusecase val currentcolor livedata<hsvcolor> = combine _currenthue, _currentsaturation { currenthue, currentsaturation -> hsvcolor currenthue, currentsaturation } aslivedata // =================================================================================== // =================================================================================== // codelab level 3 // the current status of the color temperature the int value is used by the // [extendedcolorlightfragment] // to react to update ui // ----------------------------------------------------------------------------------- // todo 4 copy code below private val _colortemperature stateflow<int> = getcolortemperatureflowusecase val colortemperature livedata<int> get = _colortemperature aslivedata // =================================================================================== // =================================================================================== // codelab level 3 // triggered by the "on/off" button in the [extendedcolorlightfragment] // [setonoffusecase] will update the boolean value of the new on/off status // ----------------------------------------------------------------------------------- // todo 5 copy code below viewmodelscope launch { timber d "current value = ${_onoff value}" if _onoff value { timber d "set value = false" setonoffusecase false } else { timber d "set value = true" setonoffusecase true } } // =================================================================================== window coveringlevel 4 file path feature > closure > java > com matter virtual device app feature closure file name windowcoveringviewmodel kt // =================================================================================== // codelab level 4 // the current status of the position/operation the enum value is used by the // [windowcoveringfragment] // to react to update fragment's ui // ----------------------------------------------------------------------------------- // todo 1 copy code below val windowcoveringstatus livedata<windowcoveringstatus> = combine _currentposition, _operationalstatus { currentposition, operationalstatus -> windowcoveringstatus currentposition, operationalstatus } aslivedata // =================================================================================== // =================================================================================== // codelab level 4 // the current status of the battery the int value is used by the [windowcoveringfragment] // to react to update fragment's ui // ----------------------------------------------------------------------------------- // todo 2 copy code below private val _batterystatus mutablestateflow<int> = getbatpercentremainingusecase as mutablestateflow<int> val batterystatus livedata<int> get = _batterystatus aslivedata // =================================================================================== // =================================================================================== // codelab level 4 // triggered by the "windowshade" seekbar in the [windowcoveringfragment] // [settargetpositionusecase] will update the int value of the new target position status // ----------------------------------------------------------------------------------- // todo 3 copy code below viewmodelscope launch { timber d "target position = $percentage" settargetpositionusecase percentage } // =================================================================================== // =================================================================================== // codelab level 4 // triggered by the "open" button in the [fragment_window_covering xml] // [settargetpositionusecase] will update the int value of the open position 100 status // ----------------------------------------------------------------------------------- // todo 4 copy code below viewmodelscope launch { timber d "target position = 100" settargetpositionusecase 100 } // =================================================================================== // =================================================================================== // codelab level 4 // triggered by the "close" button in the [fragment_window_covering xml] // [settargetpositionusecase] will update the int value of the close position 0 status // ----------------------------------------------------------------------------------- // todo 5 copy code below viewmodelscope launch { settargetpositionusecase 0 } // =================================================================================== // =================================================================================== // codelab level 4 // triggered by the "pause" button in the [fragment_window_covering xml] // [settargetpositionusecase] will update the int value of the pause position status // ----------------------------------------------------------------------------------- // todo 6 copy code below viewmodelscope launch { timber d "current position = ${_currentposition value}, target position ${_targetposition value}" if _currentposition value != _targetposition value { settargetpositionusecase _currentposition value } } // =================================================================================== // =================================================================================== // codelab level 4 // triggered by the "battery" seekbar in the [windowcoveringfragment] // [batterystatus] store the current status of the battery to indicate the progress // ----------------------------------------------------------------------------------- // todo 7 copy code below _batterystatus value = progress // =================================================================================== // =================================================================================== // codelab level 4 // triggered by the "battery" seekbar in the [windowcoveringfragment] // [updatebatteryseekbarprogress] update the current status of the battery to indicate the // progress // [setbatpercentremainingusecase] will update the int value of the new battery status // ----------------------------------------------------------------------------------- // todo 8 copy code below viewmodelscope launch { updatebatteryseekbarprogress progress setbatpercentremainingusecase progress } // =================================================================================== thermostatlevel 5 file path feature > hvac > java > com matter virtual device app feature hvac file name thermostatviewmodel kt // =================================================================================== // codelab level 5 // the current status of the temperature the int value is used by the [thermostatfragment] // to react to update fragment's ui // ----------------------------------------------------------------------------------- // todo 1 copy code below private val _temperature mutablestateflow<int> = getlocaltemperatureusecase as mutablestateflow<int> val temperature livedata<int> get = _temperature aslivedata // =================================================================================== // =================================================================================== // codelab level 5 // the current status of the humidity the int value is used by the [thermostatfragment] // to react to update fragment's ui // ----------------------------------------------------------------------------------- // todo 2 copy code below private val _humidity mutablestateflow<int> = getrelativehumidityusecase as mutablestateflow<int> val humidity livedata<int> get = _humidity aslivedata // =================================================================================== // =================================================================================== // codelab level 5 // the current status of the system mode the enum value is used by the [thermostatfragment] // to react to update fragment's ui // ----------------------------------------------------------------------------------- // todo 3 copy code below private val _systemmode stateflow<thermostatsystemmode> = getsystemmodeflowusecase val systemmode livedata<thermostatsystemmode> get = _systemmode aslivedata // =================================================================================== // =================================================================================== // codelab level 5 // the current status of the fan mode the enum value is used by the [thermostatfragment] // to react to update fragment's ui // ----------------------------------------------------------------------------------- // todo 4 copy code below private val _fanmode stateflow<fancontrolfanmode> = getfanmodeflowusecase val fanmode livedata<fancontrolfanmode> get = _fanmode aslivedata // =================================================================================== // =================================================================================== // codelab level 5 // the current status of the cooling setpoint the int value is used by the [thermostatfragment] // to react to update fragment's ui // ----------------------------------------------------------------------------------- // todo 5 copy code below private val _occupiedcoolingsetpoint stateflow<int> = getoccupiedcoolingsetpointflowusecase val occupiedcoolingsetpoint livedata<int> get = _occupiedcoolingsetpoint aslivedata // =================================================================================== // =================================================================================== // codelab level 5 // the current status of the heating setpoint the int value is used by the [thermostatfragment] // to react to update fragment's ui // ----------------------------------------------------------------------------------- // todo 6 copy code below private val _occupiedheatingsetpoint stateflow<int> = getoccupiedheatingsetpointflowusecase val occupiedheatingsetpoint livedata<int> get = _occupiedheatingsetpoint aslivedata // =================================================================================== // =================================================================================== // codelab level 5 // the current status of the battery the int value is used by the [thermostatfragment] // to react to update fragment's ui // ----------------------------------------------------------------------------------- // todo 7 copy code below private val _batterystatus mutablestateflow<int> = getbatpercentremainingusecase as mutablestateflow<int> val batterystatus livedata<int> get = _batterystatus aslivedata // =================================================================================== // =================================================================================== // codelab level 5 // triggered by the "humidity" seekbar in the [thermostatfragment] // [humidity] store the current status of the humidity to indicate the progress // ----------------------------------------------------------------------------------- // todo 8 copy code below _humidity value = progress * 100 // =================================================================================== // =================================================================================== // codelab level 5 // triggered by the "humidity" seekbar in the [thermostatfragment] // [updatehumidityseekbarprogress] update the current status of the humidity to indicate the // progress // [setrelativehumidityusecase] will update the int value of the new humidity status [0 100] // * 100 // ----------------------------------------------------------------------------------- // todo 9 copy code below viewmodelscope launch { updatehumidityseekbarprogress progress setrelativehumidityusecase progress * 100 } // =================================================================================== // =================================================================================== // codelab level 5 // triggered by the "temperature" seekbar in the [thermostatfragment] // [temperature] store the current status of the temperature to indicate the progress // ----------------------------------------------------------------------------------- // todo 10 copy code below _temperature value = progress * 100 // =================================================================================== // =================================================================================== // codelab level 5 // triggered by the "temperature" seekbar in the [thermostatfragment] // [updatetemperatureseekbarprogress] update the current status of the temperature to indicate // the progress // [setlocaltemperatureusecase] will update the int value of the new temperature status // [value] * 100 // ----------------------------------------------------------------------------------- // todo 11 copy code below viewmodelscope launch { updatetemperatureseekbarprogress progress setlocaltemperatureusecase progress * 100 } // ==================================================================================== // =================================================================================== // codelab level 5 // triggered by the "battery" seekbar in the [thermostatfragment] // [batterystatus] store the current status of the battery to indicate the progress // ----------------------------------------------------------------------------------- // todo 12 copy code below _batterystatus value = progress // ==================================================================================== // =================================================================================== // codelab level 5 // triggered by the "battery" seekbar in the [thermostatfragment] // [updatebatteryseekbarprogress] update the current status of the battery to indicate the // progress // [setbatpercentremainingusecase] will update the int value of the new battery status // ----------------------------------------------------------------------------------- // todo 13 copy code below viewmodelscope launch { updatebatteryseekbarprogress progress setbatpercentremainingusecase progress } // ==================================================================================== // =================================================================================== // codelab level 5 // triggered by the "systemmode" popup in the [thermostatfragment] // [setsystemmodeusecase] will update the enum value of the new system mode status // ----------------------------------------------------------------------------------- // todo 14 copy code below viewmodelscope launch { setsystemmodeusecase systemmode } // ==================================================================================== // =================================================================================== // codelab level 5 // triggered by the "fanmode" popup in the [thermostatfragment] // [setfanmodeusecase] will update the enum value of the new fan mode status // ----------------------------------------------------------------------------------- // todo 15 copy code below viewmodelscope launch { setfanmodeusecase fanmode } // ==================================================================================== // =================================================================================== // codelab level 5 // triggered by the "heating plus" button in the [fragment_thermostat xml] // [setoccupiedheatingsetpointusecase] will update the int value of the +1 degree [degree] * // 100 // ----------------------------------------------------------------------------------- // todo 16 copy code below viewmodelscope launch { val nextvalue = _occupiedheatingsetpoint value + 100 timber d "current value = ${_occupiedheatingsetpoint value} set value = $nextvalue" setoccupiedheatingsetpointusecase nextvalue } // ==================================================================================== // =================================================================================== // codelab level 5 // triggered by the "heating minus" button in the [fragment_thermostat xml] // [setoccupiedheatingsetpointusecase] will update the int value of the -1 degree [degree] * // 100 // ----------------------------------------------------------------------------------- // todo 17 copy code below viewmodelscope launch { val nextvalue = _occupiedheatingsetpoint value - 100 timber d "current value = ${_occupiedheatingsetpoint value} set value = $nextvalue" setoccupiedheatingsetpointusecase nextvalue } // ==================================================================================== // =================================================================================== // codelab level 5 // triggered by the "cooling plus" button in the [fragment_thermostat xml] // [setoccupiedcoolingsetpointusecase] will update the int value of the +1 degree [degree] * // 100 // ----------------------------------------------------------------------------------- // todo 18 copy code below viewmodelscope launch { val nextvalue = _occupiedcoolingsetpoint value + 100 timber d "current value = ${_occupiedcoolingsetpoint value} set value = $nextvalue" setoccupiedcoolingsetpointusecase nextvalue } // ==================================================================================== // =================================================================================== // codelab level 5 // triggered by the "cooling minus" button in the [fragment_thermostat xml] // [setoccupiedcoolingsetpointusecase] will update the int value of the -1 degree [degree] * // 100 // ----------------------------------------------------------------------------------- // todo 19 copy code below viewmodelscope launch { val nextvalue = _occupiedcoolingsetpoint value - 100 timber d "current value = ${_occupiedcoolingsetpoint value} set value = $nextvalue" setoccupiedcoolingsetpointusecase nextvalue } // ==================================================================================== noteyou can find related files in android studio by going to edit menu> find > find in files and entering the keyword "codelab" observe cluster value next, use the observe function to keep track whenever there is a change in the cluster value occupancy sensorlevel 1 file path feature > sensor > java > com matter virtual device app feature sensor file name occupancysensorfragment kt // =================================================================================== // codelab level 1 // trigger the processing for updating new occupancy state of the virtual device // todo 1 uncomment the following code blocks // ----------------------------------------------------------------------------------- //binding occupancybutton setonclicklistener { viewmodel onclickbutton } // =================================================================================== // =================================================================================== // codelab level 1 // [onprogresschanged] will update the fragment's ui via viewmodel livedata // [onstoptrackingtouch] will trigger the processing for updating new battery state of the // virtual device // todo 2 uncomment the following code blocks // ----------------------------------------------------------------------------------- //binding occupancysensorbatterylayout titletext text = getstring r string battery //binding occupancysensorbatterylayout seekbardata = // seekbardata progress = viewmodel batterystatus //binding occupancysensorbatterylayout seekbar setonseekbarchangelistener // object seekbar onseekbarchangelistener { // override fun onprogresschanged seekbar seekbar, progress int, fromuser boolean { // viewmodel updatebatteryseekbarprogress progress // } // // override fun onstarttrackingtouch seekbar seekbar {} // // override fun onstoptrackingtouch seekbar seekbar { // viewmodel updatebatterystatustocluster seekbar progress // } // } // // =================================================================================== // =================================================================================== // codelab level 1 // observer on the current occupancy status and react on the fragment's ui // todo 3 uncomment the following code blocks // ----------------------------------------------------------------------------------- //viewmodel occupancy observe viewlifecycleowner { // if it { // binding occupancyvaluetext text = getstring r string occupancy_state_occupied // binding occupancybutton setimageresource r drawable ic_occupied // } else { // binding occupancyvaluetext text = getstring r string occupancy_state_unoccupied // binding occupancybutton setimageresource r drawable ic_unoccupied // } //} // =================================================================================== // =================================================================================== // codelab level 1 // observer on the current battery status and react on the fragment's ui // todo 4 uncomment the following code blocks // ----------------------------------------------------------------------------------- //viewmodel batterystatus observe viewlifecycleowner { // val text string = getstring r string battery_format, it // binding occupancysensorbatterylayout valuetext text = // html fromhtml text, html from_html_mode_legacy //} // =================================================================================== contact sensorlevel 2 file path feature > sensor > java > com matter virtual device app feature sensor file name contactsensorfragment kt // =================================================================================== // codelab level 2 // trigger the processing for updating new contact state of the virtual device // todo 1 uncomment the following code blocks // ----------------------------------------------------------------------------------- //binding contactbutton setonclicklistener { viewmodel onclickbutton } // =================================================================================== /** battery layout */ // =================================================================================== // codelab level 2 // [onprogresschanged] will update the fragment's ui via viewmodel livedata // [onstoptrackingtouch] will trigger the processing for updating new battery state of the // virtual device // todo 2 uncomment the following code blocks // ----------------------------------------------------------------------------------- //binding contactsensorbatterylayout titletext text = getstring r string battery //binding contactsensorbatterylayout seekbardata = seekbardata progress = viewmodel batterystatus //binding contactsensorbatterylayout seekbar setonseekbarchangelistener // object seekbar onseekbarchangelistener { // override fun onprogresschanged seekbar seekbar, progress int, fromuser boolean { // viewmodel updatebatteryseekbarprogress progress // } // // override fun onstarttrackingtouch seekbar seekbar {} // // override fun onstoptrackingtouch seekbar seekbar { // viewmodel updatebatterystatustocluster seekbar progress // } // } // // =================================================================================== // =================================================================================== // codelab level 2 // observer on the current contact status and react on the fragment's ui // todo 3 uncomment the following code blocks // ----------------------------------------------------------------------------------- //viewmodel statevalue observe viewlifecycleowner { // if it { // binding contactvaluetext text = getstring r string contact_state_close // binding contactbutton setimageresource r drawable ic_unoccupied // } else { // binding contactvaluetext text = getstring r string contact_state_open // binding contactbutton setimageresource r drawable ic_occupied // } //} // =================================================================================== // =================================================================================== // codelab level 2 // observer on the current battery status and react on the fragment's ui // todo 4 uncomment the following code blocks // ----------------------------------------------------------------------------------- //viewmodel batterystatus observe viewlifecycleowner { // val text string = getstring r string battery_format, it // binding contactsensorbatterylayout valuetext text = // html fromhtml text, html from_html_mode_legacy } // =================================================================================== video playerlevel 2 file path feature > media > java > com matter virtual device app feature media file name videoplayerfragment kt // =================================================================================== // codelab level 2 // [buttondata] observer on the current on/off status and react on the fragment's ui // [onclicklistener] trigger the processing for updating new on/off state of the virtual device // todo 1 uncomment the following code blocks // ----------------------------------------------------------------------------------- //binding videoplayeronofflayout buttondata = // buttondata // onoff = viewmodel onoff, // ontext = r string on_off_switch_power_on, // offtext = r string on_off_switch_power_off // //binding videoplayeronofflayout button setonclicklistener { viewmodel onclickbutton } // =================================================================================== // =================================================================================== // codelab level 2 // observer on the current playback status and react on the fragment's ui // todo 2 uncomment the following code blocks // ----------------------------------------------------------------------------------- //viewmodel playbackstate observe viewlifecycleowner { state -> // val statetext = convertplaybackstatetostring state // timber d "playbackstate $state $statetext " // binding videoplayerstatelayout valuetext text = statetext //} // =================================================================================== // =================================================================================== // codelab level 2 // observer on the current playback speed and react on the fragment's ui // todo 3 uncomment the following code blocks // ----------------------------------------------------------------------------------- //viewmodel playbackspeed observe viewlifecycleowner { speed -> // binding videoplayerspeedlayout valuetext text = speed tostring //} // =================================================================================== // =================================================================================== // codelab level 2 // observer on the current key code and react on the fragment's ui // todo 4 uncomment the following code blocks // ----------------------------------------------------------------------------------- //viewmodel keycode observe viewlifecycleowner { keycode -> // binding videoplayerkeypadlayout valuetext text = keycode value //} // =================================================================================== door locklevel 3 file path feature > closure > java > com matter virtual device app feature closure file name doorlockfragment kt // =================================================================================== // codelab level 3 // [buttondata] observer on the current lock status and react on the fragment's ui // [onclicklistener] trigger the processing for updating new lock state of the virtual device // ----------------------------------------------------------------------------------- // todo 1 copy code below binding doorlockonofflayout buttondata = buttondata onoff = viewmodel lockstate, ontext = r string door_lock_unlocked, offtext = r string door_lock_locked binding doorlockonofflayout button setonclicklistener { viewmodel onclickbutton } // =================================================================================== // =================================================================================== // codelab level 3 // trigger the processing for sending alarm event // ----------------------------------------------------------------------------------- // todo 2 copy code below binding doorlocksendalarmlayout button setonclicklistener { viewmodel onclicksendlockalarmeventbutton } // =================================================================================== // =================================================================================== // codelab level 3 // [onprogresschanged] will update the fragment's ui via viewmodel livedata // [onstoptrackingtouch] will trigger the processing for updating new battery state of the // virtual device // ----------------------------------------------------------------------------------- // todo 3 copy code below binding doorlockbatterylayout titletext text = getstring r string battery binding doorlockbatterylayout seekbardata = seekbardata progress = viewmodel batterystatus binding doorlockbatterylayout seekbar setonseekbarchangelistener object seekbar onseekbarchangelistener { override fun onprogresschanged seekbar seekbar, progress int, fromuser boolean { viewmodel updatebatteryseekbarprogress progress } override fun onstarttrackingtouch seekbar seekbar {} override fun onstoptrackingtouch seekbar seekbar { viewmodel updatebatterystatustocluster seekbar progress } } // =================================================================================== // =================================================================================== // codelab level 3 // observer on the current battery status and react on the fragment's ui // ----------------------------------------------------------------------------------- // todo 4 copy code below viewmodel batterystatus observe viewlifecycleowner { val text string = getstring r string battery_format, it binding doorlockbatterylayout valuetext text = html fromhtml text, html from_html_mode_legacy } // =================================================================================== extended color lightlevel 3 file path feature > lighting > java > com matter virtual device app feature lighting file name extendedcolorlightfragment kt // =================================================================================== // codelab level 3 // [buttondata] observer on the current on/off status and react on the fragment's ui // [onclicklistener] trigger the processing for updating new on/off state of the virtual device // ----------------------------------------------------------------------------------- // todo 1 copy code below binding extendedcolorlightonofflayout buttondata = buttondata onoff = viewmodel onoff, ontext = r string on_off_switch_power_on, offtext = r string on_off_switch_power_off binding extendedcolorlightonofflayout button setonclicklistener { viewmodel onclickbutton } // =================================================================================== // =================================================================================== // codelab level 3 // observer on the current color level status and react on the fragment's ui // ----------------------------------------------------------------------------------- // todo 2 copy code below viewmodel level observe viewlifecycleowner { // min 2 1% , max 255 100% val level int = it tofloat / 100 * 255 toint timber d "level $it" // if level value is 0, user can't distinguish the color // so, set it to half value + half of max binding extendedcolorlightcolorlayout colorboard drawable? alpha = level / 2 + 127 } // =================================================================================== // =================================================================================== // codelab level 3 // observer on the current color status and react on the fragment's ui // ----------------------------------------------------------------------------------- // todo 3 copy code below viewmodel currentcolor observe viewlifecycleowner { hsvcolor -> val rgbcolor int = colorcontrolutil hue2rgb hsvcolor currenthue tofloat , hsvcolor currentsaturation tofloat timber d "currenthue ${hsvcolor currenthue},currentsaturation ${hsvcolor currentsaturation}" timber d "color #${integer tohexstring rgbcolor }" var level int? = binding extendedcolorlightcolorlayout colorboard drawable? alpha if level == null level = 255 timber d "level $level" binding extendedcolorlightcolorlayout colorboard setimagedrawable bitmapdrawable resources, colorcontrolutil colorboard rgbcolor } // =================================================================================== // =================================================================================== // codelab level 3 // observer on the current color temperature status and react on the fragment's ui // ----------------------------------------------------------------------------------- // todo 4 copy code below viewmodel colortemperature observe viewlifecycleowner { // min 2580k 2577k , max 7050k 7042k val colortemperature int = 1000000 / it val rgbcolor int = colorcontrolutil kelvin2rgb colortemperature timber d "color temperature $colortemperature $it" timber d "color #${integer tohexstring rgbcolor }" binding extendedcolorlightcolorlayout colorboard setimagedrawable bitmapdrawable resources, colorcontrolutil colorboard rgbcolor } // =================================================================================== window coveringlevel 4 file path feature > closure > java > com matter virtual device app feature closure file name windowcoveringfragment kt // =================================================================================== // codelab level 4 // [onprogresschanged] will update the fragment's ui via viewmodel livedata // [onstoptrackingtouch] will trigger the processing for updating new windowshade state of the // virtual device // ----------------------------------------------------------------------------------- // todo 1 copy code below binding windowcoveringwindowshadeseekbar setonseekbarchangelistener object seekbar onseekbarchangelistener { override fun onprogresschanged seekbar seekbar, progress int, fromuser boolean { val targetpercentage = seekbar progress val text string = getstring r string window_covering_window_shade_format, targetpercentage val percentagetextview = binding windowcoveringwindowshadevaluetext percentagetextview text = html fromhtml text, html from_html_mode_legacy } override fun onstarttrackingtouch seekbar seekbar {} override fun onstoptrackingtouch seekbar seekbar { viewmodel stopmotion seekbar progress } } // ======================================================================================================= // =================================================================================== // codelab level 4 // [onprogresschanged] will update the fragment's ui via viewmodel livedata // [onstoptrackingtouch] will trigger the processing for updating new battery state of the // virtual device // ----------------------------------------------------------------------------------- // todo 2 copy code below binding windowcoveringbatterylayout titletext text = getstring r string battery binding windowcoveringbatterylayout seekbardata = seekbardata progress = viewmodel batterystatus binding windowcoveringbatterylayout seekbar setonseekbarchangelistener object seekbar onseekbarchangelistener { override fun onprogresschanged seekbar seekbar, progress int, fromuser boolean { viewmodel updatebatteryseekbarprogress progress } override fun onstarttrackingtouch seekbar seekbar {} override fun onstoptrackingtouch seekbar seekbar { viewmodel updatebatterystatustocluster seekbar progress } } // ======================================================================================================= // =================================================================================== // codelab level 4 // observer on the current position/operation status and react on the fragment's ui // ----------------------------------------------------------------------------------- // todo 3 copy code below viewmodel windowcoveringstatus observe viewlifecycleowner { status -> timber d "currentposition ${status currentposition},operationalstatus ${status operationalstatus}" binding windowcoveringwindowshadeseekbar progress = status currentposition val text string = getstring r string window_covering_window_shade_format, status currentposition binding windowcoveringwindowshadevaluetext text = html fromhtml text, html from_html_mode_legacy when status operationalstatus { 0 -> { when status currentposition { 0 -> { binding windowcoveringoperationalstatustext settext r string window_covering_closed } 100 -> { binding windowcoveringoperationalstatustext settext r string window_covering_open } else -> { binding windowcoveringoperationalstatustext settext r string window_covering_partially_open } } } 1 -> { binding windowcoveringoperationalstatustext settext r string window_covering_opening } 2 -> { binding windowcoveringoperationalstatustext settext r string window_covering_closing } else -> {} } } // ======================================================================================================= // =================================================================================== // codelab level 4 // observer on the current battery status and react on the fragment's ui // ----------------------------------------------------------------------------------- // todo 4 copy code below viewmodel batterystatus observe viewlifecycleowner { val text string = getstring r string battery_format, it binding windowcoveringbatterylayout valuetext text = html fromhtml text, html from_html_mode_legacy } // ======================================================================================================= thermostatlevel 5 file path feature > hvac > java > com matter virtual device app feature hvac file name themostatfragment kt // =================================================================================== // codelab level 5 // [onprogresschanged] will update the fragment's ui via viewmodel livedata // [onstoptrackingtouch] will trigger the processing for updating new temperature state of the // virtual device // ----------------------------------------------------------------------------------- // todo 1 copy code below binding thermostattemperatureseekbar setonseekbarchangelistener object seekbar onseekbarchangelistener { override fun onprogresschanged seekbar seekbar, progress int, fromuser boolean { viewmodel updatetemperatureseekbarprogress progress } override fun onstarttrackingtouch seekbar seekbar {} override fun onstoptrackingtouch seekbar seekbar { viewmodel updatetemperaturetocluster seekbar progress } } // =================================================================================== // =================================================================================== // codelab level 5 // [onprogresschanged] will update the fragment's ui via viewmodel livedata // [onstoptrackingtouch] will trigger the processing for updating new humidity state of the // virtual device // ----------------------------------------------------------------------------------- // todo 2 copy code below binding humiditysensorhumidityseekbar setonseekbarchangelistener object seekbar onseekbarchangelistener { override fun onprogresschanged seekbar seekbar, progress int, fromuser boolean { viewmodel updatehumidityseekbarprogress progress } override fun onstarttrackingtouch seekbar seekbar {} override fun onstoptrackingtouch seekbar seekbar { viewmodel updatehumiditytocluster seekbar progress } } // =================================================================================== // =================================================================================== // codelab level 5 // [onprogresschanged] will update the fragment's ui via viewmodel livedata // [onstoptrackingtouch] will trigger the processing for updating new battery state of the // virtual device // ----------------------------------------------------------------------------------- // todo 3 copy code below binding thermostatbatterylayout titletext text = getstring r string battery binding thermostatbatterylayout seekbardata = seekbardata progress = viewmodel batterystatus binding thermostatbatterylayout seekbar setonseekbarchangelistener object seekbar onseekbarchangelistener { override fun onprogresschanged seekbar seekbar, progress int, fromuser boolean { viewmodel updatebatteryseekbarprogress progress } override fun onstarttrackingtouch seekbar seekbar {} override fun onstoptrackingtouch seekbar seekbar { viewmodel updatebatterystatustocluster seekbar progress } } // =================================================================================== // =================================================================================== // codelab level 5 // observer on the current temperature status and react on the fragment's ui // ----------------------------------------------------------------------------------- // todo 4 copy code below viewmodel temperature observe viewlifecycleowner { val celsiustemp float = it tofloat / 100 val celsiustext string = getstring r string temperature_celsius_format, celsiustemp binding thermostattemperaturecelsiusvaluetext text = html fromhtml celsiustext, html from_html_mode_legacy val fahrenheittemp float = it tofloat / 100 * 9 / 5 + 32 val fahrenheittext string = getstring r string temperature_fahrenheit_format, fahrenheittemp binding thermostattemperaturefahrenheitvaluetext text = html fromhtml fahrenheittext, html from_html_mode_legacy binding thermostattemperatureseekbar progress = celsiustemp toint } // ========================================================================================== // =================================================================================== // codelab level 5 // observer on the current fan mode status and react on the fragment's ui // ----------------------------------------------------------------------------------- // todo 5 copy code below viewmodel fanmode observe viewlifecycleowner { timber d "fanmode $it" this fanmode = it binding fancontrolfanmodelayout valuetext text = convertfanmodetostring it } // ========================================================================================== // =================================================================================== // codelab level 5 // observer on the current heating setpoint and react on the fragment's ui // ----------------------------------------------------------------------------------- // todo 6 copy code below viewmodel occupiedheatingsetpoint observe viewlifecycleowner { val celsiustemp float = it tofloat / 100 val celsiustext string = getstring r string temperature_celsius_format, celsiustemp binding thermostatsettemperatureheatingcelsiusvaluetext text = html fromhtml celsiustext, html from_html_mode_legacy val fahrenheittemp float = it tofloat / 100 * 9 / 5 + 32 val fahrenheittext string = getstring r string temperature_fahrenheit_format, fahrenheittemp binding thermostatsettemperatureheatingfahrenheitvaluetext text = html fromhtml fahrenheittext, html from_html_mode_legacy } // =================================================================================== // =================================================================================== // codelab level 5 // observer on the current cooling setpoint and react on the fragment's ui // ----------------------------------------------------------------------------------- // todo 7 copy code below viewmodel occupiedcoolingsetpoint observe viewlifecycleowner { val celsiustemp float = it tofloat / 100 val celsiustext string = getstring r string temperature_celsius_format, celsiustemp binding thermostatsettemperaturecoolingcelsiusvaluetext text = html fromhtml celsiustext, html from_html_mode_legacy val fahrenheittemp float = it tofloat / 100 * 9 / 5 + 32 val fahrenheittext string = getstring r string temperature_fahrenheit_format, fahrenheittemp binding thermostatsettemperaturecoolingfahrenheitvaluetext text = html fromhtml fahrenheittext, html from_html_mode_legacy } // =================================================================================== // =================================================================================== // codelab level 5 // observer on the current system mode status and react on the fragment's ui // ----------------------------------------------------------------------------------- // todo 8 copy code below viewmodel systemmode observe viewlifecycleowner { timber d "systemmode $it" this systemmode = it binding thermostatsystemmodelayout valuetext text = convertsystemmodetostring it } // =================================================================================== // =================================================================================== // codelab level 5 // observer on the current humidity status and react on the fragment's ui // ----------------------------------------------------------------------------------- // todo 9 copy code below viewmodel humidity observe viewlifecycleowner { val humidity int = it / 100 val humiditytext string = getstring r string humidity_format, humidity binding humiditysensorhumiditypercentagevaluetext text = html fromhtml humiditytext, html from_html_mode_legacy binding humiditysensorhumidityseekbar progress = humidity } // =================================================================================== // =================================================================================== // codelab level 5 // observer on the current battery status and react on the fragment's ui // ----------------------------------------------------------------------------------- // todo 10 copy code below viewmodel batterystatus observe viewlifecycleowner { val text string = getstring r string battery_format, it binding thermostatbatterylayout valuetext text = html fromhtml text, html from_html_mode_legacy } // =================================================================================== // =================================================================================== // codelab level 5 // trigger the processing for setting system mode // ----------------------------------------------------------------------------------- // todo 11 copy code below alertdialog builder requirecontext settitle r string thermostat_mode setsinglechoiceitems modelist, convertsystemmodetoindex this systemmode { dialog, which -> timber d "thermostat mode set $which ${modelist[which]} " viewmodel setsystemmode convertindextosystemmode which dialog dismiss } setnegativebutton r string cancel, null show // =================================================================================== // =================================================================================== // codelab level 5 // trigger the processing for setting fan mode // ----------------------------------------------------------------------------------- // todo 12 copy code below alertdialog builder requirecontext settitle r string fan_control_fan_mode setsinglechoiceitems modelist, convertfanmodetoindex this fanmode { dialog, which -> timber d "fan mode set $which ${modelist[which]} " viewmodel setfanmode convertindextofanmode which dialog dismiss } setnegativebutton r string cancel, null show // =================================================================================== build and run the virtual device app to build and run your app, follow these steps using a usb cable, connect your mobile device the minimum os requirement is android 8 0 oreo select the sample virtual device app from the run configurations menu in the android studio then, select the connected device in the target device menu click run you can see the device you created in the matter virtual device app onboard and control the virtual device via the smartthings app onboard to onboard the virtual device select and set up the virtual device type you created click save click start to show the qr code for onboarding then, go to the smartthings app and click the + button then, onboard the virtual device by scanning its qr code control by smartthings app in the smartthings app, control the virtual device by using its various functions such as on and off for switch contribute to matter open source optional notethis step is optional, but you can proceed if you want to know how to contribute your code to matter open source to contribute to matter open source, you need to have the latest code therefore, apart from the project files provided by this code lab activity, you should fork and modify the latest code from matter open source project matter follows the "fork-and-pull" model for accepting contributions to do this sign in or sign up to github fork the matter repository by clicking fork on the web ui for each new feature, clone your fork to the local pc and create a working branch $ git clone https //github com/<username>/connectedhomeip git $ git checkout –b <branch-name> before running the build command, source the environment setup script activate sh at the top level this script takes care of downloading gn, ninja, and setting up a python environment with libraries used to build and test $ source scripts/activate sh build the virtual device app using the build_example py $ /scripts/build/build_examples py --target android-arm64-virtual-device-app build add each modified file to include in the commit then, create a commit $ git add <filename1> <filename1> $ git commit –s noteto contribute to the open source, you must check the integrity of the code for this, checking using restyle is recommended push to your github fork $ git push origin <branch-name> then, submit your pull request by clicking contribute > open pull request on the web ui write a description of the problem, change overview, and test then, sign the contributor license agreement cla so a reviewer can automatically be assigned click open pull request tipsee contributing to matter for more information you're done! congratulations! you have successfully achieved the goal of this code lab topic now, you can create a matter-compatible virtual device and contribute your code to matter open source by yourself! if you're having trouble, you may download this file matter virtual device complete code 11 49 mb to learn more, explore matter libraries
We use cookies to improve your experience on our website and to show you relevant advertising. Manage you settings for our cookies below.
These cookies are essential as they enable you to move around the website. This category cannot be disabled.
These cookies collect information about how you use our website. for example which pages you visit most often. All information these cookies collect is used to improve how the website works.
These cookies allow our website to remember choices you make (such as your user name, language or the region your are in) and tailor the website to provide enhanced features and content for you.
You have successfully updated your cookie preferences.