Filter
-
Content Type
-
Category
Mobile/Wearable
Visual Display
Digital Appliance
Platform
Recommendations
Filter
Learn Code Lab
codelabintegrate iot devices into the smartthings ecosystem objective learn how to create your own iot device using smartthings sdk for direct connected devices overview the smartthings sdk for direct connected devices is provided to ease the development of devices which operate with smartthings cloud and mobile application it is small enough to work on resource limited embedded devices in this code lab, you will learn how to create your own iot device profile at smartthings cloud and how to implement on your test device it is explained into three parts the first explains how you can register and deploy to test your own iot device profile in smartthings using the developer workspace then, it demonstrates how to create your own iot device application with smartthings sdk the last part shows how to onboard and control instances of your device with smartthings mobile application noteyou will name the device as code lab example for this tutorial set up your environment you will need the following host pc this code lab is based on ubuntu linux x64 toolchain and board support package bsp for micro-controller unit mcu board you will use the esp32-c3-devkitc board you may set up the environment by referring to this github repository github repositories for the library and references or samples of smartthings sdk for direct connected devices for c $ git clone https //github com/smartthingscommunity/st-device-sdk-c-ref git $ cd st-cevice-sdk-c-ref $ python3 setup py esp32 smartthings mobile application sample code here is a sample code for you to start coding in this code lab download it and start your learning experience! smartthings sdk sample code 2 60 kb register and deploy to test your device using the developer workspace, create a device profile and customize the instructions for onboarding the device on the smartthings mobile app, and deploy devices to be tested these configurations can be edited up until the point you submit the device for publication in the production of the smartthings ecosystem sign in to smartthings developers sign in to smartthings developer workspace using your samsung account create new project you need to create an integration project for a direct connected device create a new device project for device integration select device integration, then direct-connected afterwards, name your project respectively add a device profile define your device’s functionalities with smartthings capability first, navigate and select define device profile and then click create device profile fill the required fields with respective values afterwards, select a capability for your device you can get more information about the capabilities available here notethe health check capability is automatically added for all direct connected devices it should not be removed the required capabilities are switch and health check add device onboarding the device onboarding guides device owners when their device is first registering and connecting to smartthings you can customize the screens presented by adding a device onboarding profile the ownership validation type is also defined at this stage you may customize the screens displayed when the device onboards via the smartthings mobile app, or just use the default values noteuse just works or button confirm for this example add a product info the product info defines how this device is shown at smartthings mobile app catalog you can define device’s category and its regional availability deploy your device to test you can start testing by deploying your device to test there are two ways to do this via overview menu via test > test devices you will be able to see your device in the smartthings mobile app when in developer mode only after it has been deployed for testing register test devices you can add the identity of device for authenticating it to the smartthings cloud this requires device information like serial number and device public key ed25519 since the maximum number of test device is limited per user, once you’ve reached it, you should remove the existing one this example shows how to create ed25519 key pair with sdk tools you can get device_info json file as a result from tools/keygen/linux/output_{ serialnumber} linux version of key generator keygen utility is located at st-iot-device-sdk-c-reference/iot-core/tools/keygen/ or st-device-sdk-c/tools/keygen/ serial number for testing device would be randomly generated by this tool which has stdk + 12-digit alphanumeric format $ cd ~/workspace/st-device-sdk-c-ref/iot-core/tools/keygen/ $ python3 stdk-keygen py –firmware switch_example_001 use following serial number and public key for the identity of your device in developer workspace serial number stdk**e90w***ucx public key nfn5x***uqusq****zhobsfaaop9***kndlnjdjrew= copy stdk**e90w***ucx from keygen output and paste it into serial number field of register a test device page copy public key string from keygen output nfn5x***uqusq****zhobsfaaop9***kndlnjdjrew= in this example and paste it into public key field generate device qr code using the device qr code could be helpful while device onboarding qr code should have format like below refer here for more details urlhttps //qr samsungiots com/?m={your mnid}&s={device onboardingid}&r={device serialnumber} {your mnid} 4-digit alphanumeric mnid of your account {device onboardingid} 3-digit number onboarding id, you can find it from your developer workspace project device onboarding > other info page {device serialnumber} device serial number which is registered at your developer workspace project you can simply generate qr code with using below python script import qrcode mnid = 'ffff' # "ffff" is an example you should replace it with yours onboardingid = '111' # "111" is an example you should replace it with yours serialnumber = 'stdktest0001' # "stdktest0001" is an exmaple you should replace it with yours qrurl = 'https //qr samsungiots com/?m=' + mnid + '&s=' + onboardingid + '&r=' + serialnumber img = qrcode make qrurl img save serialnumber + ' png' qrcode qrcode box_size=10, border=4 write device application open and edit sample device app currently, you are doing the code lab example, which is located at apps/esp32/code_lab_example directory in the github repository download onboarding_profile json from the overview of your device in developer workspace copy onboarding_profile json file into your application directory, apps/esp32/code_lab_example/main $ cd ~/workspace/st-device-sdk-c-ref/apps/esp32/code_lab_example/main/ $ cp ~/downloads/onboarding_config json copy device_info json from tools/keygen/linux/output_{serialnumber} which contains your device specific information to application directory, apps/esp32/code_lab_example/main $ cd ~/workspace/st-device-sdk-c-ref/iot-core/tools/keygen/ $ cp output_{serialnumber}/device_info json ~/workspace/st-device-sdk-c-ref/apps/esp32/code_lab_example/main/ firmwareversion version string privatekey base64 encoded ed25519 private key this value should be paired with what you registered to developer workspace publickey base64 encoded ed25519 public key this value should be same with what you registered to developer workspace serialnumber this value should be same with what you registered to developer workspace { "deviceinfo" { "firmwareversion" "switch_example_001", "privatekey" "dh**jkmrd5x****bav+fgoxa3qzfnw3v****jhxomd0=", "publickey" "nfn5x***uqusq****zhobsfaaop9***kndlnjdjrew=", "serialnumber" "stdk**e90w***ucx" } } open sample application source code browse in apps/esp32/code_lab_example/main/ directory open main c file write your device application code this example already has cloud connection functionality using smartthings sdk apis void app_main void { /** easily integrate your direct connected device using the direct connected devices sdk the sdk manages all mqtt topics and onboarding requirements, freeing you to focus on the capabilities of your device that is, you can simply develop a basic application by just calling the apis provided by st_iot_core layer like below // create a iot context 1 st_conn_init ; // create a handle to process capability 2 st_cap_handle_init ; called in function 'capability_init' // register a callback function to process capability command when it comes from the smartthings server 3 st_cap_cmd_set_cb ; called in function 'capability_init' // process on-boarding procedure there is nothing more to do on the app side than call the api 4 st_conn_start ; */ unsigned char *onboarding_config = unsigned char * onboarding_config_start; unsigned int onboarding_config_len = onboarding_config_end - onboarding_config_start; unsigned char *device_info = unsigned char * device_info_start; unsigned int device_info_len = device_info_end - device_info_start; int err; iot_gpio_init ; xtaskcreate app_main_task, "app_main_task", 4096, null, 10, null ; //create a iot context iot_ctx = st_conn_init onboarding_config, onboarding_config_len, device_info, device_info_len ; if iot_ctx != null { err = st_conn_set_noti_cb iot_ctx, iot_noti_cb, null ; if err printf "fail to set notification callback function\n" ; } else { printf "fail to create the iot_context\n" ; } //create a handle to process capability and initialize capability info capability_init ; //connect to server err = st_conn_start iot_ctx, st_status_cb &iot_status_cb, iot_status_all, null, null ; if err { printf "fail to start connection err %d\n", err ; } } complete your command callback function for each capability the command callback function should contain your device control upon each command such as led on or off control capability example for each capability would be helpful to handle attribute command for each capability you can find it at apps/capability_example/main static void update_switch_state int switch_state { const char* switch_value; if switch_state == switch_on { switch_value = caps_helper_switch attr_switch value_on; } else { switch_value = caps_helper_switch attr_switch value_off; } //todo set switch attribute value and send // // example //=============================================================================== // cap_switch_data->set_switch_value cap_switch_data, switch_value ; // cap_switch_data->attr_switch_send cap_switch_data ; //=============================================================================== } static int get_switch_state void { const char* switch_value; int switch_state = switch_off; //todo get switch attribute value // // example //=============================================================================== // switch_value = cap_switch_data->get_switch_value cap_switch_data ; // // if !strcmp switch_value, caps_helper_switch attr_switch value_on { // switch_state = switch_on; // } else if !strcmp switch_value, caps_helper_switch attr_switch value_off { // switch_state = switch_off; // } //=============================================================================== return switch_state; } static void cap_switch_cmd_cb struct caps_switch_data *caps_data { int switch_state = get_switch_state ; set_led_mode switch_state ; } static void capability_init { //todo initialize switch capability with using capability sample's initializae function // // example // //=============================================================================== // cap_switch_data = caps_switch_initialize iot_ctx, "main", null, null ; // if cap_switch_data { // const char *switch_init_value = caps_helper_switch attr_switch value_on; // // cap_switch_data->cmd_on_usr_cb = cap_switch_cmd_cb; // cap_switch_data->cmd_off_usr_cb = cap_switch_cmd_cb; // // cap_switch_data->set_switch_value cap_switch_data, switch_init_value ; // } //=============================================================================== } build, flash, and monitor you can build, flash, and monitor in the console with the following $ cd ~/workspace/st-device-sdk-c-ref $ python3 build py apps/esp32/code_lab_example $ python3 build py apps/esp32/code_lab_example flash $ python3 build py apps/esp32/code_lab_example monitor or $ cd ~/workspace/st-device-sdk-c-ref $ python3 build py apps/esp32/code_lab_example flash monitor onboard and control the device via smartthings app onboarding a enable developer mode developer mode should be enabled on smartthings mobile application launch the smartthings app, go to dashboard > settings long-press about smartthings for 20 seconds enable the developer mode, then restart the smartthings app you can find out more information here b add a new device go to add device and click my testing devices or scan qr code you can now see and add your self-published devices control by smartthings application a device control from dashboard you can turn your device’s led on or off by clicking the button in the smartthings app b device control from plugin you can control various attributes and get more detailed information from the device plugin user interface you're done! congratulations! you have successfully achieved the goal of this code lab now, you can control your iot devices using the smartthings app all by yourself! if you're having trouble, you may download this file smartthings device sdk complete code 2 49 kb
Learn Code Lab
codelabestablish a health research system using samsung health research stack objective learn how to create a health research system that collects data from mobile and wearable devices and visualizes the collected data in a web portal using samsung health research stack overview samsung health research stack is an open-source toolset that helps collect and analyze data from devices in android and wear os environments it provides tools and infrastructure for developing and deploying health studies, ranging from medical research to clinician services and more the framework consists of four components backend services - offers api endpoints to access and interact with a robust data engine web portal - a customizable interface for creating surveys, managing team members, tracking subjects, and analyzing data app sdk - an sdk for building android and wear os apps capable of collecting data from wearable devices starter app - a health research app with mobile and wearable versions created using basic features provided by the app sdk for detailed information, see samsung health research stack set up your environment you will need the following android studio latest version recommended samsung galaxy mobile device with updated health connect app and samsung health app installed samsung galaxy watch synced to the mobile device docker desktop sample code to start your learning experience, download the project files of the samsung health research stack starter mobile and wearable app notedepending on your preferred development style, you can either download or clone the repository of the project files to your local computer feel free to edit and customize this project for your own purposes, including this code lab activity set up your galaxy mobile and watch device connect your galaxy mobile device to your pc and enable adb debugging next, connect your galaxy watch to android studio over wi-fi lastly, enable the developer mode of the health platform app on your watch by following these steps a go to settings b tap on apps c select health platform d quickly tap on health platform several times until [dev mode] appears notethe samsung health developer mode is only intended for testing or debugging your application it is not for application users deploy the backend and web portal locally download the backend-config-files zip file and unzip it the folder contains the docker-compose yaml file open the terminal window of docker desktop in the terminal, go to the directory where your docker-compose yaml file is located, and run the following command $ docker compose up –d the script deploys the backend and the web portal to your local computer, and it includes 6 services redis - redis watcher for the backend casbin service mongo - for saving data from the backend postgres - for supertokens database and the backend casbin database supertokens - for username and password authentication backend - backend for the samsung health research stack portal - web portal for the samsung health research stack you can change the port number, username, and password for each database with the default setting, you can access the web portal in your browser at localhost 80 the script file has simple settings for easy deployment to add more features, you can change the environment in the docker-compose yaml file's services > backend > environment part set the aws environment variables optional you can enable uploading and downloading features by setting the following aws environment variables aws_bucket_name aws_region aws_access_key_id aws_secret_access_key aws_session_token you can follow the instructions in using the default credential provider chain for setting up aws credentials set google openid connect optional to enable google openid connect oidc login, you can set the following environment variables oidc_google_oauth2_url default "https //oauth2 googleapis com" oidc_google_client_id oidc_google_client_secret oidc_google_redirect_uri you can refer to openid connect for more information about setting google oidc create a new study the health research system has two user groups investigators - conduct research studies and use the web portal for managing studies and analyzing data subjects - participate in studies by answering surveys and performing tasks through the mobile app, as well as collecting health data from wearable apps to start your research study, as an investigator, follow the steps below create an account and sign in to the web portal page you deployed fill out the form with your information on the study collection page, click the create study button noteall enrolled investigators can create a study the creator becomes the study admin in the basic info tab, input the details of the study 5 for the study scope, choose public noteyou can set the study scope as either public or private if you choose private, you need to input a participation code that subjects must enter into the mobile app to join however, for the ease of testing in this code lab, it is recommended to set the scope as public for the study requirements field, you can input any text and click next go to participation requirements tab and select the data types to collect in wear category for this code lab, choose wear accelerometer wear ecg wear heart rate the logo and title of the created study show on the study collection page connect the mobile app to backend system to connect the starter mobile app to the backend system, follow these steps noteto ensure that the galaxy mobile device can connect to the machine where the backend system is deployed, it is recommended to connect both the machine and the mobile device to the same network open the downloaded project file in android studio and go to samples > starter-mobile-app in the local properties file, set the server_address to the ip address of the machine where the backend system is deployed server_address ="input ip address here" tipyou can check your ip address using the command line windows in command prompt, type ipconfig and find the ip address under ipv4 address mac in terminal, type ifconfig and look for the ip address under inet next to en0 next, set the server_port to 50001 if you used the default values in the provided docker-compose yaml file for deployment if not, use the port number you set server_port=50001 set authentication method the app sdk supports three types of authentication methods for registration samsung utilizes samsung account cognito incorporates amazon cognito authentication super-tokens enables anonymous login to allow research participants to register and log in using their personal emails, set the sign_in_mode as super-tokens in the local properties file sign_in_mode="super-tokens" upload wearable data via grpc when synchronizing wearable device data, the app sdk offers two approaches utilizing grpc for high-performance remote procedure calls or synchronization through files each approach has advantages and disadvantages regarding factors such as battery life and server workload however, it is advisable to utilize grpc during local development to configure the mobile application to upload wearable data via grpc rather than files, add the following code in the local properties file enable_upload_wearble_data_by_file=false show the sync button in starter wearable app after configuring the mobile app, modify the wearable app to meet the requirements of your study go to samples > starter-wearable-app and open the local properties file the wearable app features a sync button, which can be displayed or hidden when this button is pressed, it synchronizes the collected data with the backend system instantly to show the sync button, set the value of enable_instant_sync_button as below enable_instant_sync_button=true notethis instant sync feature can negatively affect the battery consumption of both apps, so it is recommended to remove the sync button when you publish your app the samsung health research stack has an optimized data synchronization process that minimizes battery consumption set data measurement parameters you can customize the data collection and storage process of the wearable app by setting the values of the following data measurement parameters passive_data_insert_interval_in_seconds sets the data measurement buffer the buffer saves data in an in-memory database before the interval expires then, at regular intervals, the data from the buffer is stored in persistent memory data_split_interval_in_millis specifies the size of segmented data in persistent memory if these values are not specified, the wearable app uses its default values to verify that the data is being measured and synchronized instantly, you can set the values as follows passive_data_insert_interval_in_seconds=12 data_split_interval_in_millis=30000 run the starter mobile and wearable app after configuring the local properties of both starter apps, build and run your app in android studio by following these steps run the starter mobile app select your mobile app starter-mobile-app from the run configurations menu in the toolbar choose a connected galaxy mobile device as the target device for running the app click run to install the app after installation, clear the app's data run the starter mobile app follow the same steps as for the starter mobile app but select starter-wearable-app instead choose a connected galaxy watch device for running the app allow the app to access physical activity, sensor data, and send notifications when prompted ensure that the galaxy watch is connected with the galaxy mobile device register and join a study since you have set super-tokens as the authentication method, you can now register and log into the app at once open the starter mobile app and sign up with an unregistered email address after logging in and accepting permissions, the app displays the study you created from the web portal tap on the study card to view its details and click join study noteif a study is set to private and you wish to join it, press enter the study code located at the top of the screen and input the assigned participation code in the study code field agree to data collection and terms of research you can see that the sensor data to be collected are dependent upon the selection made in the web portal while creating the study sign and click next to complete the study onboarding process measure and collect health data in the starter wearable app, you can see a list of on-demand measurements that you can contribute to health research for this code lab, choose ecg and click measure follow the onscreen measurement instruction after measuring successfully, scroll to the bottom of the wearable app and press the sync button to synchronize the data with the mobile app in the mobile app, go to data tab, click the more button, and click sync to transfer the collected data to the web portal visualize the collected data in web portal you can display the collected data as a graph in any way you choose for further analysis of the study from the overview page of the study in the web portal, navigate to the dashboard page click on the add chart button provide a title for the chart and select the desired chart type then, edit the chart source choose the database where the data is stored for this code lab, enter the following query to display only the first ten heart rate data from wearheartrate table select * from wearheartrate limit 10 click run query and save select value and timestamp for the value and category columns respectively check the preview of the graph finally, click save to display the graph into the dashboard you're done! congratulations! you have successfully achieved the goal of this code lab now, you can create your own health research system by yourself! to learn more, see samsung health research stack
Learn Code Lab
codelabintegrate samsung pay sdk flutter plugin into merchant apps for in-app payment objective learn how to integrate in-app payment with your flutter-based merchant apps using samsung pay sdk flutter plugin partnership request to use the samsung pay sdk flutter plugin, you must become an official samsung partner once done, you can fully utilize this code lab you can learn more about the partnership process by visiting samsung pay in samsung developers overview the samsung pay sdk flutter plugin allows developers to use samsung wallet features in flutter applications it is the wrapper of samsung pay sdk, which is an application framework for integrating samsung wallet features on galaxy devices the samsung pay sdk flutter plugin offers in-app payment feature that gives customers the opportunity to pay for products and services with samsung wallet set up your environment you will need the following samsung wallet app version 5 6 53, 5 8 0 samsung pay sdk flutter plugin android studio latest version recommended java se development kit jdk 11 or later flutter sdk a compatible galaxy device with android q 10 0 or android api level 29 or later android os versions noteflutter sdk must be installed and set up properly when developing flutter applications after downloading, follow the installation guide appropriate to your operating system after proper installation and setup, configure your android studio to include the flutter plugin for intellij check this editor guide for the detailed steps sample code here is a sample code for you to start coding in this code lab download it and start your learning experience! in-app payment flutter plugin sample code 20 4 mb start your project in android studio, click open to open an existing project locate the flutterinapppayment project from the directory, and click ok go to file > settings > languages & frameworks > flutter to change the flutter sdk path input the directory path where your flutter sdk is installed and click apply install the plugin and configure the api level add samsungpaysdkflutter_v1 01 00 folder in the project go to samsungpaysdkflutter_v1 01 00 > pubspec yaml file and click on pub get in right side of the action ribbon or run flutter pub get in the command line next, go to flutterinapppayment > pubspec yaml and add the samsungpaysdkflutter_v1 01 00 plugin under dependencies samsung_pay_sdk_flutter path /samsungpaysdkflutter_v1 01 00 warningbe careful of line alignment of pubspec yaml file, as the indentations indicate the structure and hierarchy of the data from the terminal, run flutter pub get command or click on pub get in the right side of the action ribbon configure the api level samsung pay sdk flutter plugin supports samsung pay sdk version 2 18 or later hence, we must set a valid api version latest version 2 19 of samsung pay sdk go to android > app > src > main > androidmanifest xml and add the api level in the meta-data of application tag <meta-data android name="spay_sdk_api_level" android value="2 19" /> // most recent sdk version is recommended to leverage the latest apis add the samsung pay button go to the main project, flutterinapppayment project > lib > main dart here, the ui is created using the build widget this widget shows the sample item information such as image, name, and price add a bottomnavigationbar before the end of the body of scaffold to display the samsung pay button bottomnavigationbar visibility visible isspaystatusready, child inkwell ontap { requestpaymentwithsamsungwallet ; }, child image asset 'assets/pay_rectangular_full_screen_black png' , , , check samsung pay status in main dart > myhomepage class, create an instance of samsungpaysdkflutter with valid partnerinfo service id and service type during onboarding, the samsung pay developers site assigns the service id and service type these data are used for partner verification static final samsungpaysdkflutterplugin = samsungpaysdkflutter partnerinfo serviceid service_id, data {spaysdk partner_service_type servicetype inapp_payment name} ; notethe service id is already provided in the sample code for this code lab however, this service id is for test purposes only and cannot be used for an actual application or service to change the service id in your actual application, the value of the variable service_id should be modified to check whether samsung pay is supported on your galaxy device, call the getsamsungpaystatus api and change the samsung pay button visibility accordingly in checksamsungpaystatus method, apply the following code void checksamsungpaystatus { //update ui according to samsung pay status myhomepage samsungpaysdkflutterplugin getsamsungpaystatus statuslistener onsuccess status, bundle async { if status == "2" { setstate { isspaystatusready = true; } ; } else { setstate { isspaystatusready = false; } ; _showtoast context,"spay status not ready" ; } }, onfail errorcode, bundle { setstate { isspaystatusready = false; } ; _showtoast context,"spay status api call failed" ; } ; } inside initstate method, call checksamsungpaystatus to ensure that getsamsungpaystatus api is called before any other api is called checksamsungpaystatus ; notethe getsamsungpaystatus api must be called before using any other feature in the samsung pay sdk flutter plugin create a custom payment sheet samsung pay sdk flutter plugin offers a custom type payment sheet called customsheet to customize the ui with additional payment related data here, create customsheet using the following controls amountboxcontrol it is a mandatory control to build a customsheet it provides the monetary details of the transaction addresscontrol it is used to display the billing and shipping address in makeamountcontrol method, add items and total price to build amountboxcontrol amountboxcontrol additem strings product_item_id, "item", 1199 00, "" ; amountboxcontrol additem strings product_tax_id, "tax", 5 0, "" ; amountboxcontrol additem strings product_shipping_id, "shipping", 1 0, "" ; amountboxcontrol setamounttotal 1205 00, spaysdk format_total_price_only ; in makebillingaddress method, add the following code to create billingaddresscontrol set sheetitemtype as zip_only_address while creating billingaddresscontrol to get the zip code as we are expecting to get the user's billing address from samsung wallet, set sheetupdatedlistener addresscontrol billingaddresscontrol = addresscontrol strings billing_address_id, sheetitemtype zip_only_address name ; billingaddresscontrol setaddresstitle strings billing_address ; billingaddresscontrol sheetupdatedlistener = billinglistener; return billingaddresscontrol; notefrom samsung pay sdk version 2 19 onwards, users can only add zip code as their billing address only the zip code is fetched from the user's samsung wallet instead of the full billing address implement this listener in makeupcustomsheet method to update the custom sheet when the user updates their billing address sheetupdatedlistener sheetupdatedlistener = sheetupdatedlistener onresult string controlid, customsheet sheet { if controlid == strings billing_address_id { var addresscontrol = sheet getsheetcontrol controlid as addresscontrol; setstate { postalcode = addresscontrol address! postalcode; } ; } myhomepage samsungpaysdkflutterplugin updatesheet sheet ; } ; create the shipping address in buildshippingaddressinfo method to add it in shipping addresscontrol this is the shipping address from the merchant app maddress = address addressee "jane smith", addressline1 "123 main st", addressline2 "suite 456", city "anytown", state "st", countrycode "usa", postalcode "12345", phonenumber "+1 555-123-4567", email "example@email com" ; add this address in makeshippingaddress method shippingaddresscontrol address = buildshippingaddressinfo ; finally, complete the makeupcustomsheet method by adding amountboxcontrol, billingaddresscontrol, and shippingaddresscontrol customsheet addcontrol makeamountcontrol ; customsheet addcontrol makebillingaddress sheetupdatedlistener ; customsheet addcontrol makeshippingaddress ; create a transaction request to start the payment process, the merchant app should create a transaction request with payment information in maketransactiondetailswithsheet method, add the merchant name and custom sheet in customsheetpaymentinfo customsheetpaymentinfo customsheetpaymentinfo = customsheetpaymentinfo merchantname "in app payment flutter app", customsheet makeupcustomsheet ; your merchant app must fill the following mandatory fields in customsheetpaymentinfo customsheetpaymentinfo merchantid = "123456"; customsheetpaymentinfo setordernumber "amz007mar" ; customsheetpaymentinfo setmerchantcountrycode "us" ; customsheetpaymentinfo addressinpaymentsheet = addressinpaymentsheet need_billing_send_shipping; request payment with a custom payment sheet the startinapppaywithcustomsheet api is called to request payment using a custom payment sheet in samsung pay this api requires customsheetpaymentinfo and customsheettransactioninfolistener first, implement this listener before starting the payment customsheettransactioninfolistener transactionlistener { customsheettransactioninfolistener customsheettransactioninfolistener = customsheettransactioninfolistener oncardinfoupdated paymentcardinfo paymentcardinfo, customsheet customsheet { myhomepage samsungpaysdkflutterplugin updatesheet customsheet ; }, onsuccess customsheetpaymentinfo customsheetpaymentinfo, string paymentcredential, map<string, dynamic>? extrapaymentdata { print "payment success" ; }, onfail string errorcode, map<string, dynamic> bundle { print "payment failed" ; } ; return customsheettransactioninfolistener; } lastly, call startinapppaywithcustomsheet api to start the payment in the requestpaymentwithsamsungwallet method void requestpaymentwithsamsungwallet { myhomepage samsungpaysdkflutterplugin startinapppaywithcustomsheet maketransactiondetailswithsheet , transactionlistener ; } run the app build the app by running flutter build apk --debug in the command line or going to build > flutter > build apk deploy the app on the device test it by clicking on samsung pay button to proceed with the payment transaction to thoroughly test the sample app, you must add at least one payment card to the samsung wallet app you're done! congratulations! you have successfully achieved the goal of this code lab now, you can integrate in-app payment with your flutter app by yourself! if you are having trouble, you may download this file in-app payment flutter plugin complete code 62 0 mb to learn more about developing apps for samsung pay devices, visit developer samsung com/pay
Learn Code Lab
codelabtransfer heart rate data from galaxy watch to a mobile device objective create a health app for galaxy watch, operating on wear os powered by samsung, to measure heart rate and inter-beat interval ibi , send data to a paired android phone, and create an android application for receiving data sent from a paired galaxy watch overview with this code lab, you can measure various health data using samsung health sensor sdk and send it to a paired android mobile device for further processing samsung health sensor sdk tracks various health data, but it cannot save or send collected results meanwhile, wearable data layer allows you to synchronize data from your galaxy watch to an android mobile device using a paired mobile device allows the data to be more organized by taking advantage of a bigger screen and better performance see samsung health sensor sdk descriptions for detailed information set up your environment you will need the following galaxy watch4 or newer android mobile device android studio latest version recommended java se development kit jdk 17 or later sample code here is a sample code for you to start coding in this code lab download it and start your learning experience! heart rate data transfer sample code 213 7 kb connect your galaxy watch to wi-fi go to settings > connection > wi-fi and make sure that the wi-fi is enabled from the list of available wi-fi networks, choose and connect to the same one as your pc turn on developer mode and adjust its settings on your watch, go to settings > about watch > software and tap on software version 5 times upon successful activation of developer mode, a toast message will display as on the image below afterwards, developer options will be visible under settings tap developer options and enable the following options adb debugging in developer options find wireless debugging turn on wireless debugging check always allow on this network and tap allow go back to developer options and click turn off automatic wi-fi notethere may be differences in settings depending on your one ui version connect your galaxy watch to android studio go to settings > developer options > wireless debugging and choose pair new device take note of the wi-fi pairing code, ip address & port in android studio, go to terminal and type adb pair <ip address> <port> <wi-fi pairing code> when prompted, tap always allow from this computer to allow debugging after successfully pairing, type adb connect <ip address of your watch> <port> upon successful connection, you will see the following message in the terminal connected to <ip address of your watch> now, you can run the app directly on your watch turn on developer mode for health platform to use the app, you need to enable developer mode in the health platform on your watch go to settings > apps > health platform quickly tap health platform title for 10 times this enables developer mode and displays [dev mode] below the title to stop using developer mode, quickly tap health platform title for 10 times to disable it set up your android device click on the following links to setup your android device enable developer options run apps on a hardware device connect the galaxy watch with you samsung mobile phone start your project in android studio, click open to open an existing project locate the downloaded android project hrdatatransfer-code-lab from the directory and click ok you should see both devices and applications available in android studio as in the screenshots below initiate heart rate tracking noteyou may refer to this blog post for more detailed analysis of the heart rate tracking using samsung health sensor sdk first, you need to connect to the healthtrackingservice to do that create connectionlistener, create healthtrackingservice object by invoking healthtrackingservice connectionlistener, context invoke healthtrackingservice connectservice when connected to the health tracking service, check the tracking capability the available trackers may vary depending on samsung health sensor sdk, health platform versions or watch hardware version use the gettrackingcapability function of the healthtrackingservice object obtain heart rate tracker object using the function healthtrackingservice gethealthtracker healthtrackertype heart_rate_continuous define event listener healthtracker trackereventlistener, where the heart rate values will be collected start tracking the tracker starts collecting heart rate data when healthtracker seteventlistener updatelistener is invoked, using the event listener collect heart data from the watch the updatelistener collects datapoint instances from the watch, which contains a collection of valuekey objects those objects contain heart rate, ibi values, and ibi statuses there's always one value for heart rate while the number of ibi values vary from 0-4 both ibi value and ibi status lists have the same size go to wear > java > data > com samsung health hrdatatransfer > data under ibidataparsing kt, provide the implementation for the function below /******************************************************************************* * [practice 1] get list of valid inter-beat interval values from a datapoint * - return arraylist<int> of valid ibi values validibilist * - if no ibi value is valid, return an empty arraylist * * var ibivalues is a list representing ibivalues up to 4 * var ibistatuses is a list of their statuses has the same size as ibivalues ------------------------------------------------------------------------------- * - hints * use local function isibivalid status, value to check validity of ibi * ****************************************************************************/ fun getvalidibilist datapoint datapoint arraylist<int> { val ibivalues = datapoint getvalue valuekey heartrateset ibi_list val ibistatuses = datapoint getvalue valuekey heartrateset ibi_status_list val validibilist = arraylist<int> //todo 1 return validibilist } check data sending capabilities for the watch once the heart rate tracker can collect data, set up the wearable data layer so it can send data to a paired android mobile device wearable data layer api provides data synchronization between wear os and android devices noteto know more about wearable data layer api, go here to determine if a remote mobile device is available, the wearable data layer api uses concept of capabilities not to be confused with samsung health sensor sdk’s tracking capabilities, providing information about available tracker types using the wearable data layer's capabilityclient, you can get information about nodes remote devices being able to consume messages from the watch go to wear > java > com samsung health hrdatatransfer > data in capabilityrepositoryimpl kt, and fill in the function below the purpose of this part is to filter all capabilities represented by allcapabilities argument by capability argument and return the set of nodes set<node> having this capability later on, we need those nodes to send the message to them /************************************************************************************** * [practice 2] check capabilities for reachable remote nodes devices * - return a set of node objects out of all capabilities represented by 2nd function * argument, having the capability represented by 1st function argument * - return empty set if no node has the capability -------------------------------------------------------------------------------------- * - hints * you might want to use filtervalues function on the given allcapabilities map * ***********************************************************************************/ override suspend fun getnodesforcapability capability string, allcapabilities map<node, set<string>> set<node> { //todo 2 } encode message for the watch before sending the results of the heart rate and ibi to the paired mobile device, you need to encode the message into a string for sending data to the paired mobile device we are using wearable data layer api’s messageclient object and its function sendmessage string nodeid, string path, byte[] message go to wear > java > com samsung health hrdatatransfer > domain in sendmessageusecase kt, fill in the function below and use json format to encode the list of results arraylist<trackeddata> into a string /*********************************************************************** * [practice 3] - encode heart rate & inter-beat interval into string * - encode function argument trackeddata into json format * - return the encoded string ----------------------------------------------------------------------- * - hint * use json encodetostring function **********************************************************************/ fun encodemessage trackeddata arraylist<trackeddata> string { //todo 3 } notetrackeddata is an object, containing data received from heart rate tracker’s single datapoint object @serializable data class trackeddata var hr int, var ibi arraylist<int> = arraylist run unit tests for your convenience, you will find an additional unit tests package this will let you verify your code changes even without using a physical watch or mobile device see the instruction below on how to run unit tests right click on com samsung health hrdatatransfer test , and execute run 'tests in 'com samsung health hrdatatransfer" command if you have completed all the tasks correctly, you will see all the unit tests pass successfully run the app after building the apks, you can run the applications on your watch to measure heart rate and ibi values, and on your mobile device to collect the data from your watch once the app starts, allow the app to receive data from the body sensors afterwards, it shows the application's main screen to get the heart rate and ibi values, tap the start button tap the send button to send the data to your mobile device notethe watch keeps last ~40 values of heart rate and ibi you’re done! congratulations! you have successfully achieved the goal of this code lab now, you can create a health app on a watch to measure heart rate and ibi, and develop a mobile app that receives that health data! if you face any trouble, you may download this file heart rate data transfer complete code 213 9 kb to learn more about samsung health, visit developer samsung com/health
Learn Code Lab
codelabdevelop a blockchain shopping app objective create a shopping application with samsung blockchain platform sdk and pay using ethereum network overview the blockchain industry is expanding in many ways it is growing the most as a means of payment samsung blockchain platform sdk helps to make payments easily with cryptocurrency you can interact with blockchain through a simple api call to create a transaction in this code lab, you can pay for a product using the ethereum network in a simple shopping app, which is a decentralized application dapp dapps run and store data on the blockchain network instead of a central server set up your environment you will need the following java se development kit 8 or later android studio latest version recommended mobile phone with samsung blockchain sample code here is a sample code for you to start coding in this code lab download it and start your learning experience! platform sdk sample code 3 94 mb enable developer mode to activate developer mode on your mobile device, follow the steps below navigate through settings > biometrics and security > samsung blockchain keystore and click about blockchain keystore tap the samsung blockchain keystore app name quickly, ten times or more if succeeded, developer mode will show import project file open the downloaded sample code containing the shopping app project go to file > open and select the open file or project window every gui resources are already included in the provided project you simply need to fill out the code by following the next steps moreover, it is recommended to go through the documentations of samsung blockchain platform sdk initialize the instance create an sblockchain instance this is the first step since sblockchain is the initial base class of sdk along with that are hardwarewalletmanager responsible for wallet operations accountmanager responsible for account operations msblockchain = new sblockchain ; msblockchain initialize mcontext ; maccountmanager = msblockchain getaccountmanager ; mhardwarewalletmanager = msblockchain gethardwarewalletmanager ; mcoinnetworkinfo = new coinnetworkinfo cointype eth, ethereumnetworktype goerli, rpcurl ; connecttokeystore ; connect to samsung blockchain keystore you can get hardware wallet instance from hardwarewalletmanager hardwarewallettype refers to the type of cold wallet to be connected, such as samsung blockchain keystore and ledger nano s mhardwarewalletmanager connect hardwarewallettype samsung, false setcallback new listenablefuturetask callback<hardwarewallet> { @override public void onsuccess hardwarewallet hardwarewallet { handler post new runnable { @override public void run { log i tag,"hardwarewallet is connected successfully" ; mprogressbar setvisibility view invisible ; setaccountstatus ; } } ; } @override public void onfailure @notnull executionexception e { mprogressbar setvisibility view invisible ; e printstacktrace ; } @override public void oncancelled @notnull interruptedexception e { mprogressbar setvisibility view invisible ; e printstacktrace ; } } ; the second parameter of connect api refers to reset if you do not want to reset the wallet then keep it false, otherwise true manage your account now, your shopping dapp is connected to the keystore it means that if you have your own account with balance, you can now buy using ether or eth let’s create an ethereum account to be used for payment for generating a new account with samsung blockchain platform sdk you need an instance of the accountmanager from sblockchain accountmanager provides methods for fetching, creating, restoring accounts, and other more once you have an instance of accountmanager, you can call generatenewaccount as shown below it has methods regarding accounts such as get, create, and restore refer to the samsung blockchain platform sdk documentations for more details hardwarewallet connectedhardwarewallet = mhardwarewalletmanager getconnectedhardwarewallet ; if connectedhardwarewallet != null { try { maccountmanager generatenewaccount connectedhardwarewallet, mcoinnetworkinfo get ; } catch interruptedexception e { e printstacktrace ; } catch executionexception e { e printstacktrace ; } } if an account is already created, textview is shown at the top of the app and the create account button is disabled to prevent further account creation list<account> accounts = maccountmanager getaccounts null, cointype eth, ethereumnetworktype goerli ; if !accounts isempty { methereumaccount = ethereumaccount accounts get accounts size - 1 ; tvaccountstatus settext methereumaccount getaddress ; btncreateaccount setenabled false ; } get instance for ledger service after creating an account, you can use it for payment in your shopping dapp each coin blockchain ledgers has its own system to be stored in blocks samsung blockchain platform sdk provides abstracted api sets to developers for signing and sending supported cryptocurrency transactions over the blockchain network create coinservicefactory and just use any ledger you want in this scenario, use ethereumservice ethereumservice service = ethereumservice coinservicefactory getcoinservice mcontext, mcoinnetworkinfo ; at this point, your shopping dapp is ready to provide payment methods working on ethereum notebefore the next step, you need at least one valid ethereum account show payment sheet when a user selects an item, the app should show the payment screen it must show “who will pay how much amount of ether to whom” in the blockchain world, ethereum ledgers require more information, such as transaction nonce, to record that transaction into ledgers with samsung blockchain platform sdk, developers can do everything needed to show the payment sheet, intent should be created, which is to call the payment activity on click event of product object fill the parameters required and startactivityforresult to show a payment sheet item item = itemlist get position ; biginteger price = ethereumutils convertethtowei item getprice ; ethereumservice service = ethereumservice coinservicefactory getcoinservice mcontext, mcoinnetworkinfo ; hardwarewallet connectedhardwarewallet = mhardwarewalletmanager getconnectedhardwarewallet ; intent intent = service createethereumpaymentsheetactivityintent mcontext, connectedhardwarewallet, ethereumtransactiontype eip1559, methereumaccount, sample_to_adderss, price, null, null ; startactivityforresult intent, 0 ; get ether from faucet you need money when you buy something a free faucet site is provided to get ether if you have an ethereum account, just go to webview fragment and press send me eth button see the result of transaction if the payment was performed successfully from the payment screen, the result of transaction can be received from onactivityresult if the transaction is performed properly, you can find the result_ok at resultcode from the intent, a txid is shown which can be used to check your transaction’s status call gettransactiondetail txid string api method in ethereumservice and check the block# if there’s any valid countable number, your transaction is stored in blocks successfully and the payment is done if you can’t find it, just wait it’s processing among ethereum nodes alternatively, simply find the txid in goerli testnet explorer run the project you have created and verify that it works properly open the app and select the product from the list in the payment screen, select the fee to pay to the ethereum network and confirm the transaction then, check the result of the generated transaction sample images of the app screen can be seen below you're done! congratulations! you have successfully achieved the goal of this code lab now, you can develop a shopping dapp using samsung blockchain platform sdk by yourself! if you're having trouble, you may download this file platform sdk complete code 3 95 mb to learn more about developing apps with samsung blockchain, visit developer samsung com/blockchain
Learn Code Lab
codelabhandle s pen's raw data objective learn how to implement s pen remote sdk and handle raw data of s pen modify a breakout game to control its paddle's position with s pen overview s pen remote sdk allows you to develop an application that uses s pen remote generated events s pen includes buttons and motion sensor, and events from these units can be delivered to the application through the s pen framework simple gestures, such as button click, 4-directional swipe, and circular gesture, can easily be recognized by defining remoteactions xml but to implement a more powerful application using the raw data of units, you must use the s pen remote sdk supported features the s pen remote sdk provides functions to identify motion coordinates and verifying if the side button is pressed for your application s pen remote sdk supports the following detailed features checking if the side button is pressed or released identifying motion coordinates two-dimensional device movement relative values of the current position from the previous position a positive value for the x-coordinates means to move right a positive value for the y-coordinates means to move up value range -1 0 ~ 1 0 set up your environment you will need the following java se development kit 10 jdk or later android studio latest version recommended samsung galaxy device with s pen remote capability galaxy note10 series or newer galaxy tab s6 series or newer galaxy s22 ultra or newer galaxy fold3 or newer noteif you're interested in the sample project of a breakout game, you can access it here sample code here is a sample code for you to start coding in this code lab download it and start your learning experience! s pen remote sdk sample code 189 4 kb start your project in android studio, click open an existing android studio project locate the android project from the directory and click ok to install spenremote for android studio add the spenremote-v1 0 x jar and sdk-v1 0 0 jar files to the libs folder in android studio add dependencies for the sdk library folder in build gradle dependencies{ implementation filetree dir 'libs', include ['* jar'] … } initialize spenremote in onresume of activity check whether s pen features are supported in the device check if already connected connect to the s pen framework using connect api if the connection is successful, register speneventlistener for each unit public class gameactivity extends activity { … private spenunitmanager mspenunitmanager = null; private boolean mbuttonpressed = false; … @override protected void onresume { … initspenremote ; //initialize spen remote } private void initspenremote { //check whether s pen features are supported in the device spenremote spenremote = spenremote getinstance ; if !spenremote isfeatureenabled spenremote feature_type_air_motion { return; } if !spenremote isfeatureenabled spenremote feature_type_button { return; } //check if already connected if spenremote isconnected { return; } //connect to the s pen framework mspenunitmanager = null; spenremote connect this, new spenremote connectionresultcallback { @override public void onsuccess spenunitmanager spenunitmanager { //if connection is successful, register speneventlistener for each units mspenunitmanager = spenunitmanager; initspeneventlistener ; } @override public void onfailure int e { } } ; } } private void initspeneventlistener { spenunit buttonunit = mspenunitmanager getunit spenunit type_button ; if buttonunit != null { mspenunitmanager registerspeneventlistener mspenbuttoneventlistener, buttonunit ; } spenunit airmotionunit = mspenunitmanager getunit spenunit type_air_motion ; if airmotionunit != null { mspenunitmanager registerspeneventlistener mspenairmotioneventlistener, airmotionunit ; } } handle spenevent on eventlistener register the event listener to spenunit using registerspeneventlistener method of spenunitmanager instance the data of spenevent passed to the speneventlistener is hidden you can refer to the data by casting it as a buttonevent or airmotionevent class private speneventlistener mspenbuttoneventlistener = new speneventlistener { @override public void onevent spenevent spenevent { buttonevent buttonevent = new buttonevent spenevent ; if buttonevent getaction == buttonevent action_down { mbuttonpressed = true; } else { mbuttonpressed = false; } } }; private speneventlistener mspenairmotioneventlistener = new speneventlistener { @override public void onevent spenevent spenevent { airmotionevent motionevent = new airmotionevent spenevent ; if mbuttonpressed { mpaddlecontroller move motionevent getdeltax * 400f ; } } }; release spenremote in onpause of activity in this part, spenremote will be released during onpause state disconnect is used to disconnect from the s pen framework @override protected void onpause { … releasespenremote ; } private void releasespenremote { spenremote spenremote = spenremote getinstance ; if spenremote isconnected { spenremote disconnect this ; } mspenunitmanager = null; } run the app now, everything is ready install the game on your device and launch it the paddle in the game can now be controlled by the s pen the game app screen should look like the following you're done! congratulations! you have successfully achieved the goal of this code lab now, you can handle raw data of the s pen and implement it on an app by yourself! if you're having trouble, you may download this file s pen remote sdk complete code 190 1 kb
Learn Code Lab
codelabcustomize flex window using good lock plugin on watch face studio objective learn to customize a clock face for your flex window using watch face studio's good lock plugin called clockface overview watch face studio wfs is a graphic authoring tool that enables you to create watch faces for wear os smartwatches using good lock plugins, you can also create a cover screen design for galaxy z flip4 and z flip5 wfs good lock plugins enable watch face studio to create customization elements for a specific good lock application good lock is a family of applications that allows users to customize various aspects of their galaxy mobile device, such as the lock screen, home screen, and clock face clockface plugin, one of the good lock plugins, allows you to create clock faces that you can use on a mobile device through the clockface module of good lock app clockface enables users to customize the clock face on their mobile device's lock screen, always on display aod , and cover screen it is part of the good lock family of applications for detailed information, see good lock plugin set up your environment you will need the following watch face studio latest version clockface plugin installation file galaxy z flip5 with good lock app installed clockface module installed within good lock app sample project here is a sample project for this code lab download it and start your learning experience! flex window customization sample project 473 53 kb initial setup from the main menu ☰, choose preferences go to the plugins tab and click the install plugin button you can click the download plugin button to download the installation file locate the installation file and click ok after adding clockface plugin to plugins list install the good lock app in galaxy z flip5 then, download and install the clockface module from good lock app start your project to load the sample project in watch face studio click open project locate the downloaded file, then click open the sample project is a premade watch face design with preloaded images, including a background, trees, clouds, and more it also contains analog hands and a progress bar to represent step count in the style tab, you can see the watch face's different theme color palette you can see other options for background, analog hands, and color when you click the customization editor button noteto learn how to create different watch face designs in one project, see customize styles of a watch face create a rectangular clock face design from a circular watch face the usual shape of a watch face design that you can create in watch face studio is circular using the clockface plugin, you can set the project type as coverscreen, which allows the creation of rectangular designs for galaxy z flip4 and z flip5's cover screen the sample project is a circular watch face to change the design to rectangle click the watch face studio logo to go back to the dashboard click the three dots menu next to the sample project you added to show additional options select create project from enter your project name, keep coverscreen as type, and select galaxy z flip5 for size some features of a watch face design made for a smartwatch, such as showing step count data, might not work for the flex window it is suggested to delete unsupported features when you modify the project after clicking ok in the dialog box, you can now see a new project with a rectangle canvas right-click on the step_count group and choose delete to remove all components related to step count redesign the project for flex window you need to adjust some components of the newly created project to fit with the flex window to do this resize all images as a group select the background group hold down the shift key move the mouse pointer over one of the corner handles, then click and drag the mouse to resize the images or, you can change the dimension's width and height of the background group in the properties tab adjust the x and y placements to reposition the images replace analog hands with digital clock depending on your preference, you can display analog hands or digital clocks on your flex window but for this code lab activity, change the time display with a digital clock remove the time group, which includes analog hands and an index click add component > digital clock > time in text appearance properties, change font type and size edit the tag expression in text field with [hour_1_12_z] [min_z] to only show the current time in 12-hour format and minutes to indicate whether the time is am or pm, add a text component and adjust font type and size in text field, enter the [ampm] tag as value lastly, move the month component anywhere in the canvas and adjust its text appearance display the clock design on flex window to install and display the cover screen design on your flex window, you need to connect the galaxy z flip5 to the computer using usb or wifi in watch face studio, select project > run on device select the connected galaxy z flip5 you want to test with if your device is not detected automatically, click scan devices to see your device or enter its ip address manually by clicking the + button open the good lock app on your device and click the clockface module choose cover screen as clock style and select your clock design choose the edit button to customize the style or tap the check button to apply the design you're done! congratulations! you have successfully achieved the goal of this code lab now, you can customize a clock face for your flex window by yourself! if you face any trouble, you may download this file flex window customization complete project 420 44 kb to learn more about watch face studio, visit developer samsung com/watch-face-studio
Learn Code Lab
codelabintegrate in-app payment into merchant apps using samsung pay sdk objective learn how to integrate in-app payment with your merchant apps using samsung pay sdk partnership request to use the samsung pay sdk, you must become an official samsung partner once done, you can fully utilize this code lab you can learn more about the partnership process by visiting samsung pay page, here in samsung developers notein accordance with the applicable samsung partner agreements, this code lab covers setup and use of the samsung pay sdk for purposes of integrating the samsung pay app with partner apps the use cases and corresponding code samples included are representative examples only and should not be construed as either recommended or required overview the samsung pay sdk is an application framework for integrating selected samsung pay features with android-based partner apps on samsung devices in-app payment, which allows customers to pay for products and services with samsung pay, is one of the operations supported alongside push provisioning and open favorite cards partner apps can leverage the samsung pay sdk to perform different operations ― push provisioning and open favorite cards for issuers; in-app payment for merchants key components include partner app app developed by merchant or issuer for making online or offline payments and provisioning payment cards through samsung pay samsung pay sdk sdk integrated into the partner app for direct communication with samsung pay samsung pay app pay app with which the samsung pay sdk communicates financial network comprises the payment gateways, acquirers, card associations, and issuers that participate in transaction processing under agreement with the merchant most common use case for in-app payment the merchant app allows the user to make payments with samsung pay upon user selection of the samsung pay option, the merchant app calls the apis included in the samsung pay sdk to initiate a transaction with the samsung pay app the samsung pay app responds with the tokenized payment information necessary to complete the transaction the merchant app forwards this payment information to the designated payment gateway pg , either directly through the merchant's web server or indirectly via the samsung-pg interface server for standard transaction processing for more detailed information, see the official samsung pay sdk programming guide set up your environment you will need the following samsung wallet or samsung pay app depending on the country a compatible mobile device with android marshmallow 6 0 or android api level 23 or later android os versions samsung pay sdk android studio latest version recommended java se development kit jdk 11 or later sample code here is a sample code for you to start coding in this code lab download it and start your learning experience! in-app payment sample code 1 90 mb integrate the samsung pay sdk with your app the following steps comprise the general process for integrating the samsung pay sdk with your app sign up for the samsung pay developers site by clicking sign up and register your samsung account or create it if you don't already have one , then sign in follow the on-screen instructions for adding your app and creating a new service to generate the service id you'll need to use in your project download the samsung pay sdk by going to resources > sdk download add the samsung pay sdk jar file samsungpay jar to your android project using android studio or file explorer develop your partner app with the required api calls and callbacks for samsung pay integration upload a release version of your app to the samsung pay developers site for approval upon samsung approval, publish your partner app to the google play store and samsung galaxy apps notethe service id is already provided in the sample code for this code lab however, this service id is for test purposes only and cannot be used for an actual application or service using the provided test service id enforces your app to use the fixed properties below service id 0915499788d6493aa3a038 package name com test beta pay app version 1 0/ 1 or higher start your project after downloading the sample code containing the project files, in android studio click open to open existing project locate the downloaded android project sampleonlinepay from the directory and click ok add the samsungpaysdk_2 18 00_release jar file from the sdk's libs folder to your android project's libs folder go to gradle scripts > build gradle module sampleonlinepay app and enter the following to the dependencies block implementation files 'libs/samsungpaysdk_2 18 00_release jar' if the target sdk version is 30 android 11 or the r-os , you must include the following <queries> element in androidmanifest xml <queries> <package android name="com samsung android spay" /> </queries> configure the api level as of sdk version 1 4, enhanced version control management has been introduced to improve backward compatibility and handle api dependency from country and service type for example, if a partner integrates the latest sdk—for instance, api level 2 18—but continues to use apis based on level 1 4, the partner app remains compatible with samsung pay apps supporting api level 1 4 without upgrading the samsung pay app implement the following in application tag of androidmanifest xml <meta-data android name="spay_sdk_api_level" android value="2 17" /> // most recent sdk version is recommended to leverage the latest apis add an xml layout and modify the activity next, replace the xml layout in res > layout > activity_main xml this layout shows the sample item information such as image, name, and price <?xml version="1 0" encoding="utf-8"?> <layout xmlns tools="http //schemas android com/tools" xmlns app="http //schemas android com/apk/res-auto" xmlns android="http //schemas android com/apk/res/android"> <androidx constraintlayout widget constraintlayout android layout_width="match_parent" android layout_height="match_parent" tools context=" mainactivity"> <imageview android id="@+id/imageview" android layout_width="350dp" android layout_height="184dp" android layout_margintop="100dp" app layout_constraintend_toendof="parent" app layout_constraintstart_tostartof="parent" app layout_constrainttop_totopof="parent" android src="@drawable/galaxy_s23_ultra_image"/> <imageview android id="@+id/samsung_pay_button" android layout_width="wrap_content" android layout_height="75dp" app layout_constraintbottom_tobottomof="parent" app layout_constraintend_toendof="parent" app layout_constraintstart_tostartof="parent" android src="@drawable/pay_rectangular_full_screen_black" android visibility="invisible"/> <textview android id="@+id/textview" android layout_width="wrap_content" android layout_height="wrap_content" android layout_margintop="10dp" android text="galaxy s23 ultra" android textsize="16sp" android textstyle="bold" app layout_constraintend_toendof="parent" app layout_constraintstart_tostartof="parent" app layout_constrainttop_tobottomof="@+id/imageview" /> <textview android id="@+id/textview2" android layout_width="wrap_content" android layout_height="wrap_content" android layout_margintop="5dp" android text="$1,199 00" android textsize="14sp" app layout_constraintend_toendof="parent" app layout_constrainthorizontal_bias="0 517" app layout_constraintstart_tostartof="parent" app layout_constrainttop_tobottomof="@+id/textview" /> </androidx constraintlayout widget constraintlayout> </layout> since you added a data binding layout, you need to inflate the xml file differently go to java > com > test > beta > pay > mainactivity kt, and declare the databinding variable in the mainactivity class private lateinit var databinding activitymainbinding replace the standard setcontentview declaration with the data binding version inside the oncreate method databinding = databindingutil setcontentview this, r layout activity_main check samsung pay status in the mainactivity, create the samsungpay instance to determine if the device supports samsung pay and if the samsung pay button can be displayed as the user's payment option, check the samsung pay status samsungpay requires a valid partnerinfo from the merchant app, which consists of service id and service type during onboarding, the samsung pay developers site assigns the service id and service type in the mainactivity, declare the partnerinfo variable private lateinit var partnerinfo partnerinfo then, set the partnerinfo in the oncreate method val bundle = bundle bundle putstring spaysdk partner_service_type, spaysdk servicetype inapp_payment tostring partnerinfo = partnerinfo service_id, bundle after setting partnerinfo, call the getsamsungpaystatus method via updatesamsungpaybutton function inside the oncreate method updatesamsungpaybutton the getsamsungpaystatus method of the samsungpay class must be called before using any other feature in the samsung pay sdk write the updatesamsungpaybutton function as follows private fun updatesamsungpaybutton { val samsungpay = samsungpay this, partnerinfo samsungpay getsamsungpaystatus object statuslistener { override fun onsuccess status int, bundle bundle { when status { spaysdk spay_ready -> { databinding samsungpaybutton visibility = view visible // perform your operation } spaysdk spay_not_ready -> { // samsung pay is supported but not fully ready // if extra_error_reason is error_spay_app_need_to_update, // call gotoupdatepage // if extra_error_reason is error_spay_setup_not_completed, // call activatesamsungpay databinding samsungpaybutton visibility = view invisible } spaysdk spay_not_allowed_temporally -> { // if extra_error_reason is error_spay_connected_with_external_display, // guide user to disconnect it databinding samsungpaybutton visibility = view invisible } spaysdk spay_not_supported -> { databinding samsungpaybutton visibility = view invisible } else -> databinding samsungpaybutton visibility = view invisible } } override fun onfail errorcode int, bundle bundle { databinding samsungpaybutton visibility = view invisible toast maketext applicationcontext, "getsamsungpaystatus fail", toast length_short show } } } tipfor the list and detailed definition of status codes such as spay_ready, refer to checking samsung pay status noteas of sdk version 1 5, if the device has android lollipop 5 1 android api level 22 or earlier versions, the getsamsungpaystatus api method returns a spay_not supported status code merchant apps using sdk 1 4 or earlier must check their app's android version activate the samsung pay app the samsungpay class provides an api method called activatesamsungpay to activate the samsung pay app on the same device where the partner app is running if the getsamsungpaystatus returns spay_not_ready and the extra_error_reason is error_spay_setup_not_complete, the partner app needs to display an appropriate message to the user then, call activatesamsungpay to launch samsung pay app and request the user to sign in in updatesamsungpaybutton function, add the code to call activatesamsungpay method via doactivatesamsungpay function when the status is spay_not_ready // if extra_error_reason is error_spay_setup_not_completed, // call activatesamsungpay val extraerror = bundle getint samsungpay extra_error_reason if extraerror == samsungpay error_spay_setup_not_completed { doactivatesamsungpay spaysdk servicetype inapp_payment tostring } create the doactivatesamsungpay function as below private fun doactivatesamsungpay servicetype string { val bundle = bundle bundle putstring samsungpay partner_service_type, servicetype val partnerinfo = partnerinfo service_id, bundle val samsungpay = samsungpay this, partnerinfo samsungpay activatesamsungpay } create a transaction request upon successfully initializing the samsungpay class, the merchant app should create a transaction request with payment information samsung pay offers two types of online payment sheet―normal and custom the normal payment sheet has fixed display items ― items, tax, and shipping the custom payment sheet offers more dynamic controls for customizing the ui, together with additional customer order and payment data for this code lab, use the custom payment sheet and populate the fields in customsheetpaymentinfo to initiate a payment transaction /* * make user's transaction details * the merchant app should send paymentinfo to samsung pay via the applicable samsung pay sdk api method for the operation * being invoked * upon successful user authentication, samsung pay returns the "payment info" structure and the result string * the result string is forwarded to the pg for transaction completion and will vary based on the requirements of the pg used * the code example below illustrates how to populate payment information in each field of the paymentinfo class */ private fun maketransactiondetailswithsheet customsheetpaymentinfo? { val brandlist = brandlist val extrapaymentinfo = bundle val customsheet = customsheet customsheet addcontrol makeamountcontrol return customsheetpaymentinfo builder setmerchantid "123456" setmerchantname "sample merchant" setordernumber "amz007mar" // if you want to enter address, please refer to the javadoc // reference/com/samsung/android/sdk/samsungpay/v2/payment/sheet/addresscontrol html setaddressinpaymentsheet customsheetpaymentinfo addressinpaymentsheet do_not_show setallowedcardbrands brandlist setcardholdernameenabled true setrecurringenabled false setcustomsheet customsheet setextrapaymentinfo extrapaymentinfo build } private fun makeamountcontrol amountboxcontrol { val amountboxcontrol = amountboxcontrol amount_control_id, "usd" amountboxcontrol additem product_item_id, "item", 1199 00, "" amountboxcontrol additem product_tax_id, "tax", 5 0, "" amountboxcontrol additem product_shipping_id, "shipping", 1 0, "" amountboxcontrol setamounttotal 1205 00, amountconstants format_total_price_only return amountboxcontrol } private val brandlist arraylist<spaysdk brand> get { val brandlist = arraylist<spaysdk brand> brandlist add spaysdk brand visa brandlist add spaysdk brand mastercard brandlist add spaysdk brand americanexpress brandlist add spaysdk brand discover return brandlist } request payment with a custom payment sheet the startinapppaywithcustomsheet method of the paymentmanager class is applied to request payment using a custom payment sheet in samsung pay when you call the startinapppaywithcustomsheet method, a custom payment sheet is displayed on the merchant app screen from there, the user can select a registered card for payment and change the billing and shipping addresses as necessary the payment sheet lasts for 5 minutes after calling the api if the time limit expires, the transaction fails in the mainactivity class, declare the paymentmanager variable private lateinit var paymentmanager paymentmanager then, in oncreate , set an onclicklistener method before calling the updatesamsungpaybutton function to trigger the startinapppaywithcustomsheet function when the samsungpaybutton is clicked databinding samsungpaybutton setonclicklistener { startinapppaywithcustomsheet } lastly, create a function to call startinapppaywithcustomsheet method of the paymentmanager class /* * paymentmanager startinapppaywithcustomsheet is a method to request online in-app payment with samsung pay * partner app can use this method to make in-app purchase using samsung pay from their * application with custom payment sheet */ private fun startinapppaywithcustomsheet { paymentmanager = paymentmanager applicationcontext, partnerinfo paymentmanager startinapppaywithcustomsheet maketransactiondetailswithsheet , transactioninfolistener } /* * customsheettransactioninfolistener is for listening callback events of online in-app custom sheet payment * this is invoked when card is changed by the user on the custom payment sheet, * and also with the success or failure of online in-app payment */ private val transactioninfolistener paymentmanager customsheettransactioninfolistener = object paymentmanager customsheettransactioninfolistener { // this callback is received when the user changes card on the custom payment sheet in samsung pay override fun oncardinfoupdated selectedcardinfo cardinfo, customsheet customsheet { /* * called when the user changes card in samsung pay * newly selected cardinfo is passed and partner app can update transaction amount based on new card if needed * call updatesheet method this is mandatory */ paymentmanager updatesheet customsheet } override fun onsuccess response customsheetpaymentinfo, paymentcredential string, extrapaymentdata bundle { /* * you will receive the payloads shown below in paymentcredential parameter * the output paymentcredential structure varies depending on the pg you're using and the integration model direct, indirect with samsung */ toast maketext applicationcontext, "onsuccess ", toast length_short show } // this callback is received when the online payment transaction has failed override fun onfailure errorcode int, errordata bundle? { toast maketext applicationcontext, "onfailure ", toast length_short show } } run the app after building the apk, you can run the sample merchant app and see how it connects to samsung pay upon clicking the button at the bottom of the screen to thoroughly test the sample app, you must add at least one card to the samsung pay app you're done! congratulations! you have successfully achieved the goal of this code lab now, you can integrate in-app payment with your app by yourself! if you face any trouble, you may download this file in-app payment complete code 2 26 mb to learn more about developing apps for samsung pay devices, visit developer samsung com/pay
Learn Code Lab
codelaboptimize game performance with adaptive performance in unity objective learn how to optimize the performance of a demo game on samsung galaxy devices using the adaptive performance in unity the adaptive performance package provides you with tools to properly adjust you’re game and improve its overall game performance overview galaxy gamesdk delivers an interface between game application and device which helps developers optimize their games integrating unity adaptive performance with galaxy gamesdk allows unity developers to use this feature on unity editor within unity package manager and also customize their game contents by c# scripting game performance and quality settings can be adjusted in real time by identifying device performance status and heat trends moreover, using a set of simple ui controls, you can scale the quality of the game to match the device platform the latest version of adaptive performance, now uses new android apis that gather information from samsung hardware to provide more detailed insights into the device's thermal components and cpu optimization there are two providers for adaptive performance the samsung provider 5 0 utilizes apis from the gamesdk, which is supported from samsung galaxy s10 or note10 devices until newer models on the other hand, the android provider 1 2 uses the android dynamic performance framework adpf apis and is supported on devices running android 12 or higher this code lab focuses on using the samsung provider of adaptive performance thermal throttling mobile devices lack active cooling systems, causing temperatures to rise this triggers a warning to the unity subsystems, which lowers hardware demand to control heat and avoid performance degradation the ideal goal is to make performance stable with low temperature adaptive performance, primarily for performance and quality balance management, can help achieve this thermal warning the warning system implemented in gamesdk can trigger both internal unity systems and developer-defined behavior, such as disabling custom scripts and shaders quality settings it also provides you with the option to adjust the quality of the game to maintain stable performance at different warning levels you can scale the quality of your game in real time to meet the desired performance this includes changes in level of detail, animation, physics, and visual effects scalers with adaptive performance enabled, the game's fps becomes more stable and consistently higher over time this is because the game adapts its contents based on thermal warnings provided by samsung's thermal callback system the adaptive performance in unity provides developers with scalers that affect various aspects of the game frame rate resolution batching level of detail lod lookup texture lut multisample anti-aliasing msaa shadow cascade shadow distance shadow map resolution shadow quality sorting transparency view distance physics decals layer culling these general scalers can be used to scale the content based on your settings in the editor however, you may also create custom scalers that integrate with your own systems for instance, your own scalers can disable cpu-expensive scripts from running when thermal warnings are reached the latest version of adaptive performance, v5 0, includes new additions to the scalers decal scaler changes the draw distance of decals it controls how far a decal can be before not being rendered layer culling scaler adjusts the distance that expensive layers, such as transparency or water, when they start being culled it’s a useful scaler for scenes with more expensive shader calculations in every frame, unity calculates how all the physics in a level interacts with everything else, such as when the ball is dropping to the floor physics scaler adjusts the frequency at which this calculation is performed a lower frequency means fewer cpu calculations per second set up your environment you will need the following unity editor version 2022 3 visual studio or any source code editor supported samsung galaxy device remote test lab if physical device is not available requirements samsung account java runtime environment jre 7 or later with java web start internet environment where port 2600 is available sample code here is a sample project for you to start coding in this code lab download it and start your learning experience! adaptive performance sample code 903 96 mb demo game the sample project contains a demo game named boat attack it is an open-source demo game provided by unity it has the following features triangles 800,000 vertices 771,000 shadow casters 133 start your project after downloading the sample project, follow the steps to open your project launch the unity hub click projects > open after locating the unzipped project folder, you can open it in unity editor it initially downloads the needed resources for your project open benchmark_island-flythrough scene found under assets notethe project was tested in unity 2022 3 it is recommended to use this version in this code lab set up adaptive performance components in window > package manager > adaptive performance, you can check if the adaptive performance is already included in the project go to edit > project settings > adaptive performance enable the initialize adaptive performance on startup and select samsung android provider enable the scalers by going to adaptive performance > samsung android > indexer settings check the scaler settings and just use the default values add adaptive performance script to your project you are going to use a script that contains examples of the adaptive performance api code it gives you access to the frame time information, thermal information, and cpu/gpu bottlenecks this script adjusts the performance based on the device's thermal state, allowing longer game time by reducing in-game demands download the adaptive performance script adaptiveperformanceconroller cs 6 15 kb simply drag and drop the script into assets folder create a new object and attach the script to the object change the frame rate based on thermal warnings get to know about thermal warnings throttling warnings allow you to know when your game is about to be forcibly throttled and have sections of lag and lowered frame rate adaptive performance provides these thermal alerts that allow you to take control and adjust settings before the performance downgrades check the registered event handler to trigger thermal status ithermalstatus thermalstatus thermalevent then, check thermalmetrics information in the handler name description value nowarning no warning is the normal warning level during standard thermal state 0 throttlingimminent if throttling is imminent, the application should perform adjustments to avoid thermal throttling 1 throttling if the application is in the throttling state, it should make adjustments to go back to normal temperature levels 2 temperaturelevel 0 0 ~ 1 0 current normalized temperature level in the range of [0, 1] a value of 0 means standard operation temperature and the device is not in a throttling state a value of 1 means that the maximum temperature of the device is reached and the device is going into or is already in throttling state temperaturetrend -1 0 ~ 1 0 current normalized temperature trend in the range of [-1, 1] a value of 1 describes a rapid increase in temperature a value of 0 describes a constant temperature a value of -1 describes a rapid decrease in temperature it takes at least 10s until the temperature trend may reflect any changes adjust the frame rate in the adaptiveperformancecontroller cs, the following code is responsible for changing the frame rate depending on the current thermal alert void onthermalevent thermalmetrics ev { switch ev warninglevel { case warninglevel nowarning application targetframerate = 30; break; case warninglevel throttlingimminent application targetframerate = 25; break; case warninglevel throttling application targetframerate = 15; break; } } change the quality settings the performance bottleneck api informs you via an enum value if there is a bottleneck so you can adjust the workload iadaptiveperformance performancestatus performancemetrics performancebottleneck namespace unityengine adaptiveperformance { public enum performancebottleneck { unknown = 0, cpu = 1, gpu = 2, targetframerate = 3 } } in the adaptiveperformancecontroller cs script, the code below is responsible for controlling the lod of the models depending on the performance bottleneck a model with multiple lod is a prime example of a quality setting that can heavily affect the games performance lowering it lessens the load on the gpu, frees up resources, and eventually prevents thermal throttling change the quality setting by adjusting lod in real time by using the performancebottleneck api switch ap performancestatus performancemetrics performancebottleneck // iadaptiveperformance performancestatus performancemetrics performancebottleneck { case performancebottleneck gpu debug logformat "[adp] performancebottleneck gpu " ; lowerlod ; break; case performancebottleneck cpu debug logformat "[adp] performancebottleneck cpu " ; break; case performancebottleneck targetframerate debug logformat "[adp] performancebottleneck targetframerate " ; break; case performancebottleneck unknown debug logformat "[adp] performancebottleneck unknown" ; break; } create a custom scaler to create custom scalers, you need to create a new class that inherits from adaptiveperformancescaler the adaptive performance package includes this class that can be added to the adaptive performance framework, which adjusts quality settings based on unity's thermal settings download this custom scaler to control the texture quality of the demo game texturescaler cs 1 17 kb simply drag and drop the downloaded file into the project test using device simulator in unity the device simulator in unity allows you to test out adaptive performance functionality without a physical mobile device go to window > general > device simulator go to edit > project settings > adaptive performance enable the initialize adaptive performance on startup and select device simulator provider in the device simulator, you can try to send thermal warnings and create artificial bottlenecks to test different behaviors of the demo game the visual scripts display the scalers available and show if it is enabled enabling a specific scaler means that the adaptive performance w you can override the scalers to test their impact on the demo game's performance and scene some scalers may not affect the scene but may improve the performance in the long run build and launch the apk go to file > build settings connect your galaxy device enable development build and select scripts only build option make sure that the autoconnect profiler is enabled to check the profiler in unity and measure the performance in build to device, click the patch button to install or update the apk in your device test using unity profiler unity has also introduced a new module in its profiler that allows you to monitor the scalers changes and extract frame time information to your editor the profiler allows you to get real-time information from the adaptive performance plugin navigate to windows > analysis > profiler set the play mode to your connected galaxy device once connected, you can analyze the frame time stats and check the state of the scalers during runtime scalers in this profiler are reacting to the thermal trend and are being raised or lowered in response to the thermal warning observe the scalers when enabled or disabled texture scaler the texture scaler is the custom script to lower the texture quality based on thermal levels when enabled and maxed out, the texture fidelity has been lowered this lowers the gpu load and memory usage lod scaler you may notice a subtle change in the appearance of the rocks, trees, and umbrella models this is due to the adaptation of the lod bias that determines which version of the models to use as the thermal levels rise, lower poly models are selected to reduce the number of triangles rendered this reduces the gpu load and minimizes thermal build-up shadow map resolution shadow map resolution creates a blurring effect on the shadows which incidentally lowers the performance load required to render them basically, lower shadow detail means fewer gpu calculations, which lead to less heat build-up check the game performance using gpuwatch gpuwatch is a profiling tool for observing gpu activity in your app the following are the common information shown by the gpuwatch fps counters current average cpu and gpu load cpu load gpu load it is very helpful in profiling your game during the post-development stage so you can further optimize to enable gpuwatch on your galaxy device you can easily reposition the gpuwatch widgets on the screen by enabling unlock widgets under the notification menu of gpuwatch you’re done! congratulations! you have successfully achieved the goal of this code lab now, you can improve and optimize your android game on samsung galaxy devices using adaptive performance in unity by learning about scalers, thermal warnings, and bottleneck apis the performance of your mobile games can be pushed further by utilizing these tools if you face any trouble, you may download this file adaptive performance complete project 1 06 gb to learn more, visit developer samsung com/galaxy-gamedev
Learn Code Lab
codelabaccess rich sleep data from samsung health measured by galaxy wearables objective create a health app for android devices, utilizing the samsung health data sdk to obtain samsung health's rich sleep data overview samsung health offers various features to monitor user health data, including automatic sleep recording the samsung health data sdk grants access to the collected data, allowing developers to filter it based on factors such as the device used or a specific timeframe this sdk obtains comprehensive sleep information, including sleep scores, sleep sessions, sleep stages, and associated data such as skin temperature and blood oxygen levels you can retrieve rich sleep data from samsung health using the samsung health data sdk and apply device and local time filters to refine your queries effectively set up your environment you will need the following android studio latest version recommended java se development kit jdk 17 or later android mobile device compatible with the latest samsung health version sample code here is a sample code for you to start coding in this code lab download it and start your learning experience! health data sleep sample code 588 3 kb set up your android device click on the following links to set up your android device enable developer options run apps on a hardware device activate samsung health's developer mode to enable the developer mode in the samsung health app, follow these steps go to settings > about samsung health then, tap the version number quickly 10 times or more if you are successful, the developer mode new button is shown tap developer mode new and choose on now, you can test your app with samsung health notethe samsung health developer mode is only intended for testing or debugging your application it is not for application users start your project in android studio, click open to open an existing project locate the downloaded android project sleepdiary from the directory and click ok check gradle settings before using the samsung health data sdk library, certain configurations are necessary these steps are already applied in the sample code provided the samsung-health-data-api-1 0 0b1 aar library is added to the app\libs folder, and included as a dependency in the module-level build gradle file in the same file, the gson library is also added as a dependency dependencies { implementation files "libs/samsung-health-data-api-1 0 0b1 aar" implementation libs gson } next, the kotlin-parcelize plugin is applied plugins { id "kotlin-parcelize" } lastly, the following entries are also added in the gradle > libs version toml file [versions] gson = "2 11 0" [libraries] gson = { module = "com google code gson gson", version ref = "gson" } request sleep data permissions the application requires the appropriate permissions and the user's agreement to share their health data for the app to read their sleep data from samsung health while this code lab focuses solely on datatypes sleep, it is important to recognize that other data types such as skin temperature and blood oxygen levels are also available during sleep these additional data types can be accessed using datatypes skin_temperature and datatypes blood_oxygen respectively go to app > kotlin+java > com samsung health sleepdiary > repository in the healthdatastorerepository kt file, navigate to the preparepermissionset function create a permission object consisting of sleep data type and read access type, and assign it to the sleeppermission variable permission indicates the unit of permission to obtain user consent to share data with the samsung health's data store it's a pair of datatype and accesstype permission companion object of datatype datatype, accesstype accesstype creates a permission /****************************************************************************************** * [practice 1] prepare permission set to receive sleep data * * ---------------------------------------------------------------------------------------- * * use the provided variable 'sleeppermission' which is currently null and replace "todo 1" * create a permission object of type 'datatypes sleep' and of 'accesstype read' and * assign it to 'sleeppermission' variable ******************************************************************************************/ fun preparepermissionset mutableset<permission> { val permissionset mutableset<permission> = mutablesetof var sleeppermission permission? = null // todo 1 sleeppermission? let { permissionset add sleeppermission } return permissionset } prepare a read request for sleep data in order to retrieve sleep data from samsung health, the client app should prepare a readdatarequest object and send it to the healthdatastore this read request includes filters such as localtimefilter or readsourcefilter to ensure that only the desired data is received moreover, if the user wears both a galaxy watch and a galaxy ring while sleeping, samsung health combines the data from both devices to create an integrated sleep session, providing the most accurate sleep data not setting the device filter allows access to the combined data in the healthdatastorerepository kt file, navigate to the preparereadsleeprequest function prepare a read request that retrieves data from a specific day within the past week and includes the option to specify a device filter for either a ring or a watch using the provided localtimefilter object, update the readrequestbuilder object you can take your time to familiarize yourself with the readdatarequest builder creation datatypes sleep readdatarequestbuilder function creates a builder for sleep data type setlocaltimefilter function, called on a builder object, adds a time filter to the request setsourcefilter function, called on a builder object, adds a read source filter to the request it can be either an application filter, device filter, or both build function, called on a builder object, builds readdatarequest from the configuration of this builder readdatarequest it represents a request for read query over a period of time to get a list of original healthdatapoints readdatarequest dualtimebuilder<t> setlocaltimefilter localtimefilter localtimefilter sets the local time filter of the request readdatarequest dualtimebuilder<t> setsourcefilter sourcefilter readsourcefilter sets the source filter of the request readdatarequest build builds readdatarequest from the configuration of this builder /****************************************************************************************** * [practice 2] prepare a read request for sleep data * * ---------------------------------------------------------------------------------------- * * use the provided variable 'localtimefilter' and replace "todo 2" * set a time filter by calling ' setlocaltimefilter localtimefilter ' on 'readrequestbuilder' ******************************************************************************************/ fun preparereadsleeprequest localtimefilter localtimefilter, readsourcefilter readsourcefilter? readdatarequest<healthdatapoint> { val readrequestbuilder = datatypes sleep readdatarequestbuilder // todo 2 readsourcefilter? let { readrequestbuilder setsourcefilter readsourcefilter } return readrequestbuilder build } learn how to receive a response from samsung health receiving sleep data from samsung health is done by sending a readdatarequest query to the healthdatastore notethis is a blocking call and should not be called from the main thread healthdatastore it is a proxy which provides a way to access samsung health data an application can access the data through operations healthdatastore provides, such as inserting, updating, deleting, reading, and aggregating data a healthdatastore instance can be obtained by healthdataservice getstore method dataresponse<t> abstract suspend fun <t datapoint> readdata request readdatarequest<t> reads a set of data from samsung health according to the given request this method returns the original data point which is not processed or aggregated the code below, which is already included in the project file, shows how to receive a response from samsung health val healthdatalist = healthdatastore readdata readrequest datalist understand how the collected sleep data is processed a sleep healthdatapoint is a specific type of healthdatapoint that contains samsung health sleep data it includes various fields that can be accessed by calling getvalue function on the data point some of the fields include duration - returns a duration object that indicates how long the sleep lasted sleep score - returns the calculated quality of the sleep sessions - returns a list of sessions during the sleep period if the user wakes up during sleep for an extended period, multiple sleep sessions may be generated within a single sleep data point additionally, each session can consist of various sleep stages including light, rem rapid eye movement , deep, or awake the code below, which is already included in the project file, shows how the collected sleep data is processed private fun preparesleepresult healthdata healthdatapoint sleepdata { healthdata let { val score int score = preparesleepscore it ? 0 val duration = it getvalue datatype sleeptype duration ? duration zero val sleepsessionlist = it getvalue datatype sleeptype sessions ? emptylist return sleepdata score, sleepsessionlist size, duration tohours toint , duration minushours duration tohours tominutes toint , it starttime, it endtime, extractsessions sleepsessionlist } } notesamsung health can also measure the user's blood oxygen level and skin temperature during sleep, if supported by the wearable device these values are associated to the sleep data in the samsung health data sdk an application can use the healthdatapoint’s unique id uid to create an associatedreadrequest and retrieve the blood oxygen level and skin temperature data associated with the sleep data point extract sleep score from a health data point most of the data accessible through the samsung health data sdk is stored as fields within data points these fields can be extracted by specifying the appropriate keys in the getvalue function in the healthdatastorerepository kt file, navigate to the preparesleepscore function read the sleep score field from the healthdatapointby by calling the getvalue function with the key datatype sleeptype sleep_score healthdatapoint it indicates each health data record saved in the samsung health's data store <t> t? getvalue field field<t> returns the value of the given field /************************************************************************************ * [practice 3] extract a sleep score from the sleep data * * ----------------------------------------------------------------------------------- * * obtain a sleep score from health data point by calling 'healthdatapoint getvalue ' * and passing 'datatype sleeptype sleep_score' as an argument * assign the obtained sleep score to 'sleepscore' variable ***********************************************************************************/ @suppress "variable_with_redundant_initializer" fun preparesleepscore healthdatapoint healthdatapoint int? { var sleepscore int? = null // todo 3 return sleepscore } run unit tests for your convenience, an additional unit tests package is provided this package lets you verify your code changes even without using a physical phone right-click on com samsung health sleepdiary test > run 'tests in 'com samsung health sleepdiary' if you completed all the tasks correctly, you can see that all the unit tests passed successfully run the app after building the apk, you can run the application on a connected device to read your sleep data once the app starts, allow all permissions to read sleep data from samsung health and tap done afterwards, the app's main screen appears, displaying today's sleep data from all connected devices you can use the calendar or device filter to show sleep data from a different day or a specific device you can tap on any sleep data to see the list of sessions you can tap on any session to see details such as sleep stages you're done! congratulations! you have successfully achieved the goal of this code lab now, you can create a mobile health app that reads samsung health rich sleep data by yourself! if you are having trouble, you may download this file health data sleep complete code 588 1 kb to learn more about samsung health, visit developer samsung com/health
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.
These cookies gather information about your browser habits. They remember that you've visited our website and share this information with other organizations such as advertisers.
You have successfully updated your cookie preferences.