Filter
-
Content Type
-
Category
Mobile/Wearable
Visual Display
Digital Appliance
Platform
Recommendations
Filter
events ai, iot, uiux, game, web, mobile, galaxy watch
blogthe samsung developer conference (sdc) for 2021 kicked off on october 26, 2021, and we hope you enjoyed the keynote and highlight sessions. as with many events, there is so much information to digest. fortunately, with the virtual format this year, developers can go back and review the sessions they've watched and study how they might take advantage of all the opportunities available with samsung platforms, sdks, and services. while there are too many announcements and technologies to cover in one post, here are some moments from the conference that should be interesting to developers. keynote samsung electronics president dj koh began the conference, as he's done in previous years. the keynote session included overviews of announcements that were described in more detail during the highlight sessions, tech talks, and code labs. voice control of iot devices (bixby/smartthings) samsung mobile senior vice president daniel ahn kicked off the announcements at sdc with a keynote session highlighting the integration of bixby voice control to the smartthings ecosystem with details from smartthings vice president samantha fein. technical talks with more details of the integration for developers and device manufacturers are also available. bixby : best voice interface for connected experience enabling intelligent voice control on your iot devices further, the smartthings platform team provided technical talks on the new smartthings edge platform and smartthings build for use in multi-family home environments. support for the matter standard was announced during the highlight session. samsung electronics vice president jaeyong jung and smartthings vice president samantha fein talked about the bright future for home automation with matter in this highlight session. the samsung newsroom has more information on the bixby and smartthings integration as well as the matter standard support. security and privacy with samsung knox samsung executive vice president kc choi details how samsung knox unlocks the $80b enterprise market with devices and services to ensure that critical data is secure and employee information is kept confidential. in the tech talk sessions below, samsung b2b product experts give developers the information they need to integrate their own apps and services for this lucrative market segment. samsung ese: a trusted partner for enhanced security redefining edge computing & foldables for b2b beyond a limit with the mobile b2b partner program developers with solutions for the enterprise market should sign up for the knox partner program. services and solutions for smarttv platform at sdc21, developers interested in smart tv solutions had plenty to learn. in the keynote, samsung eelectronics senior vice president yongjae kim and samsung research vice president bill mandel discussed many new and exciting opportunities for developers with the tizen platform, which are available for viewers to watch in these sessions. what's new in samsung smart tv services what’s new in tizen 6.5 what's next for tizen: smart screen for business build a trusted service with samsung tizen security what's new in the tizen web platform for smart tv game developers are rising stars with samsung the experience of the last 18 months has shown that self-care is important to our well-being. by allowing us to disconnect from reality, games help reduce stress and give a temporary reprieve from the stresses of daily life. samsung support for gamers and game developers comes to the forefront at sdc21 with these important sessions. galaxy store: games-focused, developer-friendly games for everyone: samsung instant plays in addition to mobile gaming, the announcement of hdr10+ for gaming will delight gamers looking forward to top-quality experiences on smart tvs. building better web experiences with samsung internet the samsung internet browser ships with every samsung galaxy phone. the developers and advocates for samsung internet want to ensure that consumers have the best possible experiences, mixing web content with mobile hardware. how to build browser extensions on samsung internet unfolding the future of responsive web design one ui brings beautiful and secure interactions to your mobile world samsung electronics executive vice president janghyun yoon unveiled the one ui 4 platform, showing numerous examples of beautifully designed cross-device experiences, such as taking a photograph from galaxy z flip3, sharing to the galaxy book, and editing using a galaxy tab s with s pen. while beauty is only skin deep, one ui 4 adds layers of security to these experiences. learn more about one ui 4 in these sessions. one ui 4 design: focus, comfort, self-expression one ui: designing a more approachable experience designers and developers explore new worlds with one ui watch platform galaxy watch4 was introduced at galaxy unpacked in august 2021. the one ui watch platform uses wear os powered by samsung. developers interested in bringing their ideas to the new platform should check out these talks. watch ecosystem: a new era build your app in the new watch ecosystem galaxy watch4 for enterprise business new health platform based on wear os powered by samsung further, designers who are interested in expressing their creative side with watch face designs should view this session on how to use watch face studio to create beautiful designs without writing code. rewarding successful developers with the best of galaxy store awards samsung sr. developer evangelist tony morelan presents the best of galaxy store awards, now in their 4th year. these awards are samsung's way to express gratitude to those developers and designers who are bringing beautiful and exciting apps, games, and themes to galaxy store. for the second year, the bixby team recognized the top developer and capsule for their platform. following up with samsung this site has many resources for developers looking to build for and integrate with samsung devices and services. stay in touch with the latest news by creating a free account and subscribing to our monthly newsletter. visit the marketing resources page for information on promoting and distributing your apps through the galaxy store. finally, our developer forum is an excellent way to stay up-to-date on all things related to the galaxy ecosystem. thank you for joining us for sdc21 and we look forward to seeing you in 2022.
Samsung Developers
Learn Code Lab
codelabmatter create a virtual device and make an open source contribution objective learn how to create a matter virtual device, which you can control using the smartthings app also, know how to contribute your code to matter open source overview matter is an open-source connectivity standard for smart home and internet of things iot devices it is a secure, reliable, and seamless cross-platform protocol for connecting compatible devices and systems with one another smartthings provides the matter virtual device app and smartthings home apis to help you quickly develop matter devices and use the smartthings ecosystem without needing to build your own iot ecosystem you can use smartthings home apis to onboard, control, remove, and share all matter devices when building your application other iot ecosystems can use the matter devices onboarded on your iot app through the multi-admin function notethis code lab focuses only on creating a matter virtual device you can control using the smartthings app to learn how to make your controller app, see build a matter iot app with smartthings home apis for detailed information, go to partners smartthings com/matter set up your environment you will need the following host pc running on windows 10 or higher or ubuntu 20 04 x64 android studio latest version recommended java se development kit jdk 11 or later devices connected on the same network mobile device with android 8 0 oreo or higher operating system os mobile device with smartthings app installed matter-enabled smartthings station onboarded with samsung account used for smartthings app initial setup turn on developer mode and enable usb debugging option on your mobile device install a few os-specific dependencies by entering the below command in your terminal window $ sudo apt-get install git gcc g++ pkg-config libssl-dev libdbus-1-dev \ libglib2 0-dev libavahi-client-dev ninja-build python3-venv python3-dev \ python3-pip unzip libgirepository1 0-dev libcairo2-dev libreadline-dev to build the matter virtual device app, install sdk platform 26 and ndk version 22 1 7171670 using sdk manager in android studio after installing ndk, register the ndk path to the env path export android_ndk_home=[ndk path] export path=$path ${android_ndk_home} install kotlin compiler kotlinc version 1 5 10 after installing kotlinc, register the kotlinc path to the env path export kotlinc_home=[kotlinc path]/bin export path=$path ${kotlinc_home} sample code here is a sample code for you to start coding in this codelab download it and start your learning experience! matter virtual device sample code 11 42 mb start your project after downloading the sample code containing the project files, open your android studio and click open to open an existing project locate the downloaded android project from the directory and click ok select and create the device type when you build and run the sample matter virtual device app, you can see the already added on/off switch aside from the switch, other types of devices you can create are already prepared in the sample app noterefer to the matter device library specification for the list of matter devices you can create go to feature > main > java > com matter virtual device app feature main in the mainfragment kt file, select the device type you want to create mainuistate start -> { // =================================================================================== // codelab // todo uncomment the following lines to add your own device type // ----------------------------------------------------------------------------------- val itemlist = listof device onoffswitch, // sample // device occupancysensor, // level 1 8+ mins // device contactsensor, // level 2 8+ mins // device videoplayer, // level 2 10+ mins // device doorlock, // level 3 15+ mins // device extendedcolorlight, // level 3 15+ mins // device windowcovering, // level 4 17+ mins // device thermostat, // level 5 20+ mins // =================================================================================== depending on the device type you selected at this step, the part you need to modify at the next step will vary the level of modification complexity is assigned per each device get cluster value clusters are the functional building block elements of the data model a cluster can be an interface, a service, or an object class, and it is the lowest independent functional element in the data model a matter device supports a set of appropriate clusters, which can interact with your preferred controller such as smartthings this allows for easy information retrieval, behavior setting, event notifications, and more through the viewmodel, get the value of the cluster used in the device you created noteto learn more about clusters, see matter application cluster specification occupancy sensorlevel 1 file path feature > sensor > java > com matter virtual device app feature sensor file name occupancysensorviewmodel kt // =================================================================================== // codelab level 1 // the current status of the occupancy the boolean value is used by the [occupancyfragment] // to react to update ui // todo 1 uncomment the following code blocks // ----------------------------------------------------------------------------------- //private val _occupancy stateflow<boolean> = getoccupancyflowusecase //val occupancy livedata<boolean> // get = _occupancy aslivedata // =================================================================================== // =================================================================================== // codelab level 1 // the current status of the battery the int value is used by the [occupancyfragment] // to react to update fragment's ui // todo 2 uncomment the following code blocks // ----------------------------------------------------------------------------------- //private val _batterystatus mutablestateflow<int> = // getbatpercentremainingusecase as mutablestateflow<int> //val batterystatus livedata<int> // get = _batterystatus aslivedata // =================================================================================== // =================================================================================== // codelab level 1 // triggered by the "occupancy" button in the [occupancyfragment] // [setoccupancyusecase] will update the boolean value of the new occupancy status // todo 3 uncomment the following code blocks // ----------------------------------------------------------------------------------- //viewmodelscope launch { // timber d "current value = ${_occupancy value}" // if _occupancy value { // timber d "set value = false" // setoccupancyusecase false // } else { // timber d "set value = true" // setoccupancyusecase true // } //} // =================================================================================== // =================================================================================== // codelab level 1 // triggered by the "battery" seekbar in the [occupancyfragment] // [batterystatus] store the current status of the battery to indicate the progress // todo 4 uncomment the following code blocks // ----------------------------------------------------------------------------------- //_batterystatus value = progress // =================================================================================== // =================================================================================== // codelab level 1 // triggered by the "battery" seekbar in the [occupancyfragment] // [updatebatteryseekbarprogress] update the current status of the battery to indicate the // progress // [setbatpercentremainingusecase] will update the int value of the new battery status // todo 5 uncomment the following code blocks // ----------------------------------------------------------------------------------- //viewmodelscope launch { // updatebatteryseekbarprogress progress // setbatpercentremainingusecase progress //} // =================================================================================== contact sensorlevel 2 file path feature > sensor > java > com matter virtual device app feature sensor file name contactsensorviewmodel kt // =================================================================================== // codelab level 2 // the current status of the contact the boolean value is used by the [contactsensorfragment] // to react to update ui // todo 1 uncomment the following code blocks // ----------------------------------------------------------------------------------- //private val _statevalue stateflow<boolean> = getstatevalueflowusecase //val statevalue livedata<boolean> // get = _statevalue aslivedata // =================================================================================== // =================================================================================== // codelab level 2 // the current status of the battery the int value is used by the [contactsensorfragment] // to react to update fragment's ui // todo 2 uncomment the following code blocks // ----------------------------------------------------------------------------------- //private val _batterystatus mutablestateflow<int> = // getbatpercentremainingusecase as mutablestateflow<int> //val batterystatus livedata<int> // get = _batterystatus aslivedata // =================================================================================== // =================================================================================== // codelab level 2 // triggered by the "contact" button in the [contactsensorfragment] // [setstatevalueusecase] will update the boolean value of the new contact status // todo 3 uncomment the following code blocks // ----------------------------------------------------------------------------------- //viewmodelscope launch { // timber d "current value = ${_statevalue value}" // if _statevalue value { // timber d "set value = false" // setstatevalueusecase false // } else { // timber d "set value = true" // setstatevalueusecase true // } //} // =================================================================================== // =================================================================================== // codelab level 2 // triggered by the "battery" seekbar in the [contactsensorfragment] // [batterystatus] store the current status of the battery to indicate the progress // todo 4 uncomment the following code blocks // ----------------------------------------------------------------------------------- //_batterystatus value = progress // =================================================================================== // =================================================================================== // codelab level 2 // triggered by the "battery" seekbar in the [contactsensorfragment] // [updatebatteryseekbarprogress] update the current status of the battery to indicate the // progress // [setbatpercentremainingusecase] will update the int value of the new battery status // todo 5 uncomment the following code blocks // ----------------------------------------------------------------------------------- //viewmodelscope launch { // updatebatteryseekbarprogress progress // setbatpercentremainingusecase progress //} // =================================================================================== video playerlevel 2 file path feature > media > java > com matter virtual device app feature media file name videoplayerviewmodel kt // =================================================================================== // codelab level 2 // the current status of the on/off the boolean value is used by the [videoplayerfragment] // to react to update fragment's ui // todo 1 uncomment the following code blocks // ----------------------------------------------------------------------------------- //private val _onoff stateflow<boolean> = getonoffflowusecase //val onoff livedata<boolean> // get = _onoff aslivedata // =================================================================================== // =================================================================================== // codelab level 2 // the current status of the playback state the int value is used by the [videoplayerfragment] // to react to update fragment's ui // todo 2 uncomment the following code blocks // ----------------------------------------------------------------------------------- //private val _playbackstate stateflow<int> = getplaybackstateflowusecase //val playbackstate livedata<int> // get = _playbackstate aslivedata // =================================================================================== // =================================================================================== // codelab level 2 // the current status of the playback speed the int value is used by the [videoplayerfragment] // to react to update fragment's ui // todo 3 uncomment the following code blocks // ----------------------------------------------------------------------------------- //private val _playbackspeed stateflow<int> = getplaybackspeedflowusecase //val playbackspeed livedata<int> // get = _playbackspeed aslivedata // =================================================================================== // =================================================================================== // codelab level 2 // the current status of the key code the enum value is used by the [videoplayerfragment] // to react to update fragment's ui // todo 4 uncomment the following code blocks // ----------------------------------------------------------------------------------- //private val _keycode stateflow<keycode> = getkeycodestateflowusecase //val keycode livedata<keycode> // get = _keycode aslivedata // =================================================================================== // =================================================================================== // codelab level 2 // triggered by the "on/off" button in the [videoplayerfragment] // [setonoffusecase] will update the boolean value of the new on/off status // todo 5 uncomment the following code blocks // ----------------------------------------------------------------------------------- //viewmodelscope launch { // timber d "current value = ${_onoff value}" // if _onoff value { // timber d "set value = false" // setonoffusecase false // } else { // timber d "set value = true" // setonoffusecase true // } //} // =================================================================================== door locklevel 3 file path feature > closure > java > com matter virtual device app feature closure file name doorlockviewmodel kt // =================================================================================== // codelab level 3 // the current status of the lock the boolean value is used by the [doorlockfragment] // to react to update fragment's ui // ----------------------------------------------------------------------------------- // todo 1 copy code below private val _lockstate stateflow<boolean> = getlockstateflowusecase val lockstate livedata<boolean> get = _lockstate aslivedata // ============================================================================== // =================================================================================== // codelab level 3 // the current status of the battery the int value is used by the [doorlockfragment] // to react to update fragment's ui // ----------------------------------------------------------------------------------- // todo 2 copy code below private val _batterystatus mutablestateflow<int> = getbatpercentremainingusecase as mutablestateflow<int> val batterystatus livedata<int> get = _batterystatus aslivedata // ============================================================================== // =================================================================================== // codelab level 3 // triggered by the "lock" button in the [doorlockfragment] // [setlockstateusecase] will update the boolean value of the new lock status // ----------------------------------------------------------------------------------- // todo 3 copy code below viewmodelscope launch { timber d "current lockstate value = ${_lockstate value}" if _lockstate value == lock_state_locked { timber d "set value = unlocked" setlockstateusecase lock_state_unlocked } else { timber d "set value = locked" setlockstateusecase lock_state_locked } } // ============================================================================== // =================================================================================== // codelab level 3 // triggered by the "send alarm" button in the [doorlockfragment] // [sendlockalarmeventusecase] will send alarm event // [setlockstateusecase] will update the boolean value of the unlock status // ----------------------------------------------------------------------------------- // todo 4 copy code below viewmodelscope launch { if !_lockstate value { // if lockstate == locked, send alarm event and change the lockstate to unlocked sendlockalarmeventusecase setlockstateusecase lock_state_unlocked } } // ============================================================================== // =================================================================================== // codelab level 3 // triggered by the "battery" seekbar in the [doorlockfragment] // [batterystatus] store the current status of the battery to indicate the progress // ----------------------------------------------------------------------------------- // todo 5 copy code below _batterystatus value = progress // ============================================================================== // =================================================================================== // codelab level 3 // triggered by the "battery" seekbar in the [doorlockfragment] // [updatebatteryseekbarprogress] update the current status of the battery to indicate the // progress // [setbatpercentremainingusecase] will update the int value of the new battery status // ----------------------------------------------------------------------------------- // todo 6 copy code below viewmodelscope launch { updatebatteryseekbarprogress progress setbatpercentremainingusecase progress } // ============================================================================== extended color lightlevel 3 file path feature > lighting > java > com matter virtual device app feature lighting file name extendedcolorlightviewmodel kt // =================================================================================== // codelab level 3 // the current status of the on/off the boolean value is used by the [extendedcolorlightfragment] // to react to update ui // ----------------------------------------------------------------------------------- // todo 1 copy code below private val _onoff stateflow<boolean> = getonoffflowusecase val onoff livedata<boolean> get = _onoff aslivedata // =================================================================================== // =================================================================================== // codelab level 3 // the current status of the color level the int value is used by the // [extendedcolorlightfragment] // to react to update ui // ----------------------------------------------------------------------------------- // todo 2 copy code below private val _level stateflow<int> = getlevelflowusecase val level livedata<int> get = _level aslivedata // =================================================================================== // =================================================================================== // codelab level 3 // the current status of the color the enum value is used by the [extendedcolorlightfragment] // to react to update ui // ----------------------------------------------------------------------------------- // todo 3 copy code below private val _currenthue stateflow<int> = getcurrenthueflowusecase private val _currentsaturation stateflow<int> = getcurrentsaturationflowusecase val currentcolor livedata<hsvcolor> = combine _currenthue, _currentsaturation { currenthue, currentsaturation -> hsvcolor currenthue, currentsaturation } aslivedata // =================================================================================== // =================================================================================== // codelab level 3 // the current status of the color temperature the int value is used by the // [extendedcolorlightfragment] // to react to update ui // ----------------------------------------------------------------------------------- // todo 4 copy code below private val _colortemperature stateflow<int> = getcolortemperatureflowusecase val colortemperature livedata<int> get = _colortemperature aslivedata // =================================================================================== // =================================================================================== // codelab level 3 // triggered by the "on/off" button in the [extendedcolorlightfragment] // [setonoffusecase] will update the boolean value of the new on/off status // ----------------------------------------------------------------------------------- // todo 5 copy code below viewmodelscope launch { timber d "current value = ${_onoff value}" if _onoff value { timber d "set value = false" setonoffusecase false } else { timber d "set value = true" setonoffusecase true } } // =================================================================================== window coveringlevel 4 file path feature > closure > java > com matter virtual device app feature closure file name windowcoveringviewmodel kt // =================================================================================== // codelab level 4 // the current status of the position/operation the enum value is used by the // [windowcoveringfragment] // to react to update fragment's ui // ----------------------------------------------------------------------------------- // todo 1 copy code below val windowcoveringstatus livedata<windowcoveringstatus> = combine _currentposition, _operationalstatus { currentposition, operationalstatus -> windowcoveringstatus currentposition, operationalstatus } aslivedata // =================================================================================== // =================================================================================== // codelab level 4 // the current status of the battery the int value is used by the [windowcoveringfragment] // to react to update fragment's ui // ----------------------------------------------------------------------------------- // todo 2 copy code below private val _batterystatus mutablestateflow<int> = getbatpercentremainingusecase as mutablestateflow<int> val batterystatus livedata<int> get = _batterystatus aslivedata // =================================================================================== // =================================================================================== // codelab level 4 // triggered by the "windowshade" seekbar in the [windowcoveringfragment] // [settargetpositionusecase] will update the int value of the new target position status // ----------------------------------------------------------------------------------- // todo 3 copy code below viewmodelscope launch { timber d "target position = $percentage" settargetpositionusecase percentage } // =================================================================================== // =================================================================================== // codelab level 4 // triggered by the "open" button in the [fragment_window_covering xml] // [settargetpositionusecase] will update the int value of the open position 100 status // ----------------------------------------------------------------------------------- // todo 4 copy code below viewmodelscope launch { timber d "target position = 100" settargetpositionusecase 100 } // =================================================================================== // =================================================================================== // codelab level 4 // triggered by the "close" button in the [fragment_window_covering xml] // [settargetpositionusecase] will update the int value of the close position 0 status // ----------------------------------------------------------------------------------- // todo 5 copy code below viewmodelscope launch { settargetpositionusecase 0 } // =================================================================================== // =================================================================================== // codelab level 4 // triggered by the "pause" button in the [fragment_window_covering xml] // [settargetpositionusecase] will update the int value of the pause position status // ----------------------------------------------------------------------------------- // todo 6 copy code below viewmodelscope launch { timber d "current position = ${_currentposition value}, target position ${_targetposition value}" if _currentposition value != _targetposition value { settargetpositionusecase _currentposition value } } // =================================================================================== // =================================================================================== // codelab level 4 // triggered by the "battery" seekbar in the [windowcoveringfragment] // [batterystatus] store the current status of the battery to indicate the progress // ----------------------------------------------------------------------------------- // todo 7 copy code below _batterystatus value = progress // =================================================================================== // =================================================================================== // codelab level 4 // triggered by the "battery" seekbar in the [windowcoveringfragment] // [updatebatteryseekbarprogress] update the current status of the battery to indicate the // progress // [setbatpercentremainingusecase] will update the int value of the new battery status // ----------------------------------------------------------------------------------- // todo 8 copy code below viewmodelscope launch { updatebatteryseekbarprogress progress setbatpercentremainingusecase progress } // =================================================================================== thermostatlevel 5 file path feature > hvac > java > com matter virtual device app feature hvac file name thermostatviewmodel kt // =================================================================================== // codelab level 5 // the current status of the temperature the int value is used by the [thermostatfragment] // to react to update fragment's ui // ----------------------------------------------------------------------------------- // todo 1 copy code below private val _temperature mutablestateflow<int> = getlocaltemperatureusecase as mutablestateflow<int> val temperature livedata<int> get = _temperature aslivedata // =================================================================================== // =================================================================================== // codelab level 5 // the current status of the humidity the int value is used by the [thermostatfragment] // to react to update fragment's ui // ----------------------------------------------------------------------------------- // todo 2 copy code below private val _humidity mutablestateflow<int> = getrelativehumidityusecase as mutablestateflow<int> val humidity livedata<int> get = _humidity aslivedata // =================================================================================== // =================================================================================== // codelab level 5 // the current status of the system mode the enum value is used by the [thermostatfragment] // to react to update fragment's ui // ----------------------------------------------------------------------------------- // todo 3 copy code below private val _systemmode stateflow<thermostatsystemmode> = getsystemmodeflowusecase val systemmode livedata<thermostatsystemmode> get = _systemmode aslivedata // =================================================================================== // =================================================================================== // codelab level 5 // the current status of the fan mode the enum value is used by the [thermostatfragment] // to react to update fragment's ui // ----------------------------------------------------------------------------------- // todo 4 copy code below private val _fanmode stateflow<fancontrolfanmode> = getfanmodeflowusecase val fanmode livedata<fancontrolfanmode> get = _fanmode aslivedata // =================================================================================== // =================================================================================== // codelab level 5 // the current status of the cooling setpoint the int value is used by the [thermostatfragment] // to react to update fragment's ui // ----------------------------------------------------------------------------------- // todo 5 copy code below private val _occupiedcoolingsetpoint stateflow<int> = getoccupiedcoolingsetpointflowusecase val occupiedcoolingsetpoint livedata<int> get = _occupiedcoolingsetpoint aslivedata // =================================================================================== // =================================================================================== // codelab level 5 // the current status of the heating setpoint the int value is used by the [thermostatfragment] // to react to update fragment's ui // ----------------------------------------------------------------------------------- // todo 6 copy code below private val _occupiedheatingsetpoint stateflow<int> = getoccupiedheatingsetpointflowusecase val occupiedheatingsetpoint livedata<int> get = _occupiedheatingsetpoint aslivedata // =================================================================================== // =================================================================================== // codelab level 5 // the current status of the battery the int value is used by the [thermostatfragment] // to react to update fragment's ui // ----------------------------------------------------------------------------------- // todo 7 copy code below private val _batterystatus mutablestateflow<int> = getbatpercentremainingusecase as mutablestateflow<int> val batterystatus livedata<int> get = _batterystatus aslivedata // =================================================================================== // =================================================================================== // codelab level 5 // triggered by the "humidity" seekbar in the [thermostatfragment] // [humidity] store the current status of the humidity to indicate the progress // ----------------------------------------------------------------------------------- // todo 8 copy code below _humidity value = progress * 100 // =================================================================================== // =================================================================================== // codelab level 5 // triggered by the "humidity" seekbar in the [thermostatfragment] // [updatehumidityseekbarprogress] update the current status of the humidity to indicate the // progress // [setrelativehumidityusecase] will update the int value of the new humidity status [0 100] // * 100 // ----------------------------------------------------------------------------------- // todo 9 copy code below viewmodelscope launch { updatehumidityseekbarprogress progress setrelativehumidityusecase progress * 100 } // =================================================================================== // =================================================================================== // codelab level 5 // triggered by the "temperature" seekbar in the [thermostatfragment] // [temperature] store the current status of the temperature to indicate the progress // ----------------------------------------------------------------------------------- // todo 10 copy code below _temperature value = progress * 100 // =================================================================================== // =================================================================================== // codelab level 5 // triggered by the "temperature" seekbar in the [thermostatfragment] // [updatetemperatureseekbarprogress] update the current status of the temperature to indicate // the progress // [setlocaltemperatureusecase] will update the int value of the new temperature status // [value] * 100 // ----------------------------------------------------------------------------------- // todo 11 copy code below viewmodelscope launch { updatetemperatureseekbarprogress progress setlocaltemperatureusecase progress * 100 } // ==================================================================================== // =================================================================================== // codelab level 5 // triggered by the "battery" seekbar in the [thermostatfragment] // [batterystatus] store the current status of the battery to indicate the progress // ----------------------------------------------------------------------------------- // todo 12 copy code below _batterystatus value = progress // ==================================================================================== // =================================================================================== // codelab level 5 // triggered by the "battery" seekbar in the [thermostatfragment] // [updatebatteryseekbarprogress] update the current status of the battery to indicate the // progress // [setbatpercentremainingusecase] will update the int value of the new battery status // ----------------------------------------------------------------------------------- // todo 13 copy code below viewmodelscope launch { updatebatteryseekbarprogress progress setbatpercentremainingusecase progress } // ==================================================================================== // =================================================================================== // codelab level 5 // triggered by the "systemmode" popup in the [thermostatfragment] // [setsystemmodeusecase] will update the enum value of the new system mode status // ----------------------------------------------------------------------------------- // todo 14 copy code below viewmodelscope launch { setsystemmodeusecase systemmode } // ==================================================================================== // =================================================================================== // codelab level 5 // triggered by the "fanmode" popup in the [thermostatfragment] // [setfanmodeusecase] will update the enum value of the new fan mode status // ----------------------------------------------------------------------------------- // todo 15 copy code below viewmodelscope launch { setfanmodeusecase fanmode } // ==================================================================================== // =================================================================================== // codelab level 5 // triggered by the "heating plus" button in the [fragment_thermostat xml] // [setoccupiedheatingsetpointusecase] will update the int value of the +1 degree [degree] * // 100 // ----------------------------------------------------------------------------------- // todo 16 copy code below viewmodelscope launch { val nextvalue = _occupiedheatingsetpoint value + 100 timber d "current value = ${_occupiedheatingsetpoint value} set value = $nextvalue" setoccupiedheatingsetpointusecase nextvalue } // ==================================================================================== // =================================================================================== // codelab level 5 // triggered by the "heating minus" button in the [fragment_thermostat xml] // [setoccupiedheatingsetpointusecase] will update the int value of the -1 degree [degree] * // 100 // ----------------------------------------------------------------------------------- // todo 17 copy code below viewmodelscope launch { val nextvalue = _occupiedheatingsetpoint value - 100 timber d "current value = ${_occupiedheatingsetpoint value} set value = $nextvalue" setoccupiedheatingsetpointusecase nextvalue } // ==================================================================================== // =================================================================================== // codelab level 5 // triggered by the "cooling plus" button in the [fragment_thermostat xml] // [setoccupiedcoolingsetpointusecase] will update the int value of the +1 degree [degree] * // 100 // ----------------------------------------------------------------------------------- // todo 18 copy code below viewmodelscope launch { val nextvalue = _occupiedcoolingsetpoint value + 100 timber d "current value = ${_occupiedcoolingsetpoint value} set value = $nextvalue" setoccupiedcoolingsetpointusecase nextvalue } // ==================================================================================== // =================================================================================== // codelab level 5 // triggered by the "cooling minus" button in the [fragment_thermostat xml] // [setoccupiedcoolingsetpointusecase] will update the int value of the -1 degree [degree] * // 100 // ----------------------------------------------------------------------------------- // todo 19 copy code below viewmodelscope launch { val nextvalue = _occupiedcoolingsetpoint value - 100 timber d "current value = ${_occupiedcoolingsetpoint value} set value = $nextvalue" setoccupiedcoolingsetpointusecase nextvalue } // ==================================================================================== noteyou can find related files in android studio by going to edit menu> find > find in files and entering the keyword "codelab" observe cluster value next, use the observe function to keep track whenever there is a change in the cluster value occupancy sensorlevel 1 file path feature > sensor > java > com matter virtual device app feature sensor file name occupancysensorfragment kt // =================================================================================== // codelab level 1 // trigger the processing for updating new occupancy state of the virtual device // todo 1 uncomment the following code blocks // ----------------------------------------------------------------------------------- //binding occupancybutton setonclicklistener { viewmodel onclickbutton } // =================================================================================== // =================================================================================== // codelab level 1 // [onprogresschanged] will update the fragment's ui via viewmodel livedata // [onstoptrackingtouch] will trigger the processing for updating new battery state of the // virtual device // todo 2 uncomment the following code blocks // ----------------------------------------------------------------------------------- //binding occupancysensorbatterylayout titletext text = getstring r string battery //binding occupancysensorbatterylayout seekbardata = // seekbardata progress = viewmodel batterystatus //binding occupancysensorbatterylayout seekbar setonseekbarchangelistener // object seekbar onseekbarchangelistener { // override fun onprogresschanged seekbar seekbar, progress int, fromuser boolean { // viewmodel updatebatteryseekbarprogress progress // } // // override fun onstarttrackingtouch seekbar seekbar {} // // override fun onstoptrackingtouch seekbar seekbar { // viewmodel updatebatterystatustocluster seekbar progress // } // } // // =================================================================================== // =================================================================================== // codelab level 1 // observer on the current occupancy status and react on the fragment's ui // todo 3 uncomment the following code blocks // ----------------------------------------------------------------------------------- //viewmodel occupancy observe viewlifecycleowner { // if it { // binding occupancyvaluetext text = getstring r string occupancy_state_occupied // binding occupancybutton setimageresource r drawable ic_occupied // } else { // binding occupancyvaluetext text = getstring r string occupancy_state_unoccupied // binding occupancybutton setimageresource r drawable ic_unoccupied // } //} // =================================================================================== // =================================================================================== // codelab level 1 // observer on the current battery status and react on the fragment's ui // todo 4 uncomment the following code blocks // ----------------------------------------------------------------------------------- //viewmodel batterystatus observe viewlifecycleowner { // val text string = getstring r string battery_format, it // binding occupancysensorbatterylayout valuetext text = // html fromhtml text, html from_html_mode_legacy //} // =================================================================================== contact sensorlevel 2 file path feature > sensor > java > com matter virtual device app feature sensor file name contactsensorfragment kt // =================================================================================== // codelab level 2 // trigger the processing for updating new contact state of the virtual device // todo 1 uncomment the following code blocks // ----------------------------------------------------------------------------------- //binding contactbutton setonclicklistener { viewmodel onclickbutton } // =================================================================================== /** battery layout */ // =================================================================================== // codelab level 2 // [onprogresschanged] will update the fragment's ui via viewmodel livedata // [onstoptrackingtouch] will trigger the processing for updating new battery state of the // virtual device // todo 2 uncomment the following code blocks // ----------------------------------------------------------------------------------- //binding contactsensorbatterylayout titletext text = getstring r string battery //binding contactsensorbatterylayout seekbardata = seekbardata progress = viewmodel batterystatus //binding contactsensorbatterylayout seekbar setonseekbarchangelistener // object seekbar onseekbarchangelistener { // override fun onprogresschanged seekbar seekbar, progress int, fromuser boolean { // viewmodel updatebatteryseekbarprogress progress // } // // override fun onstarttrackingtouch seekbar seekbar {} // // override fun onstoptrackingtouch seekbar seekbar { // viewmodel updatebatterystatustocluster seekbar progress // } // } // // =================================================================================== // =================================================================================== // codelab level 2 // observer on the current contact status and react on the fragment's ui // todo 3 uncomment the following code blocks // ----------------------------------------------------------------------------------- //viewmodel statevalue observe viewlifecycleowner { // if it { // binding contactvaluetext text = getstring r string contact_state_close // binding contactbutton setimageresource r drawable ic_unoccupied // } else { // binding contactvaluetext text = getstring r string contact_state_open // binding contactbutton setimageresource r drawable ic_occupied // } //} // =================================================================================== // =================================================================================== // codelab level 2 // observer on the current battery status and react on the fragment's ui // todo 4 uncomment the following code blocks // ----------------------------------------------------------------------------------- //viewmodel batterystatus observe viewlifecycleowner { // val text string = getstring r string battery_format, it // binding contactsensorbatterylayout valuetext text = // html fromhtml text, html from_html_mode_legacy } // =================================================================================== video playerlevel 2 file path feature > media > java > com matter virtual device app feature media file name videoplayerfragment kt // =================================================================================== // codelab level 2 // [buttondata] observer on the current on/off status and react on the fragment's ui // [onclicklistener] trigger the processing for updating new on/off state of the virtual device // todo 1 uncomment the following code blocks // ----------------------------------------------------------------------------------- //binding videoplayeronofflayout buttondata = // buttondata // onoff = viewmodel onoff, // ontext = r string on_off_switch_power_on, // offtext = r string on_off_switch_power_off // //binding videoplayeronofflayout button setonclicklistener { viewmodel onclickbutton } // =================================================================================== // =================================================================================== // codelab level 2 // observer on the current playback status and react on the fragment's ui // todo 2 uncomment the following code blocks // ----------------------------------------------------------------------------------- //viewmodel playbackstate observe viewlifecycleowner { state -> // val statetext = convertplaybackstatetostring state // timber d "playbackstate $state $statetext " // binding videoplayerstatelayout valuetext text = statetext //} // =================================================================================== // =================================================================================== // codelab level 2 // observer on the current playback speed and react on the fragment's ui // todo 3 uncomment the following code blocks // ----------------------------------------------------------------------------------- //viewmodel playbackspeed observe viewlifecycleowner { speed -> // binding videoplayerspeedlayout valuetext text = speed tostring //} // =================================================================================== // =================================================================================== // codelab level 2 // observer on the current key code and react on the fragment's ui // todo 4 uncomment the following code blocks // ----------------------------------------------------------------------------------- //viewmodel keycode observe viewlifecycleowner { keycode -> // binding videoplayerkeypadlayout valuetext text = keycode value //} // =================================================================================== door locklevel 3 file path feature > closure > java > com matter virtual device app feature closure file name doorlockfragment kt // =================================================================================== // codelab level 3 // [buttondata] observer on the current lock status and react on the fragment's ui // [onclicklistener] trigger the processing for updating new lock state of the virtual device // ----------------------------------------------------------------------------------- // todo 1 copy code below binding doorlockonofflayout buttondata = buttondata onoff = viewmodel lockstate, ontext = r string door_lock_unlocked, offtext = r string door_lock_locked binding doorlockonofflayout button setonclicklistener { viewmodel onclickbutton } // =================================================================================== // =================================================================================== // codelab level 3 // trigger the processing for sending alarm event // ----------------------------------------------------------------------------------- // todo 2 copy code below binding doorlocksendalarmlayout button setonclicklistener { viewmodel onclicksendlockalarmeventbutton } // =================================================================================== // =================================================================================== // codelab level 3 // [onprogresschanged] will update the fragment's ui via viewmodel livedata // [onstoptrackingtouch] will trigger the processing for updating new battery state of the // virtual device // ----------------------------------------------------------------------------------- // todo 3 copy code below binding doorlockbatterylayout titletext text = getstring r string battery binding doorlockbatterylayout seekbardata = seekbardata progress = viewmodel batterystatus binding doorlockbatterylayout seekbar setonseekbarchangelistener object seekbar onseekbarchangelistener { override fun onprogresschanged seekbar seekbar, progress int, fromuser boolean { viewmodel updatebatteryseekbarprogress progress } override fun onstarttrackingtouch seekbar seekbar {} override fun onstoptrackingtouch seekbar seekbar { viewmodel updatebatterystatustocluster seekbar progress } } // =================================================================================== // =================================================================================== // codelab level 3 // observer on the current battery status and react on the fragment's ui // ----------------------------------------------------------------------------------- // todo 4 copy code below viewmodel batterystatus observe viewlifecycleowner { val text string = getstring r string battery_format, it binding doorlockbatterylayout valuetext text = html fromhtml text, html from_html_mode_legacy } // =================================================================================== extended color lightlevel 3 file path feature > lighting > java > com matter virtual device app feature lighting file name extendedcolorlightfragment kt // =================================================================================== // codelab level 3 // [buttondata] observer on the current on/off status and react on the fragment's ui // [onclicklistener] trigger the processing for updating new on/off state of the virtual device // ----------------------------------------------------------------------------------- // todo 1 copy code below binding extendedcolorlightonofflayout buttondata = buttondata onoff = viewmodel onoff, ontext = r string on_off_switch_power_on, offtext = r string on_off_switch_power_off binding extendedcolorlightonofflayout button setonclicklistener { viewmodel onclickbutton } // =================================================================================== // =================================================================================== // codelab level 3 // observer on the current color level status and react on the fragment's ui // ----------------------------------------------------------------------------------- // todo 2 copy code below viewmodel level observe viewlifecycleowner { // min 2 1% , max 255 100% val level int = it tofloat / 100 * 255 toint timber d "level $it" // if level value is 0, user can't distinguish the color // so, set it to half value + half of max binding extendedcolorlightcolorlayout colorboard drawable? alpha = level / 2 + 127 } // =================================================================================== // =================================================================================== // codelab level 3 // observer on the current color status and react on the fragment's ui // ----------------------------------------------------------------------------------- // todo 3 copy code below viewmodel currentcolor observe viewlifecycleowner { hsvcolor -> val rgbcolor int = colorcontrolutil hue2rgb hsvcolor currenthue tofloat , hsvcolor currentsaturation tofloat timber d "currenthue ${hsvcolor currenthue},currentsaturation ${hsvcolor currentsaturation}" timber d "color #${integer tohexstring rgbcolor }" var level int? = binding extendedcolorlightcolorlayout colorboard drawable? alpha if level == null level = 255 timber d "level $level" binding extendedcolorlightcolorlayout colorboard setimagedrawable bitmapdrawable resources, colorcontrolutil colorboard rgbcolor } // =================================================================================== // =================================================================================== // codelab level 3 // observer on the current color temperature status and react on the fragment's ui // ----------------------------------------------------------------------------------- // todo 4 copy code below viewmodel colortemperature observe viewlifecycleowner { // min 2580k 2577k , max 7050k 7042k val colortemperature int = 1000000 / it val rgbcolor int = colorcontrolutil kelvin2rgb colortemperature timber d "color temperature $colortemperature $it" timber d "color #${integer tohexstring rgbcolor }" binding extendedcolorlightcolorlayout colorboard setimagedrawable bitmapdrawable resources, colorcontrolutil colorboard rgbcolor } // =================================================================================== window coveringlevel 4 file path feature > closure > java > com matter virtual device app feature closure file name windowcoveringfragment kt // =================================================================================== // codelab level 4 // [onprogresschanged] will update the fragment's ui via viewmodel livedata // [onstoptrackingtouch] will trigger the processing for updating new windowshade state of the // virtual device // ----------------------------------------------------------------------------------- // todo 1 copy code below binding windowcoveringwindowshadeseekbar setonseekbarchangelistener object seekbar onseekbarchangelistener { override fun onprogresschanged seekbar seekbar, progress int, fromuser boolean { val targetpercentage = seekbar progress val text string = getstring r string window_covering_window_shade_format, targetpercentage val percentagetextview = binding windowcoveringwindowshadevaluetext percentagetextview text = html fromhtml text, html from_html_mode_legacy } override fun onstarttrackingtouch seekbar seekbar {} override fun onstoptrackingtouch seekbar seekbar { viewmodel stopmotion seekbar progress } } // ======================================================================================================= // =================================================================================== // codelab level 4 // [onprogresschanged] will update the fragment's ui via viewmodel livedata // [onstoptrackingtouch] will trigger the processing for updating new battery state of the // virtual device // ----------------------------------------------------------------------------------- // todo 2 copy code below binding windowcoveringbatterylayout titletext text = getstring r string battery binding windowcoveringbatterylayout seekbardata = seekbardata progress = viewmodel batterystatus binding windowcoveringbatterylayout seekbar setonseekbarchangelistener object seekbar onseekbarchangelistener { override fun onprogresschanged seekbar seekbar, progress int, fromuser boolean { viewmodel updatebatteryseekbarprogress progress } override fun onstarttrackingtouch seekbar seekbar {} override fun onstoptrackingtouch seekbar seekbar { viewmodel updatebatterystatustocluster seekbar progress } } // ======================================================================================================= // =================================================================================== // codelab level 4 // observer on the current position/operation status and react on the fragment's ui // ----------------------------------------------------------------------------------- // todo 3 copy code below viewmodel windowcoveringstatus observe viewlifecycleowner { status -> timber d "currentposition ${status currentposition},operationalstatus ${status operationalstatus}" binding windowcoveringwindowshadeseekbar progress = status currentposition val text string = getstring r string window_covering_window_shade_format, status currentposition binding windowcoveringwindowshadevaluetext text = html fromhtml text, html from_html_mode_legacy when status operationalstatus { 0 -> { when status currentposition { 0 -> { binding windowcoveringoperationalstatustext settext r string window_covering_closed } 100 -> { binding windowcoveringoperationalstatustext settext r string window_covering_open } else -> { binding windowcoveringoperationalstatustext settext r string window_covering_partially_open } } } 1 -> { binding windowcoveringoperationalstatustext settext r string window_covering_opening } 2 -> { binding windowcoveringoperationalstatustext settext r string window_covering_closing } else -> {} } } // ======================================================================================================= // =================================================================================== // codelab level 4 // observer on the current battery status and react on the fragment's ui // ----------------------------------------------------------------------------------- // todo 4 copy code below viewmodel batterystatus observe viewlifecycleowner { val text string = getstring r string battery_format, it binding windowcoveringbatterylayout valuetext text = html fromhtml text, html from_html_mode_legacy } // ======================================================================================================= thermostatlevel 5 file path feature > hvac > java > com matter virtual device app feature hvac file name themostatfragment kt // =================================================================================== // codelab level 5 // [onprogresschanged] will update the fragment's ui via viewmodel livedata // [onstoptrackingtouch] will trigger the processing for updating new temperature state of the // virtual device // ----------------------------------------------------------------------------------- // todo 1 copy code below binding thermostattemperatureseekbar setonseekbarchangelistener object seekbar onseekbarchangelistener { override fun onprogresschanged seekbar seekbar, progress int, fromuser boolean { viewmodel updatetemperatureseekbarprogress progress } override fun onstarttrackingtouch seekbar seekbar {} override fun onstoptrackingtouch seekbar seekbar { viewmodel updatetemperaturetocluster seekbar progress } } // =================================================================================== // =================================================================================== // codelab level 5 // [onprogresschanged] will update the fragment's ui via viewmodel livedata // [onstoptrackingtouch] will trigger the processing for updating new humidity state of the // virtual device // ----------------------------------------------------------------------------------- // todo 2 copy code below binding humiditysensorhumidityseekbar setonseekbarchangelistener object seekbar onseekbarchangelistener { override fun onprogresschanged seekbar seekbar, progress int, fromuser boolean { viewmodel updatehumidityseekbarprogress progress } override fun onstarttrackingtouch seekbar seekbar {} override fun onstoptrackingtouch seekbar seekbar { viewmodel updatehumiditytocluster seekbar progress } } // =================================================================================== // =================================================================================== // codelab level 5 // [onprogresschanged] will update the fragment's ui via viewmodel livedata // [onstoptrackingtouch] will trigger the processing for updating new battery state of the // virtual device // ----------------------------------------------------------------------------------- // todo 3 copy code below binding thermostatbatterylayout titletext text = getstring r string battery binding thermostatbatterylayout seekbardata = seekbardata progress = viewmodel batterystatus binding thermostatbatterylayout seekbar setonseekbarchangelistener object seekbar onseekbarchangelistener { override fun onprogresschanged seekbar seekbar, progress int, fromuser boolean { viewmodel updatebatteryseekbarprogress progress } override fun onstarttrackingtouch seekbar seekbar {} override fun onstoptrackingtouch seekbar seekbar { viewmodel updatebatterystatustocluster seekbar progress } } // =================================================================================== // =================================================================================== // codelab level 5 // observer on the current temperature status and react on the fragment's ui // ----------------------------------------------------------------------------------- // todo 4 copy code below viewmodel temperature observe viewlifecycleowner { val celsiustemp float = it tofloat / 100 val celsiustext string = getstring r string temperature_celsius_format, celsiustemp binding thermostattemperaturecelsiusvaluetext text = html fromhtml celsiustext, html from_html_mode_legacy val fahrenheittemp float = it tofloat / 100 * 9 / 5 + 32 val fahrenheittext string = getstring r string temperature_fahrenheit_format, fahrenheittemp binding thermostattemperaturefahrenheitvaluetext text = html fromhtml fahrenheittext, html from_html_mode_legacy binding thermostattemperatureseekbar progress = celsiustemp toint } // ========================================================================================== // =================================================================================== // codelab level 5 // observer on the current fan mode status and react on the fragment's ui // ----------------------------------------------------------------------------------- // todo 5 copy code below viewmodel fanmode observe viewlifecycleowner { timber d "fanmode $it" this fanmode = it binding fancontrolfanmodelayout valuetext text = convertfanmodetostring it } // ========================================================================================== // =================================================================================== // codelab level 5 // observer on the current heating setpoint and react on the fragment's ui // ----------------------------------------------------------------------------------- // todo 6 copy code below viewmodel occupiedheatingsetpoint observe viewlifecycleowner { val celsiustemp float = it tofloat / 100 val celsiustext string = getstring r string temperature_celsius_format, celsiustemp binding thermostatsettemperatureheatingcelsiusvaluetext text = html fromhtml celsiustext, html from_html_mode_legacy val fahrenheittemp float = it tofloat / 100 * 9 / 5 + 32 val fahrenheittext string = getstring r string temperature_fahrenheit_format, fahrenheittemp binding thermostatsettemperatureheatingfahrenheitvaluetext text = html fromhtml fahrenheittext, html from_html_mode_legacy } // =================================================================================== // =================================================================================== // codelab level 5 // observer on the current cooling setpoint and react on the fragment's ui // ----------------------------------------------------------------------------------- // todo 7 copy code below viewmodel occupiedcoolingsetpoint observe viewlifecycleowner { val celsiustemp float = it tofloat / 100 val celsiustext string = getstring r string temperature_celsius_format, celsiustemp binding thermostatsettemperaturecoolingcelsiusvaluetext text = html fromhtml celsiustext, html from_html_mode_legacy val fahrenheittemp float = it tofloat / 100 * 9 / 5 + 32 val fahrenheittext string = getstring r string temperature_fahrenheit_format, fahrenheittemp binding thermostatsettemperaturecoolingfahrenheitvaluetext text = html fromhtml fahrenheittext, html from_html_mode_legacy } // =================================================================================== // =================================================================================== // codelab level 5 // observer on the current system mode status and react on the fragment's ui // ----------------------------------------------------------------------------------- // todo 8 copy code below viewmodel systemmode observe viewlifecycleowner { timber d "systemmode $it" this systemmode = it binding thermostatsystemmodelayout valuetext text = convertsystemmodetostring it } // =================================================================================== // =================================================================================== // codelab level 5 // observer on the current humidity status and react on the fragment's ui // ----------------------------------------------------------------------------------- // todo 9 copy code below viewmodel humidity observe viewlifecycleowner { val humidity int = it / 100 val humiditytext string = getstring r string humidity_format, humidity binding humiditysensorhumiditypercentagevaluetext text = html fromhtml humiditytext, html from_html_mode_legacy binding humiditysensorhumidityseekbar progress = humidity } // =================================================================================== // =================================================================================== // codelab level 5 // observer on the current battery status and react on the fragment's ui // ----------------------------------------------------------------------------------- // todo 10 copy code below viewmodel batterystatus observe viewlifecycleowner { val text string = getstring r string battery_format, it binding thermostatbatterylayout valuetext text = html fromhtml text, html from_html_mode_legacy } // =================================================================================== // =================================================================================== // codelab level 5 // trigger the processing for setting system mode // ----------------------------------------------------------------------------------- // todo 11 copy code below alertdialog builder requirecontext settitle r string thermostat_mode setsinglechoiceitems modelist, convertsystemmodetoindex this systemmode { dialog, which -> timber d "thermostat mode set $which ${modelist[which]} " viewmodel setsystemmode convertindextosystemmode which dialog dismiss } setnegativebutton r string cancel, null show // =================================================================================== // =================================================================================== // codelab level 5 // trigger the processing for setting fan mode // ----------------------------------------------------------------------------------- // todo 12 copy code below alertdialog builder requirecontext settitle r string fan_control_fan_mode setsinglechoiceitems modelist, convertfanmodetoindex this fanmode { dialog, which -> timber d "fan mode set $which ${modelist[which]} " viewmodel setfanmode convertindextofanmode which dialog dismiss } setnegativebutton r string cancel, null show // =================================================================================== build and run the virtual device app to build and run your app, follow these steps using a usb cable, connect your mobile device the minimum os requirement is android 8 0 oreo select the sample virtual device app from the run configurations menu in the android studio then, select the connected device in the target device menu click run you can see the device you created in the matter virtual device app onboard and control the virtual device via the smartthings app onboard to onboard the virtual device select and set up the virtual device type you created click save click start to show the qr code for onboarding then, go to the smartthings app and click the + button then, onboard the virtual device by scanning its qr code control by smartthings app in the smartthings app, control the virtual device by using its various functions such as on and off for switch contribute to matter open source optional notethis step is optional, but you can proceed if you want to know how to contribute your code to matter open source to contribute to matter open source, you need to have the latest code therefore, apart from the project files provided by this code lab activity, you should fork and modify the latest code from matter open source project matter follows the "fork-and-pull" model for accepting contributions to do this sign in or sign up to github fork the matter repository by clicking fork on the web ui for each new feature, clone your fork to the local pc and create a working branch $ git clone https //github com/<username>/connectedhomeip git $ git checkout –b <branch-name> before running the build command, source the environment setup script activate sh at the top level this script takes care of downloading gn, ninja, and setting up a python environment with libraries used to build and test $ source scripts/activate sh build the virtual device app using the build_example py $ /scripts/build/build_examples py --target android-arm64-virtual-device-app build add each modified file to include in the commit then, create a commit $ git add <filename1> <filename1> $ git commit –s noteto contribute to the open source, you must check the integrity of the code for this, checking using restyle is recommended push to your github fork $ git push origin <branch-name> then, submit your pull request by clicking contribute > open pull request on the web ui write a description of the problem, change overview, and test then, sign the contributor license agreement cla so a reviewer can automatically be assigned click open pull request tipsee contributing to matter for more information you're done! congratulations! you have successfully achieved the goal of this code lab topic now, you can create a matter-compatible virtual device and contribute your code to matter open source by yourself! if you're having trouble, you may download this file matter virtual device complete code 11 49 mb learn more by going to smartthings matter libraries
tutorials health, galaxy watch, mobile
blogthe samsung privileged health sdk enables your application to collect vital signs and other health parameters tracked on galaxy watch running wear os powered by samsung. the tracked data can be displayed immediately or retained for later analysis. some kinds of tracked data, such as batching data, are impractical to display on a watch screen in real-time, so it is common to store the data in a database or server solution or show them on the larger screen of a mobile device. this blog demonstrates how to develop 2 connected sample applications. a watch application uses the samsung privileged health sdk to collect heart rate tracker data, then uses the wearable data layer api to transmit it to a companion application on the user’s android mobile device, which displays the data as a simple list on its screen. you can follow along with the demonstration by downloading the sample application project. to test the applications, you need a galaxy watch4 (or higher model) and a connected android mobile device. creating the application project the application project consists of a wearable module for the watch, and a mobile module for android mobile devices: in android studio, select open file > new > new project. select wear os > empty wear app and click next. new wear app define the project details. project details to create a companion mobile application for the watch application, check the pair with empty phone app box. notemake sure that the application id is identical for both modules in their “build.gradle” files. for more information about creating multi-module projects, see from wrist to hand: develop a companion app for your wearable application. implementing the watch application the watch application ui has 2 buttons. the start/stop button controls heart data tracking, and the send button transfers the collected data to the connected mobile device. the screen consists of a heart rate field and 4 ibi value fields, since there can be up to 4 ibi values in a single tracking result. watch application ui track and extract heart rate data when the user taps the start button on the wearable application ui, the starttracking() function from the mainviewmodel class is invoked. the application must check that the galaxy watch supports the heart rate tracking capability that we want to implement, as the supported capabilities depend on the device model and software version. retrieve the list of supported health trackers with the trackingcapability.supporthealthtrackertypes of the healthtrackingservice class: override fun hascapabilities(): boolean { log.i(tag, "hascapabilities()") healthtrackingservice = healthtrackingserviceconnection.gethealthtrackingservice() val trackers: list<healthtrackertype> = healthtrackingservice!!.trackingcapability.supporthealthtrackertypes return trackers.contains(trackingtype) } to track the heart rate values on the watch, read the flow of values received in the ondatareceived() listener: @experimentalcoroutinesapi override suspend fun track(): flow<trackermessage> = callbackflow { val updatelistener = object : healthtracker.trackereventlistener { override fun ondatareceived(datapoints: mutablelist<datapoint>) { for (datapoint in datapoints) { var trackeddata: trackeddata? = null val hrvalue = datapoint.getvalue(valuekey.heartrateset.heart_rate) val hrstatus = datapoint.getvalue(valuekey.heartrateset.heart_rate_status) if (ishrvalid(hrstatus)) { trackeddata = trackeddata() trackeddata.hr = hrvalue log.i(tag, "valid hr: $hrvalue") } else { coroutinescope.runcatching { trysendblocking(trackermessage.trackerwarningmessage(geterror(hrstatus.tostring()))) } } val validibilist = getvalidibilist(datapoint) if (validibilist.size > 0) { if (trackeddata == null) trackeddata = trackeddata() trackeddata.ibi.addall(validibilist) } if ((ishrvalid(hrstatus) || validibilist.size > 0) && trackeddata != null) { coroutinescope.runcatching { trysendblocking(trackermessage.datamessage(trackeddata)) } } if (trackeddata != null) { validhrdata.add(trackeddata) } } trimdatalist() } fun geterror(errorkeyfromtracker: string): string { val str = errors.getvalue(errorkeyfromtracker) return context.resources.getstring(str) } override fun onflushcompleted() { log.i(tag, "onflushcompleted()") coroutinescope.runcatching { trysendblocking(trackermessage.flushcompletedmessage) } } override fun onerror(trackererror: healthtracker.trackererror?) { log.i(tag, "onerror()") coroutinescope.runcatching { trysendblocking(trackermessage.trackererrormessage(geterror(trackererror.tostring()))) } } } heartratetracker = healthtrackingservice!!.gethealthtracker(trackingtype) setlistener(updatelistener) awaitclose { log.i(tag, "tracking flow awaitclose()") stoptracking() } } each tracking result is within a list in the datapoints argument of the ondatareceived() update listener. the sample application implements on-demand heart rate tracking, the update listener is invoked every second and each data point list contains 1 element. to extract a heart rate from data point: val hrvalue = datapoint.getvalue(valuekey.heartrateset.heart_rate) val hrstatus = datapoint.getvalue(valuekey.heartrateset.heart_rate_status) a status parameter is returned in addition to the heart rate data. if the heart rate reading was successful, its value is 1. each inter-beat interval data point consists of a list of values and the corresponding status for each value. since samsung privileged health sdk version 1.2.0, there can be up to 4 ibi values in a single data point, depending on the heart rate. if the ibi reading is valid, the value of the status parameter is 0. to extract only ibi data that is valid and whose value is not 0: private fun isibivalid(ibistatus: int, ibivalue: int): boolean { return ibistatus == 0 && ibivalue != 0 } 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>() for ((i, ibistatus) in ibistatuses.withindex()) { if (isibivalid(ibistatus, ibivalues[i])) { validibilist.add(ibivalues[i]) } } send data to the mobile application the application uses the messageclient class of the wearable data layer api to send messages to the connected mobile device. messages are useful for remote procedure calls (rpc), one-way requests, or in request-or-response communication models. when a message is sent, if the sending and receiving devices are connected, the system queues the message for delivery and returns a successful result code. the successful result code does not necessarily mean that the message was delivered successfully, as the devices can be disconnected before the message is received. to advertise and discover devices on the same network with features that the watch can interact with, use the capabilityclient class of the wearable data layer api. each device on the network is represented as a node that supports various capabilities (features) that an application defines at build time or configures dynamically at runtime. your watch application can search for nodes with a specific capability and interact with it, such as sending messages. this can also work in the opposite direction, with the wearable application advertising the capabilities it supports. when the user taps the send button on the wearable application ui, the sendmessage() function from the mainviewmodel class is invoked, which triggers code in the sendmessageusecase class: override suspend fun sendmessage(message: string, node: node, messagepath: string): boolean { val nodeid = node.id var result = false nodeid.also { id -> messageclient .sendmessage( id, messagepath, message.tobytearray(charset = charset.defaultcharset()) ).apply { addonsuccesslistener { log.i(tag, "sendmessage onsuccesslistener") result = true } addonfailurelistener { log.i(tag, "sendmessage onfailurelistener") result = false } }.await() log.i(tag, "result: $result") return result } } to find a destination node for the message, retrieve all the available capabilities on the network: override suspend fun getcapabilitiesforreachablenodes(): map<node, set<string>> { log.i(tag, "getcapabilities()") val allcapabilities = capabilityclient.getallcapabilities(capabilityclient.filter_reachable).await() return allcapabilities.flatmap { (capability, capabilityinfo) -> capabilityinfo.nodes.map { it to capability } } .groupby( keyselector = { it.first }, valuetransform = { it.second } ) .mapvalues { it.value.toset() } } since the mobile module of the sample application advertises having the “wear” capability, to find an appropriate destination node, retrieve the list of connected nodes that support it: override suspend fun getnodesforcapability( capability: string, allcapabilities: map<node, set<string>> ): set<node> { return allcapabilities.filtervalues { capability in it }.keys } select the first node from the list, encode the message as a json string, and send the message to the node: suspend operator fun invoke(): boolean { val nodes = getcapablenodes() return if (nodes.isnotempty()) { val node = nodes.first() val message = encodemessage(trackingrepository.getvalidhrdata()) messagerepository.sendmessage(message, node, message_path) true } else { log.i(tag, "no compatible nodes found") false } } implementing the mobile application the mobile application ui consists of a list of the heart rate and inter-beat interval values received from the watch. the list is scrollable. mobile application ui receive and display data from the watch application to enable the mobile application to listen for data from the watch and launch when it receives data, define the datalistenerservice service in the mobile application’s androidmanifest.xml file, within the <application> element: <service android:name="com.samsung.health.mobile.data.datalistenerservice" android:exported="true"> <intent-filter> <action android:name="com.google.android.gms.wearable.data_changed" /> <action android:name="com.google.android.gms.wearable.message_received" /> <action android:name="com.google.android.gms.wearable.request_received" /> <action android:name="com.google.android.gms.wearable.capability_changed" /> <action android:name="com.google.android.gms.wearable.channel_event" /> <data android:host="*" android:pathprefix="/msg" android:scheme="wear" /> </intent-filter> </service> implement the datalistenerservice class in the application code to listen for and receive message data. the received json string data is passed as a parameter: private const val tag = "datalistenerservice" private const val message_path = "/msg" class datalistenerservice : wearablelistenerservice() { override fun onmessagereceived(messageevent: messageevent) { super.onmessagereceived(messageevent) val value = messageevent.data.decodetostring() log.i(tag, "onmessagereceived(): $value") when (messageevent.path) { message_path -> { log.i(tag, "service: message (/msg) received: $value") if (value != "") { startactivity( intent(this, mainactivity::class.java) .addflags(intent.flag_activity_new_task).putextra("message", value) ) } else { log.i(tag, "value is an empty string") } } } to decode the message data: fun decodemessage(message: string): list<trackeddata> { return json.decodefromstring(message) } to display the received data on the application screen: @composable fun mainscreen( results: list<trackeddata> ) { column( modifier = modifier .fillmaxsize() .background(color.black), verticalarrangement = arrangement.top, horizontalalignment = alignment.centerhorizontally ) { spacer( modifier .height(70.dp) .fillmaxwidth() .background(color.black) ) listview(results) } } running the applications to run the wearable and mobile applications: connect your galaxy watch and android mobile device (both devices must be paired with each other) to android studio on your computer. select wear from the modules list and the galaxy watch device from the devices list, then click run. the wearable application launches on the watch. connected devices select mobile from the modules list and the android mobile device from the devices list, then click run. the mobile application launches on the mobile device. wear the watch on your wrist and tap start. the watch begins tracking your heart rate. after some tracked values appear on the watch screen, to send the values to the mobile application, tap send. if the mobile application is not running, it is launched. the tracked heart data appears on the mobile application screen. to stop tracking, tap stop on the watch. conclusions the samsung privileged health sdk enables you to track health data, such as heart rate, from a user’s galaxy watch4 or higher smartwatch model. to display the tracked data on a larger screen, you can use the messageclient of the wearable data layer api to send the data to a companion application on the connected mobile device. to develop more advanced application features, you can also use the dataclient class to send data to devices not currently in range of the watch, delivering it only when the device is connected. resources heart rate data transfer code lab
Samsung Developers
tutorials web, mobile
blogfoldable devices are here! these smartphones allow different form factors with just one device, which can lead to new opportunities for innovation. as developers should be able to detect what is the current posture of the device, the physical position in which a device holds, samsung is putting an effort within the w3c on making a new web standard called device posture api. this api allows web applications to request and be notified of changes in the device posture. web apps can take advantage of the new form factors and improve users’ experience. we’ve created this codelab to show you how you can take advantage of this new feature. before we start, if you would like to learn more about it in a different format, here is a video that we’ve created with more information about this api and foldables. 👉 would you like to do this codelab with mentors and in person? if you are in london we will have a first meetup to try this with real foldable devices, feel free to register here! (ed. this event has already occurred, but we're leaving the link intact.) what is the w3c and why you should care in the meantime, as i’ve mentioned before, there is a current proposal about how to take advantage of these foldable devices called ‘device posture api’. its current state is ‘draft’, which means that is still open to changes and discussion and has been published for review by the community, including w3c members, the public (you!), and other technical organizations. we’ve created a demo to show you how to use this api, hear your thoughts and teach you some capabilities of the web. at the end of this codelab you can send us your feedback here. let’s start working… 🛠️ hands on 1. set up your environment you will need the following: samsung internet latest version samsung galaxy z fold2, z fold3, z flip, or z flip3 if a physical device is not available for testing, use a) remote test lab requirements: samsung account java runtime environment (jre) 7 or later with java web start b) device posture api polyfill for testing using a non-foldable smartphone, just implement a polyfill to the project. 2. start your project open a new browser tab, go to https://glitch.com, and log in click new project, then select import from github enter the url of this repository 3. add html video markup note: take a look and check the files of your project before starting to code. in index.html, you will have two main sections, one is dedicated to the video camera and the other one to the camera controls. you can identify the video section as it contains the class video-container. complete the html markup by adding the <video> element, width, height, and id attributes. <div class="video-container"> <video id="video" width="1280" height="200" > video stream not available. </video> </div> once the video markup is added, the html file is complete. besides this, you can find: a <canvas> element into which the captured frames are stored and kept hidden since users don’t need to see it. an <img> element where the pictures will be displayed. 4. enable front and back cameras with facingmode in index.js, you'll find a startup() function, here is where you will be doing the following: initialize most values grab element references to use later set up the camera and image start by setting up the camera. you will have access to both front and back cameras by using facingmode, a domstring that indicates which camera is being used to capture images. it's always a good practice to check if this function is available for use. add the following lines of code in startup(): `let supports = navigator.mediadevices.getsupportedconstraints(); if (supports["facingmode"] === true) { flip_button.disabled = false; }` 5. link the media stream to the video element if you are able to use facingmode, the camera web app will use this option in the capture function to detect which is the current camera used and later send it to the flip button. now, the camera should be activated, insert this block of code after retrieving defaultopts.video value using facingmode: `navigator.mediadevices .getusermedia(defaultsopts) .then(_stream => { stream = _stream; video.srcobject = stream; video.play(); }) .catch(error => console.error(error));` in order to get the media stream, you call navigator.mediadevices.getusermedia() and request a video stream that returns a promise. the success callback receives a stream object as input. it is the <video> element's source to the new stream. once the stream is linked to the <video> element, start it playing by calling video.play(). it's always a good practice to include the error callback too, just in case the camera is not available or the permissions are denied. 6. take a look at the implementations in index.js at this point, the functionality of the web app is complete. before moving to the next step, let’s review the rest of the javascript code: there is an event listener video for the canplay event that will check when the video playback begins. if it's the first time running, it will set up video attributes like width and height. for the snip button, there is an event listener for click that will capture the picture. the flip button will be waiting for a click event to assign the flag about which camera is being used, front or back camera, within the variable shouldfaceuser, and initialize the camera again. clearpicture() creates an image and converts it to a format that will be displayed in the <img> element. finally, takepicture() captures the currently displayed video frame, converts it into a png file, and displays it in the captured frame box. 7. use the device posture api at this point, you should have a working prototype of a camera web app. the video camera should be displayed and a picture may be taken using the snip button. in addition, it will show a preview of the picture taken through the small preview display. the flip button allows you also to switch between front and back cameras. now, it’s time to play around with the layout of the web app and take advantage of the features available on a foldable device. in order to do that, you will implement the device posture api that allows developers to detect what is the current posture of the phone. in order to change the layout when the device is partially folded, the device posture that you will look for is in a form of a book or laptop. in style.css, apply the following media query: @media (device-posture: folded) { body { display: flex; flex-flow: column nowrap; } .video-container .camera-controls { flex: 1 1 env(fold-bottom); } .msg { display:block; margin: 5em; } using modern css features like display:flex and grid, you can change the layout of the body element and the elements with the class video-container and camera-controls when the phone is flipped. 8. test your app whether you test on a real foldable phone or on a remote test lab device, you need to enable the device posture api in the latest version of samsung internet. to do this, open the browser and type internet://flags in the url bar and search for either device posture api or screen fold api, then select enable. test in a real device if you have a real physical device, you can test it directly on samsung internet using the url that glitch provides you by clicking on show in a new window menu. just partially fold your phone and you will see how the layout changes and even discover a hidden message! use remote test lab the other option, if you don’t have a physical device, is by using remote test lab. you can choose any galaxy foldable devices from the list and follow the same instructions as you would with a real device. just make sure to enable the device posture api and have the latest version of samsung internet. use the buttons provided by remote test lab to partially fold your remote galaxy device. implement polyfill polyfill allows you to emulate behavior on devices that do not have folding capabilities. it helps you visualize how the content responds to the different angle and posture configurations. just include sfold-polyfill.js directly into your code and use the polyfill settings (screenfold-settings.js) of the web component that will emulate the angle of the device and therefore, it will change its posture. moreover, add the following code in index.html <head> … <script type='module' defer src="screenfold-settings.js"></script> <script src="sfold-polyfill.js"></script> … </head> <body> <section> <screenfold-settings></screenfold-settings> </section> … </body> 🥳 you did it! you’ve created a web app that detects when a foldable device change its posture. please let us know how it went here, we would like to hear your thoughts around this api, future codelabs and more! this feedback will go directly to the w3c devices and sensors group, so you will be part of the conversation around this draft too! thanks a lot for reading.
Laura Morinigo
SDP DevOps
docsamsung developers terms and conditions please read all of the following terms and conditions carefully these general terms and conditions shall govern the use by you of the samsung developers website developer samsung com and together shall constitute an agreement between you and samsung electronics co ltd "samsung" the terms of the privacy policy are incorporated into these terms and conditions by reference if you have any questions about the terms and conditions, or do not agree to them, then please email us at support@samsungdevelopers com com, before using the website samsung may change these terms and conditions or its privacy policy at any time by updating this page you shall therefore check this page from time to time to review these terms and conditions to ensure that you agree with any changes using or accessing this website indicates your continuing acceptance of any updates to the terms and conditions if you do not accept the terms and conditions, then please do not continue to use the website download information about samsung developers samsung is a company existing under the laws of the republic of korea, with its place of business at samsung-ro 129, yeongtong-gu, suwon-city, gyeonggi-do, korea 16677 access to the website and samsung intellectual property rights this website allows you to use the contents contained within it for your own use and benefit samsung shall have the right to modify, withdraw or deny access to the website at any time, including introducing charges for its use or other restrictions on access the website and all the materials contained within it are protected by intellectual property rights including copyright, trademarks, patents, design rights, database rights, and rights in confidential information , and, as such, they either belong to samsung or are licensed to samsung to use the materials include, but are not limited to, the design, layout, logos, brands, look, appearance and graphics of the website, plus content such as software, documents and other materials which appear on it you may not copy, redistribute, republish or otherwise make the materials on the website available to anyone else for a commercial purpose without consent of samsung in writing you may only print or download materials from the website for your own personal, non-commercial use, provided that no materials are modified in any way no graphics are used separately from accompanying text copyright and trademark notices appear in all copies, and you acknowledge this website as the source of the materials and the people to whom you provide these materials are made aware of these restrictions notwithstanding the foregoing, specific license terms for materials on the website may allow broader rights of use, subject to such terms nothing in these terms and conditions grants any license to use any samsung brand [however, you may be entitled to use the developer samsung com logo in accordance with our published guidance from time to time ] samsung goods and services samsung may display the availability of some goods and/or services on this website some of these goods and/or services may only be available in certain jurisdictions and samsung therefore reserves the right to choose where such goods and/or services are supplied by informing the availability of any goods and/or services, samsung does not warrant that such goods and/or services will be available in your jurisdiction and you should check with your local samsung contact for further information where samsung does supply goods and/or services, whether through this website or other means, additional terms and conditions may apply remote test lab remote test lab is service where a qualifying user can conduct testing of software applications suitability or compatibility for certain samsung devices through the website the availability and nature of the devices that samsung makes available in connection with the remote test lab service shall be posted on the website and updated from time to time however, samsung does not guarantee that any specific device will be available at any particular time and users should check the website from time to time to see what devices are in fact available remote test lab uses actual devices, but may not replicate exact operation conditions production models may vary from devices made available through the remote test lab service and therefore users are advised to test applications on production models as well as through remote test lab remote test lab service is only available to you if you are a qualified, registered user of developer samsung com, but you may be restricted from using service without notice when trying prohibited behaviors such as, without limitation, locking device with pin number or pattern or using the remote test lab service to gain an unfair winning advantage over other participants in any events for samsung devices you will only have access to the service for a specific defined period of time which varies depending on the test device once the defined period of time has elapsed, access to remote test lab will cease and you should make sure that all your test or other data in connection with remote test lab is properly saved by using remote test lab, you agree and acknowledge that samsung is not liable for any loss of data or software in connection with your access to the service, and that, prior to the release of any application or device into manufacture, further tests will need to be conducted in recognition of the fact that remote test lab is not a substitute for any such required tests by using remote test lab, you warrant that you agree and ackowledge that the service is designed for testing applications on samsung devices and the test results do not guarantee the use of applications on other devices you will only use the service for testing of applications which are designed solely for use on samsung devices you will uninstall any and all software or other content which has been used in connection with the service once you have completed your session you shall not attempt to copy, reverse engineer or decompile the remote test lab device or any technology connected with it software downloads when we make software available for users to download through developer samsung com, any such download is subject to the terms of our end user license agreement, in addition to these terms and conditions we may also wish to specify certain additional licensing terms in connection with specific software and, if any such additional software licensing terms apply, these will be notified to you at the time you agree to license the software sample code samsung may publish on the website what samsung terms "sample code", which is software developed by samsung and which samsung makes freely available for developers to use under the terms of the sample code license the terms of the sample code license will be notified to you at the time you agree to license any sample code from samsung uploading material to the forum website any material you upload to developer samsung com will be considered non-confidential and non-proprietary, and we have the right at no charge to use, copy, distribute, sub-license and disclose to third parties any such material for any purpose we also have the right to disclose your identity to any third party who makes reasonable claims that any material posted or uploaded by you to the website constitutes a violation of their intellectual property rights, or of their right to privacy samsung reserves the right to remove any material or posting you make on the website if, in its opinion, such material does not comply with samsung's content standards you warrant that any material you upload does not, and will not, infringe any third party intellectual property rights forum the members of developer samsung com are entitled to participate in the forum and blogs that are in operation on the website the rules laid out below apply to anyone participating in the forum, blogging or other interaction with the website forum rules any submission of material by you to the forum means that you accept, and agree to abide by, all the terms and conditions of below forum rules, which supplement the general website terms and conditions and privacy policy moderation the company is under no obligation to you or any other person to oversee, monitor or moderate the forum or any other services samsung provides on the website and samsung may therefore stop moderating the forum at any time samsung reserves the right to remove, or to disable access to, any posted contribution which samsung deems to be potentially defamatory of any person, or otherwise inappropriate, or which samsung deems unlawful or in violation of any third party rights samsung expressly excludes liability for any loss or damage arising from the use of developer samsung com by any person in contravention of these rules submission of contributions there is no limit to the length of a contribution please note that your contribution will not be anonymous before making a contribution, you must register with samsung developers your id, name, profile image and your activity history such as the number of posts, joining date, badges you earned and so on, will appear as part of your published contribution content standards the content standards below must be complied with in spirit as well as to the letter we will determine, at our discretion, whether a contribution breaches the content standards a contribution must be accurate where it states facts , be genuinely held where it states opinions , comply with all -the applicable laws applicable in the country from which it is posted, and be relevant a contribution must not be defamatory of any person be obscene, offensive, hateful or inflammatory promote discrimination based on race, sex, religion, nationality, disability, sexual orientation or age disclose the name, address, telephone, mobile or fax number, e-mail address or any other personal data in respect of any individual infringe any copyright, database right or trademark of any other person breach any legal duty owed to a third party, such as a contractual duty or a duty of confidence be in contempt of court be likely to harass, upset, embarrass, alarm or annoy any other person impersonate any person, or misrepresent your identity or affiliation with any person give the impression that the contribution emanates from samsung if this is not the case advocate, promote, or incite any third party to commit, or assist, any unlawful or criminal act contain a statement which you know or believe, or have reasonable grounds for believing, that members of the public for whom the statement is intended are likely to understand as a direct or indirect encouragement or other inducement to the commission, preparation or instigation of acts of terrorism contain any advertising or promote any services or web links to other sites license by submitting a contribution to developer samsung com, you agree to grant samsung, and any other company or corporation within the samsung group, a non-exclusive license to use that contribution although you will still own the copyright to your contribution, we will have the right to freely use, edit, alter, reproduce, publish and/or distribute the material contained in your contribution this license will be free of charge, perpetual and capable of sub-license we may exercise all copyright and publicity rights in the material contained in your contribution, in all jurisdictions, to their full extent, and for the full period for which any such rights exist in that material by submitting your contribution to dveloper samsung com, you are warranting that you have the right to grant samsung the non-exclusive license described above and that it does not infringe any third party rights including third party intellectual property rights if you are not in a position to developer samsung com, please do not submit the contribution to developer samsung com breach of these rules when we determine that a breach of the content standards has occurred or you have otherwise breached these forum rules, we may at our discretion take such action as we deem appropriate, including, without limitation, withdrawal of your right to use this website, removal of any contributions already posted on the website, and/or other legal action we exclude our liability for all action we may take in response to breaches of these forum rules complaints if you wish to complain about any contribution posted on any category in the forum, please contact us at support@samsungdevelopers com we will then review the contribution and decide whether it complies with our content standards we will deal with any contribution which, in our opinion, breaches the standards see above we will inform you of the outcome of our review within a reasonable time of receiving your complaint changes to forum rules samsung may revise the forum rules at any time please therefore check this page from time to time to make note of any changes samsung assumes no liability or responsibility for notifying changes of the forum rules samsung electronics america forum terms of service to use the forum, you must agree to forum terms of service with samsung electronics america, the company that runs the forum these terms are available on forum developer samsung com/tos terms and conditions the developer samsung com terms and conditions will apply in addition to these specific forum rules our liability to you these terms and conditions do not exclude our liability if any to you for personal injury or death resulting from our negligence fraud any matter for which it would be illegal for us to exclude or to attempt to exclude our liability samsung does not guarantee that this website or any product and/or services provided through the website, will be compatible with all or any hardware and software which you may use will be available all the time or at any specific time samsung is only liable to you for losses which you suffer as a result of a breach of these terms and conditions by us you are solely responsible for all and any losses which you may incur which were not a foreseeable consequence of us breaching these terms and conditions for example if you and samsung could not have contemplated those losses before or when you accessed this website samsung’s liability to you shall not in any circumstances include any business losses that you may incur, including, but not limited to, lost data, lost profits, lost revenue or business interruption by using the developer samsung com website, you agree to indemnify samsung, and other companies and corporations in the samsung group, against any costs, damage, claims, liabilities and expenses incurred as a result of your breach of these terms and conditions, the privacy policy, and/or any other applicable terms including the forum rules website content the information, documents, software and other materials "content" contained within developer samsung com are provided "as is" and are given for general information and interest purposes only samsung tries and ensures that the content contained on the website is accurate and up to date, but samsung cannot be held responsible for any errors, faults or inaccuracies you should not therefore rely on the content, and samsung recommends that you take further advice or seek further guidance before taking any action based on it you expressly agree and acknowledge that you use the content at your sole risk and samsung assumes no liability or responsibility for any user content or information provided by other users of the website in particular, samsung may make available software and technology which is "beta" meaning that it has not been fully tested or tested at all and you should make sure you use such technology at your sole risk and in a test environment taking into account the risk that it may cause damage to your software, hardware and other property you use to the fullest extent permitted by law, we expressly exclude all representations, conditions, warranties or other terms which apply to such content/information, including any implied warranties of satisfactory quality, merchantability, fitness for a particular or any purpose, and non-infringement which might otherwise apply but for this clause if, in a relevant jurisdiction, these limitations and exclusions are not permitted, then our liability shall be limited and excluded to the fullest extent permitted by law linking samsung may link to other websites which are not within its control when samsung does this, samsung will try and make it as clear as possible that you are leaving developer samsung com samsung is not responsible for these other sites in any way, and do not endorse them it is your responsibility to check the terms and conditions and privacy policy on any other site which you visit you may not link to developer samsung com from another site without our consent in writing any consent would be subject to complying with the following guidelines links must be to the home page http //developer samsung com/ you may not create a frame or any other border around developer samsung com the site from which you wish to link must comply with all relevant laws and regulations and must not contain content which may be considered to be distasteful or offensive and you must not imply that samsung endorses, or is associated with, any other site, product or service fees the use of the samsung developers services is free of charge samsung reserves the right to charge for samsung developers services and to change its fees, at its discretion samsung may from time to time launch other services which may be subject to a separate charge and terms contracting online nothing on developer samsung com is intended to be, nor should be construed as, an offer to enter into a contractual relationship with you or anyone else, except for these terms and conditions, which govern the relationship between us in relation to your use of developer samsung com and the services made available through it plus any additional terms we impose in relation to specific products and/or services on the website if you make a contract with a third party who is named or referred to on developer samsung com, it is your responsibility to ensure that you are comfortable with the terms of that contract, and to take legal advice if necessary governing law and jurisdiction the formation, existence, construction, performance, validity and all aspects whatsoever of these terms and conditions, or of any individual one of these terms and conditions, will be governed by the law of the republic of korea the seoul central district court will have exclusive jurisdiction to settle any disputes which may arise out of, or in connection with, these terms and conditions or the use of developer samsung com age limit everyone is welcome to visit developer samsung com however, if you want to participate on certain sections of the website or in certain activities available on the website, for example join a club or group, or enter a contest, you must register to the website in order to register, you must be at least 18 years old or receive your parents and/or guardians written consent your privacy we will treat personal data provided by you to us in accordance with our privacy policy you warrant that you are entitled to provide such personal data to us
featured
bloganother year will soon be past and, like many of you, we’re looking forward to next year. we’ll be taking some time the next few weeks to be with our families, and will be back in 2022 with more blogs, podcasts, product announcements, and ways for you to succeed with galaxy store and samsung platforms. with the end-of-year holidays upon us, we’re stopping to reflect on what we did in 2021. even with covid making a disruption in everyone’s lives, we’re still here to help developers find answers and hopefully, also find success. here are some of our most memorable moments. 10. developer portal refresh brought a modern look and support for mobile we’ve been working for several years to bring samsung’s developer portal into a single web infrastructure. we moved content from multiple servers and cloud services into a cms that uses open standards and a responsive design for mobile devices. we pored through a decade of content to make sure it was still timely and accurate for your needs today. we integrated the developer forums to use the same samsung account login for both the developer portal and seller portal to give you a more seamless experience. in october of this year, we made a ux refresh to the site and the most amazing thing is how easy that process went. there were no late nights in the weeks prior to launch. we were able to test the new ux in a sandbox rigorously. then the deployment to production happened almost instantaneously. we spent less time worrying about our website and more time creating the content you need to do your work. we understand how important the samsung developer portal is to you and your work. that’s why we took the time to ensure a smooth transition as we made major infrastructure changes. 9. monthly updates keep developers up-to-date on new galaxy store features the galaxy store product management team began publishing monthly newsletters to enlighten developers of the latest features and improvements to seller portal. these updates also usually appear as blog posts in the first week or two of the month. some of the major announcements include: staged app rollouts (october) local currencies in settlement and financial reports (september) private beta testing (july) galaxy store developer api (april) look for more exciting improvements in 2022 as galaxy store continues to innovate. 8. unpacked events bring exciting new product announcements galaxy unpacked in january 2021 brought announcements of the galaxy buds pro, galaxy s21, and the new galaxy smarttag. the event highlighted samsung’s design concepts with one ui 3 and integrated experiences from partners like microsoft and google. the august galaxy unpacked event brought announcements of galaxy z fold3 and galaxy z flip3 phones. these devices have many new hardware and software features for developers to build upon. this blog post highlighted many of the ways that developers can implement features supporting flex mode and s pen remote, while ensuring that users have a seamless experience with app continuity. the most anticipated announcement of the august galaxy unpacked event was the unveiling of galaxy watch4, featuring wear os, powered by samsung. as with the tizen-powered galaxy watch devices, samsung released a new tool, galaxy watch studio converter, to help existing designers bring their watch faces to wear os. designers could also start a new watch face project from scratch with the newly-released watch face studio tool. 7. remote test lab updates allow developers to experience the latest hardware as new devices are announced, developers can use the remote test lab (rtl) to ensure that their apps work properly on the new version of one ui as well as different screen resolutions and pixel densities. in 2021, the rtl development team added support for foldables and galaxy s21 devices, allowing developers to ensure their apps work correctly before the devices are available to consumers. the rtl team also added support for android studio. in september, thousands of devices were added in data centers around the world to ensure that a compatible device is always available. as part of this release, rtl was re-engineered to work exclusively in the chrome browser, so that no external software is needed to test apps on all the latest devices. 6. samsung developer forums activity the samsung developer forums, based on the popular open-source discourse project, were introduced in january 2020, replacing an aging forum infrastructure that didn’t work well on mobile devices. by using the same samsung account authentication method as the samsung developers site, we’re able to provide a nearly-seamless experience across different hosts and platforms. since their introduction, we’ve seen large numbers of visitors stop by the forums with questions. community manager ron liechty has more than 25 years of experience in managing healthy communities—his knowledge and guidance keeps the forums a useful resource for developers. some of these visitors have become our best community members, providing valuable feedback to their peers as well as helping to moderate spam and malicious content. 5. supporting game developers in 2021 games are a noticeable part of the galaxy store experience and we work with many partners and internal teams to ensure that gamers have a great experience on galaxy devices. the galaxy gamedev team works closely with some of the top publishers and developers to improve performance of top titles on mobile. this team creates tools that provide great detail on the performance of the cpu and gpu during intense moments of gameplay. the gamedev team then documents their efforts in a series of best practices and blog posts to help developers everywhere. in addition to our internal team work, we frequently work with our partners at arm to deliver relevant content for game developers. this summer, we published and promoted a number of educational articles, webinars, and training series in cooperation with the arm developer team. best practices for mobile game developers and artists new vulkan extensions for mobile: maintenance extensions new vulkan extensions for mobile: legacy support extensions new game changing vulkan extensions for mobile: descriptor indexing new game changing vulkan extensions for mobile: buffer device address new game changing vulkan extensions for mobile: timeline semaphores mike barnes from the gamedev team, together with eric cloninger from the samsung developers team, presented at the virtual gdc2021 event in july. gdc is an important event for all of us at samsung and we hope to see you all there at the live event in march 2022. 4. new voices appeared on samsung developers podcast, season 2 shortly before the covid-19 pandemic changed our lives, tony morelan from samsung developers attended a podcasting event and came back to the office inspired to start a podcast. he lined up guests from internal teams and important partners. everyone had a great time participating and it gave us a way to continue delivering quality content to developers. as 2020 turned to 2021, we continued bringing interesting guests from across the mobile design and development ecosystem. we used the podcast to talk about the upcoming virtual samsung developer conference and chat with the people that made the event a success. here are some of the highlights from season 2 of the samsung developers podcast: drazen stojcic, urarity – watch faces, design tan nguyen, butterfly-effected gmbh – galaxy themes, marketing, licensing the samsung internet advocacy team – web standards, privacy, foldable devices we’re still hoping for a return to days where we can travel and meet in person, but until that time comes, please join us in listening to these industry veterans and top developers on the samsung developers podcast. season 3 begins in early 2022. 3. blog series instructs readers on design and successful marketing without live events the past two years, we have searched for new ways to continue delivering timely and helpful advice to mobile app designers and developers. as mentioned previously, we worked with arm this year to bring great technical content front and center. we also worked with our network of top designers, developers, and thought leaders on concepts that will help you succeed on galaxy store and in creating better experiences for your users: better for all – in this blog series, we talked with leading designers and experts to help understand the increasingly important concepts behind the diversity, equality, and inclusion movement. this series discussed aspects of language used in apps, themes, and watch designs. it also highlights important guidelines to ensure apps and web sites are accessible to users with sight, mobility, and hearing impairments. better for all: mobile accessibility better for all: inclusive policies with daniel appelquist better for all: equal accessibility better for all: bringing diversity to design with eglantina hasaj and manpreet kaur better for all: diversity in design better for all: developing and designing for diversity refresh for success – it’s not enough to simply submit a title to a digital marketplace and assume success will follow and continue without extra effort. in this series, top galaxy store designers and developers talk about how they maintain their product lines to ensure a steady flow of revenue and new customers. refresh for success: maintain quality themes design with olga gabay from zeru studio refresh for success: improve your process to keep designs fresh with tan nguyen from butterfly-effected, gmbh refresh for success: improve your process and de-clutter your galaxy store with drazen stojcic from urarity prime time design – finding success in designing new products is an intensely unique and personal process. the prime time design series includes interviews with some of the most unique people creating for galaxy store. read how these talented people inspire themselves and how they convert that inspiration into action. prime time design: unpacking the creative process with ramon campos from friss in motion prime time design: unpacking the creative process with pedro machado from health face prime time design: unpacking the creative process with john shih from x9 studio strategies for success – tony morelan was a successful watch face designer before coming to work with the samsung developers team. we’re grateful for his knowledge of design as well as how to turn designs into revenue. in this four-part series, tony points out steps to creating successful galaxy store product submissions. strategies for success: selling your apps strategies for success: understanding consumer trends strategies for success: building your fan base strategies for success: making your brand successful 2. best of galaxy store awards highlight successful developers the galaxy store app on your mobile device is more than just an app. behind the scenes, there is a team of developers, product managers, business leaders, and security experts devoted to ensuring the best possible online experience for consumers in 180 countries. because of their dedication, developers and designers have a great platform for monetizing their work. each year, the samsung developers team works with the galaxy store operations and business development teams to determine the best games, apps, and themes based on revenue, downloads, and impact to consumers. the result is the best of galaxy store awards. in 2018 and 2019, the best of galaxy store awards were presented live, on stage, at the samsung developer conference (sdc). without a live event in 2020 or 2021, the samsung developers team decided to continue the tradition of highlighting and awarding our top galaxy store products. even without an in-person event, we used a live premiere on youtube to have a single moment in time to celebrate with the winners. tony morelan emceed the event, but he had a lot of help from ron liechty, jeanne hsu, susie perez, and shelly wu. we thank them for their hard work. we hope you’ll enjoy watching! look for the “best of galaxy store” sash on apps, games, themes, and watch faces in galaxy store to know that you’re getting a truly unique experience. 1. discovering new opportunities at sdc21 each year, the samsung developer conference is the culmination of an incredible amount of planning and work by hundreds of people. even though the event was virtual in 2021, there was still a huge volume of work. instead of preparing for a live audience, our teams practiced in front of a galaxy phone on a tripod (really). instead of building booths and planning meals, we built a website and social media campaigns to reach a larger audience. eric cloninger and tony morelan kicked off the promotion for sdc21 with a podcast featuring a previous sdc speaker, chris shomo. before the conference, visitors were invited to create whimsical caricatures of themselves using the mysdcstack mini-site and submit their designs to social media. by participating in the event website, watching sessions, and trying the code labs, visitors would earn points toward a prize drawing after sdc. relive the experience of sdc21 by watching the keynote or any of the highlight sessions and technical talks by viewing this playlist wrapping up when sdc is finished, our team takes a collective deep breath, happy to be done. it is a satisfying experience to pull off a big industry event. we don’t know yet how we’ll handle live events, but we remain optimistic that some will occur. we are making plans and we hope we’ll be able to see you, somewhere, in 2022. 🤞 take care. stay warm (or cool). best wishes to you all and happy new year!
Learn Code Lab
codelabmatter build a matter iot app with smartthings home api objective learn how to create an iot app to onboard, control, remove, and share matter devices using smartthings home apis notesmartthings home apis are distributed only to authorized users if you want permission to use the apis, contact st matter@samsung com overview matter is an open-source connectivity standard for smart home and internet of things iot devices it is a secure, reliable, and seamless cross-platform protocol for connecting compatible devices and systems with one another smartthings provides the matter virtual device app and smartthings home apis to help you quickly develop matter devices and use the smartthings ecosystem without needing to build your own iot ecosystem you can use smartthings home apis to onboard, control, remove, and share all matter devices when building your application other iot ecosystems can use the matter devices onboarded on your iot app through the multi-admin function for detailed information, go to partners smartthings com/matter set up your environment you will need the following host pc running on windows 10 or higher or ubuntu 20 04 x64 android studio latest version recommended java se development kit jdk 11 or later devices connected on the same network mobile device with matter virtual device app installed mobile device with developer mode and usb debugging enabled matter-enabled smartthings station onboarded with samsung account used for smartthings app tipyou can create a virtual device as a third-party iot device sample code noteyou can request permission to access the sample project file for this code lab by sending an email to st matter@samsung com start your project after downloading the sample code containing the project files, open your android studio and click open to open an existing project locate the downloaded android project from the directory and click ok commission the device you can onboard a matter-compatible device to the iot app by calling the commissiondevice api, which can lay the groundwork to control, remove, and share the device go to app > java > com samsung android matter home sample > feature > main in the mainviewmodel kt file, call the commissiondevice api to launch the onboarding activity and join the device to the smarththings fabric // ================================================================================= // codelab // step 1 create an instance of matter commissioning client // step 2 call the commissiondevice api to launch the onboarding activity in home service // step 3 set _intentsender value from return value of commissiondevice api // todo 1 device commission and join a device to smartthings fabric // todo 1 uncomment the following code blocks // --------------------------------------------------------------------------------- //val commissioningclient = matter getcommissioningclient //val intentsender = commissioningclient commissiondevice context //_intentsender value = intentsender // ================================================================================= control the device capabilities are core to the smartthings architecture they abstract specific devices into their underlying functions, which allows the retrieval of the state of a device component or control of the device function each device has its own appropriate capabilities therefore, each device has a different control api, and the more functions it supports, the more apis it has to use in this step, select a device type that you want to onboard and control using necessary home apis the level of modification complexity is assigned per each device contact sensorlevel 1 3 mins file path app > java > com samsung android matter home sample > feature > device file name contactsensorviewmodel kt // ================================================================================= // codelab level 1 // step 1 get contactsensor capability from device instance // step 2 get stream openclose value from contactsensor capability // step 3 set _openclose value for ui updating // todo 1 uncomment the following code blocks // --------------------------------------------------------------------------------- //device readcapability contactsensor ? openclose? collect { openclose -> // _openclose value = openclose //} // ================================================================================= // ================================================================================= // codelab level 1 // step 1 get battery capability from device instance // step 2 get stream battery value from battery capability // step 3 set _batterystatus value for ui updating // todo 2 uncomment the following code blocks // --------------------------------------------------------------------------------- //device readcapability battery ? battery? collect { battery -> // _batterystatus value = battery //} // ================================================================================= motion sensorlevel 1 3 mins file path app > java > com samsung android matter home sample > feature > device file name motionsensorviewmodel kt // ================================================================================= // codelab level 1 // step 1 get motionsensor capability from device instance // step 2 get stream occupied value from motionsensor capability // step 3 set _motionoccupied value for ui updating // todo 1 uncomment the following code blocks // --------------------------------------------------------------------------------- //device readcapability motionsensor ? occupied? collect { motionoccupied -> // _motionoccupied value = motionoccupied // timber d "occupied= $motionoccupied" //} // ================================================================================= // ================================================================================= // codelab level 1 // step 1 get battery capability from device instance // step 2 get stream battery value from battery capability // step 3 set _batterystatus value for ui updating // todo 2 uncomment the following code blocks // --------------------------------------------------------------------------------- //device readcapability battery ? battery? collect { battery -> // _batterystatus value = battery // timber d "battery= $battery" //} // ================================================================================= on-off switchlevel 2 4 mins file path app > java > com samsung android matter home sample > feature > device file name switchviewmodel kt // ================================================================================= // codelab level 2 // step 1 get switch capability from device instance // step 2 get stream onoff value from switch capability // step 3 set _onoff value for ui updating // todo 1 uncomment the following code blocks // --------------------------------------------------------------------------------- //device readcapability switch ? onoff? collect { onoff -> // _onoff value = onoff //} // ================================================================================= // ================================================================================= // codelab level 2 // step 1 get switch capability from device instance // step 2 control the device using the apis that supported by switch capability // toggle switch state based on onoff value // onoff == true call switch off // onoff == false call switch on // todo 2 uncomment the following code blocks // --------------------------------------------------------------------------------- //device readcapability switch ? let { switch -> // if onoff == true { // switch off // } else { // switch on // } //} // ================================================================================= smart locklevel 3 8 mins file path app > java > com samsung android matter home sample > feature > device file name smartlockviewmodel kt // ================================================================================= // codelab level 3 // step 1 get lock capability from device instance // step 2 get stream lockunlock value from lock capability // step 3 set _lockstatus value for ui updating // --------------------------------------------------------------------------------- // todo 1 copy code below device readcapability lock ? lockunlock? collect { lockunlock -> _lockstatus value = lockunlock } // ================================================================================= // ================================================================================= // codelab level 3 // step 1 get tamperalert capability from device instance // step 2 get stream tamperalert value from tamperalert capability // step 3 set _tamperstatus value for ui updating // --------------------------------------------------------------------------------- // todo 2 copy code below device readcapability tamperalert ? tamperalert? collect { tamperalert -> _tamperstatus value = tamperalert } // ================================================================================= // ================================================================================= // codelab level 3 // step 1 get battery capability from device instance // step 2 get stream battery value from battery capability // step 3 set _batterystatus value for ui updating // --------------------------------------------------------------------------------- // todo 3 copy code below device readcapability battery ? battery? collect { battery -> _batterystatus value = battery } // ================================================================================= // ================================================================================= // codelab level 3 // step 1 get lock capability from device instance // step 2 control the device using the apis that supported by lock capability // toggle lock state based on lockunlock value // lockunlock == true call lock // lockunlock == false call unlock // --------------------------------------------------------------------------------- // todo 4 copy code below device readcapability lock ? let { lock -> if lockunlock == true { lock lock } else { lock unlock } } // ================================================================================= blindslevel 3 8 mins file path app > java > com samsung android matter home sample > feature > device file name blindviewmodel kt // ================================================================================= // codelab level 3 // step 1 get windowshade capability from device instance // step 2 get stream windowshademode value from windowshade capability // step 3 set _windowshademode value for ui updating // --------------------------------------------------------------------------------- // todo 1 copy code below device readcapability windowshade ? windowshademode? collect { windowshademode -> timber d "windowshademode $windowshademode" _windowshademode value = windowshademode } // ================================================================================= // ================================================================================= // codelab level 3 // step 1 get windowshadelevel capability from device instance // step 2 get stream shadelevel value from windowshadelevel capability // step 3 set _shadelevel value for ui updating // --------------------------------------------------------------------------------- // todo 2 copy code below device readcapability windowshadelevel ? shadelevel? collect { shadelevel -> timber d "shadelevel $shadelevel" _shadelevel value = shadelevel } // ================================================================================= // ================================================================================= // codelab level 3 // step 1 get battery capability from device instance // step 2 get stream battery value from battery capability // step 3 set _batterystatus value for ui updating // --------------------------------------------------------------------------------- // todo 3 copy code below device readcapability battery ? battery? collect { battery -> _batterystatus value = battery } // ================================================================================= // ================================================================================= // codelab level 3 // step 1 get windowshade capability from device instance // step 2 control the device using the apis that supported by windowshade capability // send windowshade open/close/pause command based on controlcommand value // "open" call windowshade open // "close" call windowshade close // "pause" call windowshade pause // --------------------------------------------------------------------------------- // todo 4 copy code below device readcapability windowshade ? let { windowshade -> when controlcommand { "open" -> windowshade open "close" -> windowshade close "pause" -> windowshade pause } } // ================================================================================= extended color lightlevel 4 10 mins file path app > java > com samsung android matter home sample > feature > device file name lightviewmodel kt // ================================================================================= // codelab level 4 // step 1 get switch capability from device instance // step 2 get stream onoff value from switch capability // step 3 set _onoff value for ui updating // --------------------------------------------------------------------------------- // todo 1 copy code below device readcapability switch ? onoff? collect { onoff -> _onoff value = onoff } // ================================================================================= // ================================================================================= // codelab level 4 // step 1 get switchlevel capability from device instance // step 2 get stream level value from switchlevel capability // step 3 set _level value for ui updating // --------------------------------------------------------------------------------- // todo 2 copy code below device readcapability switchlevel ? level? collect { level -> _level value = level } // ================================================================================= // ================================================================================= // codelab level 4 // step 1 get switch capability from device instance // step 2 control the device using the apis that supported by switch capability // toggle switch state based on onoff value // onoff == true call switch off // onoff == false call switch on // --------------------------------------------------------------------------------- // todo 3 copy code below device readcapability switch ? let { switch -> if onoff == true { switch off } else { switch on } } // ================================================================================= // ================================================================================= // codelab level 4 // step 1 get switchlevel capability from device instance // step 2 control the device using the apis that supported by switchlevel capability // call switchlevel setlevel with percentage value // --------------------------------------------------------------------------------- // todo 4 copy code below timber d "target position = $percentage" device readcapability switchlevel ? setlevel percentage // ================================================================================= // ================================================================================= // codelab level 4 // step 1 get colorcontrol capability from device instance // step 2 control the device using the apis that supported by colorcontrol capability // call colorcontrol setcolor with hue,saturation value // --------------------------------------------------------------------------------- // todo 5 copy code below timber d "hue $hue,saturation $saturation" device readcapability colorcontrol ? setcolor hue todouble , saturation todouble // ================================================================================= // ================================================================================= // codelab level 4 // step 1 get colortemperature capability from device instance // step 2 control the device using the apis that supported by colortemperature capability // call colortemperature setcolortemperature with temperature // --------------------------------------------------------------------------------- // todo 6 copy code below device readcapability colortemperature ? setcolortemperature temperature // ================================================================================= video playerlevel 4 10 mins file path app > java > com samsung android matter home sample > feature > device file name televisionviewmodel kt // ================================================================================= // codelab level 4 // step 1 get switch capability from device instance // step 2 get stream onoff value from switch capability // step 3 set _onoff value for ui updating // --------------------------------------------------------------------------------- // todo 1 copy code below device readcapability switch ? onoff? collect { onoff -> _onoff value = onoff } // ================================================================================= // ================================================================================= // codelab level 4 // step 1 get mediaplayback capability from device instance // step 2 get stream mediaplaybackstate value from mediaplayback capability // step 3 set _mediaplaybackstate value for ui updating // --------------------------------------------------------------------------------- // todo 2 copy code below device readcapability mediaplayback ? mediaplaybackstate? collect { mediaplaybackstate -> _mediaplaybackstate value = mediaplaybackstate } // ================================================================================= // ================================================================================= // codelab level 4 // step 1 get switch capability from device instance // step 2 control the device using the apis that supported by switch capability // toggle switch state based on onoff value // onoff == true call switch off // onoff == false call switch on // --------------------------------------------------------------------------------- // todo 3 copy code below device readcapability switch ? let { switch -> if onoff == true { switch off } else { switch on } } // ================================================================================= // ================================================================================= // codelab level 4 // step 1 get mediaplayback capability from device instance // step 2 control the device using the apis that supported by mediaplayback capability // send mediaplayback play/pause/stop/rewind/fastforward command based on controlcommand value // "play" call mediaplayback play and setplaybackstatus with playbackstatus playing // "pause" call mediaplayback pause and setplaybackstatus with playbackstatus paused // "stop" call mediaplayback stop and setplaybackstatus with playbackstatus stopped // "rewind" call mediaplayback rewind and setplaybackstatus with playbackstatus rewinding // "fastforward" call mediaplayback fastforward and setplaybackstatus with playbackstatus fastforwarding // --------------------------------------------------------------------------------- // todo 4 copy code below device readcapability mediaplayback ? let { mediaplayback -> when controlcommand { "play" -> { mediaplayback play mediaplayback setplaybackstatus playbackstatus playing } "pause" -> { mediaplayback pause mediaplayback setplaybackstatus playbackstatus paused } "stop" -> { mediaplayback stop mediaplayback setplaybackstatus playbackstatus stopped } "rewind" -> { mediaplayback rewind mediaplayback setplaybackstatus playbackstatus rewinding } "fastforward" -> { mediaplayback fastforward mediaplayback setplaybackstatus playbackstatus fastforwarding } } } // ================================================================================= // ================================================================================= // codelab level 4 // step 1 get mediatrackcontrol capability from device instance // step 2 control the device using the apis that supported by mediatrackcontrol capability // send mediatrack nexttrack/previoustrack command based on controlcommand value // "nexttrack" call mediatrack nexttrack // "previoustrack" call mediatrack previoustrack // --------------------------------------------------------------------------------- // todo 5 copy code below device readcapability mediatrackcontrol ? let { mediatrack -> when controlcommand { "nexttrack" -> mediatrack nexttrack "previoustrack" -> mediatrack previoustrack } } // ================================================================================= // ================================================================================= // codelab level 4 // step 1 get keypadinput capability from device instance // step 2 control the device using the apis that supported by keypadinput capability // call keypadinput sendkey with key value // --------------------------------------------------------------------------------- // todo 6 copy code below device readcapability keypadinput ? sendkey key // ================================================================================= thermostatlevel 5 13 mins file path app > java > com samsung android matter home sample > feature > device file name thermostatviewmodel kt // ================================================================================= // codelab level 5 // step 1 get thermostatmode capability from device instance // step 2 get stream thermostatmode value from thermostatmode capability // step 3 set _systemmode value for ui updating // --------------------------------------------------------------------------------- // todo 1 copy code below device readcapability thermostatmode ? thermostatmode? collect { thermostatmode -> timber d "viewmodel thermostatmode $thermostatmode" _systemmode value = thermostatmode } // ================================================================================= // ================================================================================= // codelab level 5 // step 1 get thermostatfanmode capability from device instance // step 2 get stream thermostatfanmode value from thermostatfanmode capability // step 3 set _fanmode value for ui updating // --------------------------------------------------------------------------------- // todo 2 copy code below device readcapability thermostatfanmode ? thermostatfanmode? collect { fanmode -> _fanmode value = fanmode } // ================================================================================= // ================================================================================= // codelab level 5 // step 1 get temperaturemeasurement capability from device instance // step 2 get stream temperature value from temperaturemeasurement capability // step 3 set _temperature value for ui updating // --------------------------------------------------------------------------------- // todo 3 copy code below device readcapability temperaturemeasurement ? temperature? collect { temperature -> _temperature value = temperature } // ================================================================================= // ================================================================================= // codelab level 5 // step 1 get thermostatcoolingsetpointbattery capability from device instance // step 2 get stream coolingsetpoint value from thermostatcoolingsetpoint capability // step 3 set _occupiedcoolingsetpoint value for ui updating // --------------------------------------------------------------------------------- // todo 4 copy code below device readcapability thermostatcoolingsetpoint ? coolingsetpoint? collect { coolingsetpoint -> _occupiedcoolingsetpoint value = coolingsetpoint } // ================================================================================= // ================================================================================= // codelab level 5 // step 1 get thermostatheatingsetpoint capability from device instance // step 2 get stream heatingsetpoint value from thermostatheatingsetpoint capability // step 3 set _occupiedheatingsetpoint value for ui updating // --------------------------------------------------------------------------------- // todo 5 copy code below device readcapability thermostatheatingsetpoint ? heatingsetpoint? collect { heatingsetpoint -> _occupiedheatingsetpoint value = heatingsetpoint } // ================================================================================= // ================================================================================= // codelab level 5 // step 1 get relativehumiditymeasurement capability from device instance // step 2 get stream humidity value from relativehumiditymeasurement capability // step 3 set _humidity value for ui updating // --------------------------------------------------------------------------------- // todo 6 copy code below device readcapability relativehumiditymeasurement ? humidity? collect { humidity -> _humidity value = humidity } // ================================================================================= // ================================================================================= // codelab level 5 // step 1 get battery capability from device instance // step 2 get stream battery value from battery capability // step 3 set _batterystatus value for ui updating // --------------------------------------------------------------------------------- // todo 7 copy code below device readcapability battery ? battery? collect { battery -> _batterystatus value = battery } // ================================================================================= // ================================================================================= // codelab level 5 // step 1 get thermostatmode capability from device instance // step 2 control the device using the apis that supported by thermostatmode capability // change thermostatmode state based on systemmode value // thermostatsystemmode off call thermostatmode off // thermostatsystemmode cool call thermostatmode cool // thermostatsystemmode heat call thermostatmode heat // thermostatsystemmode auto call thermostatmode auto // --------------------------------------------------------------------------------- // todo 8 copy code below device readcapability thermostatmode ? let { thermostatmode -> when systemmode { thermostatsystemmode off -> thermostatmode off thermostatsystemmode cool -> thermostatmode cool thermostatsystemmode heat -> thermostatmode heat thermostatsystemmode auto -> thermostatmode auto } } // ================================================================================= // ================================================================================= // step 1 get thermostatfanmode capability from device instance // step 2 control the device using the apis that supported by thermostatfanmode capability // change thermostatfanmode state based on fanmode value // thermostatfanmodeenum auto call thermostatfanmode fanauto // thermostatfanmodeenum circulate call thermostatfanmode fancirculate // thermostatfanmodeenum followschedule call thermostatfanmode setthermostatfanmode with followschedule // thermostatfanmodeenum on call thermostatfanmode fanon // --------------------------------------------------------------------------------- // todo 9 copy code below device readcapability thermostatfanmode ? let { thermostatfanmode -> when fanmode { thermostatfanmodeenum auto -> thermostatfanmode fanauto thermostatfanmodeenum circulate -> thermostatfanmode fancirculate thermostatfanmodeenum followschedule -> thermostatfanmode setthermostatfanmode "followschedule" thermostatfanmodeenum on -> thermostatfanmode fanon } } // ================================================================================= // ================================================================================= // codelab level 5 // step 1 get thermostatheatingsetpoint capability value from device instance // step 2 increase _occupiedheatingsetpoint value that have current heating value // step 3 if new increased value is under value_max 104 , // call setheatingsetpoint of thermostatheatingsetpoint capability with new increased value // --------------------------------------------------------------------------------- // todo 10 copy code below device readcapability thermostatheatingsetpoint ? let { heatingsetpoint -> val nextvalue = _occupiedheatingsetpoint value!! + 1 if nextvalue < value_max { heatingsetpoint setheatingsetpoint nextvalue } } // ================================================================================= // ================================================================================= // codelab level 5 // step 1 get thermostatheatingsetpoint capability value from device instance // step 2 decrease _occupiedheatingsetpoint value that have current heating value // step 3 if new decreased value is over value_min 32 , // call setheatingsetpoint of thermostatheatingsetpoint capability with new decreased value // --------------------------------------------------------------------------------- // todo 11 copy code below device readcapability thermostatheatingsetpoint ? let { heatingsetpoint -> val nextvalue = _occupiedheatingsetpoint value!! - 1 if nextvalue > value_min { heatingsetpoint setheatingsetpoint nextvalue } } // ================================================================================= // ================================================================================= // codelab level 5 // step 1 get thermostatcoolingsetpoint capability value from device instance // step 2 increase _occupiedcoolingsetpoint value that have current cooling value // step 3 if new increased value is under value_max 104 , // call setcoolingsetpoint of thermostatcoolingsetpoint capability with new increased value // --------------------------------------------------------------------------------- // todo 12 copy code below device readcapability thermostatcoolingsetpoint ? let { coolingsetpoint -> val nextvalue = _occupiedcoolingsetpoint value!! + 1 if nextvalue < value_max { coolingsetpoint setcoolingsetpoint nextvalue } } // ================================================================================= // ================================================================================= // codelab level 5 // step 1 get thermostatcoolingsetpoint capability value from device instance // step 2 decrease _occupiedcoolingsetpoint value that have current cooling value // step 3 if new decreased value is over value_min 32 , // call setcoolingsetpoint of thermostatcoolingsetpoint capability with new decreased value // --------------------------------------------------------------------------------- // todo 13 copy code below device readcapability thermostatcoolingsetpoint ? let { coolingsetpoint -> val nextvalue = _occupiedcoolingsetpoint value!! - 1 if nextvalue > value_min { coolingsetpoint setcoolingsetpoint nextvalue } } // ================================================================================= noteyou can find related files in android studio by going to edit menu> find > find in files and entering the keyword "codelab" remove the device using removedevice api, you can remove the device from your iot app and the smartthings fabric go to app > java > com samsung android matter home sample > feature > device > base in the baseviewmodel kt file, call the removedevice api to launch the removedevice activity // ================================================================================= // [codelab] device remove from smartthings fabric // step 1 create an instance of matter commissioning client // step 2 call the removedevice api to launch the removedevice activity in home service // step 3 set _intentsender value from return value of removedevice api // todo 1 uncomment the following code blocks // --------------------------------------------------------------------------------- //val commissioningclient = matter getcommissioningclient //val intentsender = commissioningclient removedevice // context, // commissioningclient removedevicerequest deviceid // //_intentsenderforremovedevice value = intentsender // ================================================================================= share the device matter devices can be shared with other matter-compatible iot platforms, such as google home, using home apis without resetting the device while connected to smartthings to perform this operation, it is necessary to enter the commissioning mode without resetting the device in the baseviewmodel kt file, call the sharedevice api to launch the sharedevice activity // ================================================================================= // [codelab] device share to other platforms // step 1 create an instance of matter commissioning client // step 2 call the sharedevice api to launch the sharedevice activity in home service // step 3 set _intentsender value from return value of sharedevice api // todo 1 uncomment the following code blocks // --------------------------------------------------------------------------------- //val commissioningclient = matter getcommissioningclient //val intentsender = commissioningclient sharedevice // context, // commissioningclient sharedevicerequest deviceid // //_intentsenderforsharedevice value = intentsender // ================================================================================= build and run the iot app run the sample app to build and run your iot app, follow these steps using a usb cable, connect your mobile device select the sample iot app from the run configurations menu in the android studio then, select the connected device in the target device menu click run onboard to onboard the virtual device go to the matter virtual device app then, select and set up the virtual device type you want to control click save click start to show the qr code for onboarding go to the sample iot app and click the + button then, onboard the virtual device by scanning its qr code control by sample iot app in the sample iot app, control the virtual device by using its various functions such as on and off for switch you're done! congratulations! you have successfully achieved the goal of this code lab topic now, you can create a matter-compatible iot application with smartthings home apis by yourself! learn more by going to smartthings matter libraries
SDP DevOps
docsamsung developer portal terms of use samsung electronics “samsung”, “we”, or “us” offers you the developer website, developer samsung com and subdomains, along with all of the features and functions therein collectively the “site” for your use only as specified in these terms of use “terms” these terms apply to your use of the site as well as any other sites from which you may be directed or linked to these terms these terms constitute a legally binding agreement between you and us you must be 18 years old or the age of majority in your jurisdiction in order to use our site if you are under 18 years old or the age of majority in your jurisdiction, then you may only use the site with your parent or legal guardian’s permission by accessing or using our site, you agree that you have read, understand, and are bound by the terms and conditions set forth herein if you do not agree to these terms, you may not use or access the site download account creation you may view some parts of the site without creating an account, but in order to fully access our software development kits “sdks” , application programming interfaces “apis” , technical resources, and some features such as tech support, dashboard and so on, you will be required to create a samsung account you are solely responsible for any activity that occurs on your account and for maintaining the confidentiality of your password you agree that you will provide and maintain accurate registration information and that it is your sole responsibility to do so if there has been an unauthorized use of your password or account, please notify us immediately when you register an account with us, you may be required to provide some of your personal information by registering and providing us with your personal information, you also accept our privacy policy, which is incorporated into these terms ownership unless otherwise stated herein, we and/or our licensors are the sole owners of the site and all of its content, including without limitation, all information, services, features, functions, copyrights, trademarks, service marks, and other intellectual property rights contained within the site you agree that all right, title, and interest in the site will remain ours or our licensors’ exclusive property nothing in these terms gives you a right to reproduce, copy, distribute, sell, broadcast, license, or otherwise use the samsung name or any of our trademarks, logos, domain names, and other distinctive brand features you may not modify, rent, lease, sell, distribute, or create derivative works based on the site unless we have given you prior written consent to do so – excluding source code examples or project examples you agree that you will only use the site for personal, non-commercial purposes notwithstanding the foregoing, we do not claim ownership of any content that you submit to us via site you represent and warrant that you have secured and are able to produce proof in writing of any and all rights necessary and appropriate to submit the content to us via the site, including all necessary releases, and that such content is not confidential, as it will be not be treated as such you do, however, grant us a perpetual, worldwide, unrestricted, non-exclusive, royalty-free, transferable license to use license, reproduce, modify, adapt, publish, translate, create derivate works from, distribute, publically perform and display the content that you post or submit to us via the site samsung goods and services samsung may display the availability of some goods and/or services on this website some of these goods and/or services may only be available in certain jurisdictions and samsung therefore reserves the right to choose where such goods and/or services are supplied by informing the availability of any goods and/or services, samsung does not warrant that such goods and/or services will be available in your jurisdiction and you should check with your local samsung contact for further information where samsung does supply goods and/or services, whether through this website or other means, additional terms and conditions may apply samsung developer business account a samsung developer business account "business account" is a single integrated account for specific members to share samsung services among themselves it contains business profile information and details of individual members the purpose of introducing the business account are to manage partners at a group level instead of individual level, provide the same services to all members associated with a single business account; and ensure or manage the service continuity for partners please note that the business account managers have discretionary authority to add, modify, and remove any members a business account can be established without verifying any registered information information validation occurs when the business account is linked to a service, not upon initial account registration any type of company or organization can establish a business account when creating a business account, please note that the user who creates the business account will automatically assume the role of business account manager and a user already associated with a business account cannot create another business account you can add members to your business account through inviting a user to join your business account through the samsung developer portal the invited user becomes a member once they successfully complete the registration process remote test lab remote test lab is service where a qualifying user can conduct testing of software applications suitability or compatibility for certain samsung devices through the website the availability and nature of the devices that samsung makes available in connection with the remote test lab service shall be posted on the website and updated from time to time however, samsung does not guarantee that any specific device will be available at any particular time and users should check the website from time to time to see what devices are in fact available remote test lab uses actual devices, but may not replicate exact operation conditions production models may vary from devices made available through the remote test lab service and therefore users are advised to test applications on production models as well as through remote test lab remote test lab service is only available to you if you are a qualified, registered user of developer samsung com, but you may be restricted from using service without notice when trying prohibited behaviors such as, without limitation, locking device with pin number or pattern or using the remote test lab service to gain an unfair winning advantage over other participants in any events for samsung devices you will only have access to the service for a specific defined period of time which varies depending on the test device once the defined period of time has elapsed, access to remote test lab will cease and you should make sure that all your test or other data in connection with remote test lab is properly saved by using remote test lab, you agree and acknowledge that samsung is not liable for any loss of data or software in connection with your access to the service, and that, prior to the release of any application or device into manufacture, further tests will need to be conducted in recognition of the fact that remote test lab is not a substitute for any such required tests by using remote test lab, you warrant that you agree and acknowledge that the service is designed for testing applications on samsung devices and the test results do not guarantee the use of applications on other devices you will only use the service for testing of applications which are designed solely for use on samsung devices you will uninstall any and all software or other content which has been used in connection with the service once you have completed your session you shall not attempt to copy, reverse engineer or decompile the remote test lab device or any technology connected with it software downloads when we make software available for users to download through developer samsung com, any such download is subject to the terms of our end user license agreement, in addition to these terms we may also wish to specify certain additional licensing terms in connection with specific software and, if any such additional software licensing terms apply, these will be notified to you at the time you agree to license the software sample code samsung may publish on the website what samsung terms "sample code", which is software developed by samsung and which samsung makes freely available for developers to use under the terms of the sample code license the terms of the sample code license will be notified to you at the time you agree to license any sample code from samsung uploading material to the forum website any material you upload to developer samsung com will be considered non-confidential and non-proprietary, and we have the right at no charge to use, copy, distribute, sub-license and disclose to third parties any such material for any purpose we also have the right to disclose your identity to any third party who makes reasonable claims that any material posted or uploaded by you to the website constitutes a violation of their intellectual property rights, or of their right to privacy samsung reserves the right to remove any material or posting you make on the website if, in its opinion, such material does not comply with samsung's content standards you warrant that any material you upload does not, and will not, infringe any third party intellectual property rights forum the members of developer samsung com are entitled to participate in the forum and blogs that are in operation on the website the rules laid out below apply to anyone participating in the forum, blogging or other interaction with the website forum rules any submission of material by you to the forum means that you accept, and agree to abide by, all the terms and conditions of below forum rules, which supplement the general website terms of use and privacy policy moderation the company is under no obligation to you or any other person to oversee, monitor or moderate the forum or any other services samsung provides on the website and samsung may therefore stop moderating the forum at any time samsung reserves the right to remove, or to disable access to, any posted contribution which samsung deems to be potentially defamatory of any person, or otherwise inappropriate, or which samsung deems unlawful or in violation of any third party rights samsung expressly excludes liability for any loss or damage arising from the use of developer samsung com by any person in contravention of these rules submission of contributions there is no limit to the length of a contribution please note that your contribution will not be anonymous before making a contribution, you must register with samsung developers your id, name, profile image and your activity history such as the number of posts, joining date, badges you earned and so on, will appear as part of your published contribution content standards the content standards below must be complied with in spirit as well as to the letter we will determine, at our discretion, whether a contribution breaches the content standards a contribution must be accurate where it states facts , be genuinely held where it states opinions , comply with all -the applicable laws applicable in the country from which it is posted, and be relevant a contribution must not be defamatory of any person be obscene, offensive, hateful or inflammatory promote discrimination based on race, sex, religion, nationality, disability, sexual orientation or age disclose the name, address, telephone, mobile or fax number, e-mail address or any other personal data in respect of any individual infringe any copyright, database right or trademark of any other person breach any legal duty owed to a third party, such as a contractual duty or a duty of confidence be in contempt of court be likely to harass, upset, embarrass, alarm or annoy any other person impersonate any person, or misrepresent your identity or affiliation with any person give the impression that the contribution emanates from samsung if this is not the case advocate, promote, or incite any third party to commit, or assist, any unlawful or criminal act contain a statement which you know or believe, or have reasonable grounds for believing, that members of the public for whom the statement is intended are likely to understand as a direct or indirect encouragement or other inducement to the commission, preparation or instigation of acts of terrorism contain any advertising or promote any services or web links to other sites license by submitting a contribution to developer samsung com, you agree to grant samsung, and any other company or corporation within the samsung group, a non-exclusive license to use that contribution although you will still own the copyright to your contribution, we will have the right to freely use, edit, alter, reproduce, publish and/or distribute the material contained in your contribution this license will be free of charge, perpetual and capable of sub-license we may exercise all copyright and publicity rights in the material contained in your contribution, in all jurisdictions, to their full extent, and for the full period for which any such rights exist in that material by submitting your contribution to dveloper samsung com, you are warranting that you have the right to grant samsung the non-exclusive license described above and that it does not infringe any third party rights including third party intellectual property rights if you are not in a position to developer samsung com, please do not submit the contribution to developer samsung com breach of these rules when we determine that a breach of the content standards has occurred or you have otherwise breached these forum rules, we may at our discretion take such action as we deem appropriate, including, without limitation, withdrawal of your right to use this website, removal of any contributions already posted on the website, and/or other legal action we exclude our liability for all action we may take in response to breaches of these forum rules complaints if you wish to complain about any contribution posted on any category in the forum, please contact us at here we will then review the contribution and decide whether it complies with our content standards we will deal with any contribution which, in our opinion, breaches the standards see above we will inform you of the outcome of our review within a reasonable time of receiving your complaint changes to forum rules samsung may revise the forum rules at any time please therefore check this page from time to time to make note of any changes samsung assumes no liability or responsibility for notifying changes of the forum rules samsung developer portal terms of use will apply in addition to these specific forum rules use restrictions while using the site you agree to comply with all applicable laws, rules and regulations you further agree that when using the site you will not transmit by any means any software, virus, malware, program, code, file, or other material intended to interrupt, disrupt, alter, destroy, or limit any part of the site; use any robot, spider, script, or any manual or automated application or means to extract, download, retrieve, index, mine, scrape, reproduce, or circumvent the presentation, operation, or intended use of any feature, function, or part of the site; frame or mirror any part of the site without samsung’ express prior written consent; modify, adapt, translate, reverse engineer, decompile or disassemble any portion of the site; copy, download, distribute, transmit, upload, or transfer content from the site or the personal information of others without our prior written permission or authorization; resell, sub-license, or lease any of the content on the site; impersonate or pretend to be anyone else but you; falsely state or otherwise misrepresent your affiliation with any person or entity in connection with the site; or express or imply that we endorse any statement you make; violate or infringe upon the privacy, publicity, intellectual property, or other proprietary rights of third parties; engage in any activity that is criminal or tortious in nature, or otherwise violates the law or rights of another including, without limitation, hacking, phishing, fraud, stalking, defaming, abusing, harassing, or threatening your failure to comply with these restrictions or any part of these terms may result in termination of your access to the site, as well as cancellation of your account and/or registration disclaimer or warranties the site and all content, services and features available through the site, are intended for informational purposes only the site is provided to you “as is” and “as available” without any warranties of any kind, whether express, implied or statutory you agree that you must evaluate, and that you bear all risks associated with, the use of the site, including, without limitation, any reliance on the accuracy, completeness or usefulness of any materials available through the site samsung disclaims all warranties with respect to the site including, but not limited to, the warranties of non-infringement, and title samsung makes no warranty that the site will be error free or uninterrupted, that the information obtained from the site will be accurate, complete, current, or reliable, that the quality of the site will be satisfactory to you, or that errors or defects will be corrected samsung makes no guarantee regarding the reliability, accuracy, or quality of any communication that is posted on the site limitation of liability to the fullest extent permitted by law, we shall not be liable to you or any other party for any claim, loss or damage, direct or indirect, including, without limitation, compensatory, consequential, incidental, indirect, special, exemplary, or punitive damages, regardless of the form of action or basis of any claim you specifically acknowledge that we shall not be liable to you for any interaction with and any third parties appearing on the site or other third parties we shall not be liable for any loss of data, breach of security associated with your account registration, regardless of the form of action or basis of any claim some jurisdictions do not allow certain exclusions of warranties or limitations on damages, so some of these exclusions and limitations may not apply to you if you are dissatisfied or have a dispute about the site, termination of your use of the site is your sole remedy we have no other obligation, liability, or responsibility to you indemnity you agree to defend, indemnify and hold harmless samsung, and its respective employees, officers, directors, agents, representatives, licensors, suppliers, agencies, and service providers from and against all claims, losses, costs and expenses including attorney’s fees arising out of a your use of, or activities in connection with the site; or b any violation of these terms by you we reserve the right to assume all or any part of the defense of any such claims and negotiations for settlement and you agree to fully cooperate with us in doing so third party sites the site contains links to third party websites, such as social networking websites samsung does not have control over such websites and is not responsible for the availability of such external websites samsung does not endorse and is not responsible or liable for the content, advertising, products, services or other materials on or available from such third party websites linked from the site your use of third party websites is at your own risk and subject to the terms and conditions and policies of such websites dispute resolution these terms will be construed and enforced under the laws of the state of new york you and we agree that any dispute between you and us arising under or related to these terms and this site can only be brought in binding individual non-class arbitration to be administered by the american arbitration association “aaa” if, for any reason, aaa is not available, you or we may file our case with any national u s arbitration company you agree that you will not file a class action, or participate in a class action against us local laws if you use this site from outside the united states of america, you are entirely responsible for compliance with applicable local laws, including but not limited to the export and import laws of other countries in relation to the materials and third-party content website content the information, documents, software and other materials "content" contained within developer samsung com are provided "as is" and are given for general information and interest purposes only samsung tries to ensure that the content contained on the website is accurate and up to date, but samsung cannot be held responsible for any errors, faults or inaccuracies you should not therefore rely on the content, and samsung recommends that you take further advice or seek further guidance before taking any action based on it you expressly agree and acknowledge that you use the content at your sole risk and samsung assumes no liability or responsibility for any user content or information provided by other users of the website in particular, samsung may make available software and technology which is "beta" meaning that it has not been fully tested or tested at all and you should make sure you use such technology at your sole risk and in a test environment taking into account the risk that it may cause damage to your software, hardware and other property you use to the fullest extent permitted by law, we expressly exclude all representations, conditions, warranties or other terms which apply to such content/information, including any implied warranties of satisfactory quality, merchantability, fitness for a particular or any purpose, and non-infringement which might otherwise apply but for this clause if, in a relevant jurisdiction, these limitations and exclusions are not permitted, then our liability shall be limited and excluded to the fullest extent permitted by law linking samsung may link to other websites which are not within its control when samsung does this, samsung will try and make it as clear as possible that you are leaving developer samsung com samsung is not responsible for these other sites in any way, and do not endorse them it is your responsibility to check the terms and conditions and privacy policy on any other site which you visit you may not link to developer samsung com from another site without our consent in writing any consent would be subject to complying with the following guidelines links must be to the home page https //developer samsung com/ you may not create a frame or any other border around developer samsung com the site from which you wish to link must comply with all relevant laws and regulations and must not contain content which may be considered to be distasteful or offensive and you must not imply that samsung endorses, or is associated with, any other site, product or service fees the use of the samsung developers services is free of charge samsung reserves the right to charge for samsung developers services and to change its fees, at its discretion samsung may from time to time launch other services which may be subject to a separate charge and terms contracting online nothing on developer samsung com is intended to be, nor should be construed as, an offer to enter into a contractual relationship with you or anyone else, except for these terms, which govern the relationship between us in relation to your use of developer samsung com and the services made available through it plus any additional terms we impose in relation to specific products and/or services on the website if you make a contract with a third party who is named or referred to on developer samsung com, it is your responsibility to ensure that you are comfortable with the terms of that contract, and to take legal advice if necessary age limit everyone is welcome to visit https //developer samsung com however, if you want to participate on certain sections of the website or in certain activities available on the website, for example join a club or group, or enter a contest, you must register to the website in order to register, you must be at least 18 years old or receive your parents and/or guardians written consent termination we may immediately suspend or terminate your use of and access to the site at our sole discretion and without prior notice, for any reason, with or without cause severability if the application of any provision of these terms to any particular facts or circumstances shall for any reason be held to be invalid, illegal or unenforceable by a court, arbitrator or other tribunal of competent jurisdiction, then a the validity, legality and enforceability of such provision as applied to any other particular facts or circumstances, and the other provisions of this terms, shall not in any way be affected or impaired thereby and b such provision shall be enforced to the maximum extent possible so as to effect the intent of the parties waiver any delay in enforcing or any failure to enforce any provision of these terms will not be deemed a waiver of any other or subsequent breach of these terms changes we reserve the right to change any part of the site, including these terms, at any time if we change these terms, we will update the effective date listed above your continued use of the site means that you agree with our updated terms if you do not agree with our updated terms, you may not use our site your privacy we will treat personal data provided by you to us in accordance with our privacy policy you warrant that you are entitled to provide such personal data to us questions or comments if you have any questions or comments about these terms or the site, please contact us at here
success story marketplace, design, galaxy watch
blogwe continue to celebrate the top performing apps in creativity, quality, design, and innovation, as we interview winners of our best of galaxy store awards. next in our blog series, we feature matteo dini. matteo dini, founder and ceo of "matteo dini md", shares with us how he manages to maintain a high level of quality and craftsmanship with his watch face designs, many of which boast five star ratings, the importance of developing a recognizable brand, and how the galaxy store badge has played an integral role in his marketing strategy how did you first get into designing watch faces? at the end of 2016, i bought a samsung gear s3 watch, and that’s when i started designing watch faces. at first, it was just for fun, something i did to explore the easily approachable software “galaxy watch designer” (now “galaxy watch studio"). in the spring of 2017, i started publishing some of my watch faces on the galaxy store, and i realized that people were really interested in them, therefore i decided to continue publishing my designs. as one of our more seasoned and successful designers, can you share some key features of a good watch face design? in my opinion, a good watch face design has to be easily readable. it should also feature well thought out colors and shades that match together, and the layouts shouldn’t be too complex. this is the key to attracting a wider range of customers. with your broad experience as a watch face designer, do you still experience technical or design hurdles when designing a watch face? there really is no limit to improvement when it comes to graphic design. the real obstacle to overcome is the lack of new ideas. there should always be new inspirations about how to improve the design aspect of the watch faces. there have been, and still are moments, when i find myself stuck, even for several whole days, before getting to a final result. after creating several watch faces and crossing paths with so many great creations from other designers, pushing the creative limit further can be really hard, especially on a 360x360 screen. however, when i finally find the right path that can lead me to a new good project, i feel so enthusiastic and passionate about my job that it is definitely worth it. where the technical side is concerned, hopefully i’ll be able to add some new features that leverage samsung’s hardware-and-software evolutions. your brand “matteo dini md” is well known in the watch face community. how important is creating your own brand? having a well-recognizable brand is the key to being well known. your brand identifies your work, that is undeniable. finding the perfect name for my brand was not the easiest choice to make. when i started publishing my work on the galaxy store i was really indecisive about leaving my real name-surname. i even thought of inventing a new name from scratch, but then i decided to go for matteo dini, since it gave me the impression of a more personal brand, and i think it worked, or at least i hope so. my brand “matteo dini md” is a legally registered brand in the us and in europe. how do you come up with new designs to support the continued growth and evolution of your brand? ideas can come from seasons, from highly- or poorly-inspired periods, and obviously from market research. “there are no rules” is the only rule. sometimes a design can sprout from a tiny detail that we come to notice in a random object, not necessarily a watch. in a certain way it’s kind of a meditation process - it’s mind work. at the moment, there are two of us designing watch faces for “matteo dini md”, my brother-in-law luca canaletti and i. together we try to imagine how the product could potentially look, and we then sketch some drafts on paper or directly on the software. your designs are highly rated on the galaxy store which speaks to the quality and craftsmanship of your work. how do you achieve such great quality with your designs? to be honest, when it comes to my work i’m a very strict critic. i always detect some enormous flaws, and i hardly find myself truly and completely satisfied with my work. apart from that, the thing luca and i focus on is quality. to achieve that, we try to include as many details as possible and to test our watch faces for several days, in different light and weather conditions, in order to get a good result. but, as i was saying before, there is no limit to improvement, and we learn something new every day. it’s evident that you understand the market and what users want. how much does user feedback factor into the designs you create? are there other factors? i pay so much attention to user feedback. i obviously cannot design something that works for each of them, however i tend to use their suggestions to improve my watch faces and to meet their needs and tastes. being on the galaxy store has provided me with knowledge about people’s taste, and i’m constantly trying to keep several watch faces on the store that can satisfy a wide range of consumers, both young people and adults. i also keep an eye on market trends and all the cutting-edge news that comes out. you employ various marketing strategies, including third-party watch face reviews from jibberjab, social media promotion, free trials, contests, and giveaways. how important is marketing your designs to becoming a successful seller? what tips can you share? the galaxy store is introducing more and more new content every day, so it is really fundamental to promote one’s projects on other marketing channels as well. this is why i employ all those things you mentioned, in order to drive awareness and visibility of my brand on the galaxy store. the paramount thing to do is to create a well-recognizable brand identity, in order to be easily found on the store. i created my brand’s accounts on all the most important social media platforms in order to gain followers and to have a community to directly communicate with. this is fundamental, it’s the starting point for any marketing strategy. how does the galaxy store badge support your marketing strategy? galaxy store badge is, without a doubt, an excellent tool. it generates customized short urls, it can monitor all the clicks you get (which is important for statistics and promotions), and it also gives you the opportunity to use an official samsung official logo, which can be really helpful when it comes to marketing strategies. how has the samsung developer program supported your journey and growth as a watch face designer? the sdp team has always been very helpful and professional, promptly answering my request for technical assistance and solving my problems. they always keep us up-to-date about samsung news and share detailed studies about technical topics. they really support our work. it is also important to follow the dedicated forum. the forum allows us to ask questions and get answers from samsung and the developer community, i was very pleased to meet the team in person, twice actually, at the 2018 and 2019 editions of the samsung developer conference. thank you for the question; since you mentioned it, i really want to publicly thank the sdp team for their amazing work. as the winner of samsung best of galaxy store awards 2019 for “best watch designer (big brand)”, what advice do you have for new designers looking to create a successful watch face business? besides being a watch face designer, i’m a technology enthusiast and my first step was studying the product (samsung gear watch / galaxy watch / galaxy watch active), wearing it 24/7 for several months. i got the full user experience, before becoming a designer. passion and patience are fundamental, new designers shouldn’t get discouraged if the big results don’t come right away. they should keep focusing on finding their style and on trying to improve it day after day. the results will come eventually. what is next for matteo dini md watch faces? at the moment we are focusing on watch face development and we are trying to improve ourselves in order to be ready when samsung shares its plans on any new products or product updates. we want to thank matteo for sharing compelling insights on watch face design and tips on becoming a successful designer with a recognizable brand. be sure to check out matteo dini md’s watch face portfolio, and download your favorite in the galaxy store. follow us on twitter at @samsung_dev for more developer interviews as well as tips for building games, apps, and more for the galaxy store. find out more about our best of galaxy store awards. designing a watch face for galaxy watch running wear os powered by samsung? check out this code lab about creating a watch face using tag expressions in watch face studio.
Learn Developers Podcast
docseason 3, episode 7 previous episode | episode index | next episode this is a transcript of one episode of the samsung developers podcast, hosted by and produced by tony morelan a listing of all podcast transcripts can be found here host tony morelan senior developer evangelist, samsung developers instagram - twitter - linkedin guests guy merin, senior director of engineering, surface duo developer experience, microsoft ade oshineye, senior staff developer advocate, google søren lambæk, developer relations engineer, samsung foldables, games not only do we chat about the emerging trends in the foldable industry but how companies are working together to help developers create for this new and innovative technology listen download to this episode topics covered foldable industry trends growth of foldables target audience making foldables mainstream benefits of the foldable form factor extending a traditional app to a foldable device process for supporting foldables foldable device example apps consumer adoption challenges developer opportunities resources for developers companies working together on foldables helpful links large screen/foldable guidance large screen app quality jetpack windowmanager jetpack slidingpanelayout jetpack windowmanager foldable/dual-screens surface duo layout libraries surface duo android emulator figma - surface duo design kit surface duo blog surface duo twitch surface duo twitter adopting native language discover quality apps on large screens foldables design/development perspectives learn about foldables case studies 5 steps to large screen designing understanding layout code lab testing window size classes jetnews different screen sizes migrate to responsive layouts compose/activity embedding unfolding gaming potential samsung remote test lab samsung developer program website samsung developer program newsletter samsung developer program blog samsung developer program news samsung developer program facebook samsung developer program instagram samsung developer program twitter samsung developer program youtube samsung developer program linkedin tony morelan linkedin guy merin, microsoft, linkedin ade oshineye, google, linkedin søren lambæk, samsung, linkedin transcript note transcripts are provided by an automated service and reviewed by the samsung developers web team inaccuracies from the transcription process do occur, so please refer to the audio if you are in doubt about the transcript tony morelan 00 01 hey, i'm tony morelan and this is the samsung developers podcast, where we chat with innovators using samsung technologies, award winning app developers and designers, as well as insiders working on the latest samsung tools welcome to season three, episode seven recently i hosted a roundtable discussion on developing for foldable devices not only do we chat about the emerging trends in the foldable industry, but how companies are working together to help developers create for this new and innovative technology enjoy today's show, we're doing something pretty special i've got three guests on the podcast all from leading companies in the foldable space i've got guy merin, senior director of engineering on the surface duo developer experience team at microsoft guy merin 00 53 hi tony, good morning great to be here tony morelan 00 55 excellent i've also got ade oshineye, senior staff developer advocate at google ade oshineye 01 00 hi nice to be here tony morelan 01 03 and i've also got søren lambæk, developer relations engineer at samsung søren lambæk 01 09 hello good to be here tony morelan 01 11 this is amazing i've got all of you on the podcast at the same time we actually haven't tried this format before so let's take him for a ride and see how much fun we can have let me start with guy over at microsoft tell me who is guy merin? guy merin 01 25 hey, yeah, hey, folks so i'm guy the journey in microsoft a few years back started that windows went through the windows mobile, because mobile gadgets and devices are really my passion and then the last five or so years, i've been working full time on android, building a couple of software products, and recently the surface duo so this mobile and android is really my passion and i'm really at my dream job now working with developers, you know, reaching out really great on the personal level, i got recently into mountain climbing so just last weekend, we had a big expedition to summit, one of the washington mountains i live in seattle in washington, okay and that was a very, very fun experience that i found a lot of similarities to, you know, projects we have at work, climbing a mountain and summit thing is really a project on its own with preparation and planning and found a lot of interesting similarities tony morelan 02 29 it gives you a lot of time to think also, i'm sure that when you're climbing so are you like with ropes and rappelling or yeah, rope really guy merin 02 38 is, is more snow so it's ropes and ice axes and stuff but oh, gosh tony morelan 02 45 that is great how many feet would you say? was the summit? guy merin 02 50 close to 11,000 tony morelan 02 52 wow, that is absolutely impressive what was your journey to get to the state of washington? were you born there? or is this? the accent i'm picking up? i'm not quite sure is from the northwest? guy merin 03 07 no, no so no, i was born and raised in israel okay and i moved over to washington eight years ago, i've been working at microsoft in israel, actually doing some fun stuff with windows phone in israel and then pretty much my wife wanted to move over to seattle and that that made us take the trip and we love it here tony morelan 03 32 so now let's move over to google tell me who is ade oshineye? ade oshineye 03 38 so i work in android developer relations i've worked all over the different aspects of google over the last 15 years before that was in consultancy, when i'm not at a desk in front of cameras and things i'm out with a camera, taking photos in zurich, where we have really nice mountains that i like to climb them by sitting in a train that just gently takes you to the top and then i also play badminton and play go so between that i'm pretty busy i tony morelan 04 05 wonder if i understand you actually were born and raised in england is that correct? yes ade oshineye 04 09 so i'm an east londoner but now i live in switzerland, which is strange and very different to east london but i also live in the middle of a whole collection of british shops, so that i can get british food very easily really? okay yes tony morelan 04 27 tell me how did you get involved with foldables at google? ade oshineye 04 30 well, let's see well, me specifically, i mean, i started out with the samsung flip and then we've got this planet of surface duo for us as a company, it's more around the whole beat together not the same idea that the point of the entity ecosystem is that all of these oem can try different things users can try different kinds of experiences developer can try to serve all of them and we power all of that with the platform tony morelan 04 57 and from samsung tell me who is søren lambæk? søren lambæk 05 02 hello, i work at samsung as a developer relations engineer and basically, i building relationships between the games industry and samsung there are so many mobile games out there so we were reaching out to them at a technical level and try to help their games to run smooth on certain devices on a more personal level, i am one of those artists that just got obsessed with programming sure so my background is actually a lot of with art, drawing and music and that kind of thing but i just could see, the programming hat was so powerful so i just, i got this obsession is programming tony morelan 05 48 excellent and i know that you guys can't see on the podcast but soren has some beautiful guitars behind him and before we hit the record button, we were all having a nice conversation about music now, i understand you were born in chile, but raised in england that correct søren lambæk 06 04 and so i was born i was born in chile that's correct and i was raised up in denmark, hence my name and my name is danish and okay because then i guess such a small country and at the time, i wanted to do get a career we didn't have any games industry in denmark so i decided i wanted to go to england and when university studying games design, because there was art, but then i realized programming that's where the future is, for me and then so i was one of the only students that went from art to programming is usually the other way around yeah, tony morelan 06 47 so yeah, i would definitely think so so let's talk foldables back in 2019, samsung released the galaxy fold, which was the first foldable device to really hit the mainstream market since then, other companies like microsoft, motorola, huawei, have released foldable devices and in such a short amount of time, we've seen some really great improvements with this technology guy, you've been from microsoft, what are some of the trends that you've noticed in the foldable industry? guy merin 07 17 some of the trends one we're seeing, as you said, more, more oems picking those up? are you seeing more and more companies bringing for the world? and it's really starting to become a commodity but the cool thing about it that each one has their own different angle to it so you know, for the microsoft one, it's, you know, mainly around productivity and two screens, for others is mainly around more real estate or something that is a small form that can then go to, to a bigger form and it's all really about the form factors and the posters that you can really do with it so how does the phone react when it's folded when it's open when it's tilted 90 degrees? and i think we'll see more of those in the future tony morelan 08 07 are they are you seeing different trends for the way developers are designing and building apps? ade oshineye 08 12 so i think we're seeing three main trends one is the oems exploring the space of possible designs, does the device folding fold out full vertically filled horizontally full three times, there's so many different things oems are doing second stylus is becoming more and more mainstream, that's changing the set of available postures and then the final thing is the way keyboards and trackpads are blurring the distinctions between phones, phablets tablets so the whole notion of what is an android app is becoming this flexible, multi-dimensional space and there's always people exploring that space and trying new things yeah, tony morelan 08 55 yeah soren, what about the growth in this industry? is this been something that you think, you know, over the past several years, it's really been, you know, going much higher? søren lambæk 09 04 yeah so last year, we had 150% growth, and we are expecting that in the future, more and more people seem to get foldable phones and when it comes to games, it does have like quite a lot of benefits because you can use the second screen if you're put it in like a folder but sure you can you can change this from full screen to a two completely different mode where the bottom screen, you can use it for items or mini map and that kind of thing tony morelan 09 35 yeah, yeah you know, this technology is so new that it's at this time, i think we're still trying to figure out what is this this target audience a day? what are your thoughts on who is the target audience for foldables? ade oshineye 09 49 well, i think a good way of thinking about it would be to look at the flips and the surface drill as capturing the two sets of ordinances we see there are very often younger people woohoo, looking for cool new experiences, i tend to see a lot of those people walking around with a samsung flip but then you also see a set of people at the high end with a lot more money tend to be more business people, they tend to have the larger the fold or a duel or something like that, that has a stylus that runs multiple apps at the same time, that sort of almost a replacement laptop and those are the two sets of people i tend to see using foldables tony morelan 10 25 guy, do you have any thoughts on them? on the demographic of who is attracted to foldables? guy merin 10 31 i don't see it as a demographic thing i think i think it will become a commodity that more and more users across the world will? we'll see i think right now we're still seeing trends, because he's on the higher end, of course, yeah so we're seeing trend around there but when this becomes more of a commodity, and i think it will, and more of a mainstream device, i don't think it's going to be a demographic thing, just like we've seen with other form, form factors that are spread across the world tony morelan 11 00 yeah, yeah in certain you'd mentioned about gamers and tell me your thoughts on you know why something like foldable device would be attracted to the gaming community? søren lambæk 11 09 well, obviously, a big screen will have a big effect, not only can you see like a lot of graphics do you like and can change and you can have like, a different benefits doing tony morelan 11 20 that so what would it take for foldables to become more mainstream? søren lambæk 11 24 the price is it's a major one for reforms are quite pricey sure, reducing the price wouldn't make it more accessible for a lot of people tony morelan 11 34 yeah and i also think that really trying to teach developers how to build apps, you know, more education on app adoption is also important søren lambæk 11 43 yeah, definitely, we see a lot of games developer don't even consider foldable phones yet so i hope that is something that is going to change, where they could like start maybe changing the ui before they actually building the game guy merin 11 58 i think it would only if i may add one thing i think it's is a triangle of three things there is, you know, the users and the users’ need to see the benefit of why they should, you know, try a foldable phone or a large screen and then what drives that is apps so the more apps that we see that utilize it, that gives them benefits over using just a single screen, smaller device, the more apps that will use things like side by side or split screen or drag and drop between and just productivity and thinks that users can get more out of these apps when running on these new form factors i think that's another key factor and i think the third piece of this triangle is, in order to make the app better on those, you need to support it, that sdk level and the platform yeah, that's a lot of work that has been done by everybody here so mainly by google, because they of course, own the platform so the more we will see those things as standard like jetpack compose so how do you support foldables? there? how do you support all the other sdks, the more they will come native, the better the apps will get, the better the users will benefit from them? and i think that triangle, doing it correctly, will make it much more mainstream in the future ade oshineye 13 20 i agree with that i think one other thing that we've been pushing is getting developers across the chasm of thinking about this so we have a code lab, we put together with microsoft shows developers how to build for a world where the devices can be radically different sizes i mean, on my desk here, i have a samsung flip and a samsung ultra and they are radically different sizes, one of them can fold to be even smaller so if you want to build for both of these devices, and all the things in between, you have to think about am i going to be a responsive design app or when adaptive app, i had to think about which layouts i'm going to support which postures are going to support which aspect ratios, which resolutions, and developers for a long time, we've been able to sort of not really think very hard about that because most phones for a long time were fairly similar sizes now, the same kindle app that has to fold nicely on a surface duo has to also work on a giant tablet, for example, we have duo and meet and the same apk more or less that runs on your phone also runs on your television when we think of this as large screens, the screens can be very tony morelan 14 35 large what about google's quality guidelines? so the challenge for ade oshineye 14 39 us with quality guidelines is we don't want to stifle innovation but we do want to make sure that when a user downloads an app from our store, that it works well on the device, and that there are there's a well-lit path for developers in how do i give users the best possible experience so we have fatal guidelines and implemented shouldn't advice on what is a high-quality experience and then we have tiers of quality, so that you don't have to take a big jump, you don't have to eat the elephant in one bite you can, i think it's eat the rhinoceros in one bite, you can do it in, in lots of little bites so there are steps you can take to improve your quality and we have an easy-to-understand website that shows you, here's all the things you haven't done yet and you can decide which ones to invest in and when tony morelan 15 29 yeah, and i'll mention here that i know throughout this podcast that you guys will be referencing lots of resources for developers to really learn more about how to create for foldables, i'll be sure to include links in the show notes so that you guys can easily find this content so guy, tell me who do you think would benefit by developing for the foldable form factor and why guy merin 15 52 i think everybody will benefit from it the bottom of the funnel is the apps and the user so the users would benefit the most but i think you're asking more about the developers, i think every developer should look at is how they said here before my app is not going to run now only on a single screen, small device, it will span across others, every developer should think about their app what else can i do now that i have more real estate? and again, if it's a game, okay, what do i do with the second screen? how will my game maybe if i run the game, in a split screen with discord on the other side, because i'm using that for gaming as well, to start thinking about all these new scenarios that your app can now do? how can i provide content to the app that sits just beside me with drag and drop functionalities with these kinds of things? and i think every app, every developer, can benefit from those and you should start thinking about that, because this is preparing for, for the future and for more and more of these devices showing in market yeah, tony morelan 17 02 and i know the other day, a day and i were actually having a conversation about multi app user journeys ade oshineye 17 08 so we've tried to move away from thinking of use cases or scenarios to what we call cjs critical user journeys and part of that is because if i'm at home during the pandemic, i tend to have google docs open with meeting notes and then google meat open that if you move that to a foldable, well, that's one screen each but then i need to drag and drop things across them which means both developers need to think, am i a good citizen? does my app play well with others? historically, developers have tended to think about the user journey only within their own app but if you're a video chat app, you need to think okay, how do i work well, with a game with video content, somebody's watching, if i'm a video app, do i have picture in picture, if i have picture and picture, it unlocks all sorts of interesting new user journeys for the user if i'm a game, and i support multi window scenarios, it becomes possible somebody to play a game and live, stream it or play a game and have a chat conversation going on at the same time so trying to think about the user journey that's not just inside your one app, but it's across your app and other apps or even across multiple instances of your app tony morelan 18 17 store and tell me, what should the developer with an existing app do to extend it to foldables? søren lambæk 18 23 so there's quite a lot of sdk is that can be used already jetpack? windows manager is an android library that can help you with detecting if your app is expanding over multiple screens or not tony morelan 18 39 what about specifically game developers? maybe someone who's developing, you know, for unity or for unreal? are there resources out there to help them? søren lambæk 18 47 yeah, so samsung got like, some tutorials that will help you to set up phone apps for unity and unreal, boston guy merin 18 56 tony, if i may i can add one thing on the first question, what can developers do with an existing app, we put up a three-step guide and it's not specifically for the microsoft surface device for large screen on older foldables and the really the three steps are crawl, walk, run so you should start with taking your app and just trying it out on these new form factors if you have access to one of these devices, just try it there if you don't, there is emulators for everything for foldables for a duo for a large screen so just try your app on the emulator that's step one just see that it behaves well on these new form factors using an email lender step two is what we call the low hanging fruit so don't super invest but start small, as they say, maybe think about how can my app behave when it's running within other apps? so maybe support drag and drop either is a source of or is or is a destination cause doing picture and picture, things like that these are things that are super easy that you know, there's samples, there's code snippets, and you can just go in and copy paste into your app and just support that these are really small additions you can do and then it will really shine on those new devices and step three, is where really all the magic can happen you know, you have more real estate now so there's many new design patterns, you can think about lease details, you can think about a companion plane and a few others so what now will you do in your app that, you know, you have more real estate, you can do things differently? this is step three, which is i think, you know, where all the big value will come but it's a journey towards getting there ade oshineye 20 43 definitely, i think one other thing you may want to include is, at the most basic level, you check things like if i rotate my phone, does your device crash? does the app crash? or does it handle it? and then use thing? okay, so you handle rotation, you don't lose state if i'm halfway through typing a message, and i accidentally rotate my tablet, do you lose my message? that's bad yeah so that continuity is an important thing, all the way up to things like handling hinge occlusion so if you've got a surface duo, there's a hinge down the middle, you've got to remember that there we have an api for that, handling different postures of the device, and even trying to see if you can use those postures to offer new functionality but for a lot of developers, it's stepping back thinking about all the different contexts in which people are going to try to use your app and then making sure that you've handled them tony morelan 21 31 yeah, and guy you had mentioned about them testing, i wanted to also bring up that samsung has their remote tests lab, where you can online access a real device for testing your app so another great resource for developers to, to work with guy merin 21 49 definitely, it's also that in the emulator, the emulator is also an amazing resource, because you can run it locally, you can run it on the cloud, we have some workflows that connect to a cloud emulator so every time you know we have a few samples, so every time we do a check in for the sample, it spins off an emulator and test it looks great so we have all these test steps and none of that is specific to us to the to the demo, you can run it with any other devices well, tony morelan 22 15 tell me what is the figma design kit guy merin 22 18 figma design kit is a tool for designers to start thinking about foldables and large screens and dual screens so when we started the journey with developers, we first were thinking about the developers, how do we support you with sdks and with samples and with documentation, that's step two, actually, step one is thinking about your designs and then we started looking at what are the tools that designers use so figma is one of them and there are others so we just created figma design kit for foldables so it lists out all the layouts that are possible again, the list detail, the companion pane and a few others, gives you all the frames and really helps you think about the scenarios you want to cover in your in your app for these new form factors and then you start working with the developers and the sdk, there's actually a step three that we're trying to do in the future, which is, how do we make it easy? taking a figma design kit or another slope and making that into code? that's going to be the next step in the future? tony morelan 23 30 are they tell me about the jetpack window manager and the jet news demo app? ade oshineye 23 36 so like many people, we have quite some quite old demos that were written in a world where you had a phone and you had a tablet and so we like everybody else had to think about, okay, how do we change this to handle different postures, different aspect ratios so we have an article where we walked through the process we went through to use jetpack window manager to handle a lot of these configuration changes to handle continuity, rotation, a lot of those things so we got actually pretty good article about this i think one of the things we don't touch on in that article that i think is really important, is if i have an existing app that people like, and it's too expensive for me to do a complete rewrite, how do i start adding some of the new things into it so we have a new thing called activity embedding, which lets you get a foot in the door of compose, or we're starting to add these new, more complex layouts so maybe your app was just, oh, i have a bunch of cards that go vertically up and down the screen but it's actually no longer a phone it's a device that folds out is not twice the size so now i need to think, okay, i need to go to a list detail view gmail is a good example of this you do that unfold or you rotate and now you have so much more screen estate the challenge is, how do i embed the new more complex layout index? system set of layouts i already have without having to do a rewrite so there's a lot of that functionality that we're trying to show people because we don't want to fall in the trap of the only way you can get to the new world is to burn everything down and start again we want to give people an incremental path from where they are to where they need to get tony morelan 25 18 i was at gdc, this past year in samsung had a great presentation this morning did you get a chance to see that that presentation at gdc? where they talked about developing for foldables? søren lambæk 25 30 yeah, yeah yeah, yeah, it was one of our team members, mike there was doing a presentation tony morelan 25 37 yeah, i'll make sure to include a link to that to that presentation it was great because they covered foldable optimizations for game engines like unity and unreal, talked about android jetpack apis, and window manager showed examples of things like flex mode and ui scaling, and even had an engineer from unity talk about adaptive performance 4 0 ade tell me what should a developer consider when writing a new app for foldables? ade oshineye 25 46 my immediate reaction to this is, first of all, should i use views? or should i use compose, but i'm talking to more and more of my colleagues, they all go? well, obviously, they should compose because composers the future so the official google recommendation, if you're starting from scratch, start with compose, it will mature as your app matures the other things to think about is what makes foldable special, it's the fact they have all these postures, they have all of these different kinds of usage scenarios that they offer and then you want to avoid littering your code with designs that are attached to a specific screen size, or a specific aspect ratio, or a specific resolution and instead, you've got to decide am i adaptive or responsive? will i try to scale the same design? or will i move the components around when the posture or the orientation or the size changes? it's a difference between an app with a list of cards and the cards just get bigger? and an app that says, well, when you rotate me, i go to a list detail view? tony morelan 26 52 guy, what are your thoughts on what a developer should consider when they're writing a new app for foldables guy merin 26 59 so i think a developer should consider a couple of things one, there's folding features specifically for duo, we have, we have a hinge in the middle so if you have like controls, do you want to put them in the middle, or maybe you want to lay them out a little? a little differently for game developers, we did a lot of work for example, with xbox so when you play a game, you can have the controls on one screen and the game on the other screen so the controls, you know, are now have their own dedicated space so maybe you can do some stuff with it so for example, the one thing we did is depending on where you are in the game itself, the controller themes and the way they look change so if you're now a pirate on a ship, and you're in a sword fight or something, the controller is changed to be a sword, for example, or things like that and then other considerations are the posters so what happens when the device is folded? what happens when it's open? what happens when you rotate it? and all these will change the layout of the app and show different controls and options for the use of yeah, tony morelan 28 12 yeah soren, what would you say are some of the common issues that could come up when designing around foldables? søren lambæk 28 22 i think it's important for developers to consider the ui because on the samsung fold, when the phone is folded, we got like a single display so the aspect ratio on that one is very different to when you're when you got it unfolded so the ui, you will have much less space for ui so that is something that's very important that the transition from going from single display to what's the display, that the ui will change so it fits, there's no point on like, you can see all the ui on when it's when it's unfolded and then when you go to the single screen, half of the ui is not a clickable or you can see it so that's very, very important that you test that on your on your phone tony morelan 29 11 yeah, and i know it's a gdc presentation that's one of the things that mike covered was how to have your game go from the single screen and then when you open up the device, how it transitions to the to the door screen søren lambæk 29 25 yeah, exactly ade oshineye 29 26 oh, actually, that reminds me one thing i, i keep mentioning continuity and mostly people think, oh, i have my device, let's say to tablet like this ultra i have in my hand and in in the vertical orientation that's easy and if i rotate, i don't want to lose my state that's typically what we've always meant by continuity but once you have a device that falls, especially if you've got something that has three screens and how to screen them into screens, i may launch something on the outer screen then i open it up and then the app has to move on or the activity as we found that out the screen to now maybe spread out across both screens and then if i fold it the other way, so i'm now on one of the inner screens, the app has to not lose state now we have a bunch of guidance on how you define normal apps, where it gets especially tricky is when it's things like camera, where you may not just be moving an activity across screens, but it may actually move it across cameras okay, so this is one of those places where, if you have a real device in your hand, you can see it and you can see how for a user, this would be a very comfortable, obvious thing, they would expect holding the device in their hands but for you sitting behind your keyboard, it might not leap out as you as an obvious thing for a user to do yeah, so if you sit with erica, with us a samsung flip, you can take a selfie on it, but you might just very easily rotating your hand and because you want to take a selfie with the other camera for your app that's a very complicated thing for the user it's the most natural thing in the world sure so it's important to think about continuity across the different surfaces of the foldable yeah, guy merin 31 07 yeah and let me give, let me give another example with an email app can be gmail, it can be outlook, it can be whatever it whatever you're using and i think foldable or dual screen is really a great way to read emails so if, if until now, i was used to, you know, in the morning to get to my emails on a single screen device so i just have a list of emails, and then i go into each one of them, read it, go back, go to each one of them, read it, go back reply, what have you, if you don't have a larger screen, you can have the least detail so i see all the emails in one place, i click them and then the other side, i see the actual email that i need to address and now if i have to, is a lengthy email, if i have to read it, i can rotate the device and then i get into this a form, that i across the whole screen, i just see the whole email as detail and then when i hit the reply button, it can go into this laptop mode that you know, the keyboard goes from the bottom and then i could start replying to it and when i'm done, i get back to the least detail up to my next email so it really can serve as a laptop replacement yeah, because you have a larger screen, you can do pretty much in a productive manner, which you can do with your regular pc or mac tony morelan 32 27 yeah, for sure so guy, do you think it's a misconception that developers need to do a lot of custom work, that's only going to be that's only going to add value to a foldable device guy merin 32 38 i think it's a misconception, definitely, there's actually not a lot of work you need to do as i said before, you could start small with just adding drag and drop functionality or picture in picture and that will work across every place, every form factor around large screen small screen, and you're using native api's and sdk to support a foldable, you don't need to pick up another sdk for it it's all supported natively and whatever you do will work across all these devices and again, in the future, it can work on the tv or other on a watch so whatever your app will do, consider all these layouts provide layout screens, for each one of those new form factors, a single app will work on all of it ade oshineye 33 28 yeah, i think something i did this weekend is i went and dug up all my old android devices, i have android devices, going back to the g one and even the ones before the g one that i'm not sure i'm allowed to talk about in public, all the way to the latest ones from today and as developer, handling all of these different scenarios, is actually increasing the maintainability of your app because if i think about the screen on the g one and the resolution of that, and i think about that, compared to the resolution, the pixel six, it's a huge jump, and the screens are so much bigger so think about the kinds of devices we'll have five years from now, how much bigger how much higher resolution will those screens be? how often do you want to rewrite your app between now and then? versus oh, it's just a bigger screen at all it's a different posture and being able to make it a relatively simple migration or maintenance that versus a yet another rewrite tony morelan 34 31 so tell me, soren, what are some good examples of existing apps that are taking advantage of the foldable form factor? søren lambæk 34 39 so we have seen a lot of retro games actually, you are utilizing the phone a lot so because retro games don't really have that much heavy graphics so they've got like, plenty of space that they can use so we have seen where people are using a virtual gamepad on one screen and using live small mini maps and that kind of thing so that's okay seems but i also think that like when you're watching it like a video and you start like folding it, and you just see the video slide up on just one screen, because it assumes that you want to put it on tape or something i think that is really clever and i would like to see more of that thinking tony morelan 35 19 in a day, what are some great examples of existing apps that are taking advantage of the foldable form factor? ade oshineye 35 24 so we see a lot, but actually, my two favorites were shown to me by guy, one was a battleships game where you basically have the device in a tabletop posture, and you basically rotate it the other way for the other person to play oh, i thought that was beautiful yes love that and the second thing he showed me was just the kindle yes so basically be able to have the kindle open like a book, but also be able to fold it the other way so like a like a cheap paperback, where you fold it and you hold him in one hand exactly i would never do that for any of my books, but been able to do that and like surface to that field like that is so nicely that i think was really compelling tony morelan 36 02 and that was the first thing when i when i pulled out the surface duo showed my wife, the first thing she did was grab it in, folded it around like it was a traditional paperback book that was so easy to hold she absolutely loved that that aspect of it guy tell me, what are some other examples of some great apps that are already taking advantage of a foldable, guy merin 36 25 i think two kinds of app one is apps for consuming and i think the kindle is a good example of flipping a page, which is supernatural i really liked that experience as well, but also apps around creation so for example, if you need to edit a video, or edit your photos, or edit the blog post, it's very easy with dual screen or with the foldable or our screen to have the actual video or photo on one side, and on the other side, all the controls, and then you hit a control and you see it real time, what happens, how does it change the other, it's really, really helpful to create and edit your memories that way so it's really a great creation tool, as well, not just for consuming tony morelan 37 12 yeah, i could definitely see that also be a great value with a program like adobe acrobat you know, i'm often editing pdfs and so i could see that would be a great use case for, you know, not only being able to read documents, but then you know, making edits ade oshineye 37 28 i can also imagine with that sort of notebook, passport, sort of novel types, device, where if it's light enough and thin enough, you can sort of fold it in half with a stylus, and just scribble it like you would have a normal notebook, basically, like a moleskin but it's a moleskin with an infinite number of pages there's, guy merin 37 49 there's also psychological sense here, about the folding, and that you can close it so for example, if i'm writing or scribbling or journaling with a stylus on the device, when it's open, when i'm done, consider if you're doing it on a regular notebook, what are you doing, you're closing it, and it gives you a sense that you're done you accomplished something and i think this is where foldables really shine because you're doing something you're reading an email, you're journaling, you're even playing a game, once you're done, you close it, even you hear that little click yes and it gives you a sense, you know, it's like checking a box in your to do and i think this is something that you don't see in other form factors and you see it only on this folding devices that really helps users stay in their flow and then move away to, you know, do something else that is not related to the phone so leave it off and you know, digital wellbeing and stuff tony morelan 38 46 yeah, it's funny that you say that, because that was the one of the first things i noticed when i closed my duo hearing that little click sound it's sitting on my desk i was like, ah, okay, put that away ade oshineye 38 56 yeah, yeah, that's actually not the interesting effectiveness is that with the foldables, initially, because of weight, and then eventually, because of new user journeys, they switch from being in your trouser pocket, at least for me to being in a jacket pocket and that's something changes all the places i use them tony morelan 39 14 interesting yeah and i know when i first got my hands on the z flip, folding it to that such small form factor and putting it in my pocket just felt so much better than some of the bulky devices that i seem to carry around with me søren lambæk 39 30 i actually heard that people who using the ac flip, use the phone less because they have to open it manually so for them, it actually helps them a lot to not like spend too much time on the phone so there, i guess there's some psychological effect ade oshineye 39 47 i mean, i've had the opposite with my flip in that because it's so small, and because it sorts of made me take more selfies i don't usually take selfies because well, i usually have a real camera with me, but i have this thing, it's small enough that it's in the back pocket of my jeans and it's just arms were nice and i would normally just take a photo of the place but as thing i can pull it out, then basically without having to unfold it, or unlock it just pointed on my face, click selfie, put it in my pocket again so for that one particular user journey, i use it more tony morelan 40 20 interesting yeah, i could, i could totally see that but tell me a day, what are some of the challenges that foldable technology needs to overcome to increase consumer adoption? ade oshineye 40 31 i mean, if i look at the variety of devices, i have the flip back pocket of jeans every time when it comes to the fold, i have to sort of look at the jacket i'm wearing and think about, okay, will the material the lining handles the weight, or should it go into my bag, if i'm carrying this surface duo, it's light enough that i can just casually put it in my jacket pocket, it'll be fine but it's too bulky for me to put in the front pocket of any of my jeans and it feels dangerous to put in the back pocket so weight is an issue cost is also an issue because the more expensive it is, the more careful you have to be when you put it away to think, will it be safe in this pocket but as these things get thinner, lighter, cheaper, and we discover more and more user journeys, i think that's going to be really interesting if i give an example, i have the surface level one, and it's great but every now and again, i see somebody surface two or two and i go, oh, they have a pen oh, that's interesting and i find myself thinking, well, that might be an interesting upgrade if it were thin enough and light enough, but then i'm thinking, but will it fit in my jacket? pocket? tony morelan 41 37 sure that's interesting guy tell me what do you think are some of the challenges that the foldable technology needs to overcome? i guy merin 41 45 think the first obvious one is the price point, they're still more expensive than other form factors so i think we're going to see the prices, the prices go down? for sure i think that would be probably my biggest one i think we did not hit the point of, you know, apps, enough apps are there, we'll see more and more apps, and then everybody will want to join the party i don't think we are in that stage yet and i think that will come soon tony morelan 42 13 and so on, what are your thoughts on what sort of challenges that the foldable technology needs to overcome? søren lambæk 42 19 the foldable phone at the moment is very bulky, and it's very heavy, it will be great that it was if it's lighter, i'd know that people that it actually puts people off some people that it is so bulky and heavy, where they will rather i get the flip phone for that reason i also think speaking of the flip, i think battery life is an it's very important i don't know how much bigger battery they can put in them without even giving more bulky and heavier but when you have like on the samsung one, there are three displays and if you use it for game watching films, it's really draining battery so that is i will say that is the big ones for me tony morelan 43 03 so guy, what resources would you recommend for developers interested in creating foldable apps, guy merin 43 09 i think you know; our modal is really meeting the developers where they're at so continue using whatever you're using if you're using a mac or pc, we have emulators for each one of those things so i would start with just following the recommendations you know, we have documentation samsung has google, start there, download an emulator, try it out and then just write a sample app, there was a code lab that we built with google, you could try there to test some of these new capabilities on the emulator on a specific device and then start your journey from there to commutations samples emulator we post a weekly blog, a weekly developer blog every thursday, that brings new information, for example, how to write again, how to use drag and drop, how to run side by side with another app, how to address the post changes, well, layout changes so we have a blog every week that covers code it's a developer blog with specific code and tips and tricks, try those resources and just reach out if you have a question and if you're blocked on anything, we are really here to help you out with your journey because we're creating the future and we want you to be successful with your app on all these new form factors tony morelan 44 34 yeah are there any conferences or events the that you know that you'll be attending? guy merin 44 40 definitely so google io was just completed a few weeks back, a lot of talks around large screens, you can still follow that and see some of the talks droidcon is coming up we just had droidcon san francisco a couple of days ago, and the next one is in berlin, and it's a worldwide conference google's probably going to have a few to prevent samsung has a few events microsoft build was just a couple of weeks ago and we also had to talk about tony morelan 45 08 foldables excellent and i know a day you shared with me a large list of links tells me, you know, what are some of these resources the developers can utilize ade oshineye 45 19 so for us, it's really three buckets there are introductory materials, such as our quality guidelines that i think are really important to sort of absorb into your bones so you can feel what a good experience will be like, and it will nudge you as you go on then we have a large collection of design resources, often at the material design website, but also woven through developers@android com and then the final piece is a set of resources for the developers things like how do i do testing the code library with microsoft but those three buckets of resources are the right ones for you to start with i'd also recommend come to door con berlin, were given a talk a teammate of mine, romano, france will be their co presenting with somebody from microsoft and again, you can go grill those people get lots of questions and of course, there will be future android events, where we'll have more stuff to share tony morelan 46 14 wonderful insight on what does samsung have to offer to help developers søren lambæk 46 20 so sometimes we got our own a game dev space where we posted blocks and tutorials, articles and we will have some when this podcast is out, we should have some tutorials available we also got the gdc presentation that mike did tony morelan 46 37 excellent so any more thoughts as we close the podcasts on this new technology in foldables ade oshineye 46 45 from my perspective, looking at my desk, i've got a flip duo, a samsung tab and that really captures just the variety of form factors that are happening on the android platform and i look forward to seeing more i think that's one of the things i learned here is that there's so much going on and there's so much more to come søren lambæk 47 06 i'm really looking forward to the future to see what new technology and what new devices coming out how the foldable phones will hopefully be more like lighter and more affordable and yeah, i'm really looking forward to see how developers is going to utilize them for all kinds of different apps guy merin 47 28 i think i think this is super exciting times, we are really in a pivotal point of, you know, something new, something a new generation of four factors evolving, and it's happening right now we started seeing the version one of the foldables and tools, we're now seeing a second version and a third version and i think we're going to see more of that and this is just amazing we are creating the future right now and i think developers are the most important part of it, because it will succeed based on the apps, and what developers will do with it and this is a great time now to join this ride and really create the future because i think 10 years from now, we will see things that really start happening right now with apps that take you to the next steps with foldables yeah, tony morelan 48 21 my key takeaway with the foldable industry is how many of these big companies in this industry are working together to further the technology it was great to have you know, someone from google from microsoft, and of course, from samsung, all on the podcast today before we close this out, i want to ask a question of each of you soren, what is it that you do for fun and when you're not at your desk working for samsung? søren lambæk 48 46 as i already said that i do like art to play music and draw and i have an eight-month-old son that's taking up a lot of my time at the moment tony morelan 49 00 wonderful wonderful yeah, congratulations on that thank you in a day, what is it the you do for fun when you can step away from your role at ade oshineye 49 09 google? so i do a lot of things but i think the main thing that occupies my time nowadays has been playing badminton it's an it's a huge part of the swiss culture and there's just a lot of people who play badminton, so it's a great game you can actually get seriously injured in it but you can also get very good at it so i'd recommend it tony morelan 49 32 in guy what is it that you do for fun up in the great northwest? when you get to put aside your responsibilities at microsoft i can see in your background now i noticed on your wall, you've got your own indoor rock-climbing gym guy merin 49 45 yeah, exactly so trivia in the last six months i've been training really, really hard to climb and summit some of the mountains around north washington goal is to get even bigger mountains but we did a couple of summits last weekend and really into climbing and something mountains now wow takes a lot of mental prep, nutrition, fitness level and i've seen a lot of similarities between the experiences i have with preparing for a climb, to even things i do at work it's really managing a project, a lot of insights i got from climbing that i apply in other places tony morelan 50 25 that's great that's great hey, i wanted to thank all of you for being on the podcast today it was wonderful to hear the different voices and get a chance to chat with you all ade oshineye 50 34 thank you very much for having us you closing 50 35 just looking to start creating for samsung download the latest tools to code your next app, or get software for designing apps without coding at all sell your apps to the world on the samsung galaxy store check out developer samsung com today and start your journey with samsung the samsung developers podcast is hosted by tony morelan and produced by jeanne hsu
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.