From af48d059f82862cad36cba8c1a177fb46459ad5e Mon Sep 17 00:00:00 2001 From: Editor Lionbridge Date: Thu, 24 Nov 2016 12:26:38 +0200 Subject: [PATCH] [LB] Template fixes in Guides ready for review - This update includes the ongoing Gerrit changes from 94157, 99752, and 93031. - Fixes include removal of the warm-up section, reference information move to the end of the topic, and general editing of the descriptive content at the beginning. PS3: [LB] app_communication_n.htm fixed based on comment PS4: [LB] More comment fixes PS5: hw_acceleration.png was modified. PS6: [LB] Added fixes to new guides (YACA, Iotivity) PS7: [LB] Native Connection Manager title change PS8: modified: Iotivity -> IoT Connectivity renamed: org.tizen.guides/html/native/connectivity/iotivity_n.htm -> org.tizen.guides/html/native/connectivity/iotcon_n.htm PS9: [LB] Restructured native application control topic PS10: [LB] Restored original native app control topic, with the privilege addition. Restored native Iotivity topic back to original title. PS11: [LB] Restored app control from PS9, modified Iotivity title, and added template-fixed version of the new DPM guide Change-Id: I066cb67d3155982a737f2b46a323ea6624813970 --- org.tizen.guides/html/images/badge.png | Bin 95867 -> 95712 bytes org.tizen.guides/html/images/cairo_draw_lines.png | Bin 2504 -> 0 bytes org.tizen.guides/html/images/hello_world_dali.png | Bin 13483 -> 10939 bytes org.tizen.guides/html/images/hw_acceleration.png | Bin 38895 -> 7964 bytes org.tizen.guides/html/images/setting_to_clock.png | Bin 43910 -> 28664 bytes org.tizen.guides/html/images/shortcut.png | Bin 167461 -> 166118 bytes .../html/images/tizen_project_dali.png | Bin 196375 -> 103921 bytes org.tizen.guides/html/index.htm | 15 +- org.tizen.guides/html/native/alarm/alarms_n.htm | 34 +- org.tizen.guides/html/native/alarm/trigger_n.htm | 577 ++++---- .../native/app_management/app_communication_n.htm | 4 +- .../html/native/app_management/app_controls_n.htm | 705 +++++---- .../html/native/app_management/app_icons_n.htm | 86 +- .../html/native/app_management/app_manager_n.htm | 28 +- .../native/app_management/app_preferences_n.htm | 9 - .../html/native/app_management/app_resources_n.htm | 58 +- .../html/native/app_management/applications_n.htm | 2 +- .../html/native/app_management/dali_app_n.htm | 27 +- .../html/native/app_management/data_bundles_n.htm | 46 +- .../html/native/app_management/data_control_n.htm | 291 ++-- .../html/native/app_management/event_n.htm | 395 +++-- .../html/native/app_management/message_port_n.htm | 78 +- .../native/app_management/package_manager_n.htm | 20 +- .../html/native/app_management/service_app_n.htm | 26 +- .../html/native/app_management/ui_app_n.htm | 264 ++-- .../html/native/app_management/watch_app_n.htm | 124 +- .../html/native/app_management/widget_app_n.htm | 130 +- .../html/native/connectivity/bluetooth_n.htm | 59 +- .../html/native/connectivity/connection_n.htm | 61 +- .../native/connectivity/connectivity_cover_n.htm | 12 +- .../html/native/connectivity/curl_n.htm | 12 - .../html/native/connectivity/download_n.htm | 16 +- .../html/native/connectivity/http_n.htm | 63 +- .../native/connectivity/internet_download_n.htm | 2 +- .../connectivity/{iotivity_n.htm => iotcon_n.htm} | 199 +-- .../html/native/connectivity/mtp_n.htm | 28 - .../html/native/connectivity/nfc_n.htm | 33 +- .../html/native/connectivity/nsd_n.htm | 94 +- .../html/native/connectivity/plugins_n.htm | 25 +- .../html/native/connectivity/smartcard_n.htm | 25 +- .../html/native/connectivity/telephony_n.htm | 38 +- .../html/native/connectivity/usb_host_n.htm | 16 +- .../html/native/connectivity/vpn_n.htm | 23 +- .../html/native/connectivity/web_view_n.htm | 32 +- .../html/native/connectivity/wifi_direct_n.htm | 39 +- .../html/native/connectivity/wifi_n.htm | 23 +- .../html/native/data/data_storages_n.htm | 23 +- org.tizen.guides/html/native/data/sql_n.htm | 16 +- .../html/native/device/attached_devices_n.htm | 51 +- .../html/native/device/ext_output_n.htm | 24 +- org.tizen.guides/html/native/device/feedback_n.htm | 28 +- org.tizen.guides/html/native/device/runtime_n.htm | 232 ++- org.tizen.guides/html/native/device/settings_n.htm | 350 +++-- org.tizen.guides/html/native/device/system_n.htm | 272 ++-- .../html/native/error/system_logs_n.htm | 13 +- org.tizen.guides/html/native/graphics/cairo_n.htm | 248 +--- .../html/native/graphics/graphic_buffer_n.htm | 9 - org.tizen.guides/html/native/graphics/opengl_n.htm | 53 +- .../html/native/internationalization/i18n_n.htm | 102 +- .../native/internationalization/phonenumber_n.htm | 14 - .../html/native/location_sensors/activity_n.htm | 12 +- .../native/location_sensors/device_sensors_n.htm | 1521 ++++++++++---------- .../html/native/location_sensors/geofences_n.htm | 41 +- .../html/native/location_sensors/gesture_n.htm | 29 +- .../html/native/location_sensors/location_n.htm | 40 +- .../html/native/location_sensors/maps_n.htm | 77 +- .../location_sensors/mapzen_credentials_n.htm | 4 +- org.tizen.guides/html/native/media/camera_n.htm | 52 +- .../html/native/media/image_barcode_n.htm | 233 ++- .../html/native/media/image_edit_n.htm | 351 +++-- .../html/native/media/media_content_n.htm | 895 +++++------- .../html/native/media/media_controller_n.htm | 39 +- .../html/native/media/media_conversions_n.htm | 61 +- .../html/native/media/media_cover_n.htm | 10 +- .../html/native/media/media_handle_n.htm | 218 ++- org.tizen.guides/html/native/media/media_key_n.htm | 15 +- .../html/native/media/media_muxing_n.htm | 27 +- .../html/native/media/media_playback_n.htm | 603 ++------ .../html/native/media/media_recording_n.htm | 409 +----- .../html/native/media/media_streams_n.htm | 76 +- org.tizen.guides/html/native/media/metadata_n.htm | 558 +++---- org.tizen.guides/html/native/media/openal_n.htm | 17 - org.tizen.guides/html/native/media/radio_n.htm | 31 +- org.tizen.guides/html/native/media/raw_audio_n.htm | 748 ++++++++++ .../html/native/media/screen_mirroring_n.htm | 23 +- org.tizen.guides/html/native/media/sound_n.htm | 123 +- .../html/native/media/stream_recorder_n.htm | 17 - .../html/native/media/thumbnail_images_n.htm | 13 +- org.tizen.guides/html/native/messaging/email_n.htm | 11 - .../html/native/messaging/messages_n.htm | 13 - org.tizen.guides/html/native/messaging/push_n.htm | 55 +- .../html/native/messaging/push_server_n.htm | 17 +- .../html/native/notification/attach_panel_n.htm | 39 +- .../html/native/notification/minicontrol_n.htm | 15 +- .../html/native/notification/noti_n.htm | 59 +- .../html/native/performance/tracepoints_n.htm | 31 +- .../html/native/personal/account_n.htm | 69 +- .../html/native/personal/calendar_n.htm | 46 - .../html/native/personal/contacts_n.htm | 152 +- .../html/native/personal/context_n.htm | 225 ++- .../html/native/personal/data_sync_n.htm | 216 ++- org.tizen.guides/html/native/personal/fido_n.htm | 25 +- org.tizen.guides/html/native/personal/oauth_n.htm | 41 +- org.tizen.guides/html/native/security/dpm_n.htm | 339 +++-- .../html/native/security/privilege_n.htm | 16 +- .../html/native/security/secure_key_n.htm | 36 - org.tizen.guides/html/native/security/yaca_n.htm | 20 - .../html/native/text_input/input_method_n.htm | 27 +- org.tizen.guides/html/native/text_input/stt_n.htm | 38 +- org.tizen.guides/html/native/text_input/tts_n.htm | 48 +- .../html/native/text_input/voice_control_n.htm | 46 +- org.tizen.guides/html/web/alarm/alarms_w.htm | 66 +- .../html/web/app_management/app_controls_w.htm | 224 ++- .../html/web/app_management/app_group_w.htm | 50 +- .../html/web/app_management/app_icons_w.htm | 9 - .../html/web/app_management/data_w.htm | 11 - .../html/web/app_management/message_port_w.htm | 49 +- .../html/web/app_management/packages_w.htm | 54 +- .../html/web/app_management/preference_w.htm | 64 +- .../html/web/app_management/service_app_w.htm | 235 ++- .../html/web/app_management/widget_app_w.htm | 109 +- .../html/web/connectivity/bluetooth_w.htm | 108 +- .../html/web/connectivity/connectivity_cover_w.htm | 4 +- .../html/web/connectivity/convergence_w.htm | 23 +- .../html/web/connectivity/download_w.htm | 17 +- .../html/web/connectivity/iotcon_w.htm | 34 +- org.tizen.guides/html/web/connectivity/nfc_w.htm | 369 ++--- .../html/web/connectivity/secure_element_w.htm | 25 +- org.tizen.guides/html/web/cordova/console_w.htm | 11 - org.tizen.guides/html/web/cordova/device_w.htm | 28 +- .../html/web/cordova/devicemotion_w.htm | 17 +- org.tizen.guides/html/web/cordova/dialogs_w.htm | 72 +- org.tizen.guides/html/web/cordova/events_w.htm | 122 +- org.tizen.guides/html/web/cordova/file_w.htm | 15 +- .../html/web/cordova/filetransfer_w.htm | 48 +- .../html/web/cordova/globalization_w.htm | 31 +- org.tizen.guides/html/web/cordova/media_w.htm | 87 +- .../html/web/cordova/network_information_w.htm | 74 +- org.tizen.guides/html/web/data/data_filter_w.htm | 207 ++- .../html/web/data/file_archiving_w.htm | 53 +- org.tizen.guides/html/web/data/file_system_w.htm | 262 ++-- .../html/web/data/stored_content_w.htm | 101 +- org.tizen.guides/html/web/device/feedback_w.htm | 17 +- org.tizen.guides/html/web/device/power_w.htm | 70 +- .../html/web/device/system_information_w.htm | 346 +++-- .../html/web/device/system_setting_w.htm | 114 +- org.tizen.guides/html/web/device/time_w.htm | 58 +- org.tizen.guides/html/web/device/web_view_w.htm | 27 +- org.tizen.guides/html/web/error/error_w.htm | 26 +- org.tizen.guides/html/web/media/audio_w.htm | 29 +- org.tizen.guides/html/web/media/camera_w.htm | 19 +- org.tizen.guides/html/web/media/jpeg_exif_w.htm | 11 +- .../html/web/media/media_controller_w.htm | 18 +- org.tizen.guides/html/web/media/media_key_w.htm | 12 +- org.tizen.guides/html/web/media/player_util_w.htm | 7 - org.tizen.guides/html/web/media/radio_w.htm | 20 +- org.tizen.guides/html/web/messaging/messages_w.htm | 125 +- org.tizen.guides/html/web/messaging/push_w.htm | 61 +- .../html/web/notification/notification_w.htm | 23 +- org.tizen.guides/html/web/personal/account_w.htm | 101 +- org.tizen.guides/html/web/personal/bookmarks_w.htm | 16 +- org.tizen.guides/html/web/personal/calendar_w.htm | 352 +++-- .../html/web/personal/call_history_w.htm | 34 +- org.tizen.guides/html/web/personal/contacts_w.htm | 309 ++-- org.tizen.guides/html/web/personal/sync_w.htm | 44 +- .../html/web/security/secure_key_w.htm | 38 +- .../html/web/sensors/device_sensors_w.htm | 130 +- org.tizen.guides/html/web/sensors/ham_w.htm | 171 +-- .../html/web/text_input/input_device_w.htm | 39 +- .../html/web/w3c/communication/server_sent_w.htm | 13 +- .../html/web/w3c/communication/web_messaging_w.htm | 34 +- .../html/web/w3c/communication/websocket_w.htm | 22 +- .../web/w3c/communication/xmlhttprequest_w.htm | 15 +- org.tizen.guides/html/web/w3c/device/battery_w.htm | 21 +- .../html/web/w3c/device/browser_state_w.htm | 7 - .../html/web/w3c/device/device_orientation_w.htm | 20 +- .../html/web/w3c/device/screen_orientation_w.htm | 68 +- org.tizen.guides/html/web/w3c/device/touch_w.htm | 85 +- .../html/web/w3c/device/vibration_w.htm | 38 +- .../html/web/w3c/graphics/canvas_w.htm | 167 +-- org.tizen.guides/html/web/w3c/graphics/svg_w.htm | 87 +- .../html/web/w3c/location/geolocation_w.htm | 9 +- .../html/web/w3c/media/getusermedia_w.htm | 16 +- .../html/web/w3c/media/media_capture_w.htm | 14 +- .../html/web/w3c/media/video_audio_w.htm | 252 ++-- org.tizen.guides/html/web/w3c/media/webaudio_w.htm | 19 +- org.tizen.guides/html/web/w3c/perf_opt/page_w.htm | 17 +- .../html/web/w3c/perf_opt/timing_control_w.htm | 13 +- .../html/web/w3c/perf_opt/web_workers_w.htm | 330 +++-- org.tizen.guides/html/web/w3c/security/cors_w.htm | 14 +- .../html/web/w3c/security/iframe_w.htm | 18 +- .../html/web/w3c/storage/appcache_w.htm | 55 +- org.tizen.guides/html/web/w3c/storage/file_w.htm | 28 - .../html/web/w3c/storage/indexdb_w.htm | 36 +- .../html/web/w3c/storage/web_storage_w.htm | 24 +- org.tizen.guides/html/web/w3c/storage/websql_w.htm | 87 +- .../html/web/w3c/supplement/camera_w.htm | 20 +- .../html/web/w3c/supplement/fullscreen_w.htm | 16 +- .../html/web/w3c/supplement/typedarray_w.htm | 130 +- .../html/web/w3c/supplement/webgl_w.htm | 53 +- org.tizen.guides/html/web/w3c/ui/animation_w.htm | 49 +- org.tizen.guides/html/web/w3c/ui/background_w.htm | 16 + org.tizen.guides/html/web/w3c/ui/clipboard_mw.htm | 3 +- org.tizen.guides/html/web/w3c/ui/color_w.htm | 35 +- org.tizen.guides/html/web/w3c/ui/font_w.htm | 4 + org.tizen.guides/html/web/w3c/ui/html5forms_w.htm | 271 ++-- org.tizen.guides/html/web/w3c/ui/media_query_w.htm | 2 +- .../html/web/w3c/ui/session_history_w.htm | 7 +- org.tizen.guides/html/web/w3c/ui/text_module_w.htm | 4 + org.tizen.guides/html/web/w3c/ui/transform_w.htm | 29 +- org.tizen.guides/html/web/w3c/ui/transition_w.htm | 20 +- org.tizen.guides/html/web/w3c/ui/woff_w.htm | 4 + org.tizen.guides/index.xml | 15 +- 213 files changed, 8579 insertions(+), 11385 deletions(-) delete mode 100644 org.tizen.guides/html/images/cairo_draw_lines.png mode change 100644 => 100755 org.tizen.guides/html/images/hw_acceleration.png rename org.tizen.guides/html/native/connectivity/{iotivity_n.htm => iotcon_n.htm} (84%) create mode 100644 org.tizen.guides/html/native/media/raw_audio_n.htm diff --git a/org.tizen.guides/html/images/badge.png b/org.tizen.guides/html/images/badge.png index ed94bb532d12e208a836d267fee60996b4381c14..6aa2c43528eac8bb5d2d900a66cd0d7c8f1f7af1 100644 GIT binary patch literal 95712 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 diff --git a/org.tizen.guides/html/images/cairo_draw_lines.png b/org.tizen.guides/html/images/cairo_draw_lines.png deleted file mode 100644 index ab958cdc82b9ef4a11e3ba04751c17a7ccbaaf30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2504 zcmaJ?c{CIX7avO~stE~SM2qy8X^@gEnJ5}Gh%}=zN%p}Im5?k$iwfyQc_h*!5`&&p zmLy|e%32AnLX<81p8om%`2P6rx!bw-+>?>7N~0099A3PM;IA|enKg_sx?FUFE3 z5EqAp1ePwvvSnDl97G~ktbn8>q@*A%jg>1QBZF0|AS(+wImpXn^=c?6Kv5BE)<8)K z%F0-~7VFnz!v?6RVBSD(Z=;=XU9|i_6G{nxGFfsy_ie0;4Yzz|TM!`2pdb~tbV_Vze<5DW&GOgK2;&>TUm7E)61*I!6YMOqqe z-$r^m?%Y8}1~M~o_b#%saPJS9tvzot^0FLU%WMdeGa8w{P+89s2t4{yqBpF))C^L45dt zk00^r6Fz^&moNDG6+=V#_6@_s7#YFnD87Hk*cisg@#6=6{=~!tCMPj9h3RR`%;48A z%+6wN4)gQC!h-)l$iI@8x8PswV|vh!Kv-7!n*?5XXB}HG%KMwx``dUQ_YY)ooC$Q6 z8{403X|i7_K#QzR)}T;+aMB0_5gjvQqx~lje@k|Akai|;MN6yHR9keaGKAL)2QHRr zCDIO%GF1Q2-YjiWfAJh$Ydp)`gf?C=R;$)VX(^O`URAnlgR+)|iIK*#@>i2V1*M_K z0|VZ6-qIhswfxtaPM71Mh9^5ZgD0IoD8#CYdW$Rk5Bkz7-ydNGa^sIsv+Q}s92<{! zDR))6U%xnf(Uu?od~R;zk@7^BN4jafsZSfG@~Tu8WhZt>4eUAO`bOI`D7N-7u~%UJ zdveo=`3_b4;snVS`#bGqhz9BH>ecjWIiPY#p5ZLXR3%099B$vvx$Dby=~$V;2oks4 zUA4DDJ;gPiCV)O4(Yt+<5F^U@b%=Do+u}S*Q`VxPvv9D!!eDy6@wgS-vssx zFHgGZzDWDE>5*Gxs$J{)!zI{xv8|4-@u>!9HD_zx`VP*FI*l2=%V32}Tlj4HuwhnQ zYh6KPUZ3QJw298_LE~M?!t&Wx+&ux}%^yX62F!M?9+8_0%NcoCK}miYGb=+S4;0Fo z|A$<6Q+_CUonLj@z7!EDpUlWB{4(anyl@-Y_M@qDcC?A;Q0>cpq==ie{)e9ml55q6 zZSRV>)l*Hi8j6V4Z?vY$#C^1`JyLE|4C4>byHCsdJc$IGcHUmuz*_rA#Kx5!A*Kq% zLPbFbH)YzHGrROu$o?FzTg%G{cEUp$^Tx<+Y;S-Y#DvZGj9C26zA z1NJFD>EFHdf3PviVSYKIPVUxZZ~7vk@vLN!caOL*hA(rZ17i7Jo0de$vby6^1T-oN zGc*~6{t<3`JDzLg^47!xfyP~+RE#WMy{tfP8e){He8SZ=Zrs^_xd(t1B@Nw-vY@eWO=XLtdy8v3S%C={ZBTV9=9w*+HnB)$M?0pk* ztXHyspv;fw*5h}*FSbL<7jfGahH~CW7x(Nv85trjam&y}c$u^vK_}DKZ*tGFa<^z^ z%{>;Yf8R3&-(bs=V|FFxe_Q@OdqmEU>3~g~!^xTL_iry*Z=g#)+DfgN{;}06dv(vt z0|x2A(XM6L8&eC39Osb7r>6{FZaedBzRohZ=uu%#7r9L)#JEe>tli1~yNM@*e&A|+ zj(kDu_=Y%=p7z&j9(%iMj!!$kruJ&S!`s2YkJa=YB$3?EE###BGyPE#{5sR-8Q&h8 zc=6G;L(f7kgk^Tcd%US{xJe1Jbqh}~J>OI5%LlhOGWNg7VTesHx7zkeD4c+y-|xxH L#L_sI>Ui#7DeWaj diff --git a/org.tizen.guides/html/images/hello_world_dali.png b/org.tizen.guides/html/images/hello_world_dali.png index 268303e25ae78791756e67a92d607a2c3be03eb5..bfdfd798aff6cdfbf302d94298a37b0cddd4befa 100644 GIT binary patch literal 10939 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 literal 13483 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 ABme*a literal 38895 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 E0PMN_AOHXW literal 43910 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 +

Tizen supports the following media formats:

+
    +
  • Video: 3GP, AVI, ASF, OGV, MP4, MKV, WMV
  • +
  • Audio: AAC, AMR, MP3, OGG, WAV, WMA
  • +
+

To provide users with HTML5 audio and video features, you must learn to check whether the media data of the assigned MIME type can be played:

    @@ -741,6 +611,110 @@ browser) is created. The control is visible only when the error.html
  1. video_sample.mp4
  2. + + +

    Supported Codecs

    + +

    The following table lists the codecs supported in Tizen.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table: Supported codecs
    TypeCodecEncoderDecoder

    Video

    MPEG-1

    No

    Yes

    MPEG-4 part 2

    Yes

    Yes

    MPEG-4 part 2 MS v1

    No

    Yes

    MPEG-4 part 2 MS v2

    Yes

    Yes

    MPEG-4 part 2 MS v3

    Yes

    Yes

    H.264, H.263-1996, H.263+, H263-1998, H263 v2

    Yes

    Yes

    H.264, MPEG-4 AVC, MPEG-4 part10

    No

    Yes

    WMV3

    No

    Yes

    VC1

    No

    Yes

    THEORA

    Yes

    Yes

    Audio

    AAC

    No

    Yes

    MP3

    No

    Yes

    WMA (Available up to WMA8. WMA9 is not available.)

    No

    Yes

    AMR-NB

    Yes

    Yes

    AMR-WB

    No

    Yes

    VORBIS

    Yes

    Yes

    diff --git a/org.tizen.guides/html/web/w3c/media/webaudio_w.htm b/org.tizen.guides/html/web/w3c/media/webaudio_w.htm index 7faf2e5..9edb910 100644 --- a/org.tizen.guides/html/web/w3c/media/webaudio_w.htm +++ b/org.tizen.guides/html/web/w3c/media/webaudio_w.htm @@ -55,24 +55,11 @@
  3. Modular routing

    Modular routing means routing audio data either in a direct manner, such as speaker output, or through a connection to AudioNodes, which handle, for example, volume adjustment and filters.

  4. Playing sound -

    Use the noteOn(time) or start(time) method to play sound with the time parameter for specifying the time interval in seconds after which the audio is played. For example, the 0 time value implies playing the audio immediately and the currentTime + 0.75 time value implies that the audio is played after 0.75 seconds.

  5. -
  6. Stopping sound -

    Use the noteOff(time) or stop(time) method to stop sound with the time parameter for specifying the time interval in seconds after which the audio playback is stopped. For example, the 0 time value implies stopping the audio playback immediately and the currentTime + 0.75 time value implies that the audio playback is stopped after 0.75 seconds.

    -

    After stopping sound, recreate the AudioBufferSourceNode interface instance to play sound again.

  7. +

    Use the noteOn(time) or start(time) method to play sound with the time parameter for specifying the time interval in seconds after which the audio is played. For example, the 0 time value implies playing the audio immediately and the currentTime + 0.75 time value implies that the audio is played after 0.75 seconds.

    +

    You can use the noteOff(time) or stop(time) methods similarly to stop the sound. After stopping sound, recreate the AudioBufferSourceNode interface instance to play sound again.

    -

    Warm-up

    -

    Become familiar with the Web Audio API basics by learning about:

    - - -

    Loading Data and Creating Audio Context

    +

    Loading Data and Creating Audio Context

    To provide users with sophisticated audio features, you must learn to modulate source data into decoded audio data using XMLHttpRequest, and create an instance of the AudioContext interface:

    diff --git a/org.tizen.guides/html/web/w3c/perf_opt/page_w.htm b/org.tizen.guides/html/web/w3c/perf_opt/page_w.htm index fce5339..4e25aea 100644 --- a/org.tizen.guides/html/web/w3c/perf_opt/page_w.htm +++ b/org.tizen.guides/html/web/w3c/perf_opt/page_w.htm @@ -69,21 +69,8 @@ -

    Warm-up

    -

    Become familiar with the Page Visibility API basics by learning about:

    - - -

    Follow-up

    -

    Once we have learned the basics of the Page Visibility API, we can now move on to more advanced tasks, including:

    - - -

    Retrieving the Page Visibility Status

    -

    To optimize the performance of your application, you must learn to retrieve the page visibility status:

    +

    Retrieving the Page Visibility Status

    +

    To optimize the performance of your application, you must learn to retrieve the page visibility status:

    1. Retrieve the page visibility status with the hidden property:

      diff --git a/org.tizen.guides/html/web/w3c/perf_opt/timing_control_w.htm b/org.tizen.guides/html/web/w3c/perf_opt/timing_control_w.htm index 2c7e259..d786c47 100644 --- a/org.tizen.guides/html/web/w3c/perf_opt/timing_control_w.htm +++ b/org.tizen.guides/html/web/w3c/perf_opt/timing_control_w.htm @@ -68,16 +68,9 @@ window.performance.windowNow(); -

      Warm-up

      -

      Become familiar with the Timing control for script-based animations API basics by learning about:

      - - -

      Creating an Application with a Controllable Animation

      - -

      To optimize the performance of your application, you must learn to create a simple controllable DOM animation.

      +

      Creating an Application with a Controllable Animation

      + +

      To optimize the performance of your application, you must learn to create a simple controllable DOM animation.

      This example creates a screen with a Tizen pinwheel rotating on it, and buttons to increase or decrease the rotation speed and start or stop the animation.

      Figure: Controllable animation (in mobile applications only)

      Controllable animation (in mobile applications only)

      diff --git a/org.tizen.guides/html/web/w3c/perf_opt/web_workers_w.htm b/org.tizen.guides/html/web/w3c/perf_opt/web_workers_w.htm index bb82273..d9ec3bc 100644 --- a/org.tizen.guides/html/web/w3c/perf_opt/web_workers_w.htm +++ b/org.tizen.guides/html/web/w3c/perf_opt/web_workers_w.htm @@ -27,10 +27,10 @@

      Content

      Related Info

        @@ -47,10 +47,7 @@

        Web workers run JavaScript in an independent thread instead of the main UI thread, improving the JavaScript performance without affecting the UI.

        This feature is supported in mobile and wearable applications only.

        - -

        Web workers are not DOM-dependent. They handle pure data, which makes them especially suitable for JavaScript code that takes a long time to execute.

        - - +

        The main features of the Web Workers API include:

        • Creating workers @@ -69,6 +66,8 @@ If a worker triggers a message event, the @@ -80,15 +79,154 @@ If a worker triggers a message event, the JavaScript Performance -

          JavaScript was originally used for simple inspections and request handling. Therefore, the execution time was not an issue. However, with more advanced UI usage, the use of JavaScript code has been increased and become more complicated, significantly influencing the application performance.

          -

          Improving performance through effective JavaScript code consists of the following:

          - +

          Creating a Web Worker and Handling Errors

          + +

          Learning how to create Web workers is a useful resource management skill:

          +
            +
          1. To create and execute a Web worker: +
              +
            1. Create JavaScript code for a simple Boolean operation:

              +
              +var n = 1;
              +index: while (true) 
              +{
              +   n += 1;
              +   for (var i = 2; i <= Math.sqrt(n); i += 1)
              +      if (n % i == 0) continue index;
              +   postMessage(n);
              +}
              +

              This JavaScript operation delivers the calculated value of the Math.sqrt(n) method to the postMessage() method. It cannot be used for continuous posting of the Boolean operation.

              +
            2. +
            3. +

              Create a Web worker to be activated in the background. The JavaScript URL defining the worker needs to be delivered when creating the worker object:

              +
              +<button type="button" onclick="workerStart()">Start</button>
              +<button type="button" onclick="worker.terminate()">Stop</button>
              +<output></output>
              +
              +<script>
              +   var worker = new Worker("worker3.js");
              +
              +   function workerStart() 
              +   {
              +      worker.onmessage = function(e) 
              +      {
              +         document.querySelector("output").textContent = e.data;
              +      };
              +   }
              +</script>
              +

              When the Start button is clicked, message data is received from the worker and displayed in the <output> element. When the Stop button is clicked, the worker is terminated.

              +

              Simple operations can be sufficiently handled with a single worker, however, in order to execute a more complex operations, more workers are needed.

              +
            4. +
            +
          2. +
          3. To create a subworker, use the importScripts() method: +
            +importScripts('worker1.js');
            +importScripts('worker1.js', 'worker2.js');
            +

            The subworker creates its own independent thread, and is activated in it, so it has the same restrictions as a host worker. This means that communication between subworkers is impossible, but a host worker can communicate with subworkers within the same object.

            +
          4. +
          5. To handle errors: +
              +
            • If an error occurs when the worker is being executed, the onerror() event is triggered. It takes filename, lineno, and message attributes, and displays an error message:

              +
              +worker.onerror = function(e) 
              +{
              +   document.querySelectorAll("output")[1].textContent = ['filename: ', e.filename, ' lineno: ', e.lineno, ' error: ', e.message].join(' ');
              +};
              +
            • +
            • The addEventListener can be used instead of the onerror event to detect errors and display an error message:

              +
              +function errorMessage(e) 
              +{
              +   document.querySelectorAll("output")[1].textContent = ['filename: ', e.filename, ' lineno: ', e.lineno, ' error: ', e.message].join(' ');
              +}
              +
              +worker.addEventListener('error', errorMessage, false);
            • +
            +
          6. +
          + +

          Sending Messages Between Web Workers

          + +

          Learning how to send messages between Web workers is a useful resource management skill:

          + +
            +
          1. Send a message in one of the following ways: +
              +
            • +

              Use the postMessage() method to send a "Hello" message to a Web worker:

              +
              var worker = new Worker('worker1.js');
              +worker.postMessage("Hello");
              +
              +
            • +
            • +

              Use the JSON format to send the message:

              +
              +var worker = new Worker('worker2.js');
              +worker.postMessage(
              +{
              +   a: "Hello", b: "Tizen"
              +});
              +
              +
            • +
          2. +
          3. Receive a message in one of the following ways:

            +
              +
            • Use the onMessage event handler to respond to receiving a message:

              +
              worker.onmessage = function(e) 
              +{
              +   alert(e.data);
              +};
              +
            • +
            • Use the addEventListener() method to listen to the event of receiving a message:

              +
              +worker.addEventListener("message", function(e) 
              +{
              +   alert(e.data);
              +}, false);
              +
            • +
            +
          4. +
          5. Use the workers to execute threads:

            +
              +
            • Use worker1.js:

              +
              self.onmessage = function(e)
              +{
              +   self.postMessage("You say: " + e.data);
              +};
              +
            • +
            • Use worker2.js:

              +
              +self.onmessage = function(e)
              +{
              +   var b = e.data.b;
              +   if (b === "Tizen") 
              +   {
              +      self.postMessage(e.data.b + " say: " + e.data.a);
              +   } 
              +   else 
              +   {
              +      self.postMessage("You say: " + e.data.a);
              +   }
              +};
              +
            • + +
            +

            The postMessage() method can also execute the worker and respond to a message simultaneously.

            +
          6. +
          + +

          Source Code

          +

          For the complete source code related to this use case, see the following files:

          + +

          Multi-threading

          Generally, Web applications are built and run using a single UI thread. Since only 1 task can be handled at a time, the Web application may not respond due to the execution time of a script block, resulting in lower application performance. To solve these performance-related issues, multi-thread Web workers can be used to provide distributed processing in applications. Use Web workers in applications that require complex calculations or parallel processing for better application performance.

          @@ -334,162 +472,16 @@ function colorFilter(binaryData, pixels) -

          Warm-up

          -

          Become familiar with the Web Workers API basics by learning about:

          - - -

          Creating a Web Worker and Handling Errors

          - -

          Learning how to create Web workers is a useful resource management skill:

          -
            -
          1. To create and execute a Web worker: -
              -
            1. Create JavaScript code for a simple Boolean operation:

              -
              -var n = 1;
              -index: while (true) 
              -{
              -   n += 1;
              -   for (var i = 2; i <= Math.sqrt(n); i += 1)
              -      if (n % i == 0) continue index;
              -   postMessage(n);
              -}
              -

              This JavaScript operation delivers the calculated value of the Math.sqrt(n) method to the postMessage() method. It cannot be used for continuous posting of the Boolean operation.

              -
            2. -
            3. -

              Create a Web worker to be activated in the background. The JavaScript URL defining the worker needs to be delivered when creating the worker object:

              -
              -<button type="button" onclick="workerStart()">Start</button>
              -<button type="button" onclick="worker.terminate()">Stop</button>
              -<output></output>
              -
              -<script>
              -   var worker = new Worker("worker3.js");
              -
              -   function workerStart() 
              -   {
              -      worker.onmessage = function(e) 
              -      {
              -         document.querySelector("output").textContent = e.data;
              -      };
              -   }
              -</script>
              -

              When the Start button is clicked, message data is received from the worker and displayed in the <output> element. When the Stop button is clicked, the worker is terminated.

              -

              Simple operations can be sufficiently handled with a single worker, however, in order to execute a more complex operations, more workers are needed.

              -
            4. -
            -
          2. -
          3. To create a subworker, use the importScripts() method: -
            -importScripts('worker1.js');
            -importScripts('worker1.js', 'worker2.js');
            -

            The subworker creates its own independent thread, and is activated in it, so it has the same restrictions as a host worker. This means that communication between subworkers is impossible, but a host worker can communicate with subworkers within the same object.

            -
          4. -
          5. To handle errors: -
              -
            • If an error occurs when the worker is being executed, the onerror() event is triggered. It takes filename, lineno, and message attributes, and displays an error message:

              -
              -worker.onerror = function(e) 
              -{
              -   document.querySelectorAll("output")[1].textContent = ['filename: ', e.filename, ' lineno: ', e.lineno, ' error: ', e.message].join(' ');
              -};
              -
            • -
            • The addEventListener can be used instead of the onerror event to detect errors and display an error message:

              -
              -function errorMessage(e) 
              -{
              -   document.querySelectorAll("output")[1].textContent = ['filename: ', e.filename, ' lineno: ', e.lineno, ' error: ', e.message].join(' ');
              -}
              -
              -worker.addEventListener('error', errorMessage, false);
            • -
            -
          6. -
          - -

          Sending Messages Between Web Workers

          - -

          Learning how to send messages between Web workers is a useful resource management skill:

          - -
            -
          1. Send a message in one of the following ways: -
              -
            • -

              Use the postMessage() method to send a "Hello" message to a Web worker:

              -
              var worker = new Worker('worker1.js');
              -worker.postMessage("Hello");
              -
              -
            • -
            • -

              Use the JSON format to send the message:

              -
              -var worker = new Worker('worker2.js');
              -worker.postMessage(
              -{
              -   a: "Hello", b: "Tizen"
              -});
              -
              -
            • -
          2. -
          3. Receive a message in one of the following ways:

            -
              -
            • Use the onMessage event handler to respond to receiving a message:

              -
              worker.onmessage = function(e) 
              -{
              -   alert(e.data);
              -};
              -
            • -
            • Use the addEventListener() method to listen to the event of receiving a message:

              -
              -worker.addEventListener("message", function(e) 
              -{
              -   alert(e.data);
              -}, false);
              -
            • -
            -
          4. -
          5. Use the workers to execute threads:

            -
              -
            • Use worker1.js:

              -
              self.onmessage = function(e)
              -{
              -   self.postMessage("You say: " + e.data);
              -};
              -
            • -
            • Use worker2.js:

              -
              -self.onmessage = function(e)
              -{
              -   var b = e.data.b;
              -   if (b === "Tizen") 
              -   {
              -      self.postMessage(e.data.b + " say: " + e.data.a);
              -   } 
              -   else 
              -   {
              -      self.postMessage("You say: " + e.data.a);
              -   }
              -};
              -
            • - -
            -

            The postMessage() method can also execute the worker and respond to a message simultaneously.

            -
          6. -
          - -

          Source Code

          -

          For the complete source code related to this use case, see the following files:

          - +

          JavaScript Performance

          +

          JavaScript was originally used for simple inspections and request handling. Therefore, the execution time was not an issue. However, with more advanced UI usage, the use of JavaScript code has been increased and become more complicated, significantly influencing the application performance.

          +

          Improving performance through effective JavaScript code consists of the following:

          + + diff --git a/org.tizen.guides/html/web/w3c/security/cors_w.htm b/org.tizen.guides/html/web/w3c/security/cors_w.htm index 0abb54a..e0e2611 100644 --- a/org.tizen.guides/html/web/w3c/security/cors_w.htm +++ b/org.tizen.guides/html/web/w3c/security/cors_w.htm @@ -114,18 +114,8 @@

          Figure: Preflight request workflow

          Preflight request workflow

          -

          Warm-up

          -

          Become familiar with the Cross-Origin Resource Sharing API basics by learning about:

          - - -

          Using Simple Requests

          - +

          Using Simple Requests

          +

          Learning how to handle a simple request based on XML HTTP Request level 2 enhances the security features of your application:

            diff --git a/org.tizen.guides/html/web/w3c/security/iframe_w.htm b/org.tizen.guides/html/web/w3c/security/iframe_w.htm index 6b76ff3..1371d72 100644 --- a/org.tizen.guides/html/web/w3c/security/iframe_w.htm +++ b/org.tizen.guides/html/web/w3c/security/iframe_w.htm @@ -54,7 +54,7 @@
            • sandbox attribute -

              You can use the sandbox attribute of the iframe object to control the execution of tasks that can result in unreliable content, thereby enhancing application security.

              +

              To enhance application security, you can use the sandbox attribute of the iframe object to control the execution of tasks that can result in unreliable content.

              If an empty value is assigned to the sandbox attribute, the following restrictions are applied:

              • Content is treated as belonging to a unique origin. Access to cookies, local storage, and other pages within the same domain are not allowed.
              • @@ -92,19 +92,9 @@ -

                Warm-up

                -

                Become familiar with the HTML5 iframe element API basics by learning about:

                - - -

                Accessing Sandboxed Cookies

                - -

                Learning how to control iframe element content when accessing the cookies of the parent document enhances the security features of your application:

                +

                Accessing Sandboxed Cookies

                + +

                Learning how to control iframe element content when accessing the cookies of the parent document enhances the security features of your application:

                1. Create an <input> element of the checkbox type that enables the sandbox activation. In addition, create an iframe element with the sandbox property. To allow script execution in the iframe element content and cookie access, set the sandbox attribute value as allow-same-origin:
                  <input type="checkbox" id="chkSandbox" name="chkSandbox" 
                  diff --git a/org.tizen.guides/html/web/w3c/storage/appcache_w.htm b/org.tizen.guides/html/web/w3c/storage/appcache_w.htm
                  index e4d3520..8b5a540 100644
                  --- a/org.tizen.guides/html/web/w3c/storage/appcache_w.htm
                  +++ b/org.tizen.guides/html/web/w3c/storage/appcache_w.htm
                  @@ -41,8 +41,7 @@
                   
                     

                  HTML5 Application caches

                  -

                  HTML5 application caches can be used to store and utilize resources needed in Web applications, such as HTML, CSS, and JavaScript files, and images.

                  -

                  You can cache certain files in the browser to use them in an offline state, or define them to be always updated from the server.

                  +

                  HTML5 application caches can be used to store and utilize resources needed in Web applications, such as HTML, CSS, and JavaScript files, and images. You can cache certain files in the browser to use them in an offline state, or define them to be always updated from the server.

                  This feature is supported in mobile applications only.

                  @@ -59,49 +58,27 @@

                  The main application cache features include:

                  • Cache activation - -

                    The cache manifest file is used to activate the application cache and display cache information in the browser as simple text.

                    -

                    To enable application caches, include the manifest attribute in the <html> tag on every page of your Web application that you want cached. The following code snippet demonstrates how to do this. For a complete source code, see appcache_update.html.

                    -
                    -<!DOCTYPE html>
                    -<html manifest="tizen.appcache">
                    -   <!--Page content-->
                    -</html>
                    -
                    - -

                    The recommended file extension for the manifest file is .appcache. The file must be served using the text/cache-manifest MIME type.

                    -
                  • +

                    You can use the cache manifest file to activate the application cache and display cache information in the browser as simple text.

                  • Cache updating - -

                    -To update a cached item in the client, you need to change the manifest file.

                    -

                    -The browser checks only the edited items in the manifest, and checks whether cache update is needed. If the relevant page is updated from the server, manifest is applied as the basis even after edited items have been applied. If the update content is an addition or deletion of the defined file within the manifest, the manifest file can be edited.

                    -

                    -However, if the content in the defined file is changed, the cache is not updated. In that case, if the description or version is changed in the manifest, the browser can update the cache. -

                    -
                  • +

                    To update a cached item in the client, you need to change the manifest file.

                  • Cache management

                    Application cache can control JavaScript based on events. It can check or update the current cache status.

                  -

                  Warm-up

                  -

                  Become familiar with the HTML5 Application caches API basics by learning about:

                  -
                    -
                  • Setting the Cache Manifest -

                    Compose the manifest file to activate application caching.

                  • +

                    Setting the Cache Manifest

                    -
                  • Updating the Cache -

                    Control application cache updates.

                  • +

                    To enable application caches, include the manifest attribute in the <html> tag on every page of your Web application that you want cached. The recommended file extension for the manifest file is .appcache. The file must be served using the text/cache-manifest MIME type.

                    -
                  • Managing the Cache Events -

                    Check the cache status and manage events based on it.

                  • -
                  - -

                  Setting the Cache Manifest

                  +

                  The following example demonstrates cache enabling. For a complete source code, see appcache_update.html.

                  +
                  +<!DOCTYPE html>
                  +<html manifest="tizen.appcache">
                  +   <!--Page content-->
                  +</html>
                  +
                  -

                  To enable application caches, you must learn to set the cache manifest file:

                  +

                  To set the cache manifest file content:

                  1. Begin the manifest file with CACHE MANIFEST content:

                    @@ -165,8 +142,10 @@ login.asp

                  Updating the Cache

                  +

                  The browser checks only the edited items in the manifest, and checks whether a cache update is needed. If the relevant page is updated from the server, the manifest is applied as the basis even after edited items have been applied. If the update content is an addition or deletion of the defined file within the manifest, the manifest file can be edited.

                  +

                  However, if the content in the defined file is changed, the cache is not updated. In that case, if the description or version is changed in the manifest, the browser can update the cache.

                  -

                  To enable application caches in your application, you must learn to update the cache:

                  +

                  To update the cache:

                  1. Include the manifest property in the <html> tag to enable loading the manifest file and caching content by the browser:

                    @@ -233,7 +212,7 @@ cache_test.js

                    Managing the Cache Events

                    -

                    To enable application caches in your application, you must learn to check the current status of the cache:

                    +

                    To check the current status of the cache:

                    1. Check the window.applicationCache.status value:

                      diff --git a/org.tizen.guides/html/web/w3c/storage/file_w.htm b/org.tizen.guides/html/web/w3c/storage/file_w.htm index 55b2b65..b445fef 100644 --- a/org.tizen.guides/html/web/w3c/storage/file_w.htm +++ b/org.tizen.guides/html/web/w3c/storage/file_w.htm @@ -87,35 +87,7 @@
              -

              Warm-up

              -

              Become familiar with the File API basics by learning about:

              - - -

              Reading Local File Information

              Reading basic information, such as file name, size, MIME type, modification date, and path, of a local file is a useful file management skill:

              diff --git a/org.tizen.guides/html/web/w3c/storage/indexdb_w.htm b/org.tizen.guides/html/web/w3c/storage/indexdb_w.htm index 0336ef1..99882db 100644 --- a/org.tizen.guides/html/web/w3c/storage/indexdb_w.htm +++ b/org.tizen.guides/html/web/w3c/storage/indexdb_w.htm @@ -60,16 +60,6 @@ Use the IndexedDB.open(

              Object store is the basic storage mechanism of indexed database storage data.

              You can create an object store using the createObjectStore() method. The object store contains a list of records for storing data, and a key-value list sorted according to the key in an ascending order.

              -

              An object store can derive keys from the following sources: -

              -
                -
              • Key generator

                Generates an increasing number every time a key is needed.

                -
              • -
              • -Keypath

                Key is derived through a key path.

                -
              • -
              • Value

                Key is specified when a value is stored in the object store.

              • -
            • Managing data

              You can save and access data in the object store.

              @@ -93,20 +83,7 @@ index. You can search and retrieve records stored in the
            -

            Warm-up

            -

            Become familiar with the Indexed Database API basics by learning about:

            - - -

            Creating a Database

            +

            Creating a Database

            Creating and deleting a database is a useful data management skill:

            @@ -160,6 +137,17 @@ index. You can search and retrieve records stored in the

        Creating an Object Store

        + +

        An object store can derive keys from the following sources: +

        +
          +
        • Key generator

          Generates an increasing number every time a key is needed.

          +
        • +
        • +Keypath

          Key is derived through a key path.

          +
        • +
        • Value

          Key is specified when a value is stored in the object store.

        • +

        Creating and deleting an object store is a useful data management skill:

          diff --git a/org.tizen.guides/html/web/w3c/storage/web_storage_w.htm b/org.tizen.guides/html/web/w3c/storage/web_storage_w.htm index 3ea9421..ff79a7c 100644 --- a/org.tizen.guides/html/web/w3c/storage/web_storage_w.htm +++ b/org.tizen.guides/html/web/w3c/storage/web_storage_w.htm @@ -28,7 +28,7 @@

          Content

          Related Info

            @@ -45,12 +45,10 @@

            This feature is supported in mobile and wearable applications only.

            -

            With the setItem() method of the Storage interface, you can store searches on certain conditions used in the browser by the user. When the user reconnects, the getItem() method is called to retrieve the stored data.

            - -

            The Web Storage API provides 2 storage types:

            +

            The Web Storage API provides 2 storage types:

            • Local storage -

              Stores data to be used in multiple windows, beyond the current session, with no expiration date. The stored data is not deleted when the browser window is closed, and can be shared between browser windows.

              +

              Stores data to be used in multiple windows, beyond the current session, with no expiration date. The stored data is not deleted when the browser window is closed, and can be shared between browser windows.

            • Session storage

              Valid for only a single session. @@ -63,18 +61,9 @@ is copied to the new window. However, if the data in the new window is edited, i

            -

            Warm-up

            -

            Become familiar with the Web Storage API basics by learning about:

            - +

            You can save and read data in the local and session storages. You can also use the local storage to delete the data.

            -

            Using a Local Storage

            +

            Using a Local Storage

            Saving, reading, and deleting data in a local Web storage is a useful data management skill:

              @@ -146,8 +135,9 @@ is copied to the new window. However, if the data in the new window is edited, i
            1. local_storage_session_storage.htm
          -

          Saving Data in Local and Session Storage

          +

          Managing Data in Local and Session Storage

          +

          With the setItem() method, you can store searches on certain conditions used in the browser by the user. When the user reconnects, the getItem() method is called to retrieve the stored data.

          Knowing how the same data is saved in local storage and session storage, and checking whether data exists when the browser is closed and reopened is a useful data management skill:

          diff --git a/org.tizen.guides/html/web/w3c/storage/websql_w.htm b/org.tizen.guides/html/web/w3c/storage/websql_w.htm index 39ecfbd..848ed50 100644 --- a/org.tizen.guides/html/web/w3c/storage/websql_w.htm +++ b/org.tizen.guides/html/web/w3c/storage/websql_w.htm @@ -78,60 +78,7 @@

          You can access the result object asynchronously or synchronously.

        1. Error management

          You can handle errors asynchronously or synchronously.

          -

          The following table describes the properties that can be delivered with the sqlError object.

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          Table: Web SQL errors
          NameDescription

          message

          Read-only. Message describing the error that has occurred (must respect user language).

          code

          Read-only. Code of the error that has occurred (equals to one of below constants).

          UNKNOWN_ERR

          Constant. The transaction failed for reasons unrelated to the database itself and not covered by any other error code.

          DATABASE_ERR

          Constant. The statement failed for database reasons not covered by any other error code.

          VERSION_ERR

          Constant. The operation failed because of an invalid database version.

          TOO_LARGE_ERR

          Constant. The statement failed because the data returned from the database was too large. The SQL LIMIT modifier can be used to reduce the size of the result set.

          QUOTA_ERR

          Constant. The statement failed because there was not enough remaining storage space, or the storage quota was reached and the user declined to give more space to the database.

          SYNTAX_ERR

          Constant. The statement failed because of a syntax error, or the number of arguments did not match the number of placeholders in the statement, or the statement tried to use a statement that is not allowed, such as BEGIN, COMMIT, or ROLLBACK, or the statement tried to use a verb that can modify the database but the transaction was read-only.

          CONSTRAINT_ERR

          Constant. An INSERT, UPDATE, or REPLACE statement failed due to a constraint, for example, because a row was being inserted and the value given for the primary key column duplicated the value of an existing row.

          TIMEOUT_ERR

          Constant. A lock for the transaction was not obtained in a reasonable time.

          +

          For the properties that can be delivered with the sqlError object, see Errors and exceptions.

      @@ -145,35 +92,7 @@
      -

      Warm-up

      -

      Become familiar with the Web SQL Database API features by learning about:

      - - -

      Opening a Database Asynchronously

      +

      Opening a Database Asynchronously

      To provide users with SQL database features, you must learn to create and open a SQL database asynchronously:

        @@ -473,7 +392,7 @@ for (i = 0; i < booksNumber; i++)
      -

      Handling Errors Synchronously

      +

      Handling a Syntax Error Synchronously

      To provide users with SQL database features, you must learn to handle SQL database-related errors synchronously:

        diff --git a/org.tizen.guides/html/web/w3c/supplement/camera_w.htm b/org.tizen.guides/html/web/w3c/supplement/camera_w.htm index 538b491..9eca8b0 100644 --- a/org.tizen.guides/html/web/w3c/supplement/camera_w.htm +++ b/org.tizen.guides/html/web/w3c/supplement/camera_w.htm @@ -61,26 +61,10 @@
      1. Deallocating the camera preview stream

        You can deallocate the camera preview stream resources when the application is invisible so that the preview stream can be assigned to another Web application.

      2. - +

        For a practical example of launching and controlling the camera on the Tizen wearable device, see the Camera sample task.

        -

        Warm-up

        -

        Become familiar with the Camera API (Tizen Extension) API basics by learning about:

        - -

        Task

        -

        In the Camera task, we will walk through launching and controlling the camera on the Tizen wearable device.

        - -

        Accessing the Camera Device

        +

        Accessing the Camera Device

        To take advantage of the camera features, you must learn to access the camera device:

          diff --git a/org.tizen.guides/html/web/w3c/supplement/fullscreen_w.htm b/org.tizen.guides/html/web/w3c/supplement/fullscreen_w.htm index 18ebfe6..d449170 100644 --- a/org.tizen.guides/html/web/w3c/supplement/fullscreen_w.htm +++ b/org.tizen.guides/html/web/w3c/supplement/fullscreen_w.htm @@ -38,13 +38,15 @@

          FullScreen API - Mozilla

          -

          You can display an element in the fullscreen mode:

          -
          • With the webkitRequestFullScreen() method, you can convert a specific element to fullscreen.
          • -
          • With the webkitCancelFullScreen() method, you can cancel the fullscreen mode.
          +

          You can display an element in the fullscreen mode. If the element uses the :full-screen CSS pseudo-class to switch to the fullscreen mode, a style can be assigned for the fullscreen mode.

          This feature is supported in mobile applications only.

          -

          If the element uses the :full-screen CSS pseudo-class to switch to the fullscreen mode, a style can be assigned for the fullscreen mode.

          +

          To switch to the fullscreen and back:

          + +
          • With the webkitRequestFullScreen() method, you can convert a specific element to fullscreen.
          • +
          • With the webkitCancelFullScreen() method, you can cancel the fullscreen mode.
          + @@ -56,12 +58,6 @@
          -

          Warm-up

          -

          Become familiar with the FullScreen API - Mozilla API basics by learning about:

          - -

          Using the Fullscreen Mode

          To display and element on full screen, you must learn to use the fullscreen mode:

          diff --git a/org.tizen.guides/html/web/w3c/supplement/typedarray_w.htm b/org.tizen.guides/html/web/w3c/supplement/typedarray_w.htm index 5e84d6e..249736d 100644 --- a/org.tizen.guides/html/web/w3c/supplement/typedarray_w.htm +++ b/org.tizen.guides/html/web/w3c/supplement/typedarray_w.htm @@ -48,6 +48,25 @@

          This feature is supported in mobile and wearable applications only.

          +

          The main features of the Typed Array - Khronos API include:

          + +

          A typed array is capable of handling binary data in different sources:

          • Network protocol
          • @@ -57,14 +76,47 @@

            Additionally, a typed array can be used to manage in-memory binary data of byte layouts, and assist in efficiently manipulating raw data for complex and powerful Web applications, such as audio and video operation, Web sockets, and the File API operations.

            -

            The main features of the Typed Array - Khronos API include:

            -
              -
            • Creating an array buffer -

              An ArrayBuffer is a fixed-length binary data buffer, and a reference to the used raw binary data in the data format. It does not interact with the data directly, but creates a new instance of the ArrayBufferView object. The instance presents the buffer in a certain format, and can read and write the buffer content.

              -
            • +

              Creating an Array Buffer

              -
            • Using typed array views -

              A TypedArrayView can be used to establish a detailed data structure. To create a typed array view, you must create an array buffer and the view that points to the array buffer.

              + +

              To handle binary data in your application with JavaScript, you must learn to create array buffers:

              +
                +
              1. Create a new ArrayBuffer with a specific length: +
                <script>
                +   var log = document.getElementById("log");
                +
                +   /* Create a 12-byte buffer */
                +   var buffer = new ArrayBuffer(12);
                +   var x = new Int32Array(buffer);
                +
                +   /* Check the buffer length */
                +   log.innerHTML = "<div>" + buffer.byteLength + "<div>";
                +

                The content of the array buffer is initialized to 0. If the requested number of bytes are not allocated, an exception is raised.

              2. +
              3. Slice the array buffer to copy the buffer bytes and return a new array buffer: +
                +   /* Get slice: "1234"*/    
                +   x[1] = 1234;
                +   var slice = buffer.slice(4);
                +   var y = new Int32Array(slice);
                +   log.innerHTML += "<div>" + x[1] + "<div>";
                +   log.innerHTML += "<div>" + y[0] + "<div>";
                +
                +   /* Get slice: "6789"*/
                +   x[1] = 6789;
                +   log.innerHTML += "<div>" + x[1] + "<div>";
                +   log.innerHTML += "<div>" + y[0] + "<div>";
                +</script>
              4. +
              +

              Figure: Creating and slicing array buffers (in mobile applications only)

              +

              Creating and slicing array buffers (in mobile applications only)

              + +

              Source Code

              +

              For the complete source code related to this use case, see the following file:

              + + +

              Creating Typed Array Views

              The array buffer view shares information between views of all types, and has the following properties:

                @@ -159,72 +211,8 @@
              • DataView view types

                The DataView view types are used to handle heterogeneous data with a defined byte order, displaying chunks of data read from a disk or the network. Since the view types import the API with the same array, the DataView objects set the API to randomly read and write data from the byte offset.

              • -
            • - -
            • Using typed arrays -

              You can deliver binary data effectively in other HTML5 APIs that employ a typed array, such as:

              -
            • -
            - -

            Warm-up

            -

            Become familiar with the Typed Array - Khronos API basics by learning about:

            - - -

            Creating an Array Buffer

            - - -

            To handle binary data in your application with JavaScript, you must learn to create array buffers:

            -
              -
            1. Create a new ArrayBuffer with a specific length: -
              <script>
              -   var log = document.getElementById("log");
              -
              -   /* Create a 12-byte buffer */
              -   var buffer = new ArrayBuffer(12);
              -   var x = new Int32Array(buffer);
              -
              -   /* Check the buffer length */
              -   log.innerHTML = "<div>" + buffer.byteLength + "<div>";
              -

              The content of the array buffer is initialized to 0. If the requested number of bytes are not allocated, an exception is raised.

            2. -
            3. Slice the array buffer to copy the buffer bytes and return a new array buffer: -
              -   /* Get slice: "1234"*/    
              -   x[1] = 1234;
              -   var slice = buffer.slice(4);
              -   var y = new Int32Array(slice);
              -   log.innerHTML += "<div>" + x[1] + "<div>";
              -   log.innerHTML += "<div>" + y[0] + "<div>";
              -
              -   /* Get slice: "6789"*/
              -   x[1] = 6789;
              -   log.innerHTML += "<div>" + x[1] + "<div>";
              -   log.innerHTML += "<div>" + y[0] + "<div>";
              -</script>
            4. -
            -

            Figure: Creating and slicing array buffers (in mobile applications only)

            -

            Creating and slicing array buffers (in mobile applications only)

            - -

            Source Code

            -

            For the complete source code related to this use case, see the following file:

            - - -

            Creating Typed Array Views

            - -

            To handle binary data in your application with JavaScript, you must learn to access the binary data for reading and writing:

            1. Create new instances of the typed array view types with a general fixed-length binary buffer: diff --git a/org.tizen.guides/html/web/w3c/supplement/webgl_w.htm b/org.tizen.guides/html/web/w3c/supplement/webgl_w.htm index 24488a1..c4d3b9b 100644 --- a/org.tizen.guides/html/web/w3c/supplement/webgl_w.htm +++ b/org.tizen.guides/html/web/w3c/supplement/webgl_w.htm @@ -31,11 +31,14 @@
            2. Initializing Programs and Shaders
            3. Initializing Buffers
            4. Drawing Shapes on the Screen
            5. -
            6. Setting Colors
            7. -
            8. Setting Textures
            9. -
            10. Creating an Animation
            11. -
            12. Creating a 3D Perspective
            13. -
            14. Using Touch Events
            15. +
            16. Effects +
            17. Using WebGL Frameworks

          Related Info

          @@ -106,46 +109,6 @@ The vertex shader sets the final position of a vertex, and the fragment shader s

          You can use the three.js framework to, for example, apply light and camera effects.

          -

          Warm-up

          -

          Become familiar with the WebGL - Khronos API basics by learning about:

          - - -

          Follow-up

          -

          Once we have learned the basics of the WebGL - Khronos API, we can now move on to more advanced tasks, including:

          -
            -
          • Using Touch Events -

            Create a dice using texture, 3D perspective, animation, and touch events.

            -
          • -
          • Using WebGL Frameworks -

            Use the three.js WebGL framework to apply illumination and camera effects.

            -
          • -
          -

          Importing the WebGL Context

          To enhance the user experience of your application with WebGL features, you must learn to import the WebGL context from the HTML5 <canvas> element:

          diff --git a/org.tizen.guides/html/web/w3c/ui/animation_w.htm b/org.tizen.guides/html/web/w3c/ui/animation_w.htm index a69e9c1..c895de7 100644 --- a/org.tizen.guides/html/web/w3c/ui/animation_w.htm +++ b/org.tizen.guides/html/web/w3c/ui/animation_w.htm @@ -28,8 +28,8 @@

          Content

          @@ -48,13 +48,22 @@

          Animations (like transitions) change the presentational value of the CSS properties over time. The principal difference between animations and transitions is that while transitions are triggered implicitly when property values change, animations are explicitly executed when the animation properties are applied. This means that for animations, you must use animation keyframes to define explicit values for the properties being animated.

          This feature is supported in mobile and wearable applications only.

          + +

          The main features of the CSS Animations Module Level 3 API include:

          + +
            +
          • Using keyframes +

            You can use keyframes to define property changes complementing the simple running of a transition.

          • +
          • Defining animation properties +

            You can define various properties to control animations.

          • +

          When using the CSS animation properties, the Tizen browser requires the -webkit- prefix.

          -

          Keyframes

          +

          Using Keyframes

          The CSS animations work based on @-webkit-keyframes rules defined for specific elements. The rules can define various property changes complementing the simple running of a transition.

          If the animation only has one set of changes over its whole iteration, the rule values can be assigned with a from {} to {} rule, where from is the beginning of the animation at 0% and to is the end at 100%. If there are multiple changes required, you can define their exact time periods using multiple <number>% {} rules that together cover the entire animation iteration from 0% to 100%.

          -

          The following code snippet demonstrates how to use keyframes. For a complete source code, see animation_keyframes.html

          +

          The following code snippet demonstrates how to use keyframes:

           <style type="text/css">
           
          @@ -75,7 +84,13 @@
           </style>
           
          -

          Animation Properties

          +

          Source Code

          +

          For the complete source code related to this use case, see the following file:

          + + +

          Defining Animation Properties

          You can define various properties for an animation to control how it is played:

          @@ -103,16 +118,8 @@
        1. animation-fill-mode

          This property defines the state of the animation before or after the animation is played. The forwards value maintains the last value of the keyframe rule when the animation is over, while the backwards value fills up the first value of the keyframe rule when the animation with the animation-delay property is in a standby state. The both value covers both the start and the end of the animation.

        2. -

          The following code snippet demonstrates how to use animation properties. For a complete source code, see:

          - +

          The following code snippet demonstrates how to use animation properties:

          +
           <head>
          @@ -175,6 +182,18 @@
           </style>
           
          +

          Source Code

          +

          For the complete source code related to this use case, see the following files:

          + +

          Creating a Logo Animation

          To enhance the user experience of your application, you must learn to create a logo animation, where element properties can be assigned and changed for each element and keyframe. The logo animation is similar to the animation that appears when a Tizen device (or Emulator) is switched on:

          diff --git a/org.tizen.guides/html/web/w3c/ui/background_w.htm b/org.tizen.guides/html/web/w3c/ui/background_w.htm index 408223f..9268e68 100644 --- a/org.tizen.guides/html/web/w3c/ui/background_w.htm +++ b/org.tizen.guides/html/web/w3c/ui/background_w.htm @@ -26,6 +26,11 @@
        3. Tizen 2.4 and Higher for Mobile
        4. Tizen 2.3.1 and Higher for Wearable
        5. +

          Content

          +

          Related Info

          • CSS Backgrounds and Borders Module Level 3 API for Mobile Web
          • @@ -41,6 +46,17 @@

            This feature is supported in mobile and wearable applications only.

            +

            The main features of the CSS Backgrounds and Borders Module Level 3 API include:

            + + + +

            Defining Background Properties

            +

            When creating a background for an element, you can use the following properties:

            +

            The most common way of providing clipboard features in an application is to create an editable element, and allow the user to copy content and then paste it into the editable element.

            +

            Copying Content

            To enhance the user experience of your application with clipboard operations, you must learn to use the copy event:

            diff --git a/org.tizen.guides/html/web/w3c/ui/color_w.htm b/org.tizen.guides/html/web/w3c/ui/color_w.htm index 96021cf..b1d39c9 100644 --- a/org.tizen.guides/html/web/w3c/ui/color_w.htm +++ b/org.tizen.guides/html/web/w3c/ui/color_w.htm @@ -26,6 +26,11 @@
          • Tizen 2.4 and Higher for Mobile
          • Tizen 2.3.1 and Higher for Wearable
          +

          Content

          +

          Related Info

          +

          Content

          +

          Related Info

          • CSS Fonts Module Level 3 API for Mobile Web
          • diff --git a/org.tizen.guides/html/web/w3c/ui/html5forms_w.htm b/org.tizen.guides/html/web/w3c/ui/html5forms_w.htm index 6eaa5f6..c6d6828 100644 --- a/org.tizen.guides/html/web/w3c/ui/html5forms_w.htm +++ b/org.tizen.guides/html/web/w3c/ui/html5forms_w.htm @@ -27,11 +27,11 @@

          Content

          Related Info

            @@ -45,9 +45,140 @@

            HTML5 Forms

            -

            The HTML5 forms provide a convenient way to create consistent screens in your application for accepting user input. In the past, the Web form allowed you to accept user input before transmitting it to a server. With HTML5, you can now improve the user experience without having to use JavaScript by adding simple features, for example, email validity checks and date pickers, and using more advanced functionality, such as security checks and input value pattern definitions.

            +

            The HTML5 forms provide a convenient way to create consistent screens in your application for accepting user input.

            + +

            This feature is supported in mobile and wearable applications only.

            + +

            In the past, the Web form allowed you to accept user input before transmitting it to a server. With HTML5, you can now improve the user experience without having to use JavaScript by adding simple features, for example, email validity checks and date pickers, and using more advanced functionality, such as security checks and input value pattern definitions.

            + +

            With HTML5 forms, you can use new elements, input element types, and input element attributes.

            + +

            Creating a Basic Login Form

            + +

            To create simple user input forms, you must learn to use the HTML5 features in Web forms:

            + +
              +
            1. Create a simple form where the user can enter their login details (email address and password):

              +
              +<form action="" method="">
              +   <label>email: <input type="text"/></label>
              +   <label>password: <input type="password"/></label>
              +    
              +   <input type="submit" value="Login"/>
              +</form>
              +
            2. +
            3. To check the validity of the entered email address automatically, add the required attribute to the input element with the email type:

              +
              +<label>email: <input type="email" required /></label>
              +
            4. +
            5. Define the password field as mandatory by using the required attribute in that input element too:

              +
              +<label>password: <input type="password" required /></label>
              +
            6. +
            7. Because a device has limited space on the screen, remove the field labels and replace them with hint texts using the placeholder attribute:

              +
              +<input type="email" placeholder="e-mail address" required />
              +<input type="password" placeholder="password" required />
              +
            + +

            The final form that checks the email validity and requires the mandatory password input is complete:

            +
            +<form action="" method="">
            +   <fieldset>
            +      <legend>Login</legend>
            +      <input type="email" placeholder="e-mail address" required />
            +      <input type="password" placeholder="password" required />
            +   </fieldset>
            +    
            +   <input type="submit" value="Login"/>
            +</form>
            +
            -

            This feature is supported in mobile and wearable applications only.

            +

            Source Code

            +

            For the complete source code related to this use case, see the following file:

            + + +

            Creating an Advanced Login Form

            + +

            To create advanced user input forms, you must learn to use the HTML5 features in Web forms:

            + +
              +
            1. Create a login form that checks the email validity and requires the mandatory password input:

              +
              +<form action="" method="">
              +   <fieldset>
              +      <legend>Login</legend>
              +      <input type="email" placeholder="e-mail address" required />
              +      <input type="password" placeholder="password" required />
              +   </fieldset>
              +    
              +   <input type="submit" value="Login"/>
              +</form>
              +
            2. + +
            3. When the form page is loaded on the screen, put the focus automatically to the email field by using the autofocus attribute:

              +
              +<input type="email" placeholder="e-mail address" required autofocus />
              +
            4. + +
            5. +

              To spare the user from filling in information that they have given previously, use the autocomplete attribute, which shows the previously successfully inserted entries in a datalist, from which the user can select and use them.

              +

              You can apply the autocomplete attribute to a specific field by adding it to the appropriate input element. If you add it to the form element, it applies to all child elements within the form.

              + +
              +<form action="" method="" autocomplete="on">
              +
              +
            6. +
            7. In general, apply the autocomplete attribute to the form element, and then separately set it to off for those fields that must not use it.

              +

              In the following example, the password field must not use autocomplete, to prevent unauthorized access by any user.

              +
              +<input type="password" placeholder="password" required autocomplete="off"/>
              +
              +
            8. +
            9. Protect the password with private and public key pair using the keygen element.

              +

              The element is used to transform the data sent from the connected form to a pair of encrypted keys using the RSA (Rivest Shamir Adleman) method. When the input data is sent from the form, the private key is saved in the local computer, and the public key is delivered to the server. Only if the keys match, the login process proceeds forwards.

              + +
              +<keygen name="keyvalue">
              +
            10. + +
            11. Use the pattern attribute to perform a validity check that ensures that the password field value matches the given regular expression. The required attribute is used to ensure that the field value must be entered and then the validity check can be performed.

              +

              In the following example, the password only accepts numbers and letters of the alphabet. If an invalid value is entered, the login cannot proceed.

              + +
              <input type="password" placeholder="password" required
              +       pattern="[a-zA-Z]+[0-9]+[a-zA-Z0-9]*|[0-9]+[a-zA-Z]+[a-zA-Z0-9]*" 
              +       autocomplete="off"/>
              +
            12. +
            13. Define the required length of the password within the pattern attribute.

              +

              In the following example, the password must be 6 to 12 characters long.

              + +
              +<input type="password" placeholder="password" required 
              +       pattern="(?=([a-zA-Z]+[0-9]+[a-zA-Z0-9]*|[0-9]+[a-zA-Z]+[a-zA-Z0-9]*)).{6,12}" 
              +       autocomplete="off"/>
              +
            14. +
            + +

            The final form with autofocus and autocomplete features, strengthened security, and password value requirements is complete:

            + +
            +<form action="" method="" autocomplete="on">
            +   <fieldset>
            +      <legend>Login</legend>
            +      <input type="email" placeholder="e-mail address" required autofocus />
            +      <input type="password" placeholder="password" required 
            +             pattern="(?=([a-zA-Z]+[0-9]+[a-zA-Z0-9]*|[0-9]+[a-zA-Z]+[a-zA-Z0-9]*)).{6,12}" 
            +             autocomplete="off"/>
            +   </fieldset>
            +
            +   <keygen name="keyvalue">
            +    
            +   <input type="submit" value="Login"/>
            +</form>
            +
            +

            New HTML5 Elements

            The following table lists the new elements available for your forms in HTML5. For a complete source code, see elements.html.

            @@ -281,139 +412,9 @@ Granularity expected of the value, limiting the allowed values. - -

            Creating a Basic Login Form

            - -

            To create simple user input forms, you must learn to use the HTML5 features in Web forms:

            - -
              -
            1. Create a simple form where the user can enter their login details (email address and password):

              -
              -<form action="" method="">
              -   <label>email: <input type="text"/></label>
              -   <label>password: <input type="password"/></label>
              -    
              -   <input type="submit" value="Login"/>
              -</form>
              -
            2. -
            3. To check the validity of the entered email address automatically, add the required attribute to the input element with the email type:

              -
              -<label>email: <input type="email" required /></label>
              -
            4. -
            5. Define the password field as mandatory by using the required attribute in that input element too:

              -
              -<label>password: <input type="password" required /></label>
              -
            6. -
            7. Because a device has limited space on the screen, remove the field labels and replace them with hint texts using the placeholder attribute:

              -
              -<input type="email" placeholder="e-mail address" required />
              -<input type="password" placeholder="password" required />
              -
            - -

            The final form that checks the email validity and requires the mandatory password input is complete:

            -
            -<form action="" method="">
            -   <fieldset>
            -      <legend>Login</legend>
            -      <input type="email" placeholder="e-mail address" required />
            -      <input type="password" placeholder="password" required />
            -   </fieldset>
            -    
            -   <input type="submit" value="Login"/>
            -</form>
            -
            - -

            Source Code

            -

            For the complete source code related to this use case, see the following file:

            - - -

            Creating an Advanced Login Form

            - -

            To create advanced user input forms, you must learn to use the HTML5 features in Web forms:

            - -
              -
            1. Create a login form that checks the email validity and requires the mandatory password input:

              -
              -<form action="" method="">
              -   <fieldset>
              -      <legend>Login</legend>
              -      <input type="email" placeholder="e-mail address" required />
              -      <input type="password" placeholder="password" required />
              -   </fieldset>
              -    
              -   <input type="submit" value="Login"/>
              -</form>
              -
            2. - -
            3. When the form page is loaded on the screen, put the focus automatically to the email field by using the autofocus attribute:

              -
              -<input type="email" placeholder="e-mail address" required autofocus />
              -
            4. - -
            5. -

              To spare the user from filling in information that they have given previously, use the autocomplete attribute, which shows the previously successfully inserted entries in a datalist, from which the user can select and use them.

              -

              You can apply the autocomplete attribute to a specific field by adding it to the appropriate input element. If you add it to the form element, it applies to all child elements within the form.

              - -
              -<form action="" method="" autocomplete="on">
              -
              -
            6. -
            7. In general, apply the autocomplete attribute to the form element, and then separately set it to off for those fields that must not use it.

              -

              In the following example, the password field must not use autocomplete, to prevent unauthorized access by any user.

              -
              -<input type="password" placeholder="password" required autocomplete="off"/>
              -
              -
            8. -
            9. Protect the password with private and public key pair using the keygen element.

              -

              The element is used to transform the data sent from the connected form to a pair of encrypted keys using the RSA (Rivest Shamir Adleman) method. When the input data is sent from the form, the private key is saved in the local computer, and the public key is delivered to the server. Only if the keys match, the login process proceeds forwards.

              - -
              -<keygen name="keyvalue">
              -
            10. - -
            11. Use the pattern attribute to perform a validity check that ensures that the password field value matches the given regular expression. The required attribute is used to ensure that the field value must be entered and then the validity check can be performed.

              -

              In the following example, the password only accepts numbers and letters of the alphabet. If an invalid value is entered, the login cannot proceed.

              - -
              <input type="password" placeholder="password" required
              -       pattern="[a-zA-Z]+[0-9]+[a-zA-Z0-9]*|[0-9]+[a-zA-Z]+[a-zA-Z0-9]*" 
              -       autocomplete="off"/>
              -
            12. -
            13. Define the required length of the password within the pattern attribute.

              -

              In the following example, the password must be 6 to 12 characters long.

              - -
              -<input type="password" placeholder="password" required 
              -       pattern="(?=([a-zA-Z]+[0-9]+[a-zA-Z0-9]*|[0-9]+[a-zA-Z]+[a-zA-Z0-9]*)).{6,12}" 
              -       autocomplete="off"/>
              -
            14. -
            - -

            The final form with autofocus and autocomplete features, strengthened security, and password value requirements is complete:

            - -
            -<form action="" method="" autocomplete="on">
            -   <fieldset>
            -      <legend>Login</legend>
            -      <input type="email" placeholder="e-mail address" required autofocus />
            -      <input type="password" placeholder="password" required 
            -             pattern="(?=([a-zA-Z]+[0-9]+[a-zA-Z0-9]*|[0-9]+[a-zA-Z]+[a-zA-Z0-9]*)).{6,12}" 
            -             autocomplete="off"/>
            -   </fieldset>
            -
            -   <keygen name="keyvalue">
            -    
            -   <input type="submit" value="Login"/>
            -</form>
            -
            - - - -
          diff --git a/org.tizen.guides/html/web/w3c/ui/media_query_w.htm b/org.tizen.guides/html/web/w3c/ui/media_query_w.htm index 89e4c2e..ce04b6c 100644 --- a/org.tizen.guides/html/web/w3c/ui/media_query_w.htm +++ b/org.tizen.guides/html/web/w3c/ui/media_query_w.htm @@ -44,7 +44,7 @@

          Media Queries

          -

          Media queries allow you to apply the CSS differently according to the media type (type of device) and media features (viewport status). Previously, you were able to use the media type only and create Web services with fixed layouts. However, smart phones, tablets, and other devices with various resolutions require a liquid layout. HTML5 now makes various characteristics and conditional defining possible, and can be used to implement responsive Web design (RWD), which is a liquid layout that mainly reacts according to the device resolution.

          +

          Media queries allow you to apply the CSS differently according to conditions based on the media type (type of device) and media features (viewport status). Previously, you were able to use the media type only and create Web services with fixed layouts. However, smart phones, tablets, and other devices with various resolutions require a liquid layout. HTML5 now makes various characteristics and conditional defining possible, and can be used to implement responsive Web design (RWD), which is a liquid layout that mainly reacts according to the device resolution.

          This feature is supported in mobile and wearable applications only.

          diff --git a/org.tizen.guides/html/web/w3c/ui/session_history_w.htm b/org.tizen.guides/html/web/w3c/ui/session_history_w.htm index 5fc982a..6d7440f 100644 --- a/org.tizen.guides/html/web/w3c/ui/session_history_w.htm +++ b/org.tizen.guides/html/web/w3c/ui/session_history_w.htm @@ -43,13 +43,10 @@

          HTML5 Session History

          -

          You can manage the session history of browsing contexts.

          +

          You can manage the session history of browsing contexts. The history interface is used to save in the session history the page information that has been read by the user. You can also use the state object to directly store the page information which has already been analyzed in the URL, or general information which is not stored in the URL (such as location, or the scroll state of the page or a certain DOM element).

          This feature is supported in mobile and wearable applications only.

          - -

          The history interface is used to save in the session history the page information that has been read by the user. You can also use the state object to directly store the page information which has already been analyzed in the URL, or general information which is not stored in the URL (such as location, or the scroll state of the page or a certain DOM element).

          - - +

          The main features of the HTML5 session history of browsing contexts API include:

          • Adding entries to the session history diff --git a/org.tizen.guides/html/web/w3c/ui/text_module_w.htm b/org.tizen.guides/html/web/w3c/ui/text_module_w.htm index 71dd1e8..3e8f382 100644 --- a/org.tizen.guides/html/web/w3c/ui/text_module_w.htm +++ b/org.tizen.guides/html/web/w3c/ui/text_module_w.htm @@ -26,6 +26,10 @@
          • Tizen 2.4 and Higher for Mobile
          • Tizen 2.3.1 and Higher for Wearable
          +

          Content

          +

          Related Info

          • CSS Text Module Level 3 API for Mobile Web
          • diff --git a/org.tizen.guides/html/web/w3c/ui/transform_w.htm b/org.tizen.guides/html/web/w3c/ui/transform_w.htm index 722a3b3..9d43128 100644 --- a/org.tizen.guides/html/web/w3c/ui/transform_w.htm +++ b/org.tizen.guides/html/web/w3c/ui/transform_w.htm @@ -28,12 +28,11 @@

          Content

          Related Info

          @@ -49,15 +48,29 @@

          CSS Transforms

          -

          Transforms allow you to modify the coordinate space where each element is positioned. The elements can be translated, rotated, and scaled in 2- or 3-dimensional space. According to the API, the coordinate system is a visual formatting model, and positions and sizes in the coordinate space are expressed in pixels, starting in the origin of point with positive values proceeding to the right and down.

          +

          Transforms allow you to modify the coordinate space where each element is positioned. The elements can be translated, rotated, and scaled in 2- or 3-dimensional space. According to the API, the coordinate system is a visual formatting model, and positions and sizes in the coordinate space are expressed in pixels, starting in the origin of point with positive values proceeding to the right and down.

          This feature is supported in mobile and wearable applications only.

          + +

          The main features of the CSS Transforms API include:

          + + -

          To enhance the rendering performance and user experience, you can use hardware acceleration and create fade effects.

          When using the CSS transform properties, the Tizen browser requires no prefix, the Firefox browser requires the -moz- prefix, the Chrome and Safari browsers require the -webkit- prefix, and the Opera browser requires the -o- prefix.

          -

          Transform Properties

          +

          Defining Transform Properties

          You can define various properties to control the elements within the coordinate space:

          @@ -122,7 +135,7 @@

          In addition to transform properties, you can also use various 2D and 3D transform methods.

          -

          2D and 3D Transform Methods

          +

          Using 2D and 3D Transform Methods

          The CSS Transforms API supports various transform methods in 2D and 3D.

          diff --git a/org.tizen.guides/html/web/w3c/ui/transition_w.htm b/org.tizen.guides/html/web/w3c/ui/transition_w.htm index 59618b6..fd62e0d 100644 --- a/org.tizen.guides/html/web/w3c/ui/transition_w.htm +++ b/org.tizen.guides/html/web/w3c/ui/transition_w.htm @@ -28,10 +28,9 @@

          Content

          Related Info

            @@ -44,13 +43,24 @@

            CSS Transitions Module (Level 3)

            -

            Transitions allow you to enable implicit transitions, which describe how the CSS properties can be made to change smoothly from one value to another over a given duration. To enhance the rendering performance, you can use hardware acceleration.

            +

            Transitions allow you to enable implicit transitions, which describe how the CSS properties can be made to change smoothly from one value to another over a given duration.

            This feature is supported in mobile and wearable applications only.

            +

            The main features of the CSS Transitions Module Level 3 API include:

            + + +

            When using the CSS transition properties, the Tizen browser requires the -webkit- prefix.

            -

            Transition Properties

            +

            Defining Transition Properties

            You can define various properties to control the element transitions:

            diff --git a/org.tizen.guides/html/web/w3c/ui/woff_w.htm b/org.tizen.guides/html/web/w3c/ui/woff_w.htm index 44276d7..6044dca 100644 --- a/org.tizen.guides/html/web/w3c/ui/woff_w.htm +++ b/org.tizen.guides/html/web/w3c/ui/woff_w.htm @@ -26,6 +26,10 @@
          • Tizen 2.4 and Higher for Mobile
          • Tizen 2.3.1 and Higher for Wearable
          +

          Content

          +

          Related Info

          • WOFF File Format 1.0 API for Mobile Web
          • diff --git a/org.tizen.guides/index.xml b/org.tizen.guides/index.xml index ece2ea2..9c9f37c 100644 --- a/org.tizen.guides/index.xml +++ b/org.tizen.guides/index.xml @@ -22,7 +22,7 @@ - + @@ -248,13 +248,14 @@ + - + @@ -266,8 +267,9 @@ + - + @@ -276,9 +278,8 @@ - + - @@ -291,7 +292,7 @@ - + @@ -421,7 +422,7 @@ - + -- 2.7.4

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ξ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≫⃒1ydbhnHbA6yp>{}rxo$FQy=5HkEOw={z_ zXoz{)Ss}nCkr8WSgj@l4Wntw6qswwHNKWI5`-d5h;8un`1tErSOrO+SWLoxC``(|N z_3cyG`72iHK;D&s1C|Mj2`2TmHfPct{_o0hZ?J;&1`~GUOB%HQfsX*NYtL7b`5*E` zuCBzZ*y!Y!Dm%!_<0^EXqus&aD7180$7JnQLU_|d1zjhv}j)nX6JiWSAG6R#8fCw#b zKvz5iasAZ}jeT{Jd*o?7@R}U=fOtQ3ccLG zCr2X18c6^JUjBV3OUXff4?$E9K|ueY{(yd}2Vj0ce?f15!4A+k7YOd@FSrL5Gy?k@ z3kn{tPI#cRo}ja_U_%SFmRbxw!=J=Tu(qqQ zc3X|a&B$MOJwZ=n!Pbf_O--dtHAM#cqJ;Cj+(S%3>XzX{!>#QbMJ9 zjxh5hvEdX?BV}{7$+D6!ss}K~Gv(HY^BmW6j@9O?7GUIh%cMd=LMm-XkM5Q_J7ha6d22v(wJZV*E3jZfY{sS+0_w5wKiPWiJ^{-Oa-|nrd=!Srw`+NmZRI zr8&BdXCn+ZPvy*zb@Z5SYueE)2(Bt);trjF@lQs;go@?5lG#m~SPvSBKal9aolFEvnWXZgS6+)%EJ7+fUV8# zGwqc7p@2$;jMV$hfbS~PncN&V$@a0C{2Uht)mwlxf~VugL57UX$H(5q^7;|at)-QE zb-Y*6qs=oNo%^wy2W!n_kMqsz#CPEr&kKnR(!BR0+waeKJ`EUzHgjH#hQ>nMSYMv# zrr-V=Jua(KwNEp@luAu6Jjl43ZKfsyz0Rh3I5Lu-mja5)GcujepSRzIc)UK(fXAiX z9}gnUB{2MdKNnuOkmda_Q-=>nlC|W76)&2f>jbzK4$K zUjSY{+qZ*YH@WopE;5PdcJ>SB{U=^T0~NO3o8mcV!QS=IKu*qU^LPX}HtzYnatsgN z&(c-WFKU z?m#SFXN!$)nHi0D2M2EBW9yIlPkxiv|7lOI^N=y<%hMj{y!DFYF$az0^}RgigpxdU z_97EE-FHM*wqAD#tMcDCA0=iS-ybHALHVFp@hs^&&c!FOk@e6!iSZzk)5mpTOA`0O zo1938wI}LXpzMwNt4&rrta4H8{ytn{1^WQo@i4$9SoB^y`_K-{Op0i$7LB}mm zK}3+ZtQRfNzI#7_2l~)YboMAX-|RKxaTnPHy~(j+UAxK|1Mtq=_ylo7pXBe{JQr-o zBe|h(@^{F@ryghIFL%7m_Zi~I&=-lfW|C7cXty7Uv%@}wn9%jj!0*hZ;VpyYuKg@J z8^Fu|=mQk<+OzFoe}3%`0^Q%A2mR4L4}2jfaYwfRY*LbBsVaD!2WJCvh)EtNw){w3 z?e59tFjw!kCtBsuJ+Fg(o)qLT-8W~}fpQogk24csS%By6bw@#_naW#%96)!xKmi=c z@7DBIEqCL!dp&_Sj_z@BJ+UVX@VGtjVaOo9zkENX6Fp8fW-};;yPvKs6pV-Qo?j0D zWy4pzT<^CE0ztNB`)dV({I;&!v2u|fyCa;K_vlIQ_ofSi_}{Jv@WvzDAHG_)+gaWJ z+Y=+^m0E`KfgWqo3;^2rPpxP<&<4iK*(+zKeHt)wo1N3S6gaTWcWWFY`(nplScjkG z+GS??-q|mci|xJx=LIlvCS>jURwVdrcE`8&HYxtZ|7-$njlA*NuUvz=H0;5HPM_Ah zU(UR8-&z4Tt$X4gXRiw5&0Z3!{)a(YXJ&Kn&GgWn0eQB)<9Tg3A_5&ZJ!Q8wlN>fa ziEBaL3h(#;H_)r|j%Jch#4jy-(XchpyDgtP5VOGiPIUGiKeK=3eMW!asfz;&a!U}A z)186e!d07i(0fPfThv33KJ#$c=K}y*jpyFJd%g4A+`8jEzqs?b#5wa?_klpYpsRPQcV$l? zr@MXy60i9eK+9I!6Vw*kzZQHV4tj0(xW;)~_Q-VZ_sDdAFE0JSw(~LMw(GL@hPW$e zce(?&d)|TDobC#UTb_IvTK0bFxW3`FIgRhNJB@=$+~4cC-|e-%mN9rlogLuEhrsYmWs zPGpUN8#Kpx;pL*g8T2YL{!-uyvMqk{`Nfy%TDkmHVI{1%=0iDR>06u5WbE!S# zcDslron{!6&g~9A@Ff20=3?h~dUsJ^>dhiccP0 zUt6{)#`b_9N6*7pJgTC?_X*pjrU2xj_vnN6iv$FE2)@F3Uv<3JkGFwiQ@)>7PuKgc;C_B5t7C(OjLxwOxA6$5m(`^K z7L$)s&S?<0!^Pul0^$5qUm!A- z_)|Y}zcG+%x1iscDk#72slO6zVdDB1Y>^8wYw|K{vNvq7cdp3GIguXDvsY!vG;g%I zO=d|f*D^aYvpzbtI5|8fJUk=bKOs0iBHnLz&$)3uiYH9BOox9-hxZ_QX;tM}<_SUy z%Flo7>sNPeqKDM#n3y*&EG|w>uX0a#<&@W3R-CzuF9XIipVkfv+8~EBfK2|E^M`5> z|I;-&9{uzFadJVqcI(Wf%WhxzZT1GZ$+Zjvoo{;aYNmD$XkEj%x@MnWdSsz7|4^0z zc73G30i>Vo^G{FOI~qP8jIDv29_4h*LCZ@Q3p@Y3&U+Tm(zx%QzziO5c1Mxc*ZhlY z4#klB;I-&0;aIu5aL_8pt>N9k*2zm`9maEm(HSph`(0D)_r> zul;T}&U8rrHnE?t(s(SquB)Hjl~?u6cAlkKx}66PL%HpDniH4a_U-NCrLLX+iT#NW+H6a?>%KaE_zV&|Z1^ZS9|NipfwVanF%=LU~U|t?iyv?C_ zYgn$SFR`!P*3lQUjrVe$r8^Q(p8lUHW-g_nidSE>%TY#ep`E;JlC0LwT5V_R zdNDO~nKzgx6^oWgg-ahcnn94_s;~RL=x*b9;6&a)y#l@VSl2ZQBD4T;3+=y~$ymPF^wxu*6gnvkeq*=?!MxGY@SQFhF6 ze55{H_I8vWW2D?cnyw~Xt~NsY{dlK8zH+&KJTI-cEwn3gmg*dq>ezoYTT;X1)hw}S)!jHb(^tRHXs(Vl zXrzv$uFONtQ_WK~Qjb#2hiRmS|8Y)E?ayqFJU`!GUr*dG3|t$&E!;oQs1kb~4qhdW z>zFsYzGp6KOc-u|>-TytJ$t*j%jA3!kL0^~>3@%XGm~uXeizyH5af0K(og)-i6iHE zHwkQWI~=)_)wzE?2nF#@U*^~+W}fb!B&jv9vO4BNYRqj*!AAewT>crE-P|!a@y;wk zJdAgW)+&KKNXz-VJO#Vum~y-8G#d_h{X6ce^v7oA-2n-NaF~ z`X86Ywvzy7acrHj+|pNx)Eoly zn0la#xo>?R%Ps<6O+KP|N`3!(h&`?}Ch=+KMy4p{CTwH#k%o`c%lfYUWoyLK-1=to zWpgB|fjEaILWB`C@Jud@Q~+RHbS`UJRN$r}v}~b`TzeIp-ugUoPC;lG$;(K%p^i*@ z8N1vXwU98i>jvZXklX9?a`;I6&Gqc;^-V3hlQwi<<@X*pJM+nrNp5+$-Td6t{QPw3 zk>;LQzB&1HYx2SB<`d+;Q_Is(6<_Ml^mkJ-y3+H@z}y~X%2Jw`ye|=_k98!R)XUWl z{qnTJtl>3fl*)91c|bP0975i@6#9KvvFWLh6r~w0wMFb5I&JNp9wS-xVTt9xBi}>J zOzI2}eTYP5O_Nz}#h~%L!J8Efl#FE{S;c4I{=>)hR=?Ju%fhm5u4EjVG&% zrRm9~s|Tg`+bZt*$a7i3n7plCG{P=?!-sG5k>?zjUvrG8YqU_P_ zbul|#^2O$iW2iL1!nT`dv|Kht;zz8lE!>%J{j%(+1rTgd6tKGO{uKk0jcAXmE;c7M zxbw#O%&f%C^dH#8&B@FRV(Vm>l^) z3^whL*T07bKr@xgd=bb`yGo+1RfRR8^_8-?<>R*CFV@kM)Lw%i)`gna}7=ZbRr2c`8|uqE8=s z-Q$Lv1WlZ?HxYf0>?2ZZRvUIUDVV0i)oNB}(=AsQr_y9FH1KML$6ZlVF=c;`Md(=< zj)mx#|F})DC?7cedrUtt=DSV%XRKwv%I;iaTye4+aZ*D>at)gYU!%oL^cI%_qH?`U z36cGK6yR4N3J&@Fg<6wMW$YQ${?l<@87yo+=K$8aV`sBg>#QCN+m=1QHTg+0oW$}^ zBY5@x`p_w6JnZTb-#Wr@L=SVTc`}t=`!KeF%m3EgCiB=LUVDSuCOIg&3i{#C}f|L8`Fg|S{w`ot2$LFYzlBV^N$ z2#K<9p6(bwfOGE2m`2OnN&mQ(+*jL^7r!FenT++-0*Kf$lz~+e9X1nly?!B~f9l#1Qs}eCLE6 zs%+odUy<6}hHLD>ZrEezI8bOPP4iX^izGwOuQyGHk-wXz)Exlp6N`g2B>uo1OM=&` z&C$Ubran>^(!mCmBX(k6wj37pDttioZH ziruD^Nh59Y&1g@< z?Qi_W9vN~FohZ2__@tpy1A>n>8$b~})=k|kPI!C~a9I80 zw3FLZ+n0KECrhjaxEu0qZ(Kh*Jvdp{KTac7p&FL9)qGY^i7bIETXIuJU^@S0hq3jL z;7y)I;VI1CJCvVOIE`gUV^qQYXAM(fPN+qS_R`f3X+@Qf21<3WMdJs@AIgV2`gu__ zJ1g#4V7{*%Zln`Z&GdVX&M0uTj4)a%xI>cn*#gENBo>su&&R@%xNo8_+9?&`-2sZ9 zf@b?X8{5Q{&Ev8wWndkuqCW;;=}FL#PslZTcHP8UMcMh~;`L}*&)XVAv>)B`%-B={ zC6O!02|Nj#>hqh;1M96C^~G%3ljYTb=fI6B~T!*XJcUckhH~$ zlFo0(e!*u_;9p4XP)@KN{KIDv%r~ns)xw4`6$B{&c-OD7^3D_sA+O&{P7>pd*uoAX z=ED#6ChgovP7G*Zb!3Mz4J3P{HSR(i??Ab z*h%uKi|K|ccsvCuo z>;=1-dX{=jt4#U`;n}0>dh;S_;&}W}z|Xwj^mu}zWl@gbbkH`8jh-MCDcyP(FMOwZX3gtA+f?wlrJ9-DmSxzMglG)A^a-F{(b4fNR+f=N^Y6MPwn zD=l)o!qzP0W8kdzZ6(dpV+a8v`hB3(Oj!Bstne{#I$2mzK$uj;Hk_Kg<%G9#PlQ*n ze6yr*Eak)a!Ml(P*z?mLOp)D;T`|*SQ^&UK5O3cr@yhh`%sxhBxbX1xv0i|8xYTRX zcI2Pe!cSqSuZ8R3A1DNId_iNs+%z4;L?M45Pb^j>d$$Eeu-)t#m9~@#M%FS;>z9Lr z69Ju~HwhGghwQ~{1%r`Q!I#H%u2^rZo%apKa>Vl2L&)&~lOou3hFs&?yxR3?QVsaG}shK-6Rrtx5(C<&zp5LI|1& z(L%Mn32pG{2YS{rTEcI^0#lNtV7~+ccHNDidWCs2;zN>~jo+5dLt4w0CIlKLi~>*@ zT5DN=-Mge}6_PxCgkLzjKUoW+>xuh78LiQ6UA=zlT!s8kH~M+q->WM^Y76gd(83{x zk;EjzK!Rxx*Y;5-0U`7ZPKcDXho{?@Cy;>%PwrOtltalnJPj4YEtJ_1tCG-<#En|7 zU0fA~UD3wX^tM-!?CB;qs?)-Kp1dWPhKa`DH{~S!EO{DRS8`5a99I%E4>qgcWnJ9C zJILsprK&aA!nOIQ=dAEBNv8#jqAv`HY{gL4a?=pruy0lqE>tHqt)3b{YL>I z5?TDhPJgaA<~{{e586Dr+;GIT#VDbn21a96L6hQo%Sl`#w|cD?%S ziIH{zjH+Rmz0|7cs37R9hxmoXqCLX=XhUwLt$@TM5|`s)ox%XOl3&Du;wRH*KL;6 zef>g8I2Kk|BnIvTrogF3lMnYr=2jd3L9s^_yl=C8VwEJOW&$62oYc+K>X<+ zU;cvit}Su7zlHr8u``5LcVQhS(ujkYb$Y|oa@ZPJzCU9OXE}U6_4vz)|Ll_;_qLFFM-vT3mQ$W zMZ)jFNdT>edT9DAH%(62)QAvOEU|BX(CP~00EZ2%VBUaf9ME#9?_ESm9W5+1Pfl5e*y zg@9dgTs05{^zFli>+Ja)x|i~u3M+|^=j!=9I#|*kPbty3FX@!5Tuzd8bRoWKIaU_A zyBs9L7H8XMEBd*`-?$I&a}#{o<8o06W{N9Q(1s~jHPGlf-=QX`lWT?zK313? zS(w3fJWNE-5sAFjteia8CF6^$@fhUFvn|f3vqb*K-iKa`?4&FE4D1fYCDhf31F;oG z0aCDf41DFK5|j-t5}ULnXYU+yM>qjSlJ2wqxT7$G&Inwidd|WEP46lO#)^1Y!E8_gv|1!*1FuRS*o5 zoN6O1^rI12`r)|{i_#$zPAS%yE@j0L;ROxslFyUsRL|1uLDUU@7-<)2C<48w)w=$D zlF+obaMaUG4Tv4-UM$AEwj^5jaf#iezK_%k>qyWq4n3_D`UOvXNydBLqCXn@RGXZT z!on-W8ScIHwTJ{|#pYD=Mq{p9lrHU;hp!A7O6PLeuH3)ZxJ{YiZQksVIQZ{hA1l&x z{<6rT@!yxN8dZQFmg^$PFc9dAPeV@2r_oc}v!;%5X?I! zfbVkC`Ns}Le{LV&#?7YGs9#u29ZD>6Om$2hZXNrCaS5=Pijnk38LWqYGewz8(v^|2 zY40Hx3vs!Y9Tfu0EYY7=hh}S_prLr)2-U(~B_rcE>dy^7*{ypc_`<%dF;CY892Yo8 z5IeiB?~{Frz+I@4YhyA};|v?BbQxz7W*9*}PpfU!_h@%;{>{Z%GI#gWQQa*o0J-Jk zxo2t1FoX6b+9rJ@#aoil&{uAT_n4Yh-mU^H$$n5Q6;K;DFR4mhwGxfBElB<1DwF1t1dGrw|@P-U+ zj^26Np{@wq>vX}~h#AwViYun0sgov?07T|W5<8Ck`>kRS(!np=Fl0?UB`;C?c}GBi zb1Q9*uBkjREp-{fUoLJ|>Xf(>)Ja(5Za798Bt)=)4U(ueLd2(!UljxcoHt#QoIh(6 zLGrOcHhP9&?1>MuZh?&Cg`CZFmW~2|4FfJ@x2CBYPtJ~I4}zt|_`0Q-zMI^&c=qP$ zlkd!EH+~Go62|avCjZMq!72Q0b!HCe>KB8N@y?-Eh78)wOIwRM z>RJ_ihG<{mIzUux``+{L6ghINvn!ZZvl(oVjR03Hz)P0!#uME&7$Y{Xf}Mv$-h6i1 zd<4~z9LOw4(zIWxoC&kJew&Lh28mRqm*9JjxX4b!SkM>kQ_Bts-sY5@eeTl#e5hLD z-HM|XQi2scwn0l%cGO&)JVCowAv&!{t5K~*fIH(z8VHyANrvoFO=W}`5`}H4;iLt$ z^K(yP5PtdT78Ktn*jTAkd^U;go~HuiyeNdg|B?m>teyDip@D8O=2!U+iEPTr3)YF{ zduN#aDYI-ryXB!*)Jef~>O5rc=&r7-Hf{dbpqSDqeXlp;H)@QNEiZKKHmk1a6BS^K zg;IKW`$OOx;emz5ZGx$f-cmW&zouq=EDKIzRRT|+e8t6AWg?B=nnTI>U$8%kn@$Gg z`!XtG`CyhXd;5*|d7)pWspBF5Dn6raj5{^Uz9#pYUqhmMEwh0|uo)%<)H zGntTB9t?J@tv^Q2H=wl{0Y;$Ve$Uj ztyD(~J;A#>n%P$U#teqJkVZ3pT4UH^f=0Xb4{fQJEB@kAhcM^_06xNdg(d?B%gGZ4 zr;*N%jc@nCWL58UTO!_G%!P^*)yP6VGnPUaID)8D#HCk(B-5Zng-(u22h zxKp`FIdGNXRh&LrsZ^qPR&{QJ3J?uJOR^!mDCN+Nd)NviAo4Blaa6|>_?^5Z>$ylr z%O$d#hDvpzC4`d|Ku^*@~)3{jxqH-<=yXSYI1=6i=owH?cT@es#fie#H$_ zV9r$PrXEc3Mbod>m+t)do$3+yY*~FyW#i?tOb4@iRx|h&IxY%>6X#p_$rVv&e96wl z*gf>lVz559LvdY+yed>|KPy`_;_Gi;Yr#L*Sl{|1mYtS>z=Lg*Q6efFtE;)u$5D-1 zzpbAySxSoxv+F{D;STJWqdj=w89_8%K*l>OhjKKSDGV2to zHGNclnw%2RUd;p<-ky1W@?@4OwxF-n$vE3TugPSW8~qYj6IYL`QZ;VvXk?uT?Dn=3 zR*wIsYS~Q=FmRQe7{YF+A^!SV%xM`AtHNjyD5U~(qhXKI?zpUh>>p9Tfj~IpH2?K7 z7A+7NR+G8aw3~2tg{*6wAj)z9u&d>*$5cZR(l@>9tk0giP9q zf36RLEOAw**K@o4qcf<>mwBhykl`-z`7WkcHaRzw8$d3N!AJo?b6EQ^76`oflld@C zd5#rJv2)0rL{6VnAtH=fKHd1{l&QGU(f1nxjD;F1OSSO>zr5w=?5_ls-v4Rdkap1u z^=I=33xY{HZ^j?67TLq(>ksl$QrEPU6|)^ereuuvxgD@+-y^ey?%bCo=W*edLslw2 z#S;d+bPtVc%z`ujK|Sj{ovWK5N~T{`{<#^M=oZDGp=A^JP->XTZrp2Q`}UpgZSzK6 zz4-5)IIq=hSuu6UGmUS!x0FW$yc_WEo{9RGshEq{X-(35KgePqjA;svOqYm`YEDTk zX1$a3W!CB}An@?itXOq(b@P^l@HpBHLsSY(CRIgJKM5HB3VdNLGe5=E*cR9g6Ff0} zn3Rk?6?`t$N?T-{k0SnTFUT&qlx9df(3fU0@{_twoK=q>=nZIOnsF%Oc6NQLNuB}W@yugSzx)oHx3U1E?hrjjO##Jm4A4_ zYtI0j;Epd6EwMh+s?8+TXC<%w*$f*Pt2ho5y8D#NZ>?gFCv81>PR*Ax_Klfu;{#ke z7w5O`WW{vtL93uQ{|Gj6lJnt-V<`sfyXs&ZlrQJq)iUQz&ef?b+$>T2IV5gV@)G#6 zmuanOlc{r0T&*0XHw80-vV_v+-2@(Rb>da)j$jHf=I&4xCv>*DE%_=9PLgCr*Rp)T zLJt-WKVFz2^3`%UYZ$^pyn6oq9ayrCT}IxbH`_p+?N)?qXb<+w%Bi)ztAg5)PtOjCq7|flYa<7 zW(ih}_UL7Ub4+Rct8w({`5o!sI+2EdL__9CRAQ)p2XACXn@bu zt*KgqIGBVJPSBb3*%1q6Eg#V%WWE5=GKC}G*^;#sGe17Nrs`;|@yJt3`;WR4EU_VD zGy1v2sV?V+sE5V(`^uE+98;Q<$}Y8H-LVh2C%WAjPA$6A00GjDWrr8buv*WG9k+j& zpGI`*$*H%CcNkKL&k2?B-9lK(8e&6uvKyzrAYk1$F3-4qUC0*w{pH=fO7M0lP_CD& z;X!4@5-kESFMOaJiCVcqwTbj6S@|BKNGTAoEKO*cw$^{j*!k$`*H+KW4=$mBzs| zYBYOA(t5hLq?~_|pT9B|iPjNw)fkGqrwjyr?+;m48L5L<(ro5(VE7uJ{GQ7hP^5WM25vU z1+`mZUrd@~j?4ocq#t=c-MPV9E^~26@vkV1J3)ceqx-wj@ZkTDAfG8X@E+*Y?W_M` z34CKzw}Y$Tuy#Z750!1$M?#b3G!N3X{xSs)tQKRm7MgCsn1{F4Xlvi`;j<=8?zzME zso!dL{`0lL%;1Qv8tQ*4@Ul(;RD#3|CC{vU$H)IIGrbxBsUixY{PcryQ=M?zX~kt! zko^cJOk4Ym^mzocOU|174fPPE7*txNmy*$l5X z&!femjZwv|LjU`DPU^W^L1(fb;@V^N--bM?#!zXFmI=lK-w;%FX-8GoItiI}JKWhX za?&fBzoG>-N5G%gEmVoHxR!Rlegsh)D03tzdwk3zz!J_vd|n4Y9N^Cd8ae<lt(aTR}{l6XBTEuAmsR{-C+b`U-xpSzZ^MdmyAn= z@xkVe27jrm_WgM%&W!TB%_K`8JGcy~cr10@_^~0b0XH77flg-LVLf=8u&Rr?Bd{+( z9=sOz83rT)_1!7wlz%6e)b1#*EyH?d5MHekjYqi9J6ScJ25!-7uy(T-Es|GZEOViz zE36XCCeNDKAs$;UVY0&B8h=dh?nAM({*9|R)Fc|L|1)rqm75DAMQl0)CX%H|mlo07 zJ68@ljgLUxK)_M(nmJ41Y}AA=EhNYU$5a{!yHRL@j@ltd_>H-gX%f!om&M=Dx27MF zMru^fPa_DfERwlfG4g)Q*}3(IRn83TnJ*T83Fs)tH&Oc&Ly4HbpQ;O}5WEW;V5`o+ zu&c@lzLuyQ-Sl8NAxH!N$-v}q6_U65bO#t7Un^VjtaEk$=WbKI@SdoJSlQ|uEOCd+ zZdGqbfeW50nynpS(~n2o7W0+b)GPY$^AYe|$ekm;S1Z}2pZ(fJSL}R9CNT#sef#UO zhBXmA!#b2le^1s>D(fhAX22GbzIU>0RT!j8M0ivb3>GVO)aj*f+tOGK#cD^=@Oa7w zvP|A23mQU$k0F0c|8Z{=>@$r@d@)|4Krv`)%Q+%!YAZV!4yhx}K>__)V=W&GIrPn? z`?FM1IQnNP4(2)cB8+utkmr>soCE=jl#c85n@D8cOb71V$EU=_UnYK%+w}y)sZ4%q z(>fI`M*SN0tCoNr%PCE?=g8FaR#x7~vn(eq_T@gaSqEbWHxV+pej~S(U9Dr6a2fa1 z0YVixzClNJi$B`aRGkG}63_TC{ggPgj&^3|>h00rCe7uJ($m&PKLHHkDu`vzqz{O` zx6-}49Kx-5w`Xo^<`Slwu+Etu|L8{i+$|I^_kf9{0wL~au+d}tIESh&rp1nmI{ZY3 zjY32AHTIz|fJwwpIBY!B&aM)#!=c_SUaa`K=n}b^2_9<8M#P;#wF|1ME)&)mA8A@B zLQdEeybi1RXI~cKmu>9XSw4ft5lO?)`rGTGcd2?@@Fm18sCR4Yur#&S&u??hvrT z-+&k%*2~`e@L4KM?izUrGG+Os#!bi;`dxPhSj8GnhEPf$1j25Gs3z0Y=<2R3vlqY;astnu??y+&JB{Duj{1+z*HS9=?`6tCDk zZ3b39_(`*x#*9)*jxmG8d?+ABxLx~Eki>wk>nNv%iT<#9UvgidDcAu4RNpMO(~A&WkUjsK(95jqt+so%=aovHt$g9x9^q4f8GI$6)MdHZ{z9XY zucL0;S*omFB9@Z)HVw<98Lh5*zag}a!+e<~fd&3n8Zzbpc65`4;6_bEu|DHG&k2MI zvmF1mmLdyFXf^)*&%&1w3HyH3yl0J3GF)cZgH%3nm(oC^Z$a(K?#SA&u z1+&^_h26d%w)+q*S#xC0S^dXp`r<5T3uo9i{PnIzN(^@Rn)i|8u`=w>{-79kmV2-7 zCBoN#YH*nki@HN6XZ<*yRjE8LiDB`2eeZ4K|pFm*0G${B{?`HzIqN;0}4)C^E z5zI{bHc$i}0Jb)9K{b#DT*0j|Cu=j3iYth(Zb79z01pg9*;W;OOEus&wuJ{WIP<;K%m-{rs|}UyHZkT5+!#e<+g;_jz&tstNJ;4fRlSUxre($bTbk+Mt_NCR)g7}-mT zSTV#lKnOBz`WpxegiIUR&_-+MYs_6Q8|Jc(ey=a-#;RegnZ|}i%D>fg{va7!HX342 zQ#tV#B#bAk@W_zHl7=%_u$}n!78SZ)%cOo9)DQUWs@krmCk!KP>68HBKMez_h8*F%4^uzKU0`&K%1HNcogXc8jj+ya{l%ww&I>ynVjMAAR{JJ=`EhV=l zrLGislYwGST7~HKX8@$qo5o=>j%-gzC_Ee?iPI(}danUq?d4GN0I%R+)Nn=}q0&YL z;HNfw&nit1(7+F2;UQM8?nE~7-obJC_H)(ep0C}!O(AXnC||0FLD7TsX}+oYCN#~? z`W~dR=!eAss)YtYn00WB9-69W$OwK!sSP#LLIeAwQb2!U)W{znmu?;xZyuM9kBji1 z#ab5T762Q8sex_Rlw4hOwTug!prsrmWdpyap3qRWYwGCSuy#p&ldz_24km#R=phc+ z+crZ8T(P^)kgnHl5NHCqRTJRROw0-yQEgSzAap>E!lYpVwspX%>DXeF+=LMYSBQdS zXlddUN;s|P;}qU>3}MrPIxnaTqPilh>oOoz8Hf6=s&3PijJlI4 zWOV^z2+@qB}rb8#RXZO5tPx4ymbfTw@RrGwiEsn5IQKZ2T6qOTmXBHMeIQX zDGk#8c^qcLe>w|>y~5n)j_aT{ZJMi0y0#qBGIYYBd3KDxyN(fa%uU-|FpM$z?Ik!t zhoziC>?Z4v>#ZlqO6fbMvSmQ}^j%v|IC>mF8c6f{FvG7sskSEM)`ZxW6uVQ>KuQ`) zL(t^zB#@)(;Z&R-$_6pSk=O&>8%5aT;8!7o3Or{&FEc$<23Za8(r`we5U494w4gtc z0_!@$k^u9W^ZZg+t{19%rM-jF(Q#$}s8l=1!-7`#^I2#hsT?vMg*}RVSs2A2WX_W; zXr5x5m9_QIl6@Wg2!xQX1_q=O@y{=Lz^qcwHTH9$?&yf>_&9%blt&0GRzeTSGql0B z;F?H%Y34j*rXI62d^ri5G!W(!>KA8~Lga(zv@~Wxfv8Ehn?L|9nsh|!-+OndqVE|(56LgcOVL{(;34qy(V$8#5(g?+#g@e`2HF!=H@j(T6 zGZ?~TbyZf@z@DOSD3CriX{Z@P<1{s;YY9Vz3*FT8HHf65(UcDhekY}9%d)bfs7oq7 zl{P0r{iHEY-0`E6-g?LV+%<36D8NQxj{tK(+M?ymTh^Ru%$e4laP?vE@Y#WhJ3@nc3*}FAt;&ZH)6W!Ka;(fbW_AT?&8K~n-qXg#E9BG^N9q@*6C0-z;A_mrMAO6?}P zlo1|IQpL{B6bWEwQtTy#lzUR*NJj1#yvHE@uE~kU@n7g&(mk!q3o| z^qI?sv8?N~0-=)ZSSqSs8v1y*XK)mDLGB z9_IML6u)r?<2PfP3yw{?N9L1!CLlzijnoI-TXZP|E`dYCoYBo0+8Q&uHLKCx5^FZC z_HM(>Sk?-&F*~#*1<|v%U5v6e&8ivdx}o7h&L}W}`X~{ojl*xKh#cmQZNjN$JU!)U zNk>gMAW%tK8fP1vgTAG28WhQTGYEcSTS@|ZU63yX16iF@pr87zqE3QCPVI)oW#B5I zbt?0vVqZptzV-7`FDDLg(jar5kUOa27+B39M#=-&@*r8Al(cDN5=BLyh@ss$mx166yqdS@5v6ayGQiFL+@o$d#J*u z3LDwEaN z!-5#Dm^MN@QpAc$+b!4L^6f<6h>^|vtbh1M%+)t6y1!{mg7egdBz08Q01s*wd7b`t zlldP_ThY{Qi&n-Y-w=J+KO^bsh=Mb+-p?z&8MP}7ODT52d?rZ8KoK->EJIuPN!UyH zNd(0vX%M#wS)D;F!FvhH7_Zr6x7>_>7(fl6h-;y(8VG^qI4s|e&eUQ5%SGlD!J z5sEV+#W^a8KtjyhRFq8+C@VXv8rR`MH8{@=MV*)AIYpjRm1#wtkW@sz1$a&so>N;Q z^+OZ{jq11{4sqg;AZ`YCu=?rxG~s7}K;Q?@xd7XVwqc+F_8^bgKdswSsyU_Ev${Q_ znUkt9p=gteHjU)1=`*T6uN#YW1EB%uh6_yUhh%TrJDwf)olOU<8aM;Mqf)df_!&YD zrbWd-h|rHAc}Y`NH3iWH5N~aC{IfAlqAj5 zkV!SK$TPA$DM(|2I4Zz%ic>tIJRGJxgaKPr7gT+L-WP4MouG7>mq$cpT++rxc@ZDL zrWp>vZ{~cubA{IEg34b0=vL|0vkbrEe049%A)6IEh@KIedZ-&&6Ji*EtD>JPhlL8n zEy$K2jFu76yo=;&ysJV372mM(PE-v_^$;ZAyq&*&yKwVX>F8$p;J5_aS*}G0mQf`P zOQBovTu3Y4!q)*Xc}_=5SUS9A!q!m8fjcN$-LbJH_Nd5|8Y$OEc}C2`<$yLCTc!^6 zgY5)h80?l=kEazs+M~jCqn6P&kjBY{Zcz$=`!LsmC51z>sq-pDh6UBYg`1HSDjG&v zk@^vbb7Vo~RaqvDMVOSOHCf!&5d0_#?!XPv%4taLFqx|sE+J^t7YuFL)HWP_(=k@Sux5@b`iP<2iZp3HfefbT2=;lu{SLaq{Q)zFfIs#oYa@bwUNeo zc~Sa;6LqS4xsK_6*BG3MEV(!7qHG@*y93rQTzNFZ$t_DPh-M5v!U1oabupA0@R zkk4x>M)w^9PT0^R*DnTM$&V^g?Vv!mb3a$EM!B*d6%h+PXdSVUwRC7yWV@)W9T2Xt zpk9O*mV7Udd}u0xE_tftX@C&;K~(*sm#YS~{oLVUZvQY_st0(OD+eTr`}z8Qp;XTy zLs~f(0;?eYxvJpGDI29GP1rdlVX1LTZHDAsTi&$8T7uUWReYK1imI)t&_IlmbT13O;YpE3t1(VO zO^b4qH;itRyaX9U>TBLj2I~kTv#CRnbs8E>eHU$-n8nzk#%*OoQ|2XH0y434k_!A_ zS<#;4Wq3|t37GMA7+VK9Va@eVdg~qcbJx6S%!4t*nAbp>2?7^w55z-)f&^HPp za4!lpO@pA#s>*_f@fc4@AZ>_~Ml#Z9MnaAsBb8GIGSUFFPLReWX+oBVaTrs-QB;O* zvp}y}Qj{%IOF6pYn?TFW+3<={ImlPTQY|V~!cry3mEaz|Fz-28+XxJl9kC;Gu9tJr zfbH}ORBqm}vz8VTexj`ij-0U--d2F39+`l%NDxM~{cQapSKG@~>e*^Nhj+=Bec-K; zcePaCK=2bhjdNAD?$<0eVQFzz(7;_=*~XTHk=#ez*5f3PfD>_AWeTa|S$xkl?V&+} zG@!U?XzMJT!*(ucDy|FkZ9##2!4SfH>Pw0WPq?BgAPV0zF2MwS?GpUO1Z{Cqm?PPi0^+&P$qCH zSsfLm0Z!QT?p*UZYv^-tOBrfTgN@YZpdOaFWTT7)$D|PGIE!yaL|=EQHn614GN2T42bo zCfEvR$r(rC92(%aO=VG)#sv@p=PCAZG@&vsO2BUdTe@JlR8T)$c(R?aF}Rj^c7%uj zq|PyoF_jl*Byma<$9W!&Sy_T#9fv{X#W6vc;DrfJ7)zu0SzcU{#AQX=))b+c{c;XM zU0CqIL$Mkm*MYh)51;AySqIeV%o&0}KksBqen1QEHjF4<1@`=c2ak$ysQZQj0Sq+R z*T5dODEQK_=#*++wGoyZ5$tHW7FKH6ay1tf1H4KN4U7U3yHPviYMcZ7l%%ad1JO=9 z)J~urB}V=eTYRM|#PIDo7!`YVEp>+x2sZ)VHh>(>rXa#;D8#uH6NUv&1fc*!8`%w9 zqgiqj8ZsWXAZi|NMOMgbK%hwabmMj&b$4nmRPZ-F$t>n_SfL)`>^ zri$?tWG-t8E)z}#dT~6gCb$KAlY)rI2ZMv_f=fJ@5&BY@jXM}WnmNSRs%Zd^l?t~u zZ@`X%I+DHx#5TvCx5=6!8P3|)oNYG=1b(ZIwc%O-kEXC`;lbQS`gg3DYb66K;T!8P zw}vri=m?qP3avVfVR&PZU_d3Uv(&Upe=DHUO1Dx2C z7P?bHHz)T&(7+X(4|)lZ!}XJ8;D_z3gbpFkOCm;SunK$G+_@l0ONuljiqpI>BMQK8 zT9hUz7K-!qthgXb3xc#DimQ^iE{hwQlrSJus)!Hcs#a(t(dA2ip4R$YlRm0Ni*mH) zu4w_-)19mtG7rKWeuc9*m!a1EZ5QY9QtEw}2N>RsUbwm_L zfCrDk3+yR#8rgna&|!>&vOI&AE3h7f)*{`~sV>XPDo|A9Wd*4onF4wX+BLw*lom%4 z#xS4LKo>)yC=QF_C@-RoZ6B8*{QNsN`%S`5&X65E+XQ3FroL$CxT3pk@@>sTf>KvaSV8hLGm1JPD?_3(h>?;e zOQacedPQE)FigUwXgh|otIKIvGMaQjKvFWc95}2OPdm;7y|)>3z}9a2QZ&O$+L47WDS79d4fIF*Yr?_;lwc%`N}S= zX^wH|7abglf*u-?p$3{77*^IMgPH|_4hd$_Emk0{Zdh~?8l$pb0F8|(TM3%nYM}|; z19F_Jq+klb8#sjY(M~Oef+RXB?`k}N^i*Qf*HS)gKM7#W(P>$NCT2h&lD4*PqA2n~ z@fHmYHA{{imr0sYWZ<_z_{sCC1i+>hX;woQ$4K^XL6w$ud5uzm5;LT@ zAtx;vhBM>H5FFlxxsp?s9JdshnSM^}N(;RlE)3$FFqWY?&nb~WngeNsANiJ10cKJp zGG(L@X;GHeRB2lmQSg&E9tHg7a6HeCbNndB52Z4F$@D;i8%<@VGyH`D&1>MQ#Bvv6}u25&sZoBt$-Rbn0aAoakp@Pf42Mt}d=3`0-+QD$|qV zds3P1G~biv2RROrCG<6sa7@XVa8LRX=desjuHX-=Gq9+}}xGalOt{6fMZ2w4K8+lHDUFabWdtL-@Iwxex2+PbZ;S^6sciw>Wnt=R^)G;2jt28s|6Bwz+eAbq2fID!(T z5lI@8=!S=Ba7g#TV5HWN2>~j_X*QWWDw5|%w4PPuB~7JiRf~GayrLrDVYq}t8OA_K z$(%yO2vR)_%4CbiC9<`M^l+gVMu!EVHzTax!R8ZD8wBFpoKj_c?-R^skkddvmZb>^ z1*bua1h5vPiZUv}W~k$^tg3=BZ^_V>a0v-N4Gt3oB5-4%Mf^bAM`PQhNie{MXNP5F zgw1Zj8G@X3(j_@zs*pGl?Afwl!+%OiQ%W0RN*9s_R4B6`W(HE}u0(n;&5iJx5e$kM zVSwXDxXc8{&x)BjiJRoPF)lrt;btTr9und27S@@D;;T6&I{3k|T?@gwQDaI?zQbh9yqwBAj{BWd7V1W46>xeHiTUwPQp>V@H#> zRbf*TG5l><+6LK91GPa8ke1ii4SmZ3nKTs%{8kVvbPe5LiWW}c9?79hW4MG-$H+xn zNRx#42f8LCd6Y#ykTa4I2h;ojmqGPq_0gRY9Lk2rD!x>y?eiUtv?@4CX+~B0Q-f=&7O(2yiY$~7B4+9$+{V_=# z75QP2AL0cJX5es4!gneSO40z2F^NV&=orRGyo70{0>^@f@FWnTWmR4xk3qoAv2aq52n(?DGvOQ zf@Opu_{L0TQ505{%$mY4E8-lIo(LMb86h*pXTa4U1dY#tw0WLe;Q3h|K9iBgrzZht zIz5m~_r}xRu~dH|HJ(mS^IWs$L^>z@Fz?8kuR-X5SyT>k)v!H9{mt#7hIZhp&aR5K4uZChQpE4w-6U*Aion9Jf`79t!O3n(~ezZRzr^ zA;nBu!r3t7bwgR#lnouQDa)F&sA{ytN9GecMpqvWsF~s>R0TmDx9gNKV-aRq{6Q{Wt@H*$@Y3C`|E9d69Q$x&@v} zXY+eB&6qaDj3vW}O0I%!!V))hnl%{)PU#G)FUj>LxjvvJWHuCjOXat80UdEu70EQ3 zV$775C4MTMp5ar=GLK_66*_WL73Kw`y9{>DifQ22yPN9VPIkr;y~*TADmlrg=f%vj zB&^9o%n;KSO5!XDpF|CHr{JQjoNea`C%@!)Mc7W$jtny*L9?=k9;#NPK?9=_h;sAL zJ>XZQr52QGKAGFHSE%~=st4ty*B0ymi7_-)pC)XO z0A;pzk5r6YhXjbo2i=R&VgpgPLxx}8aU|qD1i~0C>d-y3JEpXuOKWi88nzO)bBZ`E zOGJ($kIB-oC=P-vgf0xJl*ix<1wevcfjvXGYHY~EKs?He7(Jn2!=eCZG$muahG~)( zbh=$(j$upyE68<-;+Yxv2vuH@rCC83^b#%jK*tdFrr|>{9FnZjoHCLzzNQge z4-lxzW15PB1tk~CG;>OVClN*k9!3SD;5gcJS`k-wTBYF-`2kL2kQ3kuCo|ll$gj%c znhb1&ZC%>IfNe@!nz*fsaYN2n5?h{@5=LfSh9TsJ(&@fbY9I|6Obw?~W0c=AYcd3o zo8jRk`B{Nq5QJ@2i5qI%)OK`bRpwVD4z-2zYf?-Vw3i#uN`Q!%1o(Eka<>A@wVfkRl(_+-ZU0CG4n23JIr5K~eTq zXeJ0$0$uP`&XqHsl6Isdm5jn56*Gh#4Ii7|GDSeRYo1Iv?V7@_PWY|s2;0h%CM~Pd zye!Vh;;brR&_rRZ#1%wlo&;1pKMtdwA)^jpMp?mejN{6RV3H^E&%+jGU_cN7dSNDE z_0b0~BEuXB!T@O(dB_1SJ;bBX;JT72r1x$JT^iYeNBo_fNpHR5e(o9)=$q>2I9g*#b7a2Z-6e4tgQASV31)+X8Nh(o z%fr?qf|CG_075ia62M@Ip$_<=W)*Q&mo`mh+f+6U42sgcuFUH&q9QIE%tjw4^l==n z2SA;|5GZ6O`4ozf;8Qc{!~~a|7r6~3y{l!ChLAMHgbq2%O!IU+EX_2oTm}y_^AhL+ z!?azJum|om)x>Eem6*z=B)8l0*KRY#~pv

@WYd5QA{lyl8^{4X#6N^d>{mlo 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 VhT|{fiBSLm002ovPDHLkV1hSGPG|rC literal 167461 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 z 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 R_09kQ002ovPDHLkV1n&~sx$xq diff --git a/org.tizen.guides/html/images/tizen_project_dali.png b/org.tizen.guides/html/images/tizen_project_dali.png index ed45fe1c5af5ccd273926cfbb3aa3a4264cdf5ee..e715f024f11311b88294910681ce65be3ece83e0 100644 GIT binary patch literal 103921 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

f2LCrJS5INdZHPB# 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%0AYn>85dWHC4 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®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 L_f3`3yU70oEIB?i diff --git a/org.tizen.guides/html/index.htm b/org.tizen.guides/html/index.htm index 106f42a..6b942e1 100644 --- a/org.tizen.guides/html/index.htm +++ b/org.tizen.guides/html/index.htm @@ -48,7 +48,7 @@

  • Application Manager
  • @@ -337,13 +337,14 @@
  • Media Playback
  • Media Recording
  • +
  • Raw Audio Playback and Recording
  • Media Controller
  • Media Conversions
  • Media Handle Management
  • Media Key Events
  • Screen Mirroring
  • Media Muxing
  • -
  • Media Streams
  • +
  • Media Stream Playback
  • Media Stream Recording
  • Radio
  • Camera
  • @@ -357,9 +358,10 @@
  • Wi-Fi
  • Wi-Fi Direct™
  • Telephony Information
  • +
  • USB Host
  • Internet and Content Downloads
  • Messaging @@ -389,7 +390,7 @@
  • Maps and Maps Service
  • Device Sensors
  • @@ -564,7 +565,7 @@
  • Task: Bluetooth Chat
  • -
  • IoTivity
  • +
  • IoT Connectivity
  • NFC

    Content

      -
    • Event and Conditions
    • -
    • Actions
    • +
    • Events and Conditions
    • Prerequisites
    • Rule creation

      Related Info

        @@ -52,21 +52,42 @@

        Contextual System Event Trigger

        -

        Tizen enables you to define rules as a combination of a contextual event, conditions, and an action. When the rule is enabled, the system starts to monitor the device status or user activities corresponding to the event defined in the rule. When the event is detected, the conditions are evaluated, and if the conditions are met, the action is triggered.

        +

        Tizen enables you to define rules as a combination of a contextual event, conditions, and an action. When the rule is enabled, the system starts to monitor the device status or user activities corresponding to the event defined in the rule. When the event is detected, the conditions are evaluated, and if the conditions are met, the action is triggered.

        This feature is supported in mobile applications only.

        -

        You can set an action that can be an application launching request using an application control, or a notification posting. For example, every day at 10:00 PM, if the battery level is low, the application can post a notification to remind the user to charge the battery.

        -

        Before you start, remember to prepare your application to use the contextual trigger functionality.

        +

        A rule always consists of 3 main components:

        + +
        • Event +

          An event literally denotes a contextual event that can be recognized by the device, or a change in a certain contextual state of the device or the user. For example, connections to peripherals, changes in settings, location changes, or specific times can be used as events. Note that only 1 event can be defined in a rule, as it is used as the initiator of the verification of the conditions. If the system detects the occurrence of the designated event, it starts to verify the conditions.

        • +
        • Condition +

          A condition denotes a contextual state or fact that can be recognized by the device. For example, the current device status or the historical pattern of the device usage can be used as conditions. In a rule, the application can define 1 condition, multiple conditions, or even no condition. If you define multiple conditions in a rule, the application can choose the way of combining the conditions using logical conjunctions or disjunctions. In case of the logical conjunction, the rule is true only if all the conditions are met. Otherwise, the rule can be true if at least 1 condition is met. If no condition is given, the rule is satisfied instantly when the corresponding event occurs.

        • +
        • Action +

          An action is triggered when the rule is satisfied. You can set an application launch request action using an application control, or you can set a notification posting action. For example, every day at 10:00 PM, if the battery level is low, the application can post a notification to remind the user to charge the battery.

          + +

          Each rule must basically contain 1 action only. However, because the action itself can be defined as an application control, if necessary, you can implement an application that executes a series of tasks to create a complex context-aware service.

        + +

        The following figure illustrates the rule components and their relations. +

        +

        Figure: Rule components

        +

        Rule components

        -

        The main features of the Contextual Trigger API include:

        -
        • Life-cycle management -

          Once a rule is composed and registered successfully into the system, a unique rule ID is assigned to it. You can use the rule ID to enable, disable, or permanently remove the rule.

          +

          The main features of the Contextual Trigger API include:

          + - -

          If you only need to monitor a fundamental system event, such as the USB connection status, to launch a service application, and no condition is required, use event callbacks. In these cases, using the event system instead of the contextual trigger is more efficient, as the contextual trigger runs a rule engine to manage state changes of multiple event and condition items simultaneously.

          - -

          A rule always consist of 3 main components:

          - -
          • Event -

            An event literally denotes a contextual event that can be recognized by the device, or a change in a certain contextual state of the device or the user. For example, connections to peripherals, changes in settings, location changes, or specific times can be used as events. Note that only 1 event can be defined in a rule, as it is used as the initiator of the verification of the conditions. If the system detects the occurrence of the designated event, it starts to verify the conditions.

          • -
          • Condition -

            A condition denotes a contextual state or fact that can be recognized by the device. For example, the current device status or the historical pattern of the device usage can be used as conditions. In a rule, the application can define 1 condition, multiple conditions, or even no condition. If you define multiple conditions in a rule, the application can choose the way of combining the conditions using logical conjunctions or disjunctions. In case of the logical conjunction, the rule is true only if all the conditions are met. Otherwise, the rule can be true if at least 1 condition is met. If no condition is given, the rule is satisfied instantly when the corresponding event occurs.

          • -
          • Action -

            An action is triggered when the rule is satisfied. Each rule must basically contain 1 action only. However, because the action itself can be defined as an application control, if necessary, you can implement an application that executes a series of tasks to create a complex context-aware service.

          - -

          The following figure illustrates the rule components and their relations. -

          -

          Figure: Rule components

          -

          Rule components

          + +
        • +
        • Rule retrieval +

          You can retrieve a list of enabled and disabled rule IDs owned by your application.

        • +
        + + + + + + + + + +
        Note
        If you only need to monitor a fundamental system event, such as the USB connection status, to launch a service application, and no condition is required, use event callbacks. In these cases, using the event system instead of the contextual trigger is more efficient, as the contextual trigger runs a rule engine to manage state changes of multiple event and condition items simultaneously.
        -

        Event and Conditions

        +

        Events and Conditions

        In a rule, the combination of an event and conditions formulates the logical statement that decides to execute the action of the rule or leave it undone. The event and the conditions are defined in various kinds of contextual information, which can be recognized on the device:

        • An event represents a contextual state change or a contextual event literally, such as "headphone is plugged", "the battery level has dropped to low", or "the user enters his home".
        • A condition represents a current contextual state or a device or user profile inferred through the usage history, for example, "the current battery level is low", "Wi-Fi connection is active", or "(when receiving an incoming call) the number is the most frequent address in his call logs".
        -

        Defining an event or a condition can involve attribute comparisons and input option parameter settings. The following example illustrates how to formulate a simple rule of "at 10 PM, if the battery is not charging":

        +

        Defining an event or a condition can involve attribute comparisons and input option parameter settings. The following example illustrates how to formulate a simple rule of "at 10 PM, if the battery is not charging":

        1. Create a rule handle. The first parameter (CONTEXT_TRIGGER_LOGICAL_CONJUNCTION) denotes how to combine all condition entries.
          @@ -146,236 +162,6 @@ context_trigger_rule_entry_destroy(condition);
           

          The above example rule only contains 1 condition, and both the event and the condition contain 1 key-value comparison each. More complex rules, with multiple conditions and multiple comparisons in the event and each condition, can be also formulated. In addition, certain events and conditions require you to set option parameters.

          -

          Comparison Attributes for Events and Conditions

          - -

          The following table summarizes the corresponding comparison attribute keys, with respect to the event and condition items, and the valid right operands for each attribute key. For information on the necessary privileges for each item, see the Contextual Trigger API.

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          Table: Attribute keys and corresponding operands
          Event or conditionAttribute keyTypeValid operands
          CONTEXT_TRIGGER_EVENT_TIMECONTEXT_TRIGGER_TIME_OF_DAYIntegerFrom 0 to 1439 (minute)
          CONTEXT_TRIGGER_DAY_OF_WEEKString - CONTEXT_TRIGGER_MON, CONTEXT_TRIGGER_TUE, CONTEXT_TRIGGER_WED, CONTEXT_TRIGGER_THU, CONTEXT_TRIGGER_FRI, - CONTEXT_TRIGGER_SAT, CONTEXT_TRIGGER_SUN, CONTEXT_TRIGGER_WEEKDAY, CONTEXT_TRIGGER_WEEKEND -
          CONTEXT_TRIGGER_CONDITION_TIMECONTEXT_TRIGGER_TIME_OF_DAYIntegerFrom 0 to 1439 (minute)
          CONTEXT_TRIGGER_DAY_OF_WEEKString - CONTEXT_TRIGGER_MON, CONTEXT_TRIGGER_TUE, CONTEXT_TRIGGER_WED, CONTEXT_TRIGGER_THU, CONTEXT_TRIGGER_FRI, - CONTEXT_TRIGGER_SAT, CONTEXT_TRIGGER_SUN, CONTEXT_TRIGGER_WEEKDAY, CONTEXT_TRIGGER_WEEKEND -
          CONTEXT_TRIGGER_DAY_OF_MONTHIntegerFrom 1 to 31
          CONTEXT_TRIGGER_EVENT_CHARGER -

          CONTEXT_TRIGGER_EVENT_USB

          -

          CONTEXT_TRIGGER_CONDITION_CHARGER

          -

          CONTEXT_TRIGGER_CONDITION_USB

          CONTEXT_TRIGGER_IS_CONNECTEDIntegerCONTEXT_TRIGGER_TRUE, CONTEXT_TRIGGER_FALSE
          - CONTEXT_TRIGGER_EVENT_BATTERY -

          CONTEXT_TRIGGER_CONDITION_BATTERY

          -
          CONTEXT_TRIGGER_LEVELString - CONTEXT_TRIGGER_EMPTY, CONTEXT_TRIGGER_CRITICAL, CONTEXT_TRIGGER_LOW, CONTEXT_TRIGGER_NORMAL, CONTEXT_TRIGGER_HIGH, CONTEXT_TRIGGER_FULL -
          CONTEXT_TRIGGER_IS_CHARGINGIntegerCONTEXT_TRIGGER_TRUE, CONTEXT_TRIGGER_FALSE
          -

          CONTEXT_TRIGGER_EVENT_POWER_SAVING_MODE

          -

          CONTEXT_TRIGGER_CONDITION_POWER_SAVING_MODE

          -
          CONTEXT_TRIGGER_IS_ENABLEDIntegerCONTEXT_TRIGGER_TRUE, CONTEXT_TRIGGER_FALSE
          - CONTEXT_TRIGGER_EVENT_GPS -

          CONTEXT_TRIGGER_CONDITION_GPS

          -
          CONTEXT_TRIGGER_STATEString - CONTEXT_TRIGGER_DISABLED, CONTEXT_TRIGGER_SEARCHING, CONTEXT_TRIGGER_CONNECTED
          - CONTEXT_TRIGGER_EVENT_HEADPHONE -

          CONTEXT_TRIGGER_CONDITION_HEADPHONE

          -
          CONTEXT_TRIGGER_IS_CONNECTEDIntegerCONTEXT_TRIGGER_TRUE, CONTEXT_TRIGGER_FALSE
          CONTEXT_TRIGGER_TYPEStringCONTEXT_TRIGGER_NORMAL, CONTEXT_TRIGGER_HEADSET, CONTEXT_TRIGGER_BLUETOOTH -
          - CONTEXT_TRIGGER_EVENT_WIFI -

          CONTEXT_TRIGGER_CONDITION_WIFI

          -
          CONTEXT_TRIGGER_STATEString - CONTEXT_TRIGGER_DISABLED, CONTEXT_TRIGGER_CONNECTED, CONTEXT_TRIGGER_UNCONNECTED -
          CONTEXT_TRIGGER_BSSIDStringWi-Fi BSSID
          - CONTEXT_TRIGGER_EVENT_CALL -

          CONTEXT_TRIGGER_CONDITION_CALL

          -
          CONTEXT_TRIGGER_STATEString - CONTEXT_TRIGGER_IDLE, CONTEXT_TRIGGER_CONNECTING, CONTEXT_TRIGGER_CONNECTED -
          CONTEXT_TRIGGER_MEDIUMStringCONTEXT_TRIGGER_VOICE, CONTEXT_TRIGGER_VIDEO
          CONTEXT_TRIGGER_ADDRESSStringPhone number
          CONTEXT_TRIGGER_EVENT_EMAILCONTEXT_TRIGGER_EVENTStringCONTEXT_TRIGGER_RECEIVED, CONTEXT_TRIGGER_SENT
          CONTEXT_TRIGGER_EVENT_MESSAGECONTEXT_TRIGGER_EVENTStringCONTEXT_TRIGGER_RECEIVED
          CONTEXT_TRIGGER_TYPEStringCONTEXT_TRIGGER_SMS, CONTEXT_TRIGGER_MMS
          - CONTEXT_TRIGGER_EVENT_ACTIVITY_STATIONARY -

          CONTEXT_TRIGGER_EVENT_ACTIVITY_WALKING

          -

          CONTEXT_TRIGGER_EVENT_ACTIVITY_RUNNING

          -

          CONTEXT_TRIGGER_EVENT_ACTIVITY_IN_VEHICLE

          CONTEXT_TRIGGER_EVENTStringCONTEXT_TRIGGER_DETECTED
          CONTEXT_TRIGGER_ACCURACYString - CONTEXT_TRIGGER_HIGH, CONTEXT_TRIGGER_NORMAL, CONTEXT_TRIGGER_LOW -
          CONTEXT_TRIGGER_EVENT_PLACECONTEXT_TRIGGER_EVENTStringCONTEXT_TRIGGER_IN, CONTEXT_TRIGGER_OUT
          CONTEXT_TRIGGER_CONDITION_APP_USE_FREQUENCY -

          CONTEXT_TRIGGER_CONDITION_COMMUNICATION_FREQUENCY

          -
          CONTEXT_TRIGGER_RANKIntegerPositive integer
          CONTEXT_TRIGGER_TOTAL_COUNTIntegerNon-negative integer
          - CONTEXT_TRIGGER_CONDITION_MUSIC_PLAYBACK_FREQUENCY -

          CONTEXT_TRIGGER_CONDITION_VIDEO_PLAYBACK_FREQUENCY

          -
          CONTEXT_TRIGGER_TOTAL_COUNTIntegerNon-negative integer
          - -

          The following comparison operators are allowed for specific attribute data types: -

          - -
            -
          • For integer-type attributes: -
              -
            • CONTEXT_TRIGGER_EQUAL_TO
            • -
            • CONTEXT_TRIGGER_NOT_EQUAL_TO
            • -
            • CONTEXT_TRIGGER_GREATER_THAN
            • -
            • CONTEXT_TRIGGER_GREATER_THAN_OR_EQUAL_TO
            • -
            • CONTEXT_TRIGGER_LESS_THAN
            • -
            • CONTEXT_TRIGGER_LESS_THAN_OR_EQUAL_TO
            • -
            -
          • -
          • For string-type attributes: -
              -
            • CONTEXT_TRIGGER_EQUAL_TO
            • -
            • CONTEXT_TRIGGER_NOT_EQUAL_TO
            • -
            -
          • -
          - -

          Options

          Certain events or conditions require the specification of some option values to clarify their monitoring or computation objective. For example, if an event is defined using CONTEXT_TRIGGER_EVENT_PLACE, the target place must be specified by its ID that can be retrieved using the Geofence Manager, as in the following example:

          @@ -566,35 +352,8 @@ context_trigger_rule_entry_add_comparison_int(time_condition, CONTEXT_TRIGGER_TI
      -

      Actions

      - -

      When a rule is satisfied (the event has occurred and the conditions are met), the corresponding action is triggered. Only 1 action can be set for a rule, and the action can be one of the following:

      - -
        -
      • Application launch request: -

        The contextual trigger allows you to set an application control as an action. You can utilize the app control functionalities by developing an application with the corresponding app controls to execute a series of tasks when a rule is satisfied.

      • -
      • Notification posting: -

        A basic form of notification can be set as an action. A notification can contain a title, content body text, an icon, and an app control to be executed. For more information, see the Notifications guide.

      • -
      -

      Warm-up

      -

      Become familiar with the Contextual Trigger API basics by learning about:

      - - -

      Prerequisites

      +

      Prerequisites

      To use the functions and data types of the Contextual Trigger API, include the <context_trigger.h> header file in your application:

      @@ -713,20 +472,20 @@ context_trigger_rule_entry_destroy(gps_condition);
       
       
       

      Setting an Action

      - -

      If the rule is satisfied, either an application launch or a notification posting is triggered.

      +

      When a rule is satisfied (the event has occurred and the conditions are met), the corresponding action is triggered. Only 1 action can be set for a rule.

      +

      To set an action:

      • To set an application launch request:

         app_control_h app;
        -/* Create an app control handle and set the details, such as application ID and operation */
        +/* Create an application control handle and set the details, such as application ID and operation */
         
         context_trigger_rule_set_action_app_control(rule, app);
         
        -

        The application launch request is manipulated with an app control handle. For more details, see the App Control API.

        +

        The application launch request is manipulated with an application control handle. For more details, see the App Control API. You can utilize the application control functionalities by developing an application with the corresponding application controls to execute a series of tasks when a rule is satisfied.

      • To register a notification posting request:
        @@ -734,7 +493,7 @@ context_trigger_rule_set_action_notification(rule, "Battery Alert",
                                                      "Battery is getting low. To save your battery, turn off Wi-Fi or GPS",
                                                      NULL, NULL);
         
        -

        The Contextual Trigger API supports the basic notification type only.

        +

        The Contextual Trigger API supports the basic notification type only. A notification can contain a title, content body text, an icon, and an application control to be executed.

      @@ -833,6 +592,236 @@ if (disabled_rule_ids) {
    • +

      Comparison Attributes for Events and Conditions

      + +

      The following comparison operators are allowed for specific attribute data types: +

      + +
        +
      • For integer-type attributes: +
          +
        • CONTEXT_TRIGGER_EQUAL_TO
        • +
        • CONTEXT_TRIGGER_NOT_EQUAL_TO
        • +
        • CONTEXT_TRIGGER_GREATER_THAN
        • +
        • CONTEXT_TRIGGER_GREATER_THAN_OR_EQUAL_TO
        • +
        • CONTEXT_TRIGGER_LESS_THAN
        • +
        • CONTEXT_TRIGGER_LESS_THAN_OR_EQUAL_TO
        • +
        +
      • +
      • For string-type attributes: +
          +
        • CONTEXT_TRIGGER_EQUAL_TO
        • +
        • CONTEXT_TRIGGER_NOT_EQUAL_TO
        • +
        +
      • +
      + +

      The following table summarizes the corresponding comparison attribute keys, with respect to the event and condition items, and the valid right operands for each attribute key. For information on the necessary privileges for each item, see the Contextual Trigger API.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table: Attribute keys and corresponding operands
      Event or conditionAttribute keyTypeValid operands
      CONTEXT_TRIGGER_EVENT_TIMECONTEXT_TRIGGER_TIME_OF_DAYIntegerFrom 0 to 1439 (minute)
      CONTEXT_TRIGGER_DAY_OF_WEEKString + CONTEXT_TRIGGER_MON, CONTEXT_TRIGGER_TUE, CONTEXT_TRIGGER_WED, CONTEXT_TRIGGER_THU, CONTEXT_TRIGGER_FRI, + CONTEXT_TRIGGER_SAT, CONTEXT_TRIGGER_SUN, CONTEXT_TRIGGER_WEEKDAY, CONTEXT_TRIGGER_WEEKEND +
      CONTEXT_TRIGGER_CONDITION_TIMECONTEXT_TRIGGER_TIME_OF_DAYIntegerFrom 0 to 1439 (minute)
      CONTEXT_TRIGGER_DAY_OF_WEEKString + CONTEXT_TRIGGER_MON, CONTEXT_TRIGGER_TUE, CONTEXT_TRIGGER_WED, CONTEXT_TRIGGER_THU, CONTEXT_TRIGGER_FRI, + CONTEXT_TRIGGER_SAT, CONTEXT_TRIGGER_SUN, CONTEXT_TRIGGER_WEEKDAY, CONTEXT_TRIGGER_WEEKEND +
      CONTEXT_TRIGGER_DAY_OF_MONTHIntegerFrom 1 to 31
      CONTEXT_TRIGGER_EVENT_CHARGER +

      CONTEXT_TRIGGER_EVENT_USB

      +

      CONTEXT_TRIGGER_CONDITION_CHARGER

      +

      CONTEXT_TRIGGER_CONDITION_USB

      CONTEXT_TRIGGER_IS_CONNECTEDIntegerCONTEXT_TRIGGER_TRUE, CONTEXT_TRIGGER_FALSE
      + CONTEXT_TRIGGER_EVENT_BATTERY +

      CONTEXT_TRIGGER_CONDITION_BATTERY

      +
      CONTEXT_TRIGGER_LEVELString + CONTEXT_TRIGGER_EMPTY, CONTEXT_TRIGGER_CRITICAL, CONTEXT_TRIGGER_LOW, CONTEXT_TRIGGER_NORMAL, CONTEXT_TRIGGER_HIGH, CONTEXT_TRIGGER_FULL +
      CONTEXT_TRIGGER_IS_CHARGINGIntegerCONTEXT_TRIGGER_TRUE, CONTEXT_TRIGGER_FALSE
      +

      CONTEXT_TRIGGER_EVENT_POWER_SAVING_MODE

      +

      CONTEXT_TRIGGER_CONDITION_POWER_SAVING_MODE

      +
      CONTEXT_TRIGGER_IS_ENABLEDIntegerCONTEXT_TRIGGER_TRUE, CONTEXT_TRIGGER_FALSE
      + CONTEXT_TRIGGER_EVENT_GPS +

      CONTEXT_TRIGGER_CONDITION_GPS

      +
      CONTEXT_TRIGGER_STATEString + CONTEXT_TRIGGER_DISABLED, CONTEXT_TRIGGER_SEARCHING, CONTEXT_TRIGGER_CONNECTED
      + CONTEXT_TRIGGER_EVENT_HEADPHONE +

      CONTEXT_TRIGGER_CONDITION_HEADPHONE

      +
      CONTEXT_TRIGGER_IS_CONNECTEDIntegerCONTEXT_TRIGGER_TRUE, CONTEXT_TRIGGER_FALSE
      CONTEXT_TRIGGER_TYPEStringCONTEXT_TRIGGER_NORMAL, CONTEXT_TRIGGER_HEADSET, CONTEXT_TRIGGER_BLUETOOTH +
      + CONTEXT_TRIGGER_EVENT_WIFI +

      CONTEXT_TRIGGER_CONDITION_WIFI

      +
      CONTEXT_TRIGGER_STATEString + CONTEXT_TRIGGER_DISABLED, CONTEXT_TRIGGER_CONNECTED, CONTEXT_TRIGGER_UNCONNECTED +
      CONTEXT_TRIGGER_BSSIDStringWi-Fi BSSID
      + CONTEXT_TRIGGER_EVENT_CALL +

      CONTEXT_TRIGGER_CONDITION_CALL

      +
      CONTEXT_TRIGGER_STATEString + CONTEXT_TRIGGER_IDLE, CONTEXT_TRIGGER_CONNECTING, CONTEXT_TRIGGER_CONNECTED +
      CONTEXT_TRIGGER_MEDIUMStringCONTEXT_TRIGGER_VOICE, CONTEXT_TRIGGER_VIDEO
      CONTEXT_TRIGGER_ADDRESSStringPhone number
      CONTEXT_TRIGGER_EVENT_EMAILCONTEXT_TRIGGER_EVENTStringCONTEXT_TRIGGER_RECEIVED, CONTEXT_TRIGGER_SENT
      CONTEXT_TRIGGER_EVENT_MESSAGECONTEXT_TRIGGER_EVENTStringCONTEXT_TRIGGER_RECEIVED
      CONTEXT_TRIGGER_TYPEStringCONTEXT_TRIGGER_SMS, CONTEXT_TRIGGER_MMS
      + CONTEXT_TRIGGER_EVENT_ACTIVITY_STATIONARY +

      CONTEXT_TRIGGER_EVENT_ACTIVITY_WALKING

      +

      CONTEXT_TRIGGER_EVENT_ACTIVITY_RUNNING

      +

      CONTEXT_TRIGGER_EVENT_ACTIVITY_IN_VEHICLE

      CONTEXT_TRIGGER_EVENTStringCONTEXT_TRIGGER_DETECTED
      CONTEXT_TRIGGER_ACCURACYString + CONTEXT_TRIGGER_HIGH, CONTEXT_TRIGGER_NORMAL, CONTEXT_TRIGGER_LOW +
      CONTEXT_TRIGGER_EVENT_PLACECONTEXT_TRIGGER_EVENTStringCONTEXT_TRIGGER_IN, CONTEXT_TRIGGER_OUT
      CONTEXT_TRIGGER_CONDITION_APP_USE_FREQUENCY +

      CONTEXT_TRIGGER_CONDITION_COMMUNICATION_FREQUENCY

      +
      CONTEXT_TRIGGER_RANKIntegerPositive integer
      CONTEXT_TRIGGER_TOTAL_COUNTIntegerNon-negative integer
      + CONTEXT_TRIGGER_CONDITION_MUSIC_PLAYBACK_FREQUENCY +

      CONTEXT_TRIGGER_CONDITION_VIDEO_PLAYBACK_FREQUENCY

      +
      CONTEXT_TRIGGER_TOTAL_COUNTIntegerNon-negative integer
      + + diff --git a/org.tizen.guides/html/native/app_management/app_communication_n.htm b/org.tizen.guides/html/native/app_management/app_communication_n.htm index 6506814..728f67a 100644 --- a/org.tizen.guides/html/native/app_management/app_communication_n.htm +++ b/org.tizen.guides/html/native/app_management/app_communication_n.htm @@ -39,13 +39,13 @@
      • Message Port -

        Applications communicate with each other using message port communication. You can send and receive messages using the map data format and trusted or untrusted message port instances.

      • +

        Applications communicate with each other using message ports. You can send and receive messages using the map data format and trusted or untrusted message port instances.

      • Data Control

        You can exchanging SQL- or key-value-type data between applications. All applications can request data shared by other applications, but only service applications can provide their own data.

      • -
      • Data Bundles +
      • Data Bundle

        You can package data with a bundle, which is a string-based dictionary abstract data type. You can create bundles, manage their content, access their content through iteration, and encode and decode them.

      diff --git a/org.tizen.guides/html/native/app_management/app_controls_n.htm b/org.tizen.guides/html/native/app_management/app_controls_n.htm index 30495db..a3ad23c 100644 --- a/org.tizen.guides/html/native/app_management/app_controls_n.htm +++ b/org.tizen.guides/html/native/app_management/app_controls_n.htm @@ -27,14 +27,16 @@

    Content

    Related Info

      @@ -48,104 +50,75 @@

      Application Controls

      -

      An application control (app control) is a way of sharing an application's functionality. To use another application's features through application controls reduces your efforts and time to develop your application.

      +

      An application control (app control) is a way of sharing an application's functionality with other applications. To use another application's features through application controls reduces your efforts and time to develop your application.

      -

      An application can be launched by the user from the Launcher or by another application. The application control can be used to describe either an action to be performed by other applications, or the results of the operation performed by a launched application. The application can receive results from the launched application.

      -

      Regardless of how an application is launched, the application framework starts the application by creating a new process and calling the entry point of the application. Like a conventional Linux application, the main function of the application is its entry point. In the Tizen application, the main task is to hand over control to the application framework by calling the ui_app_main() function:

      - -
      -bool 
      -app_create(void *user_data)
      -{
      -    /*
      -       Take necessary actions before the main event loop starts
      -       Initialize UI resources and application data
      -       If this function returns true, the application main loop starts
      -       If this function returns false, the application terminates
      -     */
      -    return true;
      -}
      -
      -void
      -app_control(app_control_h app_control, void *user_data)
      -{
      -    /* Handle the launch request */
      -}
      -
      -void
      -app_pause(void *user_data)
      -{
      -    /* Take necessary actions when application becomes invisible */
      -}
      -
      -void
      -app_resume(void *user_data)
      -{
      -    /* Take necessary actions when application becomes visible */
      -}
      -
      -void
      -app_terminate(void *user_data)
      -{
      -    /* Release all resources */
      -}
      -
      -int
      -main(int argc, char *argv[])
      -{
      -    struct appdata ad;
      -
      -    ui_app_lifecycle_callback_s event_callback;
      +

      An application can be launched by the user from the launcher or by another application through the application control. The application control launch request describes either an action to be performed by other applications, or the results of that action. The application can also receive results from the launched application through an application control reply.

      -    event_callback.create = app_create; -    event_callback.terminate = app_terminate; -    event_callback.pause = app_pause; -    event_callback.resume = app_resume; -    event_callback.app_control = app_control; - -    memset(&ad, 0x0, sizeof(struct appdata)); - -    return ui_app_main(argc, argv, &event_callback, &ad); -} -
      - -

      The ui_app_main() function initializes the application and starts the main loop. It takes 4 parameters and uses them to initialize the application. The argc and argv parameters contain the values from the application framework, and you must never change their values. The third parameter is a state transition handler that is responsible for managing the state transitions the application goes through while it is running. The fourth parameter is application data to be passed to each state handler.

      -

      When the ui_app_main() is first invoked, the application moves from the ready state to the created state. The application has to initialize itself. During this transition, the application framework calls the application's app_create_cb() state transition callback just before the application enters the main loop. Within the registered callback, you must initialize the application resources and create the main window.

      -

      If the app_create_cb() callback function returns false, the application moves to the terminated state. If it returns true, the application enters the main loop.

      +

      The main App Control API features are:

      +
        +
      • Requesting application launches +

        You can create application control launch requests to ask the platform to launch an application to perform a specific task for you.

        +

        You can use different launch types (implicit or explicit), depending on whether you know the exact application you want to launch. When you make an implicit launch request, the platform uses the conditions in the launch request to determine which application can be launched to handle the requested task.

      • +
      • Launching an application due to a launch request +

        After the platform has found the correct application to launch, the application is activated through the launch process, and can perform the task the original application has requested. After the task is completed, the launched application can send the results back to the original application.

      • +
      • Handling application control launch results +

        When the launched application is finished with its task and has sent back the results, you can receive those results in your application and handle them accordingly.

      • +
      • Exporting application controls +

        You can allow other applications to launch your application and use your functionalities by exporting your application features as application controls.

      • +
      • Controlling application groups through the launch mode +

        You can set the launch mode when launching an application through an application control. The launch mode determines whether the application is launched in its own group, or as a sub application within an existing group.

      • +
      -

      Before you start, remember to prepare your application to use the app control functionality.

      +

      You can take advantage of the Tizen base application functionalities through the application control feature.

      -

      Handling the Launch Options

      -

      The application framework calls the application's app_control_cb() callback just after the application enters the main loop. This callback is passed to the app_control containing the reason why the application was launched. For example, the application can be launched to open a file to handle the request that has been sent by other application. In all of these cases, the application is responsible for checking the content of the app_control and responding appropriately. The content of the app_control can be empty, if the application is launched by the user from the Launcher.

      +

      Launch Types

      -
      -static void 
      -app_control(app_control_h app_control, void *user_data)
      -{
      -    struct appdata *ad = (struct appdata *)user_data;
      -    char *operation;
      -    char *uri;
      -    char *mime_type;
      +

      You can launch an application with an application control using 2 different launch types:

      +
        +
      • Explicit launch: +

        Explicit launch means that you launch a specific application with the application ID. When you request an explicit launch:

        +
          +
        • If the underlying application launcher framework finds an application matched with the given application ID in the installed application list, it launches the application in a new process. If the matched application is not found, the framework returns the APP_CONTROL_ERROR_APP_NOT_FOUND result. Additional information (such as operation, URI, or MIME type) is not used to select an application for an explicit launch. +
        • +
        • If the operation setting in the app_control handle is set to APP_CONTROL_OPERATION_DEFAULT, the application ID must be set. Otherwise the APP_CONTROL_ERROR_INVALID_PARAMETER result is returned.
        • +
        + + + + + + + + + +
        Note
        Be careful when using the explicit launch, because if the target application does not exist in the device, you need to handle the APP_CONTROL_ERROR_APP_NOT_FOUND error. If you want to launch any application that supports a certain operation, use the implicit launch.
        +
      • +
      • Implicit launch +

        Implicit launch means that you launch any application which matches the operation, URI (or scheme), or MIME type you need. When you request an implicit launch:

        +
          +
        1. To determine which application can be launched, the application launcher framework compares the operation, URI, and MIME type conditions.
        2. +
        3. The application launcher framework iterates the application controls of all applications on the device to find the applications that match the given conditions.
        4. +
        5. If only one application is matched for the given conditions, that application is launched. If multiple matching applications are found, the application selector is shown and the user can select the proper application.
        6. +
        +
      • +
      -    app_control_get_operation(app_control, operation); + + + + + + + + + +
      Note
      Since Tizen 2.4, application controls used to launch service applications outside the current package are not supported. Because of this, the service application is only allowed to be launched explicitly by the application in the same package. All service applications are excluded from matches of implicit launch requests.
      -    if (!strcmp(operation, APP_CONTROL_OPERATION_VIEW)) { -        app_control_get_uri(app_control, &uri); -        app_control_get_mime(app_control, &mime_type); +

      Launch Requests

      -        if (uri && !strcmp(mime_type, "image/jpg")) -            display_image_file(ad, uri); /* Display a specific image file */ -    } - -    if (ad->win) -        elm_win_activate(ad->win); -} -
      -

      Managing Application Controls

      -

      The App Control API provides functions for launching other applications with a specific operation, URI, MIME type, and extra data. The requesting application can get a result back from the launched application.

      -

      To launch an application with the App Control API, create an app_control handle and add information to that handle. You can set the following information:

      +

      To launch an application with the application control, you must create a launch request. You must create an app_control handle, and add to the handle the conditions for selecting the application to be launched. You can add the following information:

        -
      • Operation: Action to be performed by the app control. +
      • Operation: Action to be performed by the launched application. @@ -153,47 +126,23 @@ app_control(app_control_h app_control, void *user_data) +

        The macro name can only be used in the .c files, not in the application manifest file for the application control export.

        The operation name format is http://tizen.org/appcontrol/operation/<verb>. You can also use the related macro name, APP_CONTROL_OPERATION_<VERB>. -

        The macro name can only be used in the .c files, not in the application manifest file for the app control export.

        +

        The operation is mandatory information for sending the launch request.

      • URI: Data itself to be performed.
      • MIME type: Specific type of the URI.
      • Application ID: ID of the application to be launched.
      • -
      • Extra data: Key-value pairs to provide additional information for the launch request and the result of the request.
      • -
      -

      The operation is mandatory information for sending the launch request. The App Control API provides several functions to get and set the above information to the app_control handle.

      -

      To launch an application with the App Control API, use one of the following methods:

      - -

      The application launched by the app control can return the result to the caller application.

      - -

      You can take advantage of the Tizen base application functionalities through the app control feature. You can also export your application functionality to allow other applications to launch your application.

      - - - - - - - - - - -
      Note
      Since Tizen 2.4, application controls used to launch service applications outside the current package are not supported. Because of this, the service application is only allowed to be launched explicitly by the application in the same package.
      -

      Explicit Launch

      -

      When you request an explicit launch:

      +

      Explicit Launch Request

      -
        -
      • If the underlying application launcher framework finds an application matched with the given application ID in the installed application list, it launches the application in a new process. If the matched application is not found, the framework returns the APP_CONTROL_ERROR_APP_NOT_FOUND result. Additional information (such as operation, URI, or MIME type) is not used to select an application for an explicit launch.
      • -
      • If the operation setting in the app_control handle is set to APP_CONTROL_OPERATION_DEFAULT, the application ID must be set. Otherwise the APP_CONTROL_ERROR_INVALID_PARAMETER result is returned.
      • -
      -

      The following code example launches a calculator application explicitly with the application ID:

      +

      The following example shows how to create an explicit launch request, which launches a calculator application explicitly with the application ID:

       #include <app.h>
       #include <dlog.h>
      @@ -214,27 +163,12 @@ else
       app_control_destroy(app_control);
       
      - - - - - - - - - -
      Note
      Be careful when using the explicit launch, because if the target application does not exist in the device, you need to handle the APP_CONTROL_ERROR_NOT_FOUND error. If you want to launch any application that supports a certain operation, use the implicit launch.
      +

      Implicit Launch Request

      -

      Implicit Launch

      +

      The following examples shows how to create an implicit launch request:

      + +
      • To launch a camera application with a specific operation and MIME type: -

        When you request an implicit launch:

        -
          -
        • To determine which application can be launched, the application launcher framework compares the following conditions: operation, URI (or scheme), and MIME type.
        • -
        • The application launcher framework iterates the app controls of all applications on the device to find the applications that match the given conditions.
        • -
        • If only one application is matched for the given conditions, that application is launched. If multiple matching applications are found, the application selector is shown and the user can select the proper application.
        • -
        -

        To allow the application launcher framework to find and select matching applications, each application must describe its operation, URI, or MIME type correctly.

        -

        The following code example launches a camera application with the operation and MIME type:

         #include <app.h>
         #include <dlog.h>
        @@ -253,8 +187,8 @@ else
         
         app_control_destroy(app_control);
         
        - -

        The following code example launches a gallery application with the operation, URI, and MIME type:

        +
      • +
      • To launch a gallery application with a specific operation, URI, and MIME type:
         #include <app.h>
        @@ -276,221 +210,58 @@ else
         
         app_control_destroy(app_control);
         
        - - - - - - - - - - -
        Note
        Since Tizen 2.4, service applications are only allowed to be launched explicitly. All service applications are excluded from matches of implicit launch requests.
        - -

        Getting the App Control Results

        -

        The app control result from the requested application is delivered to the caller application in the app_control handle with extra data. For some cases, the App Control API provides predefined extra data keys.

        -

        If you cannot find a proper key, you can define your own key. However, the customized key must be shared between the caller and callee applications.

        - -

        The following code example gets the result of an app control request by implementing an app_control result callback:

        - -
        -#include <app.h>
        -#include <dlog.h>
        -
        -#define TAG "MY_TAG"
        -
        -/* Callback function to get result */
        -static void
        -app_control_result(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
        -{
        -    char *value;
        -
        -    if (result == APP_CONTROL_RESULT_SUCCEEDED) {
        -        if (app_control_get_extra_data(reply, APP_CONTROL_DATA_SELECTED, &value) == APP_CONTROL_ERROR_NONE)
        -            dlog_print(DLOG_INFO, TAG, "[app_control_result_cb] Succeeded: value(%s)", value);
        -        else
        -            dlog_print(DLOG_ERROR, TAG, "[app_control_result_cb] Failed");
        -    } else {
        -        dlog_print(DLOG_ERROR, TAG, "[app_control_result_cb] APP_CONTROL_RESULT_FAILED.");
        -    }
        -}
        -
        - -

        The following code example requests the launch of another application:

        - -
        -#include <app.h>
        -#include <dlog.h>
        -
        -#define TAG "MY_TAG"
        -
        -app_control_h app_control;
        -
        -app_control_create(&app_control);
        -
        -app_control_set_operation(app_control, APP_CONTROL_OPERATION_CREATE_CONTENT);
        -app_control_set_mime(app_control, "text/plain");
        -
        -if (app_control_send_launch_request(app_control, app_control_result, NULL) == APP_CONTROL_ERROR_NONE)
        -    dlog_print(DLOG_INFO, TAG, "Succeeded: the application is launched.");
        -else
        -    dlog_print(DLOG_ERROR, TAG, "Failed to launch an application.");
        -
        -app_control_destroy(app_control);
        -
        - -

        The following code example implements an app_control callback in the callee application:

        - -
        -static void app_control(app_control_h app_control, void *user_data)
        -{
        -    struct appdata *ad = (struct appdata *)user_data;
        -    char *operation;
        -    char *mime;
        -    app_control_h reply;
        -    char *app_id;
        -
        -    app_control_get_operation(app_control, &operation);
        -
        -    if (!strcmp(operation, APP_CONTROL_OPERATION_CREATE_CONTENT)) {
        -        app_control_get_mime(app_control, &mime);
        -
        -        if (!strcmp(mime, "text/plain")) {
        -            app_control_create(&reply);
        -
        -            app_get_app_id(&app_id);
        -            app_control_add_extra_data(reply, APP_CONTROL_DATA_SELECTED, app_id);
        -            app_control_reply_to_launch_request(reply, app_control, APP_CONTROL_RESULT_SUCCEEDED);
        -
        -            app_control_destroy(reply);
        -        }
        -    }
        -}
        -
        - - -

        Common Application Controls

        - -

        The Tizen common application controls specify a standard protocol for sharing application functionalities. You can use the common application controls to perform some basic tasks, such as selecting a file or taking a picture.

        - -

        The following common application controls are available:

        - +

        Determining the Application for an Implicit Launch Request

        + +

        In case of an implicit launch, the platform determines which application to launch by "resolving the application control". This means that the platform considers the given conditions (operation, URI, and MIME type) in the launch request, searches the filters (installed applications with available application controls) in the device, and attempts to find a match.

        -

        Exporting AppControl Functionality

        -

        You can advertise your application features to other applications by exporting your application control functionalities. To allow other applications to find and use your application features implicitly without the application ID, declare your application control information in the tizen-manifest.xml file:

        -
        -<app-control>
        -   <mime name="application/xhtml+xml"/>
        -   <operation name="http://tizen.org/appcontrol/operation/view"/>
        -   <uri name="http://test.com"/>
        -</app-control>
        -<app-control>
        -   <operation name="http://tizen.org/appcontrol/operation/call"/>
        -</app-control>
        -
        +

        The launch request conditions are matched to the available filters using the following logic:

        - - - - - - - - - -
        Note
        In the application manifest file, the valid operation name format is http://tizen.org/appcontrol/operation/<verb>. You cannot use the related macro name, APP_CONTROL_OPERATION_<VERB>.
        +
          +
        1. The operation value is matched first. An exact match is required for the value in both the launch request and the filters. +

          If multiple matching filters with identical operations are available, the URI and MIME types in the matching filters are compared.

        2. + +
        3. If the launch request has URI or MIME types as a condition, the comparison is done only among the filters that have URI or MIME types. For example, if the launch request has a URI, but a filter does not, that filter is not added to the result even if the operations are the same. Similarly, if the launch request has MIME types, it is not compared to the filters that have no MIME types. +

          An exception is applied to the URIs with a "file" scheme for the value. If the launch request URI contains an existing file path and no MIME types are supplied, the filters that have the MIME type of the given file path are also added to the results.

          -

          - The resolution filter is used when resolving the application control. Each entry of the resolution filter has the <app-control> - element and forms an application resolution unit. The additional URI or MIME type information must contain the associated operation ID, and the retrieved application control must have the specified - application ID and operation ID when resolving the application control. -

          - +
          - +
          Note
          The additional URI or MIME type can contain wildcards, such as '*', to match against given conditions in the app control: -
          • In the MIME type, you can use 2 types of wildcards: image/* and */*.
          • -
          • In the additional URI, a more complex pattern of wildcards with similar semantics as the standard glob() function is available: '*' matches an arbitrary, possibly empty, string, and '?' matches an arbitrary character. Unlike in the glob() function, the '/' character can be matched by the wildcards. There are no [...] character ranges, and the wildcards '*' and '?' cannot be escaped to include them literally in a pattern.
          + A filter (application) that expects to match with any form of URI and any type of MIME must use '*' and */* in their application control information in the tizen-manifest.xml file, instead of leaving the value to NULL. Otherwise, the application is discarded by the platform when the application control is resolved.
          -

          - You can specify the application control information of your application in the application project settings in the Tizen Studio; an - operation ID must be specified for the application control. -

          - -

          Resolving Application Controls

          - -

          In case of an implicit launch, the platform resolves the application control with given conditions in the request by searching the filters (available application controls) in the device. The application control references the following conditions in its description:

          -
            -
          • Operation: exact match required for the value in both the request and the filters.
          • -
          • URI: exact, partial (scheme), and pattern matches are allowed according to the value in the filters.
          • -
          • MIME type: exact and pattern matches are allowed according to the value in the filters.
          • -
          -

          Each application control request has an operation value by default. In an application that is selected by the application control, the value in the request and the filters are always the same. Among the filters with identical operations, the URI and MIME types in the filters are compared with the following rules:

          +
        4. + +
        5. Unlike the operation, the URI and MIME types support wildcards on the filters. Detailed conditions for matches are:
            -
          • If the request has URI or MIME types as a condition, the comparison is done only among the filters that have URI or MIME types. For example, if the request has a URI, but a filter does not, that filter is not added to the result even if the operations are the same. Similarly, if the request has MIME types, it is not compared to the filters that have no MIME types. - -

            An exception is applied to the URIs with a "file" scheme for the value. If the URI of the request contains an existing file path and no MIME types are supplied, the filters that have the MIME type of the given file path are also added to the results.

            +
          • The URI match can be an exact, partial (scheme), or pattern match according to the value in the filters. URI filters are matched with the launch request if: +
              +
            • Both URIs are exactly the same.
            • +
            • Launch request URI passes the test with a glob()-like function with the filter URI.
            • +
            • Scheme and host part of the URI in the launch request and filters are the same.
            • +
            • Scheme part of the URI in the launch request and filters is the same.
            • +
          • -
          • Unlike the operation, the URI and MIME types support wildcards on the filters. Detailed conditions for matches are: -
              -
            • URI filters are matched if: -
                -
              • Both URIs are exactly the same.
              • -
              • URI in the request passes the test with a glob()-like function with the URI in the filters.
              • -
              • Scheme and host part of the URI in the request and the URI in the filters are the same.
              • -
              • Scheme part of the URI in the request and the URI in the filters are the same.
              • -
              -
            • -
            • MIME type filters are matched if: -
                -
              • Both MIME types are exactly the same.
              • -
              • MIME type in the request and the filters have the same type and '*' for the subtype.
              • -
              • The filters have */* for the MIME type.
              • -
              -
            • -
            +
          • The MIME type match can be an exact or pattern match according to the value in the filters. MIME type filters are matched with the launch request if: +
              +
            • Both MIME types are exactly the same.
            • +
            • MIME type in the launch request and filters has the same type and '*' for the subtype.
            • +
            • The filters have */* for the MIME type.
            • +
          - - - - - - - - - -
          Note
          - An application that expects to match with any form of URI and any type of MIME must use '*' and */* in the resolution filter instead of leaving the value to NULL. Otherwise, the application is discarded by the application control.
          +
        6. +
        + +

        The following examples show different scenarios for the results of resolving the application control:

          @@ -767,7 +538,196 @@ static void app_control(app_control_h app_control, void *user_data)
        -

        Managing Application Groups

        +

        Launch Process

        + +

        Regardless of the launch request type, when the application launcher framework has received and resolved a launch request, it starts the application by creating a new process and calling the entry point of the application:

        + +
          +
        1. Like a conventional Linux application, the main function of the application is its entry point. In the Tizen application, the main task is to hand over control to the application framework by calling the ui_app_main() function: + +
          +bool 
          +app_create(void *user_data)
          +{
          +    /*
          +       Take necessary actions before the main event loop starts
          +       Initialize UI resources and application data
          +       If this function returns true, the application main loop starts
          +       If this function returns false, the application terminates
          +    */
          +    return true;
          +}
          +
          +void
          +app_control(app_control_h app_control, void *user_data)
          +{
          +    /* Handle the launch request */
          +}
          +
          +void
          +app_pause(void *user_data)
          +{
          +    /* Take necessary actions when application becomes invisible */
          +}
          +
          +void
          +app_resume(void *user_data)
          +{
          +    /* Take necessary actions when application becomes visible */
          +}
          +
          +void
          +app_terminate(void *user_data)
          +{
          +    /* Release all resources */
          +}
          +
          +int
          +main(int argc, char *argv[])
          +{
          +    struct appdata ad;
          +
          +    ui_app_lifecycle_callback_s event_callback;
          +
          +    event_callback.create = app_create;
          +    event_callback.terminate = app_terminate;
          +    event_callback.pause = app_pause;
          +    event_callback.resume = app_resume;
          +    event_callback.app_control = app_control;
          +
          +    memset(&ad, 0x0, sizeof(struct appdata));
          +
          +    return ui_app_main(argc, argv, &event_callback, &ad);
          +}
          +
          +
        2. +
        3. The ui_app_main() function initializes the application and starts the main loop. +

          It takes 4 parameters and uses them to initialize the application. The argc and argv parameters contain the values from the application framework, and you must never change their values. The third parameter is a state transition handler that is responsible for managing the state transitions the application goes through while it is running. The fourth parameter is application data to be passed to each state handler.

          +
        4. +
        5. When the ui_app_main() is first invoked, the application moves from the ready state to the created state, and must initialize itself. During this transition, the application framework calls the application's app_create_cb() state transition callback just before the application enters the main loop. Within the registered callback, you must initialize the application resources and create the main window. +

          If the app_create_cb() callback function returns false, the application moves to the terminated state. If it returns true, the application enters the main loop.

          +
        6. +
        7. Just after the application enters the main loop, the application framework calls the application's app_control_cb() callback. +

          The callback is passed to the app_control handle containing the reason why the application was launched. For example, the application can be launched to open a file to handle the request that has been sent by other application. The application is always responsible for checking the content of the app_control handle and responding appropriately. The content of the app_control handle can be empty, if the application is launched by the user from the launcher.

          +

          If the application wants to return the result of the application control operation to the application that originally sent the launch request, the result can be sent with the app_control_reply_to_launch_request() function.

          + +
          +static void 
          +app_control(app_control_h app_control, void *user_data)
          +{
          +    struct appdata *ad = (struct appdata *)user_data;
          +    char *operation;
          +    char *uri;
          +    char *mime_type;
          +    app_control_h reply;
          +    char *app_id;
          +
          +    app_control_get_operation(app_control, operation);
          +
          +    if (!strcmp(operation, APP_CONTROL_OPERATION_VIEW)) {
          +        app_control_get_uri(app_control, &uri);
          +        app_control_get_mime(app_control, &mime_type);
          +
          +        if (uri && !strcmp(mime_type, "image/jpg"))
          +            display_image_file(ad, uri); /* Display a specific image file */
          +    }
          +
          +    if (!strcmp(operation, APP_CONTROL_OPERATION_CREATE_CONTENT)) {
          +        app_control_get_mime(app_control, &mime);
          +
          +        if (!strcmp(mime, "text/plain")) {
          +            app_control_create(&reply);
          +
          +            app_get_app_id(&app_id);
          +            app_control_add_extra_data(reply, APP_CONTROL_DATA_SELECTED, app_id);
          +            app_control_reply_to_launch_request(reply, app_control, APP_CONTROL_RESULT_SUCCEEDED);
          +
          +            app_control_destroy(reply);
          +        }
          +    }
          +
          +    if (ad->win)
          +        elm_win_activate(ad->win);
          +}
          +
          + +
        8. +
        + +

        Launch Results

        + +

        After the requested application (callee) has been launched and the launched application has performed the requested operation, the results of the operation are delivered back to the application that sent the original launch request (caller). The results are delivered in the app_control handle with extra data. For some cases, the App Control API provides predefined extra data keys.

        + +

        If the key you need is not predefined, you can create your own key. However, the customized key must be shared between the caller and callee applications.

        + +

        The following example shows how you can retrieve the results of the launch request and requested operation by implementing an application control result callback:

        + +
        +#include <app.h>
        +#include <dlog.h>
        +
        +#define TAG "MY_TAG"
        +
        +/* Callback function to get result */
        +static void
        +app_control_result(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
        +{
        +    char *value;
        +
        +    if (result == APP_CONTROL_RESULT_SUCCEEDED) {
        +        if (app_control_get_extra_data(reply, APP_CONTROL_DATA_SELECTED, &value) == APP_CONTROL_ERROR_NONE)
        +            dlog_print(DLOG_INFO, TAG, "[app_control_result_cb] Succeeded: value(%s)", value);
        +        else
        +            dlog_print(DLOG_ERROR, TAG, "[app_control_result_cb] Failed");
        +    } else {
        +        dlog_print(DLOG_ERROR, TAG, "[app_control_result_cb] APP_CONTROL_RESULT_FAILED.");
        +    }
        +}
        +
        + +

        Application Control Export

        + +

        You can allow other applications to launch your application and use your application features through application controls by exporting your application control functionalities. To allow other applications to launch your application implicitly without the application ID, declare your application control information in the tizen-manifest.xml file:

        +
        +<app-control>
        +   <mime name="application/xhtml+xml"/>
        +   <operation name="http://tizen.org/appcontrol/operation/view"/>
        +   <uri name="http://test.com"/>
        +</app-control>
        +<app-control>
        +   <operation name="http://tizen.org/appcontrol/operation/call"/>
        +</app-control>
        +
        + + + + + + + + + + +
        Note
        In the application manifest file, the valid operation name format is http://tizen.org/appcontrol/operation/<verb>. You cannot use the related macro name, APP_CONTROL_OPERATION_<VERB>.
        + +

        The operation, URI, and MIME type information is used when resolving the application control. The operation information is mandatory, while the URI or MIME type information is optional. Any application requesting a launch of your application must either specify your application ID (for an explicit launch) or have the same operation value and applicable URI and MIME type information (for an implicit launch).

        + + + + + + + + + + +
        Note
        The URI or MIME type can contain wildcards, such as '*', to match against given conditions in the app control: +
        • In the MIME type, you can use 2 types of wildcards: image/* and */*.
        • +
        • In the URI, a more complex pattern of wildcards with similar semantics as the standard glob() function is available: '*' matches an arbitrary, possibly empty, string, and '?' matches an arbitrary character. Unlike in the glob() function, the '/' character can be matched by the wildcards. There are no [...] character ranges, and the wildcards '*' and '?' cannot be escaped to include them literally in a pattern.
        + +

        You can specify the application control information of your application in the application project settings in the Tizen Studio.

        + +

        Application Group Management

        You can define the application launch mode and group your applications into entities that can be managed together.

        The main application group features include:

        @@ -788,23 +748,26 @@ static void app_control(app_control_h app_control, void *user_data)
      -

      Warm-up

      -

      Become familiar with the App Control API basics by learning about:

      - - -

      Prerequisites

      -

      To use the functions and data types of the App Control API (in mobile and wearable applications), include the <app_control.h> header file in your application:

      +

      To enable your application to use the application control functionality:

      +
        +
      1. +

        To use the App Control API (in mobile and wearable applications), the application has to request permission by adding the following privilege to the tizen-manifest.xml file:

        +
        +<privileges>
        +   <privilege>http://tizen.org/privilege/appmanager.launch</privilege>
        +</privileges>
        +
        +
      2. +
      3. +

        To use the functions and data types of the App Control API, include the <app_control.h> header file in your application:

         #include <app_control.h>
         
        +
      4. +
      -

      Running Applications Using Extra Data

      +

      Launching Applications Using Extra Data

      To run a specific application control with some preconfigured parameters:

      @@ -861,7 +824,7 @@ if (ret != APP_CONTROL_ERROR_NONE)
    • -

      Read the extra data set to the app_control instance using the app_control_foreach_extra_data() function. The same function used on the app_control_h instance returned by the app_control reply allows you to read the reply message.

      +

      In the launched application, read the extra data set to the app_control instance using the app_control_foreach_extra_data() function. The same function can be used in the original application to read the reply message, when the app_control_h instance is returned by the app_control reply.

       bool
      @@ -966,6 +929,34 @@ app_control(app_control_h app_control, void *data)
       
    • +

      Common Application Controls

      + +

      The Tizen common application controls specify a standard protocol for sharing application functionalities. You can use the common application controls to perform some basic tasks, such as selecting a file or taking a picture.

      + +

      The following common application controls are available:

      + +
      diff --git a/org.tizen.guides/html/native/app_management/app_icons_n.htm b/org.tizen.guides/html/native/app_management/app_icons_n.htm index 5c0589d..a2b537f 100644 --- a/org.tizen.guides/html/native/app_management/app_icons_n.htm +++ b/org.tizen.guides/html/native/app_management/app_icons_n.htm @@ -27,8 +27,6 @@

    Content

      -
    • Badges
    • -
    • Shortcuts
    • Prerequisites
    • Creating and Removing a Badge
    • Managing the Badge
    • @@ -49,55 +47,30 @@

      Application Icons

      -

      You can show the mobile application icon as a shortcut on the home screen to allow the user to easily access it. In the device application list, you can show a badge with the application icon to provide additional information about the application state or notifications to the user.

      - -

      Badges

      - -

      You can use badges in your application to inform the user about notifications and events. A badge is an image displayed on the application icon.

      - -

      To create a badge, use the badge_add() function. The application that creates the badge can also update and remove it. When applications are signed with the same certificate, they can control each other's badges.

      -

      If an application not signed with the same certificate must be allowed manage a badge, use the badge_add() function with a writable application ID. The writable application ID enables another application to control your application to manage the badge. You can also configure your application to handle the badge itself.

      - -

      Figure: Badge

      -

      Badge

      - -

      Before you start, remember to prepare your application to use the badge functionality.

      - -

      Shortcuts in Mobile Applications

      - -

      You can add your shortcut for the Home application.

      - -

      To add a shortcut, use the shortcut_add_to_home() function, which requests the Home application to add a new shortcut. You can also add a widget.

      -

      Before you start, remember to prepare your application to use the shortcut functionality.

      -

      Figure: Shortcuts

      -

      Shortcuts

      -

      There are 2 types of shortcuts:

      +

      You can show the mobile application icon as a shortcut on the home screen to allow the user to easily launch the application. In the device application list, you can show a badge with the application icon to provide additional information about the application state or notifications to the user.

      +

      The main features of the Badge and Shortcut API include:

        -
      • LAUNCH_BY_APP: Creates a shortcut to launch an application by a given application ID.
      • -
      • LAUNCH_BY_URI: Creates a shortcut to launch an application by a given URI. The URI is passed to the app_control_set_uri() function. For example, if you want to create a shortcut to open an image file, set the URI as file:///home/myhome/Photos/1_photo.jpg.
      • +
      • Creating and removing a badge +

        You can use badges in your application to inform the user about notifications and events. A badge is an image displayed on the application icon.

        +

        You can create a badge for an application and remove it.

      • +
      • Managing the badge +

        You can get and set the count and display attributes for the badge.

      • +
      • Adding a shortcut +

        You can add a shortcut to the home screen to launch an application.

      • +
      • Adding a widget +

        If you have created a widget application, you can add the widget to the home screen.

      -

      Warm-up

      -

      Become familiar with the Badge and Shortcut API basics by learning about:

      - +

      Figure: Badges and shortcuts

      +

      Shortcuts Badges

      Prerequisites

      To enable your application to use the application icon functionality:

      -
        -
      1. +
          +
        • To handle badges: +
          1. To use the Badge API (in mobile and wearable applications), the application has to request permission by adding the following privilege to the tizen-manifest.xml file:

             <privileges>
            @@ -123,7 +96,10 @@ static int ret = 0;
             
             #define TEST_PKG "org.tizen.badgeapp"
             
            +
        • +
        • To handle shortcuts: +
          1. To use the Shortcut API, the application has to request permission by adding the following privilege to the tizen-manifest.xml file:
             <privileges>
            @@ -135,21 +111,28 @@ static int ret = 0;
             
             #include <shortcut_manager.h>
             
            +
        • -
      +

    Creating and Removing a Badge

    + + +

    To create and remove badges:

    • -

      To create a badge for an application, call the badge_add() function.

      -

      The parameter defines the application for which the badge is added. If the application is adding a badge for itself, the parameter can be null.

      +

      To create a badge for an application, call the badge_add() function. The parameter defines the application for which the badge is added. If the application is adding a badge for itself, the parameter can be null.

      +
       ret = badge_add(TEST_PKG);
       if (ret != BADGE_ERROR_NONE)
           /* Error handling */
      -
    • + +

      The application that creates the badge can also update and remove it. When applications are signed with the same certificate, they can control each other's badges.

      +

      If an application not signed with the same certificate must be allowed manage a badge, use the badge_add() function with a writable application ID. The writable application ID enables another application to control your application to manage the badge. You can also configure your application to handle the badge itself.

      +
    • To remove the badge from the application, call the badge_remove() function. The only parameter is the ID of the application whose badge to remove.

      @@ -213,7 +196,14 @@ if (ret != BADGE_ERROR_NONE) shortcut_add_to_home("Music Player", LAUNCH_BY_APP, NULL, "/path/to/icon", 1, result_cb, NULL); -

      The icon parameter can be set to NULL to add a default icon for the application.

    • +

      The third parameter can be set to NULL to add a default icon for the application.

      + +

      The shortcut type is defined in the second parameter:

      +
        +
      • LAUNCH_BY_APP: Creates a shortcut to launch an application by a given application ID.
      • +
      • LAUNCH_BY_URI: Creates a shortcut to launch an application by a given URI. The URI is passed to the app_control_set_uri() function. For example, if you want to create a shortcut to open an image file, set the URI as file:///home/myhome/Photos/1_photo.jpg.
      • +
      +
    • Define a callback function to track possible errors:

      diff --git a/org.tizen.guides/html/native/app_management/app_manager_n.htm b/org.tizen.guides/html/native/app_management/app_manager_n.htm
      index c783837..4ddb259 100644
      --- a/org.tizen.guides/html/native/app_management/app_manager_n.htm
      +++ b/org.tizen.guides/html/native/app_management/app_manager_n.htm
      @@ -46,27 +46,17 @@
       

      Application Manager

      The application manager provides information about installed and running applications. It provides functions for obtaining the application name and absolute path to share files among all applications.

      - -

      The application manager uses several types of application handles:

      -
      • app_context_h is related to the running applications and can be used to manage the application context. - -

        For more information on the functions that use the app_context_h handle, see the Application Context API (in mobile and wearable applications).

      • -
      • app_info_h is related to the available applications (installed, but not necessarily running). To retrieve information on applications through a filter, you can also use the app_info_filter_h handle. -

        For more information on the functions that use the app_info_h and app_info_filter_h handles, see the Application Information API (in mobile and wearable applications).

      - -

      Iterator functions are used to travel through a list of applications. The app_manager_foreach_app_context() function is used in running applications and the app_manager_foreach_app_info() function is used in available applications. Each function calls a callback function (app_manager_app_context_cb() or app_manager_app_info_cb()), passing the handle for each application.

      - -

      Before you start, remember to prepare your application to use the application manager functionality.

      - -

      Warm-up

      -

      Become familiar with the Application Manager API basics by learning about:

      +

      The main features of the Application Manager API include:

        -
      • Prerequisites -

        Prepare your application to use the application manager functionality.

      • -
      • Managing the Application Context

        Retrieve the application context and operate on it.

      • -
      • Getting Information on Filtered Applications

        Retrieve information on filtered applications.

      • +
      • Managing the application context +

        You can retrieve the application context and operate on it. The app_context_h handle is related to the running applications and can be used to manage the application context.

        +

        For more information on the functions that use the app_context_h handle, see the Application Context API (in mobile and wearable applications).

      • +
      • Getting information on filtered applications +

        The app_info_h handle is related to the available applications (installed, but not necessarily running). To retrieve information on applications through a filter, you can also use the app_info_filter_h handle.

        +

        For more information on the functions that use the app_info_h and app_info_filter_h handles, see the Application Information API (in mobile and wearable applications).

        +
      - +

      Iterator functions are used to travel through a list of applications. The app_manager_foreach_app_context() function is used in running applications and the app_manager_foreach_app_info() function is used in available applications. Each function calls a callback function (app_manager_app_context_cb() or app_manager_app_info_cb()), passing the handle for each application.

      Prerequisites

      To use the functions and data types of the Application Manager API (in mobile and wearable applications), include the <app_manager.h> header file in your application:

      diff --git a/org.tizen.guides/html/native/app_management/app_preferences_n.htm b/org.tizen.guides/html/native/app_management/app_preferences_n.htm index e21aff0..22937df 100644 --- a/org.tizen.guides/html/native/app_management/app_preferences_n.htm +++ b/org.tizen.guides/html/native/app_management/app_preferences_n.htm @@ -47,15 +47,6 @@

      You can manage application preferences by setting and getting them. You can also share any stored preference data among the applications in the same package.

      -

      Warm-up

      -

      Become familiar with the Preference API basics by learning about:

      - - -

      Prerequisites

      To use the functions and data types of the Preference API (in mobile and wearable applications), include the <app_preference.h> header file in your application:

      diff --git a/org.tizen.guides/html/native/app_management/app_resources_n.htm b/org.tizen.guides/html/native/app_management/app_resources_n.htm index 2380a8b..a138a21 100644 --- a/org.tizen.guides/html/native/app_management/app_resources_n.htm +++ b/org.tizen.guides/html/native/app_management/app_resources_n.htm @@ -47,6 +47,11 @@

      This feature is supported in mobile applications only.

      +

      The main features of the Resource Manager API include:

      + +
        +
      • Setting resources +

        You can set resources for your application in the Resource Manager view in the Tizen Studio. By setting specific resources for specific languages and screen resolutions, you ensure that the application works flawlessly in multiple devices.

        @@ -60,51 +65,30 @@
        - -

        You can use different resources (such as images, layouts, and sounds) between devices with different device specifications. For example:

        - +
      • +
      • Using the resources +

        You can use different resources (such as images, layouts, and sounds) between devices with different device specifications. For example:

        • To set a different button image for an application depending on the device's current language setting, use the app_resource_manager_get() function to get the appropriate resource file path.
        • To use different images depending on the device's screen resolution (DPI), use the same app_resource_manager_get() function to get the appropriate image file path.
        -

        You can test the different resources by running them in the emulator. Before you start, remember to prepare your application to use the resource manager functionality.

        +
      • +
      • Testing the resources +

        You can test the different resources by running them in the emulator.

        - +
        Note
        The resource files must be in different folders and have the same filename. You can set the resources using the Resource Manager tool provided by the Tizen Studio.The resource files must be set to be in different folders and have the same filename.
        - -

        To use the app_resource_manager_get() function, you need 2 parameters:

        -
          -
        • Resource ID -

          The resource ID is an identifier for a specific resource. It consists of subdirectories and filenames including its extension. The same resources are located in different locations with the same filename for supporting multiple devices.

          -
        • -
        • Resource type -

          The resource type defines whether the resource is an image, layout, sound, or some other file type. There are 4 resource types, which are defined in the app_resource_e enumerator.

          - -

          Resources with the same resource type are grouped as a folder. The folder name is irrelevant to the actual resource type within it.

        -

        Warm-up

        -

        Become familiar with the Resource Manager tool and Resource Manager API basics by learning about:

        - - -

        Prerequisites

        +

        Prerequisites

        To use the functions and resource types of the Resource Manager API, include the <app_resource_manager.h> header file in your application:

        @@ -147,6 +131,7 @@
         
         
         

        Getting the Resource File Path

        +

        To get the appropriate resource file path in your code:

        1. Create the resource manager using the app_resource_manager_init() function. @@ -155,7 +140,19 @@ app_resource_manager_init();

        If the function returns APP_RESOURCE_ERROR_NONE, the resource manager has been successfully created.

      • -
      • Get the resource path using the app_resource_manager_get() function: +
      • Get the resource path using the app_resource_manager_get() function. You need 2 parameters: + +
          +
        • Resource ID +

          The resource ID is an identifier for a specific resource. It consists of subdirectories and filenames including its extension. The same resources are located in different locations with the same filename for supporting multiple devices.

          +
        • +
        • Resource type +

          The resource type defines whether the resource is an image, layout, sound, or some other file type. There are 4 resource types, which are defined in the app_resource_e enumerator.

          + +

          Resources with the same resource type are grouped as a folder. The folder name is irrelevant to the actual resource type within it.

          +
        • +
        +
         Evas_Object *img
         char *img_path = NULL;
        @@ -175,7 +172,6 @@ if (img_path != NULL) {
         }
         

        If the function returns APP_RESOURCE_ERROR_NONE, the resource path has been successfully retrieved.

        -

        You can retrieve 4 types of resources, as defined in the app_resource_e enumerator.

      • When you no longer need to get the resource path, call the app_resource_manager_release() function to release the resource manager instance. diff --git a/org.tizen.guides/html/native/app_management/applications_n.htm b/org.tizen.guides/html/native/app_management/applications_n.htm index 97b94e6..ee45f5a 100644 --- a/org.tizen.guides/html/native/app_management/applications_n.htm +++ b/org.tizen.guides/html/native/app_management/applications_n.htm @@ -51,7 +51,7 @@
      • UI Application

        The UI application is the most general Tizen application that has a graphical user interface. You can create diverse applications with a variety of features, and design versatile applications and intriguing user interfaces with text and graphics while taking advantage of many device functionalities, such as sensors and call operations. In addition, you can, for example, manage content and media files, use network and social services, and provide messaging and embedded Web browsing functionality.

      • -
      • DALi Application in mobile applications only +
      • DALi Application

        The DALi application is one of the Tizen native applications based on Dynamic Animation Library. The DALi internally defines a virtual 3D world (space) and maintains hierarchical objects in the 3D world. The hierarchical object tree is known as the scene graph. A node in the scene graph can have several children but often only a single parent, with the effect of a parent applied to all its child nodes; an operation performed on a group automatically propagates its effect to all of its members.

      • Service Application diff --git a/org.tizen.guides/html/native/app_management/dali_app_n.htm b/org.tizen.guides/html/native/app_management/dali_app_n.htm index e8cc334..7d76791 100644 --- a/org.tizen.guides/html/native/app_management/dali_app_n.htm +++ b/org.tizen.guides/html/native/app_management/dali_app_n.htm @@ -18,12 +18,13 @@
        -

        Mobile native

        +

        Mobile native Wearable native

        Dependencies

        • Tizen 2.4 and Higher for Mobile
        • +
        • Tizen 3.0 and Higher for Wearable

        Content

        @@ -100,12 +102,13 @@
        1. Create a DALi project:
            -
          1. In the Tizen Studio menu, go to File > New > Tizen Project. -

            Select a template for a mobile native application and create a project using the Basic UI with DALi template. Click Finish, and your project is created at the default location. If you want to change the location, uncheck Use default location and set a new location. For more information, see Creating the Application Project.

            +
          2. In the Tizen Studio menu, go to File > New > Tizen Project.
          3. +
          4. In the Project Wizard, select Template > Mobile or Wearable > Native Application > Basic UI with DALi.
          5. +
          6. Click Finish, and your project is created at the default location. If you want to change the location, uncheck Use default location and set a new location. For more information, see Creating the Application Project.

            Create a DALi project

          7. -
          8. The new project is shown in the Project Explorer view of the Tizen Studio. If you open the src/basicdaliapplication.cpp file, you can see the source code of the basic DALi application: +
          9. The new project is shown in the Project Explorer view of the Tizen Studio. If you open the src/basicuiwithdali.cpp file, you can see the source code of the basic DALi application:
             #include <dali-toolkit/dali-toolkit.h>
             
            @@ -138,8 +141,10 @@ class HelloWorldExample : public ConnectionTracker
                   stage.SetBackgroundColor( Color::WHITE );
             
                   TextLabel textLabel = TextLabel::New( "Hello World" );
            +      textLabel.SetSize( stage.GetSize() );
                   textLabel.SetAnchorPoint( AnchorPoint::TOP_LEFT );
            -      textLabel.SetName( "hello-world-label" );
            +      textLabel.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
            +      textLabel.SetProperty( TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
                   stage.Add( textLabel );
             
                   // Connect to touch and key event signals
            @@ -201,7 +206,7 @@ using namespace Dali::Toolkit;
             
          10. -

            The Dali::Application class initializes and sets up DALi.

            +

            The Dali::Application class (in mobile and wearable applications) initializes and sets up DALi.

            Create a Dali::Application instance:

            @@ -210,7 +215,7 @@ Application application = Application::New( &argc, &argv );
    • Several signals can be connected to keep you informed when certain platform-related activities occur, and ensure that, upon system events, DALi is called in a thread-safe manner.

      -

      To manage signal connection safely, DALi provides the Dali::ConnectionTracker class. A typical way for starting a DALi application is to create a class derived from the Dali::ConnectionTracker class and use its member functions as callback functions for DALi signals (for more information, see Automatic Connection Management). The HelloWorldExample class is used in other code samples in the Tizen DALi documentation.

      +

      To manage signal connection safely, DALi provides the Dali::ConnectionTracker class (in mobile and wearable applications). A typical way for starting a DALi application is to create a class derived from the Dali::ConnectionTracker class and use its member functions as callback functions for DALi signals (for more information, see Automatic Connection Management). The HelloWorldExample class is used in other code samples in the Tizen DALi documentation.

      After getting the initialized signal from the Dali::Application instance, you can use the DALi APIs for building the scene graph. Connect the HelloWorldExample::Create() callback to the DALi::Application::InitSignal() function:

      @@ -221,15 +226,17 @@ mApplication.InitSignal().Connect( this, &HelloWorldExample::Create );
    • Create an actor and add it to the stage: -

      The Dali::Toolkit::TextLabel UI component renders a short text string. To display the TextLabel component, add it to a stage. The stage instance is a singleton object (the only instance of its class during the lifetime of the program), so you can get it using a static function.

      +

      The Dali::Toolkit::TextLabel UI component (in mobile and wearable applications) renders a short text string. To display the TextLabel component, add it to a stage. The stage instance is a singleton object (the only instance of its class during the lifetime of the program), so you can get it using a static function.

       Stage stage = Stage::GetCurrent();
       stage.SetBackgroundColor( Color::WHITE );
       
       TextLabel textLabel = TextLabel::New( "Hello World" );
      +textLabel.SetSize( stage.GetSize() );
       textLabel.SetAnchorPoint( AnchorPoint::TOP_LEFT );
      -textLabel.SetName( "hello-world-label" );
      +textLabel.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
      +textLabel.SetProperty( TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
       stage.Add( textLabel );
       
      @@ -245,7 +252,7 @@ stage.KeyEventSignal().Connect( this, &HelloWorldExample::OnKeyEvent );

      Any key inputs and touches on the stage are handled by 2 callback functions, HelloWorldExample::OnKeyEvent and HelloWorldExample::OnTouch.

      -

      Note that the first parameter of the HelloWorldExample::OnTouch callback (actor) is passed by a value, not by a reference or a pointer. You can simply pass instances of most DALi classes by value, when the class inherits from the Dali::BaseHandle class. This is due to the handle/body pattern widely used in DALi.

      +

      Note that the first parameter of the HelloWorldExample::OnTouch callback (actor) is passed by a value, not by a reference or a pointer. You can simply pass instances of most DALi classes by value, when the class inherits from the Dali::BaseHandle class (in mobile and wearable applications). This is due to the handle/body pattern widely used in DALi.

       bool OnTouch( Actor actor, const TouchEvent& event )
      diff --git a/org.tizen.guides/html/native/app_management/data_bundles_n.htm b/org.tizen.guides/html/native/app_management/data_bundles_n.htm
      index 63a91e8..a791fef 100644
      --- a/org.tizen.guides/html/native/app_management/data_bundles_n.htm
      +++ b/org.tizen.guides/html/native/app_management/data_bundles_n.htm
      @@ -10,7 +10,7 @@
       	
       	
       	
      -  Data Bundles 
      +  Data Bundle 
         
        
        
      @@ -46,44 +46,22 @@
       
       
       
      -

      Data Bundles

      +

      Data Bundle

      -

      A bundle is a string-based dictionary abstract data type (ADT).

      -

      A dictionary is an ordered or unordered list of key-value pairs, where keys are used to locate elements in the list. The key is always a string.

      +

      A bundle is a string-based dictionary abstract data type (ADT). A dictionary is an ordered or unordered list of key-value pairs, where keys are used to locate elements in the list. The key is always a string.

      The main features of the Bundle API include:

      -

      Content

      Related Info

        @@ -46,15 +44,21 @@

        Data Control

        -

        Data control is a standard mechanism for exchanging specific data between applications.

        +

        The data control is a standard mechanism for exchanging specific data between applications.

        -

        All applications can request data shared by other applications using a data control. However, only service applications can provide their own data.

        -

        There are 2 types of data controls:

        -
        • DATA_CONTROL_SQL -

          Allows you to use a SQL-type data control to access specific data exported by other service applications. You can also define a SQL-type data control provider to export specific data from your service application.

        • -
        • DATA_CONTROL_MAP -

          Allows you to use a key-value-type data control to access data exported by other service applications. You can also define a key-value-type data control provider to export specific data from your service application.

        -

        Data controls can supply operations to access shared data, get back results, and monitor data changes and provide notifications about them. The available notification types are listed in the data_control_data_change_type_e enumerator (in mobile and wearable applications).

        +

        A provider application shares its data, and a consumer application can request the shared data. All applications can function as consumers and request data shared by other applications using a data control. However, only service applications can function as providers and share their own data.

        + +

        The main features of the Data Control API include:

        +
          +
        • Working with map-type data controls +

          With DATA_CONTROL_MAP you can use a key-value-type data control to access data exported by other service applications. You can also define a key-value-type data control provider to export specific data from your service application.

        • +
        • Working with SQL-type data controls +

          With DATA_CONTROL_SQL you can use a SQL-type data control to access specific data exported by other service applications. You can also define a SQL-type data control provider to export specific data from your service application.

        • +
        • Monitoring data changes +

          With data controls you can supply operations to access shared data, get back results, and monitor data changes and provide notifications about them. The available notification types are listed in the data_control_data_change_type_e enumerator (in mobile and wearable applications).

        • +
        +

        You can also export functionalities of your Tizen native application in the application project settings in the IDE.

        +

        The data control requires the following provider information:

        • Provider ID

          Unique provider ID to identify the data control for a specific provider.

          @@ -71,46 +75,25 @@

          Figure: Data control mechanism

          Data control mechanism

          -

          Before you start, remember to prepare your application to use the data control functionality.

          - -

          Using Data Controls

          -

          You can get a datacontrol_h instance from the datacontrol_map_create() or datacontrol_sql_create() function.

          -
          • Map-type data control -

            If you specify the datacontrol_h instance using the data_control_map_create(), data_control_map_set_provider_id(), or data_control_map_set_data_id() function, you can get the specific map-type data control uniquely.

            -

            After resolving the data control, call the data control map APIs, such as data_control_map_set(), data_control_map_get(), data_control_map_add(), and data_control_map_remove().

            -

            The result is returned by a response callback, such as data_control_map_get_response_cb(), data_control_map_set_response_cb(), data_control_map_add_response_cb(), or data_control_map_remove_response_cb() of the data_control_map_response_cb struct. The response callback is invoked when a service application finishes its operation.

          • -
          • SQL-type data control -

            If you specify the datacontrol_h instance using the data_control_sql_create(), data_control_sql_set_provider_id(), or data_control_sql_set_data_id() function, you can get the specific SQL-type data control uniquely.

            -

            After resolving the data control, call the data control SQL APIs, such as datacontrol_sql_select(), data_control_sql_insert(), data_control_sql_update(), and data_control_sql_delete().

            -

            The result is returned by a response callback, such as data_control_sql_select_response_cb(), data_control_sql_insert_response_cb(), data_control_sql_update_response_cb(), or data_control_sql_delete_response_cb() of the data_control_sql_response_cb struct. The response callback is invoked when a service application finishes its operation.

            -

            Once you get the result_set_cursor using the data_control_sql_select_response_cb() callback, you can use the following functions to get information:

            -
            • data_control_sql_step_first()
            • -
            • data_control_sql_step_last()
            • -
            • data_control_sql_step_next()
            • -
            • data_control_sql_set_previous()
            • -
            • data_control_sql_get_column_count()
            • -
            • data_control_sql_get_column_name()
            • -
            • data_control_sql_get_column_item_size()
            • -
            • data_control_sql_get_column_item_type()
            • -
            • data_control_sql_get_blob_data()
            • -
            • data_control_sql_get_int_data()
            • -
            • data_control_sql_get_int64_data()
            • -
            • data_control_sql_get_double_data()
            • -
            • data_control_sql_get_text_data()
          • +

            Prerequisites

            -
          • Data control change notification -

            If the consumer application wants to receive data change notifications from the provider application, it can add a data change callback to request the notifications:

            -
              -
            • The consumer application can add a data change callback using the data_control_add_data_change_cb() function. When no longer needed, the callback can be removed using the data_control_remove_data_change_cb() function.
            • -
            • To accept the callback addition and notification request from the consumer application, the provider application uses the data_control_provider_add_data_change_consumer_filter_cb() function to add a notification filter. When no longer needed, the filter can be removed using the data_control_provider_remove_data_change_consumer_filter_cb() function.
            • -
            • Use the data_control_provider_foreach_data_change_consumer() function to list all the consumers whose request for the data change notifications has been successful, and who can receive data change notifications from the provider application.
            • -
            +

            The data control use cases run 2 applications. Each application plays a different role: one for the consumer, another for the provider.

            + +

            To enable your application to use the data control functionality:

            +
              +
            1. +

              To use the Data Control API (in mobile and wearable applications), the consumer application has to request permission by adding the following privileges to the tizen-manifest.xml file:

              +
              +<privileges>
              +   <privilege>http://tizen.org/privilege/datasharing</privilege>
              +   <privilege>http://tizen.org/privilege/appmanager.launch</privilege>
              +</privileges>
              +
            2. -
          +
        • +

          For the provider application, in the Tizen Studio, double-click tizen-manifest.xml, and in the Tizen Manifest Editor, go to Advanced > Data Control, and click + to add the provider details. Add the Read and Write access rights to both SQL and Map types.

          -

          Developing with Data Controls

          -

          You can develop with data controls by adding the <datacontrol> element to the tizen-manifest.xml file.

          -

          The following code example describes how to add the <datacontrol> element:

          +

          The following code example shows how the <datacontrol> element is consequently added to the tizen-manifest.xml file:

           <?xml version="1.0" encoding="utf-8"?>
           <manifest xmlns="http://tizen.org/ns/packages" api-version="2.4" package="@PACKAGE_NAME@" version="@VERSION@"
          @@ -133,116 +116,6 @@
           </manifest>
           
          -

          The service application providing its own database file must register the provider callback using the data_control_provider_sql_register_cb() function. Similarly, the service application providing its own registry file or key-value pairs data set must register the provider callback using the data_control_provider_map_register_cb() function.

          -

          The service application sends the SQL- or map-type data control result to the other application by using functions, such as data_control_provider_send_select_result(), data_control_provider_send_insert_result(), data_control_provider_send_update_result(), or data_control_provider_send_delete_result().

          - - -

          You can export the data of your service application to other applications.

          - - -

          Exporting DataControl Functionality

          - -

          You can export functionalities of your Tizen native application in the application project settings in the Tizen Studio. The provider ID, type, and accessibility must be specified for the data control.

          -

          Figure: Exporting data control

          -

          Exporting data control

          -

          Data Model

          -

          The data model must be opened to the public to help other applications to use the exported data controls. The data model consists of the following data:

          -
            -
          • Provider ID -
              -
            • It is used for identifying a data control provider.
            • -
            • It must be unique and use a fully qualified domain name.
            • -
            • Platform-defined data control provider is defined in the format: http://tizen.org/datacontrol/provider/<application name> -
            • -
            • User-defined data control provider is defined in the format: http://<vendor.com>/datacontrol/provider/<application name> -
            • -
            -
          • -
          • Data ID -
              -
            • It is used for identifying data exported by the data control provider.
            • -
            • It must be unique in the data control provider and it is given as a string with a slash as a delimiter.
            • -
            -
          • -
          • Type -
              -
            • You can use Tizen native applications that provide their own data structure table and implement the SQL-type data control provider using the database file.
            • -
            • You can use Tizen native applications that provide their own key-value pairs data structure map and implement the map-type data control provider using registry file or collection map classes.
            • -
            -
          • -
          • Data schema -
              -
            • SQL-type data control exports column names and types of the data structure table.
            • -
            • Map-type data control exports key names and types of the data structure map.
            • -
            -
          • -
          • Data accessibility

            Tizen native applications can control read and write access from other applications by allowing data control accessibility.

          • -
          - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          - Table: Data model example of a data control provider -
          Data control typeData control provider IDData control data IDData schemaData accessibility
          SQLhttp://<vendor.com>/datacontrol/provider/sampledata1column1 -

          (Type: Integer)

          column2 -

          (Type: String)

          Read-Only
          Maphttp://<vendor.com>/datacontrol/provider/sample2data2key1 -

          (Type: String)

          key2 -

          (Type: String)

          Read-Write
          - -

          Warm-up

          -

          Become familiar with the Data Control API basics by learning about:

          - - -

          Prerequisites

          -

          The data control use cases run 2 applications. Each application plays a different role: one for the consumer, another for the provider.

          - -

          To enable your application to use the data control functionality:

          -
            -
          1. -

            To use the Data Control API (in mobile and wearable applications), the consumer application has to request permission by adding the following privileges to the tizen-manifest.xml file:

            -
            -<privileges>
            -   <privilege>http://tizen.org/privilege/datasharing</privilege>
            -   <privilege>http://tizen.org/privilege/appmanager.launch</privilege>
            -</privileges>
            -
            -
          2. -
          3. -

            For the provider application, in the Tizen Studio, double-click tizen-manifest.xml, and in the Tizen Manifest Editor, go to Advanced > Data Control > Add. Add the Read and Write access rights to both SQL and Map types.

          4. To use the functions and data types of the Data Control API, include the <data_control.h> header file in your application:

            @@ -259,7 +132,8 @@

          Working with Map-type Data Controls

          - +

          If you specify the datacontrol_h instance using the data_control_map_create(), data_control_map_set_provider_id(), or data_control_map_set_data_id() function, you can get the specific map-type data control uniquely. After resolving the data control, call the data control map APIs, such as data_control_map_set(), data_control_map_get(), data_control_map_add(), and data_control_map_remove().

          +

          The result is returned by a response callback, such as data_control_map_get_response_cb(), data_control_map_set_response_cb(), data_control_map_add_response_cb(), or data_control_map_remove_response_cb() of the data_control_map_response_cb struct. The response callback is invoked when a service application finishes its operation.

          To get, add, remove, and set map-type data using the Data Control API:

            @@ -555,6 +429,22 @@ app_create(void *data)

            Working with SQL-type Data Controls

            +

            If you specify the datacontrol_h instance using the data_control_sql_create(), data_control_sql_set_provider_id(), or data_control_sql_set_data_id() function, you can get the specific SQL-type data control uniquely. After resolving the data control, call the data control SQL APIs, such as datacontrol_sql_select(), data_control_sql_insert(), data_control_sql_update(), and data_control_sql_delete().

            +

            The result is returned by a response callback, such as data_control_sql_select_response_cb(), data_control_sql_insert_response_cb(), data_control_sql_update_response_cb(), or data_control_sql_delete_response_cb() of the data_control_sql_response_cb struct. The response callback is invoked when a service application finishes its operation.

            +

            Once you get the result_set_cursor object using the data_control_sql_select_response_cb() callback, you can use the following functions to get information:

            +
            • data_control_sql_step_first()
            • +
            • data_control_sql_step_last()
            • +
            • data_control_sql_step_next()
            • +
            • data_control_sql_set_previous()
            • +
            • data_control_sql_get_column_count()
            • +
            • data_control_sql_get_column_name()
            • +
            • data_control_sql_get_column_item_size()
            • +
            • data_control_sql_get_column_item_type()
            • +
            • data_control_sql_get_blob_data()
            • +
            • data_control_sql_get_int_data()
            • +
            • data_control_sql_get_int64_data()
            • +
            • data_control_sql_get_double_data()
            • +
            • data_control_sql_get_text_data()

            To insert, select, update, and delete SQL-type data using the Data Control API:

            @@ -657,7 +547,7 @@ update_request_cb(int request_id, data_control_h provider, bundle *update_data,
    • -

      Register the callbacks and create the database:

      +

      Register the callbacks using the data_control_provider_sql_register_cb() function and create the database:

       int
       create_database()
      @@ -897,6 +787,12 @@ app_create(void *data)
       
       
       

      Monitoring Data Changes

      +

      If the consumer application wants to receive data change notifications from the provider application, it can add a data change callback to request the notifications:

      +
        +
      • The consumer application can add a data change callback using the data_control_add_data_change_cb() function. When no longer needed, the callback can be removed using the data_control_remove_data_change_cb() function.
      • +
      • To accept the callback addition and notification request from the consumer application, the provider application uses the data_control_provider_add_data_change_consumer_filter_cb() function to add a notification filter. When no longer needed, the filter can be removed using the data_control_provider_remove_data_change_consumer_filter_cb() function.
      • +
      • Use the data_control_provider_foreach_data_change_consumer() function to list all the consumers whose request for the data change notifications has been successful, and who can receive data change notifications from the provider application.
      • +

      To monitor data changes and send notifications using the Data Control API:

      @@ -1046,6 +942,81 @@ remove_data_change_cb_func(void *data, Evas_Object *obj, void *event_info)
    • + +

      Data Control Export

      + +

      You can export functionalities of your Tizen native service application in the application project settings in the Tizen Studio. The provider ID, type, and accessibility must be specified for the data control.

      +

      Figure: Exporting data control

      +

      Exporting data control

      +

      Data Model

      +

      The data model must be opened to the public to help other applications to use the exported data controls. The data model consists of the following data:

      +
        +
      • Provider ID +
          +
        • It is used for identifying a data control provider.
        • +
        • It must be unique and use a fully qualified domain name.
        • +
        • Platform-defined data control provider is defined in the format: http://tizen.org/datacontrol/provider/<application name> +
        • +
        • User-defined data control provider is defined in the format: http://<vendor.com>/datacontrol/provider/<application name> +
        • +
        +
      • +
      • Data ID +
          +
        • It is used for identifying data exported by the data control provider.
        • +
        • It must be unique in the data control provider and it is given as a string with a slash as a delimiter.
        • +
        +
      • +
      • Type +
          +
        • You can use Tizen native applications that provide their own data structure table and implement the SQL-type data control provider using the database file.
        • +
        • You can use Tizen native applications that provide their own key-value pairs data structure map and implement the map-type data control provider using registry file or collection map classes.
        • +
        +
      • +
      • Data schema +
          +
        • SQL-type data control exports column names and types of the data structure table.
        • +
        • Map-type data control exports key names and types of the data structure map.
        • +
        +
      • +
      • Data accessibility

        Tizen native applications can control read and write access from other applications by allowing data control accessibility.

      • +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + Table: Data model example of a data control provider +
      Data control typeData control provider IDData control data IDData schemaData accessibility
      SQLhttp://<vendor.com>/datacontrol/provider/sampledata1column1 +

      (Type: Integer)

      column2 +

      (Type: String)

      Read-Only
      Maphttp://<vendor.com>/datacontrol/provider/sample2data2key1 +

      (Type: String)

      key2 +

      (Type: String)

      Read-Write
      + + diff --git a/org.tizen.guides/html/native/app_management/event_n.htm b/org.tizen.guides/html/native/app_management/event_n.htm index df49dbd..66dcc71 100644 --- a/org.tizen.guides/html/native/app_management/event_n.htm +++ b/org.tizen.guides/html/native/app_management/event_n.htm @@ -27,9 +27,10 @@

      Content

      Related Info

        @@ -44,22 +45,178 @@

        Event Broadcast and Subscription

        -

        The application can broadcast its own events to all listeners, and subscribe to events. The events can be either predefined system events from the platform (only platform modules can broadcast system events) or user-defined events (broadcast by UI and service applications). Before you start, remember to prepare your application to use the event functionality.

        +

        The application can broadcast its own events to all listeners, and subscribe to events. The events can be either predefined system events from the platform (only platform modules can broadcast system events) or user-defined events (broadcast by UI and service applications).

        This feature is supported in mobile applications only.

        The main features of the Event API are:

        • Event publication -

          To publish an event, use the event_publish_app_event() and event_publish_trusted_app_event() functions. The event_publish_trusted_app_event() function publishes a trusted event which can only be received by the application that has the same signature as the publishing application.

          +

          You can publish an event using the event_publish_app_event() and event_publish_trusted_app_event() functions. The event_publish_trusted_app_event() function publishes a trusted event which can only be received by the application that has the same signature as the publishing application.

        • Event subscription -

          To subscribe to an event, use the event_add_event_handler() function. When no longer needed, unsubscribe the event with the event_remove_event_handler() function.

          +

          You can subscribe to an event using the event_add_event_handler() function. When no longer needed, unsubscribe the event with the event_remove_event_handler() function.

        • Launch-On-Events

          Service applications can be launched when a desired target event occurs.

          -

          To register an interest in a Launch-On-Event, define the http://tizen.org/appcontrol/operation/launch_on_event operation in the tizen-manifest.xml file.

          + +
        • +
        + +

        The application can be suspended while in the background, causing a pause in event handling. Since the application cannot receive events in the suspended state, they are all delivered in series after the application exits the suspended state. Consider how to manage this situation and prevent the application from being flooded with events:

        +
        • To handle events in the background without going to a suspended state, declare a background category.
        • +
        • To avoid receiving any events that are triggered while the application is suspended, remove the event handler before entering the suspended state and add it back after exiting the suspended state. You can manage the event handler addition and removal in the APP_EVENT_SUSPENDED_STATE_CHANGED event callback, which is triggered each time the application enters and exist the suspended state.
        + + +

        Prerequisites

        + +

        To enable your application to use the event functionality:

        +
          +
        1. +

          To use the functions and data types of the Event API, include the <app_event.h> header file in your application:

          +
          +#include <app_event.h>
          +
          +
        2. +
        3. To use Launch-On-Events in your application, define the http://tizen.org/appcontrol/operation/launch_on_event operation in the tizen-manifest.xml file. +

          The URI name for the operation represents the event name in the Launch-On-Event format (event://{Event_Name}).

          + +
          +<app-control>
          +   <operation name="http://tizen.org/appcontrol/operation/launch_on_event"/>
          +   <uri name="event://tizen.system.event.battery_charger_status"/>
          +</app-control>
          +
          +
        4. +
        + +

        Publishing an Event

        + +

        To publish an event to all listeners:

        + +
          +
        1. Create the callback for handling the event: +
          +static void
          +user_event_cb(const char *event_name, bundle *event_data, void *user_data)
          +{
          +    dlog_print(DLOG_INFO, LOG_TAG, "user_event_cb: %s \n", event_name);
          +
          +    return;
          +}
          +
          +
        2. +
        3. Register the event handler and create the bundle for handling the event data: +
          +int ret = EVENT_ERROR_NONE;
          +event_handler_h event_handler;
          +bundle *event_data = NULL;
          +
          +ret = event_add_event_handler("event.org.tizen.senderapp.user_event",
          +                              user_event_cb, "CUSTOM_EVENT_KEY", &event_handler);
          +
          +if (ret != EVENT_ERROR_NONE)
          +    dlog_print(DLOG_ERROR, LOG_TAG, "err: [%d]", ret);
          +
          +event_data = bundle_create();
          +
          +ret = bundle_add_str(event_data, user_data_key, user_data);
          +
          +
        4. +
        5. Use the event_publish_app_event() function to publish the event: +
          +ret = event_publish_app_event("event.org.tizen.senderapp.user_event", event_data);
          +
          +if (ret != EVENT_ERROR_NONE)
          +    dlog_print(DLOG_ERROR, LOG_TAG, "err: [%d]", ret);
          +
          +
        6. +
        7. When no longer needed, free the bundle: +
          +ret = bundle_free(event_data);
          +
          +
        8. +
        + + +

        Subscribing to an Event

        + +

        To subscribe to a predefined system event or user-defined event:

        +
          +
        1. Add an event handler. +

          One event can have multiple event handlers, and one handler can be registered multiple times.

          + +
          • Add an event handler for a system event: + +
            +static void
            +battery_event_callback(const char *event_name, bundle *event_data, void *user_data)
            +{
            +    /* event_name is the event name */
            +    dlog_print(DLOG_INFO, LOG_TAG, "event_name is [%s]", event_name);
            +
            +    /* event_data is the event data, its type is bundle */
            +    char *battery_level_status = NULL;
            +    battery_level_status = bundle_get_val(event_data, EVENT_KEY_BATTERY_LEVEL_STATUS);
            +}
            +
            +event_handler_h handler;
            +
            +/* Register the event handler */
            +int ret = event_add_event_handler(SYSTEM_EVENT_BATTERY_LEVEL_STATUS,
            +                                  (event_cb)battery_event_cb, user_data, &handler);
            +if (ret != EVENT_ERROR_NONE)
            +    dlog_print(DLOG_ERROR, LOG_TAG, "err: [%d]", ret);
            +
            +
          • + +
          • Add an event handler for a user-defined event: + +

            When defining an event name for a user event (such as event.org.tizen.senderapp.user_event), the name format is event.{sender appid}.{user-defined name}. The {user-defined name} must:

            +
              +
            • Contain only the ASCII characters "[A-Z][a-z][0-9]_" and not begin with a digit.
            • +
            • Not contain the '.' (period) character.
            • +
            • Not exceed the maximum name length (127 bytes).
            • +
            • Be at least 1 byte in length.
            • +
            +
            +ret = event_add_event_handler("event.org.tizen.senderapp.user_event",
            +                              utc_event_cb_with_valid_check,
            +                              "CUSTOM_EVENT_KEY", &event_handler);
            +
            +if (ret != EVENT_ERROR_NONE)
            +    dlog_print(DLOG_ERROR, LOG_TAG, "err: [%d]", ret);
            +
            +
        2. + +
        3. When no longer needed, remove the event handler. +

          A registered handler can be removed when application is running, and all registered handlers are removed when the application is terminated.

          + +
          +ret = event_remove_event_handler(handler);
          +if (ret != EVENT_ERROR_NONE)
          +    dlog_print(DLOG_ERROR, LOG_TAG, "err: [%d]", ret);
          +
          +
        4. + +
        + +

        Managing Launch-On-Events

        + +

        To register an interest in a Launch-On-Event, define the http://tizen.org/appcontrol/operation/launch_on_event operation in the tizen-manifest.xml file.

        + + + + + + + + + + +
        Note
        Only service applications can register and receive Launch-On-Events. +

        The Launch-On-Event operation cannot be requested using the app_control_send_launch_request() function, unlike other application control operations.

        The following table shows the system events that support Launch-On-Event.

        @@ -90,13 +247,38 @@ - -
      -

      The application can be suspended while in the background, causing a pause in event handling. Since the application cannot receive events in the suspended state, they are all delivered in series after the application exits the suspended state. Consider how to manage this situation and prevent the application from being flooded with events:

      -
      • To handle events in the background without going to a suspended state, declare a background category.
      • -
      • To avoid receiving any events that are triggered while the application is suspended, remove the event handler before entering the suspended state and add it back after exiting the suspended state. You can manage the event handler addition and removal in the APP_EVENT_SUSPENDED_STATE_CHANGED event callback, which is triggered each time the application enters and exist the suspended state.
      +

      To receive the Launch-On-Event:

      + +
      +static void
      +*app_control(app_control_h app_control, void *data)
      +{
      +    char *event_uri = "event://tizen.system.event.battery_charger_status";
      +    char *operation;
      +    char *uri;
      +    char *event_value;
      +    ret = app_control_get_operation(app_control, &operation);
      +
      +    if (ret == APP_CONTROL_ERROR_NONE && operation &&
      +         strcmp(operation, APP_CONTROL_OPERATION_LAUNCH_ON_EVENT) == 0) {
      +        ret = app_control_get_uri(app_control, &uri);
      +        if (ret == APP_CONTROL_ERROR_NONE && uri) {
      +            if (strncmp(uri, event_uri, strlen(event_uri) + 1) == 0) {
      +                ret = app_control_get_extra_data(app_control, "battery_charger_status", &event_value);
      +                if (ret == APP_CONTROL_ERROR_NONE && event_value)
      +                    free(event_value);
      +                /* Use event_add_event_handler() for further event subscriptions here */
      +            }
      +            free(uri);
      +        }
      +        free(operation);
      +    }
      +}
      +
      +

      The application can get the event name and data in the first app_control_cb() callback, which is called after the application state changes to created.

      +

      Platform Event Types

      The following table lists the platform event types.

      @@ -521,195 +703,6 @@
      -

      Warm-up

      -

      Become familiar with the Event API basics by learning about:

      - - -

      Prerequisites

      - -

      To enable your application to use the event functionality:

      -
        -
      1. -

        To use the functions and data types of the Event API, include the <app_event.h> header file in your application:

        -
        -#include <app_event.h>
        -
        -
      2. -
      3. To use Launch-On-Events in your application, define the http://tizen.org/appcontrol/operation/launch_on_event operation in the tizen-manifest.xml file. -

        The URI name for the operation represents the event name in the Launch-On-Event format (event://{Event_Name}).

        - -
        -<app-control>
        -   <operation name="http://tizen.org/appcontrol/operation/launch_on_event"/>
        -   <uri name="event://tizen.system.event.battery_charger_status"/>
        -</app-control>
        -
        -
      4. -
      - -

      Subscribing to an Event

      - -

      To subscribe to a predefined system event or user-defined event:

      -
        -
      1. Add an event handler. -

        One event can have multiple event handlers, and one handler can be registered multiple times.

        - -
        • Add an event handler for a system event: - -
          -static void
          -battery_event_callback(const char *event_name, bundle *event_data, void *user_data)
          -{
          -    /* event_name is the event name */
          -    dlog_print(DLOG_INFO, LOG_TAG, "event_name is [%s]", event_name);
          -
          -    /* event_data is the event data, its type is bundle */
          -    char *battery_level_status = NULL;
          -    battery_level_status = bundle_get_val(event_data, EVENT_KEY_BATTERY_LEVEL_STATUS);
          -}
          -
          -event_handler_h handler;
          -
          -/* Register the event handler */
          -int ret = event_add_event_handler(SYSTEM_EVENT_BATTERY_LEVEL_STATUS,
          -                                  (event_cb)battery_event_cb, user_data, &handler);
          -if (ret != EVENT_ERROR_NONE)
          -    dlog_print(DLOG_ERROR, LOG_TAG, "err: [%d]", ret);
          -
          -
        • - -
        • Add an event handler for a user-defined event: - -

          When defining an event name for a user event (such as event.org.tizen.senderapp.user_event), the name format is event.{sender appid}.{user-defined name}. The {user-defined name} must:

          -
            -
          • Contain only the ASCII characters "[A-Z][a-z][0-9]_" and not begin with a digit.
          • -
          • Not contain the '.' (period) character.
          • -
          • Not exceed the maximum name length (127 bytes).
          • -
          • Be at least 1 byte in length.
          • -
          -
          -ret = event_add_event_handler("event.org.tizen.senderapp.user_event",
          -                              utc_event_cb_with_valid_check,
          -                              "CUSTOM_EVENT_KEY", &event_handler);
          -
          -if (ret != EVENT_ERROR_NONE)
          -    dlog_print(DLOG_ERROR, LOG_TAG, "err: [%d]", ret);
          -
          -
      2. - -
      3. When no longer needed, remove the event handler. -

        A registered handler can be removed when application is running, and all registered handlers are removed when the application is terminated.

        - -
        -ret = event_remove_event_handler(handler);
        -if (ret != EVENT_ERROR_NONE)
        -    dlog_print(DLOG_ERROR, LOG_TAG, "err: [%d]", ret);
        -
        -
      4. - -
      - - -

      Publishing an Event

      - -

      To publish an event to all listeners:

      - -
        -
      1. Create the callback for handling the event: -
        -static void
        -user_event_cb(const char *event_name, bundle *event_data, void *user_data)
        -{
        -    dlog_print(DLOG_INFO, LOG_TAG, "user_event_cb: %s \n", event_name);
        -
        -    return;
        -}
        -
        -
      2. -
      3. Register the event handler and create the bundle for handling the event data: -
        -int ret = EVENT_ERROR_NONE;
        -event_handler_h event_handler;
        -bundle *event_data = NULL;
        -
        -ret = event_add_event_handler("event.org.tizen.senderapp.user_event",
        -                              user_event_cb, "CUSTOM_EVENT_KEY", &event_handler);
        -
        -if (ret != EVENT_ERROR_NONE)
        -    dlog_print(DLOG_ERROR, LOG_TAG, "err: [%d]", ret);
        -
        -event_data = bundle_create();
        -
        -ret = bundle_add_str(event_data, user_data_key, user_data);
        -
        -
      4. -
      5. Use the event_publish_app_event() function to publish the event: -
        -ret = event_publish_app_event("event.org.tizen.senderapp.user_event", event_data);
        -
        -if (ret != EVENT_ERROR_NONE)
        -    dlog_print(DLOG_ERROR, LOG_TAG, "err: [%d]", ret);
        -
        -
      6. -
      7. When no longer needed, free the bundle: -
        -ret = bundle_free(event_data);
        -
        -
      8. -
      - -

      Managing Launch-On-Events

      - - - - - - - - - - -
      Note
      Only service applications can register and receive Launch-On-Events. -

      The Launch-On-Event operation cannot be requested using the app_control_send_launch_request() function, unlike other application control operations.

      - -

      To receive the Launch-On-Event:

      - -
      -static void
      -*app_control(app_control_h app_control, void *data)
      -{
      -    char *event_uri = "event://tizen.system.event.battery_charger_status";
      -    char *operation;
      -    char *uri;
      -    char *event_value;
      -    ret = app_control_get_operation(app_control, &operation);
      -
      -    if (ret == APP_CONTROL_ERROR_NONE && operation &&
      -         strcmp(operation, APP_CONTROL_OPERATION_LAUNCH_ON_EVENT) == 0) {
      -        ret = app_control_get_uri(app_control, &uri);
      -        if (ret == APP_CONTROL_ERROR_NONE && uri) {
      -            if (strncmp(uri, event_uri, strlen(event_uri) + 1) == 0) {
      -                ret = app_control_get_extra_data(app_control, "battery_charger_status", &event_value);
      -                if (ret == APP_CONTROL_ERROR_NONE && event_value)
      -                    free(event_value);
      -                /* Use event_add_event_handler() for further event subscriptions here */
      -            }
      -            free(uri);
      -        }
      -        free(operation);
      -    }
      -}
      -
      -

      The application can get the event name and data in the first app_control_cb() callback, which is called after the application state changes to created.

      diff --git a/org.tizen.guides/html/native/app_management/message_port_n.htm b/org.tizen.guides/html/native/app_management/message_port_n.htm index 601875f..fe8d1a5 100644 --- a/org.tizen.guides/html/native/app_management/message_port_n.htm +++ b/org.tizen.guides/html/native/app_management/message_port_n.htm @@ -27,7 +27,6 @@

    Content

      -
    • Trusted Communication
    • Prerequisites
    • Using Uni-directional Communication
    • Using Bi-directional Communication
    • @@ -45,55 +44,26 @@

      Message Port

      Tizen applications can communicate with each other using message ports. Applications can send and receive messages through message port communication. The message data type for communication is a map data which consists of a bundle (key and value pair).

      -

      You can communicate between applications using 2 types of message port:

      -
      • Local port is used to register your message port and prepare to receive messages from another application. +

        The main features of the Message Port API include:

        + + +

        You can communicate using 2 types of message ports:

        +
        • Local port is used to register your message port and prepare to receive messages from another application.

          To receive messages from the another application, set the callback from the local message port.

        • -
        • Remote port is used to send messages to other applications. The local message port information can be sent to the other application for bi-directional communication.
        - -

        Before you start, remember to prepare your application to use the message port functionality.

        - -

        A message port supports 2 communication methods:

        -
        • Uni-directional communication -
          • Check whether the message port of a remote application is registered with the message_port_check_remote_port() function.
          • -
          • A Tizen application can send messages to another application using the message_port_send_message() function.
          • -
          • Another application can receive the messages using the message_port_register_local_port() function.
          -

          Figure: Uni-directional communication

          -

          Uni-directional communication

        • -
        • Bi-directional communication -
          • Check whether the trusted message port of a remote application is registered with the message_port_check_remote_port() function.
          • -
          • A Tizen application can send messages and local message port information to another application using the message_port_send_message_with_local_port() function. This local message port information can be used to send the response messages from the other application which receives these messages.
          • -
          • Another application can receive the messages using the message_port_register_local_port() function. The remote message port information can be used to send response messages to the application which sends the messages.
          -

          Figure: Bi-directional communication

          -

          Bi-directional communication

        - -

        Trusted Communication

        -

        You can send and receive trusted messages through message port APIs. The trusted message port instance can be retrieved using the message_port_register_trusted_local_port() function. Communication over the trusted message port is allowed only if both applications are signed with a certificate that is uniquely assigned to its developer.

        -

        Figure: Trusted message port communication

        -

        Trusted message port communication

        - -

        Warm-up

        -

        Become familiar with the Message Port API basics by learning about:

        - - +
      • Remote port is used to send messages to other applications. The local message port information can be sent to the other application for bi-directional communication.

      Prerequisites

      -

      To enable your application to use the message port functionality:

      1. You need 2 applications to communicate with each other through the message port.

      2. -
      3. To use trusted message port communication, both applications must have the same certificate. To create and register an author certificate, go to the Tizen Studio menu and select Preferences > Tizen Studio > Security Profiles. For more information, see Working with the Certificate Profile.

        +
      4. To use trusted message port communication, both applications must have the same certificate. To create and register an author certificate, go to the Tizen Studio menu and select Tools > Certificate Manager. For more information, see Working with the Certificate Profile.

      5. To use the functions and data types of the Message Port API (in mobile and wearable applications), include the <message_port.h> header file in your application:

        @@ -103,12 +73,10 @@

      Using Uni-directional Communication

      - -

      To send a message from Application 1 to Application 2 using the Message Port API:

      - +

      To use uni-directional communication, you must check whether the message port of a remote application is registered with the message_port_check_remote_port() function. You can then send messages to the remote application using the message_port_send_message() function. The remote application can receive the messages using the message_port_register_local_port() function.

      Figure: Uni-directional message port communication

      Uni-directional message port communication

      - +

      To send a message from Application 1 to Application 2 using the Message Port API:

        @@ -185,10 +153,11 @@ send_message(void)

        Using Bi-directional Communication

        -

        To send a message from Application 1 to Application 2, and from Application 2 to Application 1:

        +

        To use bi-directional communication, you must check whether the message port of a remote application is registered with the message_port_check_remote_port() function. You can then send messages and local message port information to the remote application using the message_port_send_message_with_local_port() function. The remote application can use the local message port information to send response messages after it receives your messages using the message_port_register_local_port() function.

        +

        Figure: Bi-directional message port communication

        Bi-directional message port communication

        - +

        To send a message from Application 1 to Application 2, and from Application 2 to Application 1:

        1. Implement the response logic in both applications:

          @@ -269,14 +238,11 @@ if (test_check_remote_port()) {

        Using Trusted Communication

        - -

        To use the trusted message port communication:

        +

        The trusted message port instance can be retrieved using the message_port_register_trusted_local_port() function. Communication over the trusted message port is allowed only if both applications are signed with a certificate that is uniquely assigned to its developer.

        Figure: Trusted uni-directional message port communication

        Trusted uni-directional message port communication

        - -

        During trusted message port communication, only applications signed with the same certificate can communicate with each other.

        - -

        The usage is similar to the normal Message Port API implementation. However, you must use trusted functions instead of normal functions.

        + +

        The trusted communication work similarly as normal message port communication. The only difference is that you must use trusted functions instead of normal functions, as defined in the following table.

        diff --git a/org.tizen.guides/html/native/app_management/package_manager_n.htm b/org.tizen.guides/html/native/app_management/package_manager_n.htm index 11cc197..c2bf635 100644 --- a/org.tizen.guides/html/native/app_management/package_manager_n.htm +++ b/org.tizen.guides/html/native/app_management/package_manager_n.htm @@ -47,29 +47,15 @@

        The main features of the Package Manager API include:

          -
        • Retrieving individual package information -

          To retrieve package information, get the package_info_h object using the package_info_create() or package_manager_get_package_info() function.

        • +
        • Retrieving information from all installed packages

          Use the package_manager_foreach_package_info() function to retrieve the package information of all installed packages. As a result, the package_manager_package_info_cb() callback is invoked and you can get package information.

        • +
        • Retrieving individual package information +

          To retrieve package information, get the package_info_h object using the package_info_create() or package_manager_get_package_info() function.

        • Monitoring changes

          You can monitor package events, such as installation, uninstallation, and updates.

        -

        Before you start, remember to prepare your application to use the package manager functionality.

        - -

        Warm-up

        -

        Become familiar with the Package Manager API basics by learning about:

        - -

        Prerequisites

        To enable your application to use the package manager functionality:

        diff --git a/org.tizen.guides/html/native/app_management/service_app_n.htm b/org.tizen.guides/html/native/app_management/service_app_n.htm index 9ee0227..dfada1a 100644 --- a/org.tizen.guides/html/native/app_management/service_app_n.htm +++ b/org.tizen.guides/html/native/app_management/service_app_n.htm @@ -27,7 +27,8 @@

        Content

          -
        • Service Application Event Callbacks
        • +
        • Application States
        • +
        • Event Callbacks
        • Application Attributes
        • Prerequisites
        • Monitoring Events
        • @@ -45,11 +46,22 @@

          Service Application

          Service applications are Tizen native applications with no graphical user interface that run in the background. They can be very useful in performing activities (such as getting sensor data in the background) that need to run periodically or continuously, but do not require any user intervention.

          + +

          The main Service Application API features include:

          +
            +
          • Application states +

            A Tizen native service application has several different states, which it transitions through during its life-cycle.

          • +
          • Event callbacks +

            The service application can receive both basic system events and application state change events. You can register callbacks for these events to react to them.

          • +
          • Application behavior attributes +

            You can determine your application behavior at boot time and after abnormal terminations by using specific attributes, which you can set in the application manifest file.

          • +
          +

          Service applications can be explicitly launched by a UI application. They can also be launched conditionally.

          The user can check the running service applications in the task switcher; however, no events occur if the user selects a service application from the task switcher. The main menu does not contain icons for service applications. Multiple service applications can be running simultaneously with other service and UI applications.

          -

          Before you start, remember to prepare your application to use the service application functionality.

          +

          Application States

          The following figure and table describe the service application states.

          @@ -87,7 +99,7 @@

          Because the service application has no UI, it neither has a pause state. Since Tizen 2.4, the service application can go into the suspended state. Basically, the service application is running on the background by its nature; so the platform does not allow the running of the service application unless it is designated as a background category application. However, when the UI application that is packaged with the service application is running in the foreground, the service application is also regarded as a foreground application and it can be run without a designated background category.

          -

          Service Application Event Callbacks

          +

          Event Callbacks

          You can control the service application execution by monitoring and reacting to application state change and system events.

          @@ -241,14 +253,6 @@
        Table: Corresponding normal and trusted communication functions
        -

        Warm-up

        -

        Become familiar with the Service Application API basics by learning about:

        - -
          -
        • Prerequisites -

          Prepare your application to use the service application functionality.

        • -
        • Monitoring Events

          Register and set callbacks for application state change events and system events.

        • -

        Prerequisites

        diff --git a/org.tizen.guides/html/native/app_management/ui_app_n.htm b/org.tizen.guides/html/native/app_management/ui_app_n.htm index 0c3134d..6d0bc2c 100644 --- a/org.tizen.guides/html/native/app_management/ui_app_n.htm +++ b/org.tizen.guides/html/native/app_management/ui_app_n.htm @@ -29,12 +29,11 @@

    Content

    Related Info

      @@ -49,24 +48,18 @@

      A Tizen native application is similar to a conventional Linux application, with some additional features optimized for mobile and wearable devices. The additional features have constraints, such as a relatively small screen size and lack of system resources compared to a larger system. For example, for power management reasons, the application can take actions to reduce usage when it finds out that it has its display window covered over by another application window. State change events are delivered to make it possible to detect these situations.

      -

      The Application API provides interfaces for the following categories:

      +

      The main Application API features include:

      - -

      Before you start, remember to prepare your application to use the application functionality.

      - -

      Managing the Event Loop

      -

      In order for an application to operate successfully, it must receive events from the platform. For this, it must start the main event loop - this is mandatory for all Tizen native applications.

      -

      The ui_app_main() function is used to start the event loop. Before calling this function, set up the app_event_callback_s structure variable, which is passed to the function.

      -

      For more information about launching applications, see Application Controls.

      - -

      Registering Callbacks for Events

      +

      Event Callbacks

      The following table lists the application state change events.

      @@ -97,7 +90,7 @@
      -

      For more information, see Managing Application States and Transitions.

      +

      For more information, see Application State and Transition Management.

      To listen to system events, use the ui_app_add_event_handler() function. The system events are triggered with the app_event_cb() callback function. The following table lists the event types.

      @@ -137,7 +130,7 @@ -

      Managing Application States and Transitions

      +

      Application States and Transitions

      The Tizen native application can be in one of several different application states.

      @@ -180,122 +173,7 @@

      Figure: Application state transitions

      Application state transitions

      -

      Allowing Applications to Run on the Background

      - -

      Since Tizen 2.4, the application is not allowed to run on the background except when it is explicitly declared to do so. The following table lists the background categories that allow the application to run on the background.

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Table: Allowed background application policy
      Background categoryDescriptionRelated APIsManifest file <background-category> element value
      MediaPlaying audio, recording, and outputting streaming video on the backgroundMultimedia API (in mobile and wearable applications)media
      DownloadDownloading data with the Tizen Download-manager APIDownload API (in mobile applications)download
      Background networkProcessing general network operations on the background (such as sync-manager, IM, and VOIP)Sync Manager API (in mobile applications), Socket, and Curl API (in mobile and wearable applications)background-network
      LocationProcessing location data on the backgroundLocation API (in mobile and wearable applications)location
      Sensor (context)Processing context data from the sensors, such as gestureSensor API (in mobile and wearable applications)sensor
      IoT Communication/ConnectivityCommunicating between external devices on the background (such as Wi-Fi and Bluetooth)Wi-Fi (in mobile and wearable applications) and Bluetooth API (in mobile and wearable applications)iot-communication
      - -

      Describing the Background Category

      -

      An application with a background running capability must declare the background category in its manifest file:

      - -
      -<?xml version="1.0" encoding="utf-8"?>
      -<manifest xmlns="http://tizen.org/ns/packages" api-version="2.4" package="org.tizen.test" version="1.0.0">
      -   <ui-application appid="org.tizen.test" exec="text" type="capp" multiple="false" taskmanage="true" nodisplay="false">
      -      <icon>rest.png</icon>
      -      <label>rest</label>
      -      <!--For API version 2.4 and higher-->
      -      <background-category value="media"/>
      -      <background-category value="download"/>
      -      <background-category value="background-network"/>
      -   </ui-application>
      -   <service-application appid="org.tizen.test-service" exec="test-service" multiple="false" type="capp">
      -      <background-category value="background-network"/>
      -      <background-category value="location"/>
      -   </service-application>
      -</manifest>
      -
      - - - - - - - - - - - - -
      Note
      The <background-category> element is supported since the API version 2.4. An application with a <background-category> element declared can fail to be installed on devices with a Tizen version lower than 2.4. In this case, declare the background category as <metadata key="http://tizen.org/metadata/background-category/<value>"/>.
      -
      -<?xml version="1.0" encoding="utf-8"?>
      -<manifest xmlns="http://tizen.org/ns/packages" api-version="2.3" package="org.tizen.test" version="1.0.0">
      -   <ui-application appid="org.tizen.test" exec="text" type="capp" multiple="false" taskmanage="true" nodisplay="false">
      -      <icon>rest.png</icon>
      -      <label>rest</label>
      -      <!--For API version lower than 2.4-->
      -      <metadata key="http://tizen.org/metadata/background-category/media"/>
      -      <metadata key="http://tizen.org/metadata/background-category/download"/>
      -      <metadata key="http://tizen.org/metadata/background-category/background-network"/>
      -   </ui-application>
      -   <service-application appid="org.tizen.test-service" exec="test-service" multiple="false" type="capp">
      -      <metadata key="http://tizen.org/metadata/background-category/background-network"/>
      -      <metadata key="http://tizen.org/metadata/background-category/location"/>
      -   </service-application>
      -</manifest>
      -
      -

      The <metadata key="http://tizen.org/metadata/bacgkround-category/<value>"/> element has no effect on Tizen 2.3 devices, but, in Tizen 2.4 and higher devices, it has the same effect as the <background-category> element.

      -
      - -

      The background category of your application can be specified in the -application project settings in the Tizen Studio.

      - -

      Warm-up

      -

      Become familiar with the Application API basics by learning about:

      -

      Prerequisites

      To use the functions and data types of the Application API (in mobile and wearable applications), include the <app.h> header file in your application:

      @@ -305,11 +183,12 @@

      Handling the Application Fundamentals

      -

      The Application API is a simple framework all Tizen applications are based on. It only handles interactions between applications and the operating system.

      +

      The Application API is a simple framework all Tizen applications are based on. It only handles interactions between applications and the operating system. In order for an application to operate successfully, it must receive events from the platform. For this, it must start the main event loop - this is mandatory for all Tizen native applications.

      +

      To manage the application life-cycle:

      1. -

        Start the application with the main() function. It initializes the Application API and starts the application.

        +

        Start the application with the main() function. It initializes the Application API and starts the main event loop with the ui_app_main() function. Before calling the ui_app_main() function, set up the app_event_callback_s structure variable, which is passed to the function.

        The following code is a minimal application using the Application API. It only builds and runs.

         int
        @@ -441,9 +320,118 @@ main(int argc, char *argv[])
         
      2. app_control_get_app_extra_data_array(): Get the string array associated with a given key (first check with app_control_is_extra_data_array() whether the data associated with the key is an array).

    For other available functions, see the app.h header file.

    +

    For more information about launching other applications from your application using application controls, see Application Controls.

  • +

    Background Categories

    + +

    Since Tizen 2.4, the application is not allowed to run on the background except when it is explicitly declared to do so. The following table lists the background categories that allow the application to run on the background.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table: Allowed background application policy
    Background categoryDescriptionRelated APIsManifest file <background-category> element value
    MediaPlaying audio, recording, and outputting streaming video on the backgroundMultimedia API (in mobile and wearable applications)media
    DownloadDownloading data with the Tizen Download-manager APIDownload API (in mobile applications)download
    Background networkProcessing general network operations on the background (such as sync-manager, IM, and VOIP)Sync Manager API (in mobile applications), Socket, and Curl API (in mobile and wearable applications)background-network
    LocationProcessing location data on the backgroundLocation API (in mobile and wearable applications)location
    Sensor (context)Processing context data from the sensors, such as gestureSensor API (in mobile and wearable applications)sensor
    IoT Communication/ConnectivityCommunicating between external devices on the background (such as Wi-Fi and Bluetooth)Wi-Fi (in mobile and wearable applications) and Bluetooth API (in mobile and wearable applications)iot-communication
    + +

    Describing the Background Category

    +

    An application with a background running capability must declare the background category in its manifest file:

    + +
    +<?xml version="1.0" encoding="utf-8"?>
    +<manifest xmlns="http://tizen.org/ns/packages" api-version="2.4" package="org.tizen.test" version="1.0.0">
    +   <ui-application appid="org.tizen.test" exec="text" type="capp" multiple="false" taskmanage="true" nodisplay="false">
    +      <icon>rest.png</icon>
    +      <label>rest</label>
    +      <!--For API version 2.4 and higher-->
    +      <background-category value="media"/>
    +      <background-category value="download"/>
    +      <background-category value="background-network"/>
    +   </ui-application>
    +   <service-application appid="org.tizen.test-service" exec="test-service" multiple="false" type="capp">
    +      <background-category value="background-network"/>
    +      <background-category value="location"/>
    +   </service-application>
    +</manifest>
    +
    + + + + + + + + + + + + +
    Note
    The <background-category> element is supported since the API version 2.4. An application with a <background-category> element declared can fail to be installed on devices with a Tizen version lower than 2.4. In this case, declare the background category as <metadata key="http://tizen.org/metadata/background-category/<value>"/>.
    +
    +<?xml version="1.0" encoding="utf-8"?>
    +<manifest xmlns="http://tizen.org/ns/packages" api-version="2.3" package="org.tizen.test" version="1.0.0">
    +   <ui-application appid="org.tizen.test" exec="text" type="capp" multiple="false" taskmanage="true" nodisplay="false">
    +      <icon>rest.png</icon>
    +      <label>rest</label>
    +      <!--For API version lower than 2.4-->
    +      <metadata key="http://tizen.org/metadata/background-category/media"/>
    +      <metadata key="http://tizen.org/metadata/background-category/download"/>
    +      <metadata key="http://tizen.org/metadata/background-category/background-network"/>
    +   </ui-application>
    +   <service-application appid="org.tizen.test-service" exec="test-service" multiple="false" type="capp">
    +      <metadata key="http://tizen.org/metadata/background-category/background-network"/>
    +      <metadata key="http://tizen.org/metadata/background-category/location"/>
    +   </service-application>
    +</manifest>
    +
    +

    The <metadata key="http://tizen.org/metadata/bacgkround-category/<value>"/> element has no effect on Tizen 2.3 devices, but, in Tizen 2.4 and higher devices, it has the same effect as the <background-category> element.

    +
    + +

    The background category of your application can be specified in the +application project settings in the Tizen Studio.

    + diff --git a/org.tizen.guides/html/native/app_management/watch_app_n.htm b/org.tizen.guides/html/native/app_management/watch_app_n.htm index e0713ae..7a4657f 100644 --- a/org.tizen.guides/html/native/app_management/watch_app_n.htm +++ b/org.tizen.guides/html/native/app_management/watch_app_n.htm @@ -26,10 +26,8 @@

    Content

      -
    • Application States and Events
    • -
    • Changing the Watch UI
    • Prerequisites
    • -
    • Managing Life-cycle Callbacks
    • +
    • Managing the Application Life-cycle
    • Managing System-related Callbacks
    • Drawing the Watch UI
    • Getting the Current Time
    • @@ -58,28 +56,55 @@

      The main features of the Watch Application API include:

      • Managing the application life-cycle -

        You can create and initialize a watch application with the main() function.

        -

        To start an event loop, use the watch_app_main() function. Before calling this function, set up the watch_app_lifecycle_callback_s structure variable, which contains the required event callbacks.

        -

        You can control the application execution by defining actions in the life-cycle event callbacks. You can also react to system events with callbacks.

        -

        When initializing the application, edit the manifest file to define the watch application settings.

        -
      • +

        You can control the application execution by defining actions in the life-cycle event callbacks. You can also react to system events with callbacks.

      • Managing the time handle and displaying the time -

        To draw an accurate clock in various formats on the screen, use the Watch Application getter APIs with the watch_time_h time handle. You can get the handle with the watch_time_get_current_time() function.

        -

        With the time handle, you can draw the UI for your watch application.

      • +

        You can manage the time handle and retrieve the window object for the watch UI. With the time handle, you can draw the UI for your watch application.

      • Managing the ambient mode

        In a low-powered wearable device, an ambient mode is available. In this mode, the watch application shows a limited UI and receives only the ambient tick event every minute to reduce power consumption.

        -

        The details of the limited UI drawn in the ambient mode depend on the device. In addition, due to the ambient mode being a low power mode, there are limits to the colors that can be shown on the screen. Usually, when designing the ambient mode UI, draw a black and white UI only, and use less than 15% of the pixels on the screen. If you do not want to draw your own ambient mode UI, set the ambient-support attribute to disable in the watch application manifest file to allow the platform to show a default ambient mode UI.

        +

        The details of the limited UI drawn in the ambient mode depend on the device. In addition, due to the ambient mode being a low power mode, there are limits to the colors that can be shown on the screen. Usually, when designing the ambient mode UI, draw a black and white UI only, and use less than 15% of the pixels on the screen. If you do not want to draw your own ambient mode UI, set the ambient-support attribute to false in the watch application manifest file to allow the platform to show a default ambient mode UI.

        +

        To use the ambient mode, the user must enable it in the device settings. You can define callbacks to monitor when the application enters and exits the ambient mode.

        +
      • +
      -

      Since Tizen 2.3.2, some devices introduce a high color mode for the ambient mode. In the high color mode, you can use more colors (usually, 24-bit color) for drawing the ambient mode UI.

      +

      When a watch application is successfully installed on a device, its UI is visible in the Clock menu of the device Settings menu. The user can use the settings to change between the available watch application UIs.

      -

      To use the ambient mode, the user must enable it in the device settings. You can define callbacks to monitor when the application enters and exits the ambient mode.

      +

      Figure: Clock menu

      +

      + Clock menu

      +

      Prerequisites

      + +

      To enable your application to use the watch functionality:

      +
        +
      1. +

        To use the Watch Application API's watch_app_ambient_tick_cb() callback in the ambient mode, the application has to request permission by adding the following privilege to the tizen-manifest.xml file:

        +
        +<privileges>
        +   <privilege>http://tizen.org/privilege/alarm.set</privilege>
        +</privileges>
        +
      2. -
    -

    Before you start, remember to prepare your application to use the watch functionality.

    +
  • To use the high color mode for the ambient mode, make sure that the device supports it: +
    +bool support;
    +int ret;
    +
    +ret = system_info_get_platform_bool("http://tizen.org/feature/screen.always_on.high_color", &support);
    +
    +
  • + +
  • To use the functions and data types of the Watch Application API, include the <watch_app.h> and <watch_app_efl.h> header files in your application: +
    +#include <watch_app.h>
    +#include <watch_app_efl.h>
    +
  • +
  • Edit the watch application settings in the manifest file.
  • + + +

    Managing the Application Life-cycle

    +

    You can create and initialize a watch application with the main() function. To start an event loop, use the watch_app_main() function. Before calling this function, set up the watch_app_lifecycle_callback_s structure variable, which contains the required event callbacks.

    -

    Application States and Events

    The following figure illustrates the watch application states during the application life-cycle:

      @@ -146,66 +171,7 @@ - - -

      The user can change the watch application UI in the Clock menu through the device setting menu.

      -

      When a watch application is successfully installed on a device, its UI is visible in the clock menu of the watch settings.

      - -

      Figure: Clock menu

      -

      - Clock menu -

      - -

      Warm-up

      -

      Become familiar with the Watch Application API basics by learning about:

      - - -

      Prerequisites

      - -

      To enable your application to use the watch functionality:

      -
        -
      1. -

        To use the Watch Application API's watch_app_ambient_tick_cb() callback in the ambient mode, the application has to request permission by adding the following privilege to the tizen-manifest.xml file:

        -
        -<privileges>
        -   <privilege>http://tizen.org/privilege/alarm.set</privilege>
        -</privileges>
        -
        -
      2. - -
      3. To use the high color mode for the ambient mode, make sure that the device supports it: -
        -bool support;
        -int ret;
        -
        -ret = system_info_get_platform_bool("http://tizen.org/feature/screen.always_on.high_color", &support);
        -
        -
      4. - -
      5. To use the functions and data types of the Watch Application API, include the <watch_app.h> and <watch_app_efl.h> header files in your application: -
        -#include <watch_app.h>
        -#include <watch_app_efl.h>
        -
      6. -
      7. Edit the watch application settings in the manifest file.
      8. -
      - -

      Managing Life-cycle Callbacks

      - -

      To manage life-cycle callbacks:

      +

      To manage the life-cycle callbacks:

      1. Register the necessary callbacks:

          @@ -360,7 +326,8 @@ app_create(void *user_date)

      Drawing the Watch UI

      -

      To draw the watch UI, you need the current time handle and the window object of the idle screen:

      +

      To draw an accurate clock in various formats on the screen, use the Watch Application getter APIs with the watch_time_h time handle. You can get the handle with the watch_time_get_current_time() function.

      +

      With the time handle, you can draw the UI for your watch application:

      1. Get the window object with the watch_app_get_elm_win() function: @@ -459,7 +426,8 @@ __create_base_gui(appdata *ad, int width, int height)

        You can also get the UTC time and time zone, if needed, using the watch_time_get_utc_time(), watch_time_get_utc_timestamp(), and watch_time_get_time_zone() functions.

        Using the Ambient Mode

        - +

        The details of the limited UI drawn in the ambient mode depend on the device. Usually, when designing the ambient mode UI, draw a black and white UI only, and use less than 15% of the pixels on the screen. If you do not want to draw your own ambient mode UI, set the ambient-support attribute to disable in the watch application manifest file to allow the platform to show a default ambient mode UI.

        +

        Since Tizen 2.3.2, some devices introduce a high color mode for the ambient mode. In the high color mode, you can use more colors (usually, 24-bit color) for drawing the ambient mode UI.

        To use the ambient mode:

        1. Define the ambient mode callbacks. diff --git a/org.tizen.guides/html/native/app_management/widget_app_n.htm b/org.tizen.guides/html/native/app_management/widget_app_n.htm index a78f21c..bb03cac 100644 --- a/org.tizen.guides/html/native/app_management/widget_app_n.htm +++ b/org.tizen.guides/html/native/app_management/widget_app_n.htm @@ -30,12 +30,12 @@
        2. Widget Application and Widget Instance
        3. Widget Application States and Events
        4. Widget Instance States and Events
        5. -
        6. Data Sharing Between the Widget Application and Other Applications
        7. Prerequisites
        8. Creating the Widget Application
        9. Managing Widget Instance Life-cycle Callbacks
        10. Drawing the Widget UI
        11. -
        12. Managing the Widget Instance
        13. +
        14. Managing the Widget Instance
        15. +
        16. Data Sharing Between the Widget Application and Other Applications

    Related Info

      @@ -53,15 +53,15 @@

      The main features of the Widget Application API include:

        +
      • Creating widget applications +

        You can create a widget application, which usually has 1 process for maintaining the main loop. Within the process, the framework can create multiple widget instances that can share the same resources.

        +

        The widget application can also share data with other applications.

      • Managing multiple widget instances -

        Each widget application usually has 1 process for maintaining the main loop. Within that process, the application can create multiple widget instances that can share the same resources.

      • -
      • Managing the life-cycle -

        You can manage the widget application and widget instance life-cycles through callbacks that are triggered as the application or instance state changes.

        -

        The widget application starts with the main() function, which creates and initializes the application. The widget_app_main() function is used to start the application event loop. Before calling this function, set up the widget_app_lifecycle_callback_s structure variable, which is passed to the function.

        -

        To ensure that the application runs smoothly, you must edit the application manifest file to define the widget settings.

        -
      • +

        Whenever a widget instance is requested, the framework creates one. You can manage the widget instances by updating or destroying them, or by retrieving information about them.

        +
      • Managing the life-cycles +

        You can manage the widget application and widget instance life-cycles through callbacks that are triggered as the application or instance state changes.

      • Creating the widget UI -

        The widget application can draw a UI on the home screen. To do this, you must get the window object of the home screen and attach UI components to it. You can use the widget_app_get_elm_win() function to create an EFL object for widget window.

        +

        The widget application can draw a UI on the home screen.

        @@ -72,15 +72,12 @@
        -
      -

      Before you start, remember to prepare your application to use the widget functionality.

      -

      Widget Application and Widget Instance

      -

      The widget application provides a life-cycle and methods for making and managing a widget class. It consists of 1 process and make the widget class in the widget_app_create() callback function. With this class, the framework can make instances whenever applications for widget viewers, such as home screen and lock screen, request for a widget instance.

      +

      The widget application provides a life-cycle and methods for making and managing a widget class. It consists of 1 process and makes the widget class in the widget_app_create() callback function. With this class, the framework can make instances whenever applications for widget viewers, such as home screen and lock screen, request for a widget instance.

      The widget instance has its own life-cycle similar to the widget application. However, the widget instance is only an object shown by the applications for widget viewers. Many widget instances can be running on the same widget application process.

      Figure: Each widget application has 1 or more widget instances

      Each widget application has 1 or more widget instances

      @@ -200,66 +197,6 @@ widget_app_create(void *user_data)

      Figure: Launching widget instances

      Launching widget instances

      -

      Data Sharing Between the Widget Application and Other Applications

      - -

      You can share data between widget applications and UI (or service) applications. However, you must understand that this kind of data sharing is based on the file system. The reason is that the system (Home screen) controls the widget application life-cycle, while the UI application life-cycle is mostly explicitly controlled by the user.

      - -

      For example, consider the differences between a Weather application and a Weather widget:

      -
        -
      • The Weather application is launched when user selects it from the application list.
      • -
      • The widget is launched when the Home screen is on screen and is terminated when the Home screen is hidden.
      - -

      Although the widget wants to share some data from the Weather application (such as the user's favorite city), it is ineffective for the widget to launch the Weather application every time to retrieve such data. This inefficiency makes it difficult to use typical IPC mechanisms, such as socket and Message Port, in which both the receiver and sender processes must be alive for communication. To overcome this issue, the widget application must use a communication type where the data is permanently stored somewhere in the system.

      - -

      In the Tizen platform, applications in the same package (including widget applications) can access files in the data directory of the package installation path. This means that the UI (or service) application can first write files to the data directory, and the widget can later read them, or vice versa.

      - -

      Figure: Sharing through the data directory

      -

      Sharing through the data directory

      - -

      To manage data through the data directory:

      - -
        -
      • You can set and get data in the data directory using the Preference API functions (in mobile and wearable applications). You can use the functions to store and retrieve key-value data in the data directory.

      • - -
      • You can share the data directory content with Sqlite, by creating an Sqlite database file in the data directory.

        -

        The Sqlite database has an advantage to a direct use of a file in error handling, such as journaling. Consequently, if the application must handle complex data rather than primitive values, use Sqlite to store and retrieve the data.

      - -

      If an application requires complex control over a widget, such as Music Player, it must implement a service application in the middle and use the Data Control API (in mobile and wearable applications).

      -

      For example, a music-player-service service application is needed to control the audio device, process audio files, and handle play and stop signals. The music-player-ui and music-player-widget applications display the UI controls, title, album arts, and other content retrieved from the music-player-service service application. The service application can export its data using the Data Control to provide data to the other applications (widget and UI) simultaneously.

      - -

      The following figure illustrates typical data control flows between the set of UI, service, and widget applications.

      - -

      Figure: Sharing through data control

      -

      Sharing through data control

      - - - - - - - - - - -
      Note
      For user convenience, a STANDALONE widget application package is not allowed in the Tizen Store. -

      You can make a STANDALONE widget application in the Tizen Studio for test purposes. However, to publish it, you must combine it with at least 1 UI application in the package. For more details, see Developing Multiple Projects as a Combined Package.

      - -

      Warm-up

      -

      Become familiar with the Widget Application API basics by learning about:

      - - -

      Prerequisites

      To enable your application to use the widget functionality:

      @@ -273,7 +210,8 @@ widget_app_create(void *user_data)

      Creating the Widget Application

      - +

      The widget application starts with the main() function, which creates and initializes the application. The widget_app_main() function is used to start the application event loop. Before calling this function, set up the widget_app_lifecycle_callback_s structure variable, which is passed to the function.

      +

      To create the widget application:

      1. @@ -600,6 +538,50 @@ widget_instance_update(widget_context_h context, bundle *content, int force, voi
      +

      Data Sharing Between the Widget Application and Other Applications

      + +

      You can share data between widget applications and UI (or service) applications. However, you must understand that this kind of data sharing is based on the file system. The reason is that the system (Home screen) controls the widget application life-cycle, while the UI application life-cycle is mostly explicitly controlled by the user.

      + +

      For example, consider the differences between a Weather application and a Weather widget:

      +
        +
      • The Weather application is launched when user selects it from the application list.
      • +
      • The widget is launched when the Home screen is on screen and is terminated when the Home screen is hidden.
      + +

      Although the widget wants to share some data from the Weather application (such as the user's favorite city), it is ineffective for the widget to launch the Weather application every time to retrieve such data. This inefficiency makes it difficult to use typical IPC mechanisms, such as socket and Message Port, in which both the receiver and sender processes must be alive for communication. To overcome this issue, the widget application must use a communication type where the data is permanently stored somewhere in the system.

      + +

      In the Tizen platform, applications in the same package (including widget applications) can access files in the data directory of the package installation path. This means that the UI (or service) application can first write files to the data directory, and the widget can later read them, or vice versa.

      + +

      Figure: Sharing through the data directory

      +

      Sharing through the data directory

      + +

      To manage data through the data directory:

      + +
        +
      • You can set and get data in the data directory using the Preference API functions (in mobile and wearable applications). You can use the functions to store and retrieve key-value data in the data directory.

      • + +
      • You can share the data directory content with Sqlite, by creating an Sqlite database file in the data directory.

        +

        The Sqlite database has an advantage to a direct use of a file in error handling, such as journaling. Consequently, if the application must handle complex data rather than primitive values, use Sqlite to store and retrieve the data.

      + +

      If an application requires complex control over a widget, such as Music Player, it must implement a service application in the middle and use the Data Control API (in mobile and wearable applications).

      +

      For example, a music-player-service service application is needed to control the audio device, process audio files, and handle play and stop signals. The music-player-ui and music-player-widget applications display the UI controls, title, album arts, and other content retrieved from the music-player-service service application. The service application can export its data using the Data Control to provide data to the other applications (widget and UI) simultaneously.

      + +

      The following figure illustrates typical data control flows between the set of UI, service, and widget applications.

      + +

      Figure: Sharing through data control

      +

      Sharing through data control

      + + + + + + + + + + +
      Note
      For user convenience, a STANDALONE widget application package is not allowed in the Tizen Store. +

      You can make a STANDALONE widget application in the Tizen Studio for test purposes. However, to publish it, you must combine it with at least 1 UI application in the package. For more details, see Developing Multiple Projects as a Combined Package.

      + diff --git a/org.tizen.guides/html/native/connectivity/bluetooth_n.htm b/org.tizen.guides/html/native/connectivity/bluetooth_n.htm index d5b3960..932208c 100644 --- a/org.tizen.guides/html/native/connectivity/bluetooth_n.htm +++ b/org.tizen.guides/html/native/connectivity/bluetooth_n.htm @@ -60,7 +60,7 @@
    • Setting the LE Advertising Mode
    • Starting and Stopping LE Advertising
    - +
  • Releasing All Resources
  • Related Info

    @@ -128,65 +128,10 @@

    Bluetooth AVRCP is used with A2DP. You can handle remote controls (such as play, pause, stop, equalizer, repeat, shuffle, and scan) through AVRCP.

    -

    Before you start, remember to prepare your application to use the Bluetooth functionality, and release all resources when you are done.

    +

    Remember to release all resources when you are done.

    Bluetooth use is based on profiles. Tizen Bluetooth features support the Audio, GATT, HDP, HID, and OPP client and server profiles.

    -

    Warm-up

    -

    Become familiar with the Bluetooth API basics by learning about:

    -

    Prerequisites

    diff --git a/org.tizen.guides/html/native/connectivity/connection_n.htm b/org.tizen.guides/html/native/connectivity/connection_n.htm index 27bc6f9..d167859 100644 --- a/org.tizen.guides/html/native/connectivity/connection_n.htm +++ b/org.tizen.guides/html/native/connectivity/connection_n.htm @@ -10,7 +10,7 @@ - Connection Manager + Connection Management @@ -54,18 +54,17 @@
    -

    Connection Manager

    +

    Connection Management

    The connection features enable you to create a network connection and perform various operations over the connection. The application can access connection details, such as the IP address, proxy information, gateway information, and connection statistics.

    -

    With the connection APIs, you can work with IP sockets:

    +

    The main features of the Connection API include:

    Connection Manager

    @@ -73,6 +72,15 @@

    The Connection Manager API is related to libcurl (see the Curl guide) and sockets. After a network connection is established, you can create a socket on the kernel Linux stack to be used directly or by libcurl or any other network library. If you want to create a socket directly without libcurl, you must check whether you are using the IPv4 or IPv6 environment, and create an applicable IP socket.

    +

    To manage IP sockets, you can:

    + +

    The Connection Manager provides the following typedefs and enumerators for managing data connections:

    • connection_h @@ -88,8 +96,6 @@
    • connection_address_family_e

      Enumeration for the address family. It provides IPv4 and IPv6. You can use it as a parameter when you get the IP address of the current connection or proxy.

    -

    Before you start, remember to prepare your application to use the connection functionality.

    - @@ -315,37 +321,6 @@

    Use the connection_reset_statistics() function to re-initialize the statistics.

    -

    Warm-up

    -

    Become familiar with the Connection API basics by learning about:

    - -

    Prerequisites

    To enable your application to use the connection functionality:

    diff --git a/org.tizen.guides/html/native/connectivity/connectivity_cover_n.htm b/org.tizen.guides/html/native/connectivity/connectivity_cover_n.htm index 37170ca..5f58098 100644 --- a/org.tizen.guides/html/native/connectivity/connectivity_cover_n.htm +++ b/org.tizen.guides/html/native/connectivity/connectivity_cover_n.htm @@ -66,6 +66,10 @@

    You can access various information from the Telephony Service. You can access details about the voice and video call states, currently used SIM card, and modem. You can also retrieve general details about the telephony network the device is currently connected to.

    +
  • USB Host in mobile applications only + +

    You can connect to other devices using USB. You can gather information about the device and find a suitable interface and configuration.

  • +
  • Internet and Content Downloads

    You can connect to the Internet and access its various services. You can download files, transfer content through socket and libcurl connections, and create a Web view in your application to allow Internet browsing.

  • @@ -78,18 +82,14 @@

    You can allow the users to initialize the VPN device, and manage routing, DNS, and firewall features.

    -
  • IoTivity +
  • IoT Connectivity -

    You can use IoTivity in Tizen. You can use the seamless device-to-device connectivity to address the needs of the Internet of Things (IoT) through the open source reference implementation of the OIC (Open Interconnect Consortium) standard specifications.

  • +

    You can use IoTivity features in Tizen. You can use the seamless device-to-device connectivity to address the needs of the Internet of Things (IoT) through the open source reference implementation of the OIC (Open Interconnect Consortium) standard specifications.

  • Network Service Discovery

    You can perform network service discoveries to announce local services and search for remote services.

  • -
  • USB Host in mobile applications only - -

    You can connect to other devices using USB. You can gather information about the device and find a suitable interface and configuration.

  • - diff --git a/org.tizen.guides/html/native/connectivity/curl_n.htm b/org.tizen.guides/html/native/connectivity/curl_n.htm index 600a49c..9a5321a 100644 --- a/org.tizen.guides/html/native/connectivity/curl_n.htm +++ b/org.tizen.guides/html/native/connectivity/curl_n.htm @@ -75,18 +75,6 @@
  • Transferring HTTP requests

    You can transfer HTTP requests using the curl_easy_setopt() function.

  • -

    Before you start, remember to prepare your application to use the Curl functionality.

    - -

    Warm-up

    -

    Become familiar with the Curl API basics by learning about:

    -

    Prerequisites

    To enable your application to use the Curl functionality:

    diff --git a/org.tizen.guides/html/native/connectivity/download_n.htm b/org.tizen.guides/html/native/connectivity/download_n.htm index d75fc16..96a1699 100644 --- a/org.tizen.guides/html/native/connectivity/download_n.htm +++ b/org.tizen.guides/html/native/connectivity/download_n.htm @@ -40,15 +40,15 @@

    Download

    -

    You can create and manage one or more download requests at a time. Before you start, remember to prepare your application to use the download functionality.

    +

    You can create and manage one or more download requests at a time. Each download process goes through a set of states, and you can manage the process though the states with specific functions.

    This feature is supported in mobile applications only.

    The following figure illustrates the user scenario for the download:

      -
    1. You can create a new download process, configure the download URL or destination, and launch the process.
    2. -
    3. During the download, you can pause, resume, or stop the process. In addition, you can monitor the progress of the download process.
    4. +
    5. When the user wants to download a file, you can create a new download process, configure the download URL or destination, and launch the process.
    6. +
    7. During the download, you can pause, resume, or stop the process programmatically, or as a response to user requests. In addition, you can monitor the progress of the download process.

    Figure: User scenario

    @@ -69,16 +69,6 @@
  • After you stop a download, the download handle ID is stored for 48 hours (even if the device is powered off), allowing you to resume the download later on. If you have no need to resume the process later on, unload all data concerning the download handle from the memory with the download_destroy() function.
  • -

    Warm-up

    - -

    Become familiar with the Download API basics by learning about:

    - -

    Prerequisites

    diff --git a/org.tizen.guides/html/native/connectivity/http_n.htm b/org.tizen.guides/html/native/connectivity/http_n.htm index 54ac79a..bf33d05 100644 --- a/org.tizen.guides/html/native/connectivity/http_n.htm +++ b/org.tizen.guides/html/native/connectivity/http_n.htm @@ -42,31 +42,16 @@

    HTTP

    -

    HTTP (Hypertext Transfer Protocol) is a networking protocol for distributed, collaborative, hypermedia information systems. It allows applications to connect to a Web server to fetch and transmit a Web resource.

    - -

    Before you start, remember to prepare your application to use the HTTP functionality.

    +

    HTTP (Hypertext Transfer Protocol) is a networking protocol for distributed, collaborative hypermedia information systems. It allows applications to connect to a Web server to fetch and transmit a Web resource.

    The main features of the HTTP API include:

    • HTTP session -

      A session is a set of one or more transactions. You must create an HTTP session before you can create transactions. Use the http_session_create() function to create a session handle, and when the session is no longer needed, destroy it with the http_session_destroy() function.

      -

      When creating the session, you can set the session mode:

      -
        -
      • The normal mode (HTTP_SESSION_MODE_NORMAL) means that the session has only 1 connection. All transactions in the session share that connection, and the transactions are processed one at a time.
      • -
      • The pipelining mode (HTTP_SESSION_MODE_PIPELINING) means that multiple transactions can be processed concurrently. This mode can reduce the network latency.
      • -
      -

      The application can manage multiple sessions at the same time.

      +

      A session is a set of one or more transactions. You must create an HTTP session before you can create transactions.

    • HTTP transaction -

      A transaction represents a single operation between a client and a server.

      -

      To request for a resource from a Web server, use the http_session_open_transaction() function to create a transaction handle and open an HTTP transaction from the HTTP session. The function requires the HTTP method defined by the http_method_e enumerator (in mobile and wearable applications) as its first parameter. The main methods are:

      -
        -
      • GET: The application can retrieve a resource from a remote Web server.
      • -
      • POST: The application can send data to a Web server.
      • -
      • PUT: The application can replace all current representations of the Web server resource with the uploaded content.
      • -
      -

      When no longer needed, destroy the transaction with the http_transaction_destroy() function.

      +

      A transaction represents a single operation between a client and a server (a single request to the Web server). To request for a resource from a Web server, create a transaction handle and open an HTTP transaction from the HTTP session.

    • HTTP request

      A request is message sent from a client to a server (for example, a request to fetch a resource from the Web server).

      @@ -77,24 +62,6 @@
    -

    To get the HTTP responses and monitor the state of the transactions, you must register callbacks:

    -
      -
    • Use the http_transaction_set_received_header_cb() and http_transaction_set_received_body_cb() functions to register callbacks for fetching the Web server resource header information and the response body.
    • -
    • Use the http_transaction_set_uploaded_cb() function to register a callback for the upload status of the remote Web server resource.
    • -
    • Use the http_transaction_set_completed_cb() function to register a callback for the completion status of the current transaction.
    • -
    • Use the http_transaction_set_aborted_cb() function to register a callback for the failure status of the current transaction.
    • -
    - -

    Warm-up

    -

    Become familiar with the HTTP API basics by learning about:

    -
      -
    • Prerequisites -

      Prepare your application to use the HTTP functionality.

    • -
    • Managing Sessions -

      Create a session and set auto redirection for it. When no longer needed, destroy all transactions and the session.

    • -
    • Managing Transactions -

      Create a transaction, configure and submit a request, and handle the response.

    • -

    Prerequisites

    To enable your application to use the HTTP functionality:

    @@ -128,7 +95,12 @@ if (ret != HTTP_ERROR_NONE)

    Managing Sessions

    -

    You can have multiple sessions, and each session can create multiple transactions. Each transaction is responsible for a single request to the Web servers.

    +

    The application can manage multiple sessions at the same time. When creating the session, you can set the session mode:

    +
      +
    • The normal mode (HTTP_SESSION_MODE_NORMAL) means that the session has only 1 connection. All transactions in the session share that connection, and the transactions are processed one at a time.
    • +
    • The pipelining mode (HTTP_SESSION_MODE_PIPELINING) means that multiple transactions can be processed concurrently. This mode can reduce the network latency.
    • +
    +

    To manage HTTP sessions:

    @@ -172,7 +144,15 @@ if (ret != HTTP_ERROR_NONE)

    To manage HTTP transactions:

      -
    1. Create an HTTP transaction handle with the http_session_open_transaction() function and the session handle: +
    2. Create an HTTP transaction handle with the http_session_open_transaction() function and the session handle. + +

      The function requires the HTTP method defined by the http_method_e enumerator (in mobile and wearable applications) as its first parameter. The main methods are:

      +
        +
      • GET: The application can retrieve a resource from a remote Web server.
      • +
      • POST: The application can send data to a Web server.
      • +
      • PUT: The application can replace all current representations of the Web server resource with the uploaded content.
      • +
      +
       int ret = HTTP_ERROR_NONE;
       
      @@ -184,6 +164,13 @@ if (ret != HTTP_ERROR_NONE)
       

      The transaction handle is used to manage the request and response.

    3. Register transaction callbacks to receive the response and monitor the transaction state: +
        +
      • Use the http_transaction_set_received_header_cb() and http_transaction_set_received_body_cb() functions to register callbacks for fetching the Web server resource header information and the response body.
      • +
      • Use the http_transaction_set_uploaded_cb() function to register a callback for the upload status of the remote Web server resource.
      • +
      • Use the http_transaction_set_completed_cb() function to register a callback for the completion status of the current transaction.
      • +
      • Use the http_transaction_set_aborted_cb() function to register a callback for the failure status of the current transaction.
      • +
      +
       /* Callback for receiving the response header */
       void
      diff --git a/org.tizen.guides/html/native/connectivity/internet_download_n.htm b/org.tizen.guides/html/native/connectivity/internet_download_n.htm
      index 49b748b..c657d76 100644
      --- a/org.tizen.guides/html/native/connectivity/internet_download_n.htm
      +++ b/org.tizen.guides/html/native/connectivity/internet_download_n.htm
      @@ -41,7 +41,7 @@
       

      You can use the following Internet and content download features in your native applications:

        -
      • Connection Manager +
      • Connection Management

        You can get information about the connected network, and set up and configure network and socket connections. You can also track connection information, such as the size of the sent and received data.

      • Download in mobile applications only diff --git a/org.tizen.guides/html/native/connectivity/iotivity_n.htm b/org.tizen.guides/html/native/connectivity/iotcon_n.htm similarity index 84% rename from org.tizen.guides/html/native/connectivity/iotivity_n.htm rename to org.tizen.guides/html/native/connectivity/iotcon_n.htm index 3265482..26a4e3d 100644 --- a/org.tizen.guides/html/native/connectivity/iotivity_n.htm +++ b/org.tizen.guides/html/native/connectivity/iotcon_n.htm @@ -10,7 +10,7 @@ - IoTivity + IoT Connectivity @@ -43,16 +43,14 @@
    -

    IoTivity

    +

    IoT Connectivity

    -

    IoTivity offers seamless device-to-device connectivity to address the emerging needs of the Internet of Things (IoT) through the open source reference implementation of the OIC (Open Interconnect Consortium) standard specifications. IoT connectivity (Iotcon) provides the means of using IoTivity in Tizen.

    +

    IoTivity offers seamless device-to-device connectivity to address the emerging needs of the Internet of Things (IoT) through the open source reference implementation of the OCF (Open Connectivity Foundation) standard specifications. IoT connectivity (Iotcon) provides the means of using IoTivity in Tizen.

    Figure: IoTivity in Tizen

    IoTivity in Tizen

    -

    IoT connectivity is usually handled with a server and client. The server is responsible for creating and providing resources, and the client can access those resources through requests.

    - -

    Before you start, remember to prepare your application to use the IoT functionality.

    +

    IoT connectivity handles the resources between a server and client. The server is responsible for creating and providing resources, and the client can access and control those resources through requests.

    The main features of the Iotcon API include:

      @@ -71,7 +69,7 @@
    • Remote resource management -

      If the resource created by the server is discoverable, the client that knows the resource type can find the resource using the iotcon_find_resource() function of the Client API (in mobile and wearable applications). If the host_address (the first parameter) is NULL, the find request is sent as multicast. If the resource_type (the third parameter) is NULL, the request finds every resource type. If the client does not know the server host address or the resource type of the resource, it cannot find the resource.

      +

      If the resource created by the server is discoverable, the client that knows the resource type can find the resource using the iotcon_find_resource() function of the Client API (in mobile and wearable applications). If the host_address is NULL, the find request is sent as multicast. The client can filter the desired resources with a query.

      If the client wants to access a resource whose information it already knows, it can make a proxy using the iotcon_remote_resource_create() function of the Remote Resource API (in mobile and wearable applications) and access the resource through that proxy.

      @@ -102,39 +100,16 @@
    • Resource representation

      Resource representation is a snapshot of a resource at a particular time, representing the resource information exchanged in the request and response interactions between the server and client. The resource representation contains resource properties and the state of the resource.

      - -

      Figure: Resource representation

      -

      Resource representation

      -

      To manage the representation, use the Representation (in mobile and wearable applications) and State (in mobile applications) APIs:

      +

      To manage the representation, use the Representation API (in mobile and wearable applications):

        -
      • Create a resource representation with the iotcon_representation_create() function.
      • -
      • Set the properties on the created representation with the iotcon_representation_set_XXX() functions.
      • -
      • Create a resource state with the iotcon_state_create() function.
      • -
      • Use the created state to set resource attributes by adding key-value pairs with the iotcon_state_add_XXX() functions.
      • +
      • Create a resource representation and attributes with the iotcon_representation_create() and iotcon_attributes_create() functions.
      • +
      • Set the properties on the created attributes with the iotcon_attributes_add_XXX() functions.
      • +
      • Set the attributes on the created representation with the iotcon_representation_set_attributes() function.
    -

    Warm-up

    - -

    Become familiar with the Iotcon API basics by learning about:

    - - -

    Prerequisites

    To enable your application to use the IoT functionality:

    @@ -144,7 +119,7 @@
     <privileges>
        <privilege>http://tizen.org/privilege/network.get</privilege>
    -   <privilege>http://tizen.org/privilege/d2d.datasharing</privilege>
    +   <privilege>http://tizen.org/privilege/internet</privilege>
     </privileges>
     
    @@ -154,15 +129,17 @@

    To ensure that an Iotcon function has been executed properly, make sure that the return is equal to IOTCON_ERROR_NONE.

    -
  • To connect the application with the IoT, use the iotcon_connect() function: +
  • To initialize the Iotcon, use the iotcon_initialize() function:
     int ret;
    -ret = iotcon_connect();
    +char *path; /* Must be set to the file path which can be read/written in the application */
    +
    +ret = iotcon_initialize(path);
     
  • -
  • When the resources are no longer needed, close the connection using the iotcon_disconnect() function: +
  • When the resources are no longer needed, de-initialize the Iotcon using the iotcon_deinitialize() function:
    -iotcon_disconnect();
    +iotcon_deinitialize();
     
  • @@ -215,20 +192,30 @@ iotcon_resource_types_destroy(resource_types);

    To find resources:

    1. To find a resource, call the iotcon_find_resource() function. -

      In the function, set the host address, connectivity type (an iotcon_connectivity_type_e enumeration value in mobile and wearable applications), resource type, secure flag, and the found callback function called when the resource is found during the timeout.

      -

      The host address can be an IP address or Bluetooth MAC address. The host address can also be IOTCON_MULTICAST_ADDRESS for multicast.

      +

      In the function, set the host address, connectivity type (an iotcon_connectivity_type_e enumeration value in mobile and wearable applications), query, secure flag, and the found callback function called whenever the resource is found during the timeout.

      +

      The host address can be IOTCON_MULTICAST_ADDRESS for multicast.

       int ret;
      +iotcon_query_h query;
       const char *res_type = "org.tizen.light";
      -ret = iotcon_find_resource(IOTCON_MULTICAST_ADDRESS, IOTCON_CONNECTIVITY_ALL,
      -                           res_type, false, _found_cb, NULL);
      +
      +ret = iotcon_query_create(&query);
      +if (IOTCON_ERROR_NONE != ret)
      +    /* Error handling */
      +
      +ret = iotcon_query_set_resource_type(query, res_type);
      +if (IOTCON_ERROR_NONE != ret)
      +    /* Error handling */
      +
      +ret = iotcon_find_resource(IOTCON_MULTICAST_ADDRESS, IOTCON_CONNECTIVITY_IP | IOTCON_CONNECTIVITY_PREFER_UDP,
      +                           res_type, query, _found_cb, NULL);
       if (IOTCON_ERROR_NONE != ret)
           /* Error handling */
       
    2. To get the remote resource handle information, use the found callback registered in the iotcon_find_resource() function:
      -static void
      +static bool
       _found_cb(iotcon_remote_resource_h resource, iotcon_error_e err, void *user_data)
       {
           int ret;
      @@ -264,6 +251,7 @@ _found_cb(iotcon_remote_resource_h resource, iotcon_error_e err, void *user_data
       
    3. To set the timeout interval (in seconds) for the asynchronous functions of the Client (in mobile and wearable applications) and Remote Resource (in mobile and wearable applications) APIs, use the iotcon_set_timeout() function:
       int ret;
      +
       ret = iotcon_set_timeout(10);
       if (IOTCON_ERROR_NONE != ret)
           /* Error handling */
      @@ -277,9 +265,9 @@ if (IOTCON_ERROR_NONE != ret)
                   
    The iotcon_set_timeout() function has an effect on the following asynchronous functions:
      -
    • iotcon_get_device_info()
    • -
    • iotcon_get_platform_info()
    • iotcon_find_resource()
    • +
    • iotcon_find_device_info()
    • +
    • iotcon_find_platform_info()
    • iotcon_remote_resource_get()
    • iotcon_remote_resource_put()
    • iotcon_remote_resource_post()
    • @@ -301,12 +289,14 @@ if (IOTCON_ERROR_NONE != ret)
       static iotcon_remote_resource_h _light_resource = NULL;
       
      -static void
      +static bool
       _found_cb(iotcon_remote_resource_h resource, iotcon_error_e err, void *user_data)
       {
           int ret;
      +
           if (IOTCON_ERROR_NONE != err)
               /* Error handling */
      +
           ret = iotcon_remote_resource_clone(resource, &_light_resource);
           if (IOTCON_ERROR_NONE != ret)
               /* Error handling */
      @@ -317,6 +307,7 @@ _found_cb(iotcon_remote_resource_h resource, iotcon_error_e err, void *user_data
       

      In the function, set the remote resource, query, and the response callback function called when receiving a response from the resource.

       int ret;
      +
       ret = iotcon_remote_resource_get(_light_resource, NULL, _on_get, NULL);
       if (IOTCON_ERROR_NONE != ret)
           /* Error handling */
      @@ -336,6 +327,7 @@ _request_handler(iotcon_resource_h resource, iotcon_request_h request, void *dat
           ret = iotcon_request_get_type(request, &req_type);
           if (IOTCON_ERROR_NONE != ret)
               /* Error handling */
      +
           switch (req_type) {
           case IOTCON_REQUEST_GET:
               ret = _get_repr(resource, &repr);
      @@ -345,13 +337,14 @@ _request_handler(iotcon_resource_h resource, iotcon_request_h request, void *dat
           default:
               dlog_print(DLOG_DEBUG, LOG_TAG, "type: %d", req_type);
           }
      -    _send_response(request, result, repr);
      +
      +    _send_response(request, repr, result);
           if (repr)
               iotcon_representation_destroy(repr);
       }
       
      -
    • To process the GET request, the server must create the representation handle, which can include resource properties, such as the URI path, types, interfaces, and the state handle. Create the handle with the iotcon_representation_create() function: +
    • To process the GET request, the server must create the representation handle, which includes the resource attributes:
       static int _light_brightness;
       
      @@ -360,20 +353,14 @@ _get_repr(iotcon_resource_h resource, iotcon_representation_h *representation)
       {
           int ret;
           char *uri_path;
      -    int interfaces;
      -    iotcon_resource_types_h res_types;
      +    iotcon_attributes_h attr;
           iotcon_representation_h repr;
      -    iotcon_state_h state;
       
           ret = iotcon_representation_create(&repr);
           if (IOTCON_ERROR_NONE != ret)
               /* Error handling */
       
      -    ret = iotcon_resource_get_types(resource, &res_types);
      -    if (IOTCON_ERROR_NONE != ret)
      -        /* Error handling */
      -
      -    ret = iotcon_representation_set_resource_types(repr, res_types);
      +    ret = iotcon_attributes_create(&attr);
           if (IOTCON_ERROR_NONE != ret)
               /* Error handling */
       
      @@ -385,26 +372,14 @@ _get_repr(iotcon_resource_h resource, iotcon_representation_h *representation)
           if (IOTCON_ERROR_NONE != ret)
               /* Error handling */
       
      -    ret = iotcon_resource_get_interfaces(resource, &interfaces);
      -    if (IOTCON_ERROR_NONE != ret)
      -        /* Error handling */
      -
      -    ret = iotcon_representation_set_resource_interfaces(repr, interfaces);
      +    ret = iotcon_attributes_add_int(attr, "brightness", _light_brightness);
           if (IOTCON_ERROR_NONE != ret)
               /* Error handling */
       
      -    ret = iotcon_state_create(&state);
      +    ret = iotcon_representation_set_attributes(repr, attr);
           if (IOTCON_ERROR_NONE != ret)
               /* Error handling */
      -
      -    ret = iotcon_state_add_int(state, "brightness", _light_brightness);
      -    if (IOTCON_ERROR_NONE != ret)
      -        /* Error handling */
      -
      -    ret = iotcon_representation_set_state(repr, state);
      -    if (IOTCON_ERROR_NONE != ret)
      -        /* Error handling */
      -    iotcon_state_destroy(state);
      +    iotcon_attributes_destroy(attr);
       
           *representation = repr;
       
      @@ -416,22 +391,25 @@ _get_repr(iotcon_resource_h resource, iotcon_representation_h *representation)
       

      In the function, set the response handle that can include the mandatory response result and optional representation.

       void
      -_send_response(iotcon_request_h request, iotcon_response_result_e result, iotcon_representation_h repr)
      +_send_response(iotcon_request_h request, iotcon_representation_h repr, iotcon_response_result_e result)
       {
           int ret;
           iotcon_response_h resp;
      +
           ret = iotcon_response_create(request, &resp);
           if (IOTCON_ERROR_NONE != ret)
               /* Error handling */
      +
           ret = iotcon_response_set_result(resp, result);
           if (IOTCON_ERROR_NONE != ret)
               /* Error handling */
       
           if (repr) {
      -        ret = iotcon_response_set_representation(resp, IOTCON_INTERFACE_DEFAULT, repr);
      +        ret = iotcon_response_set_representation(resp, repr);
               if (IOTCON_ERROR_NONE != ret)
                   /* Error handling */
           }
      +
           ret = iotcon_response_send(resp);
           if (IOTCON_ERROR_NONE != ret) 
               /* Error handling */
      @@ -447,12 +425,13 @@ _parse_representation(iotcon_representation_h repr)
       {
           int ret;
           int brightness;
      -    iotcon_state_h state;
      +    iotcon_attributes_h attr = NULL;
       
      -    ret = iotcon_representation_get_state(repr, &state);
      +    ret = iotcon_representation_get_attributes(repr, &attr);
           if (IOTCON_ERROR_NONE != ret)
               /* Error handling */
      -    ret = iotcon_state_get_int(state, "brightness", &brightness);
      +
      +    ret = iotcon_attributes_get_int(attr, "brightness", &brightness);
           if (IOTCON_ERROR_NONE != ret)
               /* Error handling */
           dlog_print(DLOG_DEBUG, LOG_TAG, "Brightness: %d", brightness);
      @@ -465,16 +444,21 @@ _on_get(iotcon_remote_resource_h resource, iotcon_error_e err,
           int ret;
           iotcon_representation_h repr;
           iotcon_response_result_e result;
      +
           if (IOTCON_ERROR_NONE != err)
               /* Error handling */
      +
           ret = iotcon_response_get_result(response, &result);
           if (IOTCON_ERROR_NONE != ret)
               /* Error handling */
      +
           if (IOTCON_RESPONSE_OK != result)
               /* Error handling */
      +
           ret = iotcon_response_get_representation(response, &repr);
           if (IOTCON_ERROR_NONE != ret)
               /* Error handling */
      +
           _parse_representation(repr);
       }
       
      @@ -486,28 +470,33 @@ _on_get(iotcon_remote_resource_h resource, iotcon_error_e err,

      To send PUT requests to a server:

      1. To send a PUT request to the server, use the iotcon_remote_resource_put() function. -

        In the function, set the remote resource, representation, query, and the response callback function called when a response arrives from the resource.

        +

        First create the representation and attributes, and set the desired attribute values, and then send the representation using iotcon_remote_resource_put() function.

         int ret;
         iotcon_representation_h repr;
        -iotcon_state_h state;
        +iotcon_attributes_h attr;
        +
         ret = iotcon_representation_create(&repr);
         if (IOTCON_ERROR_NONE != ret)
             /* Error handling */
        -ret = iotcon_state_create(&state);
        +
        +ret = iotcon_attributes_create(&attr);
         if (IOTCON_ERROR_NONE != ret)
             /* Error handling */
        -ret = iotcon_state_add_int(state, "brightness", 20);
        +
        +ret = iotcon_attributes_add_int(attr, "brightness", 20);
         if (IOTCON_ERROR_NONE != ret)
             /* Error handling */
        -ret = iotcon_representation_set_state(repr, state);
        +
        +ret = iotcon_representation_set_attributes(repr, attr);
         if (IOTCON_ERROR_NONE != ret)
             /* Error handling */
        -iotcon_state_destroy(state);
        +iotcon_attributes_destroy(attr);
         
         ret = iotcon_remote_resource_put(_light_resource, repr, NULL, _on_put, NULL);
         if (IOTCON_ERROR_NONE != ret)
             /* Error handling */
        +
         iotcon_representation_destroy(repr);
         
      2. @@ -518,17 +507,23 @@ static void _handle_put(iotcon_request_h request) {     int ret; +    int value;     iotcon_representation_h repr; -    iotcon_state_h state; +    iotcon_attributes_h attr; +     ret = iotcon_request_get_representation(request, &repr);     if (IOTCON_ERROR_NONE != ret)         /* Error handling */ -    ret = iotcon_representation_get_state(repr, &state); + +    ret = iotcon_representation_get_attributes(repr, &attr);     if (IOTCON_ERROR_NONE != ret)         /* Error handling */ -    ret = iotcon_state_get_int(state, "brightness", &_light_brightness); + +    ret = iotcon_attributes_get_bool(attr, "brightness", &value);     if (IOTCON_ERROR_NONE != ret)         /* Error handling */ + +    _light_brightness = value; } static void @@ -542,6 +537,7 @@ _request_handler(iotcon_resource_h resource, iotcon_request_h request, void *dat     ret = iotcon_request_get_request_type(request, &req_type);     if (IOTCON_ERROR_NONE != ret)         /* Error handling */ +     switch (req_type) {     case IOTCON_REQUEST_PUT:         _handle_put(request); @@ -552,8 +548,10 @@ _request_handler(iotcon_resource_h resource, iotcon_request_h request, void *dat     default:         dlog_print(DLOG_DEBUG, LOG_TAG, "type: %d", req_type);     } -    _send_response(request, result, repr); + +    _send_response(request, repr, result);     if (repr) +         iotcon_representation_destroy(repr); }
      @@ -567,16 +565,21 @@ _on_put(iotcon_remote_resource_h resource, iotcon_error_e err,     int ret;     iotcon_representation_h repr;     iotcon_response_result_e result; +     if (IOTCON_ERROR_NONE != err)         /* Error handling */ +     ret = iotcon_response_get_result(response, &result);     if (IOTCON_ERROR_NONE != ret)         /* Error handling */ +     if (IOTCON_RESPONSE_OK != result)         /* Error handling */ +     ret = iotcon_response_get_representation(response, &repr);     if (IOTCON_ERROR_NONE != ret)         /* Error handling */ +     _parse_representation(repr); }
    • @@ -590,16 +593,11 @@ _on_put(iotcon_remote_resource_h resource, iotcon_error_e err,
    • If the resource is observable, the client can register a callback to observe the resource using the iotcon_remote_resource_observe_register() function:
       int ret;
      -int properties;
      -ret = iotcon_remote_resource_get_properties(_light_resource, &properties);
      +
      +ret = iotcon_remote_resource_observe_register(_light_resource, IOTCON_OBSERVE_IGNORE_OUT_OF_ORDER,
      +                                              NULL, _observe_cb, NULL);
       if (IOTCON_ERROR_NONE != ret)
           /* Error handling */
      -if (IOTCON_RESOURCE_OBSERVABLE & properties) {
      -    ret = iotcon_remote_resource_observe_register(_light_resource, IOTCON_OBSERVE_IGNORE_OUT_OF_ORDER,
      -                                                  NULL, _observe_cb, NULL);
      -    if (IOTCON_ERROR_NONE != ret)
      -        /* Error handling */
      -}
       
    • On the server side, the request handler callback is called when the observe request arrives from the client. To manage the observers, use the iotcon_observers_h handle. @@ -611,9 +609,11 @@ _handle_observe(iotcon_request_h request, bool is_register) {     int ret;     int observe_id; +     ret = iotcon_request_get_observe_id(request, &observe_id);     if (IOTCON_ERROR_NONE != ret)         /* Error handling */ +     if (is_register) {         if (NULL == _observers) {             ret = iotcon_observers_create(&_observers); @@ -639,6 +639,7 @@ _request_handler(iotcon_resource_h resource, iotcon_request_h request, void *dat     ret = iotcon_request_get_observe_type(request, &observe_type);     if (IOTCON_ERROR_NONE != ret)         /* Error handling */ +     switch (observe_type) {     case IOTCON_OBSERVE_REGISTER:         _handle_observe(request, true); @@ -657,9 +658,11 @@ _request_handler(iotcon_resource_h resource, iotcon_request_h request, void *dat
       int ret;
       iotcon_representation_h repr = NULL;
      +
       ret = _get_repr(resource, &repr);
       if (0 != ret)
           /* Error handling */
      +
       ret = iotcon_resource_notify(resource, _observers, repr, IOTCON_QOS_HIGH);
       if (IOTCON_ERROR_NONE != ret)
           /* Error handling */
      @@ -675,12 +678,15 @@ _observe_cb(iotcon_remote_resource_h resource, iotcon_error_e err,
       {
           int ret;
           iotcon_representation_h repr;
      +
           if (IOTCON_ERROR_NONE != err)
               /* Error handling */
           dlog_print(DLOG_DEBUG, LOG_TAG, "sequence: %d", sequence_number);
      +
           ret = iotcon_response_get_representation(response, &repr);
           if (IOTCON_ERROR_NONE != ret)
               /* Error handling */
      +
           _parse_representation(repr);
       }
       
      @@ -688,6 +694,7 @@ _observe_cb(iotcon_remote_resource_h resource, iotcon_error_e err,
    • When the client no longer needs to monitor the resource, deregister the observation callback with the iotcon_remote_resource_observe_deregister() function:
       int ret;
      +
       ret = iotcon_remote_resource_observe_deregister(_light_resource);
       if (IOTCON_ERROR_NONE != ret)
           /* Error handling */
      @@ -717,4 +724,4 @@ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga
       
       
       
      -
      \ No newline at end of file
      +
      diff --git a/org.tizen.guides/html/native/connectivity/mtp_n.htm b/org.tizen.guides/html/native/connectivity/mtp_n.htm
      index 12145d0..41ce2a0 100644
      --- a/org.tizen.guides/html/native/connectivity/mtp_n.htm
      +++ b/org.tizen.guides/html/native/connectivity/mtp_n.htm
      @@ -75,8 +75,6 @@
       

      The MTP Object Information API (in mobile and wearable applications) allows you to obtain various object details, such as the object format, name, and size.

    -

    Before you start, remember to prepare your application to use the MTP functionality.

    -

    The MTP API can be used in all profiles, but it is most popular in the TV profile.

    The internal implementation of the MTP references the MTP specification and uses LIBMTP.

    @@ -93,32 +91,6 @@
    - - -

    Warm-up

    - -

    Become familiar with the MTP API basics by learning about:

    - -

    Prerequisites

    diff --git a/org.tizen.guides/html/native/connectivity/nfc_n.htm b/org.tizen.guides/html/native/connectivity/nfc_n.htm index 7cb9aaf..b4f1adb 100644 --- a/org.tizen.guides/html/native/connectivity/nfc_n.htm +++ b/org.tizen.guides/html/native/connectivity/nfc_n.htm @@ -71,8 +71,7 @@
  • Get cached NFC messages.
  • Use the NFC application control.
  • -

    Before you start, remember to prepare your application to use the NFC functionality.

    - +
  • NDEF support

    The NFC Data Exchange Format (NDEF) is a packet message format used in the reader/writer and peer-to-peer modes.

    @@ -160,36 +159,6 @@
  • -

    Warm-up

    -

    Become familiar with the NFC API basics by learning about:

    - -

    Prerequisites

    To enable your application to use the NFC functionality:

    diff --git a/org.tizen.guides/html/native/connectivity/nsd_n.htm b/org.tizen.guides/html/native/connectivity/nsd_n.htm index d9fdcc5..7bce0d5 100644 --- a/org.tizen.guides/html/native/connectivity/nsd_n.htm +++ b/org.tizen.guides/html/native/connectivity/nsd_n.htm @@ -27,8 +27,6 @@

    Content

      -
    • DNSSD
    • -
    • SSDP
    • Prerequisites
    • DNSSD
        @@ -56,68 +54,32 @@

        Network Service Discovery

        -

        You can use 2 different protocols to perform network service discoveries to announce local services and search for remote services on a network:

        -

        The supported service discovery protocols are:

        +

        You can use 2 different protocols to perform network service discoveries to announce local services and search for remote services on a network, DNS-SD (DNS Service Discovery) and SSDP (Simple Service Discovery Protocol).

          -
        • DNS-SD (DNS Service Discovery)
        • -
        • SSDP (Simple Service Discovery Protocol)
        • -
        -

        Both protocols allow the application to get details, such as the service names and the service locations on a network. Before you start, remember to prepare your application to use the network service discovery functionality.

        - -

        DNSSD

        - +
      • The DNS-SD protocol provides functions for mDNS- and DNS-based service discovery.

        -

        The main features of the DNSSD API include:

        • Creating and registering a local service -

          To handle a local service, you need a local service handle (dnssd_service_h).

          -

          To announce a local service, create a local service handle using the dnssd_create_local_service() function, and set the service information using the handle. Afterwards, you can register the local service using the dnssd_register_local_service() function.

          -

          When you no longer want to provide the local service, deregister it with the dnssd_deregister_local_service() function. To destroy the local service handle, use the dnssd_destroy_local_service() function.

          +

          You can manage a local service using a local service handle.

          +
        • Searching for remote services -

          You can search for the available remote services on a network by using the dnssd_start_browsing_service() function. The browsing operations are handled by the browser handle (dnssd_browser_h).

          -

          To stop the service search, use the dnssd_stop_browsing_service() function.

          -
        - -

        SSDP

        - +

        You can search for the available remote services on a network.

        +
    • +
    • The SSDP protocol provides functions for simple service discovery.

      -

      The main features of the SSDP API include:

      • Creating and registering a local service -

        To handle a local service, you need a local service handle (ssdp_service_h).

        -

        To announce a local service, create a local service handle using the ssdp_create_local_service() function, and set the service information using the handle. Afterwards, you can register the local service using the ssdp_register_local_service() function.

        -

        When you no longer want to provide the local service, deregister it with the ssdp_deregister_local_service() function. To destroy the local service handle, use the ssdp_destroy_local_service() function.

        +

        You can manage a local service using a local service handle.

      • Searching for remote services -

        You can search for the available remote services on a network by using the ssdp_start_browsing_service() function. The browsing operations are handled by the browser handle (ssdp_browser_h).

        -

        To stop the service search, use the ssdp_stop_browsing_service() function.

        -
      - -

      Warm-up

      -

      Become familiar with the DNSSD and SSDP API basics by learning about:

      - +

      You can search for the available remote services on a network.

      +
    + +

    Both protocols allow the application to get details, such as the service names and the service locations on a network.

    +

    Prerequisites

    To enable your application to use the network service discovery functionality:

    @@ -175,6 +137,8 @@ ssdp_deinitialize();

    Managing a Local Service with DNSSD

    + +

    To announce a local service, create a local service handle using the dnssd_create_local_service() function, and set the service information using the handle. Afterwards, you can register the local service using the dnssd_register_local_service() function.

    To manage a local service, you must create and register the service:

    @@ -227,11 +191,6 @@ if (dnssd_service_remove_txt_record_value(service_handle, key) == DNSSD_ERROR_NO     printf("Success in removing service TXT"); -
  • When the service is no longer provided, destroy the created service handle: -
    -dnssd_destroy_local_service(service_handle);
    -
    -
  • Register the local service: @@ -267,10 +226,17 @@ __registered_cb(dnssd_error_e result, dnssd_service_h dnssd_service, void* user_
  • +
  • When you no longer want to provide the local service, deregister it with the dnssd_deregister_local_service() function. +

    To destroy the local service handle, use the dnssd_destroy_local_service() function.

    +
    +dnssd_deregister_local_service(service_handle):
    +dnssd_destroy_local_service(service_handle);
    +
    +
  • - +

    To search for available services on a network, use a service type or target information:

      @@ -379,6 +345,8 @@ dnssd_stop_browsing_service(browser_handle);

      Managing a Local Service with SSDP

      + +

      To announce a local service, create a local service handle using the ssdp_create_local_service() function, and set the service information using the handle. Afterwards, you can register the local service using the ssdp_register_local_service() function.

      To manage a local service, you must create and register the service:

      @@ -411,11 +379,6 @@ if (ssdp_service_set_url(service_handle, url) == SSDP_ERROR_NONE)     printf("Success in setting URL"); -
    1. When the service is no longer provided, destroy the created service handle: -
      -ssdp_destroy_local_service(service_handle);
      -
      -
  • Register the local service: @@ -440,6 +403,13 @@ __registered_cb(ssdp_error_e result, ssdp_service_h ssdp_service, void *user_dat
  • +
  • When you no longer want to provide the local service, deregister it with the ssdp_deregister_local_service() function. +

    To destroy the local service handle, use the ssdp_destroy_local_service() function.

    +
    +ssdp_deregister_local_service(service_handle);
    +ssdp_destroy_local_service(service_handle);
    +
    +
  • diff --git a/org.tizen.guides/html/native/connectivity/plugins_n.htm b/org.tizen.guides/html/native/connectivity/plugins_n.htm index ad2f48e..a489c57 100644 --- a/org.tizen.guides/html/native/connectivity/plugins_n.htm +++ b/org.tizen.guides/html/native/connectivity/plugins_n.htm @@ -28,7 +28,7 @@

    Content

    • Available Adaptors
    • -
    • Starting a Plugin
    • +
    • Plugin Initialization
    • Prerequisites
    • Retrieving Available Service Plugins
    • Retrieving Files
    • @@ -47,7 +47,7 @@

      Service Access through Plugins

      -

      You can manage adaptors, which function as agents between the Service Adaptor Client and the related plugins, to take advantage of various services. For example, the Auth and Storage adaptors allow you to access the Auth and Service Plugins to use services, such as Amazon, Box, Dropbox, Google Drive, Onedrive, and Sugarsync.

      +

      You can manage various adaptors, which function as agents between the Service Adaptor Client and the related plugins, to take advantage of various services. You must use the adapters to initialize a plugin to use its services. For example, the Auth and Storage adaptors allow you to access the Auth and Service Plugins to use services, such as Amazon, Box, Dropbox, Google Drive, OneDrive, and Sugarsync.

      This feature is supported in mobile applications only.

      @@ -126,7 +126,7 @@
    -

    Starting a Plugin

    +

    Plugin Initialization

    To start a plugin, use the following process:

    @@ -171,25 +171,6 @@ _plugin_iterator_cb(char *plugin_uri, int service_mask, void *user_data) } -

    Warm-up

    - -

    Become familiar with the Service Adaptor API basics by learning about:

    - - -

    Prerequisites

    To enable your application to use the Service Adaptor functionality:

    diff --git a/org.tizen.guides/html/native/connectivity/smartcard_n.htm b/org.tizen.guides/html/native/connectivity/smartcard_n.htm index 770a7a8..627a51e 100644 --- a/org.tizen.guides/html/native/connectivity/smartcard_n.htm +++ b/org.tizen.guides/html/native/connectivity/smartcard_n.htm @@ -66,8 +66,6 @@

    All of the above are used when you send a transmission.

    -

    Before you start, remember to prepare your application to use the smart card functionality.

    -

    The following figure illustrates the smart card service architecture in Tizen. The smart card service sends and receives data through the terminal of each SE.

    Figure: Smart card service architecture

    Smart card service architecture

    @@ -87,7 +85,7 @@ The Open Mobile API can facilitate the memory management by calling the API twic In some Tizen devices, after a specified time, the screen is automatically switched off and the CPU goes to the resting state. If this occurs during communication with the SE using the Smartcard API, the API may not function normally. -

    To avoid the screen switching off and the CPU going to the resting state, use the Device API to lock the device CPU (not LDC):

    +

    To avoid the screen switching off and the CPU going to the resting state, use the Device API to lock the device CPU (not the display):

     #include <nfc.h>
    @@ -102,27 +100,6 @@ device_power_release_lock(POWER_LOCK_CPU);
     	
     
     
    -

    Warm-up

    -

    Become familiar with the Smartcard API basics by learning about:

    -
      -
    • Prerequisites -

      Prepare your application to use the smart card functionality.

    • -
    • Using the SE Service -

      Initialize the SE service and retrieve available readers.

    • -
    • Managing the Reader -

      Retrieve the reader name, check whether the SE is present in the reader, open sessions, and close all sessions.

    • -
    • Managing Sessions -

      Retrieve session information, open basic and logical channels, and close channels and the session.

    • -
    • Managing Channels -

      Retrieve channel information, select the next applet, transmit APDU commands, and close the channel.

    • -
    -

    Follow-up

    -

    Once we have learned the basics of the Smartcard API, we can now move on to more advanced tasks, including:

    -
      -
    • Sending a Transmission -

      Retrieve a reader, open a session and a logical channel, and transmit an APDU command over the channel.

    • -
    -

    Prerequisites

    To enable your application to use the smart card functionality:

    diff --git a/org.tizen.guides/html/native/connectivity/telephony_n.htm b/org.tizen.guides/html/native/connectivity/telephony_n.htm index 492ae10..c64467a 100644 --- a/org.tizen.guides/html/native/connectivity/telephony_n.htm +++ b/org.tizen.guides/html/native/connectivity/telephony_n.htm @@ -50,26 +50,27 @@

    Telephony information features include call, SIM, network, and modem information using the Telephony Service.

    -

    The main telephony information features are:

    +

    The main Telephony Information API features are:

    -

    The following figure illustrates the Telephony Service and APIs.

    Figure: Telephony APIs and Telephony Service

    Telephony APIs and Telephony Service

    -

    Before you start, remember to prepare your application to use the telephony information functionality.

    Call Information

    The Call API (in mobile and wearable applications) provides the following functions:

    @@ -356,23 +357,6 @@

    Gets the MEID (Mobile Equipment Identifier) of a mobile phone. You get the MEID as a string, which needs to be freed by the application.

    -

    Warm-up

    -

    Become familiar with the Telephony Information API basics by learning about:

    - - - -

    Prerequisites

    To enable your application to use the telephony information functionality:

    diff --git a/org.tizen.guides/html/native/connectivity/usb_host_n.htm b/org.tizen.guides/html/native/connectivity/usb_host_n.htm index 0cfb30f..a16e808 100644 --- a/org.tizen.guides/html/native/connectivity/usb_host_n.htm +++ b/org.tizen.guides/html/native/connectivity/usb_host_n.htm @@ -51,7 +51,7 @@

    The main features of the USB Host API include:

    • Initializing the interface context -

      You can set up your application for the USB host functionality by initializing the interface context.

      +

      You can set up your application for the USB host functionality by initializing the interface context.

    • Finding and opening a device through a device list

      To use the USB host functionality, you have to find a device and gather information about it.

      @@ -66,20 +66,6 @@

      Figure: USB host architecture

      USB host architecture

      -

      Warm-up

      - -

      Become familiar with the USB Host API basics by learning about:

      - -

      Prerequisites

      To enable your application to use the USB host functionality:

      diff --git a/org.tizen.guides/html/native/connectivity/vpn_n.htm b/org.tizen.guides/html/native/connectivity/vpn_n.htm index 400ea51..58404dc 100644 --- a/org.tizen.guides/html/native/connectivity/vpn_n.htm +++ b/org.tizen.guides/html/native/connectivity/vpn_n.htm @@ -44,7 +44,7 @@

      VPN Connections

      -

      A Virtual Private Network (VPN) connects 2 computers securely and privately over the internet. Using the VPN service, you can allow the users of your application to initialize the VPN device, and manage routing, DNS, and firewall features.

      +

      A Virtual Private Network (VPN) connects 2 computers securely and privately over the internet. Using the VPN service, you can allow the users of your application to initialize the VPN device, and manage routing, DNS, and firewall features. A VPN connection consists of multiple components, mainly with the VPN server and client connecting over a tunnel.

      This feature is supported in mobile applications only.

      @@ -105,8 +105,6 @@
    -

    Before you start, remember to prepare your application to use the VPN service functionality.

    -

    The VPN service uses 2 mechanisms for managing access control between the application and service:

    • Privilege: @@ -144,25 +142,6 @@
    -

    Warm-up

    - -

    Become familiar with the VPN Service API basics by learning about:

    - - -

    Prerequisites

    To enable your application to use the VPN service functionality:

    diff --git a/org.tizen.guides/html/native/connectivity/web_view_n.htm b/org.tizen.guides/html/native/connectivity/web_view_n.htm index 2914ba6..d68dac9 100644 --- a/org.tizen.guides/html/native/connectivity/web_view_n.htm +++ b/org.tizen.guides/html/native/connectivity/web_view_n.htm @@ -53,16 +53,10 @@

    Web View

    -

    The Web view features include accessing Web content in your application. Before you start, remember to prepare your application to use the Web functionality.

    +

    The Web view features include accessing Web pages and Web content in your application.

    +

    The WebView API implements the EFL WebKit (EWK), which covers various features for Web browsing, such as loading and displaying Web pages and navigating through the browsing history. The EFL APIs (in mobile and wearable applications), such as evas_*, elm_*, and eina_*, are used to build up a complete application supporting Web browsing.

    -

    The main Web view features are:

    -
      -
    • Accessing Web pages and Web content. -

      The WebView API implements the EFL WebKit (EWK), which covers various features for Web browsing, such as loading and displaying Web pages and navigating through the browsing history. The EFL APIs (in mobile and wearable applications), such as evas_*, elm_*, and eina_*, are used to build up a complete application supporting Web browsing.

      -
    • -
    - -

    To use the Web features to create a simple Web browser:

    +

    Use the Web features to create a simple Web browser:

    1. Create a window object, and set the window layout and view.

      Later on, you can use various helper functions to find the created window.

    2. @@ -71,26 +65,6 @@
    3. When no longer needed, terminate the window.
    -

    Warm-up

    - -

    Become familiar with the Web API basics by learning about:

    - -

    Prerequisites

    To enable your application to use the Web view functionality:

    diff --git a/org.tizen.guides/html/native/connectivity/wifi_direct_n.htm b/org.tizen.guides/html/native/connectivity/wifi_direct_n.htm index 6f4d7a7..0dc6a36 100644 --- a/org.tizen.guides/html/native/connectivity/wifi_direct_n.htm +++ b/org.tizen.guides/html/native/connectivity/wifi_direct_n.htm @@ -54,48 +54,29 @@

    A Wi-Fi Direct™ device can join an existing group by associating itself with the group owner, as long as the allowed number of clients is not exceeded.

    -

    With Wi-FI Direct™ you can:

    +

    The main features of the Wi-Fi Direct™ API include:

    - -

    Before you start, remember to prepare your application to use the Wi-Fi Direct™ functionality.

    - - +
    Note
    You can test the Wi-Fi Direct™ functionality only on target devices. The Emulator currently does not support this feature.You can test the Wi-Fi Direct™ functionality only on target devices. The Emulator does not support this feature currently.
    -

    Warm-up

    -

    Become familiar with the Wi-Fi Direct API basics by learning about:

    - -

    Prerequisites

    To enable your application to use the Wi-Fi Direct™ functionality:

    diff --git a/org.tizen.guides/html/native/connectivity/wifi_n.htm b/org.tizen.guides/html/native/connectivity/wifi_n.htm index 0569780..e33f236 100644 --- a/org.tizen.guides/html/native/connectivity/wifi_n.htm +++ b/org.tizen.guides/html/native/connectivity/wifi_n.htm @@ -48,11 +48,13 @@

    Tizen allows your application to connect to a Wireless Local Area Network (WLAN) and transfer data over the network. The Wi-Fi Manager enables your application to activate and deactivate a local Wi-Fi device, and to connect to a WLAN network in the infrastructure mode.

    The main features of the Wi-Fi API include:

    -
    • Wi-Fi device and connection management using the Wi-Fi Manager
    • -
    • Access point management -

      You can manage the Wi-Fi account and security information.

      +
      • Wi-Fi device and connection management +

        You can use the Wi-Fi Manager to implement and manage Wi-Fi connection features.

      • +
      • Access point management +

        You can manage the Wi-Fi account and security information.

        The infrastructure mode is used to connect to a wireless local area network (WLAN). The infrastructure mode requires a wireless access point. To connect to a WLAN, a client must be configured to use the same service set identifier (SSID) as the access point.

      • -
      • Wi-Fi state monitoring using the Wi-Fi Monitor
      • +
      • Wi-Fi state monitoring +

        You can use the Wi-Fi Monitor to monitor the Wi-Fi connection state.

      @@ -82,9 +84,7 @@

      To scan access points, use the wifi_scan() and wifi_foreach_found_aps() functions.

      The wifi_scan() function starts the scan asynchronously. When the scan is finished, a callback function is called. The wifi_foreach_found_aps() function allows you to get the result of the scan. It also invokes a callback function.

      -

      Before you start, remember to prepare your application to use the Wi-Fi functionality.

      - -

      Access Point

      +

      Access Point

      The Access Point API (in mobile and wearable applications) provides functions for managing access points (AP). You need to create an AP handle (wifi_ap_h) for using the API functions.

      @@ -264,15 +264,6 @@
      -

      Warm-up

      -

      Become familiar with the Wi-Fi API basics by learning about:

      - -

      Prerequisites

      To enable your application to use the Wi-Fi functionality:

      diff --git a/org.tizen.guides/html/native/data/data_storages_n.htm b/org.tizen.guides/html/native/data/data_storages_n.htm index 63babd1..2adece1 100644 --- a/org.tizen.guides/html/native/data/data_storages_n.htm +++ b/org.tizen.guides/html/native/data/data_storages_n.htm @@ -95,30 +95,13 @@ - -

      Before you start, remember to prepare your application to use the storage functionality.

      - +

      The main features of the Storage API include:

      • Storage management

        You can manage different storages on the device with the Storage APIs.

        You can retrieve additional information about the storages, including which storage is supported in the device using the storage_foreach_device_supported() function. The callback function returns the storage type, mount state, and virtual root path. You can also retrieve memory sizes and monitor storage state changes.

      • Storage space management -

        You can get the available and total space size of the storage with the storage_get_total_space() and storage_get_available_space() functions. They return the storage size, excluding the minimum memory size to launch the low memory pop-up in case of a low memory situation. Consequently, the available size must be less than the original available size, and you must use these functions to get the memory size. For the same reason, you cannot use the statvfs function directly in Tizen. Instead, use storage_get_internal_memory_size() and storage_get_external_memory_size(). The Statvfs structure has a different structure size defined by "__USE_FILE_OFFSET64". However, you can ignore this, since the Storage API uses a proper function automatically.

      - -

      Warm-up

      -

      Become familiar with the Storage API basics by learning about:

      - +

      You can get the available and total space size of the storage.

    Prerequisites

    To use the functions and data types of the Storage API (in mobile and wearable applications), include the <storage.h> header file in your application:

    @@ -262,6 +245,8 @@ error = storage_unset_state_changed_cb(internal_storage_id, storage_changed_cb);

    Retrieving Storage Space Information

    +

    To get the available and total space size of the storage, use the storage_get_total_space() and storage_get_available_space() functions. They return the storage size, excluding the minimum memory size to launch the low memory pop-up in case of a low memory situation. Consequently, the available size must be less than the original available size, and you must use these functions to get the memory size. For the same reason, you cannot use the statvfs function directly in Tizen. Instead, use storage_get_internal_memory_size() and storage_get_external_memory_size(). The Statvfs structure has a different structure size defined by "__USE_FILE_OFFSET64". However, you can ignore this, since the Storage API uses a proper function automatically.

    +

    To retrieve storage space information:

    • Get the total space of the storage using the storage_get_total_space() function. diff --git a/org.tizen.guides/html/native/data/sql_n.htm b/org.tizen.guides/html/native/data/sql_n.htm index 1c2252d..7a1f828 100644 --- a/org.tizen.guides/html/native/data/sql_n.htm +++ b/org.tizen.guides/html/native/data/sql_n.htm @@ -45,14 +45,14 @@

      You can use the open source modules, whose functions provide access to SQLite and OpenSSL and demonstrate how to encrypt and store application data. The open source modules supported by Tizen are listed in the API modules.

      -

      Warm-up

      -

      Become familiar with the basics of the Sqlite API by learning about:

      - +

      The main features of the Sqlite API include:

      + +

      Preparing the Database

      diff --git a/org.tizen.guides/html/native/device/attached_devices_n.htm b/org.tizen.guides/html/native/device/attached_devices_n.htm index a10964d..5e3e03f 100644 --- a/org.tizen.guides/html/native/device/attached_devices_n.htm +++ b/org.tizen.guides/html/native/device/attached_devices_n.htm @@ -52,45 +52,28 @@

      Attached Devices

      -

      The attached device features provide functions to control attached devices and monitor device changes. The following functionalities are supported:

      -

      Prerequisites

      diff --git a/org.tizen.guides/html/native/device/ext_output_n.htm b/org.tizen.guides/html/native/device/ext_output_n.htm index c7df7f2..300f788 100644 --- a/org.tizen.guides/html/native/device/ext_output_n.htm +++ b/org.tizen.guides/html/native/device/ext_output_n.htm @@ -44,12 +44,10 @@

      External Output Devices

      -

      The External Output Manager (EOM) is a module for controlling the external output devices.

      +

      The External Output Manager (EOM) is a module for controlling the external output devices.

      + +

      This feature is supported in mobile applications only.

      -

      This feature is supported in mobile applications only.

      - -

      Before you start, remember to prepare your application to use the EOM functionality.

      -

      The main features of the External Output Manager API include:

      • Managing modes @@ -108,22 +106,6 @@
      -

      Warm-up

      -

      Become familiar with the External Output Manager API basics by learning about:

      - - -

      Prerequisites

      To enable your application to use the EOM functionality:

      diff --git a/org.tizen.guides/html/native/device/feedback_n.htm b/org.tizen.guides/html/native/device/feedback_n.htm index 068814c..7e37180 100644 --- a/org.tizen.guides/html/native/device/feedback_n.htm +++ b/org.tizen.guides/html/native/device/feedback_n.htm @@ -43,34 +43,28 @@

      Sound and Vibration Feedback

      -

      You can play a feedback pattern using sound or vibration. You can play feedback for a specific pattern or play it for a specific type and pattern. You can also check whether a specific pattern is supported.

      +

      You can play feedback for a specific pattern or play it for a specific type and pattern. You can also check whether a specific pattern is supported.

      This feature is supported in mobile applications only.

      The main features of the Feedback API include:

      +

      You can play a feedback pattern using sound or vibration:

      +
      • Sound management

        You can request the sound-server to play a sound by using the mm-keysound library.

        You can use sound feedback with the feedback_play() or feedback_play_type() function. The attribute for the sound type is FEEDBACK_TYPE_SOUND.

      • Vibration management -

        You can request deviced to vibrate by using a dbus method call. A haptic monotone or haptic effect is requested to deviced, based on the vibration data type in the vibration.conf configuration.

        +

        You can request the device to vibrate by using a dbus method call. A haptic monotone or haptic effect is requested to device, based on the vibration data type in the vibration.conf configuration.

        You can use vibration feedback with the feedback_play() or feedback_play_type() function. The attribute for the vibration type is FEEDBACK_TYPE_VIBRATION.

      -

      Before you start, remember to prepare your application to use the feedback functionality.

      - -

      Warm-up

      -

      Become familiar with the Feedback API basics by learning about:

      - -

      Prerequisites

      To use the functions and data types of the Feedback API, include the <feedback.h> header file in your application:

      diff --git a/org.tizen.guides/html/native/device/runtime_n.htm b/org.tizen.guides/html/native/device/runtime_n.htm
      index f448267..dd31188 100644
      --- a/org.tizen.guides/html/native/device/runtime_n.htm
      +++ b/org.tizen.guides/html/native/device/runtime_n.htm
      @@ -32,8 +32,8 @@
       			
    • Prerequisites
    • Getting Runtime Information with a Key-Value Pair
    • Getting Runtime Information with a Function
    • -
    • Monitoring Runtime Information Changes -
    • +
    • Monitoring Runtime Information Changes
    • +
    • Runtime Information Keys

    Related Info

      @@ -46,122 +46,17 @@

      Runtime Information

      -

      Tizen provides various runtime information and enables your application to access it and monitor changes in it.

      -

      To obtain the information, query a runtime info key or use a specific function. The keys are listed in the following table. -

      +

      Tizen provides various runtime information and enables your application to access it and monitor changes in it.

      +

      The main features of the Runtime Information API include:

      + -

      Before you start, remember to prepare your application to use the runtime information functionality.

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - Table: Runtime information keys -
      KeyTypeDescription
      RUNTIME_INFO_KEY_BLUETOOTH_ENABLEDboolIndicates whether Bluetooth is enabled.
      RUNTIME_INFO_KEY_WIFI_HOTSPOT_ENABLEDboolIndicates whether a Wi-Fi hotspot is enabled.
      RUNTIME_INFO_KEY_BLUETOOTH_TETHERING_ENABLEDboolIndicates whether Bluetooth tethering is enabled.
      RUNTIME_INFO_KEY_USB_TETHERING_ENABLEDboolIndicates whether USB tethering is enabled.
      RUNTIME_INFO_KEY_LOCATION_SERVICE_ENABLEDboolIndicates whether the location service is allowed to use location data from GPS satellites.
      RUNTIME_INFO_KEY_LOCATION_NETWORK_POSITION_ENABLEDboolIndicates whether the location service is allowed to use location data from cellular and Wi-Fi.
      RUNTIME_INFO_KEY_PACKET_DATA_ENABLEDboolIndicates whether the packet data through 3G network is enabled.
      RUNTIME_INFO_KEY_DATA_ROAMING_ENABLEboolIndicates whether data roaming is enabled.
      RUNTIME_INFO_KEY_VIBRATION_ENABLEDboolIndicates whether vibration is enabled.
      RUNTIME_INFO_KEY_AUDIO_JACK_CONNECTEDboolIndicates whether an audio jack is connected.
      RUNTIME_INFO_KEY_GPS_STATUSintIndicates the current status of GPS.
      RUNTIME_INFO_KEY_BATTERY_IS_CHARGINGboolIndicates whether the battery is currently charging.
      RUNTIME_INFO_KEY_TV_OUT_CONNECTEDboolIndicates whether TV out is connected.
      RUNTIME_INFO_KEY_AUDIO_JACK_STATUSintIndicates the current status of the audio jack.
      RUNTIME_INFO_KEY_USB_CONNECTEDboolIndicates whether USB is connected.
      RUNTIME_INFO_KEY_CHARGER_CONNECTEDboolIndicates whether a charger is connected.
      RUNTIME_INFO_KEY_AUTO_ROTATION_ENABLEDboolIndicates whether auto-rotation is enabled.
      - -

      Warm-up

      -

      Become familiar with the Runtime information API basics by learning about:

      -

      Prerequisites

      @@ -306,6 +201,109 @@ func(void) }
    + + +

    Runtime Information Keys

    + +

    The following table lists the available runtime information keys.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Table: Runtime information keys +
    KeyTypeDescription
    RUNTIME_INFO_KEY_BLUETOOTH_ENABLEDboolIndicates whether Bluetooth is enabled.
    RUNTIME_INFO_KEY_WIFI_HOTSPOT_ENABLEDboolIndicates whether a Wi-Fi hotspot is enabled.
    RUNTIME_INFO_KEY_BLUETOOTH_TETHERING_ENABLEDboolIndicates whether Bluetooth tethering is enabled.
    RUNTIME_INFO_KEY_USB_TETHERING_ENABLEDboolIndicates whether USB tethering is enabled.
    RUNTIME_INFO_KEY_LOCATION_SERVICE_ENABLEDboolIndicates whether the location service is allowed to use location data from GPS satellites.
    RUNTIME_INFO_KEY_LOCATION_NETWORK_POSITION_ENABLEDboolIndicates whether the location service is allowed to use location data from cellular and Wi-Fi.
    RUNTIME_INFO_KEY_PACKET_DATA_ENABLEDboolIndicates whether the packet data through 3G network is enabled.
    RUNTIME_INFO_KEY_DATA_ROAMING_ENABLEboolIndicates whether data roaming is enabled.
    RUNTIME_INFO_KEY_VIBRATION_ENABLEDboolIndicates whether vibration is enabled.
    RUNTIME_INFO_KEY_AUDIO_JACK_CONNECTEDboolIndicates whether an audio jack is connected.
    RUNTIME_INFO_KEY_GPS_STATUSintIndicates the current status of GPS.
    RUNTIME_INFO_KEY_BATTERY_IS_CHARGINGboolIndicates whether the battery is currently charging.
    RUNTIME_INFO_KEY_TV_OUT_CONNECTEDboolIndicates whether TV out is connected.
    RUNTIME_INFO_KEY_AUDIO_JACK_STATUSintIndicates the current status of the audio jack.
    RUNTIME_INFO_KEY_USB_CONNECTEDboolIndicates whether USB is connected.
    RUNTIME_INFO_KEY_CHARGER_CONNECTEDboolIndicates whether a charger is connected.
    RUNTIME_INFO_KEY_AUTO_ROTATION_ENABLEDboolIndicates whether auto-rotation is enabled.
    diff --git a/org.tizen.guides/html/native/device/settings_n.htm b/org.tizen.guides/html/native/device/settings_n.htm index adec39b..1503b7e 100644 --- a/org.tizen.guides/html/native/device/settings_n.htm +++ b/org.tizen.guides/html/native/device/settings_n.htm @@ -30,8 +30,8 @@

    Content

    Related Info

      @@ -44,36 +44,193 @@

      System Settings

      -

      Tizen provides functions with which you can get the system configuration related to user preferences.

      +

      You can access the system configuration related to user preferences, such as ringtone, wallpaper, and font, using the System Settings API with the system setting keys.

      -

      The main features of the System Settings API include accessing system-wide configurations, such as ringtone, wallpaper, and font. Before you start, remember to prepare your application to use the system settings functionality.

      - -

      The system_settings_key_e enumerator defines all enumerations that work as arguments for the System Settings API.

      The System Settings API provides 2 function types listed in the following table. Certain functions support both types, whereas others only support the getter function.

      - - + + - + - - + +
      Table: System Settings API function types
      Function typeMethodsTypeFunction Description
      GETTERsystem_settings_get_value_bool -

      system_settings_get_value_int

      -

      system_settings_get_value_string

      system_settings_get_value_bool() +

      system_settings_get_value_int()

      +

      system_settings_get_value_string()

      Get the user-defined values by data type (bool, int, or string).
      NOTIFIERsystem_settings_set_changed_cb

      system_settings_unset_changed_cb

      Register and deregister callback functions when the SETTER related to the key is called.system_settings_set_changed_cb()

      system_settings_unset_changed_cb()

      Register and deregister callback functions which are triggered when the SETTER related to the key is called.
      -

      The following table lists the system settings details.

      + +

      The following example shows a typical use case. An application sees the name of the current wallpaper and you want to print out a message when the wallpaper changes:

      + +
      +void 
      +_img_cb(system_settings_key_e key, void *user_data)
      +{
      +    dlog_print(DLOG_INFO, LOG_TAG, "THIS IS CALLED BY USER APPLICATION WHEN THE WALLPAPER CHANGES \n");
      +}
      +
      +/* NOTIFIER 1 - Registering a callback function */
      +system_settings_set_changed_cb(SYSTEM_SETTINGS_KEY_WALLPAPER_HOME_SCREEN, _img_cb, NULL);
      +char * path;
      +
      +/* GETTER */
      +system_settings_get_value_string(SYSTEM_SETTINGS_KEY_WALLPAPER_HOME_SCREEN, &path);
      +dlog_print(DLOG_INFO, LOG_TAG, "path of the current wallpaper is %s \n", path);
      +
      +/* NOTIFIER 2 - Deregistering a callback function */
      +system_settings_unset_changed_cb(SYSTEM_SETTINGS_KEY_WALLPAPER_HOME_SCREEN);
      +
      + +

      Prerequisites

      +

      To use the functions and data types of the System Settings API (in mobile and wearable applications), include the <system_settings.h> header file in your application:

      +
      +#include <system_settings.h>
      +
      + +

      Managing System Settings

      + +

      To manage system settings, which provide access to system variables:

      +
        +
      1. Define auxiliary structures:

        + +
        +struct _ret_type_define {
        +    system_settings_key_e key;
        +    int returns;
        +};
        +
        +typedef
        +enum {
        +    _RET_BOOL = 0,
        +    _RET_INT,
        +    _RET_STRING
        +} _SYSTEM_SETTINGS_TYPES;
        +
        +struct _ret_type_define
        +_ret_type[] =
        +{
        +    {
        +        SYSTEM_SETTINGS_KEY_INCOMING_CALL_RINGTONE, _RET_STRING
        +    },
        +    {
        +        SYSTEM_SETTINGS_KEY_WALLPAPER_HOME_SCREEN, _RET_STRING
        +    },
        +    {
        +        SYSTEM_SETTINGS_KEY_WALLPAPER_LOCK_SCREEN, _RET_STRING
        +    },
        +    {
        +        SYSTEM_SETTINGS_KEY_FONT_SIZE, _RET_INT
        +    },
        +    {
        +        SYSTEM_SETTINGS_KEY_FONT_TYPE, _RET_STRING
        +    },
        +    {
        +        SYSTEM_SETTINGS_KEY_MOTION_ACTIVATION, _RET_BOOL
        +    },
        +    {
        +        /* Others */
        +    }
        +};
        +
        +static const char*
        +_info_key[SYS_INFO_COUNT]=
        +{
        +    "SYSTEM_SETTINGS_KEY_INCOMING_CALL_RINGTONE",
        +    "SYSTEM_SETTINGS_KEY_WALLPAPER_HOME_SCREEN",
        +    "SYSTEM_SETTINGS_KEY_WALLPAPER_LOCK_SCREEN",
        +    "SYSTEM_SETTINGS_KEY_FONT_SIZE",
        +    "SYSTEM_SETTINGS_KEY_FONT_TYPE",
        +    "SYSTEM_SETTINGS_KEY_MOTION_ACTIVATION",
        +    /* Others */
        +};
        +
        +
      2. + +
      3. Obtain the setting data.

        +

        The available settings are defined in the system_settings_key_e enumerator (in mobile and wearable applications).

        + +

        Read the data using the following functions, according to the data type of the value you want to read:

        + +
        • system_settings_get_value_int()
        • +
        • system_settings_get_value_bool()
        • +
        • system_settings_get_value_double()
        • +
        • system_settings_get_value_string()
        • +
        + +
        +#define SYS_INFO_COUNT 6
        +
        +int i;
        +for (i = 0; i < SYS_INFO_COUNT; i++) {
        +    dlog_print(DLOG_ERROR, LOG_TAG, "%d- System_settings: %s: ", i, _info_key[_ret_type[i].key]);
        +
        +    if (_ret_type[i].returns==_RET_BOOL) {
        +        system_settings_get_value_bool(_ret_type[i].key, &_bool_ret);
        +        dlog_print(DLOG_ERROR, LOG_TAG, "%d", _bool_ret);
        +    } else if (_ret_type[i].returns==_RET_INT) {
        +        system_settings_get_value_int(_ret_type[i].key, &_int_ret);
        +        dlog_print(DLOG_ERROR, LOG_TAG, "%d", _int_ret);
        +    } else if (_ret_type[i].returns==_RET_STRING) {
        +        system_settings_get_value_string(_ret_type[i].key, &_string_ret);
        +        dlog_print(DLOG_ERROR, LOG_TAG, "%s", _string_ret);
        +        free(_string_ret);
        +    } else if (_ret_type[i].returns==_RET_DOUBLE) {
        +        system_settings_get_value_double(_ret_type[i].key, &_double_ret);
        +        dlog_print(DLOG_ERROR, LOG_TAG, "%f", _double_ret);
        +    } else {
        +        dlog_print(DLOG_ERROR, LOG_TAG, "Undefined return type");
        +    }
        +}
        +
        +
      4. + + +
      5. Monitor changes in the setting values.

        +
        1. To monitor when a system setting value changes, set a callback using the system_settings_set_changed_cb() function with the appropriate key as the first parameter:

          + +
          +for (i = 0; i < SYS_INFO_COUNT; i++)
          +    system_settings_set_changed_cb(_ret_type[i].key, _system_settings_changed_cb, 0);
          +
        2. + +
        3. Define the callback to be invoked after each change.

          +

          The system_settings_key_e key refers to the key that has changed.

          + +
          +static void
          +_system_settings_changed_cb(system_settings_key_e key, void *user_data)
          +{
          +    dlog_print(DLOG_ERROR, LOG_TAG, "Runtime Info changed: %s", _info_key[key]);
          +}
          +
        4. + +
        5. When the callbacks are no longer needed, unset them:

          + +
          +for (i = 0; i < SYS_INFO_COUNT; i++)
          +    system_settings_unset_changed_cb(_ret_type[i].key, _system_settings_changed_cb, 0);
          +
        +
      6. + +
      + + +

      System Setting Keys

      + +

      The system_settings_key_e enumerator (in mobile and wearable applications) defines all enumerations that work as parameters for the System Settings API.

      + +

      The following table lists the available system setting keys.

      - + @@ -249,169 +406,6 @@
      Table: System settings keys @@ -82,7 +239,7 @@
      Key TypeSupporting API type Supported function type Description
      -

      The following example shows a typical use case: An application sees the name of the current wallpaper and you want to print out a message when the wallpaper changes:

      - -
      -void 
      -_img_cb(system_settings_key_e key, void *user_data)
      -{
      -    dlog_print(DLOG_INFO, LOG_TAG, "THIS IS CALLED BY USER APPLICATION WHEN THE WALLPAPER CHANGES \n");
      -}
      -
      -/* NOTIFIER 1 - Registering a callback function */
      -system_settings_set_changed_cb(SYSTEM_SETTINGS_KEY_WALLPAPER_HOME_SCREEN, _img_cb, NULL);
      -char * path;
      -
      -/* GETTER */
      -system_settings_get_value_string(SYSTEM_SETTINGS_KEY_WALLPAPER_HOME_SCREEN, &path);
      -dlog_print(DLOG_INFO, LOG_TAG, "path of the current wallpaper is %s \n", path);
      -
      -/* NOTIFIER 2 - Deregistering a callback function */
      -system_settings_unset_changed_cb(SYSTEM_SETTINGS_KEY_WALLPAPER_HOME_SCREEN);
      -
      - -

      Warm-up

      -

      Become familiar with the System Settings API basics by learning about:

      - - -

      Prerequisites

      -

      To use the functions and data types of the System Settings API (in mobile and wearable applications), include the <system_settings.h> header file in your application:

      -
      -#include <system_settings.h>
      -
      - -

      Managing System Settings

      - -

      To manage system settings, which provide access to system variables:

      -
        -
      1. Define auxiliary structures:

        - -
        -struct _ret_type_define {
        -    system_settings_key_e key;
        -    int returns;
        -};
        -
        -typedef
        -enum {
        -    _RET_BOOL = 0,
        -    _RET_INT,
        -    _RET_STRING
        -} _SYSTEM_SETTINGS_TYPES;
        -
        -struct _ret_type_define
        -_ret_type[] =
        -{
        -    {
        -        SYSTEM_SETTINGS_KEY_INCOMING_CALL_RINGTONE, _RET_STRING
        -    },
        -    {
        -        SYSTEM_SETTINGS_KEY_WALLPAPER_HOME_SCREEN, _RET_STRING
        -    },
        -    {
        -        SYSTEM_SETTINGS_KEY_WALLPAPER_LOCK_SCREEN, _RET_STRING
        -    },
        -    {
        -        SYSTEM_SETTINGS_KEY_FONT_SIZE, _RET_INT
        -    },
        -    {
        -        SYSTEM_SETTINGS_KEY_FONT_TYPE, _RET_STRING
        -    },
        -    {
        -        SYSTEM_SETTINGS_KEY_MOTION_ACTIVATION, _RET_BOOL
        -    },
        -    {
        -        /* Others */
        -    }
        -};
        -
        -static const char*
        -_info_key[SYS_INFO_COUNT]=
        -{
        -    "SYSTEM_SETTINGS_KEY_INCOMING_CALL_RINGTONE",
        -    "SYSTEM_SETTINGS_KEY_WALLPAPER_HOME_SCREEN",
        -    "SYSTEM_SETTINGS_KEY_WALLPAPER_LOCK_SCREEN",
        -    "SYSTEM_SETTINGS_KEY_FONT_SIZE",
        -    "SYSTEM_SETTINGS_KEY_FONT_TYPE",
        -    "SYSTEM_SETTINGS_KEY_MOTION_ACTIVATION",
        -    /* Others */
        -};
        -
        -
      2. - -
      3. Obtain the setting data.

        -

        The available settings are defined in the system_settings_key_e enumerator (in mobile and wearable applications).

        - -

        Read the data using the following functions, according to the data type of the value you want to read:

        - -
        • system_settings_get_value_int()
        • -
        • system_settings_get_value_bool()
        • -
        • system_settings_get_value_double()
        • -
        • system_settings_get_value_string()
        • -
        - -
        -#define SYS_INFO_COUNT 6
        -
        -int i;
        -for (i = 0; i < SYS_INFO_COUNT; i++) {
        -    dlog_print(DLOG_ERROR, LOG_TAG, "%d- System_settings: %s: ", i, _info_key[_ret_type[i].key]);
        -
        -    if (_ret_type[i].returns==_RET_BOOL) {
        -        system_settings_get_value_bool(_ret_type[i].key, &_bool_ret);
        -        dlog_print(DLOG_ERROR, LOG_TAG, "%d", _bool_ret);
        -    } else if (_ret_type[i].returns==_RET_INT) {
        -        system_settings_get_value_int(_ret_type[i].key, &_int_ret);
        -        dlog_print(DLOG_ERROR, LOG_TAG, "%d", _int_ret);
        -    } else if (_ret_type[i].returns==_RET_STRING) {
        -        system_settings_get_value_string(_ret_type[i].key, &_string_ret);
        -        dlog_print(DLOG_ERROR, LOG_TAG, "%s", _string_ret);
        -        free(_string_ret);
        -    } else if (_ret_type[i].returns==_RET_DOUBLE) {
        -        system_settings_get_value_double(_ret_type[i].key, &_double_ret);
        -        dlog_print(DLOG_ERROR, LOG_TAG, "%f", _double_ret);
        -    } else {
        -        dlog_print(DLOG_ERROR, LOG_TAG, "Undefined return type");
        -    }
        -}
        -
        -
      4. - - -
      5. Monitor changes in the setting values.

        -
        1. To monitor when a system setting value changes, set a callback using the system_settings_set_changed_cb() function with the appropriate key as the first parameter:

          - -
          -for (i = 0; i < SYS_INFO_COUNT; i++)
          -    system_settings_set_changed_cb(_ret_type[i].key, _system_settings_changed_cb, 0);
          -
        2. - -
        3. Define the callback to be invoked after each change.

          -

          The system_settings_key_e key refers to the key that has changed.

          - -
          -static void
          -_system_settings_changed_cb(system_settings_key_e key, void *user_data)
          -{
          -    dlog_print(DLOG_ERROR, LOG_TAG, "Runtime Info changed: %s", _info_key[key]);
          -}
          -
        4. - -
        5. When the callbacks are no longer needed, unset them:

          - -
          -for (i = 0; i < SYS_INFO_COUNT; i++)
          -    system_settings_unset_changed_cb(_ret_type[i].key, _system_settings_changed_cb, 0);
          -
        -
      6. - -
      diff --git a/org.tizen.guides/html/native/device/system_n.htm b/org.tizen.guides/html/native/device/system_n.htm index 2542399..99737ca 100644 --- a/org.tizen.guides/html/native/device/system_n.htm +++ b/org.tizen.guides/html/native/device/system_n.htm @@ -29,12 +29,11 @@

    Content

    Related Info

      @@ -48,10 +47,16 @@

      System Information

      -

      System information features enable your application to retrieve information about fixed platform features or device capabilities by querying system information keys. You can also check for supported features.

      +

      System information features enable your application to retrieve information about fixed platform features or device capabilities by querying system information keys. You can also check for supported features.

      + +

      The main features of the System Information API include:

      + -

      Before you start, remember to prepare your application to use the system information functionality.

      -
      Table: Device-specific information categories @@ -72,56 +77,84 @@
      -

      To obtain the information, query a system info key. The keys are listed in the following tables.

      - +

      To obtain the information, query a feature or system key.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table: System information keys
      Feature keys
      BatteryGraphicsMultimediaSip
      CameraHuman activity monitorMulti-point touchSpeech
      Consumer IRInputNetworkSystem setting
      Convergence D2DIOTOpenGL® ESUSB
      DatabaseLEDPlatformVision
      DatasyncLocationProfileWeb
      DownloadMapsScreen
      FIDOMediaSensor
      FM radioMicrophoneShell
      System keys
      BuildManufacturerPlatformTizenID
      DUIDModel nameSound
      @@ -134,6 +167,64 @@
      + +

      Prerequisites

      +

      To use the functions and data types of the System Information API (in mobile and wearable applications), include the <system_info.h> header file in your application:

      +
      +#include <system_info.h>
      +
      + +

      Getting the Device Model Name

      + +

      Device-specific information consists of "key, value" pairs. To get the device model name, use the http://tizen.org/system/model_name key with the data type-specific get function.

      +

      The model name key data type is string, which means that you need to use the system_info_get_platform_string() function.

      +

      When no longer needed, release the value of the key with the free() function.

      + +
      +void
      +func(void)
      +{
      +    char *value;
      +    int ret;
      +
      +    ret = system_info_get_platform_string("http://tizen.org/system/model_name", &value);
      +    if (ret != SYSTEM_INFO_ERROR_NONE) {
      +        /* Error handling */
      +
      +        return;
      +    }
      +
      +    dlog_print(DLOG_INFO, LOG_TAG, "Model name: %s", value);
      +
      +    free(value); /* Release after use */
      +}
      +
      + +

      Checking for Supported Features

      + +

      To determine, for example, whether the device has a camera, use the http://tizen.org/feature/camera key with the data type-specific get function.

      +

      The camera key data type is bool, which means that you need to use the system_info_get_platform_bool() function.

      + +
      +#include <stdbool.h>
      +
      +void
      +func(void)
      +{
      +    bool value;
      +    int ret;
      +
      +    ret = system_info_get_platform_bool("http://tizen.org/feature/camera", &value);
      +    if (ret != SYSTEM_INFO_ERROR_NONE) {
      +        /* Error handling */
      +
      +        return;
      +    }
      +
      +    dlog_print(DLOG_INFO, LOG_TAG, "Camera: %s", value ? "Supported" : "Not supported");
      +}
      +
      +

      Feature Keys

      The following table lists the battery feature keys.

      @@ -1730,73 +1821,6 @@ the Tizen reference implementation. -

      Warm-up

      -

      Become familiar with the System Information API basics by learning about:

      - - -

      Prerequisites

      -

      To use the functions and data types of the System Information API (in mobile and wearable applications), include the <system_info.h> header file in your application:

      -
      -#include <system_info.h>
      -
      - -

      Getting the Device Model Name

      - -

      Device-specific information consists of "key, value" pairs. To get the device model name, use the http://tizen.org/system/model_name key with the data type-specific get function.

      -

      The model name key data type is string, which means that you need to use the system_info_get_platform_string() function.

      -

      When no longer needed, release the value of the key with the free() function.

      - -
      -void
      -func(void)
      -{
      -    char *value;
      -    int ret;
      -
      -    ret = system_info_get_platform_string("http://tizen.org/system/model_name", &value);
      -    if (ret != SYSTEM_INFO_ERROR_NONE) {
      -        /* Error handling */
      -
      -        return;
      -    }
      -
      -    dlog_print(DLOG_INFO, LOG_TAG, "Model name: %s", value);
      -
      -    free(value); /* Release after use */
      -}
      -
      - -

      Checking for Supported Features

      - -

      To determine, for example, whether the device has a camera, use the http://tizen.org/feature/camera key with the data type-specific get function.

      -

      The camera key data type is bool, which means that you need to use the system_info_get_platform_bool() function.

      - -
      -#include <stdbool.h>
      -
      -void
      -func(void)
      -{
      -    bool value;
      -    int ret;
      -
      -    ret = system_info_get_platform_bool("http://tizen.org/feature/camera", &value);
      -    if (ret != SYSTEM_INFO_ERROR_NONE) {
      -        /* Error handling */
      -
      -        return;
      -    }
      -
      -    dlog_print(DLOG_INFO, LOG_TAG, "Camera: %s", value ? "Supported" : "Not supported");
      -}
      -
      diff --git a/org.tizen.guides/html/native/error/system_logs_n.htm b/org.tizen.guides/html/native/error/system_logs_n.htm index 6347fe0..46fe0ad 100644 --- a/org.tizen.guides/html/native/error/system_logs_n.htm +++ b/org.tizen.guides/html/native/error/system_logs_n.htm @@ -49,7 +49,7 @@

      To generate and view system logs in Tizen, you can use the dlog logging service. It consists of the dlogutil dlog library, which sends log messages to a log device. The log device is a circular buffer used to collect log messages from various applications and the system.

      -

      Before you start, remember to prepare your application to use the dlog functionality, and familiarize yourself with the priorities and tags you can use.

      +

      Before you start, familiarize yourself with the priorities and tags you can use.

      The main features of the dlog API include:

      @@ -295,17 +295,6 @@ dlogutil <option> <filter-spec>
    -

    Warm-up

    -

    Become familiar with the dlog API basics by learning about:

    - -

    Prerequisites

    To enable your application to use the dlog functionality:

    diff --git a/org.tizen.guides/html/native/graphics/cairo_n.htm b/org.tizen.guides/html/native/graphics/cairo_n.htm index 302d652..9fffb35 100644 --- a/org.tizen.guides/html/native/graphics/cairo_n.htm +++ b/org.tizen.guides/html/native/graphics/cairo_n.htm @@ -28,12 +28,9 @@

    Content

    • Cairo in Tizen
    • +
    • Prerequisites
    • Creating a Cairo Surface Linked with an Evas Object
    • Drawing with Cairo
    • -
    • Prerequisites
    • -
    • Creating Cairo with the Image Backend
    • -
    • Creating Cairo with the GL Backend
    • -
    • Drawing Lines
    • Painting with Image Files
    • Showing Text
    • Deleting Cairo
    • @@ -57,13 +54,21 @@

      Cairo Vector Graphics

      -

      Cairo is a famous 2D graphics library with support for multiple output devices. It provides powerful drawing operations to create a graphical experience that you desire, including stroking, filling, compositing images, and any affine transforms (such as scale, rotation, and shear). You can also render text with Cairo. Within the Tizen framework, Cairo is able to output to 2 different backends: Image and GL backend.

      +

      Cairo is a famous 2D graphics library with support for multiple output devices. It provides powerful drawing operations to create a graphical experience that you desire, including stroking, filling, compositing images, and any affine transforms (such as scale, rotation, and shear). You can also render text with Cairo. Within the Tizen framework, Cairo is able to output to 2 different backends: Image and GL backend.

      + +

      The main features of the Cairo API include:

      + -

      Before you start, remember to prepare your application to use the Cairo functionality.

      Cairo in Tizen

      -

      Cairo belongs to the Graphics layer in Tizen. As shown in the following figure, the rendering functionality of Cairo is provided through the use of the APIs of the lower modules, such as Pixman or OpenGL ES.

      +

      Cairo is a part of the Tizen Graphics layer. As shown in the following figure, the rendering functionality of Cairo is provided through the use of the APIs of the lower modules, such as Pixman or OpenGL ES.

      Figure: Cairo within the Tizen framework

      Cairo within the Tizen framework

      @@ -79,7 +84,28 @@ Since Tizen only exposes EvasGL binding in place of EGL, Cairo EvasGL APIs have been newly added and specified. To use the Cairo GL backend in Tizen, an application must include in its source code the cairo-evas-gl.h header file instead of cairo-gl.h. - + + +

      Prerequisites

      +

      To enable your application to use the Cairo functionality:

      +
        +
      1. Before using the Cairo library in Tizen: + +
      2. +
      3. To use the functions and data types of the Cairo image and GL backends, include the <cairo.h> header file in your application. For the Cairo GL backend, you also need the <cairo-evas-gl.h>, and <Evas_GL.h> header files. +
        +#include <cairo.h>
        +
        +/* For the Cairo GL backend */
        +#include <cairo-evas-gl.h>
        +#include <Evas_GL.h>
        +
        +
      4. +

      Creating a Cairo Surface Linked with an Evas Object

      @@ -87,9 +113,9 @@

      Creating a Cairo Image Surface in the Evas GL Backend

      -

      To develop an application with Elementary, you create a window by using the elementary utility function, elm_win_util_standard_add(). And, in order to make the GL application use the GPU, you must call the elm_config_accel_preference_set() function before creating the window.

      +

      To develop an application with Elementary, you create a window by using the elementary utility function, elm_win_util_standard_add(). And, in order to make the GL application use the GPU, you must call the elm_config_accel_preference_set() function before creating the window. You also place an Evas_Object image into your application's main window. For more information about creating and placing an Evas_Object image, see Manipulating Graphical Objects.

      -

      In the Cairo Image backend, you can create a new Cairo image surface by using the cairo_image_surface_create() or cairo_image_surface_create_for_data() function. The former function requires only the pixel format and dimensions to be specified, while the latter function requires additional data, such as a pointer to an image buffer (supplied by the application) in which to write the content. In order to display a result of Cairo rendering, you must also link an Evas image object to the created Cairo image surface. For this purpose, use the evas_object_image_data_set() function.

      +

      In the Cairo Image backend, you can create a new Cairo image surface by using the cairo_image_surface_create() or cairo_image_surface_create_for_data() function. The former function requires only the pixel format and dimensions to be specified, while the latter function requires additional data, such as a pointer to an image buffer (supplied by the application) in which to write the content. In order to display a result of Cairo rendering, you must also link an Evas image object to the created Cairo image surface. For this purpose, use the evas_object_image_data_set() function.

      To create the image surface:

      @@ -166,10 +192,10 @@ evas_object_image_data_update_add(img, 0, 0, WIDTH, HEIGHT); - +

      Creating a Cairo GL Surface in the Evas GL Backend

      -

      With the Cairo GL backend, you can create a Cairo surface using OpenGL.

      +

      With the Cairo GL backend, you can create a Cairo surface using OpenGL. For more information on OpenGL, see the OpenGL ES guide.

      To create the GL surface:

      @@ -268,7 +294,7 @@ cairo_pattern_create_for_surface(gl_surface);

      Support for Reading Various Image Files

      -

      Cairo does not support a functionality for reading image files in JPEG or SPI format; only PNG is supported. With a PNG file, you can use the cairo_image_surface_create_from_png() function to make a new image surface from the image. However, handle this function with care, because it is experimental and only offers very simple functionality for reading PNG files.

      +

      Cairo does not support a functionality for reading image files in JPEG or SPI format; only PNG is supported. With a PNG file, you can use the cairo_image_surface_create_from_png() function to make a new image surface from the image. However, handle this function with care, because it is experimental and only offers very simple functionality for reading PNG files.

       cairo_surface_t *image = cairo_image_surface_create_from_png("test_image.png");
      @@ -298,7 +324,7 @@ evas_object_image_filled_set(decoded_img, EINA_TRUE);
       evas_object_resize(decoded_img, w, h);
       
      -

      After the image file reading is complete, you can create a Cairo surface for the image object by using the evas_object_image_data_get() and cairo_image_surface_create_for_data() functions. The Cairo surface is used to create a pattern with the cairo_set_source_surface() function for the Cairo drawing. In addition, to prevent memory leaks, delete the temporary buffers that are no longer used.

      +

      After the image file reading is complete, you can create a Cairo surface for the image object by using the evas_object_image_data_get() and cairo_image_surface_create_for_data() functions. The Cairo surface is used to create a pattern with the cairo_set_source_surface() function for the Cairo drawing. In addition, to prevent memory leaks, delete the temporary buffers that are no longer used.

       src_buffer = (unsigned char *)evas_object_image_data_get(decoded_img, EINA_TRUE);
      @@ -313,7 +339,9 @@ cairo_surface_destroy(img);
       
       

      Drawing a Line

      -

      The following example creates a line drawing with a rectangle, and a path that uses straight sections, arcs, and Bézier curves.

      +

      When drawing an image with Cairo, you must prepare the context (nouns) for each of the drawing verbs. For example, if you want to use the cairo_stroke() or cairo_fill() function, create a path first. Similarly, in case of using the cairo_show_text() function, you must position your text by its insertion point. A primary source is needed for using the cairo_paint() function and a second source pattern or surface is prepared for using the cairo_mask() function. For more information, see the Cairo Tutorial in cairographics.org.

      + +

      The following example creates a line drawing with a rectangle, and a path that uses straight sections, arcs, and Bézier curves.

      Figure: Rectangle and path drawing with Cairo

      Rectangle and path drawing with Cairo

      @@ -321,12 +349,25 @@ cairo_surface_destroy(img);

      To draw lines with Cairo APIs:

        -
      1. Set the line width and color. -

        In this example, the line width is 2 and the color is opaque red:

        +
      2. Prepare the sources. +

        Prior to drawing a line, prepare and select sources. There are 3 main sources in Cairo - colors, gradients, and images:

        +
          +
        • Colors use a uniform hue and opacity for the entire source. You can select these without any preparation with the cairo_set_source_rgb() function and cairo_set_source_rgba() functions. +

          In this example, the color is opaque red:

          +
          +cairo_set_source_rgba(cairo, 1.0, 0.0, 0.0, 1.0);
          +
          +
        • +
        • Gradients describe a progression of colors by setting a start and stop reference location and a series of "stops" along the way. There are linear and radial gradients built from 2 points. Stops are added to the gradient with the cairo_add_color_stop_rgb() and cairo_add_color_stop_rgba() functions which take a color like the cairo_add_color_stop_rgb() or cairo_add_color_stop_rgba() function, as well as an offset to indicate where it lies between the reference locations.
        • +
        • Images include both surfaces loaded from the existing files with the cairo_image_surface_create_from_png() function and surfaces created from within Cairo as an earlier destination. For more information about these Cairo APIs, see the cairo_pattern_t in cairographics.org.
        • +
        +
      3. + +
      4. Set the line width. +

        In this example, the line width is 2:

         cairo_set_line_width(cairo, 2);
        -cairo_set_source_rgba(cairo, 1.0, 0.0, 0.0, 1.0);
         
      5. @@ -337,6 +378,11 @@ cairo_set_source_rgba(cairo, 1.0, 0.0, 0.0, 1.0);
         cairo_translate(cairo, 40, 40);
         
        + +

        Cairo uses a connect-the-dots style system for creating paths. You can also set the starting point of the line with the cairo_move_to() function. This sets the current reference point without making the path connect the previous point to it.

        +
        +cairo_move_to(cairo, 40, 40);
        +
      6. To draw a line from point (100,100) to point (200,150) on a surface, use the cairo_move_to() and cairo_line_to() functions: @@ -355,6 +401,9 @@ cairo_rel_line_to(cairo, 100, -50);
      7. To draw a circular arc of a given radius on the current path, use the cairo_arc() function. + +

        Arcs are parts of the outside of a circle. The point you directly specify is the center of the circle that makes up the addition to the path. Both a starting and an ending point on the circle must be specified, and these points are connected either clockwise using the cairo_arc() or counter-clockwise using the cairo_arc_negative() function.

        +

        In this example, the radius is (100 * sqrt(2)), the arc is centered at (200, 200), begins at an angle (-0.25 * M_PI) and proceeds in the direction of increasing angles to end at an angle (0.25 * M_PI). If the end angle is less than the begin angle, the end angle is progressively increased by 2*M_PI until it is greater than the begin angle.

        @@ -362,7 +411,10 @@ cairo_arc(cairo, 200, 200, 100 * sqrt(2), -0.25 * M_PI, 0.25 * M_PI);
         
      8. -
      9. To draw a cubic Bézier spline, use the cairo_rel_curve_to() function. +
      10. To draw a curve, use the cairo_rel_curve_to() function. + +

        Curves in Cairo are cubic Bézier splines. They start at the current reference point and smoothly follow the direction of 2 other points (without going through them) to get to a third specified point. Like lines, there are both absolute (cairo_curve_to()) and relative (cairo_rel_curve_to()) functions. Note that the relative variant specifies all points relative to the previous reference point, rather than each relative to the preceding control point of the curve.

        +

        In this example, the offsets of (-100, -50) and (-100, 50) are used as the control points. After this function call, the current point is offset by (-200, 0).

        @@ -410,164 +462,6 @@ cairo_surface_destroy(surface);
         
      -

      Warm-up

      -

      Become familiar with the Cairo API basics by learning about:

      - - -

      Prerequisites

      -

      To enable your application to use the Cairo functionality:

      -
        -
      1. Before using the Cairo library in Tizen: - -
      2. -
      3. To use the functions and data types of the Cairo image and GL backends, include the <cairo.h> header file in your application. For the Cairo GL backend, you also need the <cairo-evas-gl.h>, and <Evas_GL.h> header files. -
        -#include <cairo.h>
        -
        -/* For the Cairo GL backend */
        -#include <cairo-evas-gl.h>
        -#include <Evas_GL.h>
        -
        -
      4. -
      - -

      Creating Cairo with the Image Backend

      - -

      To create a Cairo context and surface with the image backend:

      -
        -
      1. Create the window and the Evas_Object image. -

        Place an Evas_Object image into your application's main window. For more information about creating and placing an Evas_Object image, see Manipulating Graphical Objects.

        -
        -Evas_Object *img = evas_object_image_filled_add(evas_object_evas_get(win));
        -elm_win_resize_object_add(win, img);
        -evas_object_image_content_hint_set(img, EVAS_IMAGE_CONTENT_HINT_DYNAMIC);
        -evas_object_image_size_set(img, WIDTH, HEIGHT);
        -evas_object_resize(img, WIDTH, HEIGHT);
        -evas_object_show(img);
        -
        -
      2. -
      3. Create the Cairo context and surface. -

        To use the Cairo API, create the Cairo context and surface using the Evas_Object image. The Evas_Object image is used in the example code as a rendering destination.

        -
        -int row_stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, WIDTH);
        -unsigned char *imageData = (unsigned char*)evas_object_image_data_get(img, EINA_TRUE);
        -cairo_surface = cairo_image_surface_create_for_data(imageData, CAIRO_FORMAT_ARGB32, WIDTH, HEIGHT, row_stride);
        -cairo = cairo_create(cairo_surface);
        -
        -
      4. -
      - -

      Creating Cairo with the GL Backend

      - -

      For the Cairo GL backend in Tizen, you must know OpenGL. For more information, see the OpenGL ES guide.

      -

      To create a Cairo context, surface, and device with the GL backend:

      -
        -
      1. Create the window, Evas_Object image, and Evas GL. -

        Place an Evas_Object image in the application's main window, and create and initialize Evas GL. Call the evas_object_image_pixels_get_callback_set() function to initialize the Evas GL handle. The cairo_drawing() function must be set as the input parameter. For more information about creating and initializing Evas GL, see Creating the Elm Window and EvasGL.

        -
        -Evas_Object *img = evas_object_image_filled_add(evas_object_evas_get(win));
        -
        -Evas_Native_Surface ns;
        -Evas_GL *evas_gl = evas_gl_new(evas_object_evas_get(img));
        -Evas_GL_Config *evas_gl_config = evas_gl_config_new();
        -evas_gl_config->color_format = EVAS_GL_RGBA_8888;
        -
        -evas_gl_surface = evas_gl_surface_create(evas_gl, evas_gl_config, WIDTH, HEIGHT);
        -evas_gl_context = evas_gl_context_create(evas_gl, NULL);
        -evas_gl_native_surface_get(evas_gl, evas_gl_surface, &ns);
        -evas_object_image_native_surface_set(img, &ns);
        -evas_object_image_pixels_get_callback_set(img, cairo_drawing, 0);
        -
        -
      2. -
      3. Create the Cairo context, surface, and device. -

        Use the Evas_Object image and Evas GL context to create the Cairo context and surface. Cairo can be used in a multi-threaded environment. By default, Cairo switches out the current GL context after each draw finishes. If no other thread uses Cairo for rendering, Cairo can use the non-thread-aware mode with the cairo_gl_device_set_thread_aware() function's second parameter set to 0.

        -
        -setenv("CAIRO_GL_COMPOSITOR", "msaa", 1);
        -cairo_device = (cairo_device_t*)cairo_evas_gl_device_create(evas_gl, evas_gl_context);
        -cairo_gl_device_set_thread_aware(cairo_device, 0);
        -cairo_surface = (cairo_surface_t*)cairo_gl_surface_create_for_evas_gl(cairo_device, evas_gl_surface, evas_gl_config, WIDTH, HEIGHT);
        -cairo = cairo_create(cairo_surface);
        -
        -
      4. -
      - -

      Drawing Lines

      - -

      When drawing an image with Cairo, you must prepare the context (nouns) for each of the drawing verbs. For example, if you want to use the cairo_stroke() or cairo_fill() function, create a path first. Similarly, in case of using the cairo_show_text() function, you must position your text by its insertion point. A primary source is needed for using the cairo_paint() function and a second source pattern or surface is prepared for using the cairo_mask() function. For more information, see the Cairo Tutorial in cairographics.org.

      -

      The following figure shows an example of lines drawn using Cairo.

      -

      Figure: Lines drawn using Cairo

      -

      Lines drawn using Cairo

      - -

      To draw lines:

      -
        -
      1. Prepare the sources. -

        Prior to drawing a line, prepare and select sources. There are 3 main sources in Cairo - colors, gradients, and images:

        -
          -
        • Colors use a uniform hue and opacity for the entire source. You can select these without any preparation with the cairo_set_source_rgb() function and cairo_set_source_rgba() functions. -
          -cairo_set_source_rgba(cairo, 1.0, 0.0, 0.0, 1.0);
          -
          -
        • -
        • Gradients describe a progression of colors by setting a start and stop reference location and a series of "stops" along the way. There are linear and radial gradients built from 2 points. Stops are added to the gradient with the cairo_add_color_stop_rgb() and cairo_add_color_stop_rgba() functions which take a color like the cairo_add_color_stop_rgb() or cairo_add_color_stop_rgba() function, as well as an offset to indicate where it lies between the reference locations.
        • -
        • Images include both surfaces loaded from the existing files with the cairo_image_surface_create_from_png() function and surfaces created from within Cairo as an earlier destination. For more information about these Cairo APIs, see the cairo_pattern_t in cairographics.org.
        • -
        -
      2. -
      3. Set the starting point. -

        Cairo uses a connect-the-dots style system for creating paths. To draw a line from a starting point to an ending point, set the starting point of the line with the cairo_move_to() function. This sets the current reference point without making the path connect the previous point to it.

        -
        -cairo_move_to(cairo, 100, 100);
        -
        -
      4. -
      5. Draw the shapes. -
          -
        • Draw a straight line. -

          After setting a starting point as (100, 100), you can draw a straight line to an ending point using the cairo_line_to() or cairo_rel_line_to() function. With these functions, the ending point is set as absolute coordinates and relative coordinates respectively, Here, (200, 150) is the absolute coordinates and (100, -50) is the relative coordinates.

          -
          -cairo_line_to(cairo, 200, 150);
          -cairo_rel_line_to(cairo, 100, -50);
          -
          -
        • -
        • Draw an arc. -

          Arcs are parts of the outside of a circle. The point you directly specify is the center of the circle that makes up the addition to the path. Both a starting and an ending point on the circle must be specified, and these points are connected either clockwise using the cairo_arc() or counter-clockwise using the cairo_arc_negative() function.

          -
          -cairo_arc(cairo, 200, 200, 100 * sqrt(2), -0.25 * M_PI, 0.25 * M_PI);
          -
          -
        • -
        • Draw a curve. -

          Curves in Cairo are cubic Bézier splines. They start at the current reference point and smoothly follow the direction of 2 other points (without going through them) to get to a third specified point. Like lines, there are both absolute (cairo_curve_to()) and relative (cairo_rel_curve_to()) functions. Note that the relative variant specifies all points relative to the previous reference point, rather than each relative to the preceding control point of the curve.

          -
          -cairo_rel_curve_to(cairo, -100, -50, -100, 50, -200, 0);
          -
          -
        • -
        • Close the path. -

          Cairo can also close the path by drawing a straight line to the beginning of the current sub-path. This straight line can be useful for the last edge of a polygon.

          -
          -cairo_close_path(cairo);
          -
          -
        • -
        -
      6. -
      -

      Painting with Image Files

      With images, Cairo supports the functionality only for the PNG format. These functions for PNG are experimental, so use them with care. For more information about PNG support, see PNG Support in cairographics.org.

      diff --git a/org.tizen.guides/html/native/graphics/graphic_buffer_n.htm b/org.tizen.guides/html/native/graphics/graphic_buffer_n.htm index 359d4f6..7e39b11 100644 --- a/org.tizen.guides/html/native/graphics/graphic_buffer_n.htm +++ b/org.tizen.guides/html/native/graphics/graphic_buffer_n.htm @@ -45,7 +45,6 @@

      The Tizen Buffer Manager (TBM) surface allows you to manage the graphic buffer in Tizen. The TBM provides an abstraction interface for the graphic buffer and a user interface for the TBM surface. It supports the RGB and YUV graphic formats, as well as multiple plane graphic buffers.

      -

      Before you start, remember to prepare your application to use the TBM surface functionality.

      The TBM surface provides the following main features:

      To store data in the low-level graphic buffer, get a plane pointer in the surface and use the pointer of each plane.

      -

      Warm-up

      -

      Become familiar with the TBM Surface API basics by learning about:

      -

      Prerequisites

      diff --git a/org.tizen.guides/html/native/graphics/opengl_n.htm b/org.tizen.guides/html/native/graphics/opengl_n.htm index 98d3816..3683553 100644 --- a/org.tizen.guides/html/native/graphics/opengl_n.htm +++ b/org.tizen.guides/html/native/graphics/opengl_n.htm @@ -60,8 +60,28 @@

      Tizen native applications can use OpenGL ES not only for creating a 3D scene but also for a 2D scene that requires fast interaction. OpenGL ES is also good for improving performance and reducing power consumption when the native application performs computation-intensive tasks that can be run in parallel.

      Tizen 2.x almost completely supports OpenGL ES 2.0. OpenGL ES 3.0 features are supported from Tizen 2.4 onwards.

      EGL is another specification for binding OpenGL ES to the native windowing systems. To set up the EGL environment, you normally need to understand the native windowing system and EGL specification in detail. In Tizen, however, its native UI components and 2D canvas (Elementary and Evas, respectively) replace the role of EGL to provide a simple way to use OpenGL ES. To maintain the best device performance, the Tizen Studio makes the native windowing system and EGL APIs invisible.

      - -

      The OpenGL ES details are covered in the following topics:

      +

      The main features of the OpenGL ES API include:

      + +

      Additional OpenGL ES details are covered in the following topics:

      • To set up a native application, which makes a simple 3D cube scene, see Creating OpenGL ES Applications.
      • To draw a 3D scene step by step through GPU pipeline stages, see: @@ -83,35 +103,6 @@
      -

      Warm-up

      -

      Become familiar with the OpenGL ES API basics by learning about:

      - -

      Prerequisites

      The EvasGL use cases assume that the application uses EvasGL directly instead of using the GLView. (If the application uses a GLView, EvasGL is created internally.)

      diff --git a/org.tizen.guides/html/native/internationalization/i18n_n.htm b/org.tizen.guides/html/native/internationalization/i18n_n.htm index 04a2d8c..277f5a5 100644 --- a/org.tizen.guides/html/native/internationalization/i18n_n.htm +++ b/org.tizen.guides/html/native/internationalization/i18n_n.htm @@ -29,19 +29,19 @@

    Content

      -
    • Ubrk
    • -
    • Ucalendar
    • -
    • Uchar
    • -
    • Ucollator
    • -
    • Udate
    • -
    • Udatepg
    • -
    • Uenumeration
    • -
    • Ulocale
    • -
    • Unormalization
    • -
    • Unumber
    • -
    • Usearch
    • -
    • Uset
    • -
    • Ustring
    • +
    • Location Boundaries with Ubrk
    • +
    • Calendar Dates with Ucalendar
    • +
    • Unicode Character Database Access with Uchar
    • +
    • String Comparison with Ucollator
    • +
    • Date Formats with Udate
    • +
    • Date Format Patterns with Udatepg
    • +
    • Enumeration Management with Uenumeration
    • +
    • Locale-sensitive Operations with Ulocale
    • +
    • Unicode Normalization with Unormalization
    • +
    • Number Formats with Unumber
    • +
    • Text Search with Usearch
    • +
    • Character and String Management with Uset
    • +
    • Unicode Strings with Ustring
    • Prerequisites
    • Managing Characters and Strings
    • Managing Dates and Calendar
    • @@ -64,11 +64,27 @@

      i18n

      -

      You can generate flexible number or date format patterns, format and parse dates and numbers for any locale, and manage time zones. The i18n API is implemented by using the ICU library.

      - -

      Before you start, remember to prepare your application to use the i18n functionality.

      +

      You can generate flexible number or date format patterns, format and parse dates and numbers for any locale, and manage time zones. The i18n API is implemented by using the ICU library.

      +

      The main features of the i18n API include:

      + -

      Ubrk

      +

      Location Boundaries with Ubrk

      The Ubrk API (in mobile and wearable applications) is used to find the location of boundaries in text. The i18n_ubreak_iterator_h handle maintains a current position and scans over the text returning the index of characters where the boundaries occur.

      The following boundary analyzing methods are available:

        @@ -81,7 +97,7 @@
      -

      Ucalendar

      +

      Calendar Dates with Ucalendar

      The Ucalendar API (in mobile and wearable applications) is used for converting between a Udate object and a set of integer fields, such as I18N_UCALENDAR_YEAR, I18N_UCALENDAR_MONTH, I18N_UCALENDAR_DAY, and I18N_UCALENDAR_HOUR. A Udate object represents a specific instant in time with one millisecond precision.

      The types of Ucalendar interpret a Udate according to the rules of a specific calendar system, such as the gregorian or traditional system.

      @@ -138,8 +154,8 @@ -

      Uchar

      -

      The Uchar API (in mobile and wearable applications) provides a low-level access to the Unicode Character Database.

      +

      Unicode Character Database Access with Uchar

      +

      The Uchar API (in mobile and wearable applications) provides low-level access to the Unicode Character Database.

      Unicode assigns each code point (not just the assigned character) values for several properties. Most of them are simple boolean flags, or constants from a small enumerated list. For some properties, values are strings or other relatively more complex types.

      For more information, see About the Unicode Character Database and ICU User Guide chapter on Properties.

      @@ -238,10 +254,10 @@ -

      Ucollator

      +

      String Comparison with Ucollator

      The Ucollator API (in mobile and wearable applications) performs locale-sensitive string comparison. It builds searching and sorting routines for natural language text and provides correct sorting orders for most supported locales. If specific data for a locale is not available, the order eventually falls back to the CLDR root sort order. The sorting order can be customized by providing your own set of rules. For more information, see the ICU Collation Customization section of the User Guide.

      -

      Udate

      +

      Date Formats with Udate

      The Udate API (in mobile and wearable applications) consists of functions that convert dates and times from their internal representations to textual form and back again in a language-independent manner. Converting from the internal representation (milliseconds since midnight, January 1, 1970) to text is known as formatting, and converting from text to milliseconds is known as parsing. Tizen currently defines only one concrete handle (i18n_udate_format_h), which can handle practically all normal date formatting and parsing actions.

      The Udate format helps you to format and parse dates for any locale. Your code can be completely independent of the locale conventions for months, days of the week, or even the lunar or solar calendar format.

      You can pass in different options for the arguments for date and time style to control the length of the result; you can select from SHORT, MEDIUM, LONG, and FULL. The exact result depends on the locale.

      @@ -265,20 +281,20 @@

      Date and Time Patterns

      The date and time formats are specified by the date and time pattern strings. Within the date and time pattern strings, all unquoted ASCII letters (A-Z and a-z) are reserved as pattern letters representing calendar fields. The i18n_udate_format_h handle supports the date and time formatting algorithm and pattern letters defined by the Unicode Technical Standard #35, Unicode Locale Data Markup Language (LDML). It is further documented in the ICU User Guide.

      -

      Udatepg

      +

      Date Format Patterns with Udatepg

      The Udatepg API (in mobile and wearable applications) enables flexible generation of date format patterns, such as "yy-MM-dd". The user can build up the generator by adding successive patterns. After this, a query can be made using a pattern that includes only the desired fields and lengths. The generator returns the a pattern that is most similar to it.

      The main method is the i18n_udatepg_get_best_pattern() function, since normally the Udatepg API is prebuilt with data from a particular locale. However, generators can be built directly from other data as well.

      -

      Uenumeration

      +

      Enumeration Management with Uenumeration

      The Uenumeration API (in mobile and wearable applications) enables you to create an enumeration object out of a given set of strings. The object can be created out of an array of const char* strings or an array of i18n_uchar* strings.

      The enumeration object enables navigation through the enumeration values, with the use of the i18n_uenumeration_next() or i18n_uenumeration_unext() function (depending on the type used for creating the enumeration object), and with the i18n_uenumeration_reset() function.

      You can get the number of values stored in the enumeration object with the i18n_uenumeration_count() function.

      -

      Ulocale

      +

      Locale-sensitive Operations with Ulocale

      The Ulocale API (in mobile and wearable applications) represents a specific geographical, political, or cultural region. Locale-sensitive operations use the Ulocale functions to tailor information for the user. For example, displaying a number is a locale-sensitive operation. The number must be formatted according to the customs and conventions of the user's native country, region, or culture.

      You create a locale with one of the options listed below. Each component is separated by an underscore in the locale string:

      @@ -310,18 +326,18 @@

      Once you have specified a locale you can query it for information about itself. Use i18n_ulocale_get_language() to get the ISO Language Code. You can use i18n_ulocale_get_display_name() to get the name of the language suitable for display to the user.

      -

      Unormalization

      +

      Unicode Normalization with Unormalization

      The Unicode normalization API (in mobile and wearable applications) is for the standard unicode normalization. All instances of i18n_unormalizer_s are unmodifiable and immutable. Instances returned by i18n_unormalization_get_instance() are singletons that must not be deleted by the caller.

      -

      Unumber

      +

      Number Formats with Unumber

      The Unumber API (in mobile and wearable applications) helps you to format and parse numbers for any locale. Your code can be completely independent of the locale conventions for decimal points, thousands-separators, or even the particular decimal digits used, or whether the number format is even decimal. There are different number format styles like decimal, currency, percent and spellout.

      -

      Usearch

      +

      Text Search with Usearch

      The Usearch API (in mobile and wearable applications) provides language-sensitive text searching based on the comparison rules defined in a Ucollator data struct. This ensures that language eccentricity can be handled. For example, for the German collator, characters ß and SS are matched if case is chosen to be ignored. That is why it can be important to pass a locale when creating the usearch with the i18n_usearch_create_new() function.

      -

      Uset

      +

      Character and String Management with Uset

      Uset is a mutable set of Unicode characters and multicharacter strings that you can manage. The sets represent character classes used in regular expressions. A character specifies a subset of the Unicode code points. The legal code points are U+0000 to U+10FFFF, inclusive.

      The set supports 2 functions:

      • The operand function allows the caller to modify the value of the set. The operand function works similarly to the boolean logic: a boolean OR is implemented by add, a boolean AND is implemented by retain, a boolean XOR is implemented by a complement taking an argument, and a boolean NOT is implemented by a complement with no argument. In terms of traditional set theory function names, add is a union, retain is an intersection, remove is an asymmetric difference, and complement with no argument is a set complement with respect to the superset range MIN_VALUE-MAX_VALUE.
      • @@ -496,7 +512,7 @@ -

        Ustring

        +

        Unicode Strings with Ustring

        The Ustring API (in mobile and wearable applications) allows you to handle general unicode strings. Some functions are similar in name, signature, and behavior to the ANSI C <string.h> functions, and other functions provide more Unicode-specific functionality.

        The i18n uses 16-bit Unicode (UTF-16) in the form of arrays of i18n_uchar code units. UTF-16 encodes each Unicode code point with either 1 or 2 i18n_uchar code units. This is the default form of Unicode, and a forward-compatible extension of the original, fixed-width form that was known as UCS-2. UTF-16 superseded UCS-2 with Unicode 2.0 in 1996.

        The i18n also handles 16-bit Unicode text with unpaired surrogates. Such text is not well-formed UTF-16. Code-point-related functions treat unpaired surrogates as surrogate code points, such as separate units.

        @@ -511,31 +527,7 @@

        For more information about character sets, codepages and encodings, see Coded Character Sets on the IBM site.

        -

        Warm-up

        - -

        Become familiar with the i18n API basics by learning about:

        - - -

        Prerequisites

        +

        Prerequisites

        To use the functions and data types of the i18n API (in mobile and wearable applications) and its submodules, include the <utils_i18n.h> header file in your application:

        diff --git a/org.tizen.guides/html/native/internationalization/phonenumber_n.htm b/org.tizen.guides/html/native/internationalization/phonenumber_n.htm
        index 46814ca..8b9614b 100644
        --- a/org.tizen.guides/html/native/internationalization/phonenumber_n.htm
        +++ b/org.tizen.guides/html/native/internationalization/phonenumber_n.htm
        @@ -55,20 +55,6 @@
         
      • Normalizing the phone number

        You can normalize the phone number using the phone_number_get_normalized_number() function.

      -

      Before you start, remember to prepare your application to use the phonenumber utils functionality.

      - -

      Warm-up

      -

      Become familiar with the Phonenumber utils API basics by learning about:

      -

      Prerequisites

      diff --git a/org.tizen.guides/html/native/location_sensors/activity_n.htm b/org.tizen.guides/html/native/location_sensors/activity_n.htm index b41b4be..c1de63f 100644 --- a/org.tizen.guides/html/native/location_sensors/activity_n.htm +++ b/org.tizen.guides/html/native/location_sensors/activity_n.htm @@ -43,8 +43,7 @@

      Activity Recognition

      -

      The activity recognizer can detect walking and running activity. It also recognizes the stationary state and activities on a moving vehicle.

      -

      Before you start, remember to prepare your application to use the activity recognition functionality.

      +

      The activity recognizer can monitor user activities. You can detect walking and running activity. You can also recognize the stationary state and activities on a moving vehicle.

      @@ -56,15 +55,6 @@
      - -

      Warm-up

      -

      Become familiar with the Activity Recognition API basics by learning about:

      -

      Prerequisites

      To use the functions and data types of the Activity Recognition API (in mobile and wearable applications), include the <activity_recognition.h> header file in your application:

      diff --git a/org.tizen.guides/html/native/location_sensors/device_sensors_n.htm b/org.tizen.guides/html/native/location_sensors/device_sensors_n.htm index 54686e9..71f99a9 100644 --- a/org.tizen.guides/html/native/location_sensors/device_sensors_n.htm +++ b/org.tizen.guides/html/native/location_sensors/device_sensors_n.htm @@ -29,13 +29,35 @@

    Content

    Related Info

    + +

    Prerequisites

    + +

    To use the functions and data types of the Sensor API (in mobile and wearable applications), include the <sensor.h> header file in your application:

    +
    +#include <sensor.h>
    +
    + +

    Creating a Sensor Listener

    + + -

    Sensor Handle

    -

    A device can have various physical and virtual sensors. Tizen supports the following sensor types:

    - -

    The Sensor API enables your application to create a sensor listener and subscribe for sensor events from the device's internal sensors to monitor when sensor values change. The application can receive the sensor data only when the data is modified. You can also request the device to record sensor data and query for previously recorded data.

    - - - - - - - - - -
    Note
    All sensors may not be available on all devices. You can check whether a sensor is supported.
    -

    The Sensor API finds sensors, and monitors their availability. Key sensor features provided by the Sensor API include getting and setting the following:

    -
      -
    • Sensor name
    • -
    • Sensor vendor
    • -
    • Sensor type
    • -
    • Resolution
    • -
    • Sensing interval
    • -
    • Measurement range
    • -
    +

    If an application wants to observe data from a specific sensor, it must first check whether the sensor is supported. Then, you can create a sensor listener handle on the sensor:

    + +
      +
    1. To observe a specific sensor type, for example, accelerometer, check its availability: +
      +bool supported = false;
       
      -

      Before you start, remember to prepare your application to use the sensor functionality.

      - -

      Accelerometer

      +sensor_is_supported(SENSOR_ACCELEROMETER, &supported); +if (!supported) { +    /* Accelerometer is not supported in the current device */ +} +
      +
    2. +
    3. For a specific supported sensor type, a device can have multiple sensors. +

      You can acquire all sensors or just the default sensor (designated by the device vendor) of a given type. The following example shows how to get the default accelerometer of the device:

      +
      +sensor_h sensor;
      +sensor_get_default_sensor(SENSOR_ACCELEROMETER, &sensor);
      +
      +
    4. +
    5. After getting a sensor handle, you can create a listener handle upon the sensor handle: +
      +sensor_listener_h listener;
      +sensor_create_listener(sensor, &listener);
      +
      +
    6. +
    + +

    Subscribing for Sensor Events

    + +

    If a listener is created successfully, it is able to observe sensor data changes through the listener. In addition, you can set several parameters, including the update interval of the sensor data and the power-save behavior of the listener. The following example shows how to set the parameters and listen to changes of sensor data:

    + +
      +
    1. To listen to sensor events, define a callback function and register it to the listener: +
      +/* Define callback */
      +void
      +example_sensor_callback(sensor_h sensor, sensor_event_s *event, void *user_data)
      +{
      +    /* If a callback function is used to listen to different sensor types, it can check the sensor type */
      +    sensor_type_e type;
      +    sensor_get_type(sensor, &type);
      +
      +    if (type == SENSOR_ACCELEROMETER) {
      +        unsigned long long timestamp = event->timestamp;
      +        int accuracy = event->accuracy;
      +        float x = event->values[0];
      +        float y = event->values[1];
      +        float z = event->values[2];
      +    }
      +}
      +
      +/* Register callback */
      +sensor_listener_set_event_cb(listener, 100, example_sensor_callback, NULL);
      +
      +

      In the above example, the update interval for the sensor data is set to 100 ms.

      +
    2. + +
    3. To listen to sensor events, start the listener: +
      +sensor_listener_start(listener);
      +
      +

      The callback function starts to be called at least once per the given interval. You can start multiple listeners on the same sensor with different intervals. In this case, the shortest interval is chosen.

      +

      Some sensors are event-driven, meaning that they emit sensor events only if their data changes. For example, the proximity sensor emits its data only if the proximity value actually changes. For event-driven sensors, the update interval is ignored.

      +
    4. + +
    5. While the listener is running, you can change the listener settings: +
        +
      • You can change the listener update interval: +
        +sensor_listener_set_interval(listener, 200);
        +
        +

        The above example changes the update interval of a given listener to 200 ms.

        +
      • + +
      • You can change the power-save behavior of the listener. +

        By default, the listener automatically stops listening for the sensor data, if the display is switched off or the device goes to the power-save mode. You can override such behavior:

        +
        +sensor_listener_set_attribute_int(listener, SENSOR_ATTRIBUTE_PAUSE_POLICY, SENSOR_PAUSE_NONE);
        +
        +

        The above example makes the listener to listen for the sensor data regardless of the display state and the power-save mode. However, it does not prevent the device from going to the sleep mode. To listen for the sensor data, the device must be awake anyway.

        +
      • +
      +
    6. +
    7. When the sensor data is no more necessary, stop the listener: +
      +sensor_listener_stop(listener);
      +
      +
    8. +
    9. When a listener is no longer needed, release its resources explicitly: +
      +sensor_destroy_listener(listener);
      +
      +
    10. +
    + + +

    Requesting Sensor Data Recording

    + +

    Tizen supports long-term data recording for specific sensor types. For example, it can collect pedometer data for a month, by simply requesting the device to record pedometer data:

    + +
      +
    1. All sensor types cannot be recorded. Check whether a sensor is supported and allows recording in the current device, before actually making the record request. +
      +bool supported = false;
      +
      +sensor_recorder_is_supported(SENSOR_HUMAN_PEDOMETER, &supported);
      +if (!supported) {
      +    /* Pedometer is not supported or cannot be recorded in the current device */
      +}
      +
      +
    2. + +
    3. You can set various recording options based on your needs. +

      For example, in case of the pedometer, its retention period can be designated. The following example shows how to create an option handle to record pedometer data for a month:

      +
      +sensor_recorder_option_h option;
      +
      +sensor_recorder_create_option(&option);
      +sensor_recorder_option_set_int(option, SENSOR_RECORDER_OPTION_RETENTION_PERIOD, 30 * 24); /* 720 hours (30 days) */
      +
      +
    4. + +
    5. With the option handle, send the recording request for the pedometer data: +
      +sensor_recorder_start(SENSOR_HUMAN_PEDOMETER, option);
      +
      +

      Even if the application terminates or the device reboots, the system automatically continues to record pedometer data. As the retention period is set to 720 hours in the above example, the data older than 720 hours is erased automatically. If multiple applications set different retention periods, the longest one is chosen.

      +
    6. + +
    7. When you no longer need to record pedometer data, stop the recording: +
      +sensor_recorder_stop(SENSOR_HUMAN_PEDOMETER);
      +
      +

      However, remember that the recording is not actually stopped, if another application has requested for the same sensor to be recorded.

      +
    8. +
    + +

    Querying Recorded Sensor Data

    + +

    You can query the recorded sensor data with several query parameters. The query parameters differ between sensor types. In case of the pedometer, for example, you can get the daily step counts for the last 7 days by setting the necessary parameters:

    + +
      +
    1. Create a query. +

      In the following example, you get an aggregated data record per day (since SENSOR_RECORDER_QUERY_TIME_INTERVAL is set to 24 hours) and a day starts at 7 AM (not at midnight, since SENSOR_RECORDER_QUERY_ANCHOR_TIME is set to 7 AM).

      +
      +sensor_recorder_query_h query;
      +sensor_recorder_create_query(&query);
      +/* Start 7 days ago */
      +sensor_recorder_query_set_time(query, SENSOR_RECORDER_QUERY_START_TIME,
      +                               (time_t)(time(NULL) - (7 * 24 * 3600)));
      +/* End now */
      +sensor_recorder_query_set_time(query, SENSOR_RECORDER_QUERY_END_TIME, time(NULL));
      +/* Aggregate every 24 hours */ 
      +sensor_recorder_query_set_int(query, SENSOR_RECORDER_QUERY_TIME_INTERVAL, 24 * 60);
      +/* Start the aggregation at 7 AM */
      +sensor_recorder_query_set_time(query, SENSOR_RECORDER_QUERY_ANCHOR_TIME, (time_t)(7 * 3600));
      +
      +
    2. +
    3. With the query handle, retrieve the actual aggregated data: +
      +sensor_recorder_read(SENSOR_HUMAN_PEDOMETER, query, example_sensor_recorder_callback, NULL);
      +
      +

      The sensor_recorder_read() function is asynchronous. The synchronous variant is sensor_recorder_read_sync().

      +
    4. +
    5. Inside the example_sensor_recorder_callback() callback, each record attribute can be extracted: +
      +void
      +example_sensor_recorder_callback(sensor_type_e type, sensor_recorder_data_h data, int remains,
      +                                 sensor_error_e error, void *user_data)
      +{
      +    int step;
      +    double distance;
      +    time_t start;
      +    time_t end;
      +
      +    if (error != SENSOR_ERROR_NONE)
      +        return;
      +
      +    sensor_recorder_get_time(data, &start, &end);
      +    sensor_recorder_get_int(data, SENSOR_RECORDER_DATA_STEPS, &step);
      +    sensor_recorder_get_double(data, SENSOR_RECORDER_DATA_DISTANCE, &distance);
      +}
      +
      +
    6. +
    + + +

    Accelerometer

    The accelerometer measures changes in the velocity of a device. It is a combination of gravity and linear acceleration components. The accelerometer measures the device's accelerometer vector in 3 axes relative to its body frame.

    An acceleration shift of 1g always exists on the axis aligned to Earth's gravity. If the device is at rest, the sensor data reads 1g (the gravity offset) on one of the device axis and tells you which device axis is aligned to the direction of gravity. A falling device which has reached terminal velocity ideally shows the accelerometer value of 0 on all axis. The change in the effect of Earth's gravity is observed on the 3 device axes by rotating the device along any of the 3 axes.

    @@ -269,69 +511,71 @@ -

    Gravity Sensor

    -

    The gravity sensor is a virtual sensor derived from the 3-axis acceleration sensor. The 3-axis gravity components provide a measure of the effect of Earth's gravity observed on the device reference axes. The gravity components measured on a device vary based on the change in the device orientation, and hence they provide a measure of the rotation subjected to the device.

    -

    Figure: Gravity sensor vector and axes

    -

    Gravity sensor vector and axes

    -

    The gravity sensor outputs 4 values: 3 Cartesian axis values and a timestamp. The gravity sensor measures and returns axes values in "m/s2" (meters per second squared). When a device is rotated in the ±X, ±Y, or ±Z direction, the corresponding output increases (+) or decreases (-).

    +

    Geomagnetic Rotation Vector Sensor

    +

    The geomagnetic rotation vector sensor is the output of a software/hardware-based sensor fusion solution which uses the accelerometer and magnetic sensors to compute the orientation of the device. In this sensor, the computed orientation is free of any drift, but it is inaccurate compared to a sensor fusion solution using the gyroscope sensor. The geomagnetic rotation vector sensor represents the orientation of the device as a combination of an angle and an axis in which the device has rotated through a specific angle around an axis (x, y, or z).

    -

    The following table lists the measurement data that the gravity sensor provides.

    +

    The following table lists the measurement data that the geomagnetic rotation vector sensor provides.

    - + - + + + + + + + - - + + - - + + - - + + + + + + + +
    - Table: Measurement data detected by the gravity sensor + Table: Measurement data detected by the geomagnetic rotation vector sensor
    Measurement TypeRangeRange Unit
    Timestamp unsigned long long-- Microseconds
    Accuracysensor_data_accuracy_e-int
    values[0]: X floatMin. value = -9.8

    Max. value = 9.8

    m/s2Min. value = -1

    Max. value = 1

    -
    values[1]: Y floatMin. value = -9.8

    Max. value = 9.8

    m/s2Min. value = -1

    Max. value = 1

    -
    values[2]: Z floatMin. value = -9.8

    Max. value = 9.8

    m/s2Min. value = -1

    Max. value = 1

    -
    values[3]: WfloatMin. value = -1

    Max. value = 1

    -
    - -

    Linear Acceleration Sensor

    -

    The linear acceleration sensor is derived from the accelerometer by excluding the gravity value, and it measures the user-driven changes in the velocity. The linear acceleration sensor is used to detect the dynamic movement of the device and analyze the user's motion profile. The 3-axes linear acceleration components provide a measure of the combined linear motion subjected to the device in the euclidean space.

    -

    The linear acceleration sensor provides 3 components of acceleration (X, Y, and Z), as the following figure illustrates.

    -

    Figure: User-acceleration sensor vector and axes

    -

    User-acceleration sensor vector and axes

    -

    The linear acceleration sensor outputs 4 values: 3 Cartesian axis values and a timestamp. The linear acceleration sensor measures and returns axes values in "m/s2" (meters per second squared). When a device is accelerated in the ±X, ±Y, or ±Z direction, the corresponding output increases (+) or decreases (-). The acceleration output is shown in the same direction as the user-driven force.

    -

    The following table lists the measurement data that the linear acceleration sensor provides.

    +

    Gravity Sensor

    +

    The gravity sensor is a virtual sensor derived from the 3-axis acceleration sensor. The 3-axis gravity components provide a measure of the effect of Earth's gravity observed on the device reference axes. The gravity components measured on a device vary based on the change in the device orientation, and hence they provide a measure of the rotation subjected to the device.

    +

    Figure: Gravity sensor vector and axes

    +

    Gravity sensor vector and axes

    +

    The gravity sensor outputs 4 values: 3 Cartesian axis values and a timestamp. The gravity sensor measures and returns axes values in "m/s2" (meters per second squared). When a device is rotated in the ±X, ±Y, or ±Z direction, the corresponding output increases (+) or decreases (-).

    + +

    The following table lists the measurement data that the gravity sensor provides.

    - - - - - - @@ -348,365 +592,235 @@ - + - + - +
    - Table: Measurement data detected by the linear acceleration sensor + Table: Measurement data detected by the gravity sensor
    Measurement
    values[0]: X floatMin. value = -19.6

    Max. value = 19.6

    Min. value = -9.8

    Max. value = 9.8

    m/s2
    values[1]: Y floatMin. value = -19.6

    Max. value = 19.6

    Min. value = -9.8

    Max. value = 9.8

    m/s2
    values[2]: Z floatMin. value = -19.6

    Max. value = 19.6

    Min. value = -9.8

    Max. value = 9.8

    m/s2
    - -

    Magnetic Sensor

    -

    The magnetic sensor is a 3-axis electronic compass (sometimes referred to as a "magnetometer" or "geomagnetic sensor"). It can also be used in determining the azimuth component of the device orientation provided that the tilt of the device is already computed. The magnetic sensor measures the Earth's magnetic field strength and fluctuations, and splits the measurement into X, Y, and Z components.

    -

    The following factors can have an impact on the sensor readings:

    -
      -
    • The weather or the season of the year
    • -
    • Your location on the planet
    • -
    • Nearby, strong magnetic fields, such as magnets, electric coils, or objects which contain a ferrite element
    • -
    -

    The following table lists the measurement data that the magnetic sensor provides.

    +

    Gyroscope

    +

    The gyroscope detects angular velocity or angular rates of a device. The 3D gyroscope data is considered to be very sensitive in detecting incremental rotation angles. The rotation angles obtained by integrating the angular rates over longer duration is inaccurate due to the build-up of drift.

    +

    Figure: Gyroscope vector and axes

    +

    Gyroscope vector and axes

    +

    The following table lists the measurement data that the gyroscope provides.

    - + + - + + + + + + + + - - - - - - + +
    - Table: Measurement data detected by the magnetic sensor + Table: Measurement data detected by the gyroscope
    Measurement TypeRange Unit
    Timestamp unsigned long long- Microseconds
    values[0]: X floatμT (micro Tesla)Min. value = -573.0

    Max. value = 573.0

    Degrees/s (°/s)
    values[1]: YfloatMin. value = -573.0

    Max. value = 573.0

    Degrees/s (°/s)
    values[1]: YfloatμT (micro Tesla)
    values[2]: Z floatμT (micro Tesla)Min. value = -573.0

    Max. value = 573.0

    Degrees/s (°/s)
    -

    The magnetic sensor uses the 3-axis Cartesian space coordinate system, as the following figure illustrates.

    -

    Figure: Magnetic field vector and axes

    -

    Magnetic field vector and axes

    - -

    Uncalibrated Magnetic Sensor

    -

    The uncalibrated magnetic sensor is a 3-axis electronic compass (sometimes referred to as a "magnetometer" or "geomagnetic sensor"). It can also be used in determining the azimuth component of the device orientation provided that the tilt of the device is already computed. It measures the Earth's magnetic field strength and fluctuations, and splits the measurement into X, Y, and Z components. The uncalibrated magnetic sensor is similar in functionality to a magnetic sensor, but does not perform hard iron calibration. Factory calibration and temperature compensation are applied.

    + +

    Gyroscope Rotation Vector Sensor

    +

    The gyroscope rotation vector sensor is the output of a software/hardware-based sensor fusion solution which uses the accelerometer and gyroscope to compute the orientation of the device. In this sensor, the pitch and roll equivalent representations are free of drift while the azimuth equivalent component is allowed to drift due to the absence of the magnetic sensor. The gyroscope rotation vector sensor represents the orientation of the device as a combination of an angle and an axis in which the device has rotated through a specific angle around an axis (x, y, or z).

    -

    The following factors can have an impact on the sensor readings:

    -
      -
    • The weather or the season of the year
    • -
    • Your location on the planet
    • -
    • Nearby, strong magnetic fields, such as magnets, electric coils, or objects which contain a ferrite element
    • -
    -

    The following table lists the measurement data that the uncalibrated magnetic sensor provides.

    +

    The following table lists the measurement data that the gyroscope rotation vector sensor provides.

    + + + + + + + + - + + - + + - - - - - - - - - - - + + - + - + +
    - Table: Measurement data detected by the uncalibrated magnetic sensor + Table: Measurement data detected by the gyroscope rotation vector sensor
    Measurement TypeRange Unit
    Timestamp unsigned long long- Microseconds
    Accuracysensor_data_accuracy_e-int
    values[0]: X floatμT (micro Tesla)Min. value = -1

    Max. value = 1

    -
    values[1]: Y floatμT (micro Tesla)Min. value = -1

    Max. value = 1

    -
    values[2]: Z floatμT (micro Tesla)
    values[3]: X-axis biasfloatμT (micro Tesla)
    values[4]: Y-axis biasfloatμT (micro Tesla)Min. value = -1

    Max. value = 1

    -
    values[5]: Z-axis biasvalues[3]: W floatμT (micro Tesla)Min. value = -1

    Max. value = 1

    -
    - -

    Rotation Vector Sensor

    -

    The rotation vector sensor represents the orientation of the device as a combination of an angle and an axis, in which the device has rotated through a specific angle around an axis (x, y, or z). The rotation vector is the output of a software/hardware-based sensor fusion solution, which uses the accelerometer, gyroscope, and magnetic sensor as inputs to compute the orientation of the device.

    -

    The following table lists the measurement data that the rotation vector sensor provides.

    +

    Heart Rate Monitor LED Green Sensor

    +

    The Heart Rate Monitor (HRM) LED green sensor measures the amount of green light that is reflected back from a person's blood vessel.

    +

    The following table lists the measurement data that the HRM LED green sensor provides.

    - - + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + +
    - Table: Measurement data detected by the rotation vector + Table: Measurement data detected by the HRM LED green sensor
    Measurement TypeRangeUnitRangeUnit
    Timestamp unsigned long long-- Microseconds
    Accuracysensor_data_accuracy_e-int
    values[0]: XfloatMin. value = -1

    Max. value = 1

    -
    values[1]: YfloatMin. value = -1

    Max. value = 1

    -
    values[2]: ZfloatMin. value = -1

    Max. value = 1

    -
    values[3]: WfloatMin. value = -1

    Max. value = 1

    -
    values[0]: HRM green light valueintMin. value = 0

    Max. value = 1081216

    -
    - -

    Gyroscope Rotation Vector Sensor

    -

    The gyroscope rotation vector sensor is the output of a software/hardware-based sensor fusion solution which uses the accelerometer and gyroscope to compute the orientation of the device. In this sensor, the pitch and roll equivalent representations are free of drift while the azimuth equivalent component is allowed to drift due to the absence of the magnetic sensor. The gyroscope rotation vector sensor represents the orientation of the device as a combination of an angle and an axis in which the device has rotated through a specific angle around an axis (x, y, or z).

    -

    The following table lists the measurement data that the gyroscope rotation vector sensor provides.

    +

    Heart Rate Monitor LED IR Sensor

    +

    The Heart Rate Monitor (HRM) LED infrared (IR) sensor measures the amount of infrared light that is reflected back from a person's blood vessel.

    +

    The following table lists the measurement data that the HRM LED IR sensor provides.

    + + + + + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + +
    - Table: Measurement data detected by the gyroscope rotation vector sensor + Table: Measurement data detected by the HRM LED IR sensor
    Measurement TypeRangeRange Unit
    Timestamp unsigned long long-- Microseconds
    Accuracysensor_data_accuracy_e-int
    values[0]: XfloatMin. value = -1

    Max. value = 1

    -
    values[1]: YfloatMin. value = -1

    Max. value = 1

    -
    values[2]: ZfloatMin. value = -1

    Max. value = 1

    -
    values[3]: WfloatMin. value = -1

    Max. value = 1

    -
    values[0]: HRM IR light valueintMin. value = 0

    Max. value = 1081216

    -
    -

    Geomagnetic Rotation Vector Sensor

    -

    The geomagnetic rotation vector sensor is the output of a software/hardware-based sensor fusion solution which uses the accelerometer and magnetic sensors to compute the orientation of the device. In this sensor, the computed orientation is free of any drift, but it is inaccurate compared to a sensor fusion solution using the gyroscope sensor. The geomagnetic rotation vector sensor represents the orientation of the device as a combination of an angle and an axis in which the device has rotated through a specific angle around an axis (x, y, or z).

    - -

    The following table lists the measurement data that the geomagnetic rotation vector sensor provides.

    +

    Heart Rate Monitor LED Red Sensor

    +

    The Heart Rate Monitor (HRM) LED red sensor measures the amount of red light that is reflected back from a person's blood vessel.

    +

    The following table lists the measurement data that the HRM LED red sensor provides.

    + + + + + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - Table: Measurement data detected by the geomagnetic rotation vector sensor + Table: Measurement data detected by the HRM LED red sensor
    Measurement TypeRangeRange Unit
    Timestamp unsigned long long-- Microseconds
    Accuracysensor_data_accuracy_e-int
    values[0]: XfloatMin. value = -1

    Max. value = 1

    -
    values[1]: YfloatMin. value = -1

    Max. value = 1

    -
    values[2]: ZfloatMin. value = -1

    Max. value = 1

    -
    values[3]: WfloatMin. value = -1

    Max. value = 1

    -
    - - - -

    Orientation Sensor

    -

    The orientation sensor combines the 3-axis accelerometer, 3-axis magnetic sensor, and 3-axis gyroscope to determine the orientation (rotation angles) of the device. The orientation is the output of a software/hardware-based sensor fusion solution which uses the accelerometer, magnetic sensor, and gyroscope. The orientation sensor output is an alternative representation to the rotation vector sensor output used to determine the rotation of the device, and it is calculated in terms of Euler angles:

    -
      -
    • Azimuth
    • -
    • Pitch
    • -
    • Roll
    • -
    - -

    The following table lists the measurement data that the orientation sensor provides.

    - - - - - - - - - - - - + + + + - - - - - - - - - - - - - - - - - - -
    - Table: Measurement data detected by the orientation sensor -
    MeasurementTypeRangeUnit
    Timestampunsigned long long
    values[0]: HRM red light valueintMin. value = 0

    Max. value = 1081216

    -Microseconds
    values[0]: AzimuthfloatMin. value = 0

    Max. value = 360

    Degrees (°)
    values[1]: PitchfloatMin. value = -180

    Max. value = 180

    Degrees (°)
    values[2]: RollfloatMin. value = -90

    Max. value = 90

    Degrees (°)
    - -

    The angular positions are measured using a fixed frame reference (XE, YE, ZE).

    - -

    Figure: Angular positions and the fixed frame reference

    -

    Angular positions and the fixed frame reference

    -

    Gyroscope

    -

    The gyroscope detects angular velocity or angular rates of a device. The 3D gyroscope data is considered to be very sensitive in detecting incremental rotation angles. The rotation angles obtained by integrating the angular rates over longer duration is inaccurate due to the build-up of drift.

    -

    Figure: Gyroscope vector and axes

    -

    Gyroscope vector and axes

    -

    The following table lists the measurement data that the gyroscope provides.

    +

    Heart Rate Monitor Sensor

    +

    The Heart Rate Monitor (HRM) sensor measures a person's heart rate in real time.

    +

    The following table lists the measurement data that the HRM sensor provides.

    @@ -720,40 +834,33 @@ - + - - - - - - - - - - - - - - - - - + + + + +
    - Table: Measurement data detected by the gyroscope + Table: Measurement data detected by the HRM sensor
    Range Unit
    Timestamp unsigned long long - Microseconds
    values[0]: XfloatMin. value = -573.0

    Max. value = 573.0

    Degrees/s (°/s)
    values[1]: YfloatMin. value = -573.0

    Max. value = 573.0

    Degrees/s (°/s)
    values[2]: ZfloatMin. value = -573.0

    Max. value = 573.0

    Degrees/s (°/s)
    values[0]: Beats per minuteintMin. value = 0

    Max. value = 240

    -
    - -

    Uncalibrated Gyroscope

    -

    The uncalibrated gyroscope detects angular velocity or angular rates of a device. The 3D uncalibrated gyroscope sensor is considered to be very sensitive in detecting incremental rotation angles. The rotation angles obtained by integrating the angular rates over longer duration is inaccurate due to the build-up of drift. The uncalibrated gyroscope data also consists of drift compensation values for each axis, which can be used to subtract the drift from the detected angular rates. The values of drift for the 3 axes are obtained from the output of a software/hardware-based sensor fusion solution.

    -

    The following table lists the measurement data that the uncalibrated gyroscope provides.

    + +

    Humidity Sensor

    +

    The humidity sensor measures the relative ambient air humidity in percentage.

    +

    The following table lists the measurement data that the humidity sensor provides.

    + + + + + @@ -767,47 +874,16 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + -
    - Table: Measurement data detected by the uncalibrated gyroscope + Table: Measurement data detected by the humidity sensor
    Measurement- Microseconds
    values[0]: XfloatMin. value = -573.0

    Max. value = 573.0

    Degrees/s (°/s)
    values[1]: YfloatMin. value = -573.0

    Max. value = 573.0

    Degrees/s (°/s)
    values[2]: ZfloatMin. value = -573.0

    Max. value = 573.0

    Degrees/s (°/s)
    values[3]: Drift around the X axisfloatMin. value = -573.0

    Max. value = 573.0

    Degrees/s (°/s)
    values[4]: Drift around the Y axisfloatMin. value = -573.0

    Max. value = 573.0

    Degrees/s (°/s)
    values[5]: Drift around the Z axis
    values[0]: humidity floatMin. value = -573.0

    Max. value = 573.0

    Degrees/s (°/s)100%
    - - -

    Light Sensor

    + + +

    Light Sensor

    The light sensor detects the brightness of ambient light. It can be used to measure the brightness level.

    As an example use case, the light sensor can be used to control the brightness of the screen. In a dark environment, the light sensor detects the brightness of the environment and can be used to increase the device screen backlight brightness level. In a brighter environment, the backlight brightness level is lowered to save battery power.

    The following table lists the measurement data that the light sensor provides.

    @@ -842,18 +918,22 @@ -

    Proximity Sensor

    -

    The proximity sensor detects the presence of nearby objects in close proximity to the sensor. It can be used to measure the distance between nearby objects and the device.

    -

    As an example use case, the proximity sensor can be used to lock or unlock the device screen. When the device user holds the device to their ear, the proximity sensor detects the user as an object, and automatically locks the device screen. When the user moves the device away from their ear to input data, the proximity sensor determines that there are no nearby objects, and unlocks the screen.

    -

    The following table lists the measurement data that the proximity sensor provides.

    +

    Linear Acceleration Sensor

    +

    The linear acceleration sensor is derived from the accelerometer by excluding the gravity value, and it measures the user-driven changes in the velocity. The linear acceleration sensor is used to detect the dynamic movement of the device and analyze the user's motion profile. The 3-axes linear acceleration components provide a measure of the combined linear motion subjected to the device in the euclidean space.

    +

    The linear acceleration sensor provides 3 components of acceleration (X, Y, and Z), as the following figure illustrates.

    +

    Figure: User-acceleration sensor vector and axes

    +

    User-acceleration sensor vector and axes

    +

    The linear acceleration sensor outputs 4 values: 3 Cartesian axis values and a timestamp. The linear acceleration sensor measures and returns axes values in "m/s2" (meters per second squared). When a device is accelerated in the ±X, ±Y, or ±Z direction, the corresponding output increases (+) or decreases (-). The acceleration output is shown in the same direction as the user-driven force.

    +

    The following table lists the measurement data that the linear acceleration sensor provides.

    + @@ -869,62 +949,94 @@ - + - - + + + + + + + + + + + + + +
    - Table: Measurement data detected by the proximity sensor + Table: Measurement data detected by the linear acceleration sensor
    Microseconds
    values[0]: proximityvalues[0]: X float--Min. value = -19.6

    Max. value = 19.6

    m/s2
    values[1]: YfloatMin. value = -19.6

    Max. value = 19.6

    m/s2
    values[2]: ZfloatMin. value = -19.6

    Max. value = 19.6

    m/s2
    - -

    Pressure Sensor

    -

    The pressure sensor measures the atmospheric pressure in the device's surrounding environment.

    -

    The following table lists the measurement data that the pressure sensor provides.

    + + +

    Magnetic Sensor

    +

    The magnetic sensor is a 3-axis electronic compass (sometimes referred to as a "magnetometer" or "geomagnetic sensor"). It can also be used in determining the azimuth component of the device orientation provided that the tilt of the device is already computed. The magnetic sensor measures the Earth's magnetic field strength and fluctuations, and splits the measurement into X, Y, and Z components.

    +

    The following factors can have an impact on the sensor readings:

    +
      +
    • The weather or the season of the year
    • +
    • Your location on the planet
    • +
    • Nearby, strong magnetic fields, such as magnets, electric coils, or objects which contain a ferrite element
    • +
    +

    The following table lists the measurement data that the magnetic sensor provides.

    + - - - - + + - - + + + + + + + + + + +
    - Table: Measurement data detected by the pressure sensor + Table: Measurement data detected by the magnetic sensor
    Measurement TypeRange Unit
    Timestamp unsigned long long- Microseconds
    values[0]: pressure
    values[0]: X floatMin. value = 260

    Max. value = 1260

    hPaμT (micro Tesla)
    values[1]: YfloatμT (micro Tesla)
    values[2]: ZfloatμT (micro Tesla)
    +

    The magnetic sensor uses the 3-axis Cartesian space coordinate system, as the following figure illustrates.

    +

    Figure: Magnetic field vector and axes

    +

    Magnetic field vector and axes

    + + +

    Orientation Sensor

    +

    The orientation sensor combines the 3-axis accelerometer, 3-axis magnetic sensor, and 3-axis gyroscope to determine the orientation (rotation angles) of the device. The orientation is the output of a software/hardware-based sensor fusion solution which uses the accelerometer, magnetic sensor, and gyroscope. The orientation sensor output is an alternative representation to the rotation vector sensor output used to determine the rotation of the device, and it is calculated in terms of Euler angles:

    +
      +
    • Azimuth
    • +
    • Pitch
    • +
    • Roll
    • +
    -

    Ultraviolet Sensor

    -

    The ultraviolet (UV) sensor measures the ultraviolet index. The sensor detects and provides a measure of the UV rays being exposed to the device.

    -

    The following table lists the measurement data that the ultraviolet sensor provides.

    +

    The following table lists the measurement data that the orientation sensor provides.

    - - - - - - + @@ -936,21 +1048,41 @@ - - + + - - + + + + + + + + + + + + + +
    - Table: Measurement data detected by the ultraviolet sensor + Table: Measurement data detected by the orientation sensor
    Measurement Type Range- Microseconds
    values[0]: uv index
    values[0]: Azimuth floatMin. value = 0

    Max. value = 15

    uv indexMin. value = 0

    Max. value = 360

    Degrees (°)
    values[1]: PitchfloatMin. value = -180

    Max. value = 180

    Degrees (°)
    values[2]: RollfloatMin. value = -90

    Max. value = 90

    Degrees (°)
    + +

    The angular positions are measured using a fixed frame reference (XE, YE, ZE).

    + +

    Figure: Angular positions and the fixed frame reference

    +

    Angular positions and the fixed frame reference

    -

    Temperature Sensor

    -

    The temperature sensor measures the ambient room temperature in the device's surrounding environment.

    -

    The following table lists the measurement data that the temperature sensor provides.

    + +

    Pedometer

    +

    The pedometer detects the user's steps, and returns the number of steps taken by the user since the last reboot, while at least 1 application is using the pedometer. The timestamp of the event denotes the time when the last step was taken. In addition to the number of steps, it also returns other tracking data to further describe the user's activity status. For example, it provides the user's moving distance and burned calories. All the values are reset to zero when the system reboots.

    +

    Normally, a callback function is invoked whenever a new step is detected. However, to be power-efficient, the sensor can internally accumulate its detected events while the system sleeps. In this case, the accumulated data is reported when the system wakes up, that is, the display is switched on. In addition, even though the display is not switched on explicitly, the sensor can wake up the device to deliver its accumulated data occasionally.

    +

    If you want to track the user's steps continuously, do not stop the sensor listener to be sure that it keeps running. If there is no application listening to the sensor, it stops counting the steps.

    +

    The following table lists the measurement data that the pedometer provides.

    @@ -960,31 +1092,68 @@ - - - + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -
    - Table: Measurement data detected by the temperature sensor + Table: Measurement data detected by the pedometer
    MeasurementType Range Unit
    Timestampunsigned long long-- Microseconds
    values[0]: temperaturefloatMin. value = -30

    Max. value = 100

    values[0]: number of stepsMin. value = 0 +

    Max. value = 224

    Steps
    values[1]: number of walking stepsMin. value = 0 +

    Max. value = 224

    Steps
    values[2]: number of running stepsMin. value = 0 +

    Max. value = 224

    Steps
    values[3]: moving distanceMin. value = 0Meters
    values[4]: calories burnedMin. value = 0kcal
    values[5]: last speedMin. value = 0km/h
    values[6]: last stepping frequencyMin. value = 0Steps/second
    values[7]: last pedestrian state--
    + -

    Humidity Sensor

    -

    The humidity sensor measures the relative ambient air humidity in percentage.

    -

    The following table lists the measurement data that the humidity sensor provides.

    +

    The pedestrian state is SENSOR_PEDOMETER_STATE_UNKNOWN, SENSOR_PEDOMETER_STATE_STOP, SENSOR_PEDOMETER_STATE_WALK, or SENSOR_PEDOMETER_STATE_RUN.

    + +

    Pressure Sensor

    +

    The pressure sensor measures the atmospheric pressure in the device's surrounding environment.

    +

    The following table lists the measurement data that the pressure sensor provides.

    @@ -1005,21 +1174,21 @@ - + - - + + -
    - Table: Measurement data detected by the humidity sensor + Table: Measurement data detected by the pressure sensor
    Microseconds
    values[0]: humidityvalues[0]: pressure float100%Min. value = 260

    Max. value = 1260

    hPa
    - + -

    Heart Rate Monitor Sensor

    -

    The Heart Rate Monitor (HRM) sensor measures a person's heart rate in real time.

    -

    The following table lists the measurement data that the HRM sensor provides.

    +

    Proximity Sensor

    +

    The proximity sensor detects the presence of nearby objects in close proximity to the sensor. It can be used to measure the distance between nearby objects and the device.

    +

    As an example use case, the proximity sensor can be used to lock or unlock the device screen. When the device user holds the device to their ear, the proximity sensor detects the user as an object, and automatically locks the device screen. When the user moves the device away from their ear to input data, the proximity sensor determines that there are no nearby objects, and unlocks the screen.

    +

    The following table lists the measurement data that the proximity sensor provides.

    @@ -1033,61 +1202,88 @@ - + - - - - + + + +
    - Table: Measurement data detected by the HRM sensor + Table: Measurement data detected by the proximity sensor
    Range Unit
    Timestamp unsigned long long - Microseconds
    values[0]: Beats per minuteintMin. value = 0

    Max. value = 240

    values[0]: proximityfloat- -
    + +

    Rotation Vector Sensor

    +

    The rotation vector sensor represents the orientation of the device as a combination of an angle and an axis, in which the device has rotated through a specific angle around an axis (x, y, or z). The rotation vector is the output of a software/hardware-based sensor fusion solution, which uses the accelerometer, gyroscope, and magnetic sensor as inputs to compute the orientation of the device.

    -

    Heart Rate Monitor LED Green Sensor

    -

    The Heart Rate Monitor (HRM) LED green sensor measures the amount of green light that is reflected back from a person's blood vessel.

    -

    The following table lists the measurement data that the HRM LED green sensor provides.

    +

    The following table lists the measurement data that the rotation vector sensor provides.

    + - + - - + + - + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    - Table: Measurement data detected by the HRM LED green sensor + Table: Measurement data detected by the rotation vector
    Measurement TypeRangeUnitRangeUnit
    Timestamp unsigned long long-- Microseconds
    values[0]: HRM green light valueintMin. value = 0

    Max. value = 1081216

    -
    Accuracysensor_data_accuracy_e-int
    values[0]: XfloatMin. value = -1

    Max. value = 1

    -
    values[1]: YfloatMin. value = -1

    Max. value = 1

    -
    values[2]: ZfloatMin. value = -1

    Max. value = 1

    -
    values[3]: WfloatMin. value = -1

    Max. value = 1

    -
    + +

    Sleep Monitor

    +

    The sleep monitor tracks the user's sleep quality. Once per minute, it reports whether the user sleeps. As this sensor usually needs to track the sleep quality over several hours, it must be power-efficient and work in a batch manner. While the system sleeps, or the display is off, the sensor keeps its detected data internally. When the sensor is unable to keep more data (its internal buffer is full), it wakes up the system and flushes all collected data. When flushing, the callback function is invoked repeatedly. The timestamp of each event can be used to figure out when the user was sleeping.

    -

    Heart Rate Monitor LED IR Sensor

    -

    The Heart Rate Monitor (HRM) LED infrared (IR) sensor measures the amount of infrared light that is reflected back from a person's blood vessel.

    -

    The following table lists the measurement data that the HRM LED IR sensor provides.

    +

    The following table lists the measurement data that the sleep monitor provides.

    @@ -1097,31 +1293,29 @@ - - - - - - - - + +
    - Table: Measurement data detected by the HRM LED IR sensor + Table: Measurement data detected by the sleep monitor
    MeasurementTypeRange Unit
    Timestampunsigned long long- Microseconds
    values[0]: HRM IR light valueintMin. value = 0

    Max. value = 1081216

    values[0]: user's sleep state -
    -

    Heart Rate Monitor LED Red Sensor

    -

    The Heart Rate Monitor (HRM) LED red sensor measures the amount of red light that is reflected back from a person's blood vessel.

    -

    The following table lists the measurement data that the HRM LED red sensor provides.

    +

    The sleep state is SENSOR_SLEEP_STATE_UNKNOWN, SENSOR_SLEEP_STATE_WAKE, or SENSOR_SLEEP_STATE_SLEEP.

    +

    Depending on the device you are using, the available raw sensors are different and the sleep detection algorithm can also differ. In addition to the sleep state field, some specific device models can provide further data, as defined by the model manufacturer.

    + + +

    Temperature Sensor

    +

    The temperature sensor measures the ambient room temperature in the device's surrounding environment.

    +

    The following table lists the measurement data that the temperature sensor provides.

    @@ -1142,23 +1336,20 @@ - - - - + + + + -
    - Table: Measurement data detected by the HRM LED red sensor + Table: Measurement data detected by the temperature sensor
    Microseconds
    values[0]: HRM red light valueintMin. value = 0

    Max. value = 1081216

    -values[0]: temperaturefloatMin. value = -30

    Max. value = 100

    - + -

    Pedometer

    -

    The pedometer detects the user's steps, and returns the number of steps taken by the user since the last reboot, while at least 1 application is using the pedometer. The timestamp of the event denotes the time when the last step was taken. In addition to the number of steps, it also returns other tracking data to further describe the user's activity status. For example, it provides the user's moving distance and burned calories. All the values are reset to zero when the system reboots.

    -

    Normally, a callback function is invoked whenever a new step is detected. However, to be power-efficient, the sensor can internally accumulate its detected events while the system sleeps. In this case, the accumulated data is reported when the system wakes up, that is, the display is switched on. In addition, even though the display is not switched on explicitly, the sensor can wake up the device to deliver its accumulated data occasionally.

    -

    If you want to track the user's steps continuously, do not stop the sensor listener to be sure that it keeps running. If there is no application listening to the sensor, it stops counting the steps.

    -

    The following table lists the measurement data that the pedometer provides.

    +

    Ultraviolet Sensor

    +

    The ultraviolet (UV) sensor measures the ultraviolet index. The sensor detects and provides a measure of the UV rays being exposed to the device.

    +

    The following table lists the measurement data that the ultraviolet sensor provides.

    @@ -1166,319 +1357,149 @@ - + + - + + - - - - + + + + + - - - - + +
    - Table: Measurement data detected by the pedometer + Table: Measurement data detected by the ultraviolet sensor
    MeasurementType Range Unit
    Timestamp-unsigned long long- Microseconds
    values[0]: number of stepsMin. value = 0 -

    Max. value = 224

    Steps
    values[0]: uv indexfloatMin. value = 0

    Max. value = 15

    uv index
    values[1]: number of walking stepsMin. value = 0 -

    Max. value = 224

    Steps
    + +

    Uncalibrated Gyroscope

    +

    The uncalibrated gyroscope detects angular velocity or angular rates of a device. The 3D uncalibrated gyroscope sensor is considered to be very sensitive in detecting incremental rotation angles. The rotation angles obtained by integrating the angular rates over longer duration is inaccurate due to the build-up of drift. The uncalibrated gyroscope data also consists of drift compensation values for each axis, which can be used to subtract the drift from the detected angular rates. The values of drift for the 3 axes are obtained from the output of a software/hardware-based sensor fusion solution.

    +

    The following table lists the measurement data that the uncalibrated gyroscope provides.

    + + + + + + + + - - - - + + + + + - - - - + + + + + - - - - + + + + + - - - - + + + + + - - - - + + + + + - - - - + + + + + + + + + + +
    + Table: Measurement data detected by the uncalibrated gyroscope +
    MeasurementTypeRangeUnit
    values[2]: number of running stepsMin. value = 0 -

    Max. value = 224

    Steps
    Timestampunsigned long long-Microseconds
    values[3]: moving distanceMin. value = 0Meters
    values[0]: XfloatMin. value = -573.0

    Max. value = 573.0

    Degrees/s (°/s)
    values[4]: calories burnedMin. value = 0kcal
    values[1]: YfloatMin. value = -573.0

    Max. value = 573.0

    Degrees/s (°/s)
    values[5]: last speedMin. value = 0km/h
    values[2]: ZfloatMin. value = -573.0

    Max. value = 573.0

    Degrees/s (°/s)
    values[6]: last stepping frequencyMin. value = 0Steps/second
    values[3]: Drift around the X axisfloatMin. value = -573.0

    Max. value = 573.0

    Degrees/s (°/s)
    values[7]: last pedestrian state--
    values[4]: Drift around the Y axisfloatMin. value = -573.0

    Max. value = 573.0

    Degrees/s (°/s)
    values[5]: Drift around the Z axisfloatMin. value = -573.0

    Max. value = 573.0

    Degrees/s (°/s)
    -

    The pedestrian state is SENSOR_PEDOMETER_STATE_UNKNOWN, SENSOR_PEDOMETER_STATE_STOP, SENSOR_PEDOMETER_STATE_WALK, or SENSOR_PEDOMETER_STATE_RUN.

    - -

    Sleep Monitor

    -

    The sleep monitor tracks the user's sleep quality. Once per minute, it reports whether the user sleeps. As this sensor usually needs to track the sleep quality over several hours, it must be power-efficient and work in a batch manner. While the system sleeps, or the display is off, the sensor keeps its detected data internally. When the sensor is unable to keep more data (its internal buffer is full), it wakes up the system and flushes all collected data. When flushing, the callback function is invoked repeatedly. The timestamp of each event can be used to figure out when the user was sleeping.

    + +

    Uncalibrated Magnetic Sensor

    +

    The uncalibrated magnetic sensor is a 3-axis electronic compass (sometimes referred to as a "magnetometer" or "geomagnetic sensor"). It can also be used in determining the azimuth component of the device orientation provided that the tilt of the device is already computed. It measures the Earth's magnetic field strength and fluctuations, and splits the measurement into X, Y, and Z components. The uncalibrated magnetic sensor is similar in functionality to a magnetic sensor, but does not perform hard iron calibration. Factory calibration and temperature compensation are applied.

    -

    The following table lists the measurement data that the sleep monitor provides.

    +

    The following factors can have an impact on the sensor readings:

    +
      +
    • The weather or the season of the year
    • +
    • Your location on the planet
    • +
    • Nearby, strong magnetic fields, such as magnets, electric coils, or objects which contain a ferrite element
    • +
    +

    The following table lists the measurement data that the uncalibrated magnetic sensor provides.

    - - - - - + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    - Table: Measurement data detected by the sleep monitor + Table: Measurement data detected by the uncalibrated magnetic sensor
    MeasurementType Unit
    Timestampunsigned long long Microseconds
    values[0]: user's sleep state-
    values[0]: XfloatμT (micro Tesla)
    values[1]: YfloatμT (micro Tesla)
    values[2]: ZfloatμT (micro Tesla)
    values[3]: X-axis biasfloatμT (micro Tesla)
    values[4]: Y-axis biasfloatμT (micro Tesla)
    values[5]: Z-axis biasfloatμT (micro Tesla)
    - -

    The sleep state is SENSOR_SLEEP_STATE_UNKNOWN, SENSOR_SLEEP_STATE_WAKE, or SENSOR_SLEEP_STATE_SLEEP.

    -

    Depending on the device you are using, the available raw sensors are different and the sleep detection algorithm can also differ. In addition to the sleep state field, some specific device models can provide further data, as defined by the model manufacturer.

    - - -

    Sensor Listener

    -

    The Sensor API detects sensors and monitors their availability. The key sensor listening features provided by the Sensor API include:

    -
    • Adding and removing sensor listeners
    • -
    • Checking available sensors
    • -
    • Getting sensor data
    - -

    When running an application on the Emulator, you can use the Event Injector view to provide sensor data for the application.

    - -

    Sensor listeners can be added or removed at any time. Listeners receive registered sensor events and deliver the event data to applications at predefined intervals. The applications can add multiple sensor listeners for the same sensor type.

    - -

    Warm-up

    -

    Become familiar with the Sensor API basics by learning about:

    - - -

    Prerequisites

    - -

    To use the functions and data types of the Sensor API (in mobile and wearable applications), include the <sensor.h> header file in your application:

    -
    -#include <sensor.h>
    -
    - -

    Creating a Sensor Listener

    - -

    If an application wants to observe data from a specific sensor, it must first check whether the sensor is supported. Then, you can create a sensor listener handle on the sensor:

    - -
      -
    1. To observe a specific sensor type, for example, accelerometer, check its availability: -
      -bool supported = false;
      -
      -sensor_is_supported(SENSOR_ACCELEROMETER, &supported); 
      -if (!supported) {
      -    /* Accelerometer is not supported in the current device */
      -}
      -
      -
    2. -
    3. For a specific supported sensor type, a device can have multiple sensors. -

      You can acquire all sensors or just the default sensor (designated by the device vendor) of a given type. The following example shows how to get the default accelerometer of the device:

      -
      -sensor_h sensor;
      -sensor_get_default_sensor(SENSOR_ACCELEROMETER, &sensor);
      -
      -
    4. -
    5. After getting a sensor handle, you can create a listener handle upon the sensor handle: -
      -sensor_listener_h listener;
      -sensor_create_listener(sensor, &listener);
      -
      -
    6. -
    - -

    Subscribing for Sensor Events

    - -

    If a listener is created successfully, it is able to observe sensor data changes through the listener. In addition, you can set several parameters, including the update interval of the sensor data and the power-save behavior of the listener. The following example shows how to set the parameters and listen to changes of sensor data:

    - -
      -
    1. To listen to sensor events, define a callback function and register it to the listener: -
      -/* Define callback */
      -void
      -example_sensor_callback(sensor_h sensor, sensor_event_s *event, void *user_data)
      -{
      -    /* If a callback function is used to listen to different sensor types, it can check the sensor type */
      -    sensor_type_e type;
      -    sensor_get_type(sensor, &type);
      -
      -    if (type == SENSOR_ACCELEROMETER) {
      -        unsigned long long timestamp = event->timestamp;
      -        int accuracy = event->accuracy;
      -        float x = event->values[0];
      -        float y = event->values[1];
      -        float z = event->values[2];
      -    }
      -}
      -
      -/* Register callback */
      -sensor_listener_set_event_cb(listener, 100, example_sensor_callback, NULL);
      -
      -

      In the above example, the update interval for the sensor data is set to 100 ms.

      -
    2. - -
    3. To listen to sensor events, start the listener: -
      -sensor_listener_start(listener);
      -
      -

      The callback function starts to be called at least once per the given interval. You can start multiple listeners on the same sensor with different intervals. In this case, the shortest interval is chosen.

      -

      Some sensors are event-driven, meaning that they emit sensor events only if their data changes. For example, the proximity sensor emits its data only if the proximity value actually changes. For event-driven sensors, the update interval is ignored.

      -
    4. - -
    5. While the listener is running, you can change the listener settings: -
        -
      • You can change the listener update interval: -
        -sensor_listener_set_interval(listener, 200);
        -
        -

        The above example changes the update interval of a given listener to 200 ms.

        -
      • - -
      • You can change the power-save behavior of the listener. -

        By default, the listener automatically stops listening for the sensor data, if the display is switched off or the device goes to the power-save mode. You can override such behavior:

        -
        -sensor_listener_set_attribute_int(listener, SENSOR_ATTRIBUTE_PAUSE_POLICY, SENSOR_PAUSE_NONE);
        -
        -

        The above example makes the listener to listen for the sensor data regardless of the display state and the power-save mode. However, it does not prevent the device from going to the sleep mode. To listen for the sensor data, the device must be awake anyway.

        -
      • -
      -
    6. -
    7. When the sensor data is no more necessary, stop the listener: -
      -sensor_listener_stop(listener);
      -
      -
    8. -
    9. When a listener is no longer needed, release its resources explicitly: -
      -sensor_destroy_listener(listener);
      -
      -
    10. -
    - - -

    Requesting Sensor Data Recording

    - -

    Tizen supports long-term data recording for specific sensor types. For example, it can collect pedometer data for a month, by simply requesting the device to record pedometer data:

    - -
      -
    1. All sensor types cannot be recorded. Check whether a sensor is supported and allows recording in the current device, before actually making the record request. -
      -bool supported = false;
      -
      -sensor_recorder_is_supported(SENSOR_HUMAN_PEDOMETER, &supported);
      -if (!supported) {
      -    /* Pedometer is not supported or cannot be recorded in the current device */
      -}
      -
      -
    2. - -
    3. You can set various recording options based on your needs. -

      For example, in case of the pedometer, its retention period can be designated. The following example shows how to create an option handle to record pedometer data for a month:

      -
      -sensor_recorder_option_h option;
      -
      -sensor_recorder_create_option(&option);
      -sensor_recorder_option_set_int(option, SENSOR_RECORDER_OPTION_RETENTION_PERIOD, 30 * 24); /* 720 hours (30 days) */
      -
      -
    4. - -
    5. With the option handle, send the recording request for the pedometer data: -
      -sensor_recorder_start(SENSOR_HUMAN_PEDOMETER, option);
      -
      -

      Even if the application terminates or the device reboots, the system automatically continues to record pedometer data. As the retention period is set to 720 hours in the above example, the data older than 720 hours is erased automatically. If multiple applications set different retention periods, the longest one is chosen.

      -
    6. - -
    7. When you no longer need to record pedometer data, stop the recording: -
      -sensor_recorder_stop(SENSOR_HUMAN_PEDOMETER);
      -
      -

      However, remember that the recording is not actually stopped, if another application has requested for the same sensor to be recorded.

      -
    8. -
    - -

    Querying Recorded Sensor Data

    - -

    You can query the recorded sensor data with several query parameters. The query parameters differ between sensor types. In case of the pedometer, for example, you can get the daily step counts for the last 7 days by setting the necessary parameters:

    - -
      -
    1. Create a query. -

      In the following example, you get an aggregated data record per day (since SENSOR_RECORDER_QUERY_TIME_INTERVAL is set to 24 hours) and a day starts at 7 AM (not at midnight, since SENSOR_RECORDER_QUERY_ANCHOR_TIME is set to 7 AM).

      -
      -sensor_recorder_query_h query;
      -sensor_recorder_create_query(&query);
      -/* Start 7 days ago */
      -sensor_recorder_query_set_time(query, SENSOR_RECORDER_QUERY_START_TIME,
      -                               (time_t)(time(NULL) - (7 * 24 * 3600)));
      -/* End now */
      -sensor_recorder_query_set_time(query, SENSOR_RECORDER_QUERY_END_TIME, time(NULL));
      -/* Aggregate every 24 hours */ 
      -sensor_recorder_query_set_int(query, SENSOR_RECORDER_QUERY_TIME_INTERVAL, 24 * 60);
      -/* Start the aggregation at 7 AM */
      -sensor_recorder_query_set_time(query, SENSOR_RECORDER_QUERY_ANCHOR_TIME, (time_t)(7 * 3600));
      -
      -
    2. -
    3. With the query handle, retrieve the actual aggregated data: -
      -sensor_recorder_read(SENSOR_HUMAN_PEDOMETER, query, example_sensor_recorder_callback, NULL);
      -
      -

      The sensor_recorder_read() function is asynchronous. The synchronous variant is sensor_recorder_read_sync().

      -
    4. -
    5. Inside the example_sensor_recorder_callback() callback, each record attribute can be extracted: -
      -void
      -example_sensor_recorder_callback(sensor_type_e type, sensor_recorder_data_h data, int remains,
      -                                 sensor_error_e error, void *user_data)
      -{
      -    int step;
      -    double distance;
      -    time_t start;
      -    time_t end;
       
      -    if (error != SENSOR_ERROR_NONE)
      -        return;
      -
      -    sensor_recorder_get_time(data, &start, &end);
      -    sensor_recorder_get_int(data, SENSOR_RECORDER_DATA_STEPS, &step);
      -    sensor_recorder_get_double(data, SENSOR_RECORDER_DATA_DISTANCE, &distance);
      -}
      -
      -
    6. -
    - + + +
    diff --git a/org.tizen.guides/html/native/location_sensors/geofences_n.htm b/org.tizen.guides/html/native/location_sensors/geofences_n.htm index 98a721b..3d0f2d8 100644 --- a/org.tizen.guides/html/native/location_sensors/geofences_n.htm +++ b/org.tizen.guides/html/native/location_sensors/geofences_n.htm @@ -25,9 +25,9 @@

    Content

      -
    • Using the Geofence Service
    • -
    • Defining a Geofence
    • -
    • Managing the Geofence Service
    • +
    • Geofence Service
    • +
    • Geofence Definition
    • +
    • Geofence Management through My Places
    • Prerequisites
    • Starting the Geofence Service
    • Getting the Geofence Event State
    • @@ -51,12 +51,15 @@

      The main features of the Geofence Manager API include:

      -

      Using the Geofence Service

      +

      Geofence Service

      With the geofence service, you can:

      -

      Before you start, remember to prepare your application to use the geofence manager functionality.

      The geofence manager is set to GEOFENCE_MANAGER_ERROR_NONE if it is working correctly. The device can receive alerts about the geofence when a particular geofence service is started using the geofence_manager_start_geofence() function.

      If the user revokes a permission to use the location information, the geofence manager state is set to GEOFENCE_MANAGER_PERMISSION_DENIED and the same error is returned back to the application invoking the geofence service.

      Asynchronous geofence-related alerts (in or out) and event callbacks (a fence added or removed) are implemented with callback interfaces. The alerts are received using the GEOFENCE_STATE_UNCERTAIN, GEOFENCE_STATE_IN, and GEOFENCE_STATE_OUT values of the geofence_state_e enumerator.

      -

      Defining a Geofence

      +

      Geofence Definition

      The geofence definition defines the parameters of a geofence.

      The 3 types of available geofences are geopoint, Wi-Fi, and Bluetooth. When creating the geofence, the type can be defined using the GEOFENCE_TYPE_GEOPOINT, GEOFENCE_TYPE_WIFI, and GEOFENCE_TYPE_BT values of the geofence_type_e enumerator.

      The geopoint geofences require a geopoint and a radius, and the Wi-Fi and Bluetooth geofences require a MAC address. Based on the defined geofence type, the geofence manager creates the fence for the particular application.

      -

      Managing the Geofence Service

      +

      Geofence Management through My Places

      Tizen provides the user a way of managing the geofence places and fences through the My places application. The following figure shows the default places and supported fences.

      Figure: My places

      My places

      My places controls the adding, removing, and updating of places and fences. Home, Office, and Car are the default places, and Map, Wi-Fi, and Bluetooth are the supported fence methods. Car supports only Wi-Fi and Bluetooth for a fence method.

      -

      Warm-up

      -

      Become familiar with Geofence Manager API basics by learning about:

      - - -

      Prerequisites

      +

      Prerequisites

      To use the functions and data types of the Geofence Manager API, include the <geofence_manager.h> header file in your application:

      diff --git a/org.tizen.guides/html/native/location_sensors/gesture_n.htm b/org.tizen.guides/html/native/location_sensors/gesture_n.htm
      index 6b7173d..0dc783a 100644
      --- a/org.tizen.guides/html/native/location_sensors/gesture_n.htm
      +++ b/org.tizen.guides/html/native/location_sensors/gesture_n.htm
      @@ -44,7 +44,20 @@
       
         

      Gesture Recognition

      -

      With gesture recognition, you can receive notifications about different device movement patterns, identify device states, and trigger events when the sensor data meets predefined conditions. In some cases, you can also listen to different states (started, in-progress, and ended).

      +

      With gesture recognition, you can monitor user gestures.

      + +

      The main Gesture Recognition API features are:

      +
        +
      • Movement notifications +

        You can receive notifications about different device movement patterns.

        +
      • +
      • Device state recognition +

        You can identify the current device states and take applicable actions.

        +
      • +
      • Event triggers +

        You can trigger events when the sensor data meets predefined conditions. In some cases, you can also listen to different movement states (started, in-progress, and ended).

        +
      • +

      The following gesture events are supported in Tizen devices:

      @@ -97,8 +110,7 @@

      Figure: Wrist-up event

      Wrist-up event

    - -

    Before you start, remember to prepare your application to use the gesture recognition functionality.

    + @@ -109,16 +121,7 @@
    - -

    Warm-up

    -

    Become familiar with the Gesture Recognition API basics by learning about:

    - - +

    Prerequisites

    To use the functions and data types of the Gesture Recognition API (in mobile and wearable applications), include the <gesture_recognition.h> header file in your application:

    diff --git a/org.tizen.guides/html/native/location_sensors/location_n.htm b/org.tizen.guides/html/native/location_sensors/location_n.htm index 004a46f..b324b14 100644 --- a/org.tizen.guides/html/native/location_sensors/location_n.htm +++ b/org.tizen.guides/html/native/location_sensors/location_n.htm @@ -56,9 +56,12 @@

    Location information has a geographical point on the Earth, and optionally location-related information can also contain information about altitude, accuracy about the geographical point and altitude, and the user speed and course of direction. The location manager features include managing location information on the device.

    The main features of the Location Manager API include:

    Location Service

    @@ -73,7 +76,6 @@
  • Retrieve satellite information
  • Track routes
  • -

    Before you start, remember to prepare your application to use the location manager functionality.

    @@ -131,35 +133,7 @@

    Once the GPS or Wireless networks setting is enabled, the user can control the usage of the location data for each application separately using the privacy setting. If the privacy setting of the application is disabled, location data is no longer available for the application.

    The applications whose location setting is enabled can get the current and last known location of the user.

    -

    Warm-up

    -

    Become familiar with the Location Manager API basics by learning about:

    - - -

    Follow-up

    -

    Once we have learned the basics of the Location Manager API, we can now move on to more advanced tasks, including:

    -
      -
    • Tracking the Route -

      Get information about the current position, velocity, and distance.

    • -
    - - -

    Prerequisites

    +

    Prerequisites

    To use the functions and data types of the Location Manager API (in mobile and wearable applications), include the <locations.h> header file in your application:

    diff --git a/org.tizen.guides/html/native/location_sensors/maps_n.htm b/org.tizen.guides/html/native/location_sensors/maps_n.htm
    index 33ac10f..bc6b74a 100644
    --- a/org.tizen.guides/html/native/location_sensors/maps_n.htm
    +++ b/org.tizen.guides/html/native/location_sensors/maps_n.htm
    @@ -33,9 +33,9 @@
     				
  • Map View Widget
  • Prerequisites
  • Starting the Map Service
  • -
  • Using Geocode and Reverse Geocode Services
  • -
  • Using the Place Search Service
  • -
  • Using the Routing Service
  • +
  • Using Geocode and Reverse Geocode Services
  • +
  • Using the Place Search Service
  • +
  • Using the Routing Service
  • Canceling the Service Request
  • Recognizing the Address Information
  • Recognizing the Place Information
  • @@ -69,23 +69,21 @@

    You can also cancel service requests and customize them.

    -

    Before you start, remember to prepare your application to use the maps service functionality.

    -

    The following map providers are supported:

    • HERE Maps based on the HERE REST API. @@ -112,7 +110,7 @@
    • Get place coordinates based on a free text address within a specified geographical area.
    • Get place coordinates based on a structured address (a structure with fields, such as city, street, and building number).
    -

    The geocode response is a geographical location, specified with latitude and longitude values.

    +

    After performing the geocode service request, you receive the geocode response, which is a geographical location, specified with latitude and longitude values.

    Only 1 type of reverse geocode request is provided:

    • Get a structured address based on place coordinates.
    • @@ -127,7 +125,7 @@
    • Query place information within a specified geographical area.
    • Query place information based on a free text address within a specified geographical area.
    -

    You can parse the place search response to use its details. The response consists of structured place information, comprising, for example, of a place ID, name and URL, address, geographical location and distance from the center of the search area, place category, rating, review, and image.

    +

    After performing the place service request, you receive the place search response. You can parse the place search response to use its details. The response consists of structured place information, comprising, for example, of a place ID, name and URL, address, geographical location and distance from the center of the search area, place category, rating, review, and image.

    @@ -146,7 +144,7 @@
  • Query a route from a starting point to a destination specified as a geographical location.
  • Query a route passing through a number of geographical locations.
  • -

    You can parse the route calculation response to use its details. The response consists of structured route information, comprising, for example, of a route ID, geographical coordinates of the start and destination point, route bounding box, transportation mode, and total distance and duration.

    +

    After performing the route service request, you receive the route search response. You can parse the route calculation response to use its details. The response consists of structured route information, comprising, for example, of a route ID, geographical coordinates of the start and destination point, route bounding box, transportation mode, and total distance and duration.

    @@ -202,55 +200,6 @@
  • MAPS_VIEW_EVENT_READY: Map view widget is ready.
  • Each event contains various data, and you can access the data with various maps_view_event_data_get_XXX() functions.

    -

    Warm-up

    -

    Become familiar with the Maps Service API basics by learning about:

    - - -

    Follow-up

    -

    Once we have learned the basics of the Maps Service API, we can now move on to more advanced tasks, including:

    -

    Prerequisites

    diff --git a/org.tizen.guides/html/native/location_sensors/mapzen_credentials_n.htm b/org.tizen.guides/html/native/location_sensors/mapzen_credentials_n.htm index ed7bfa4..f61c65b 100644 --- a/org.tizen.guides/html/native/location_sensors/mapzen_credentials_n.htm +++ b/org.tizen.guides/html/native/location_sensors/mapzen_credentials_n.htm @@ -10,7 +10,7 @@ -Getting A Mapzen API Key +Getting a Mapzen API Key @@ -39,7 +39,7 @@
    -

    Getting A Mapzen API Key

    +

    Getting a Mapzen API Key

    Mapzen products help you put a map anywhere, search and route the planet, and try a world of open data. They are built from open-source tools that are packaged into a Web service and hosted on the Mapzen servers. If you want to use Mapzen services, you must create a Mapzen developer account and a valid API key, and keep your requests to the service within certain rate limits.

    diff --git a/org.tizen.guides/html/native/media/camera_n.htm b/org.tizen.guides/html/native/media/camera_n.htm index 62a0c11..9f50a92 100644 --- a/org.tizen.guides/html/native/media/camera_n.htm +++ b/org.tizen.guides/html/native/media/camera_n.htm @@ -52,14 +52,20 @@

    The main features of the Camera API include:

      -
    • Preview images in real time -
        +
      • Configuring the camera and its callbacks +

        You can configure the camera and set the camera and auto-focus callbacks.

      • +
      • Setting the display for the camera preview +

        You can preview images in real time with the StartPreview() function. The feature provides:

        +
        • Support for several pixel formats, such as NV12, NV12T, NV16, NV21, YUYV, UYVY, and YUV420P
        • Preview at the frame rate
        • -
        • Rotate and flip the preview
        • -
      • -
      • Capture and save images
      • -
      • Control the camera settings: +
      • Rotation and flip of the preview
      • +
      +

      You can also customize the display settings for the camera preview.

    • +
    • Capturing and saving images +

      You can start the camera preview and capture an image.

    • +
    • Setting camera attributes +

      You can control the camera settings:

      • Contrast
      • Exposure
      • @@ -74,10 +80,8 @@
      • EXIF tag (geo, orientation, software info and description)
      • Scene mode, HDR, theater
      • Image quality
      • -
    • -
    - -

    Depending on the camera device type, the device can support different orientations, resolutions, or preview and capture formats. You can obtain this information from the device using the camera_foreach_supported_preview_resolution(), camera_foreach_supported_preview_format(), or other camera_foreach_supported_xxx() functions.

    + +

    Depending on the camera device type, the device can support different orientations, resolutions, or preview and capture formats. You can obtain this information from the device using the camera_foreach_supported_preview_resolution(), camera_foreach_supported_preview_format(), or other camera_foreach_supported_xxx() functions.

    Since devices can have multiple camera sensors with different capabilities, create a Camera with a proper camera_device_e value, determining which camera sensor is used. Usually the primary sensor is located on the back side and the secondary sensor on the front side of the device. Once the camera sensor is selected, the selected sensor starts working.

    @@ -90,32 +94,14 @@
    + +
  • Releasing resources +

    When you have finished working with the camera, you can release the resources.

  • + -

    The following figure illustrates the camera state changes in the normal mode:

    +

    The following figure illustrates the camera state changes in the normal mode:

    Figure: Camera states in the normal mode

    Camera states in the normal mode

    - -

    To display the camera preview, use the StartPreview() function.

    -

    Before you start, remember to prepare your application to use the messages functionality and configure the camera. When you have finished working with the camera, release the resources.

    - -

    Warm-up

    - -

    Become familiar with the Camera API basics by learning about:

    - -

    Prerequisites

    diff --git a/org.tizen.guides/html/native/media/image_barcode_n.htm b/org.tizen.guides/html/native/media/image_barcode_n.htm index 289a729..e5714da 100644 --- a/org.tizen.guides/html/native/media/image_barcode_n.htm +++ b/org.tizen.guides/html/native/media/image_barcode_n.htm @@ -30,6 +30,7 @@
  • Preparing the Barcode Engines
  • Generating Barcodes
  • Detecting Barcodes
  • +
  • Barcode Specifications
  • Related Info

      @@ -42,7 +43,7 @@

      Barcode Detection

      -

      You can perceive and understand an image or to extract information from images in your application.

      +

      You can perceive and understand an image or extract information from images in your application.

      This feature is supported in mobile applications only.

      @@ -68,7 +69,7 @@
    • Generate barcode without an input message
    • Generate barcode with an input message (supports only 1D barcodes)
    -

    You must also define the following specifications:

    +

    You must also define the following barcode specifications:

    -

    Before you start, remember to prepare your application to use the media vision functionality.

    -

    The following tables provides more information about the barcode generation specifications.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - Table: Supported barcode types -
    1D or 2DTypeDescriptionExample
    1-DUPC-AUniversal product code with numeric 12-digit

    UPC-A

    UPC-EUniversal product code with numeric 6-digit

    UPC-E

    EAN-8International article number with numeric 8-digit

    EAN-8

    EAN-13International article number with numeric 13-digit

    EAN-13

    CODE-128Code 128; supports alphanumeric or numeric-only

    CODE-128

    CODE-39Code 39; supports 34 characters consisting of uppercase letters (A to Z), numeric digits (0 to 9), and special characters(-, ., $, /, %, space)

    CODE-39

    INTERLEAVED 2 of 5Interleaved 2 of 5 with numeric digits

    UPC-A

    2-DQR codeQuick Response code

    UPC-A

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - Table: Supported QR code specifications -
    SpecificationSupport typeDescription
    Error Correction Code (ECC) LevelECC LowRecovery up to 7% damage
    ECC MediumRecovery up to 15% damage
    ECC QuartileRecovery up 25% damage
    ECC HighRecovery up to 30% damage
    Encoding modeNumericNumeric digits ('0', '1', ..., '9')
    AlphanumericAlphanumeric characters: numeric (0, 1, ..., 9), characters (A, B, ..., Z), and punctuation (' ', $, %, *, +, -, '.', /, ':')
    Byte 8-bitRaw 8-bit bytes
    UTF-8Universal character set and Transformation Format 8-bit, encoding characters
    -

    Warm-up

    - -

    Become familiar with the Media Vision API basics by learning about:

    - - - -

    Prerequisites

    @@ -696,6 +576,113 @@ if (error_code != MEDIA_VISION_ERROR_NONE) + +

    Barcode Specifications

    + +

    The following tables provide more information about the barcode generation specifications.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Table: Supported barcode types +
    1D or 2DTypeDescriptionExample
    1-DUPC-AUniversal product code with numeric 12-digit

    UPC-A

    UPC-EUniversal product code with numeric 6-digit

    UPC-E

    EAN-8International article number with numeric 8-digit

    EAN-8

    EAN-13International article number with numeric 13-digit

    EAN-13

    CODE-128Code 128; supports alphanumeric or numeric-only

    CODE-128

    CODE-39Code 39; supports 34 characters consisting of uppercase letters (A to Z), numeric digits (0 to 9), and special characters(-, ., $, /, %, space)

    CODE-39

    INTERLEAVED 2 of 5Interleaved 2 of 5 with numeric digits

    UPC-A

    2-DQR codeQuick Response code

    UPC-A

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Table: Supported QR code specifications +
    SpecificationSupport typeDescription
    Error Correction Code (ECC) LevelECC LowRecovery up to 7% damage
    ECC MediumRecovery up to 15% damage
    ECC QuartileRecovery up 25% damage
    ECC HighRecovery up to 30% damage
    Encoding modeNumericNumeric digits ('0', '1', ..., '9')
    AlphanumericAlphanumeric characters: numeric (0, 1, ..., 9), characters (A, B, ..., Z), and punctuation (' ', $, %, *, +, -, '.', /, ':')
    Byte 8-bitRaw 8-bit bytes
    UTF-8Universal character set and Transformation Format 8-bit, encoding characters
    diff --git a/org.tizen.guides/html/native/media/image_edit_n.htm b/org.tizen.guides/html/native/media/image_edit_n.htm index 3b32d5c..3301461 100644 --- a/org.tizen.guides/html/native/media/image_edit_n.htm +++ b/org.tizen.guides/html/native/media/image_edit_n.htm @@ -38,6 +38,8 @@
  • Decoding from a File or Memory
  • Encoding to a File or Memory
  • +
  • Supported Colorspace Formats
  • +
  • Quality and Size Comparison
  • Related Info

      @@ -50,207 +52,29 @@

      Image Editing

      -

      Tizen offers the following image processing features:

      +

      Tizen offers various image processing features.

      + +

      The main features of the Image Util API include:

      • Conversion -

        You can change the colorspace format. The following tables define the supported formats.

        - - - - - - - - - - - - - - - - - - - - - - - -
        - Table: RGB pixel formats -
        LabelFOURCC in hexBits per pixelDescription
        RGB0x324247521, 4, 8, 16, 24, 32Alias for BI_RGB
        RGBA0x4142475216, 32Raw RGB with alpha. Sample precision and packing is arbitrary and determined using bit masks for each component, as for BI_BITFIELDS.
        - - - - - - - - - - - - - - - - - - - - - - - -
        - Table: Packed YUV formats -
        LabelFOURCC in hexBits per pixelDescription
        UYVY0x5956595516YUV 4:2:2 (Y sample at every pixel, U and V sampled at every second pixel horizontally on each line). A macropixel contains 2 pixels in 1 u_int32.
        YUYV0x5659555916Duplicate of YUY2.
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        - Table: Planar YUV formats -
        LabelFOURCC in hexBits per pixelDescription
        YV160x36315659168-bit Y plane followed by 8-bit 2x1 subsampled V and U planes.
        YV120x32315659128-bit Y plane followed by 8-bit 2x2 subsampled V and U planes.
        I4200x30323449128-bit Y plane followed by 8-bit 2x2 subsampled U and V planes.
        NV120x3231564E128-bit Y plane followed by an interleaved U/V plane with 2x2 subsampling.
        NV210x3132564E12As NV12 with U and V reversed in the interleaved plane.
        -
      • +

        You can change the colorspace format among the supported formats.

      • Resizing

        You can change the image resolution.

      • Rotation

        You can change the image angle around the x or y axis.

      • Crop -

        You can remove the outer parts of an image or change the aspect ratio.

      - -

      Before you start, remember to prepare your application to use the image util functionality.

      - +

      You can remove the outer parts of an image or change the aspect ratio.

      +
    • Decoding from a file or memory and encoding to a file or memory

      You can decode images and encode them with the following formats:

      -
      • Bitmap formats:
        • YUV420, YUV422, RGB888, RGBA8888, BGRA8888, ARGB8888
      • Input image formats for decoding:
        • Only JPEG is supported when using image util
      • Output image formats for encoding: -
        • JPEG
        • -
        • Quality vs. size - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          - Table: Quality and size comparison -
          ImageQualitySize (bytes)Compression ratioDescription
          Highest quality imageHighest quality (Q = 100)83,2612.6:1Extremely minor artifacts
          High quality imageHigh quality (Q = 50)15,13815:1Initial signs of subimage artifacts
          Medium quality imageMedium quality (Q = 25)9,55323:1Stronger artifacts; loss of high-frequency information
          Low quality imageLow quality (Q = 10)4,78746:1Severe high frequency loss; artifacts on subimage boundaries ("macroblocking") are obvious
          Lowest quality imageLowest quality
          -
      - -

      Warm-up

      - -

      Become familiar with the Image Util API basics by learning about:

      - - +

    Prerequisites

    @@ -689,6 +513,159 @@ ret = image_util_encode_jpeg_to_memory(img_flip_target, dest_width, dest_height, +

    Supported Colorspace Formats

    + +

    The following tables define the supported colorspace formats.

    + + + + + + + + + + + + + + + + + + + + + + +
    + Table: RGB pixel formats +
    LabelFOURCC in hexBits per pixelDescription
    RGB0x324247521, 4, 8, 16, 24, 32Alias for BI_RGB
    RGBA0x4142475216, 32Raw RGB with alpha. Sample precision and packing is arbitrary and determined using bit masks for each component, as for BI_BITFIELDS.
    + + + + + + + + + + + + + + + + + + + + + + + +
    + Table: Packed YUV formats +
    LabelFOURCC in hexBits per pixelDescription
    UYVY0x5956595516YUV 4:2:2 (Y sample at every pixel, U and V sampled at every second pixel horizontally on each line). A macropixel contains 2 pixels in 1 u_int32.
    YUYV0x5659555916Duplicate of YUY2.
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Table: Planar YUV formats +
    LabelFOURCC in hexBits per pixelDescription
    YV160x36315659168-bit Y plane followed by 8-bit 2x1 subsampled V and U planes.
    YV120x32315659128-bit Y plane followed by 8-bit 2x2 subsampled V and U planes.
    I4200x30323449128-bit Y plane followed by 8-bit 2x2 subsampled U and V planes.
    NV120x3231564E128-bit Y plane followed by an interleaved U/V plane with 2x2 subsampling.
    NV210x3132564E12As NV12 with U and V reversed in the interleaved plane.
    + +

    Quality and Size Comparison

    + +

    The following table shows the effect on the image quality and file sizes when using different compression ratios.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Table: Quality and size comparison +
    ImageQualitySize (bytes)Compression ratioDescription
    Highest quality imageHighest quality (Q = 100)83,2612.6:1Extremely minor artifacts
    High quality imageHigh quality (Q = 50)15,13815:1Initial signs of subimage artifacts
    Medium quality imageMedium quality (Q = 25)9,55323:1Stronger artifacts; loss of high-frequency information
    Low quality imageLow quality (Q = 10)4,78746:1Severe high frequency loss; artifacts on subimage boundaries ("macroblocking") are obvious
    Lowest quality imageLowest quality
    + diff --git a/org.tizen.guides/html/native/media/media_content_n.htm b/org.tizen.guides/html/native/media/media_content_n.htm index 1b28a70..6cfd4b4 100644 --- a/org.tizen.guides/html/native/media/media_content_n.htm +++ b/org.tizen.guides/html/native/media/media_content_n.htm @@ -27,7 +27,6 @@

    Content

    Related Info

    @@ -137,8 +137,9 @@
  • Media content

    You can update database details due to file (or folder) creation or deletion. If a received file (or folder) does not exist in the file system, it is removed from the database.

    You can also retrieve a list of media folders, retrieve a list of media items, and monitor changes in the media database. In case of the media folders, you can search for specific folders, read folder information, and retrieve folder content.

  • -
  • Media information -

    You can update the media database due to file creation, deletion, or update in the device. You can retrieve media information, and add media files and media folders to the database.

  • +
  • Media information +

    You can update the media database due to file creation, deletion, or update in the device. You can retrieve media information, and add media files and media folders to the database.

    +

    You can also retrieve general information about the media more specific information about the media type.

  • Media bookmarks

    You can insert, search for, read, and remove bookmarks of the video and audio files.

  • Filter @@ -149,511 +150,54 @@

    You can access the tag information of the media files in the database. You can, for example, add media tags, retrieve tag information, and delete tags.

  • Media albums

    You can manage an album of the audio file. You can, for example, search for albums, retrieve album content, and read album information.

  • -
  • Media groups +
  • Media item groups

    You can manage a collection of media items as a group, when the items have the same value of a given property. You can, for example, search for groups and read group information.

  • Media storages

    You can retrieve information about the media storages.

  • -

    Getting Media Information

    -

    You can get the media data from the media database using the media_info_foreach_media_from_db() function.

    -

    After that, you can get the general information of media and specific information of each media type.

    + +

    Prerequisites

    -

    The following tables list the information available about the media files.

    +

    To enable your application to use the media content functionality:

    +
      +
    1. +

      To use the Media Content API (in mobile and wearable applications), the application has to request permission by adding the following privileges to the tizen-manifest.xml file:

      +
      +<privileges>
      +   <!--To insert content-->
      +   <privilege>http://tizen.org/privilege/content.write</privilege>
      +   <!--To access a storage to insert content-->
      +   <privilege>http://tizen.org/privilege/mediastorage</privilege>
      +</privileges>
      +
      +
    2. +
    3. Media Content functions use a SQLite database to save the metadata of the media files on the user device, along with the tags and bookmarks that the user sets. To use the functions and data types of the Media Content API, include the <media_content.h> header file in your application:

      +
      +#include <media_content.h>
      +#include <glib.h>
      +
      +

      The example application used in the use cases also requires the <glib.h> header file.

      +
    4. +
    5. Connect to the database: +
      +int ret = MEDIA_CONTENT_ERROR_NONE;
       
      - 
      -    
      -    
      -     
      -     
      -      
      -     
      -     
      -     
      -     
      -     
      -      
      -     
      -     
      -    
      -    
      -     
      -     
      -     
      -     
      -      
      -     
      -     
      -     
      -      
      -     
      -     
      -     
      -      
      -     
      -     
      -     
      -      
      -     
      -     
      -     
      -      
      -     
      -     
      -     
      -      
      -     
      -     
      -     
      -      
      -     
      -     
      -     
      -      
      -     
      -    
      -     
      -      
      -     
      -     
      -      
      -      
      -     
      -     
      -     
      -      
      -     
      -     
      -     
      -      
      -     
      -     
      -     
      -      
      -     
      -     
      -     
      -      
      -     
      -     
      -     
      -      
      -     
      -     
      -     
      -      
      -     
      -     
      -     
      -      
      -     
      -     
      -     
      -      
      -     
      -     
      -     
      -      
      -     
      -     
      -     
      -      
      -     
      -     
      -     
      -      
      -     
      -    
      -     
      -      
      -     
      -     
      -     
      -      
      -     
      -     
      -     
      -      
      -     
      -     
      -	 
      -      
      -     
      -     
      -     
      -      
      -     
      -     
      -     
      -      
      -     
      -     
      -	
      -    
      -  
      - Table: General information -
      Metadata nameDescription
      Media IDID of the media content
      File pathPath of the media content
      Display nameDisplay name of the media content
      Media typeThe media type of the media content
      Mime typeMime type of the media content
      SizeFile size of the media content
      Added timeThe time the media content was added in the database
      Modified timeThe last modification time of the media content
      TimelineThe time the media content was created -

      You can use this value to sort the content.

      Thumbnail pathPath of the stored thumbnail image of the media content
      DescriptionDescription of the media content
      LongitudeLongitude of the media content
      LatitudeLatitude of the media content
      AltitudeAltitude of the media content
      WeatherWeather information of the media content
      RatingRating of the media content
      FavoriteFavorite of the media content
      AuthorThe author of the media content
      ProviderProvider of the media content
      Content nameContent name of the media content
      TitleTitle of the media content
      CategoryCategory of the media content
      Location tagLocation tag of the media content
      Age ratingAge rating of the media content
      KeywordKeyword of the media content
      Is DRMCheck flag for DRM content
      Storage typeStorage type of the media content
      Played countPlayed count of the media content
      Played timeLast played time of the media content
      Played positionLast played position of the media content
      +ret = media_content_connect(); +if (ret == MEDIA_CONTENT_ERROR_NONE) +    dlog_print(DLOG_DEBUG, LOG_TAG, "connection is success"); +else +    dlog_print(DLOG_ERROR, LOG_TAG, "connection failed"); -

      For metadata of an audio file, call the media_info_get_audio() function with the media handle.

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - Table: Audio metadata (only for audio files) -
      Metadata nameDescription
      Media IDMedia ID of the audio content -

      This value is same as the media ID in general information.

      AlbumAlbum information of the audio content
      ArtistArtist of the audio content
      Album ArtistAlbum artist of the audio content -

      The artist and album artist can be the same.

      GenreGenre of the audio content
      ComposerComposer of the audio content
      YearThe year the audio content was created
      Recorded dateThe date the audio content was recorded
      CopyrightCopyright information of the audio content
      Track numberTrack number of the audio content
      Bit rateBit rate of the audio content
      Bit per sampleBit per sample of the audio content -

      The bit per sample is the same as the sample format. The sample format is the number of digits in the digital representation of each sample.

      Sample rateSample rate of the audio content
      ChannelChannel information of the audio content
      DurationDuration of the audio content
      - -

      For metadata of an image file, call the media_info_get_image() function with the media handle.

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - Table: Image metadata (only for image files) -
      Metadata nameDescription
      Media IDMedia ID of the image -

      This value is the same as the media ID in the general information.

      WidthWidth of the image
      HeightHeight of the image
      Exposure timeExposure time of the image
      F-numberF-number of the image
      ISOISO information of the image
      ModelModel name of the image
      OrientationOrientation information of the image
      Date takenThe time the image was created -

      You can get this information from the EXIF tag. If there is no EXIF tag for the image, set the created time in the file system.

      Is burstshotCheck flag for a burst shot of the image -

      The burst shot is a continuous shooting mode.

      Burstshot IDID of a burst shot image -

      Assign the same ID to the burst shooting mode.

      -

      For metadata of a video file, call withmedia_info_get_video() function with the media handle.

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - Table: Video metadata (only for video files) -
      Metadata nameDescription
      Media IDThe media ID of the video content -

      This value is same with media ID of general information.

      AlbumAlbum of the video content
      ArtistArtist of the video content
      Album artistAlbum artist of the video content
      GenreGenre of the video content
      ComposerMedia composer of the video content
      YearThe year the video content was created
      Recorded dateThe date the video content was recorded
      CopyrightCopyright of the video content
      Track numberTrack number of the video content
      Bit rateBit rate of the video content
      DurationDuration of the video content
      WidthWidth of the video content
      HeightHeight of the video content
      - -

      Warm-up

      -

      Become familiar with the Media Content API basics by learning about:

      - -

      Follow-up

      -

      Once we have learned the basics of the Media Content API, we can now move on to more advanced tasks, including:

      - - -

      Prerequisites

      - -

      To enable your application to use the media content functionality:

      -
        -
      1. -

        To use the Media Content API (in mobile and wearable applications), the application has to request permission by adding the following privileges to the tizen-manifest.xml file:

        -
        -<privileges>
        -   <!--To insert content-->
        -   <privilege>http://tizen.org/privilege/content.write</privilege>
        -   <!--To access a storage to insert content-->
        -   <privilege>http://tizen.org/privilege/mediastorage</privilege>
        -</privileges>
        -
        -
      2. -
      3. Media Content functions use a SQLite database to save the metadata of the media files on the user device, along with the tags and bookmarks that the user sets. To use the functions and data types of the Media Content API, include the <media_content.h> header file in your application:

        -
        -#include <media_content.h>
        -#include <glib.h>
        -
        -

        The example application used in the use cases also requires the <glib.h> header file.

        -
      4. -
      5. Connect to the database: -
        -int ret = MEDIA_CONTENT_ERROR_NONE;
        -
        -ret = media_content_connect();
        -if (ret == MEDIA_CONTENT_ERROR_NONE)
        -    dlog_print(DLOG_DEBUG, LOG_TAG, "connection is success");
        -else
        -    dlog_print(DLOG_ERROR, LOG_TAG, "connection failed");
        -
        -return ret;
        -
      6. -
      7. -

        When you no longer use the database, disconnect from it:

        -
        -media_content_disconnect();
        -
        -
      8. -
      +return ret; +
    6. +
    7. +

      When you no longer use the database, disconnect from it:

      +
      +media_content_disconnect();
      +
      +
    8. +

    Getting the Folder List

    @@ -2349,6 +1893,355 @@ media_cb(media_info_h media, void *user_data) } +

    Media Information

    +

    You can get the media data from the media database using the media_info_foreach_media_from_db() function.

    +

    After that, you can get the general information of media and specific information of each media type.

    + +

    The following tables list the information available about the media files.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Table: General information +
    Metadata nameDescription
    Media IDID of the media content
    File pathPath of the media content
    Display nameDisplay name of the media content
    Media typeThe media type of the media content
    Mime typeMime type of the media content
    SizeFile size of the media content
    Added timeThe time the media content was added in the database
    Modified timeThe last modification time of the media content
    TimelineThe time the media content was created +

    You can use this value to sort the content.

    Thumbnail pathPath of the stored thumbnail image of the media content
    DescriptionDescription of the media content
    LongitudeLongitude of the media content
    LatitudeLatitude of the media content
    AltitudeAltitude of the media content
    WeatherWeather information of the media content
    RatingRating of the media content
    FavoriteFavorite of the media content
    AuthorThe author of the media content
    ProviderProvider of the media content
    Content nameContent name of the media content
    TitleTitle of the media content
    CategoryCategory of the media content
    Location tagLocation tag of the media content
    Age ratingAge rating of the media content
    KeywordKeyword of the media content
    Is DRMCheck flag for DRM content
    Storage typeStorage type of the media content
    Played countPlayed count of the media content
    Played timeLast played time of the media content
    Played positionLast played position of the media content
    + +

    For metadata of an audio file, call the media_info_get_audio() function with the media handle.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Table: Audio metadata (only for audio files) +
    Metadata nameDescription
    Media IDMedia ID of the audio content +

    This value is same as the media ID in general information.

    AlbumAlbum information of the audio content
    ArtistArtist of the audio content
    Album ArtistAlbum artist of the audio content +

    The artist and album artist can be the same.

    GenreGenre of the audio content
    ComposerComposer of the audio content
    YearThe year the audio content was created
    Recorded dateThe date the audio content was recorded
    CopyrightCopyright information of the audio content
    Track numberTrack number of the audio content
    Bit rateBit rate of the audio content
    Bit per sampleBit per sample of the audio content +

    The bit per sample is the same as the sample format. The sample format is the number of digits in the digital representation of each sample.

    Sample rateSample rate of the audio content
    ChannelChannel information of the audio content
    DurationDuration of the audio content
    + +

    For metadata of an image file, call the media_info_get_image() function with the media handle.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Table: Image metadata (only for image files) +
    Metadata nameDescription
    Media IDMedia ID of the image +

    This value is the same as the media ID in the general information.

    WidthWidth of the image
    HeightHeight of the image
    Exposure timeExposure time of the image
    F-numberF-number of the image
    ISOISO information of the image
    ModelModel name of the image
    OrientationOrientation information of the image
    Date takenThe time the image was created +

    You can get this information from the EXIF tag. If there is no EXIF tag for the image, set the created time in the file system.

    Is burstshotCheck flag for a burst shot of the image +

    The burst shot is a continuous shooting mode.

    Burstshot IDID of a burst shot image +

    Assign the same ID to the burst shooting mode.

    +

    For metadata of a video file, call withmedia_info_get_video() function with the media handle.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Table: Video metadata (only for video files) +
    Metadata nameDescription
    Media IDThe media ID of the video content +

    This value is same with media ID of general information.

    AlbumAlbum of the video content
    ArtistArtist of the video content
    Album artistAlbum artist of the video content
    GenreGenre of the video content
    ComposerMedia composer of the video content
    YearThe year the video content was created
    Recorded dateThe date the video content was recorded
    CopyrightCopyright of the video content
    Track numberTrack number of the video content
    Bit rateBit rate of the video content
    DurationDuration of the video content
    WidthWidth of the video content
    HeightHeight of the video content
    + + diff --git a/org.tizen.guides/html/native/media/media_controller_n.htm b/org.tizen.guides/html/native/media/media_controller_n.htm index f6f9e6e..1dbd682 100644 --- a/org.tizen.guides/html/native/media/media_controller_n.htm +++ b/org.tizen.guides/html/native/media/media_controller_n.htm @@ -42,21 +42,21 @@

    Media Controller

    -

    Tizen enables you to communicate between the media controller server and the media controller client. You can send commands from the client to the server, and the client can request updated metadata and playback information from the server.

    +

    Tizen enables you to communicate between the media controller server and the media controller client. You can send commands from the client to the server, and the client can request updated metadata and playback information from the server.

    -

    This feature is supported in mobile applications only.

    +

    This feature is supported in mobile applications only.

    The main features of the Media Controller API include:

    - -
      -
    • Media controller server -

      The media controller server provides current information about the registered application that you can send to the client.

      -

      To transfer the information at the client request, the media controller server updates the state information while the application is active. If the application is terminated when the client request arrives, the media controller server transfers the latest information.

      -
    • -
    • Media controller client -

      You can request information, and the media controller client can receive it from the media controller server through a callback.

      -

      The following tables define the various information the client can receive.

      - +
        +
      • Updating and retrieving information +

        You can update the metadata and playback information on the server side, and then retrieve the metadata and playback information on the client side.

        +

        The media controller server provides current information about the registered application that you can send to the client.

        +

        To transfer the information at the client request, the media controller server updates the state information while the application is active. If the application is terminated when the client request arrives, the media controller server transfers the latest information.

      • +
      • Sending and processing commands +

        You can send a command to the server from the client side, and then process the command on the server side.

        +

        The client can request information from the server, and receive it through a callback.

        +

        The following tables define the various information the client can receive.

        +
      @@ -192,21 +192,6 @@
      Table: Media controller server state attributes
    -

    Before you start, remember to prepare your application to use the media controller functionality.

    - -

    Warm-up

    - -

    Become familiar with the Media Controller API basics by learning about:

    - -
      -
    • Prerequisites -

      Prepare your application to use the media controller functionality.

    • -
    • Updating and Retrieving Information -

      Update the metadata and playback information on the server side, and then retrieve the metadata and playback information on the client side.

    • -
    • Sending and Processing Commands -

      Send a command to the server from the client side, and then process the command on the server side.

    • -
    -

    Prerequisites

    To enable your application to use the media controller functionality:

    diff --git a/org.tizen.guides/html/native/media/media_conversions_n.htm b/org.tizen.guides/html/native/media/media_conversions_n.htm index 53bfe12..f327a27 100644 --- a/org.tizen.guides/html/native/media/media_conversions_n.htm +++ b/org.tizen.guides/html/native/media/media_conversions_n.htm @@ -30,13 +30,19 @@
  • Media Codecs
  • Video Transcoding
  • Prerequisites
  • -
  • Preparing Media Codecs
  • -
  • Filling the Media Packet with Data
  • -
  • Running the Media Codec
  • -
  • Preparing the Video Utilities
  • -
  • Managing Transcoding
  • -
  • Setting Parameters
  • -
  • Monitoring the Transcoding Progress
  • +
  • Media codecs +
  • +
  • VIdeo transcoding +
  • Related Info

      @@ -51,6 +57,13 @@

      Media Conversions

      You can perform various media conversions through codecs. You can encode and decode video and audio data, and, in mobile applications, you can also use video transcoding features, such as multi-format codec and output format.

      +

      The main features of the Media Codec and Video Util API include:

      +
        +
      • Media codecs +

        You can prepare the media codecs, fill the media packet with data, and run the media codec.

      • +
      • Video transcoding +

        You can prepare the video utilities, manage and monitor video transcoding, and set parameters.

      • +

      Media Codecs

      @@ -65,8 +78,6 @@
    • Decode and encode with the mediacodec_process_input() and mediacodec_get_output() functions.

    • -

      Before you start, remember to prepare your application to use the media codec functionality.

      -

      A single MediaCodec instance handles 1 specific type of data (such as aac audio or H.264 video), and can encode or decode. The codec operates on "raw" data, so strip off any file headers (such as ID3 tags).

      @@ -98,8 +109,6 @@
    • Set parameters for the video utilities
    • Retrieve information about the transcoding process
    -

    Before you start, remember to prepare your application to use the video utilities.

    -

    The following figure shows the result of the video file size change (due to scaling and container and codec format change).

    Figure: Transcoder

    @@ -194,36 +203,6 @@ -

    Warm-up

    - -

    Become familiar with the Media Codec and Video Util API basics by learning about:

    - - - -

    Follow-up

    - -

    Once we have learned the basics of the Video Util API, we can now move on to more advanced tasks, including:

    - - -

    Prerequisites

    To enable your application to use the media conversion functionalities:

    diff --git a/org.tizen.guides/html/native/media/media_cover_n.htm b/org.tizen.guides/html/native/media/media_cover_n.htm index c1e57d2..a1718a3 100644 --- a/org.tizen.guides/html/native/media/media_cover_n.htm +++ b/org.tizen.guides/html/native/media/media_cover_n.htm @@ -63,11 +63,15 @@
  • Media Playback -

    You can manage the playback of different media file types. You can play audio and video files, tones, and uncompressed audio files. You can also manage the state of the media player.

  • +

    You can manage the playback of different media file types. You can play audio and video files, and tones. You can also manage the state of the media player.

  • Media Recording -

    You can manage the recording of different media file types. You can record audio data to a file with compressed or uncompressed format and generate compressed video files using video data from a camera and audio data from an audio input device.

  • +

    You can manage the recording of different media file types. You can record audio data to a file and generate compressed video files using video data from a camera and audio data from an audio input device.

    + +
  • Raw Audio Playback and Recording + +

    You can play and record uncompressed audio data both synchronously and asynchronously. You can record audio data from a microphone type input device to a file.

  • Media Controller in mobile applications only @@ -93,7 +97,7 @@

    You can mux encoded media into a multiplexed stream and parse multiplexed media streams. You can use various types of media streams, such as audio, video, and text.

  • -
  • Media Streams +
  • Media Stream Playback

    You can play and stream audio and video content. You can play audio and video content locally, or stream content from a server using IP protocol.

  • diff --git a/org.tizen.guides/html/native/media/media_handle_n.htm b/org.tizen.guides/html/native/media/media_handle_n.htm index 90ad8f2..f030a35 100644 --- a/org.tizen.guides/html/native/media/media_handle_n.htm +++ b/org.tizen.guides/html/native/media/media_handle_n.htm @@ -30,6 +30,7 @@
  • Prerequisites
  • Managing the Media Format Handle
  • Managing the Media Packet Handle
  • +
  • Reference Count Design
  • Related Info

      @@ -42,126 +43,18 @@

      Media Handle Management

      -

      Media tool enables your application to manage various media handles.

      +

      Your application can manage various media handles with media tools.

      The main features of the Media Tool API include:

        -
      • Creating the media_format_h handle to specify video or audio information.

        -

        You can set and get video or audio information using the media_format_h handle.

      • -
      • Creating the media_packet_h handle to include metadata (such as pts, dts, and duration) and allocate a buffer to the heap or TBM surface.

        -

        You can set and get the metadata using the created media_packet_h handle. Some media_packet_h metadata are NOT filled after creating the media_packet_h handle: pts, dts, duration, extradata, codec data, codec data size, and buffer flags.

        +
      • Creating the media format handle

        +

        You can set and get video or audio information using the media_format_h handle.

      • +
      • Creating the media packet handle

        +

        You can set and get metadata using the created media_packet_h handle. Some media_packet_h metadata are NOT filled after creating the media_packet_h handle: pts, dts, duration, extradata, codec data, codec data size, and buffer flags.

      -

      Before you start, remember to prepare your application to use the media tool functionality.

      -

      The media_format_h handle is created by the caller, who can set and get the video or audio information. The media_format_h handle creates the media_packet_h handle and allocates the buffer. The caller can set and get the metadata with the media_packet_h handle.

      - -

      The following table describes the reference count design of the media_format_h handle.

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - Table: Media format handle reference count design -
      FunctionReference count numberDescription
      media_format_h fmt1, fmt2, tmp;
      -media_packet_h pkt1, pkt2;
      -media_format_create(&fmt1);
      fmt1: 1Define the media_format_h and media_packet_h handles. -

      Create the fmt1 handle and set the media_format_video_mime() or media_format_audio_mime() function.

      media_packet_create(&pkt1, fmt1);fmt1: 2After the media_packet_create() function, you must use the media_format_unref() function, because the media_packet_create() function increases the media_format_h reference count.
      media_format_unref(fmt1);fmt1: 1If the ref_count is 1, the fmt1 is currently owned by the pkt1 only.
      media_packet_copy(pkt1, &pkt2);fmt1: 2Copy the pkt1 metadata to pkt2, except the allocated buffer and buffer size. pkt2 refers to fmt1, and fmt1 ref_count is increased.
      media_packet_get_format(pkt1, &tmp);fmt1: 3fmt1 ref_count is increased by the media_packet_get_format() function.
      media_format_set_video_mime(tmp, ...);fmt1: 3If you try to modify the fmt1 data (call the media_format_set_video_mime() function) for fmt1 (=tmp), the ref_count is bigger than 1, and fmt1 cannot be modified. -

      To modify the fmt1 data, call the media_format_make_writable() function.

      media_format_make_writable(tmp, &fmt2);fmt1: 2
      - fmt2: 1
      If called, the tmp (fmt1) ref_count is decreased. Creates the fmt2 handle and copies the fmt1 data to fmt2.
      media_format_set_video_mime(fmt2, ...);fmt1: 2
      - fmt2: 1
      fmt2 ref_count is 1, which means that you can modify the fmt2 data.
      media_packet_set_format(pkt2, fmt2);fmt1: 2 -
      - fmt2: 2
      Set the modified fmt2 to the pkt2 handle. You must call the media_format_unref(fmt2) function.
      media_format_unref(tmp);fmt1: 1 -
      - fmt2: 2
      You must call this function because of the media_packet_get_format(pkt1, &tmp) function call.
      media_format_unref(fmt2);fmt1: 1
      - fmt2: 1
      You must call this function because of the media_packet_set_format(pkt2, fmt2) function call.
      media_packet_destroy(pkt1);fmt1: 1 > finalize
      - fmt2: 1
      If you destroy the pkt1 handle, the fmt1 ref_count is decreased. If the ref_count becomes 0, fmt1 is freed.
      media_packet_destroy(pkt2);fmt1: 1 > finalize
      - fmt2: 0 > finalize
      If you destroy the pkt2 handle, the fmt2 ref_count is decreased. If the ref_count becomes 0, fmt2 is freed.
      - -

      Warm-up

      - -

      Become familiar with the Media Tool API basics by learning about:

      - - +

      The media_format_h handle has a specific design for increasing and decreasing its reference count.

      Prerequisites

      @@ -414,6 +307,103 @@ media_packet_destroy(packet); +

      Reference Count Design

      + +

      The following table describes the reference count design of the media_format_h handle.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + Table: Media format handle reference count design +
      FunctionReference count numberDescription
      media_format_h fmt1, fmt2, tmp;
      +media_packet_h pkt1, pkt2;
      +media_format_create(&fmt1);
      fmt1: 1Define the media_format_h and media_packet_h handles. +

      Create the fmt1 handle and set the media_format_video_mime() or media_format_audio_mime() function.

      media_packet_create(&pkt1, fmt1);fmt1: 2After the media_packet_create() function, you must use the media_format_unref() function, because the media_packet_create() function increases the media_format_h reference count.
      media_format_unref(fmt1);fmt1: 1If the ref_count is 1, the fmt1 is currently owned by the pkt1 only.
      media_packet_copy(pkt1, &pkt2);fmt1: 2Copy the pkt1 metadata to pkt2, except the allocated buffer and buffer size. pkt2 refers to fmt1, and fmt1 ref_count is increased.
      media_packet_get_format(pkt1, &tmp);fmt1: 3fmt1 ref_count is increased by the media_packet_get_format() function.
      media_format_set_video_mime(tmp, ...);fmt1: 3If you try to modify the fmt1 data (call the media_format_set_video_mime() function) for fmt1 (=tmp), the ref_count is bigger than 1, and fmt1 cannot be modified. +

      To modify the fmt1 data, call the media_format_make_writable() function.

      media_format_make_writable(tmp, &fmt2);fmt1: 2
      + fmt2: 1
      If called, the tmp (fmt1) ref_count is decreased. Creates the fmt2 handle and copies the fmt1 data to fmt2.
      media_format_set_video_mime(fmt2, ...);fmt1: 2
      + fmt2: 1
      fmt2 ref_count is 1, which means that you can modify the fmt2 data.
      media_packet_set_format(pkt2, fmt2);fmt1: 2 +
      + fmt2: 2
      Set the modified fmt2 to the pkt2 handle. You must call the media_format_unref(fmt2) function.
      media_format_unref(tmp);fmt1: 1 +
      + fmt2: 2
      You must call this function because of the media_packet_get_format(pkt1, &tmp) function call.
      media_format_unref(fmt2);fmt1: 1
      + fmt2: 1
      You must call this function because of the media_packet_set_format(pkt2, fmt2) function call.
      media_packet_destroy(pkt1);fmt1: 1 > finalize
      + fmt2: 1
      If you destroy the pkt1 handle, the fmt1 ref_count is decreased. If the ref_count becomes 0, fmt1 is freed.
      media_packet_destroy(pkt2);fmt1: 1 > finalize
      + fmt2: 0 > finalize
      If you destroy the pkt2 handle, the fmt2 ref_count is decreased. If the ref_count becomes 0, fmt2 is freed.
      + +
      diff --git a/org.tizen.guides/html/native/media/media_key_n.htm b/org.tizen.guides/html/native/media/media_key_n.htm index 5d5dce1..4193dc2 100644 --- a/org.tizen.guides/html/native/media/media_key_n.htm +++ b/org.tizen.guides/html/native/media/media_key_n.htm @@ -42,26 +42,15 @@

      Media Key Events

      -

      Tizen enables you to manage media key events. The media key events are generated by the remote control buttons in a Bluetooth headset or Bluetooth earphone. The media_key_e enumerator (in mobile and wearable applications) defines the available key types.

      +

      Tizen enables you to manage media key events. The media key events are generated by the remote control buttons in a Bluetooth headset or Bluetooth earphone. The media_key_e enumerator (in mobile and wearable applications) defines the available key types.

      The main features of the Media key API include:

      • Registering a callback -

        You can register a callback for media key events using the media_key_reserve() function. The first parameter of the function defines the media_key_event_cb type callback, which you can implement to perform any actions you need.

        +

        You can register a callback for media key events using the media_key_reserve() function. The first parameter of the function defines the media_key_event_cb type callback, which you can implement to perform any actions you need.

      • Deregistering a callback

        You can deregister a callback for media key events using the media_key_release() function.

      -

      Before you start, remember to prepare your application to use the media key functionality.

      - -

      Warm-up

      -

      Become familiar with the Media key API basics by learning about:

      -

      Prerequisites

      diff --git a/org.tizen.guides/html/native/media/media_muxing_n.htm b/org.tizen.guides/html/native/media/media_muxing_n.htm index eecd29c..ca6b03b 100644 --- a/org.tizen.guides/html/native/media/media_muxing_n.htm +++ b/org.tizen.guides/html/native/media/media_muxing_n.htm @@ -49,6 +49,13 @@

      Media Muxing

      You can mux encoded media into a multiplexed stream and parse multiplexed media streams.

      +

      With the Media Muxer and Media Demuxer API you can:

      +
        +
      • Prepare and manage the media muxer +

        You can initialize and configure the media muxer for use, and create threads to use the media muxer.

      • +
      • Prepare and manage the media demuxer +

        You can initialize and configure the media demuxer for use, and create threads to use the media demuxer.

      • +

      Media Muxer

      @@ -133,24 +140,6 @@ - - -

      Warm-up

      - -

      Become familiar with the Media Muxer and Media Demuxer API basics by learning about:

      - -

      Prerequisites

      @@ -266,7 +255,7 @@ test_mediamuxer_write_sample()     pthread_create(&thread[0], &attr, _write_video_data, NULL);     pthread_create(&thread[1], &attr, _write_audio_data, NULL); -    /* Add audio track, which is not given in this tutorial */ +    /* Add audio track, which is not given in this use case */     pthread_attr_destroy(&attr); diff --git a/org.tizen.guides/html/native/media/media_playback_n.htm b/org.tizen.guides/html/native/media/media_playback_n.htm index 571a60d..4534a1f 100644 --- a/org.tizen.guides/html/native/media/media_playback_n.htm +++ b/org.tizen.guides/html/native/media/media_playback_n.htm @@ -31,7 +31,6 @@
    • Video Player
    • Player Features
    • Playback Streams
    • -
    • Uncompressed Audio Output
    • WAV Player
    • Tone Player
    • Prerequisites
    • @@ -41,17 +40,10 @@
    • Playing an Audio File
    • Playing a Video File
    • Stopping the Player and Releasing Resources
    • -
    - -
  • Multi-player - -
  • -
  • Uncompressed audio -
  • WAV player @@ -64,25 +56,14 @@
  • Playing a Tone
  • Playing a Tone for a Specified Duration
  • - -
  • Advanced player -
  • Related Info

      -
    • Audio I/O API for Mobile Native
    • Player API for Mobile Native
    • -
    • Sound Manager API for Mobile Native
    • Tone Player API for Mobile Native
    • WAV Player API for Mobile Native
    • -
    • Audio I/O API for Wearable Native
    • Player API for Wearable Native
    • -
    • Sound Manager API for Wearable Native
    • Tone Player API for Wearable Native
    • WAV Player API for Wearable Native
    • Media Sample Description
    • @@ -94,23 +75,21 @@

      You can play different audio formats and video in your application.

      The main media playback features are:

        -
      • Using the player features -

        Enables you manage the player and control the volume, sound mode, display, stream info, and audio effects.

      • Handling audio

        Enables you to play audio and control the playback.

      • Handling video

        Enables you to play video.

      • +
      • Using the player features +

        Enables you manage the player and control the volume, sound mode, display, stream info, and audio effects.

      • Streaming playback

        Enables you to set specific URLs for streaming media playback.

      • -
      • Playing uncompressed audio -

        Enables you to play uncompressed audio in your application.

      • Using the WAV player

        Enables you to play audio in the wave format.

      • Using the tone player

        Enables you to play tones.

      -

      Before you start, remember to prepare your application to use the player functionality and set up the player.

      +

      Before you start, set up the player.

      Audio Player

      @@ -219,64 +198,6 @@ - -

      Uncompressed Audio Output

      - -

      The Pulse Code Modulated (PCM) data contains non-compressed audio. The Audio Output API (in mobile and wearable applications) enables your application to play such data using output devices. You can play audio synchronously, or do it asynchronously.

      -

      To play the audio PCM data, the application must call the audio_out_create() function to initialize the audio output handle.

      -

      Your application must define the following PCM data settings:

      -
        -
      • Audio channels: -
          -
        • Mono (1 channel)
        • -
        • Stereo (2 channels)
        • -
      • -
      • Audio sample type: -
          -
        • Unsigned 8-bit PCM
        • -
        • Signed 16-bit little endian PCM
        • -
      • -
      • Audio sample rate: -
          -
        • 8000 ~ 48000 Hz
        • -
      • -
      - -

      The following figures illustrate the general audio output states, and how the state changes when the audio output is interrupted by the system.

      -

      Figure: Audio output states

      -

      Audio output states

      -

      Figure: Audio output states when interrupted by system

      -

      Audio output states when interrupted by system

      - -

      Using Audio Output

      -

      For supporting various low-end Tizen devices, the application must follow certain guidelines:

      -
        -
      • Do not use multiple instances of the Audio Output excessively. -
        • Using excessive multiple instances of the Audio Output has a negative effect on the application, because the audio data processing for re-sampling and mixing imposes a heavy burden on the system.
      • -
      • Use device-preferred PCM format. -
          - -
        • To reduce the processing overhead inside, use the target device-preferred PCM format (for example, signed 16-bit little endian, stereo, 44100 Hz).
        • -
        • Using the preferred format reduces internal operations, such as converting audio samples from mono to stereo or re-sampling audio frequency to fit the target device's input sample rate.
        • -
      • -
      • Do not call the Audio Output functions too frequently. -
          -
        • The Audio Output functions require more time while repeated in the order of audio_out_create() > audio_out_prepare() > audio_out_unprepare() > audio_out_destroy(). Therefore, keep the frequency of calling these functions to a minimum. Note that the audio_out_prepare() and audio_out_unprepare() functions are much faster than audio_out_create() and audio_out_destroy().
        • -
      • -
      • Reduce event delay and remove glitches. -
          -
        • The Audio Output API works recursively with events. The smaller the buffer size, the more often are events generated. If you use the Audio Output API with the smallest buffer and other resources (for example, a timer or sensor), the application is negatively influenced by the delay of the event. To prevent problems, set the write buffer size properly based on the other resources you need.
        • -
        • To guarantee the working events of the Audio Output API independently, an instance of the Audio Output API needs to be created and worked on the event thread.
        • -
      • -
      • Use double-buffering. -
          -
        • Use the double buffering mechanism to reduce latency. The mechanism works by first writing data twice before starting. After starting, whenever the listener (event) is called, you can write additional data.
        • -
      • -
      • Save power. -
          -
        • If the Audio Output does not play for a long time for some reason, such as the screen turning off or idle playback, call the audio_out_unprepare() function to pause the stream and save power. The device cannot go to sleep while in the PLAYING state.
        • -
      • -

      WAV Player

      @@ -308,80 +229,11 @@

    You can start and stop playing a tone, and play a tone for a specified duration.

    -

    The following figures illustrate the general tone player state changes.

    Figure: Tone player states

    Tone player states

    -

    Warm-up

    - -

    Become familiar with the Player, Audio I/O and Sound Manager, WAV Player, and Tone Player API basics by learning about:

    - - - -

    Follow-up

    - -

    Once we have learned the basics of the Player API, we can now move on to more advanced tasks, including:

    - - -

    Prerequisites

    To enable your application to use the playback functionality:

    @@ -461,43 +313,6 @@ _set_test_path() } -
  • -

    To use the functions and data types of the Audio I/O (in mobile and wearable applications) and Sound Manager (in mobile and wearable applications) APIs, include the <audio_io.h> and <sound_manager.h> header files in your application:

    -
    -#include <audio_io.h>
    -#include <sound_manager.h>
    -
    -
  • - -
  • To initialize the audio input and output devices, use the audio_in_create() and audio_out_create() functions:

    - -
    -/* Define the sample rate for recording audio */
    -#define SAMPLE_RATE 44100
    -
    -/* Declare the variable used for checking function results */
    -audio_io_error_e error_code;
    -
    -/* Initialize the audio input device */
    -audio_in_h input;
    -
    -error_code = audio_in_create(SAMPLE_RATE, AUDIO_CHANNEL_MONO, AUDIO_SAMPLE_TYPE_S16_LE, &input);
    -
    -/* Initialize the audio output device */
    -audio_out_h output;
    -
    -error_code = audio_out_create(SAMPLE_RATE, AUDIO_CHANNEL_MONO, AUDIO_SAMPLE_TYPE_S16_LE, SOUND_TYPE_SYSTEM, &output);
    -
    -

    The audio input and output devices support the channel types defined in the audio_channel_e enumeration (in mobile and wearable applications), and the sample types defined in the audio_sample_type_e enumeration (in mobile and wearable applications). For playing the recorded audio, use the same channel and sample type in both audio devices.

    - -

    The sound types are defined in the sound_type_e enumeration (in mobile and wearable applications). You can select the sound type according to the audio sample type.

  • -
  • -

    To use the functions and data types of the Tone Player API (in mobile and wearable applications), include the <tone_player.h> and <sound_manager.h> header files in your application:

    -
    -#include <tone_player.h>
    -#include <sound_manager.h>
    -
    -
  • To start using the tone player, declare a player ID variable for identifying the tone player:

    @@ -929,334 +744,6 @@ ret = player_destroy(player_3); -

    Managing Synchronous Playback

    - -

    You can play an audio sample and modify the volume of the playback.

    - - -

    Playing an Audio Sample

    - -

    The synchronous playback process blocks other processes running in the same thread. Launching a playback process from the main thread of the application can make the application unresponsive. To prevent this, launch the playback process from its own thread. For example, in this use case, the playback process is run inside the synchronous_playback() function, which is executed in a separate thread using the ecore_thread_run() function:

    - -
    -ecore_thread_run(synchronous_playback, NULL, NULL, NULL);
    -
    - -

    To play audio:

    - -
      -
    1. Prepare the audio output device and start the playback process using the audio_out_prepare() function:

      - -
      -/* Prepare the audio output device (starts the hardware playback process) */
      -error_code = audio_out_prepare(output);
      -
      - -

      The hardware device prepares its internal output buffer for playback. Playback begins when the internal output buffer starts receiving audio data.

      - -
    2. -
    3. To start playing the recorded audio, copy the audio data from the local buffer to the internal output buffer using the audio_out_write() function:

      - -
      -/* Copy the audio data from the local buffer to the internal output buffer */
      -int bytes_number = audio_out_write(output, buffer, buffer_size);
      -
      -

      The returned value represents the number of bytes written to the internal output buffer. A negative value represents an error code.

      -

      The audio_out_write() function behaves in a similar manner to the audio_in_read() function.

      -
    4. - -
    5. After all data has been copied to the internal output buffer, release the memory allocated to the local buffer using the free() function:

      -
      -/* Release the memory allocated to the local buffer */
      -free(buffer);
      -
    6. - -
    7. Stop the playback process using the audio_out_unprepare() function:

      - -
      -/* Stop the hardware playback process */
      -error_code = audio_out_unprepare(output);
      -
    8. - -
    9. After you have finished working with the audio output device, deinitialize it using the audio_out_destroy() function:

      -
      -/* Deinitialize the audio output device */
      -error_code = audio_out_destroy(output);
      -
    10. -
    - -

    Modifying the Audio Sample Volume

    - - - - - - - - - - -
    Note
    Modifying the volume only works if you have not emptied the local buffer or deinitialized the input audio device.
    - -

    To modify the volume of the audio sample stored in the local buffer:

    - -
    -#define MIN_2BYTES_SIGNED (−32768)
    -#define MAX_2BYTES_SIGNED 32767
    -
    -void
    -modify_sound()
    -{
    -    /* Retrieve the sample type of the input */
    -    audio_sample_type_e sample_type;
    -
    -    int error_code = audio_in_get_sample_type(input, &sample_type);
    -    if (error_code != AUDIO_IO_ERROR_NONE) {
    -        dlog_print(DLOG_ERROR, LOG_TAG, "audio_in_get_sample_type() failed! Error code = %d", error_code);
    -
    -        return;
    -    }
    -
    -    uint8_t *index = (uint8_t*)buffer;
    -    while (index < (((uint8_t*)buffer)+buffer_size)) {
    -        if (AUDIO_SAMPLE_TYPE_S16_LE == sample_type) {
    -            /* Use the int16_t type, because it is 2 bytes long */
    -            int16_t *value = (int16_t*)index;
    -
    -            /* Make the sample louder */
    -            int32_t tmp = (*value) * 8; /* Why not 8 times louder? (on dB scale even much louder) */
    -            if (tmp > MAX_2BYTES_SIGNED)
    -                tmp = MAX_2BYTES_SIGNED;
    -            if (tmp < MIN_2BYTES_SIGNED)
    -                tmp = MIN_2BYTES_SIGNED;
    -            (*value) = tmp;
    -        } else {
    -            /* Use the uint8_t type, because it is 1 byte long */
    -            uint8_t *value = (uint8_t*)index;
    -
    -            /* Make the sample louder */
    -            uint16_t tmp = (*value) * 8; /* Why not 8 times louder? (on dB scale even much louder) */
    -            if (tmp > 255)
    -                tmp = 255;
    -            (*value) = tmp;
    -        }
    -
    -        /* Go to the next sample */
    -        index += sample_type == AUDIO_SAMPLE_TYPE_S16_LE ? 2 : 1;
    -    }
    -
    -    dlog_print(DLOG_DEBUG, LOG_TAG, "Volume of the synchronous recording increased.");
    -}
    -
    - -

    In this example, the volume is significantly increased. You can also make other modifications to the audio sample playback.

    - -

    Managing Asynchronous Playback

    - -

    Playing audio asynchronously involves:

    - -
      -
    1. Starting asynchronous playback

    2. -
    3. Stopping asynchronous playback

    4. -
    - -

    Starting Asynchronous Playback

    - -

    The asynchronous playback process uses a callback function for playing the recorded audio. The callback function is invoked asynchronously for each chunk of recorded audio. In this use case, the audio data is read from a file rather than a local buffer.

    - -

    To start playing the recorded audio:

    - -
    1. -

      Set the callback function using the audio_out_set_stream_cb() function:

      - -
      -/* Set a callback function that is invoked asynchronously for each chunk of stored (recorded) audio */
      -error_code = audio_out_set_stream_cb(output, _audio_io_stream_write_cb, NULL);
      -
      -
    2. -
    3. -

      Open the file where the audio data is stored:

      - -
      -#include <storage.h>
      -
      -/* Prepare the file where the recorded audio data is stored */
      -char io_stream_r_path[200];
      -char *storage_path;
      -/* You can find the storage ID using the storage_foreach_device_supported() function */
      -int error = storage_get_directory(storage_id, STORAGE_DIRECTORY_SOUNDS, &storage_path);
      -snprintf(io_stream_r_path, 200, "%s/%s", storage_path, "pcm_w.raw");
      -free(storage_path);
      -
      -FILE* fp_r = fopen(io_stream_r_path, "r");
      -
      -

      The storage_get_directory() function of the Storage API retrieves the storage path based on the storage ID. To retrieve the storage ID, use the storage_foreach_device_supported() function of the Storage API.

      -
    4. - -
    5. -

      Prepare the audio output device and start the playback process using the audio_out_prepare() function:

      - -
      -/* Prepare the audio output device (starts the hardware playback process) */
      -error_code = audio_out_prepare(output);
      -
      -

      The hardware device prepares its internal output buffer for playback.

      -
    6. -
    7. - -

      To play the audio from the file (inside the callback function):

      -
        - -
      1. Allocate a local buffer for the audio data using the malloc() function. The function returns a pointer to the buffer. Reset the buffer by filling it with zeros using the memset() function.

      2. - -
      3. Read audio data from the file and store the data in the local buffer using the fread() function.

      4. - -
      5. Copy the audio data from the local buffer to the internal output buffer using the audio_out_write() function. Playback begins when the internal output buffer starts receiving the audio data.

      6. - -
      7. Release the memory allocated to the local buffer using the free() function.

      8. - -
      - -
      -/* Callback invoked for each chunk of stored (recorded) audio */
      -void
      -_audio_io_stream_write_cb(audio_out_h handle, size_t nbytes, void *userdata)
      -{
      -    char * buffer = NULL;
      -
      -    if (nbytes > 0) {
      -        /* Allocate and reset a local buffer for reading the audio data from the file */
      -        buffer = malloc(nbytes);
      -        memset(buffer, 0, nbytes);
      -
      -        /* Read audio data from the file and store it in the local buffer */
      -        fread(buffer, sizeof(char), nbytes, fp_r);
      -
      -        /* Copy the audio data from the local buffer to the internal output buffer (starts playback) */
      -        int data_size = audio_out_write(handle, buffer, nbytes);
      -
      -        if (data_size < 0)
      -            dlog_print(DLOG_ERROR, LOG_TAG, "audio_out_write() failed! Error code = %d", data_size);
      -
      -        /* Release the memory allocated to the local buffer */
      -        free(buffer);
      -    }
      -}
      -
    - -

    Stopping Asynchronous Playback

    - -

    To stop playing the recorded audio:

    - -
    1. Stop the playback process using the audio_out_unprepare() function:

      - -
      -/* Stop the hardware playback process */
      -error_code = audio_out_unprepare(output);
      -
      -

      The device no longer invokes the callback function.

      -
    2. -
    3. -

      If you no longer need asynchronous playback, or if you want to set the callback function separately for each asynchronous playback session, unset the callback function using the audio_out_unset_stream_cb() function:

      - -
      -/* Unset the callback function used for asynchronous playback */
      -error_code = audio_out_unset_stream_cb(output);
      -
      -
    4. - -
    5. After you have finished working with the audio output device, deinitialize it using the audio_out_destroy() function:

      -
      -/* Deinitialize the audio output device */
      -error_code = audio_out_destroy(output);
      -
    6. - -
    7. -

      Close the file where the recorded audio is stored using the fclose() function:

      -
      -/* Close the file used for asynchronous playback */
      -error_code = fclose(fp_r);
      -fp_r = NULL;
      -
      -
    8. -
    - -

    Starting and Stopping the WAV Player

    - -

    To start and stop the WAV player:

    - -
      - -
    1. -

      To start the WAV player, use the wav_player_start() function.

      -

      The third parameter defines a callback that is invoked when the player finishes playback. Implement the callback and handle any post-playback actions in it.

      -

      The final parameter returns the WAV player ID, which you need to stop the player.

      -
      -static void
      -_playback_completed_cb(int id, void *user_data)
      -{
      -    const char* path = (const char*)user_data;
      -    dlog_print(DLOG_INFO, "WAV Player", "Completed! [id:%d, path:%s]", id, path);
      -}
      -
      -void
      -main()
      -{
      -    int wav_player_id;
      -    wav_player_error_e ret;
      -    const char* wav_path = "PATH OF YOUR WAV FILE";
      -
      -    ret = wav_player_start(wav_path, SOUND_TYPE_MEDIA, _playback_completed_cb, (void*)wav_path, &wav_player_id);
      -}
      -
      -

      To set the path of your WAV file, you may need to retrieve the default path for audio files. For more information, see the Data Storages guide.

      -
    2. - -
    3. -

      To stop the WAV player, use the wav_player_stop() function with the ID of the WAV player:

      -
      -void
      -my_stop()
      -{
      -    wav_player_error_e ret;
      -    ret = wav_player_stop(wav_player_id);
      -}
      -
      -
    4. - -
    - -

    Playing a Tone

    - -

    To start and stop playing a tone:

    - -
      - -
    1. -

      To start playback, use the tone_player_start() function.

      -

      The tone_type_e (in mobile and wearable applications) and sound_type_e (in mobile and wearable applications) enumerators define the available values for the tone type (first parameter) and sound type (second parameter).

      -
      -tone_player_start(TONE_TYPE_DEFAULT, SOUND_TYPE_MEDIA, -1, &tone_player_id);
      -
      -

      The player ID is assigned and returned if the function succeeds. The ID of the tone player that starts first is 0, the ID of the second one is 1, and so on. If you set the player ID parameter to NULL, the ID is not returned.

      -
    2. - -
    3. -

      To stop playback, use the tone_player_stop() function with the ID of the player you want to stop:

      -
      -tone_player_stop(tone_player_id);
      -
      -
    4. - -
    - -

    Playing a Tone for a Specified Duration

    - -

    To play a tone for a specified duration, use the tone_player_start() function with the duration (third parameter) set to the number of milliseconds you want playback to last:

    -
    -tone_player_start(TONE_TYPE_SUP_CONGESTION, SOUND_TYPE_CALL, 1000, &tone_player_id);
    -
    -

    When you set the duration to a specified time, playback stops automatically after that time. You can also stop playback manually using the tone_player_stop() function.

    Configuring the Video Playback Display

    @@ -1486,6 +973,84 @@ free(path);
  • + +

    Starting and Stopping the WAV Player

    + +

    To start and stop the WAV player:

    + +
      + +
    1. +

      To start the WAV player, use the wav_player_start() function.

      +

      The third parameter defines a callback that is invoked when the player finishes playback. Implement the callback and handle any post-playback actions in it.

      +

      The final parameter returns the WAV player ID, which you need to stop the player.

      +
      +static void
      +_playback_completed_cb(int id, void *user_data)
      +{
      +    const char* path = (const char*)user_data;
      +    dlog_print(DLOG_INFO, "WAV Player", "Completed! [id:%d, path:%s]", id, path);
      +}
      +
      +void
      +main()
      +{
      +    int wav_player_id;
      +    wav_player_error_e ret;
      +    const char* wav_path = "PATH OF YOUR WAV FILE";
      +
      +    ret = wav_player_start(wav_path, SOUND_TYPE_MEDIA, _playback_completed_cb, (void*)wav_path, &wav_player_id);
      +}
      +
      +

      To set the path of your WAV file, you may need to retrieve the default path for audio files. For more information, see the Data Storages guide.

      +
    2. + +
    3. +

      To stop the WAV player, use the wav_player_stop() function with the ID of the WAV player:

      +
      +void
      +my_stop()
      +{
      +    wav_player_error_e ret;
      +    ret = wav_player_stop(wav_player_id);
      +}
      +
      +
    4. + +
    + +

    Playing a Tone

    + +

    To start and stop playing a tone:

    + +
      + +
    1. +

      To start playback, use the tone_player_start() function.

      +

      The tone_type_e (in mobile and wearable applications) and sound_type_e (in mobile and wearable applications) enumerators define the available values for the tone type (first parameter) and sound type (second parameter).

      +
      +tone_player_start(TONE_TYPE_DEFAULT, SOUND_TYPE_MEDIA, -1, &tone_player_id);
      +
      +

      The player ID is assigned and returned if the function succeeds. The ID of the tone player that starts first is 0, the ID of the second one is 1, and so on. If you set the player ID parameter to NULL, the ID is not returned.

      +
    2. + +
    3. +

      To stop playback, use the tone_player_stop() function with the ID of the player you want to stop:

      +
      +tone_player_stop(tone_player_id);
      +
      +
    4. + +
    + +

    Playing a Tone for a Specified Duration

    + +

    To play a tone for a specified duration, use the tone_player_start() function with the duration (third parameter) set to the number of milliseconds you want playback to last:

    +
    +tone_player_start(TONE_TYPE_SUP_CONGESTION, SOUND_TYPE_CALL, 1000, &tone_player_id);
    +
    +

    When you set the duration to a specified time, playback stops automatically after that time. You can also stop playback manually using the tone_player_stop() function.

    + diff --git a/org.tizen.guides/html/native/media/media_recording_n.htm b/org.tizen.guides/html/native/media/media_recording_n.htm index 12f0e39..0fa8da1 100644 --- a/org.tizen.guides/html/native/media/media_recording_n.htm +++ b/org.tizen.guides/html/native/media/media_recording_n.htm @@ -27,7 +27,6 @@

    Content

    Related Info

      -
    • Audio I/O API for Mobile Native
    • Camera API for Mobile Native
    • Recorder API for Mobile Native
    • -
    • Audio I/O API for Wearable Native
    • Camera API for Wearable Native
    • Recorder API for Wearable Native
    • Media Sample Description
    • @@ -67,17 +58,13 @@

      Tizen offers basic recorder features, including an audio and video recorder.

      The main features of the Recorder API include:

      -
        -
      • Basic recording functionalities (record, stop, pause, cancel, and mute). -
      • -
      • Setting the maximum recording time and size
      • -
      • Controlling the system volume level
      • + -

        To record audio or record a video, you need to prepare the audio recorder or the video recorder.

        - -

        Before you start, remember to prepare your application to use the recorder functionality.

        -

        The following file formats are supported:

        • Video: mp4 and 3gp
        • @@ -100,87 +87,10 @@ While running applications on the Emulator, audio-video synchronization errors can occur due to the computer performance. - - -

          Recording Uncompressed Audio

          - -

          The Pulse Code Modulated (PCM) data contains non-compressed audio. The Audio Input API (in mobile and wearable applications) enables your application to record such data from a microphone type input device. You can record audio synchronously, or do it asynchronously.

          - -

          Before you start, remember to prepare your application to use the audio input functionalities.

          - -

          Audio data is captured periodically, so to receive the audio PCM data from the input device, you must implement the audio input interface to notify the application of audio data events, such as the end of filling audio data.

          -

          Before recording audio, you must define the following PCM data settings:

          -
            -
          • Input device type: -
              -
            • Microphone
            • -
          • -
          • Audio channels: -
              -
            • Mono (1 channel)
            • -
            • Stereo (2 channels)
            • -
          • -
          • Audio sample type: -
              -
            • Unsigned 8-bit PCM
            • -
            • Signed 16-bit little endian PCM
            • -
          • -
          • Audio sample rate: -
              -
            • 8000 ~ 48000 Hz
            • -
          • -
          -

          To minimize the overhead of the audio input API, use the optimal channel type, sample type and sampling rate, which can be retrieved using the audio_in_get_channel(), audio_in_get_sample_type() and audio_in_get_sample_rate() functions, respectively.

          - - -

          The following figures illustrate the general audio input states, and how the state changes when the audio input is interrupted by the system.

          -

          Figure: Audio input states

          -

          Audio input states

          -

          Figure: Audio input states when interrupted by system

          -

          Audio input states when interrupted by system

          - -

          Warm-up

          - -

          Become familiar with the Recorder, Camera, and Audio I/O API basics by learning about:

          - - - +

          Prerequisites

          - -

          To enable your application to use the recording functionality:

          -
            -
          1. To use the functions and data types of the Recorder (in mobile and wearable applications) and Camera (in mobile and wearable applications) APIs, include the <camera.h> and <recorder.h> header files in your application:

             #include <recorder.h>
            @@ -190,38 +100,6 @@
             #include <unistd.h>
             

            In this guide, you also need the <stdio.h> and <unistd.h> header files to use standard file input and output functions and system calls.

            -
          2. -
          3. -

            To use the functions and data types of the Audio I/O (in mobile and wearable applications) and Sound Manager (in mobile and wearable applications) APIs, include the <audio_io.h> and <sound_manager.h> header files in your application:

            -
            -#include <audio_io.h>
            -#include <sound_manager.h>
            -
            -
          4. - -
          5. To initialize the audio input and output devices, use the audio_in_create() and audio_out_create() functions:

            - -
            -/* Define the sample rate for recording audio */
            -#define SAMPLE_RATE 44100
            -
            -/* Declare the variable used for checking function results */
            -audio_io_error_e error_code;
            -
            -/* Initialize the audio input device */
            -audio_in_h input;
            -
            -error_code = audio_in_create(SAMPLE_RATE, AUDIO_CHANNEL_MONO, AUDIO_SAMPLE_TYPE_S16_LE, &input);
            -
            -/* Initialize the audio output device */
            -audio_out_h output;
            -
            -error_code = audio_out_create(SAMPLE_RATE, AUDIO_CHANNEL_MONO, AUDIO_SAMPLE_TYPE_S16_LE, SOUND_TYPE_SYSTEM, &output);
            -
            -

            The audio input and output devices support the channel types defined in the audio_channel_e enumeration (in mobile and wearable applications), and the sample types defined in the audio_sample_type_e enumeration (in mobile and wearable applications). For playing the recorded audio, use the same channel and sample type in both audio devices.

            - -

            The sound types are defined in the sound_type_e enumeration (in mobile and wearable applications). You can select the sound type according to the audio sample type.

          -

          Preparing the Audio Recorder

          @@ -835,281 +713,6 @@ error_code = recorder_destroy(rec_data.recorder); -

          Managing Synchronous Recording

          - -

          Recording audio synchronously involves:

          - -
            -
          1. Creating a local buffer for storing the audio data

          2. -
          3. Recording an audio sample

          4. -
          - -

          Creating a Buffer for Audio Data

          - -

          Before starting the synchronous recording process, you need to create a local buffer for storing the audio data. To create the buffer, you need to know its required size based on the expected duration of the recording, since the recording process ends when the buffer is full.

          - -

          To determine the required buffer size, use one of the following options:

          - -
            - -
          • To determine the required buffer size based on what is recommended by the Audio I/O API:

            - -
            1. -

              Retrieve the recommended buffer size using the audio_in_get_buffer_size() function. The function retrieves the buffer size recommended by the sound server (such as PulseAudio).

              - -
              -int buffer_size;
              -
              -error_code = audio_in_get_buffer_size(input, &buffer_size);
              -
              - -

              If no error occurs, the buffer_size parameter returns the preferred size of the buffer that must be allocated (in bytes), based on the specified audio parameters.

              - -

              The recommended buffer size depends on the device. The size can be different for TV, mobile, and wearable devices.

              -
            2. - -
            3. - -

              Set the buffer size to correspond to the desired duration of the recording.

              - -

              For example, for the device used in creating this example code, the audio_in_get_buffer_size() function returns the recommended buffer size for 100 milliseconds of recording time. To determine the actual, required buffer size in seconds, multiply the recommended buffer size by 10 (to increase the duration from 100 milliseconds to 1 second) and by the number of seconds the recording lasts (here, 5 seconds):

              - -
              -#define RECORDING_SEC 5
              -
              -buffer_size *= 10 * RECORDING_SEC;
              -
              - -
            4. - -
          • -
          • -

            To explicitly calculate the required buffer size:

            - -
              - -
            1. -

              Retrieve the audio channel type using the audio_in_get_channel() function:

              - -
              -audio_channel_e channel;
              -
              -error_code = audio_in_get_channel(input, &channel);
              -
              -
            2. - -
            3. -

              Retrieve the audio sample type using the audio_in_get_sample_type() function:

              - -
              -audio_sample_type_e sample_type;
              -
              -error_code = audio_in_get_sample_type(input, &sample_type);
              -
              -
            4. - -
            5. -

              Calculate the buffer size based on the retrieved information:

              - -
              -int buffer_size = SAMPLE_RATE * (channel == AUDIO_CHANNEL_STEREO ? 2 : 1) * (sample_type == AUDIO_SAMPLE_TYPE_S16_LE ? 2 : 1);
              -
              -
            6. - -
            7. -

              Multiply the buffer size by the number of seconds the recording lasts:

              - -
              -buffer_size *= RECORDING_SEC;
              -
              -
            8. -
          - -

          After determining the required buffer size, allocate the memory to the buffer using the malloc() function:

          - -
          -void *buffer = malloc(buffer_size);
          -
          - -

          You have created the local buffer for storing the audio data. You can now start the synchronous recording process.

          - -

          Recording an Audio Sample

          - -

          The synchronous recording process blocks other processes running in the same thread. Launching a recording process from the main thread of the application can make the application unresponsive. To prevent this, launch the recording process from its own thread. For example, in this use case, the recording process is run inside the synchronous_playback() function, which is executed in a separate thread using the ecore_thread_run() function:

          - -
          -ecore_thread_run(synchronous_playback, NULL, NULL, NULL);
          -
          - -

          To record audio:

          - -
          1. -

            Prepare the audio input device and start the recording process using the audio_in_prepare() function:

            - -
            -/* Prepare the audio input device (starts the hardware recording process) */
            -error_code = audio_in_prepare(input);
            -
            -

            The hardware device starts buffering the audio recorded by the audio input device. The audio data is buffered to the internal input buffer.

            -
          2. -
          3. Copy the audio data from the internal input buffer to the local buffer using the audio_in_read() function:

            - -
            -/* Copy the audio data from the internal input buffer to the local buffer */
            -int bytes_number = audio_in_read(input, buffer, buffer_size);
            -
            - -

            The returned value represents the number of bytes read from the internal input buffer. A negative value represents an error code.

            - -

            The audio_in_read() function can behave in the following ways:

            -
              -
            • If the function is called immediately after preparing the audio input device, the function blocks the thread it is launched from until the local buffer is full.
            • -
            • If the function is called with a delay long enough to allow the internal input buffer to store more audio data than the local buffer can hold, the function executes immediately without blocking its thread.
            - -

            The audio_in_read() function fills the local buffer by copying audio data from the internal input buffer. If the internal input buffer does not contain enough data to fill up the local buffer, the function waits until enough data is recorded. If you want to start recording audio immediately after clicking a button, call the audio_in_prepare() function just before the audio_in_read() function inside the same button callback function. If you prepare the audio input device earlier in a separate function and only run the audio_in_read() function inside the button callback function, the local buffer is filled with audio data recorded before the button is clicked.

            -
          4. - -
          5. Stop the recording process using the audio_in_unprepare() function:

            - -
            -/* Stop the hardware recording process */
            -error_code = audio_in_unprepare(input);
            -
          6. - -
          7. After you have finished working with the audio input device, deinitialize it using the audio_in_destroy() function:

            -
            -/* Deinitialize the audio input device */
            -error_code = audio_in_destroy(input);
            -
          8. -
          - -

          Managing Asynchronous Recording

          - -

          Recording audio asynchronously involves:

          - -
            -
          1. Starting asynchronous recording

          2. -
          3. Stopping asynchronous recording

          4. -
          - -

          Starting Asynchronous Recording

          - -

          The asynchronous recording process uses a callback function for storing the audio recorded by the audio input device. The callback function is invoked asynchronously for each chunk of recorded audio. In this use case, the audio data is stored in a file rather than a local buffer.

          - -

          To start recording audio:

          - -
          1. Set the callback function using the audio_in_set_stream_cb() function. Use this function before calling the audio_in_prepare() function, because otherwise the callback function is never invoked.

            - -
            -/* Set a callback function that is invoked asynchronously for each chunk of recorded audio */
            -error_code = audio_in_set_stream_cb(input, _audio_io_stream_read_cb, NULL);
            -
            -
          2. - -
          3. -

            Create and open the file for storing the audio data:

            - -
            -#include <storage.h>
            -
            -/* Prepare the file where the recorded audio data is stored */
            -char io_stream_w_path[200];
            -char *storage_path;
            -/* You can find the storage ID using the storage_foreach_device_supported() function */
            -int error = storage_get_directory(storage_id, STORAGE_DIRECTORY_SOUNDS, &storage_path);
            -snprintf(io_stream_w_path, 200, "%s/%s", storage_path, "pcm_w.raw");
            -free(storage_path);
            -
            -FILE* fp_w = fopen(io_stream_w_path, "w");
            -if (!fp_w)
            -    dlog_print(DLOG_ERROR, LOG_TAG, "fopen() function failed while opening %s file!", io_stream_w_path);
            -
            -

            The storage_get_directory() function of the Storage API (in mobile and wearable applications) retrieves the storage path based on the storage ID. To retrieve the storage ID, use the storage_foreach_device_supported() function of the Storage API.

            -
          4. - -
          5. -

            Prepare the audio input device and start the recording process using the audio_in_prepare() function:

            - -
            -/* Prepare the audio input device (starts the hardware recording process) */
            -error_code = audio_in_prepare(input);
            -
            - -

            The hardware device starts buffering the audio recorded by the audio input device. The audio data is buffered to the internal input buffer. The callback function is invoked separately for each chunk of audio data.

            -
          6. - -
          7. -

            To store the recorded audio data in the file (inside the callback function):

            -
              -
            1. Retrieve a pointer to the internal input buffer and the number of recorded audio data bytes using the audio_in_peek() function.
            2. -
            3. Retrieve the recorded audio data from the internal input buffer and store it in the file using the fwrite() function.
            4. -
            5. Remove the recorded audio data, since it is no longer needed, from the internal input buffer using the audio_in_drop() function.
            6. -
            - -
            -/* Callback invoked for each chunk of recorded audio */
            -void
            -_audio_io_stream_read_cb(audio_in_h handle, size_t nbytes, void *userdata)
            -{
            -    const void * buffer = NULL;
            -
            -    if (nbytes > 0) {
            -        /* Retrieve a pointer to the internal input buffer and the number of recorded audio data bytes */
            -        int error_code = audio_in_peek(handle, &buffer, &nbytes);
            -        if (error_code != AUDIO_IO_ERROR_NONE) {
            -            dlog_print(DLOG_ERROR, LOG_TAG, "audio_in_peek() failed! Error code = %d", error_code);
            -
            -            return;
            -        }
            -
            -        /* Store the recorded audio data in the file */
            -        fwrite(buffer, sizeof(char), nbytes, fp_w);
            -
            -        /* Remove the recorded audio data from the internal input buffer */
            -        error_code = audio_in_drop(handle);
            -        if (error_code != AUDIO_IO_ERROR_NONE)
            -            dlog_print(DLOG_ERROR, LOG_TAG, "audio_in_drop() failed! Error code = %d", error_code);
            -    }
            -}
            -
          8. -
          - -

          Stopping Asynchronous Recording

          - -

          To stop recording audio:

          - -
          1. Stop the recording process using the audio_in_unprepare() function:

            - -
            -/* Stop the hardware recording process */
            -error_code = audio_in_unprepare(input);
            -
            -

            The device no longer invokes the callback function.

            -
          2. -
          3. -

            If you no longer need asynchronous recording, or if you want to set the callback function separately for each asynchronous recording session, unset the callback function using the audio_in_unset_stream_cb() function:

            -
            -/* Unset the callback function used for asynchronous recording */
            -error_code = audio_in_unset_stream_cb(input);
            -
            -
          4. - -
          5. After you have finished working with the audio input device, deinitialize it using the audio_in_destroy() function:

            -
            -/* Deinitialize the audio input device */
            -error_code = audio_in_destroy(input);
            -
          6. - -
          7. Close the file where the recorded audio is stored using the fclose() function:

            - -
            -/* Close the file used for asynchronous recording */
            -error_code = fclose(fp_w);
            -fp_w = NULL;
            -
            -
          8. - -
          diff --git a/org.tizen.guides/html/native/media/media_streams_n.htm b/org.tizen.guides/html/native/media/media_streams_n.htm index 475634e..aa98bf2 100644 --- a/org.tizen.guides/html/native/media/media_streams_n.htm +++ b/org.tizen.guides/html/native/media/media_streams_n.htm @@ -10,7 +10,7 @@ - Media Streams + Media Stream Playback @@ -27,11 +27,11 @@

        Content

    -

    Media Streams

    +

    Media Stream Playback

    Tizen enables you to use media streamer functionalities, such as playing video content and streaming video and audio over an IP. Media streaming allows you to stream content in 1 or both directions.

    @@ -68,28 +68,17 @@

    The main features of the Media Streamer API include:

    -
      -
    • -

      Creating the media streamer

      -

      You can create a media streamer handle used for linking content source and sink elements in server and client parts.

      -
    • -
    • -

      Plugging media streamer nodes in manual or autoplug mode

      -

      You can create a chain of media streamer nodes to properly play a video file or combine the server and client parts for streaming the content. This can be done manually or automatically within the Media Streamer framework.

      -
    • -
    • -

      Managing the media streamer parameters

      -

      You can set a number of parameters to properly play a video file or combine the server and client parts for playing or streaming the content. You can also get a number of parameters from the media streamer nodes to find out the characteristics of playing or streaming the content.

      -
    • -
    • -

      Playing files with the media streamer

      -

      You can play video files or launch content streaming over IP.

      -
    • -
    • -

      Destroying the media streamer

      -

      When no longer needed, you can destroy the media streamer handle used for linking content source and sink elements.

      -
    • +
    • Creating the media streamer +

      You can create a media streamer handle used for linking content source and sink elements in server and client parts.

    • +
    • Plugging media streamer nodes in manual or autoplug mode +

      You can create a chain of media streamer nodes to properly play a video file or combine the server and client parts for streaming the content. This can be done manually or automatically within the Media Streamer framework.

    • +
    • Managing the media streamer parameters +

      You can set a number of parameters to properly play a video file or combine the server and client parts for playing or streaming the content. You can also get a number of parameters from the media streamer nodes to find out the characteristics of playing or streaming the content.

    • +
    • Playing files with the media streamer +

      You can play video files or launch content streaming over IP.

    • +
    • Destroying the media streamer +

      When no longer needed, you can destroy the media streamer handle used for linking content source and sink elements.

    The Tizen Media Streamer framework can be used in many scenarios:

    @@ -117,7 +106,7 @@ -

    Creating the Media Streamer

    +

    Media Streamer

    The media streamer is created using the media_streamer_create(), media_streamer_node_create_src(), and media_streamer_node_create_sink() functions.

    @@ -140,7 +129,7 @@

    After the nodes are created, they are uploaded into the media streamer pipeline where, in connection with other topology nodes, they construct a logic chain to be launched according to the chosen scenario. The media_streamer_node_add() function is used to add a node to the media streamer.

    -

    Plugging Media Streamer Nodes in Manual or Autoplug Mode

    +

    Media Streamer Modes

    The Media Streamer framework creates and links nodes for launching video encoding and decoding chains in manual or autoplug modes.

    @@ -154,7 +143,7 @@
  • In the autoplug mode, the video encoding and decoding chain of the media streamer is automatically constructed from the previously created source and sink nodes.

  • -

    Managing the Media Streamer Parameters

    +

    Media Streamer Parameters

    The Media Streamer framework sets parameters onto the nodes for launching appropriate video encoding and decoding chains. It also gets parameters from the nodes to find out about the encoding and decoding characteristics of the node.

    @@ -208,7 +197,7 @@

    You can get the media streamer state using the media_streamer_get_state() function. The states of the media streamer node can be found in the media_streamer.h header file. The state can be, for example, MEDIA_STREAMER_STATE_READY.

    -

    Playing Files with the Media Streamer

    +

    File Playing with Media Streamer

    Before playing the media streamer, it must be prepared and the state of the media streamer nodes must be set to the MEDIA_STREAMER_STATE_READY state in server and client parts.

    @@ -237,7 +226,7 @@ -

    Destroying the Media Streamer

    +

    Media Streamer Removal

    Before destroying the media streamer, it must be unprepared using the media_streamer_unprepare() function, and the state of the media streamer nodes must be set to MEDIA_STREAMER_STATE_IDLE.

    @@ -247,27 +236,6 @@

    To destroy the media streamer, use the media_streamer_destroy() function. The media streamer nodes that have not been removed manually from the media streamer are removed automatically.

    -

    Warm-up

    - -

    Become familiar with the Media Streamer API basics by learning about:

    - - -

    Prerequisites

    The use cases in this guide demonstrate how you can use the media streamer functionality to stream video content in the form of Videotestsrc in the broadcast manual mode.

    diff --git a/org.tizen.guides/html/native/media/metadata_n.htm b/org.tizen.guides/html/native/media/metadata_n.htm index 60b493f..942a6c9 100644 --- a/org.tizen.guides/html/native/media/metadata_n.htm +++ b/org.tizen.guides/html/native/media/metadata_n.htm @@ -27,9 +27,6 @@

    Content

    Related Info

      @@ -67,310 +66,45 @@

      To handle content metadata, you can use the following features:

      - - - -

      Metadata Editing in Mobile Applications

      -

      You can edit the metadata of several popular audio formats using the metadata editor. You can add and remove album art, or update the information of the audio file. Before you start, remember to prepare your application to use the metadata editor functionality.

      - -

      The metadata editor supports the mp3 and mp4 (audio only) file formats. Image and video file editing is not supported.

      - -

      The following table lists the metadata you can edit.

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - Table: Editable metadata attributes -
      AttributeDescription
      METADATA_EDITOR_ATTR_ARTISTArtist of the audio content
      METADATA_EDITOR_ATTR_TITLETitle of the audio content
      METADATA_EDITOR_ATTR_ALBUMAlbum of the audio content
      METADATA_EDITOR_ATTR_GENREGenre of the audio content
      METADATA_EDITOR_ATTR_AUTHORAuthor of the audio content
      METADATA_EDITOR_ATTR_COPYRIGHTCopyright of the audio content
      METADATA_EDITOR_ATTR_DATEDate of the audio content
      METADATA_EDITOR_ATTR_DESCRIPTIONDescription of the audio content
      METADATA_EDITOR_ATTR_COMMENTComment of the audio content
      METADATA_EDITOR_ATTR_TRACK_NUMTrack number of the audio content
      METADATA_EDITOR_ATTR_PICTURE_NUMPicture number of the audio content
      METADATA_EDITOR_ATTR_CONDUCTORConductor of the audio content
      METADATA_EDITOR_ATTR_UNSYNCLYRICSUnsync lyrics of the audio content
      - -

      Metadata Extraction

      -

      Media files, such as mp3 and mp4 files, contain metadata. Metadata extractor enables you to extract metadata from the media files. Before you start, remember to prepare your application to use the metadata extractor functionality.

      +
    • Metadata editing in mobile applications only +

      You can edit the metadata of several popular audio formats using the metadata editor. You can add and remove album art, or update the information of the audio file.

      +

      The metadata editor supports editing the metadata of the mp3 and mp4 (audio only) file formats. Image and video file editing is not supported.

    • +
    • Metadata extraction +

      Media files, such as mp3 and mp4 files, contain extractable metadata. You can extract metadata from such media files with the metadata extractor.

      Figure: Getting metadata

      Getting metadata

      -

      The metadata extractor can only be used with video and audio files only. It is not supported in the image files.

      -

      The following table lists the extractable metadata.

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - Table: Metadata extractor attributes -
      AttributeDescription
      METADATA_DURATIONDuration of the content
      METADATA_VIDEO_BITRATEBitrate of the video content
      METADATA_VIDEO_FPSFPS of the video content
      METADATA_VIDEO_WIDTHWidth of the video content
      METADATA_VIDEO_HEIGHTHeight of the video content
      METADATA_HAS_VIDEOWhether the content has video stream
      METADATA_AUDIO_BITRATEBitrate of the audio content
      METADATA_AUDIO_CHANNELSChannel of the audio content
      METADATA_AUDIO_SAMPLERATESample rate of the audio content
      METADATA_AUDIO_BITPERSAMPLEBit per sample of the audio content
      METADATA_HAS_AUDIOWhether the content has audio stream
      METADATA_ARTISTArtist of the content
      METADATA_TITLETitle of the content
      METADATA_ALBUMAlbum of the content
      METADATA_ALBUM_ARTISTAlbum artist of the content
      METADATA_GENREGenre of the content
      METADATA_AUTHORAuthor of the content
      METADATA_COPYRIGHTCopyright of the content
      METADATA_DATEDate of the content
      METADATA_DESCRIPTIONDescription of the content
      METADATA_COMMENTComment about the content
      METADATA_TRACK_NUMTrack number of the content
      METADATA_CLASSIFICATIONClassification of the content
      METADATA_RATINGRating of the content
      METADATA_LONGITUDELongitude of the content
      METADATA_LATITUDELatitude of the content
      METADATA_ALTITUDEAltitude of the content
      METADATA_CONDUCTORConductor of the content
      METADATA_UNSYNCLYRICSAsynchronous lyrics of the content
      METADATA_SYNCLYRICS_NUMSynchronous lyrics of the content
      METADATA_RECDATERecorded date of the content
      METADATA_ROTATEOrientation of the content
      - - -

      MIME Type Information

      - -

      You can retrieve various information related to the MIME type.

      +

      The metadata extractor can be used with video and audio files only. It is not supported in the image files.

      +
    • +
    • MIME type information +

      You can get a MIME type for a file extension and get a list of extensions associated, for example, with an image or a JPEG MIME type.

      +
    • +
    -

    The main features of the MIME Type API include:

    - -
    • Getting the MIME type -

      To get a MIME type for a file extension, use the mime_type_get_mime_type() function. The MIME type is 'application/octet-stream', if the given file extension is not associated with any specific file format.

    • -
    • Getting associated extensions -

      To get a list of extensions associated, for example, with an image or a JPEG MIME type, use the mime_type_get_file_extension() function.

    - -

    Before you start, remember to prepare your application to use the MIME type functionality.

    - - - -

    Warm-up

    -

    Become familiar with the Metadata Editor, Metadata Extractor, and MIME Type API basics by learning about:

    -

    Prerequisites

    To enable your application to use the metadata functionality:

    1. -

      To use the functions and data types of the Metadata Editor API, include the <metadata_editor.h> header file in your application:

       #include <metadata_editor.h>
       
      -
    2. -

      To work with the Metadata Editor API, define a handle variable for the metadata editor:

      -
       static metadata_editor_h g_metadata_h = NULL;
       
      -

      This guide uses a global variable for the handle.

      -
    3. -
    4. -

      Make sure you have access to the file whose metadata and artwork you want to edit.

      - @@ -381,9 +115,7 @@ static metadata_editor_h g_metadata_h = NULL;
      -

      This guide uses an MP3 audio file, which is accessed through its file path. The following example code uses an internal storage, so you must include the storage.h header file for the code to work.

      -
       int internal_storage_id;
       char *internal_music_storage_path;
      @@ -429,36 +161,23 @@ _make_test_path()
           snprintf(music_test_path, path_len, "%s/%s", internal_music_storage_path, music_file_name);
       }
       
      -
    5. -

      To use the functions and data types of the Metadata Extractor API (in mobile and wearable applications), include the <metadata_extractor.h> header file in your application:

      -
       #include <metadata_extractor.h>
       
      -

      To ensure that a Metadata Extractor function has been executed properly, make sure that the return value is equal to METADATA_EXTRACTOR_ERROR_NONE.

      -
    6. -
    7. -

      To work with the Metadata Extractor API, define a handle variable for the metadata extractor:

      -
       static metadata_extractor_h g_metadata_h = NULL;
       
      -

      This guide uses a global variable for the handle.

      -
    8. -
    9. -

      Make sure you have access to the files whose metadata you want to extract, and make sure the files contain metadata, since the Metadata Extractor API only works on files with metadata.

      - @@ -469,9 +188,7 @@ static metadata_extractor_h g_metadata_h = NULL;
      -

      This guide uses 2 files: an MP3 audio file and an MP4 video file, which are accessed through their file paths. The following example code uses an internal storage, so you must include the storage.h header file for the code to work.

      -
       int internal_storage_id;
       char *internal_music_storage_path;
      @@ -534,7 +251,6 @@ _make_test_path()
           strncat(video_test_path, video_file_name, strlen(video_file_name));
       }
       
      -
    10. To use the functions and data types of the MIME Type API (in mobile and wearable applications), include the <mime_type.h> header file in your application:

      @@ -542,54 +258,35 @@ _make_test_path() #include <mime_type.h>
    11. -

    Editing Metadata and Artwork in Mobile Applications

    -

    To edit the metadata and artwork in the file:

    -
      -
    1. -

      Create the metadata editor handle using the metadata_editor_create() function:

      -
       ret = metadata_editor_create(&g_metadata_h);
       
      -
    2. -
    3. -

      Set the path to the file you want to edit using the metadata_editor_set_path() function:

      -
       ret = metadata_editor_set_path(g_metadata_h, music_test_path);
       
      -

      The function binds the metadata editor handle (first parameter) with the file specified in the music_test_path variable (second parameter).

      -
    4. -
    5. -

      Edit the metadata in the file using the metadata_editor_set_metadata() function. Edit each piece of metadata (each metadata attribute) individually.

      -

      As parameters, define the metadata editor handle, the attribute you want to edit, and the new value you want to set to the attribute. The possible attributes are defined in the metadata_editor_attr_e enumeration.

      -

      The following example code edits the title of the audio content. You can edit other attributes by defining a different attribute enumerator (and a corresponding new value).

      -
       char *value = "My Song";
       
       ret = metadata_editor_set_metadata(g_metadata_h, METADATA_EDITOR_ATTR_TITLE, value);
       
      -

      After calling the function, check whether the return value is METADATA_EDITOR_ERROR_NONE. If it is, you can check the updated metadata using the metadata_editor_get_metadata() function. Otherwise, the function failed because of an error, which you need to handle.

      - @@ -600,15 +297,10 @@ ret = metadata_editor_set_metadata(g_metadata_h, METADATA_EDITOR_ATTR_TITLE, val
      -
    6. -
    7. -

      Add artwork to the file using the metadata_editor_append_picture() function.

      -

      As parameters, define the metadata editor handle and the path of the image file that contains the artwork. The image file must be in the JPEG or PNG format. The image is added to the last image file position. You can add multiple image files to the same audio file.

      -
       char *artwork = "append_image.jpg";
       
      @@ -616,15 +308,12 @@ ret = metadata_editor_append_picture(g_metadata_h, artwork);
       

      To remove artwork from the file, use the metadata_editor_remove_picture() function. As parameters, define the metadata editor handle and the index number of the image file you want to remove.

      -

      To retrieve the number of images in the file, use the metadata_editor_get_metadata() function. To retrieve a specific image, use the metadata_editor_get_picture() function.

      -
       int index = 0;
       
       ret = metadata_editor_remove_picture(g_metadata_h, index);
       
      - @@ -635,29 +324,19 @@ ret = metadata_editor_remove_picture(g_metadata_h, index);
      -
    8. -
    9. -

      Apply the metadata and artwork edits to the file using the metadata_editor_update_metadata() function:

      -
       ret = metadata_editor_update_metadata(g_metadata_h);
       
      -
    10. -
    11. -

      When no longer needed, destroy the metadata editor handle using the metadata_editor_destroy() function:

      -
       metadata_editor_destroy(g_metadata_h);
       
      -
    12. -

    Retrieving Metadata

    @@ -889,6 +568,217 @@ for (i = 0; i < length; i++) free(extension); +

    Editable Metadata Attributes

    + +

    The following table lists the metadata you can edit.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Table: Editable metadata attributes +
    AttributeDescription
    METADATA_EDITOR_ATTR_ARTISTArtist of the audio content
    METADATA_EDITOR_ATTR_TITLETitle of the audio content
    METADATA_EDITOR_ATTR_ALBUMAlbum of the audio content
    METADATA_EDITOR_ATTR_GENREGenre of the audio content
    METADATA_EDITOR_ATTR_AUTHORAuthor of the audio content
    METADATA_EDITOR_ATTR_COPYRIGHTCopyright of the audio content
    METADATA_EDITOR_ATTR_DATEDate of the audio content
    METADATA_EDITOR_ATTR_DESCRIPTIONDescription of the audio content
    METADATA_EDITOR_ATTR_COMMENTComment of the audio content
    METADATA_EDITOR_ATTR_TRACK_NUMTrack number of the audio content
    METADATA_EDITOR_ATTR_PICTURE_NUMPicture number of the audio content
    METADATA_EDITOR_ATTR_CONDUCTORConductor of the audio content
    METADATA_EDITOR_ATTR_UNSYNCLYRICSUnsync lyrics of the audio content
    + +

    Extractable Metadata Attributes

    + +

    The following table lists the extractable metadata.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Table: Metadata extractor attributes +
    AttributeDescription
    METADATA_DURATIONDuration of the content
    METADATA_VIDEO_BITRATEBitrate of the video content
    METADATA_VIDEO_FPSFPS of the video content
    METADATA_VIDEO_WIDTHWidth of the video content
    METADATA_VIDEO_HEIGHTHeight of the video content
    METADATA_HAS_VIDEOWhether the content has video stream
    METADATA_AUDIO_BITRATEBitrate of the audio content
    METADATA_AUDIO_CHANNELSChannel of the audio content
    METADATA_AUDIO_SAMPLERATESample rate of the audio content
    METADATA_AUDIO_BITPERSAMPLEBit per sample of the audio content
    METADATA_HAS_AUDIOWhether the content has audio stream
    METADATA_ARTISTArtist of the content
    METADATA_TITLETitle of the content
    METADATA_ALBUMAlbum of the content
    METADATA_ALBUM_ARTISTAlbum artist of the content
    METADATA_GENREGenre of the content
    METADATA_AUTHORAuthor of the content
    METADATA_COPYRIGHTCopyright of the content
    METADATA_DATEDate of the content
    METADATA_DESCRIPTIONDescription of the content
    METADATA_COMMENTComment about the content
    METADATA_TRACK_NUMTrack number of the content
    METADATA_CLASSIFICATIONClassification of the content
    METADATA_RATINGRating of the content
    METADATA_LONGITUDELongitude of the content
    METADATA_LATITUDELatitude of the content
    METADATA_ALTITUDEAltitude of the content
    METADATA_CONDUCTORConductor of the content
    METADATA_UNSYNCLYRICSAsynchronous lyrics of the content
    METADATA_SYNCLYRICS_NUMSynchronous lyrics of the content
    METADATA_RECDATERecorded date of the content
    METADATA_ROTATEOrientation of the content
    diff --git a/org.tizen.guides/html/native/media/openal_n.htm b/org.tizen.guides/html/native/media/openal_n.htm index 91381d7..a83342f 100644 --- a/org.tizen.guides/html/native/media/openal_n.htm +++ b/org.tizen.guides/html/native/media/openal_n.htm @@ -103,23 +103,6 @@ if (device != NULL) {

    To use OpenAL, you must create a context and the initial set of buffers, load the buffers with sample data, create sources, attach the buffers to the sources, set the locations and directions for the listener and sources, and set the initial values for the OpenAL state global. You can also queue buffers.

    -

    Before you start, remember to prepare your application to use the OpenAL functionality.

    - -

    Warm-up

    - -

    Become familiar with the OpenAL API basics by learning about:

    - - -

    For additional OpenAL code samples, see Example Code.

    Prerequisites

    diff --git a/org.tizen.guides/html/native/media/radio_n.htm b/org.tizen.guides/html/native/media/radio_n.htm index b3bb2e2..16508e5 100644 --- a/org.tizen.guides/html/native/media/radio_n.htm +++ b/org.tizen.guides/html/native/media/radio_n.htm @@ -48,16 +48,16 @@

    The main features of the Radio API include:

      -
    • Switching the radio on and off
    • -
    • Seeking radio frequency
    • -
    • Scanning radio signals
    • -
    • Setting the state of the radio
    • +
    • Switching the radio on and off +

      You can create a handle for a radio instance using the radio_create() function. A successful creation of the handle requires a radio tuner. You can switch the radio on and off using the radio_start() and radio_stop() functions.

    • +
    • Scanning for radio frequencies +

      You can scan for all available frequencies.

    • +
    • Tuning the radio +

      You can select and start playing a radio frequency using the radio_set_frequency() function.

    • +
    • Searching for an adjacent channel +

      You can seek an adjacent channel with the radio_seek_up() and radio_seek_down() functions.

    -

    Before you start, remember to prepare your application to use the radio functionality.

    - -

    Create a handle for a radio instance using the radio_create() function. A successful creation of the handle requires a radio tuner. You can switch the radio on and off using the radio_start() and radio_stop() functions. Scan for frequencies and select the radio frequency using the radio_set_frequency() function, or seek an adjacent channel with the radio_seek_up() and radio_seek_down() functions.

    -

    The Radio API allows only one instance at the time. Radio playback can be interrupted by another radio application.

    The following figure illustrates the general radio state changes.

    @@ -65,21 +65,6 @@

    Figure: Radio state changes

    Radio state changes

    -

    Warm-up

    - -

    Become familiar with the Radio API basics by learning about:

    - - -

    Prerequisites

    To enable your application to use the radio functionality:

    diff --git a/org.tizen.guides/html/native/media/raw_audio_n.htm b/org.tizen.guides/html/native/media/raw_audio_n.htm new file mode 100644 index 0000000..0239658 --- /dev/null +++ b/org.tizen.guides/html/native/media/raw_audio_n.htm @@ -0,0 +1,748 @@ + + + + + + + + + + + + + Raw Audio Playback and Recording + + + +
    +
    +

    Mobile native Wearable native

    +
    + +
    +

    Dependencies

    +
      +
    • Tizen 2.4 and Higher for Mobile
    • +
    • Tizen 2.3.1 and Higher for Wearable
    • +
    +

    Content

    + +

    Related Info

    + +
    +
    +
    +

    Raw Audio Playback and Recording

    +

    The Pulse Code Modulated (PCM) data contains non-compressed audio. You can play and record uncompressed audio data both synchronously and asynchronously.

    +

    The main uncompressed audio management features are:

    + + +

    Audio Output

    + +

    The Audio Output API (in mobile and wearable applications) enables your application to play such data using output devices. You can play audio synchronously, or do it asynchronously.

    +

    To play the audio PCM data, the application must call the audio_out_create() function to initialize the audio output handle.

    +

    Your application must define the following PCM data settings:

    +
      +
    • Audio channels: +
        +
      • Mono (1 channel)
      • +
      • Stereo (2 channels)
      • +
    • +
    • Audio sample type: +
        +
      • Unsigned 8-bit PCM
      • +
      • Signed 16-bit little endian PCM
      • +
    • +
    • Audio sample rate: +
        +
      • 8000 ~ 48000 Hz
      • +
    • +
    + +

    The following figures illustrate the general audio output states, and how the state changes when the audio output is interrupted by the system.

    +

    Figure: Audio output states

    +

    Audio output states

    +

    Figure: Audio output states when interrupted by system

    +

    Audio output states when interrupted by system

    + +

    Using Audio Output

    +

    For supporting various low-end Tizen devices, the application must follow certain guidelines:

    +
      +
    • Do not use multiple instances of the Audio Output excessively. +
      • Using excessive multiple instances of the Audio Output has a negative effect on the application, because the audio data processing for re-sampling and mixing imposes a heavy burden on the system.
    • +
    • Use device-preferred PCM format. +
        + +
      • To reduce the processing overhead inside, use the target device-preferred PCM format (for example, signed 16-bit little endian, stereo, 44100 Hz).
      • +
      • Using the preferred format reduces internal operations, such as converting audio samples from mono to stereo or re-sampling audio frequency to fit the target device's input sample rate.
      • +
    • +
    • Do not call the Audio Output functions too frequently. +
        +
      • The Audio Output functions require more time while repeated in the order of audio_out_create() > audio_out_prepare() > audio_out_unprepare() > audio_out_destroy(). Therefore, keep the frequency of calling these functions to a minimum. Note that the audio_out_prepare() and audio_out_unprepare() functions are much faster than audio_out_create() and audio_out_destroy().
      • +
    • +
    • Reduce event delay and remove glitches. +
        +
      • The Audio Output API works recursively with events. The smaller the buffer size, the more often are events generated. If you use the Audio Output API with the smallest buffer and other resources (for example, a timer or sensor), the application is negatively influenced by the delay of the event. To prevent problems, set the write buffer size properly based on the other resources you need.
      • +
      • To guarantee the working events of the Audio Output API independently, an instance of the Audio Output API needs to be created and worked on the event thread.
      • +
    • +
    • Use double-buffering. +
        +
      • Use the double buffering mechanism to reduce latency. The mechanism works by first writing data twice before starting. After starting, whenever the listener (event) is called, you can write additional data.
      • +
    • +
    • Save power. +
        +
      • If the Audio Output does not play for a long time for some reason, such as the screen turning off or idle playback, call the audio_out_unprepare() function to pause the stream and save power. The device cannot go to sleep while in the PLAYING state.
      • +
    • +
    + + +

    Audio Input

    + +

    The Audio Input API (in mobile and wearable applications) enables your application to record such data from a microphone type input device. You can record audio synchronously, or do it asynchronously.

    + +

    Audio data is captured periodically, so to receive the audio PCM data from the input device, you must implement the audio input interface to notify the application of audio data events, such as the end of filling audio data.

    +

    Before recording audio, you must define the following PCM data settings:

    +
      +
    • Input device type: +
        +
      • Microphone
      • +
    • +
    • Audio channels: +
        +
      • Mono (1 channel)
      • +
      • Stereo (2 channels)
      • +
    • +
    • Audio sample type: +
        +
      • Unsigned 8-bit PCM
      • +
      • Signed 16-bit little endian PCM
      • +
    • +
    • Audio sample rate: +
        +
      • 8000 ~ 48000 Hz
      • +
    • +
    +

    To minimize the overhead of the audio input API, use the optimal channel type, sample type and sampling rate, which can be retrieved using the audio_in_get_channel(), audio_in_get_sample_type() and audio_in_get_sample_rate() functions, respectively.

    + + +

    The following figures illustrate the general audio input states, and how the state changes when the audio input is interrupted by the system.

    +

    Figure: Audio input states

    +

    Audio input states

    +

    Figure: Audio input states when interrupted by system

    +

    Audio input states when interrupted by system

    + +

    Prerequisites

    + +

    To enable your application to use the uncompressed audio functionality:

    +
      +
    1. +

      To use the functions and data types of the Audio I/O (in mobile and wearable applications) and Sound Manager (in mobile and wearable applications) APIs, include the <audio_io.h> and <sound_manager.h> header files in your application:

      +
      +#include <audio_io.h>
      +#include <sound_manager.h>
      +
      +
    2. + +
    3. To initialize the audio input and output devices, use the audio_in_create() and audio_out_create() functions:

      + +
      +/* Define the sample rate for recording audio */
      +#define SAMPLE_RATE 44100
      +
      +/* Declare the variable used for checking function results */
      +audio_io_error_e error_code;
      +
      +/* Initialize the audio input device */
      +audio_in_h input;
      +
      +error_code = audio_in_create(SAMPLE_RATE, AUDIO_CHANNEL_MONO, AUDIO_SAMPLE_TYPE_S16_LE, &input);
      +
      +/* Initialize the audio output device */
      +audio_out_h output;
      +
      +error_code = audio_out_create(SAMPLE_RATE, AUDIO_CHANNEL_MONO, AUDIO_SAMPLE_TYPE_S16_LE, SOUND_TYPE_SYSTEM, &output);
      +
      +

      The audio input and output devices support the channel types defined in the audio_channel_e enumeration (in mobile and wearable applications), and the sample types defined in the audio_sample_type_e enumeration (in mobile and wearable applications). For playing the recorded audio, use the same channel and sample type in both audio devices.

      + +

      The sound types are defined in the sound_type_e enumeration (in mobile and wearable applications). You can select the sound type according to the audio sample type.

    4. +
    + + +

    Managing Synchronous Playback

    + +

    You can play an audio sample and modify the volume of the playback.

    + + +

    Playing an Audio Sample

    + +

    The synchronous playback process blocks other processes running in the same thread. Launching a playback process from the main thread of the application can make the application unresponsive. To prevent this, launch the playback process from its own thread. For example, in this use case, the playback process is run inside the synchronous_playback() function, which is executed in a separate thread using the ecore_thread_run() function:

    + +
    +ecore_thread_run(synchronous_playback, NULL, NULL, NULL);
    +
    + +

    To play audio:

    + +
      +
    1. Prepare the audio output device and start the playback process using the audio_out_prepare() function:

      + +
      +/* Prepare the audio output device (starts the hardware playback process) */
      +error_code = audio_out_prepare(output);
      +
      + +

      The hardware device prepares its internal output buffer for playback. Playback begins when the internal output buffer starts receiving audio data.

      + +
    2. +
    3. To start playing the recorded audio, copy the audio data from the local buffer to the internal output buffer using the audio_out_write() function:

      + +
      +/* Copy the audio data from the local buffer to the internal output buffer */
      +int bytes_number = audio_out_write(output, buffer, buffer_size);
      +
      +

      The returned value represents the number of bytes written to the internal output buffer. A negative value represents an error code.

      +

      The audio_out_write() function behaves in a similar manner to the audio_in_read() function.

      +
    4. + +
    5. After all data has been copied to the internal output buffer, release the memory allocated to the local buffer using the free() function:

      +
      +/* Release the memory allocated to the local buffer */
      +free(buffer);
      +
    6. + +
    7. Stop the playback process using the audio_out_unprepare() function:

      + +
      +/* Stop the hardware playback process */
      +error_code = audio_out_unprepare(output);
      +
    8. + +
    9. After you have finished working with the audio output device, deinitialize it using the audio_out_destroy() function:

      +
      +/* Deinitialize the audio output device */
      +error_code = audio_out_destroy(output);
      +
    10. +
    + +

    Modifying the Audio Sample Volume

    + + + + + + + + + + +
    Note
    Modifying the volume only works if you have not emptied the local buffer or deinitialized the input audio device.
    + +

    To modify the volume of the audio sample stored in the local buffer:

    + +
    +#define MIN_2BYTES_SIGNED (−32768)
    +#define MAX_2BYTES_SIGNED 32767
    +
    +void
    +modify_sound()
    +{
    +    /* Retrieve the sample type of the input */
    +    audio_sample_type_e sample_type;
    +
    +    int error_code = audio_in_get_sample_type(input, &sample_type);
    +    if (error_code != AUDIO_IO_ERROR_NONE) {
    +        dlog_print(DLOG_ERROR, LOG_TAG, "audio_in_get_sample_type() failed! Error code = %d", error_code);
    +
    +        return;
    +    }
    +
    +    uint8_t *index = (uint8_t*)buffer;
    +    while (index < (((uint8_t*)buffer)+buffer_size)) {
    +        if (AUDIO_SAMPLE_TYPE_S16_LE == sample_type) {
    +            /* Use the int16_t type, because it is 2 bytes long */
    +            int16_t *value = (int16_t*)index;
    +
    +            /* Make the sample louder */
    +            int32_t tmp = (*value) * 8; /* Why not 8 times louder? (on dB scale even much louder) */
    +            if (tmp > MAX_2BYTES_SIGNED)
    +                tmp = MAX_2BYTES_SIGNED;
    +            if (tmp < MIN_2BYTES_SIGNED)
    +                tmp = MIN_2BYTES_SIGNED;
    +            (*value) = tmp;
    +        } else {
    +            /* Use the uint8_t type, because it is 1 byte long */
    +            uint8_t *value = (uint8_t*)index;
    +
    +            /* Make the sample louder */
    +            uint16_t tmp = (*value) * 8; /* Why not 8 times louder? (on dB scale even much louder) */
    +            if (tmp > 255)
    +                tmp = 255;
    +            (*value) = tmp;
    +        }
    +
    +        /* Go to the next sample */
    +        index += sample_type == AUDIO_SAMPLE_TYPE_S16_LE ? 2 : 1;
    +    }
    +
    +    dlog_print(DLOG_DEBUG, LOG_TAG, "Volume of the synchronous recording increased.");
    +}
    +
    + +

    In this example, the volume is significantly increased. You can also make other modifications to the audio sample playback.

    + +

    Managing Asynchronous Playback

    + +

    Playing audio asynchronously involves:

    + +
      +
    1. Starting asynchronous playback

    2. +
    3. Stopping asynchronous playback

    4. +
    + +

    Starting Asynchronous Playback

    + +

    The asynchronous playback process uses a callback function for playing the recorded audio. The callback function is invoked asynchronously for each chunk of recorded audio. In this use case, the audio data is read from a file rather than a local buffer.

    + +

    To start playing the recorded audio:

    + +
    1. +

      Set the callback function using the audio_out_set_stream_cb() function:

      + +
      +/* Set a callback function that is invoked asynchronously for each chunk of stored (recorded) audio */
      +error_code = audio_out_set_stream_cb(output, _audio_io_stream_write_cb, NULL);
      +
      +
    2. +
    3. +

      Open the file where the audio data is stored:

      + +
      +#include <storage.h>
      +
      +/* Prepare the file where the recorded audio data is stored */
      +char io_stream_r_path[200];
      +char *storage_path;
      +/* You can find the storage ID using the storage_foreach_device_supported() function */
      +int error = storage_get_directory(storage_id, STORAGE_DIRECTORY_SOUNDS, &storage_path);
      +snprintf(io_stream_r_path, 200, "%s/%s", storage_path, "pcm_w.raw");
      +free(storage_path);
      +
      +FILE* fp_r = fopen(io_stream_r_path, "r");
      +
      +

      The storage_get_directory() function of the Storage API retrieves the storage path based on the storage ID. To retrieve the storage ID, use the storage_foreach_device_supported() function of the Storage API.

      +
    4. + +
    5. +

      Prepare the audio output device and start the playback process using the audio_out_prepare() function:

      + +
      +/* Prepare the audio output device (starts the hardware playback process) */
      +error_code = audio_out_prepare(output);
      +
      +

      The hardware device prepares its internal output buffer for playback.

      +
    6. +
    7. + +

      To play the audio from the file (inside the callback function):

      +
        + +
      1. Allocate a local buffer for the audio data using the malloc() function. The function returns a pointer to the buffer. Reset the buffer by filling it with zeros using the memset() function.

      2. + +
      3. Read audio data from the file and store the data in the local buffer using the fread() function.

      4. + +
      5. Copy the audio data from the local buffer to the internal output buffer using the audio_out_write() function. Playback begins when the internal output buffer starts receiving the audio data.

      6. + +
      7. Release the memory allocated to the local buffer using the free() function.

      8. + +
      + +
      +/* Callback invoked for each chunk of stored (recorded) audio */
      +void
      +_audio_io_stream_write_cb(audio_out_h handle, size_t nbytes, void *userdata)
      +{
      +    char * buffer = NULL;
      +
      +    if (nbytes > 0) {
      +        /* Allocate and reset a local buffer for reading the audio data from the file */
      +        buffer = malloc(nbytes);
      +        memset(buffer, 0, nbytes);
      +
      +        /* Read audio data from the file and store it in the local buffer */
      +        fread(buffer, sizeof(char), nbytes, fp_r);
      +
      +        /* Copy the audio data from the local buffer to the internal output buffer (starts playback) */
      +        int data_size = audio_out_write(handle, buffer, nbytes);
      +
      +        if (data_size < 0)
      +            dlog_print(DLOG_ERROR, LOG_TAG, "audio_out_write() failed! Error code = %d", data_size);
      +
      +        /* Release the memory allocated to the local buffer */
      +        free(buffer);
      +    }
      +}
      +
    + +

    Stopping Asynchronous Playback

    + +

    To stop playing the recorded audio:

    + +
    1. Stop the playback process using the audio_out_unprepare() function:

      + +
      +/* Stop the hardware playback process */
      +error_code = audio_out_unprepare(output);
      +
      +

      The device no longer invokes the callback function.

      +
    2. +
    3. +

      If you no longer need asynchronous playback, or if you want to set the callback function separately for each asynchronous playback session, unset the callback function using the audio_out_unset_stream_cb() function:

      + +
      +/* Unset the callback function used for asynchronous playback */
      +error_code = audio_out_unset_stream_cb(output);
      +
      +
    4. + +
    5. After you have finished working with the audio output device, deinitialize it using the audio_out_destroy() function:

      +
      +/* Deinitialize the audio output device */
      +error_code = audio_out_destroy(output);
      +
    6. + +
    7. +

      Close the file where the recorded audio is stored using the fclose() function:

      +
      +/* Close the file used for asynchronous playback */
      +error_code = fclose(fp_r);
      +fp_r = NULL;
      +
      +
    8. +
    + + +

    Managing Synchronous Recording

    + +

    Recording audio synchronously involves:

    + +
      +
    1. Creating a local buffer for storing the audio data

    2. +
    3. Recording an audio sample

    4. +
    + +

    Creating a Buffer for Audio Data

    + +

    Before starting the synchronous recording process, you need to create a local buffer for storing the audio data. To create the buffer, you need to know its required size based on the expected duration of the recording, since the recording process ends when the buffer is full.

    + +

    To determine the required buffer size, use one of the following options:

    + +
      + +
    • To determine the required buffer size based on what is recommended by the Audio I/O API:

      + +
      1. +

        Retrieve the recommended buffer size using the audio_in_get_buffer_size() function. The function retrieves the buffer size recommended by the sound server (such as PulseAudio).

        + +
        +int buffer_size;
        +
        +error_code = audio_in_get_buffer_size(input, &buffer_size);
        +
        + +

        If no error occurs, the buffer_size parameter returns the preferred size of the buffer that must be allocated (in bytes), based on the specified audio parameters.

        + +

        The recommended buffer size depends on the device. The size can be different for TV, mobile, and wearable devices.

        +
      2. + +
      3. + +

        Set the buffer size to correspond to the desired duration of the recording.

        + +

        For example, for the device used in creating this example code, the audio_in_get_buffer_size() function returns the recommended buffer size for 100 milliseconds of recording time. To determine the actual, required buffer size in seconds, multiply the recommended buffer size by 10 (to increase the duration from 100 milliseconds to 1 second) and by the number of seconds the recording lasts (here, 5 seconds):

        + +
        +#define RECORDING_SEC 5
        +
        +buffer_size *= 10 * RECORDING_SEC;
        +
        + +
      4. + +
    • +
    • +

      To explicitly calculate the required buffer size:

      + +
        + +
      1. +

        Retrieve the audio channel type using the audio_in_get_channel() function:

        + +
        +audio_channel_e channel;
        +
        +error_code = audio_in_get_channel(input, &channel);
        +
        +
      2. + +
      3. +

        Retrieve the audio sample type using the audio_in_get_sample_type() function:

        + +
        +audio_sample_type_e sample_type;
        +
        +error_code = audio_in_get_sample_type(input, &sample_type);
        +
        +
      4. + +
      5. +

        Calculate the buffer size based on the retrieved information:

        + +
        +int buffer_size = SAMPLE_RATE * (channel == AUDIO_CHANNEL_STEREO ? 2 : 1) * (sample_type == AUDIO_SAMPLE_TYPE_S16_LE ? 2 : 1);
        +
        +
      6. + +
      7. +

        Multiply the buffer size by the number of seconds the recording lasts:

        + +
        +buffer_size *= RECORDING_SEC;
        +
        +
      8. +
    + +

    After determining the required buffer size, allocate the memory to the buffer using the malloc() function:

    + +
    +void *buffer = malloc(buffer_size);
    +
    + +

    You have created the local buffer for storing the audio data. You can now start the synchronous recording process.

    + +

    Recording an Audio Sample

    + +

    The synchronous recording process blocks other processes running in the same thread. Launching a recording process from the main thread of the application can make the application unresponsive. To prevent this, launch the recording process from its own thread. For example, in this use case, the recording process is run inside the synchronous_playback() function, which is executed in a separate thread using the ecore_thread_run() function:

    + +
    +ecore_thread_run(synchronous_playback, NULL, NULL, NULL);
    +
    + +

    To record audio:

    + +
    1. +

      Prepare the audio input device and start the recording process using the audio_in_prepare() function:

      + +
      +/* Prepare the audio input device (starts the hardware recording process) */
      +error_code = audio_in_prepare(input);
      +
      +

      The hardware device starts buffering the audio recorded by the audio input device. The audio data is buffered to the internal input buffer.

      +
    2. +
    3. Copy the audio data from the internal input buffer to the local buffer using the audio_in_read() function:

      + +
      +/* Copy the audio data from the internal input buffer to the local buffer */
      +int bytes_number = audio_in_read(input, buffer, buffer_size);
      +
      + +

      The returned value represents the number of bytes read from the internal input buffer. A negative value represents an error code.

      + +

      The audio_in_read() function can behave in the following ways:

      +
        +
      • If the function is called immediately after preparing the audio input device, the function blocks the thread it is launched from until the local buffer is full.
      • +
      • If the function is called with a delay long enough to allow the internal input buffer to store more audio data than the local buffer can hold, the function executes immediately without blocking its thread.
      + +

      The audio_in_read() function fills the local buffer by copying audio data from the internal input buffer. If the internal input buffer does not contain enough data to fill up the local buffer, the function waits until enough data is recorded. If you want to start recording audio immediately after clicking a button, call the audio_in_prepare() function just before the audio_in_read() function inside the same button callback function. If you prepare the audio input device earlier in a separate function and only run the audio_in_read() function inside the button callback function, the local buffer is filled with audio data recorded before the button is clicked.

      +
    4. + +
    5. Stop the recording process using the audio_in_unprepare() function:

      + +
      +/* Stop the hardware recording process */
      +error_code = audio_in_unprepare(input);
      +
    6. + +
    7. After you have finished working with the audio input device, deinitialize it using the audio_in_destroy() function:

      +
      +/* Deinitialize the audio input device */
      +error_code = audio_in_destroy(input);
      +
    8. +
    + +

    Managing Asynchronous Recording

    + +

    Recording audio asynchronously involves:

    + +
      +
    1. Starting asynchronous recording

    2. +
    3. Stopping asynchronous recording

    4. +
    + +

    Starting Asynchronous Recording

    + +

    The asynchronous recording process uses a callback function for storing the audio recorded by the audio input device. The callback function is invoked asynchronously for each chunk of recorded audio. In this use case, the audio data is stored in a file rather than a local buffer.

    + +

    To start recording audio:

    + +
    1. Set the callback function using the audio_in_set_stream_cb() function. Use this function before calling the audio_in_prepare() function, because otherwise the callback function is never invoked.

      + +
      +/* Set a callback function that is invoked asynchronously for each chunk of recorded audio */
      +error_code = audio_in_set_stream_cb(input, _audio_io_stream_read_cb, NULL);
      +
      +
    2. + +
    3. +

      Create and open the file for storing the audio data:

      + +
      +#include <storage.h>
      +
      +/* Prepare the file where the recorded audio data is stored */
      +char io_stream_w_path[200];
      +char *storage_path;
      +/* You can find the storage ID using the storage_foreach_device_supported() function */
      +int error = storage_get_directory(storage_id, STORAGE_DIRECTORY_SOUNDS, &storage_path);
      +snprintf(io_stream_w_path, 200, "%s/%s", storage_path, "pcm_w.raw");
      +free(storage_path);
      +
      +FILE* fp_w = fopen(io_stream_w_path, "w");
      +if (!fp_w)
      +    dlog_print(DLOG_ERROR, LOG_TAG, "fopen() function failed while opening %s file!", io_stream_w_path);
      +
      +

      The storage_get_directory() function of the Storage API (in mobile and wearable applications) retrieves the storage path based on the storage ID. To retrieve the storage ID, use the storage_foreach_device_supported() function of the Storage API.

      +
    4. + +
    5. +

      Prepare the audio input device and start the recording process using the audio_in_prepare() function:

      + +
      +/* Prepare the audio input device (starts the hardware recording process) */
      +error_code = audio_in_prepare(input);
      +
      + +

      The hardware device starts buffering the audio recorded by the audio input device. The audio data is buffered to the internal input buffer. The callback function is invoked separately for each chunk of audio data.

      +
    6. + +
    7. +

      To store the recorded audio data in the file (inside the callback function):

      +
        +
      1. Retrieve a pointer to the internal input buffer and the number of recorded audio data bytes using the audio_in_peek() function.
      2. +
      3. Retrieve the recorded audio data from the internal input buffer and store it in the file using the fwrite() function.
      4. +
      5. Remove the recorded audio data, since it is no longer needed, from the internal input buffer using the audio_in_drop() function.
      6. +
      + +
      +/* Callback invoked for each chunk of recorded audio */
      +void
      +_audio_io_stream_read_cb(audio_in_h handle, size_t nbytes, void *userdata)
      +{
      +    const void * buffer = NULL;
      +
      +    if (nbytes > 0) {
      +        /* Retrieve a pointer to the internal input buffer and the number of recorded audio data bytes */
      +        int error_code = audio_in_peek(handle, &buffer, &nbytes);
      +        if (error_code != AUDIO_IO_ERROR_NONE) {
      +            dlog_print(DLOG_ERROR, LOG_TAG, "audio_in_peek() failed! Error code = %d", error_code);
      +
      +            return;
      +        }
      +
      +        /* Store the recorded audio data in the file */
      +        fwrite(buffer, sizeof(char), nbytes, fp_w);
      +
      +        /* Remove the recorded audio data from the internal input buffer */
      +        error_code = audio_in_drop(handle);
      +        if (error_code != AUDIO_IO_ERROR_NONE)
      +            dlog_print(DLOG_ERROR, LOG_TAG, "audio_in_drop() failed! Error code = %d", error_code);
      +    }
      +}
      +
    8. +
    + +

    Stopping Asynchronous Recording

    + +

    To stop recording audio:

    + +
    1. Stop the recording process using the audio_in_unprepare() function:

      + +
      +/* Stop the hardware recording process */
      +error_code = audio_in_unprepare(input);
      +
      +

      The device no longer invokes the callback function.

      +
    2. +
    3. +

      If you no longer need asynchronous recording, or if you want to set the callback function separately for each asynchronous recording session, unset the callback function using the audio_in_unset_stream_cb() function:

      +
      +/* Unset the callback function used for asynchronous recording */
      +error_code = audio_in_unset_stream_cb(input);
      +
      +
    4. + +
    5. After you have finished working with the audio input device, deinitialize it using the audio_in_destroy() function:

      +
      +/* Deinitialize the audio input device */
      +error_code = audio_in_destroy(input);
      +
    6. + +
    7. Close the file where the recorded audio is stored using the fclose() function:

      + +
      +/* Close the file used for asynchronous recording */
      +error_code = fclose(fp_w);
      +fp_w = NULL;
      +
      +
    8. + +
    + + + +
    + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.guides/html/native/media/screen_mirroring_n.htm b/org.tizen.guides/html/native/media/screen_mirroring_n.htm index 90d94ef..f2c4047 100644 --- a/org.tizen.guides/html/native/media/screen_mirroring_n.htm +++ b/org.tizen.guides/html/native/media/screen_mirroring_n.htm @@ -42,17 +42,17 @@

    Screen Mirroring

    -

    You can mirror the device screen and sound to another device wirelessly using the screen mirroring feature. Tizen follows the Wi-Fi Display Technical Specification and supports the feature as a sink, which receives shared data from a source device that supports the Wi-Fi Display, and displays it. Remember to prepare your application to use the screen mirroring sink functionality and set up the necessary callbacks before you start, and release the resources when you are done.

    +

    You can mirror the device screen and sound to another device wirelessly using the screen mirroring feature. Tizen follows the Wi-Fi Display Technical Specification and supports the feature as a sink, which receives shared data from a source device that supports the Wi-Fi Display, and displays it. Remember to prepare your application to use the screen mirroring sink functionality and set up the necessary callbacks before you start, and release the resources when you are done.

    This feature is supported in mobile applications only.

    The main features of the Screen Mirroring API include:

    • Managing the connection to the screen mirroring source -

      You can connect to and disconnect from a screen mirroring source, and start, pause, and resume the screen mirroring sink.

      +

      You can connect to a screen mirroring source, and start, pause, and resume the screen mirroring sink. Disconnect and release the resources when you are done.

    • Setting the properties -

      You can set the resolution or display for the mirror.

      +

      You can set the resolution or display for the mirror.

    • Monitoring state changes in the screen mirroring sink

      To track state changes, you can register a callback with the scmirroring_sink_set_state_changed_cb() function. The callback is triggered when the screen mirroring state changes or an error occurs.

      @@ -68,28 +68,11 @@

      Figure: Function call diagram

      Function call diagram

      -

      Warm-up

      -

      Become familiar with Screen Mirroring API basics by learning about:

      - - -

      Prerequisites

      To enable your application to use the screen mirroring functionality:

        -
      1. To use the functions and data types of the Screen Mirroring API, include the <scmirroring_type.h> and <scmirroring_sink.h> header files in your application:

        diff --git a/org.tizen.guides/html/native/media/sound_n.htm b/org.tizen.guides/html/native/media/sound_n.htm
        index 5ed54a3..f441bd6 100644
        --- a/org.tizen.guides/html/native/media/sound_n.htm
        +++ b/org.tizen.guides/html/native/media/sound_n.htm
        @@ -27,9 +27,6 @@
         		

    Content

      -
    • Volume Control
    • -
    • Sound Session Types
    • -
    • Sound Device Query
    • Prerequisites
    • Setting the Sound Session Type
    • Controlling the Volume
    • @@ -48,42 +45,29 @@

      Sound Manager

      -

      The sound manager allows you to control the audio behavior of your application.

      +

      The sound manager allows you to control the audio behavior of your application.

      The main features of the Sound Manager API include:

      -

      Before you start, remember to prepare your application to use the sound manager functionality.

      - -

      Volume Control

      - -

      You can manage the volume level of a particular sound type. With the Sound Manager API, you can set and get a volume level and a maximum volume level of a particular sound type.

      - -

      Normally, if there is an active output stream, the sound_manager_get_current_sound_type() function returns the sound type of that stream, and if not, it returns an error message. However, you can set a particular sound type as current using the sound_manager_set_current_sound_type() function. This enables other applications, such as a volume application, to manage the volume level of the particular sound type even though it is not currently playing.

      - - - - - - - - - - -
      Note
      Setting the current sound type affects the entire system. When no longer needed, unset the current sound type using the sound_manager_unset_current_sound_type() function.
      +

      Prerequisites

      -

      Sound Session Types

      +

      To use the functions and data types of the Sound Manager API (in mobile and wearable applications), include the <sound_manager.h> header file in your application:

      +
      +#include <sound_manager.h>
      +
      +

      Setting the Sound Session Type

      The Sound Manager API offers 5 different sound session types: media, alarm, notification, emergency and VOIP. According to these types, your application's audio works in a specific way to mix with sounds of other applications or to respond to an audio interruption made by another application.

      The alarm, notification, emergency, and VOIP sessions are prioritized over the media session. For example, when an alarm is activated while you are playing a media file, the system pauses the media session, and the alarm session gets the permission to play its sound.

      @@ -92,53 +76,6 @@

      You can also set options for resuming the media session when the interruption ends by using the sound_session_option_for_resumption_e enumerator (in mobile and wearable applications). The sound system notifies the media session when the interruption ends, and you are able to resume your session.

      -

      Sound Device Query

      -

      The audio behavior of your application must differ in accordance with the various sound devices that are connected.

      - -

      Use the sound_manager_get_current_device_list() function to get the list handle of the currently connected sound devices. With the sequential search of this device list, you can get the device handle of each device on the list. You can use the sound_manager_get_next_device() and sound_manager_get_prev_device() functions for a sequential search of the device list.

      - -

      With the device handle, you can query the sound device information with the following functions:

      -
      • sound_manger_get_device_type(): To get the device type.
      • -
      • sound_manager_get_device_io_direction(): To get the device IO direction.
      • -
      • sound_manager_get_device_id(): To get the device ID.
      • -
      • sound_manager_get_device_name(): To get the device name.
      • -
      • sound_manager_get_device_state(): To get the device state.
      - -

      To get a notification when the sound device connection or information has changed, register the sound_manager_set_device_connected_cb() and sound_manager_set_device_information_changed_cb() callbacks. The initial state of the connected sound device is deactivated.

      - -

      When getting a sound device list or setting callbacks, use the sound_device_mask_e enumerator (in mobile and wearable applications) to specify the sound devices that you want. With a combination of the masks, you can to narrow down the sound devices to those you actually need.

      - -

      Warm-up

      - -

      Become familiar with the Sound Manager API basics by learning about:

      - - -

      Follow-up

      - -

      Once we have learned the basics of the Sound Manager API, we can now move on to more advanced tasks, including:

      - - - -

      Prerequisites

      - -

      To use the functions and data types of the Sound Manager API (in mobile and wearable applications), include the <sound_manager.h> header file in your application:

      -
      -#include <sound_manager.h>
      -
      - -

      Setting the Sound Session Type

      To set the sound session type for your application and monitor sound session interruptions:

      @@ -185,6 +122,20 @@ error_code = sound_manager_unset_session_interrupted_cb();

      Controlling the Volume

      +

      You can manage the volume level of a particular sound type. With the Sound Manager API, you can set and get a volume level and a maximum volume level of a particular sound type.

      + +

      Normally, if there is an active output stream, the sound_manager_get_current_sound_type() function returns the sound type of that stream, and if not, it returns an error message. However, you can set a particular sound type as current using the sound_manager_set_current_sound_type() function. This enables other applications, such as a volume application, to manage the volume level of the particular sound type even though it is not currently playing.

      + + + + + + + + + + +
      Note
      Setting the current sound type affects the entire system. When no longer needed, unset the current sound type using the sound_manager_unset_current_sound_type() function.

      To control the volume of your application:

      @@ -259,6 +210,12 @@ ret = sound_manager_set_volume(type, value);

      Querying Sound Devices

      +

      The audio behavior of your application must differ in accordance with the various sound devices that are connected.

      + +

      Use the sound_manager_get_current_device_list() function to get the list handle of the currently connected sound devices. With the sequential search of this device list, you can get the device handle of each device on the list. You can use the sound_manager_get_next_device() and sound_manager_get_prev_device() functions for a sequential search of the device list.

      + + +

      To get a notification when the sound device connection or information has changed, register the sound_manager_set_device_connected_cb() and sound_manager_set_device_information_changed_cb() callbacks. The initial state of the connected sound device is deactivated.

      To query sound device information:

      @@ -268,6 +225,7 @@ ret = sound_manager_set_volume(type, value);

      To access the sound device information:

      1. +

        Use the sound_device_mask_e enumerator (in mobile and wearable applications) to specify the sound devices that you want. With a combination of the masks, you can to narrow down the sound devices to those you actually need when getting a sound device list or setting callbacks.

        To only access the sound devices whose information you need, define a combination of masks:

         int ret;
        @@ -291,7 +249,14 @@ ret = sound_manager_get_current_device_list(mask, &list);
         
      2. Retrieve the sound device information.

        -

        You can query sound device information with a sound device handle. The Sound Manager API provides a dedicated function for each information type: device type, IO direction, ID, name, and state. When calling the query functions, use the sound device handle as the first parameter (input) and the device information type enumerator as the second parameter (output).

        + +

        With the device handle, you can query the sound device information with the following functions:

        +
        • sound_manger_get_device_type(): To get the device type.
        • +
        • sound_manager_get_device_io_direction(): To get the device IO direction.
        • +
        • sound_manager_get_device_id(): To get the device ID.
        • +
        • sound_manager_get_device_name(): To get the device name.
        • +
        • sound_manager_get_device_state(): To get the device state.
        +

        When calling the query functions, use the sound device handle as the first parameter (input) and the device information type enumerator as the second parameter (output).

        The following example code shows how to retrieve information about sound device type and IO direction:

         while ((_ret = sound_manager_get_next_device(list, &device)) == SOUND_MANAGER_ERROR_NONE) {
        diff --git a/org.tizen.guides/html/native/media/stream_recorder_n.htm b/org.tizen.guides/html/native/media/stream_recorder_n.htm
        index 2d3e31c..f75f390 100644
        --- a/org.tizen.guides/html/native/media/stream_recorder_n.htm
        +++ b/org.tizen.guides/html/native/media/stream_recorder_n.htm
        @@ -45,8 +45,6 @@
         
         

        Tizen provides basic stream recorder features, including audio and video recording from a live buffer. With the stream recorder, live audio and video can be kept in your target.

        -

        Before you start, remember to prepare your application to use the stream recorder functionalities.

        -

        The main features of the StreamRecorder API include:

        • Creating a media packet @@ -99,21 +97,6 @@

          The stream recorder functions serve as the interface with the software. Input is processed through a handle.

          -

          Warm-up

          - -

          Become familiar with the StreamRecorder API basics by learning about:

          - - -

          Prerequisites

          To enable your application to use the stream recorder functionality:

          diff --git a/org.tizen.guides/html/native/media/thumbnail_images_n.htm b/org.tizen.guides/html/native/media/thumbnail_images_n.htm index c22ba98..5557e81 100644 --- a/org.tizen.guides/html/native/media/thumbnail_images_n.htm +++ b/org.tizen.guides/html/native/media/thumbnail_images_n.htm @@ -47,23 +47,12 @@

          The main features of the Thumbnail Util API include:

          • Video and image thumbnails -

            You can create thumbnails with video and image files. Audio files are not supported. Before you start, remember to prepare your application to use the thumbnail util functionality.

          • +

            You can create thumbnails with video and image files. Audio files are not supported.

          • Custom size

            You can create the thumbnail using any size you like. The Thumbnail Util API outputs the results according to the size you have set. This means that the thumbnail can be generated even if the output size differs from the original aspect ratio.

          The requested thumbnail is provided as a raw data type with the BGRA colorspace, not a JPG or PNG file. If you want to save the thumbnail to a file, you must encode it.

          -

          Warm-up

          - -

          Become familiar with the Thumbnail Util API basics by learning about:

          - - -

          Prerequisites

          To enable your application to use the thumbnail util functionality:

          diff --git a/org.tizen.guides/html/native/messaging/email_n.htm b/org.tizen.guides/html/native/messaging/email_n.htm index 23bbaa9..5c45279 100644 --- a/org.tizen.guides/html/native/messaging/email_n.htm +++ b/org.tizen.guides/html/native/messaging/email_n.htm @@ -43,8 +43,6 @@

          This feature is supported in mobile applications only.

          -

          Before you start, remember to prepare your application to use the email functionality.

          -

          The main features of the Email API include:

          • Preparing email messages @@ -60,15 +58,6 @@

            Figure: Email service architecture

            Email service architecture

            - -

            Warm-up

            -

            Become familiar with the Email API basics by learning about:

            -

            Prerequisites

            diff --git a/org.tizen.guides/html/native/messaging/messages_n.htm b/org.tizen.guides/html/native/messaging/messages_n.htm index 7ec333f..9b0fa02 100644 --- a/org.tizen.guides/html/native/messaging/messages_n.htm +++ b/org.tizen.guides/html/native/messaging/messages_n.htm @@ -52,20 +52,7 @@
          • Messaging notifications

            You can register and deregister callback functions to be notified when an outgoing message is successfully sent or an incoming message has been received.

          -

          Before you start, remember to prepare your application to use the messages functionality.

          -

          The sent status of SMS and MMS can be checked asynchronously. You receive a separate status report for each SMS recipient, and one status report regardless of the number of MMS recipients.

          - -

          Warm-up

          -

          Become familiar with the Messages API basics by learning about:

          -

          Prerequisites

          diff --git a/org.tizen.guides/html/native/messaging/push_n.htm b/org.tizen.guides/html/native/messaging/push_n.htm index 9e3c453..7cef1bb 100644 --- a/org.tizen.guides/html/native/messaging/push_n.htm +++ b/org.tizen.guides/html/native/messaging/push_n.htm @@ -56,59 +56,44 @@

          Push enables you to push events from an application server to your application on a Tizen device.

          -

          Once your application is successfully registered in the push server through the push service (daemon) on the device, your application server can send push messages to the application in that particular device.

          +

          Once your application is successfully registered in the push server through the push service (daemon) on the device, your application server can send push messages to the application in that particular device.

          When a push message arrives when the application is running, it is automatically delivered to the application. If not, the push service makes a sound or vibrates and adds a ticker or a badge notification to notify the user. By touching this notification, the user can check the message. The application server may send a message with a LAUNCH option. In this case, the push service forcibly launches the application and hands over the message to the application as an application control.

          -

          To use the push messaging service, the application needs the permission to access the Tizen push server. Request the permission from the Tizen push service team by email, including the necessary information. When the team approves the request, you receive a push app ID corresponding to your package ID.

          - -

          Remember to take care of security issues when sending notifications with sensitive information.

          +

          The main features of the Push API include:

          +

          Figure: Push messaging service

          Push messaging service

          -

          Service Architecture

          +

          Service Architecture

          The following figure illustrates the service architecture of the Tizen push messaging service.

          Figure: Service architecture

          Service architecture

          The following steps illustrate a typical scenario for using the push messaging service on a Tizen device:

            -
          1. The application on the device registers for the push messaging service. Before you start, remember to prepare your application to use the push functionality.
          2. -
          3. When an application is installed and launched, the device establishes a push session with the Tizen Server by sending a registration request to the Tizen push server through the push service. +
          4. The application on the device registers for the push messaging service.
          5. +
          6. When an application is installed and launched, the device establishes a push session with the Tizen Server by sending a registration request to the Tizen push server through the push service.

            The push session is managed by the Tizen server and device platform, so there is no need to create any code to manage it within the application.

          7. -
          8. If the registration request is approved, the application receives through the push service a registration ID. The registration ID is a unique key used to identify the application installed in that particular device and route the push message. +
          9. If the registration request is approved, the application receives through the push service a registration ID. The registration ID is a unique key used to identify the application installed in that particular device and route the push message.

            The application delivers the registration ID to the application server. This registration ID is used to identify the application installed in that particular device.

          10. -
          11. When the application server needs to send a push message to the application in the particular device, it calls the Tizen server's open API to send the message together with the registration ID. (For more information for server developers about sending push messages, see Sending Push Notifications.) +
          12. When the application server needs to send a push message to the application in the particular device, it calls the Tizen server's open API to send the message together with the registration ID. (For more information for server developers about sending push messages, see Sending Push Notifications.)

            A text message of up to 1024 bytes can be sent in a push message. If the application needs to download a large amount of data, the application server sends a link to the data in the push message.

          13. When the Tizen push server receives the message and the registration ID, it checks which device has the application with the particular registration ID and then routes the message to that device.
          14. -
          15. When the push service receives the message and the registration ID, it sends the message to the destination application, which receives the push message.
          16. +
          17. When the push service receives the message and the registration ID, it sends the message to the destination application, which receives the push message.
          -

          Warm-up

          -

          Become familiar with the Push API basics by learning about:

          - -

          Prerequisites

          To enable your application to use the push functionality:

          diff --git a/org.tizen.guides/html/native/messaging/push_server_n.htm b/org.tizen.guides/html/native/messaging/push_server_n.htm index 1d36fc6..a6d2e45 100644 --- a/org.tizen.guides/html/native/messaging/push_server_n.htm +++ b/org.tizen.guides/html/native/messaging/push_server_n.htm @@ -42,17 +42,16 @@

          Push Server

          -

          Push enables you to push events from an application server to your application on a Tizen device. You can also decorate the push notification in the quick panel. If the message sending fails for any reason, an error code identifying the failure reason is returned. You can use the error code to determine how to handle the failure.

          +

          Push enables you to push events from an application server to your application on a Tizen device. You can also decorate the push notification in the quick panel. If the message sending fails for any reason, an error code identifying the failure reason is returned. You can use the error code to determine how to handle the failure.

          -

          Warm-up

          -

          Become familiar with the Push API basics by learning about:

          +

          The main features of the Push API for the server developers include:

          Sending Push Notifications

          diff --git a/org.tizen.guides/html/native/notification/attach_panel_n.htm b/org.tizen.guides/html/native/notification/attach_panel_n.htm index 1e9ee19..0f22b15 100644 --- a/org.tizen.guides/html/native/notification/attach_panel_n.htm +++ b/org.tizen.guides/html/native/notification/attach_panel_n.htm @@ -26,6 +26,7 @@

        Content

          +
        • Content Categories
        • Prerequisites
        • Creating an Attach Panel
        • Managing an Attach Panel
        • @@ -44,52 +45,46 @@

          This feature is supported in mobile applications only.

          +

          The main features of the Attach panel API include:

          + +

          Figure: Attach panel

          Attach panel

          -

          You can create an attach panel to allow the user to attach some files, and you can manage the attach panel.

          The attach panel has UI components and it manages user interactions on its interface. The layout component keeps on the tabbar and scroller components, which are connected to show the content synchronously. The scroller component has pages to display the content of, for example, images, camera, and voice recorder. Some content is shown as a page on the panel, while others can be launched from the panel's More tab using application controls.

          -

          The attach panel has half and full modes. The mode can be changed by swiping up and down the page. When the user adds files in the full mode, attach panel is hidden automatically. In the half mode, the user can add multiple files at a time.

          +

          The attach panel has half and full modes. The mode can be changed by swiping up and down the page.

          Figure: Attach panel modes

          Attach panel modes

          +

          Content Categories

          +

          You can manage the following types of content:

          • Images

            In the half mode, you can select only 1 image to be attached. In the full mode, you can select multiple images at once.

            -

            Figure: Images content

            -

            Images content

            +
          • Camera

            You can take a picture using the device camera, and attach it.

            -

            Figure: Camera content

            -

            Camera content

          • Voice

            You can attach a voice recording.

            -

            Figure: Voice content

            -

            Voice content

          • More tab

            The More tab shows the icons of the applications, for example, video, audio, calendar, contact, myfiles, and video recorder, that can be launched by clicking the applicable icon.

            -

            Figure: More content

            -

            More content

          -

          Before you start, remember to prepare your application to use the attach panel functionality.

          - -

          Warm-up

          -

          Become familiar with the Attach panel API basics by learning about:

          -
            -
          • Prerequisites -

            Prepare your application to use the attach panel functionality.

          • -
          • Creating an Attach Panel -

            Create an attach panel, add content categories, and set callbacks. When no longer needed, delete the attach panel.

          • -
          • Managing an Attach Panel -

            Set extra data to a content category, show and hide the panel, and get the panel state.

          • -
          +

          The following figure illustrates the content types. From left to right: images, camera, voice, and More tab.

          +

          Figure: Content categories

          +

          Images content Camera content Voice content More content

          +

          Prerequisites

          diff --git a/org.tizen.guides/html/native/notification/minicontrol_n.htm b/org.tizen.guides/html/native/notification/minicontrol_n.htm index 5e09981..ecac247 100644 --- a/org.tizen.guides/html/native/notification/minicontrol_n.htm +++ b/org.tizen.guides/html/native/notification/minicontrol_n.htm @@ -40,7 +40,7 @@

          Minicontrol Window

          -

          Minicontrol is small application view that can be shown on the quick panel or lock screen.

          +

          Minicontrol is a small application view that can be shown on the quick panel or lock screen.

          This feature is supported in mobile applications only.

          @@ -61,19 +61,6 @@

          Figure: Minicontrol on a quick panel (left) and lock screen (right)

          Minicontrol on a quick panel (left) and lock screen (right) Minicontrol on a quick panel (left) and lock screen (right)

          -

          Before you start, remember to prepare your application to use the minicontrol functionality.

          - -

          Warm-up

          -

          Become familiar with the Minicontrol API basics by learning about:

          - -

          Prerequisites

          To enable your application to use the minicontrol functionality:

          diff --git a/org.tizen.guides/html/native/notification/noti_n.htm b/org.tizen.guides/html/native/notification/noti_n.htm index c7356c6..8fe379d 100644 --- a/org.tizen.guides/html/native/notification/noti_n.htm +++ b/org.tizen.guides/html/native/notification/noti_n.htm @@ -59,14 +59,22 @@

          An application can use notifications to keep the user informed of important information.

          This feature is supported in mobile applications only.

          - -

          To use the notification feature:

          - - -

          Before you start, remember to prepare your application to use the notification functionality.

          +

          The main features of the Notification API include:

          +

          Notification Types

          Tizen provides notifications by using a combination of any of the following notification types:

          @@ -110,43 +118,8 @@

          Figure: Notification layouts

          Notification layouts

          -

          Warm-up

          - -

          Become familiar with the Notification API basics by learning about:

          - -

          Follow-up

          -

          Once we have learned the basics of the Notification API, we can now move on to more advanced tasks, including:

          - - -

          Prerequisites

          -

          To enable your application to use the notification functionality:

            diff --git a/org.tizen.guides/html/native/performance/tracepoints_n.htm b/org.tizen.guides/html/native/performance/tracepoints_n.htm index 561ffb8..e83d9af 100644 --- a/org.tizen.guides/html/native/performance/tracepoints_n.htm +++ b/org.tizen.guides/html/native/performance/tracepoints_n.htm @@ -42,35 +42,24 @@

            Tracepoints

            -

            You can insert tracepoints in Tizen native applications to perform trace operations with the T-trace tool. The tracepoints allow the framework to write application traces to the system trace buffer to align them with the T-trace traces from the Tizen platform.

            +

            You can perform trace operations in Tizen native applications with the T-trace tool. The tool allows you to generate traces and visualize them.

            -

            This feature is supported in mobile applications only.

            +

            This feature is supported in mobile applications only.

            -

            The following T-trace function types are provided for application-level tracepoints:

            -
              -
            • Synchronous tracing functions: trace_begin() and trace_end()
            • -
            • Asynchronous tracing functions: trace_async_begin() and trace_async_end()
            • -
            • Counter tracking function: trace_update_counter()
            • -
            -

            With the T-trace tool, you can generate the traces and visualize them.

            - +

            With the T-trace API, you can create custom tracepoints in your application. The tracepoints allow the framework to write application traces to the system trace buffer to align them with the T-trace traces from the Tizen platform.

            Figure: T-trace architecture

            T-trace architecture

            -

            Before you start, remember to prepare your application to use the T-trace functionality.

            - -

            Warm-up

            -

            Become familiar with the T-trace API basics by learning about:

            - - +

            The following T-trace function types are provided for application-level tracepoints:

            +
              +
            • Synchronous tracing functions: trace_begin() and trace_end()
            • +
            • Asynchronous tracing functions: trace_async_begin() and trace_async_end()
            • +
            • Counter tracking function: trace_update_counter()
            • +
            +

            Prerequisites

            To enable your application to use the T-trace functionality:

            diff --git a/org.tizen.guides/html/native/personal/account_n.htm b/org.tizen.guides/html/native/personal/account_n.htm index 8d05cc7..01f6cbf 100644 --- a/org.tizen.guides/html/native/personal/account_n.htm +++ b/org.tizen.guides/html/native/personal/account_n.htm @@ -64,13 +64,10 @@

            The main features of the Account Manager API include:

            - +
          1. Creating and managing accounts +

            You can create an account, set its properties, and insert it to the database.

            +

            You can also manage the account secrecy level and remove accounts.

            +
          2. @@ -79,11 +76,14 @@ -
            NoteTo add, update, or remove an account, you must register your account provider for all your applications belonging to the same package.
            - -

            Before you start, remember to prepare your application to use the account functionality.

            - -

            The account.h header file handles account-related information. The following table lists the account properties that can be modified. You can query the account details with database queries, retrieve the account type, and update the account information.

            + +
          3. Retrieving account information +

            You can retrieve information for each existing account and implement a callback function.

            +

            You can also get accounts based on a specific account provider package name, or account providers based on a specific capability.

          4. +
          5. Receiving account change notifications
          6. +
          7. Modifying account properties +

            The account.h header file handles account-related information. You can query the account details with database queries, retrieve the account type, and update the account information.

            +

            The following table lists the account properties that can be modified.

            Table: Account properties @@ -205,7 +205,11 @@ -
            + +
        + + +

        Account Providers

        Account providers, such as Google and Facebook, represent specific service provider-related information or protocol that provides the user accounts. To add, update, or remove accounts, you must register a specific account provider in your application.

        @@ -353,46 +357,7 @@ Account ID for setting account information. - - -

        Warm-up

        -

        Become familiar with the Account Manager API basics by learning about:

        - - -

        Follow-up

        -

        Once we have learned the basics of the Account Manager API, we can now move on to more advanced tasks, including:

        -

        Prerequisites

        To enable your application to use the account management functionality:

        diff --git a/org.tizen.guides/html/native/personal/calendar_n.htm b/org.tizen.guides/html/native/personal/calendar_n.htm index e231c10..18f9f9b 100644 --- a/org.tizen.guides/html/native/personal/calendar_n.htm +++ b/org.tizen.guides/html/native/personal/calendar_n.htm @@ -783,52 +783,6 @@ calendar_list_destroy(list, true);
    - -

    Warm-up

    - -

    Become familiar with the Calendar API basics by learning about:

    - -

    Prerequisites

    diff --git a/org.tizen.guides/html/native/personal/contacts_n.htm b/org.tizen.guides/html/native/personal/contacts_n.htm index d93b21f..aa0ca1e 100644 --- a/org.tizen.guides/html/native/personal/contacts_n.htm +++ b/org.tizen.guides/html/native/personal/contacts_n.htm @@ -132,39 +132,39 @@

    The main features of the Contacts API include:

    • Contact management -
      • Manage individual contact record details, such as name, phone number, email, address, job, instant messenger, and company, with the help of contact data-views. +
      • Persons
      • Groups -
        • Combine contacts in the same address book to create groups, allowing you to easily set the same properties (such as ringtones) for all contacts within the group.
        • -
        • Update and delete groups.
        • -
        • Manage group members and set up many-to-many relationships between groups and contacts.
      • +
        • You can combine contacts in the same address book to create groups, allowing you to easily set the same properties (such as ringtones) for all contacts within the group.
        • +
        • You can update and delete groups.
        • +
        • You can manage group members and set up many-to-many relationships between groups and contacts.
      • Address books
          -
        • Create address books using the local device (with no account), service providers (such as Samsung account), or applications (such as ChatON or Joyn).
        • -
        • Determine to which address book each contact and group belong.
        • -
        • If the address book is related to an account, handle the account using an account ID created with the Account Manager. If the local device address book has no account, the related account ID is 0. You can create only one address book for each account.
        • +
        • You can create address books using the local device (with no account), service providers (such as Samsung account), or applications (such as ChatON or Joyn).
        • +
        • You can determine to which address book each contact and group belong.
        • +
        • If the address book is related to an account, you can handle the account using an account ID created with the Account Manager. If the local device address book has no account, the related account ID is 0. You can create only one address book for each account.
      • Speed dials -
      • +
      • Phone logs -
      +
    -

    The contact service supports vCards, allowing you to import contact information from a vCard or export it to a vCard format. You can also import contacts from the device SIM card to the contacts database.

    +

    The contact service supports vCards, allowing you to import contact information from a vCard or export it to a vCard format. You can also import contacts from the device SIM card to the contacts database.

    The following figure illustrates the different entities and their relationships in the contact service.

    @@ -818,116 +818,6 @@ contacts_record_destroy(contact, true); -

    Warm-up

    - -

    Become familiar with the Contacts API basics by learning about:

    - - - -

    Follow-up

    - -

    Once we have learned the basics of the Contacts API, we can now move on to more advanced tasks, including:

    - - -

    Prerequisites

    To enable your application to use the contact functionality:

    diff --git a/org.tizen.guides/html/native/personal/context_n.htm b/org.tizen.guides/html/native/personal/context_n.htm index 7c67b5e..d66b5f5 100644 --- a/org.tizen.guides/html/native/personal/context_n.htm +++ b/org.tizen.guides/html/native/personal/context_n.htm @@ -26,11 +26,11 @@

    Content

    Related Info

      @@ -48,7 +48,12 @@

      This feature is supported in mobile applications only.

      -

      The Contextual History API provides history data about application usage, media playback, communications, and device settings. When an application reads each type of history data, the application can set filters to specify the necessary statistics. The following example shows how to get information about the 5 most frequently used applications from the last 30 days.

      +

      The Contextual History API provides history data about application usage, media playback, communications, and device settings.

      +

      The main features of the Contextual History API include:

      +
        +
      • Getting a profile data list +

        You can get the device usage history profiles as a list of data records.

        +

        When an application reads each type of history data, the application can set filters to specify the necessary statistics. The following example shows how to get information about the 5 most frequently used applications from the last 30 days.

         /* Setting filter key and values */
         context_history_filter_set_int(filter, CONTEXT_HISTORY_FILTER_RESULT_SIZE, 5);
        @@ -58,10 +63,108 @@ context_history_filter_set_int(filter, CONTEXT_HISTORY_FILTER_TIME_SPAN, 30);
         context_history_list_h list;
         context_history_get_list(handle, CONTEXT_HISTORY_FREQUENTLY_USED_APP, filter, &list);
         
        -

        -Once the context_history_list_h data handle is retrieved through the context_history_get_list() function, you can retrieve the attributes of each data record of the handle. You can use the context_history_list_get_current() function to get the current record and the context_history_record_get_string() and context_history_record_get_int() functions to access its values.

        +
      • +
      • Enumerating profile data lists +

        You can enumerate the records contained in the retrieved profile data list.

        +

        Once the context_history_list_h data handle is retrieved through the context_history_get_list() function, you can retrieve the attributes of each data record of the handle. You can use the context_history_list_get_current() function to get the current record and the context_history_record_get_string() and context_history_record_get_int() functions to access its values.

      • +
      + +

      Prerequisites

      +

      To use the functions and data types of the Contextual History API, include the <context_history.h> header file in your application:

      +
      +#include <context_history.h>
      +
      + + +

      Getting a Profile Data List

      + +

      To retrieve a contextual history profile:

      +
        +
      1. Create 2 handles: 1 for using the Contextual History API and 1 for the filter: +
        +/* Contextual History API handle */
        +context_history_h handle;
        +context_history_create(&handle);
        +
        +/* Filter handle */
        +context_history_filter_h filter;
        +context_history_filter_create(&filter);
        +
        +
      2. +
      3. Get information about the 5 applications used most frequently during the last 2 weeks (14 days) while a headphone has been connected: +
        +/* Requesting the top 5 applications */
        +context_history_filter_set_int(filter, CONTEXT_HISTORY_FILTER_RESULT_SIZE, 5);
        +
        +/* Limiting the time span of usage logs to 14 days */
        +context_history_filter_set_int(filter, CONTEXT_HISTORY_FILTER_TIME_SPAN, 14);
        +
        +/* Limiting the context to the applications used while a headphone is connected */
        +context_history_filter_set_int(filter, CONTEXT_HISTORY_FILTER_AUDIO_JACK, CONTEXT_HISTORY_FILTER_AUDIO_JACK_CONNECTED);
        +
        +
      4. +
      5. Retrieve profile data based on the defined filter: +
        +context_history_list_h list;
        +
        +/* Getting the list of records */
        +context_history_get_list(handle, CONTEXT_HISTORY_FREQUENTLY_USED_APP, filter, &list);
        +
        +/* Release the filter after use */
        +context_history_filter_destroy(filter);
        +
        +
      6. +
      + +

      Enumerating Profile Data Lists

      +

      The list retrieved using the context_history_get_list() function contains a sorted list of records, each of which consists of a key and value pair.

      +

      To enumerate the list:

      +
        +
      1. Check the number of records in the list. +

        In some cases, the retrieved list can contain less records than the result size set in the filter.

        +
        +int size;
        +context_history_list_get_count(list, &size);
        +
        +
      2. +
      3. Enumerate the list using a loop: +
        +int i;
        +int count;
        +char* app_id;
        +context_history_record_h record;
        +
        +for (i = 0; i < size; ++i) {
        +    /* Getting the current record */
        +    context_history_list_get_current(list, &record);
        +
        +    /* Retrieving the application ID and the total use count from the record */
        +    context_history_record_get_string(record, CONTEXT_HISTORY_APP_ID, &app_id);
        +    context_history_record_get_int(record, CONTEXT_HISTORY_TOTAL_COUNT, &count);
        +
        +    /* Freeing the application ID string */
        +    free(app_id);
        +
        +    /* Releasing the memory occupied by the record */
        +    context_history_record_destroy(record);
        +
        +    /* Iterating to the next record */
        +    context_history_list_move_next(list);
        +}
        +
        +
      4. +
      5. Release the list to prevent any resource leaks: +
        +context_history_list_destroy(list);
        +
        +
      6. +
      7. When no longer needed, release and destroy the handle: +
        +context_history_destroy(handle);
        +
        +
      8. +
      -

      Before you start, remember to prepare your application to use the contextual history functionality.

      History Data Types

      @@ -140,6 +243,8 @@ Once the context_hist + +

      Filters and Attributes

      Regarding each history data type, one or more filters can be set to specify the necessary statistics. For example, applications can get information about the 3 most frequently used applications from the last 30 days while a headphone is connected by setting the filters of the result size, time span, and the audio jack status. The supported filters for the history data types are summarized in the following table.

      @@ -371,114 +476,6 @@ Once the context_hist - -

      Warm-up

      -

      Become familiar with the Contextual History API basics by learning about:

      - - -

      Prerequisites

      -

      To use the functions and data types of the Contextual History API, include the <context_history.h> header file in your application:

      -
      -#include <context_history.h>
      -
      - - -

      Getting a Profile Data List

      - -

      To retrieve a contextual history profile:

      -
        -
      1. Create 2 handles: 1 for using the Contextual History API and 1 for the filter: -
        -/* Contextual History API handle */
        -context_history_h handle;
        -context_history_create(&handle);
        -
        -/* Filter handle */
        -context_history_filter_h filter;
        -context_history_filter_create(&filter);
        -
        -
      2. -
      3. Get information about the 5 applications used most frequently during the last 2 weeks (14 days) while a headphone has been connected: -
        -/* Requesting the top 5 applications */
        -context_history_filter_set_int(filter, CONTEXT_HISTORY_FILTER_RESULT_SIZE, 5);
        -
        -/* Limiting the time span of usage logs to 14 days */
        -context_history_filter_set_int(filter, CONTEXT_HISTORY_FILTER_TIME_SPAN, 14);
        -
        -/* Limiting the context to the applications used while a headphone is connected */
        -context_history_filter_set_int(filter, CONTEXT_HISTORY_FILTER_AUDIO_JACK, CONTEXT_HISTORY_FILTER_AUDIO_JACK_CONNECTED);
        -
        -
      4. -
      5. Retrieve profile data based on the defined filter: -
        -context_history_list_h list;
        -
        -/* Getting the list of records */
        -context_history_get_list(handle, CONTEXT_HISTORY_FREQUENTLY_USED_APP, filter, &list);
        -
        -/* Release the filter after use */
        -context_history_filter_destroy(filter);
        -
        -
      6. -
      - -

      Enumerating Profile Data Lists

      -

      The list retrieved using the context_history_get_list() function contains a sorted list of records, each of which consists of a key and value pair.

      -

      To enumerate the list:

      -
        -
      1. Check the number of records in the list. -

        In some cases, the retrieved list can contain less records than the result size set in the filter.

        -
        -int size;
        -context_history_list_get_count(list, &size);
        -
        -
      2. -
      3. Enumerate the list using a loop: -
        -int i;
        -int count;
        -char* app_id;
        -context_history_record_h record;
        -
        -for (i = 0; i < size; ++i) {
        -    /* Getting the current record */
        -    context_history_list_get_current(list, &record);
        -
        -    /* Retrieving the application ID and the total use count from the record */
        -    context_history_record_get_string(record, CONTEXT_HISTORY_APP_ID, &app_id);
        -    context_history_record_get_int(record, CONTEXT_HISTORY_TOTAL_COUNT, &count);
        -
        -    /* Freeing the application ID string */
        -    free(app_id);
        -
        -    /* Releasing the memory occupied by the record */
        -    context_history_record_destroy(record);
        -
        -    /* Iterating to the next record */
        -    context_history_list_move_next(list);
        -}
        -
        -
      4. -
      5. Release the list to prevent any resource leaks: -
        -context_history_list_destroy(list);
        -
        -
      6. -
      7. When no longer needed, release and destroy the handle: -
        -context_history_destroy(handle);
        -
        -
      8. -
      -
    diff --git a/org.tizen.guides/html/native/personal/data_sync_n.htm b/org.tizen.guides/html/native/personal/data_sync_n.htm index 0944c98..3baf09b 100644 --- a/org.tizen.guides/html/native/personal/data_sync_n.htm +++ b/org.tizen.guides/html/native/personal/data_sync_n.htm @@ -38,6 +38,7 @@
  • Setting the Callback Functions
  • +
  • Sync Manager Variables
  • Related Info

      @@ -54,22 +55,24 @@

      Data Synchronization

      -

      Tizen provides notifications for a service application to maintain data consistency between a server and the device. You can manage the synchronization schedule for applications.

      +

      Tizen provides notifications for a service application to maintain data consistency between a server and the device.

      -

      The service and UI applications must have the same package name.

      +

      You can manage the synchronization schedule for applications by using a UI application to request for sync jobs through the Sync Manager, and a service application to listen for the requests through the Sync Adapter. The service and UI applications must have the same package name.

      -

      The Sync Manager API allows you to:

      +

      The main features of the Sync Manager API include:

      -

      Before you start, remember to prepare your application to use the sync manager functionality.

      - -

      The sync manager operates the sync jobs based on the rules defined in the following table.

      +

      Use the sync manager variables with the sync job functions. The sync manager operates the sync jobs based on the rules defined in the following table.

      @@ -103,88 +106,7 @@
      Table: Sync job scheduling rules
      -

      The following table lists the variables used with the sync manager.

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Table: Sync manager variables
      VariableData typeMandatoryDescription
      Account handleaccount_s*NoHandle of the account module for managing account-related data.
      Sync job nameconst char*YesSync job name for managing sync jobs. -

      The on-demand and periodic sync jobs can be managed by a user-defined name. If the sync_manager_add_periodic_sync_job() function is called again with same sync job name (where all details except the name and sync job ID are changed), the function does not add a new sync job but updates the existing job. This is mainly used to reset the periodic interval.

      Sync capabilityconst char*YesCapability for adding data change sync jobs. -

      A data change sync job can provide a notification whenever a corresponding data change occurs. If the sync_manager_add_data_change_sync_job() function is used with a capability, it is operated for the related capability only.

      -

      The following capabilities are available:

      -
      -#define SYNC_SUPPORTS_CAPABILITY_CALENDAR "http://tizen.org/sync/capability/calendar"
      -#define SYNC_SUPPORTS_CAPABILITY_CONTACT "http://tizen.org/sync/capability/contact"
      -#define SYNC_SUPPORTS_CAPABILITY_IMAGE "http://tizen.org/sync/capability/image"
      -#define SYNC_SUPPORTS_CAPABILITY_MUSIC "http://tizen.org/sync/capability/music"
      -#define SYNC_SUPPORTS_CAPABILITY_SOUND "http://tizen.org/sync/capability/sound"
      -#define SYNC_SUPPORTS_CAPABILITY_VIDEO "http://tizen.org/sync/capability/video"
      -
      Sync periodsync_period_eYesInterval for adding a periodic sync job. -

      If the interval is provided, the sync job is performed periodically. If you set the periodic interval to 30 minutes, a time interval is set as a power of 2 less than 30. This means that a time interval set to 16 minutes operates the sync job every 16 minutes while skipping the first notification (so the first is in 32 minutes). The same logic applies to other cases.

      -

      This variable provides a periodic sync job with an inexact time. Coupling various periodic sync jobs with an interval as a power of 2 prevents the device from waking up the service application too many times.

      -

      The sync_period_e enumerator (in mobile and wearable applications) defines the available period intervals.

      Sync optionsync_option_eYesOption for deciding the sync job behavior. -

      The behavior options can be used as an OR value. For example, the (SYNC_OPTION_EXPEDITED | SYNC_OPTION_NO_RETRY) expression is available, and means that the "Sync job is operated just once with priority".

      -

      The following options are available:

      -
      • SYNC_OPTION_NONE: Sync job is operated normally
      • -
      • SYNC_OPTION_EXPEDITED: Sync job is operated as soon as possible
      • -
      • SYNC_OPTION_NO_RETRY: Sync job is not performed again when it fails
      Sync job IDint*YesUnique ID for managing sync jobs. -

      The ID is generated when a sync job is added. It is required to remove the sync job. The number of ID that can be generated is restricted to a hundred per a package.

      Sync job user databundle*NoUser data for sync jobs. -

      The data can contain additional information related to the registered sync jobs.

      User datavoid*NoUser data for the sync_manager_for_each_sync_job() function. -

      The data can contain additional information related to the foreach jobs.

      +

      Sync Adapter

      @@ -210,28 +132,6 @@
    - -

    Warm-up

    -

    Become familiar with the Sync Manager API basics by learning about:

    - -

    Prerequisites

    To enable your application to use the data synchronization functionality:

      @@ -608,6 +508,92 @@ result = sync_adapter_unset_callbacks();
    +

    Sync Manager Variables

    + + +

    The following table lists the variables used with the sync manager.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table: Sync manager variables
    VariableData typeMandatoryDescription
    Account handleaccount_s*NoHandle of the account module for managing account-related data.
    Sync job nameconst char*YesSync job name for managing sync jobs. +

    The on-demand and periodic sync jobs can be managed by a user-defined name. If the sync_manager_add_periodic_sync_job() function is called again with same sync job name (where all details except the name and sync job ID are changed), the function does not add a new sync job but updates the existing job. This is mainly used to reset the periodic interval.

    Sync capabilityconst char*YesCapability for adding data change sync jobs. +

    A data change sync job can provide a notification whenever a corresponding data change occurs. If the sync_manager_add_data_change_sync_job() function is used with a capability, it is operated for the related capability only.

    +

    The following capabilities are available:

    +
    +#define SYNC_SUPPORTS_CAPABILITY_CALENDAR "http://tizen.org/sync/capability/calendar"
    +#define SYNC_SUPPORTS_CAPABILITY_CONTACT "http://tizen.org/sync/capability/contact"
    +#define SYNC_SUPPORTS_CAPABILITY_IMAGE "http://tizen.org/sync/capability/image"
    +#define SYNC_SUPPORTS_CAPABILITY_MUSIC "http://tizen.org/sync/capability/music"
    +#define SYNC_SUPPORTS_CAPABILITY_SOUND "http://tizen.org/sync/capability/sound"
    +#define SYNC_SUPPORTS_CAPABILITY_VIDEO "http://tizen.org/sync/capability/video"
    +
    Sync periodsync_period_eYesInterval for adding a periodic sync job. +

    If the interval is provided, the sync job is performed periodically. If you set the periodic interval to 30 minutes, a time interval is set as a power of 2 less than 30. This means that a time interval set to 16 minutes operates the sync job every 16 minutes while skipping the first notification (so the first is in 32 minutes). The same logic applies to other cases.

    +

    This variable provides a periodic sync job with an inexact time. Coupling various periodic sync jobs with an interval as a power of 2 prevents the device from waking up the service application too many times.

    +

    The sync_period_e enumerator (in mobile and wearable applications) defines the available period intervals.

    Sync optionsync_option_eYesOption for deciding the sync job behavior. +

    The behavior options can be used as an OR value. For example, the (SYNC_OPTION_EXPEDITED | SYNC_OPTION_NO_RETRY) expression is available, and means that the "Sync job is operated just once with priority".

    +

    The following options are available:

    +
    • SYNC_OPTION_NONE: Sync job is operated normally
    • +
    • SYNC_OPTION_EXPEDITED: Sync job is operated as soon as possible
    • +
    • SYNC_OPTION_NO_RETRY: Sync job is not performed again when it fails
    Sync job IDint*YesUnique ID for managing sync jobs. +

    The ID is generated when a sync job is added. It is required to remove the sync job. The number of ID that can be generated is restricted to a hundred per a package.

    Sync job user databundle*NoUser data for sync jobs. +

    The data can contain additional information related to the registered sync jobs.

    User datavoid*NoUser data for the sync_manager_for_each_sync_job() function. +

    The data can contain additional information related to the foreach jobs.

    +
    diff --git a/org.tizen.guides/html/native/personal/fido_n.htm b/org.tizen.guides/html/native/personal/fido_n.htm index 8851096..50b4928 100644 --- a/org.tizen.guides/html/native/personal/fido_n.htm +++ b/org.tizen.guides/html/native/personal/fido_n.htm @@ -48,10 +48,8 @@

    The FIDO (Fast IDentity Online) Alliance is a organization formed to address the lack of interoperability among strong authentication devices as well as the problems users face with creating and remembering multiple usernames and passwords.

    -

    FIDO covers both password-less authentications, such as fingerprint, iris, and voice, and multi-factor authentication, such as OTP and USB dongle. Tizen currently does not support multi-factor authentication.

    +

    FIDO covers both password-less authentications (through FIDO UAF components), such as fingerprint, iris, and voice, and multi-factor authentication, such as OTP and USB dongle. Tizen currently does not support multi-factor authentication.

    FIDO Alliance provides certification for FIDO-compliant products through FIDO Ready™.

    - -

    Before you start, remember to prepare your application to use the FIDO functionality.

    FIDO UAF Components

    UAF (Universal Authentication Framework) authenticators can be connected to a user device using various physical interfaces, such as SPI, USB, and Bluetooth. The UAF Authenticator-Specific Module (ASM) is a software interface on top of UAF authenticators, which gives a standardized way for the FIDO UAF clients to detect and access the functionality of UAF authenticators, and hides the internal communication complexity from the clients.

    @@ -99,27 +97,6 @@
  • FIDO UAF authenticator metadata validation

    In the FIDO UAF context, attestation is how authenticators make claims to a relying party during registration that the keys they generate, and certain measurements they report, originate from genuine devices with certified characteristics. An attestation signature, carried in a FIDO UAF registration protocol message, is validated by the FIDO UAF server.

  • - -

    Warm-up

    - -

    Become familiar with the FIDO Client API basics by learning about:

    - -

    Prerequisites

    To use the FIDO Client API (in mobile and wearable applications), the application has to request permission by adding the following privilege to the tizen-manifest.xml file:

    diff --git a/org.tizen.guides/html/native/personal/oauth_n.htm b/org.tizen.guides/html/native/personal/oauth_n.htm
    index 1c6e8c7..22d9346 100644
    --- a/org.tizen.guides/html/native/personal/oauth_n.htm
    +++ b/org.tizen.guides/html/native/personal/oauth_n.htm
    @@ -46,19 +46,17 @@
         
     

    OAuth 2.0

    - -

    The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf.

    - - -

    Before you start, remember to prepare your application to use the OAuth 2.0 functionality.

    - -

    The OAuth 2.0 API allows you to:

    -

    To request an access token for the implicit, resource owner password credentials, or client credentials grant type, follow the direct access token request instructions.

    - - - -

    Warm-up

    - -

    Become familiar with the OAuth 2.0 API basics by learning about:

    -

    Prerequisites

    diff --git a/org.tizen.guides/html/native/security/dpm_n.htm b/org.tizen.guides/html/native/security/dpm_n.htm index 4854647..8b499c0 100644 --- a/org.tizen.guides/html/native/security/dpm_n.htm +++ b/org.tizen.guides/html/native/security/dpm_n.htm @@ -1,174 +1,165 @@ - - - - - - - - - - - - - Device Policy Management - - - -
    -
    -

    Mobile native Wearable native

    -
    - -
    -

    Dependencies

    -
      -
    • Tizen 3.0 and Higher for Mobile
    • -
    • Tizen 3.0 and Higher for Wearable
    • -
    -

    Content

    - -

    Related Info

    - -
    -
    - -
    -

    Device Policy Management

    - -

    The Device Policy Management (DPM) framework supports enterprise applications by providing IT administrators means to create security-aware applications. They are useful in situations where IT administrators require rich control over employee devices.

    -

    DPM consists of a device policy client library and a device policy manager. The device policy manager manages all device policies and provides interfaces for the device policy client library. The device policy client library contains the device administration functions the client application can call. Internally, the device policy client library communicates with the device policy manager using a built-in remote method invocation engine.

    - -

    The main features of the Device Policy Manager API include:

    - -
      -
    • Checking restrictions -

      You can check the restriction states of the device, such as camera, microphone, Wi-Fi, Bluetooth, and USB, using the getter functions of the Restriction policy group API (in mobile and wearable applications).

      -

      You can also check the external and internal storage encryption state using the Security policy group API (in mobile and wearable applications) and get the name of the created zone and the zone state using the Zone policy group API (in mobile and wearable applications).

    • -
    - -

    The following figure illustrates the DPM framework process.

    - -

    Figure: DPM framework process

    -

    DPM framework process

    - -

    Warm-up

    -

    - Become familiar with the Device Policy Manager API basics by learning about:

    -
      -
    • Prerequisites -

      Prepare your application to use the DPM framework functionality.

    • -
    • Managing Device Policies -

      Create a DPM handle, track policy changes, and check the device restriction state.

    • -
    - -

    Prerequisites

    - -

    To use the functions and data types of the Device Policy Manager API (in mobile and wearable applications), include the <dpm/device-policy-manager.h> header file in your application:

    -
    -#include <dpm/device-policy-manager.h>
    -
    - -

    Managing Device Policies

    - -

    To manage device policies:

    -
      - -
    1. Create a DPM handle: -
      -device_policy_manager_h dpm;
      -
      -/* Create a DPM handle */
      -dpm = dpm_manager_create();
      -
      -
    2. - -
    3. Add a policy change callback to the device policy manager: -
      -int callback_id;
      -
      -/* Create the policy change callback function */
      -void
      -on_policy_changed(const char* name, const char* value, void* data)
      -{
      -    int state = strcmp(value, "allowed") ? 0 : 1;
      -
      -    if (strcmp(name, "camera") == 0) {
      -        if (state)
      -            /* Using the camera is allowed */
      -        else
      -            /* Using the camera is not allowed */
      -    } 
      -}
      -
      -/* Add the policy change callback to the device policy manager */
      -int
      -dpm_init()
      -{
      -    int ret = dpm_add_policy_changed_cb(dpm, "camera", on_policy_changed, user_data, &callback_id);
      -    if (ret < 0)
      -        /* Error handling */	
      -}
      -
      -
    4. - -
    5. Check the device restriction state: -
      -#include <dpm/restriction.h>
      -
      -int state;
      -
      -/* Check the restriction state of the camera */
      -if (dpm_restriction_get_camera_state(dpm, &state) == DPM_ERROR_NONE) {
      -    /* state: 0: using the camera is not allowed */
      -    /* state: 1: using the camera is allowed */
      -}
      -
      -
    6. - -
    7. When no longer needed, remove the policy change callback from the device policy manager and destroy the DPM handle: -
      -void
      -dpm_finalize()
      -{
      -    /* Remove the policy change callback from the device policy manager */
      -    dpm_remove_policy_changed_cb(dpm, callback_id);
      -    /* Destroy the DPM handle */
      -    dpm_manager_destroy(dpm);
      -}
      -
      -
    8. -
    - - - - -
    - -Go to top - - - - - - - + + + + + + + + + + + + + Device Policy Management + + + +
    +
    +

    Mobile native Wearable native

    +
    + +
    +

    Dependencies

    +
      +
    • Tizen 3.0 and Higher for Mobile
    • +
    • Tizen 3.0 and Higher for Wearable
    • +
    +

    Content

    + +

    Related Info

    + +
    +
    + +
    +

    Device Policy Management

    + +

    The Device Policy Management (DPM) framework supports enterprise applications by providing IT administrators means to create security-aware applications. They are useful in situations where IT administrators require rich control over employee devices.

    +

    DPM consists of a device policy client library and a device policy manager. The device policy manager manages all device policies and provides interfaces for the device policy client library. The device policy client library contains the device administration functions the client application can call. Internally, the device policy client library communicates with the device policy manager using a built-in remote method invocation engine.

    + +

    The main features of the Device Policy Manager API include:

    + +
      +
    • Checking restrictions +

      You can check the restriction states of the device, such as camera, microphone, Wi-Fi, Bluetooth, and USB, using the getter functions of the Restriction policy group API (in mobile and wearable applications).

      +

      You can also check the external and internal storage encryption state using the Security policy group API (in mobile and wearable applications) and get the name of the created zone and the zone state using the Zone policy group API (in mobile and wearable applications).

    • +
    + +

    The following figure illustrates the DPM framework process.

    + +

    Figure: DPM framework process

    +

    DPM framework process

    + + +

    Prerequisites

    + +

    To use the functions and data types of the Device Policy Manager API (in mobile and wearable applications), include the <dpm/device-policy-manager.h> header file in your application:

    +
    +#include <dpm/device-policy-manager.h>
    +
    + +

    Managing Device Policies

    + +

    To manage device policies:

    +
      + +
    1. Create a DPM handle: +
      +device_policy_manager_h dpm;
      +
      +/* Create a DPM handle */
      +dpm = dpm_manager_create();
      +
      +
    2. + +
    3. Add a policy change callback to the device policy manager: +
      +int callback_id;
      +
      +/* Create the policy change callback function */
      +void
      +on_policy_changed(const char* name, const char* value, void* data)
      +{
      +    int state = strcmp(value, "allowed") ? 0 : 1;
      +
      +    if (strcmp(name, "camera") == 0) {
      +        if (state)
      +            /* Using the camera is allowed */
      +        else
      +            /* Using the camera is not allowed */
      +    } 
      +}
      +
      +/* Add the policy change callback to the device policy manager */
      +int
      +dpm_init()
      +{
      +    int ret = dpm_add_policy_changed_cb(dpm, "camera", on_policy_changed, user_data, &callback_id);
      +    if (ret < 0)
      +        /* Error handling */	
      +}
      +
      +
    4. + +
    5. Check the device restriction state: +
      +#include <dpm/restriction.h>
      +
      +int state;
      +
      +/* Check the restriction state of the camera */
      +if (dpm_restriction_get_camera_state(dpm, &state) == DPM_ERROR_NONE) {
      +    /* state: 0: using the camera is not allowed */
      +    /* state: 1: using the camera is allowed */
      +}
      +
      +
    6. + +
    7. When no longer needed, remove the policy change callback from the device policy manager and destroy the DPM handle: +
      +void
      +dpm_finalize()
      +{
      +    /* Remove the policy change callback from the device policy manager */
      +    dpm_remove_policy_changed_cb(dpm, callback_id);
      +    /* Destroy the DPM handle */
      +    dpm_manager_destroy(dpm);
      +}
      +
      +
    8. +
    + + + + +
    + +Go to top + + + + + + + diff --git a/org.tizen.guides/html/native/security/privilege_n.htm b/org.tizen.guides/html/native/security/privilege_n.htm index 74fb370..cb06954 100644 --- a/org.tizen.guides/html/native/security/privilege_n.htm +++ b/org.tizen.guides/html/native/security/privilege_n.htm @@ -43,26 +43,14 @@

    Tizen provides privilege information for user notification.

    -

    You can retrieve the following information:

    +

    With the Privilege Info API, you can retrieve the following privilege information:

    • Privilege name: Privilege description in a simple present participle form.
    • -
    • Privilege description: Detailed information on permissions, including accessible resources and functionality, that the application can get with this privilege. It also contains information related to billing or device performance, such as cost or increase battery usage.
    • +
    • Privilege description: Detailed information on permissions, including accessible resources and functionality, that the application can get with this privilege. It also contains information related to billing or device performance, such as cost or increased battery usage.
    • Privacy name: Privacy name represents a group of privileges that are related to a certain common feature.

    From Tizen 3.0, some privileges are categorized as privacy-related, and you can switch those privileges on and off based on the user preference. You can change certain privileges' status to allow or deny them at runtime. This means that the application calling a privileged API can be prevented from using it even if the required privilege is declared in its manifest file. Specific APIs can be used to check the privacy-related privilege's current status and get the display name of the privacy that includes the privilege. For example, you can use the APIs to check the privilege's current status before entering a function that requires the privilege, and if the status is off, display a guide message to the user to ask them to go to the device settings and switch the required privacy on.

    -

    Before you start, remember to prepare your application to use the privilege info functionality.

    - -

    Warm-up

    -

    - Become familiar with the Privilege Info API basics by learning about:

    -
      -
    • Prerequisites -

      Prepare your application to use the privilege info functionality.

    • -
    • Getting Privilege Information -

      Get privilege information, such as the privilege description or the current status at runtime.

    • -
    -

    Prerequisites

    To use the functions and data types of the Privilege Info API (in mobile and wearable applications), include the <privilege_information.h> header file in your application:

    diff --git a/org.tizen.guides/html/native/security/secure_key_n.htm b/org.tizen.guides/html/native/security/secure_key_n.htm
    index ba579d5..ae39f61 100644
    --- a/org.tizen.guides/html/native/security/secure_key_n.htm
    +++ b/org.tizen.guides/html/native/security/secure_key_n.htm
    @@ -109,42 +109,6 @@
     
     
     
    -

    Before you start, remember to prepare your application to use the key manager functionality.

    - -

    Warm-up

    -

    Become familiar with the Key Manager API basics by learning about:

    - -

    Prerequisites

    To enable your application to use the key manager functionality:

    diff --git a/org.tizen.guides/html/native/security/yaca_n.htm b/org.tizen.guides/html/native/security/yaca_n.htm index b772bd6..b5cf1dc 100644 --- a/org.tizen.guides/html/native/security/yaca_n.htm +++ b/org.tizen.guides/html/native/security/yaca_n.htm @@ -57,26 +57,6 @@

    The encryption and decryption features provide simple and advanced functionalities for encrypting and decrypting data, and creating an IV. You can use symmetric or asymmetric keys for the encryption.

    - -

    Before you start, remember to prepare your application to use the YACA functionality.

    - -

    Warm-up

    -

    Become familiar with the YACA API basics by learning about:

    - -

    Prerequisites

    To enable your application to use the YACA functionality:

    diff --git a/org.tizen.guides/html/native/text_input/input_method_n.htm b/org.tizen.guides/html/native/text_input/input_method_n.htm index aa56008..e16a0e5 100644 --- a/org.tizen.guides/html/native/text_input/input_method_n.htm +++ b/org.tizen.guides/html/native/text_input/input_method_n.htm @@ -51,7 +51,7 @@

    Input Method

    -

    The input method editor (IME) is an input panel (keyboard) that lets the user input text and the platform receive the entered data. The user can select an IME as their default keyboard in the device Settings application.

    +

    The input method editor (IME) is an input panel (keyboard) that lets the user input text and the platform receive the entered data. The user can select an IME as their default keyboard in the device Settings application.

    This feature is supported in mobile applications only.

    @@ -88,8 +88,6 @@

    You can register callback functions that are called when the keyboard option menu opens or closes. These callback functions can be registered before the ime_run() function call in the ime_app_main() function.

    The device Settings application triggers the callback function to open the keyboard option menu. The keyboard itself can also trigger the callback function to open its option menu.

    -

    Before you start, remember to prepare your application to use the input method functionality.

    -

    Input Method Manager

    The Input Method Manager is a module used to manage the installed IMEs. You can use it to open the installed IME list or selector menu after your IME application is installed, and guide the user to select the installed IME:

    @@ -108,29 +106,6 @@

    You can check whether a specific IME is enabled or disabled in the system keyboard setting. You can also check which IME is currently selected as the default keyboard, or how many IMEs are enabled (usable). These features are useful when the user installs a new keyboard.

    -

    Warm-up

    -

    Become familiar with the Input Method API basics by learning about:

    - -

    Prerequisites

    To enable your application to use the input method functionality:

    diff --git a/org.tizen.guides/html/native/text_input/stt_n.htm b/org.tizen.guides/html/native/text_input/stt_n.htm index 409858a..89a0e93 100644 --- a/org.tizen.guides/html/native/text_input/stt_n.htm +++ b/org.tizen.guides/html/native/text_input/stt_n.htm @@ -30,7 +30,7 @@

    Content

    • Basic STT Processes
    • -
    • Getting STT Information
    • +
    • STT Information Retrieval
    • Prerequisites
    • Setting and Unsetting Callbacks
    • Getting Information
    • @@ -48,7 +48,17 @@

      Speech-to-text

      -

      The STT (speech-to-text) features enable recognizing sound data recorded by the user and sending the result as text. When your application creates a handle and prepares the STT service by the API, the STT daemon is invoked and connected for background work. This daemon and your application communicate as the server and the client.

      +

      The STT (speech-to-text) features enable recognizing sound data recorded by the user and sending the result as text.

      +

      When your application creates a handle and prepares the STT service by the API, the STT daemon is invoked and connected for background work. This daemon and your application communicate as the server and the client.

      +

      The main features of the STT API include:

      +
        +
      • Preparing the STT service for use +

        You can connect the background STT daemon to be able to operate the STT.

      • +
      • Using basic STT processes +

        The basic processes allow you to set and unset callbacks, control the recording, and set options.

      • +
      • Retrieving STT information +

        You can get information that includes, for example, language and state.

      • +

      Basic STT Processes

      @@ -76,14 +86,12 @@
    -

    Before you start, remember to prepare your application to use the STT functionality.

    -

    The STT life-cycle is described in the following figure.

    Figure: STT life-cycle

    STT life-cycle

    -

    Getting STT Information

    +

    STT Information Retrieval

    You can get the following information about the STT:

    • Get the current state of the STT. The state is also applied as a precondition for each function.
    • @@ -94,26 +102,6 @@
    • Get a list of the supported engines and the selection of current engines. Additional features, such as silence detection and partial result, are provided by specific engines.
    - -

    Warm-up

    -

    Become familiar with the STT API basics by learning about:

    - -

    Prerequisites

    To enable your application to use the STT functionality:

    diff --git a/org.tizen.guides/html/native/text_input/tts_n.htm b/org.tizen.guides/html/native/text_input/tts_n.htm index 1fabd71..dd0aaaf 100644 --- a/org.tizen.guides/html/native/text_input/tts_n.htm +++ b/org.tizen.guides/html/native/text_input/tts_n.htm @@ -30,7 +30,7 @@

    Content

    • Basic TTS Processes
    • -
    • Getting TTS Information
    • +
    • TTS Information Retrieval
    • Prerequisites
    • Set-up
        @@ -55,7 +55,17 @@

        Text-to-speech

        -

        The TTS (text-to-speech) features include synthesizing text into sound data as utterances and playing them. It is also possible to pause and stop playing. When your application creates a handle and prepares the TTS service by the API, the TTS daemon is invoked and connected for background work. This daemon and your application communicate as the server and the client.

        +

        The TTS (text-to-speech) features include synthesizing text into sound data as utterances and playing them. It is also possible to pause and stop playing.

        +

        When your application creates a handle and prepares the TTS service by the API, the TTS daemon is invoked and connected for background work. This daemon and your application communicate as the server and the client.

        +

        The main features of the TTS API include:

        +
          +
        • Preparing the TTS service for use +

          You can connect the background TTS daemon to be able to operate the TTS.

        • +
        • Using basic TTS processes +

          The basic processes allow you to set and unset callbacks, add text, set the mode, and control the playback.

        • +
        • Retrieving TTS information +

          You can get information on the supported voice, and the current state and voice.

        • +

        Basic TTS Processes

        @@ -82,14 +92,12 @@
      -

      Before you start, remember to prepare your application to use the TTS functionality.

      -

      The TTS life-cycle is described in the following figure.

      Figure: TTS life-cycle

      TTS life-cycle

      -

      Getting TTS Information

      +

      TTS Information Retrieval

      You can get the following information about the TTS:

      • Get the current state of the TTS. The state is also applied as a precondition for each function.
      • @@ -103,36 +111,6 @@
      • Get a list of supported voices to check whether the language and voice type you want are supported.
      - -

      Warm-up

      -

      Become familiar with the TTS API basics by learning about:

      -

      Prerequisites

      diff --git a/org.tizen.guides/html/native/text_input/voice_control_n.htm b/org.tizen.guides/html/native/text_input/voice_control_n.htm index c54c25d..eb52272 100644 --- a/org.tizen.guides/html/native/text_input/voice_control_n.htm +++ b/org.tizen.guides/html/native/text_input/voice_control_n.htm @@ -34,8 +34,8 @@
    • Managing Commands
    • Elementary control
    • @@ -51,10 +51,10 @@
    - +

    Voice Control

    -

    Voice control features allow the user to control the device through their voice. You can register general voice commands, which trigger a callback when the user speaks them. You can also register voice commands for EFL-supported UI components to perform component-related actions, such as button clicks.

    +

    Voice control features allow the user to control the device through their voice. You can register general voice commands, which trigger a callback when the user speaks them. You can also register voice commands for EFL-supported UI components to perform component-related actions, such as button clicks.

    This feature is supported in mobile applications only.

    @@ -95,8 +95,6 @@
  • When no longer needed, unprepare and deinitialize the voice control.

    You must disconnect the voice control service and deinitialize the voice control using the vc_unprepare() and vc_deinitialize() functions.

  • -

    Before you start, remember to prepare your application to use the voice control functionality.

    -

    The following figure illustrates the voice control life-cycle states.

    Figure: Voice control (left) and Voice control service (right) life-cycle states

    @@ -111,7 +109,7 @@

    Figure: Voice command hints on the screen

    Voice command hints on the screen

    -

    You have no need to consider how to recognize voice commands or start and stop the recognition process. A preloaded voice application handles the process automatically. You just need to set the command and hint on every EFL elementary component on which you want to use the voice command.

    +

    You have no need to consider how to recognize voice commands or start and stop the recognition process. A preloaded voice application handles the process automatically. You just need to set the command and hint on every EFL elementary component on which you want to use the voice command.

    When the user speaks a command corresponding to a visible EFL elementary component on the screen, the recognized command is sent to the Voice control elementary library from the Voice control service, and the action mapped to the component is executed. For example, if the component is a button, the action can be a button click.

    @@ -136,7 +134,7 @@
  • Managing commands and hints

    You can set commands and hints for visible UI components on the application screen. The hint message shows the user which command must be spoken to interact with that UI component. When the user speaks a command, the command is executed.

  • Retrieving information -

    You can get various information from the Voice control elementary API:

    +

    You can get various information from the Voice control elementary API:

    • Default language

      You can start the recognition with any language you want. However, if you do not set a specific language, the Voice control elementary library start recognizing voice commands with the default language.

    • Supported language @@ -146,10 +144,8 @@
    -

    You can set and unset a callback to get notifications when the system or application language changes.

    +

    You can set and unset a callback to get notifications when the system or application language changes.

    -

    Before you start, remember to prepare your application to use the voice control elementary functionality.

    -

    The following table lists the EFL UI components that support voice commands, and the actions supported by each component and already defined in the configuration file. Note that the label component only supports the hint without any action command.

    @@ -278,30 +274,6 @@
    Table: UI components and their actions
    -

    Warm-up

    -

    Become familiar with the Voice control and Voice control elementary API basics by learning about:

    - - -

    Prerequisites

    To enable your application to use the voice control functionality:

    @@ -929,7 +901,7 @@ destroy_command_list(vc_cmd_list_h vc_cmd_list)
  • -

    Monitoring Language Changes

    +

    Monitoring Language Changes

    To monitor when the system or application language changes:

    @@ -975,7 +947,7 @@ unset_state_changed_cb() -

    Retrieving Voice Control Information

    +

    Retrieving Voice Control Information

    To get information about supported languages, widgets, and actions:

    diff --git a/org.tizen.guides/html/web/alarm/alarms_w.htm b/org.tizen.guides/html/web/alarm/alarms_w.htm index eaf99ac..746250f 100644 --- a/org.tizen.guides/html/web/alarm/alarms_w.htm +++ b/org.tizen.guides/html/web/alarm/alarms_w.htm @@ -52,31 +52,15 @@

    The main features of the Alarm API include:

      -
    • Alarm management

      You can manage alarms by creating and deleting them. Both relative and absolute alarms are available: the relative alarm is triggered after a specified delay from the moment it is created, while an absolute alarm is triggered at a specified time and date.

      You can also create a recurring alarm that is repeated after a specified period of time, or on the given days of the week at a defined time.

      With the getAll() method, you can obtain a list of all existing alarms on the device.

    • -
    • Application launches with alarms

      You can set an alarm to launch an application when triggered.

    • -
    • Alarm events

      You can retrieve information about the next alarm event using the AlarmAbsolute (in mobile, wearable, and TV applications) and AlarmRelative (in mobile, wearable, and TV applications) interfaces. They provide the time and date of the next scheduled absolute alarm, or the time remaining before the next relative alarm.

    • -
    - -

    Before you start, remember to prepare your application to use the alarm functionality.

    - -

    To define a time period for the relative alarm or for the recurrence of an absolute alarm, you can use the following predefined constants from the Alarm API:

    -
      -
    • tizen.alarm.PERIOD_MINUTE represents the number of seconds in a minute (60).
    • -
    • tizen.alarm.PERIOD_HOUR represents the number of seconds in an hour (3600).
    • -
    • tizen.alarm.PERIOD_DAY represents the number of seconds in a day (86400).
    • -
    • tizen.alarm.PERIOD_WEEK represents the number of seconds in a week (604800).
    • +
    • Alarm management +

      You can manage alarms by creating and deleting them. You can also obtain a list of all existing alarms on the device.

    • +
    • Application launches with alarms +

      You can set an alarm to launch an application when triggered.

    • +
    • Alarm events +

      You can retrieve information about the next alarm event.

    -

    Warm-up

    -

    Become familiar with the Alarm API basics by learning about:

    - - -

    Prerequisites

    +

    Prerequisites

    To use the Alarm API (in mobile, wearable, and TV applications), the application has to request permission by adding the following privilege to the config.xml file:

    @@ -84,21 +68,30 @@
     
    -

    Managing Alarms

    - -

    Learning how to create and delete alarms is a basic alarm management skill:

    -
      +

      Managing Alarms

      + +

      Both relative and absolute alarms are available: the relative alarm is triggered after a specified delay from the moment it is created, while an absolute alarm is triggered at a specified time and date. You can also create a recurring alarm that is repeated after a specified period of time, or on the given days of the week at a defined time.

      + +

      To obtains a list of alarms, and create and delete alarms:

      + +
        +
      1. To obtain a list of all the alarms that have been set on a device but not yet triggered, use the getAll() method:

        +var alarms = tizen.alarm.getAll(); 
        +console.log(alarms.length + " alarms present in the storage.");
        +
      2. +
      3. To create an alarm: +
        • To create an absolute alarm, create an instance of the AlarmAbsolute interface (in mobile, wearable, and TV applications).

          You must define the time and date when the alarm is triggered as a Date object.

           /* Alarm is triggered at 8:00 on April 4, 2012 */
           var date = new Date(2012, 3, 4, 8, 0);
           var alarm1 = new tizen.AlarmAbsolute(date);
           
        • -
        • To create a relative alarm, create an instance of the AlarmRelative interface (in mobile, wearable, and TV applications).

          You must define the delay after which the alarm is triggered.

          +
        • To create a relative alarm, create an instance of the AlarmRelative interface (in mobile, wearable, and TV applications).

          You must define the delay after which the alarm is triggered. Use the predefined constants from the AlarmManager interface (in mobile, wearable, and TV applications).

           /* Alarm is triggered in 3 hours */
           var alarm2 = new tizen.AlarmRelative(3 * tizen.alarm.PERIOD_HOUR); 
           
        • -
        • To create a recurring absolute alarm, create an instance of the AlarmAbsolute interface.

          You must define the time and date when the alarm is triggered as a Date object. In addition, you can define a time period or the weekdays when the alarm is repeated.

          +   
        • To create a recurring absolute alarm, create an instance of the AlarmAbsolute interface.

          You must define the time and date when the alarm is triggered as a Date object. In addition, you can define the weekdays or a time period when the alarm is repeated. Define the time period using the predefined constants from the AlarmManager interface.

           /* Alarm is triggered for the first time at 8:00 on April 4, 2012 */
           var date = new Date(2012, 3, 4, 8, 0);
           
          @@ -122,10 +115,8 @@ var alarm4 = new tizen.AlarmAbsolute(date, ["SA", "SU"]);
           /* Alarm is triggered for the first time in 1 hour, and then repeated every 2 minutes */
           var alarm5 = new tizen.AlarmRelative(tizen.alarm.PERIOD_HOUR, 2 * tizen.alarm.PERIOD_MINUTE);
           
        • -
        • To obtain a list of all the alarms that have been set on a device but not yet triggered, use the getAll() method:

          -var alarms = tizen.alarm.getAll(); 
          -console.log(alarms.length + " alarms present in the storage.");
          -
        • +
      4. +
      5. To delete an alarm, use the remove() method with the alarm ID:

         /* First add created alarm to the device */
         tizen.alarm.add(alarm1, "tizen.internet"); /* Tizen alias ID is deprecated since Tizen 2.3.1 */
        @@ -134,7 +125,7 @@ tizen.alarm.remove(alarm1.id);
         

        To delete all alarms at once, use the removeAll() method.

      -

      Launching Applications with Alarms

      +

      Launching Applications with Alarms

      Learning how to launch application with alarms is a basic alarm management skill:

        @@ -154,10 +145,9 @@ tizen.alarm.add(alarm, "org.tizen.browser", appControl);
      -

      Checking for Alarm Events

      - -

      Learning how to check for the next alarm to be triggered is a basic alarm management skill:

      -
        +

        Checking for Alarm Events

        +

        You can retrieve information about the next alarm event using the AlarmAbsolute (in mobile, wearable, and TV applications) and AlarmRelative (in mobile, wearable, and TV applications) interfaces. They provide the time and date of the next scheduled absolute alarm, or the time remaining before the next relative alarm.

        +
        1. Create an absolute alarm:

           /* Alarm is triggered at 8:00 on April 4, 2012 */
           var alarm = new tizen.AlarmAbsolute(new Date(2012, 3, 4, 8, 0)); 
          diff --git a/org.tizen.guides/html/web/app_management/app_controls_w.htm b/org.tizen.guides/html/web/app_management/app_controls_w.htm
          index 77df2d2..6d8c1a1 100644
          --- a/org.tizen.guides/html/web/app_management/app_controls_w.htm
          +++ b/org.tizen.guides/html/web/app_management/app_controls_w.htm
          @@ -28,16 +28,20 @@
           		
           		

          Content

          Related Info

            @@ -62,49 +66,32 @@

            The main application management features are:

              -
            • Application management

              You can manage and retrieve information about the current application with the Application object (in mobile, wearable, and TV applications). The Application object is retrieved using the getCurrentApplication() method of the ApplicationManager interface (in mobile, wearable, and TV applications). You can exit or hide the current application using the Application interface.

            • +
            • Application management

              You can manage applications by launching and stopping other applications, and hiding or exiting the current application.

            • -
            • Application information retrieval

              You can retrieve information about applications in various ways:

              -
                -
              • Retrieve information about installed applications with the getAppInfo() and getAppsInfo() methods of the ApplicationManager interface. -

                These methods can be used to access the ApplicationInformation interface (in mobile, wearable, and TV applications) to retrieve information about installed applications, such as their name, icon path, and version.

              • -
              • Retrieve information about running applications with the getAppContext() and getAppsContext() methods of the ApplicationManager interface. -

                These methods can be used to access the ApplicationContext interface (in mobile, wearable, and TV applications) to retrieve the application ID and context ID of the running application.

                -

                The application ID can be used to retrieve application information, or to launch an application. The context ID is a unique identifier given by the platform to a running application.

              • -
            • -
            • Application controls -

              An application control (app control) is a way of sharing an application's functionality. To use another application's features through application controls reduces your efforts and time to develop your application.

              -

              You can use in your application operations, such as calling, Web browsing, and playing media items, which are exported by other applications. This mechanism allows you to conveniently launch other applications whose functionalities you need in your application. If you need to use functionality from another application, launching an application control allows you to request the system to launch that application according to your requirements. You can launch applications based on your immediate needs - you do not need to know their identifiers or specifications.

              -

              The application controls allow you to:

              -
                -
              • Make application control requests -

                The application control can be used to describe either an action to be performed by other applications, or the results of the operation performed by a launched application. You can request other applications to perform specific operations using the ApplicationControl (in mobile, wearable, and TV applications) and RequestedApplicationControl (in mobile, wearable, and TV applications) interfaces. The operations can be, for example, making a phone call, browsing local files so the user can pick an image of their choosing, or playing a video in a video player.

              • -
              • Launch applications -

                An application can be launched by the user from the Launcher or by another application. Each application has a launch mode, which determines how the application is launched: in a separate instance or in the same group as the calling application. For more information on the launch modes, see Application Groups.

                -

                With the application control you can send a request to launch other applications based on their functionality using the launchAppControl() method of the ApplicationManager interface. The launched provider application performs a specific operation and sends back a response.

                -
              • -
              • Export application controls -

                Your application can export application control functionality. This means that the application can register itself as a provider application, allowing it to receive application control requests from other applications. You can handle an incoming application control request using the getRequestedAppControl() method of the Application interface, and respond to the incoming request using the RequestedApplicationControl interface.

                -
              • -
              -
            • -
            • Event handling -

              You can send and receive events between 2 applications using events. Your application can broadcast its own events, and listen for events broadcast by others.

              -
            • -
            • Background execution -

              Usually, when a Web application moves to the background, it gets suspended. To enable background execution, you must declare a background category for your application.

              +
            • Application information retrieval

              You can display a list of applications that are currently installed or running on the device, and retrieve application information, such as application name, application ID, and context ID.

            • + +
            • Application controls +

              An application control (app control) is a way of sharing an application's functionality. To use another application's features through application controls reduces your efforts and time to develop your application.

              +

              You can use in your application operations, such as calling, Web browsing, and playing media items, which are exported by other applications. This mechanism allows you to conveniently launch other applications whose functionalities you need in your application. If you need to use functionality from another application, launching an application control allows you to request the system to launch that application according to your requirements. You can launch applications based on your immediate needs - you do not need to know their identifiers or specifications. You can use application controls by creating an application control request. The request allows you to launch other applications to use their functionalities.

              +

              If you want to allow other applications to use your application functionalities, you must export your application controls and be prepared to receive requests and respond to them.

            • + +
            • Event handling +

              You can send and receive events between 2 applications using events. Your application can broadcast its own events, and listen for events broadcast by others.

              +
            • + +
            • Background execution +

              Usually, when a Web application moves to the background, it gets suspended. To enable background execution, you must declare a background category for your application.

            -

            Before you start, remember to prepare your application to use the fundamental functionality.

            - - -

            Application Control Request and Launch

            +

            Application Control Request

            + +

            The application control can be used to describe either an action to be performed by other applications, or the results of the operation performed by a launched application. You can request other applications to perform specific operations using the ApplicationControl (in mobile, wearable, and TV applications) and RequestedApplicationControl (in mobile, wearable, and TV applications) interfaces. The operations can be, for example, making a phone call, browsing local files so the user can pick an image of their choosing, or playing a video in a video player.

            The application control consists of an operation, URI, MIME type, and some data, and it describes the request to be performed by the newly launched application. This information is used to resolve the application control. When the system gets an application control request, it finds the proper provider application by resolving the application control, and then launches the provider application. Once the provider application has performed the requested task, it must pass control back to the calling application and provide the result of the operation. Basically, the application control process flows as follows:

              -
            1. The calling application launches the application control with the launchAppControl() method of the Application interface.
            2. +
            3. The calling application launches the application control with the launchAppControl() method of the Application interface (in mobile, wearable, and TV applications).
            4. The provider application calls the getRequestedAppControl() method of the Application interface to get the reference of the RequestedApplicationControl object. This object contains the application control passed by the launchAppControl() method from the calling application.
            5. The provider application calls either the replyResult() method (in case of success) or the replyFailure() method (in case of failure) of the RequestedApplicationControl interface to return control back to the calling application. The result of the provided operation (if any), is delivered as an array of ApplicationControlData objects (in mobile, wearable, and TV applications).
            6. The calling application receives the result through the ApplicationControlDataArrayReplyCallback event handler (in mobile, wearable, and TV applications).
            @@ -128,10 +115,13 @@
          • Operation -

            Describes an action to be performed by the provider application. The operation ID of the platform-provided operation is in the http://tizen.org/appcontrol/operation/<verb> format. For example, http://tizen.org/appcontrol/operation/view. For more information on valid operations, see Common Application Controls.

          • +

            Describes an action to be performed by the provider application. The operation ID of the platform-provided operation is in the http://tizen.org/appcontrol/operation/<verb> format. For example, http://tizen.org/appcontrol/operation/view.

            +

            For more information on valid operations, see Common Application Controls. You can also see which operations allow a URI to be specified and which MIME types an operation supports.

          -

          There are different types of application control requests for launching other applications:

          +

          An application can be launched by the user from the Launcher or by another application. Each application has a launch mode, which determines how the application is launched: in a separate instance or in the same group as the calling application. For more information on the launch modes, see Application Groups.

          + +

          There are different types of application control requests for launching other applications:

          • Explicit launch

            You determine which application must be launched by explicitly specifying an application ID. The application ID determines which application is launched and the application performs the operation as specified in the application control request.

          • Implicit launch

            You provide information to describe the request to be performed by the newly launched application without specifying the application ID. The system uses the information to resolve the application control. It does this by trying to find a proper application to perform the application control request and then launching the selected application.

          • @@ -165,8 +155,7 @@
          • MIME type

            Specific type of the URI. For example, if you want to view only JPEG images, you must use the image/jpeg MIME type. The MIME type can be important because it ensures that the system finds an application that is capable of supporting a specified MIME type.

          -

          For more information on valid operations, see Common Application Controls. You can also see which operations allow a URI to be specified and which MIME types an operation supports.

          -

          The following code example shows an ApplicationControl instance (in mobile, wearable, and TV applications) that launches an application to pick images. If there are multiple applications that can fulfill the request, the system shows a pop-up which allows the user to select the application of their choice:

          +

          The following code example shows an ApplicationControl instance that launches an application to pick images:

           var appControl = new tizen.ApplicationControl("http://tizen.org/appcontrol/operation/pick",
          @@ -175,8 +164,7 @@ var appControl = new tizen.ApplicationControl("http://tizen.org/appcontrol/
           tizen.application.launchAppControl(appControl, null, successCb, errCb, null);
           
          -

          Selecting and Launching a Suitable Application

          -

          To select and launch an application that provides a specific operation, you can use the findAppControl() method of Application interface to search for applications which provide the functionalities that you need. The following code example demonstrates an implicit launch of an application to provide the image view operation that is found using the findAppControl() method:

          +

          When you make an implicit launch request, there can be multiple applications that can fulfill the request. In that case, the system shows a pop-up which allows the user to select the application of their choice. If you want to select a specific application among the available applications that provide a specific operation, you can use the findAppControl() method of Application interface to search for applications which provide the functionalities that you need. The following code example demonstrates an explicit launch of an application to provide the image view operation that is found using the findAppControl() method:

           /* Assuming that the filesystem virtual root "images" has been resolved and saved in variable images */
           var appControl = new tizen.ApplicationControl("http://tizen.org/appcontrol/operation/view",
          @@ -219,9 +207,10 @@ tizen.application.findAppControl(appControl, function(appInfos, appCtrl)
           	
        2. Voice Recorder
        3. Input Delegator
        4. - +

          Application Control Export

          +

          Your application can export application control functionality. This means that the application can register itself as a provider application, allowing it to receive application control requests from other applications. You can handle an incoming application control request using the getRequestedAppControl() method of the Application interface (in mobile, wearable, and TV applications), and respond to the incoming request using the RequestedApplicationControl interface (in mobile, wearable, and TV applications).

          The system compares the attributes of the application control request against the service descriptions of installed applications to determine which of the available applications are suitable for the request. The service description of the installed applications contains information about the requests that they can handle. The request is resolved only if all specified information in the request matches with the service description retrieved from an installed application. The application control data attribute is not used in resolving the control request.

          To advertise your application features to other applications, allow other applications to use the functionalities of your application, and launch your application implicitly without an application ID, you can define 1 or more application control service descriptions in the config.xml file of your application. Each description specifies the operation, URI scheme, and MIME type of the application control service your application can offer.

          @@ -239,7 +228,7 @@ tizen.application.findAppControl(appControl, function(appInfos, appCtrl) </tizen:app-control>
          -

          For example, consider the following example of an ApplicationControl instance:

          +

          For example, consider the following example of an ApplicationControl instance (in mobile, wearable, and TV applications):

           /* Assuming that the filesystem virtual root "images" has been resolved and saved in variable images */
          @@ -274,7 +263,7 @@ var appControl = new tizen.ApplicationControl("http://tizen.org/appcontrol/
              <mime name="audio/*"/>
           </tizen:app-control>
          -

          Using the appcontrol Event Instead of Page Reloading

          +

          Preventing Page Reloads for Incoming Requests

          When a Web application receives an application control request from another application, the receiving application finds the proper page for that request and loads that page. If the found page is already loaded and displayed, the page is reloaded (refreshed) to process the incoming application control request. However, in some cases, a Web application is able to handle the application control request without reloading the page in order to keep the previous context.

          From Tizen 2.4 onwards, the Web runtime provides a way to handle application control requests without page reloading by extending the <tizen:app-control> element of the config.xml file and sending a new appcontrol event to the receiving application.

          @@ -299,62 +288,7 @@ window.addEventListener("appcontrol", function onAppControl()    } });
          - -

          Event Handling

          - -

          Since Tizen 2.4, Web applications can broadcast their own events to all listeners who are listening for these events. Web applications can also broadcast trusted events for trusted listeners who have the same certificate as the sender application.

          - -

          To manage event broadcasting:

          - -
          • You can broadcast an event with the broadcastEvent() or broadcastTrustedEvent() method.
          • -
          • You can receive event data from other applications with the addEventListener() method.
          • -
          • You can stop receiving event data from other applications with the removeEventListener() method.
          - - -

          Background Execution

          - -

          When a Web application becomes invisible (moves to the background), it is suspended. Before Tizen 2.4, to continue to execute the application on the background, you had to set the background-support attribute of the <tizen:setting> element to enable in the config.xml file (in mobile and wearable applications).

          - -

          Since Tizen 2.4, the background process management policy has been changed. The system does not allow applications to run on the background except when they are explicitly declared to do so by having a specific background category. For more information on the available background categories, see the Allowed background application policy table.

          - - - - - - - - - - -
          Note
          To guarantee that a Web application runs on the background, at least one background-category element must be declared in the config.xml file (in mobile and wearable applications), and the background-support attribute of the <tizen:setting> element must be set to enable.
          - -

          The following config.xml file example shows how an application can be configured to run on the background:

          -
          -<?xml version="1.0" encoding="UTF-8"?>
          -<widget xmlns="http://www.w3.org/ns/widgets" xmlns:tizen="http://tizen.org/ns/widgets" 
          -        id="http://yourdomain/BackgroundCategory" version="1.0.0" viewmodes="maximized">
          -   <tizen:application id="background.category" package="background" required_version="2.4"/>
          -   <content src="index.html"/>
          -   <icon src="icon.png"/>
          -   <name>BackgroundCategoryTest</name>
          -   <tizen:background-category value="media"/>
          -   <tizen:background-category value="download"/>
          -   <tizen:background-category value="background-network"/>
          -   <tizen:setting background-support="enable"/>
          -</widget>
          -
          - -

          Warm-up

          -

          Become familiar with the Application API basics by learning about:

          - - +

          Prerequisites

          To use the Application API (in mobile, wearable, and TV applications), the application has to request permission by adding the following privileges to the config.xml file:

          @@ -366,9 +300,18 @@ window.addEventListener("appcontrol", function onAppControl()

          Retrieving Application Information

          +

          You can retrieve information about applications in various ways:

          +
            +
          • Retrieve information about installed applications with the getAppInfo() and getAppsInfo() methods of the ApplicationManager interface (in mobile, wearable, and TV applications). +

            These methods can be used to access the ApplicationInformation interface (in mobile, wearable, and TV applications) to retrieve information about installed applications, such as their name, icon path, and version.

          • +
          • Retrieve information about running applications with the getAppContext() and getAppsContext() methods of the ApplicationManager interface. +

            These methods can be used to access the ApplicationContext interface (in mobile, wearable, and TV applications) to retrieve the application ID and context ID of the running application.

            +

            The application ID can be used to retrieve application information, or to launch an application. The context ID is a unique identifier given by the platform to a running application.

          • +
          +

          Learning how to retrieve information about installed and running applications allows you to manage all the device applications from your application:

            -
          1. To retrieve a list of installed applications, use the getAppsInfo() method of the ApplicationManager interface (in mobile, wearable, and TV applications):

            +
          2. To retrieve a list of installed applications, use the getAppsInfo() method of the ApplicationManager interface:

             function onListInstalledApplications(applications)
             {
            @@ -376,7 +319,7 @@ function onListInstalledApplications(applications)
             }
             tizen.application.getAppsInfo(onListInstalledApplications);
             
            -

            The list of applications is returned to the ApplicationInformationArraySuccessCallback event handler as an array of ApplicationInformation objects (in mobile, wearable, and TV applications).

          3. +

            The list of applications is returned to the ApplicationInformationArraySuccessCallback event handler as an array of ApplicationInformation objects.

          4. To retrieve a list of running applications, use the getAppsContext() method of the ApplicationManager interface:

             function onRunningApplicationContexts(contexts)
            @@ -401,9 +344,10 @@ console.log("Application context retrieved for app " + appContext.id);
                       
             

            Managing Applications

            +

            You can manage and retrieve information about the current application with the Application object (in mobile, wearable, and TV applications). The Application object is retrieved using the getCurrentApplication() method of the ApplicationManager interface (in mobile, wearable, and TV applications). You can exit or hide the current application using the Application interface.

            Learning how to launch and stop other applications, and hide or exit applications running on the device, allows you to manage all the device applications from your application:

              -
            1. To launch or stop another application, you need the application ID (for launching) or context ID (for stopping) to identify the application.

              To launch an application, use the launch() method of the ApplicationManager interface (in mobile, wearable, and TV applications), and to stop an application, use the kill() method.

              In the following example, the application to be launched and stopped is an alarm, with the "samplealarm" ID.

              +
            2. To launch or stop another application, you need the application ID (for launching) or context ID (for stopping) to identify the application.

              To launch an application, use the launch() method of the ApplicationManager interface, and to stop an application, use the kill() method.

              In the following example, the application to be launched and stopped is an alarm, with the "samplealarm" ID.

               /* Launch the application */
              @@ -423,7 +367,7 @@ function onGetAppsContextSuccess(appcontexts)
               
               tizen.application.getAppsContext(onGetAppsContextSuccess);
               
              -

              You can also launch an application using the application control.

            3. +

              You can also launch an application using the application control.

            4. To retrieve the current application, use the getCurrentApplication() method:

               var currApp = tizen.application.getCurrentApplication();
              @@ -438,12 +382,17 @@ currApp.exit();
               
            + +

            Launching Applications with the Application Control

            -

            Learning to use application controls to launch other applications from your application allows you to take advantage of the functionality of other device applications.

            +

            With the application control, you can send a request to launch other applications based on their functionality using the launchAppControl() method of the ApplicationManager interface (in mobile, wearable, and TV applications) (which can also contain some data).

            -

            An installed application can provide a service which can be identified by the operation name. Other applications can request and use the provided service of the provider application (and optionally passing some data to the service). The provider application responds to requests with an ApplicationControlData instance (in mobile, wearable, and TV applications) (which can also contain some data).

            -
              +

              Any installed application can provide a service which can be identified by the operation name. When other applications request the provided service of the provider application (and optionally passing some data to the service), the provider application is launched and performs a specific operation. The provider application also sends back a response to the request with an ApplicationControlData instance (in mobile, wearable, and TV applications) (which can also contain some data).

              + +

              Learning to use application controls to launch other applications from your application allows you to take advantage of the functionality of other device applications.

              + +
              1. To use the application control mechanism to pick image files from a list of images, create an ApplicationControl object (in mobile, wearable, and TV applications).

                Define the functionality required from the external application which you want to launch. The application control request must have an operation type suitable for selecting images, with the URI set as null, and the MIME type set as image/*.

                @@ -475,8 +424,8 @@ tizen.application.launchAppControl(appControl, null,
                                                    appControlReplyCB);
                 
              - -

              Handling Application Control Requests

              + +

              Receiving and Replying to Application Control Requests

              Learning how to handle requests from other applications allows you to create Web applications that can be called from other applications to perform specific actions.

              Web applications can provide a service which can be identified by an operation name. Other applications can request and use the provided service of other applications (and optionally pass some data to the service). The provider application receives the request, performs some actions, and sends the result to the caller application in an ApplicationControlData array (in mobile, wearable, and TV applications).

              @@ -519,10 +468,15 @@ try
            -

            For more information on launching an application, see Launching Applications with the Application Control.

            +

            Broadcasting and Listening for Events

            +

            Since Tizen 2.4, Web applications can broadcast their own events to all listeners who are listening for these events. Web applications can also broadcast trusted events for trusted listeners who have the same certificate as the sender application.

            -

            Broadcasting and Listening for Events

            +

            To manage event broadcasting:

            + +
            • You can broadcast an event with the broadcastEvent() or broadcastTrustedEvent() method.
            • +
            • You can receive event data from other applications with the addEventListener() method.
            • +
            • You can stop receiving event data from other applications with the removeEventListener() method.

            Learning how to broadcast and listen for events allows you to create Web applications that can send and receive data between each other:

              @@ -560,6 +514,40 @@ app.removeEventListener(watchId);
            +

            Background Execution

            + +

            When a Web application becomes invisible (moves to the background), it is suspended. Before Tizen 2.4, to continue to execute the application on the background, you had to set the background-support attribute of the <tizen:setting> element to enable in the config.xml file (in mobile and wearable applications).

            + +

            Since Tizen 2.4, the background process management policy has been changed. The system does not allow applications to run on the background except when they are explicitly declared to do so by having a specific background category. For more information on the available background categories, see the Allowed background application policy table.

            + + + + + + + + + + +
            Note
            To guarantee that a Web application runs on the background, at least one background-category element must be declared in the config.xml file (in mobile and wearable applications), and the background-support attribute of the <tizen:setting> element must be set to enable.
            + +

            The following config.xml file example shows how an application can be configured to run on the background:

            +
            +<?xml version="1.0" encoding="UTF-8"?>
            +<widget xmlns="http://www.w3.org/ns/widgets" xmlns:tizen="http://tizen.org/ns/widgets" 
            +        id="http://yourdomain/BackgroundCategory" version="1.0.0" viewmodes="maximized">
            +   <tizen:application id="background.category" package="background" required_version="2.4"/>
            +   <content src="index.html"/>
            +   <icon src="icon.png"/>
            +   <name>BackgroundCategoryTest</name>
            +   <tizen:background-category value="media"/>
            +   <tizen:background-category value="download"/>
            +   <tizen:background-category value="background-network"/>
            +   <tizen:setting background-support="enable"/>
            +</widget>
            +
            + +
    diff --git a/org.tizen.guides/html/web/app_management/app_group_w.htm b/org.tizen.guides/html/web/app_management/app_group_w.htm index d2d224e..e4bf674 100644 --- a/org.tizen.guides/html/web/app_management/app_group_w.htm +++ b/org.tizen.guides/html/web/app_management/app_group_w.htm @@ -28,8 +28,10 @@

    Content

    Related Info

      @@ -47,34 +49,23 @@

      The main application group features include:

        -
      • Defining the application launch mode -

        You can set the application launch mode in the config.xml file (in mobile and wearable applications) with one of the following values:

        -
          -
        • The SINGLE launch mode means that the application is launched as a main application (in a new group).
        • -
        • The GROUP launch mode means that the application can be launched as a sub application - belonging to the same group as the caller application which is causing the application to be launched.
        • -
        -

        Additionally, if the launch mode is not set to SINGLE in the config.xml file and the application is launched by the launchAppControl() method of the ApplicationManager interface (in mobile, wearable, and TV applications) with the ApplicationControl object (in mobile, wearable, and TV applications), the launchMode property of this object overrides the launch mode of the called application. If the launch mode in the config.xml file is set to SINGLE, the value of the ApplicationControl.launchMode property is ignored and the sub application is always called in the SINGLE mode.

        -
      • -
      • Managing the application group -

        Applications in a same group act as if they are in 1 stack. For example, if an application A wants to send an email using an email application B, the application A can launch the email application B, making the email application B a sub application in the same group as the application A. When both applications are running, and the user presses the home button, both applications are hidden. When the user later resumes the caller application (application A), the email application B is shown on top of the caller application.

        -

        If an application is launched in a group, it can be terminated by the main (first) application in the group. If the main application is terminated or killed, the sub applications in the group are terminated automatically (they can be terminated by the framework even if they are hidden).

        +
      • Grouping applications in manageable entities +

        Application grouping has an effect on what happens when the user hides or exits an application. When applications belong to the same group, they are hidden and exited together.

      • +
      • Controlling the launch mode +

        The launch mode determines how a newly launched application is grouped. You can control the launch mode by:

        +
        • Setting it in the application config.xml file.
        • +
        • Defining it in an application control that is used to launch the application.
        +
      • -

        Figure: Group behavior

        -

        Group behavior

        - - -
      +
    -

    Before you start, remember to prepare your application to use the application group functionality.

    +

    Group Behavior

    -

    Warm-up

    -

    Become familiar with the Application API basics by learning about:

    - +

    Applications in the same group act as if they are in 1 stack. For example, if an application A wants to send an email using an email application B, the application A can launch the email application B, making the email application B a sub application in the same group as the application A. When both applications are running, and the user presses the Home key, both applications are hidden. When the user later resumes the caller application (application A), the email application B is shown on top of the caller application.

    + +

    If an application is launched in a group, it can be terminated by the main (first) application in the group. If the main application is terminated or killed, the sub applications in the group are terminated automatically (they can be terminated by the framework even if they are hidden).

    +

    Figure: Group behavior when using the Home key

    +

    Group behavior when using the Home key

    Prerequisites

    @@ -87,7 +78,14 @@

    Controlling the Launch Mode

    -

    To launch an application in a GROUP mode, you must learn how to define the application control object and launch the application:

    +

    You can set the application launch mode in the config.xml file (in mobile and wearable applications) with one of the following values:

    +
      +
    • The SINGLE launch mode means that the application is launched as a main application (in a new group).
    • +
    • The GROUP launch mode means that the application can be launched as a sub application + belonging to the same group as the caller application which is causing the application to be launched.
    • +
    +

    Additionally, if the launch mode is not set to SINGLE in the config.xml file and the application is launched by the launchAppControl() method of the ApplicationManager interface (in mobile, wearable, and TV applications) with the ApplicationControl object (in mobile, wearable, and TV applications), the launchMode property of this object overrides the launch mode of the called application. If the launch mode in the config.xml file is set to SINGLE, the value of the ApplicationControl.launchMode property is ignored and the sub application is always called in the SINGLE mode.

    +

    To launch an application in a GROUP mode:

    1. Define the application control object with the GROUP mode: diff --git a/org.tizen.guides/html/web/app_management/app_icons_w.htm b/org.tizen.guides/html/web/app_management/app_icons_w.htm index fe915b6..9e2b1c6 100644 --- a/org.tizen.guides/html/web/app_management/app_icons_w.htm +++ b/org.tizen.guides/html/web/app_management/app_icons_w.htm @@ -58,15 +58,6 @@

      You can receive notifications on badge changes to display and react to badges.

    2. -

      Before you start, remember to prepare your application to use the badge functionality.

      - -

      Warm-up

      -

      Become familiar with the Badge API basics by learning about:

      -

      Prerequisites

      diff --git a/org.tizen.guides/html/web/app_management/data_w.htm b/org.tizen.guides/html/web/app_management/data_w.htm index 01d26ff..2e33afe 100644 --- a/org.tizen.guides/html/web/app_management/data_w.htm +++ b/org.tizen.guides/html/web/app_management/data_w.htm @@ -55,18 +55,7 @@
    3. Complex data storage using a SQL-type database and queries

      You can select, insert, update, and remove data using the SQLDataControlConsumer interface (in mobile, wearable, and TV applications).

    4. - -

      Before you start, remember to prepare your application to use the data control functionality.

      -

      Warm-up

      -

      Become familiar with the Data Control API basics by learning about:

      - - -

      Prerequisites

      To use the Data Control API (in mobile, wearable, and TV applications), the application has to request permission by adding the following privilege to the config.xml file:

      diff --git a/org.tizen.guides/html/web/app_management/message_port_w.htm b/org.tizen.guides/html/web/app_management/message_port_w.htm index 19834be..e8d1947 100644 --- a/org.tizen.guides/html/web/app_management/message_port_w.htm +++ b/org.tizen.guides/html/web/app_management/message_port_w.htm @@ -45,43 +45,42 @@

      Tizen Web applications can communicate with other Web or native applications. The message data type for the communication is map data, which consists of a string key and value that can be a string, string array, byte stream, or byte stream array.

      The Message Port API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

      + +

      Figure: Message port communication

      +

      Message port communication

      +

      The main features of the Message Port API include:

      +
        +
      • Sending messages +

        A Tizen Web application can send messages to another application using the sendMessage() method of the RemoteMessagePort interface (in mobile, wearable, and TV applications).

        +
      • +
      • Receiving messages +

        To receive response messages from another application, your application can specify a local message port when it sends a message. You can receive response messages using the callback method which is registered through the addMessagePortListener() method of the LocalMessagePort interface (in mobile, wearable, and TV applications).

        +

        You can mostly receive message from applications implemented as Tizen native or Web applications. To implement a native application, see the native Message Port Communication guide.

      • +
      • Using trusted message ports +

        For added security, you can restrict communication to only exchange messages with a trusted application that is signed with the same certificate as your application. Use the instances of the LocalMessagePort and RemoteMessagePort interfaces that are retrieved by the requestTrustedLocalMessagePort() and requestTrustedRemoteMessagePort() methods of the tizen.messageport object.

        +

        Figure: Trusted message ports

        +

        Trusted message ports

        +
      • +
      + +

      Managing Message Ports

      +

      You can send and receive messages through 2 types of message ports:

      • The LocalMessagePort interface (in mobile, wearable, and TV applications) is used to register your message port and prepare to receive messages from other applications.

        To receive messages from other applications, you must register a callback to the local message port.

      • The RemoteMessagePort interface (in mobile, wearable, and TV applications) is used to send messages to other applications. -

        The local message port information can be sent to another application for bi-directional communication.

      +

      The local message port information can be sent to another application for bi-directional communication, to enable the other application to send response messages.

      You can retrieve the instances of the LocalMessagePort and RemoteMessagePort interfaces with the requestLocalMessagePort() and requestRemoteMessagePort() methods of the tizen.messageport object.

      - -

      A message port supports sending and receiving methods:

      - -
      • A Tizen Web application can send messages to another application using the sendMessage() method of the RemoteMessagePort interface. -

        To receive response messages from the other application, your application can specify a local message port when it sends the message. You can receive response messages using the callback method which is registered through the addMessagePortListener() method of the LocalMessagePort interface.

      • -
      • The application that wants to receive messages from your application can mostly be implemented as a Tizen native or Web application. To implement it as a native application, see the native Message Port Communication guide.
      - -

      Figure: Message port communication

      -

      Message port communication

      - -

      You can communicate only with a trusted application that is signed with the same certificate as your application, using the instances of the LocalMessagePort and RemoteMessagePort interfaces that are retrieved by the requestTrustedLocalMessagePort() and requestTrustedRemoteMessagePort() methods of the tizen.messageport object.

      -

      Figure: Trusted message ports

      -

      Trusted message ports

      - -

      Warm-up

      -

      Become familiar with the Message Port API basics by learning about:

      - - -

      Managing Message Ports

      Learning how to send messages to and receive responses from other Tizen applications through message ports is a basic data communication skill:

        -
      1. To create a local port which receives messages, use the requestLocalMessagePort() method of the LocalMessagePort interface (in mobile, wearable, and TV applications):

        +
      2. To create a local port which receives messages, use the requestLocalMessagePort() method of the LocalMessagePort interface:

         var localPort = tizen.messageport.requestLocalMessagePort("SAMPLE_PORT");
         
      3. -
      4. To retrieve an instance of the RemoteMessagePort interface (in mobile, wearable, and TV applications), use the requestRemoteMessagePort() method of the tizen.messageport object. The RemoteMessagePort interface sends messages to the port identified by an ApplicationId and a port name.

        +
      5. To retrieve an instance of the RemoteMessagePort interface, use the requestRemoteMessagePort() method of the tizen.messageport object. The RemoteMessagePort interface sends messages to the port identified by an ApplicationId and a port name.

         var targetApplicationId = tizen.application.getCurrentApplication().appInfo.id;
         var remotePort = tizen.messageport.requestRemoteMessagePort(targetApplicationId, "SAMPLE_PORT");
        @@ -143,8 +142,6 @@ remotePort.sendMessage(messageData);
         remotePort.sendMessage(messageData, localPort);
         
      - -

      To implement the application receiving the message as a native application, see the mobile native Message Port guide.

      diff --git a/org.tizen.guides/html/web/app_management/packages_w.htm b/org.tizen.guides/html/web/app_management/packages_w.htm index 5283b8b..da2a0a9 100644 --- a/org.tizen.guides/html/web/app_management/packages_w.htm +++ b/org.tizen.guides/html/web/app_management/packages_w.htm @@ -43,33 +43,21 @@
    -

    Package Information

    -

    Package information features include retrieving detailed information about packages, such as package name, icon path, version details, and package ID. You can receive notifications if packages are updated or removed, or new packages are installed. You can also perform package management tasks, such as installing or uninstalling packages.

    +

    Package Information

    +

    Package information features include retrieving detailed information about packages, such as package name, icon path, version details, and package ID. You can receive notifications if packages are updated or removed, or new packages are installed. You can also perform package management tasks, such as installing or uninstalling packages.

    The Package API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

    The main package information features are:

      -
    • Package management

      You can manage the package installation using the install() and uninstall() methods of the PackageManager interface (in mobile, wearable, and TV applications). Additionally, you can receive notifications of the installation and uninstallation progress using the PackageProgressCallback interface (in mobile, wearable, and TV applications).

    • -
    • Package information retrieval

      You can retrieve information about packages in various ways:

      -
        -
      • Retrieve information about installed packages using the getPackageInfo() and getPackagesInfo() methods of the PackageManager interface.
      • -
      • Use the PackageInformation interface (in mobile, wearable, and TV applications) to retrieve information about installed packages, such as name, icon path, and version.
      • -
    • -
    • Package change notifications

      You can receive notifications of changes in the list of installed packages. The setPackageInfoEventListener() method of the PackageManager interface registers an event listener for changes in the installed packages list. To unsubscribe the listener, use the unsetPackageInfoEventListener() method. You can use the PackageInformationEventCallback interface (in mobile, wearable, and TV applications) to define listeners for receiving notifications.

    • +
    • Package management +

      You can install or uninstall packages.

    • +
    • Package information retrieval +

      You can display a list of installed packages on the device, and retrieve package information, such as name, ID, icon path, and version.

    • +
    • Package change notifications +

      You can receive notifications when packages are installed, updated, or uninstalled.

    - -

    Before you start, remember to prepare your application to use the package functionality.

    -

    Warm-up

    -

    Become familiar with the Package API basics by learning about:

    - -

    Prerequisites

    To use the Package API (in mobile, wearable, and TV applications), the application has to request permission by adding the following privileges to the config.xml file:

    @@ -79,24 +67,28 @@ -

    Retrieving Package Information

    - +

    Retrieving Package Information

    +

    You can retrieve information about packages in various ways:

    +
      +
    • Retrieve information about installed packages using the getPackageInfo() and getPackagesInfo() methods of the PackageManager interface (in mobile, wearable, and TV applications).
    • +
    • Use the PackageInformation interface (in mobile, wearable, and TV applications) to retrieve information about installed packages, such as name, icon path, and version.
    • +

    Learning how to retrieve information about installed packages allows you to manage device packages from your application:

      -
    1. To retrieve a list of installed packages, use the getPackagesInfo() method of the PackageManager interface (in mobile, wearable, and TV applications):

      function onListInstalledPackages(lists)
      +   
    2. To retrieve a list of installed packages, use the getPackagesInfo() method of the PackageManager interface:

      function onListInstalledPackages(lists)
       {
          console.log("The number of installed package is " + lists.length);
       }
       
      -tizen.package.getPackagesInfo(onListInstalledPackages);

      The list of installed packages is returned to the PackageInformationArraySuccessCallback() methods as an array of PackageInformation objects (in mobile, wearable, and TV applications).

    3. +tizen.package.getPackagesInfo(onListInstalledPackages);

      The list of installed packages is returned to the PackageInformationArraySuccessCallback() methods as an array of PackageInformation objects.

    4. To retrieve basic package information, use the getPackageInfo() method of the PackageManager interface, specifying the package ID. If no package ID is set, the method retrieves information of the application package calling the method.

      var packageInfo = tizen.package.getPackageInfo("org.tizen.calculator");

    Managing Packages

    - +

    You can manage the package installation using the install() and uninstall() methods of the PackageManager interface (in mobile, wearable, and TV applications). Additionally, you can receive notifications of the installation and uninstallation progress using the PackageProgressCallback interface (in mobile, wearable, and TV applications).

    Learning how to install and uninstall packages is a basic package management skill:

      -
    1. To install a package, use the install() method of the PackageManager interface (in mobile, wearable, and TV applications), specifying the local package installation path on your device. You can retrieve the installation progress using the PackageProgressCallback interface (in mobile, wearable, and TV applications).

      var onInstallation =
      +   
    2. To install a package, use the install() method of the PackageManager interface, specifying the local package installation path on your device. You can retrieve the installation progress using the PackageProgressCallback interface.

      var onInstallation =
       {
          onprogress: function(packageId, percentage)
          {
      @@ -127,11 +119,11 @@ tizen.filesystem.resolve("downloads/test.wgt", function(packageFile)
       tizen.package.uninstall("TEST_APP_ID", onUninstallation);
    -

    Receiving Package Change Notifications

    - -

    Learning to receive notifications when the list of installed packages changes allows you to manage device packages from your application:

    +

    Receiving Package Change Notifications

    +

    You can receive notifications of changes in the list of installed packages. The setPackageInfoEventListener() method of the PackageManager interface (in mobile, wearable, and TV applications) registers an event listener for changes in the installed packages list. To unsubscribe the listener, use the unsetPackageInfoEventListener() method. You can use the PackageInformationEventCallback interface (in mobile, wearable, and TV applications) to define listeners for receiving notifications.

    +

    Learning to receive notifications when the list of installed packages changes allows you to manage device packages from your application:

      -
    1. Define the event handlers for different notifications using the PackageInformationEventCallback listener interface (in mobile, wearable, and TV applications):

      var packageEventCallback =
      +   
    2. Define the event handlers for different notifications using the PackageInformationEventCallback listener interface:

      var packageEventCallback =
       {
          oninstalled: function(packageInfo)
          {
      @@ -146,7 +138,7 @@ tizen.package.uninstall("TEST_APP_ID", onUninstallation);
    3.       console.log("The package " + packageId + " is uninstalled");    } };
    4. -
    5. Register the listener to use the defined event handlers with the setPackageInfoEventListener() method of the PackageManager interface (in mobile, wearable, and TV applications):

      tizen.package.setPackageInfoEventListener(packageEventCallback);
    6. +
    7. Register the listener to use the defined event handlers with the setPackageInfoEventListener() method of the PackageManager interface:

      tizen.package.setPackageInfoEventListener(packageEventCallback);
    8. To stop receiving notifications, use the unsetPackageInfoEventListener() method of the PackageManager interface:

      tizen.package.unsetPackageInfoEventListener();
    diff --git a/org.tizen.guides/html/web/app_management/preference_w.htm b/org.tizen.guides/html/web/app_management/preference_w.htm index 1471c65..9bfc7de 100644 --- a/org.tizen.guides/html/web/app_management/preference_w.htm +++ b/org.tizen.guides/html/web/app_management/preference_w.htm @@ -28,10 +28,9 @@

    Content

    Related Info

    @@ -46,11 +45,10 @@

    Application Preferences

    -

    Preference management allows you to store and retrieve the application preferences. You can create, store, and retrieve all custom preferences needed by your application.

    +

    Preference management allows you to store and retrieve the application preferences. You can create, store, and retrieve all custom preferences needed by your application. Each preference has its own key and value, where the value can be a string, number, or a boolean value.

    This feature is supported in mobile and wearable applications only.

    -

    Each preference has its own key and value. The value can be a string, number, or a boolean value.

    @@ -69,10 +67,7 @@

    You can set up a preference with the setValue() method. If the preference exists before setting up, its value is set. If the preference does not exist, it is created.

  • Getting a preference value -

    You can get a preference value in 2 ways:

    - +

    You can retrieve a value of a single preference or values of all preferences using the getValue() or getAll() method. You can also check whether a preference exists using the exists() method.

  • Removing a preference

    You can remove a preference with the remove() and removeAll() functions. The first removes only 1 preference while the second removes them all.

    @@ -82,17 +77,6 @@
  • -

    Warm-up

    -

    Become familiar with the Preference API basics by learning about:

    - -

    Setting up a Preference

    To create a preference with a given key or to change a value of an existing one, use the setValue() method:

    @@ -100,17 +84,18 @@ tizen.preference.setValue("key1", "New value");
     

    If the preference with the given key does not exist, it is created with the given value. If the preference exists, only its new value is assigned.

    -

    Getting a Preference Value

    -

    To get the value of a preference with a given key:

    +

    Getting Preference Values

    + +

    To retrieve preference values:

    +
      +
    • To get the value of a preference with a given key, use the getValue() method:
       var currentValue = tizen.preference.getValue("key1");
       console.log("The current value of the preference key1 is: " + currentValue);
       

      The value returned by the method can be a string, number, or boolean. If the preference with the given key does not exist, an exception is thrown.

      - -

      Getting All Preferences

      -

      To get all preferences, use the getAll() method. Its callback gets an array of all preferences, where each row of the array - consists of a field key and value.

      +
    • +
    • To get all preferences, use the asynchronous getAll() method. Its callback gets an array of all preferences, where each row of the array consists of a field key and value.
       var successCB = function(preferences)
       {
      @@ -123,6 +108,20 @@ var successCB = function(preferences)
       
       tizen.preference.getAll(successCB);
       
      +
    + +

    Checking Whether a Preference Exists

    +

    To determine whether a preference with a given key exists, use the exists() method:

    +
    +if (tizen.preference.exists("key1"))
    +{
    +   console.log("Preference with the key key1 exists");
    +}
    +else
    +{
    +   console.log("Preference with the key key1 doesn't exist");
    +}
    +

    The method returns true if the preference exists and false if it does not.

    Removing Preferences

    To remove preferences:

    @@ -139,19 +138,6 @@ tizen.preference.removeAll(); -

    Checking Whether a Preference Exists

    -

    To determine whether a preference with a given key exists, use the exists() method:

    -
    -if (tizen.preference.exists("key1"))
    -{
    -   console.log("Preference with the key key1 exists");
    -}
    -else
    -{
    -   console.log("Preference with the key key1 doesn't exist");
    -}
    -

    The method returns true if the preference exists and false if it does not.

    -

    Monitoring Preference Value Changes

    To start and stop listening for value changes in a preference with a given key:

    diff --git a/org.tizen.guides/html/web/app_management/service_app_w.htm b/org.tizen.guides/html/web/app_management/service_app_w.htm index f9d58d3..16691c0 100644 --- a/org.tizen.guides/html/web/app_management/service_app_w.htm +++ b/org.tizen.guides/html/web/app_management/service_app_w.htm @@ -26,16 +26,12 @@

    Content

    Related Info

      @@ -51,8 +47,22 @@

      A service application is a type of Tizen Web application that provides an environment for running JavaScript in the background without a graphical user interface (the application follows the ECMA-262 specification). The service application is used to perform tasks which need to run periodically or continuously but do not require user interaction. For example, a service application can be used for getting data or listening to platform events in the background. As service applications do not have UI components, they run on top of a more light-weight runtime than UI applications. Therefore, you can expect them to perform better and consume less memory.

      This feature is supported in wearable applications only. The Web service application is an optional feature, which means that it may not be supported in all wearable devices.

      - -

      Service applications are packaged with a UI application. They can be launched by another application through the launch() and launchAppControl() methods of the Application API by using an explicit application ID. You can also register them to be launched automatically at boot time.

      + +

      The main features of the service application include:

      + +
        +
      • Managing the life-cycle +

        To manage a service application life-cycle, you must define various callbacks to enable the application to be initialized and handle incoming requests.

        +

        While the service application is running, you can use the supported Web Device APIs to interact with the platform or other service applications.

        +
      • +
      • Packaging applications +

        You must always package a service application with a UI application in a Web application package file. You can include multiple service applications in the same package with a single UI application.

        +
      • +
      • Launching applications +

        You can launch service applications through another application by using the launch() and launchAppControl() methods of the Application API by using an explicit application ID. You can also register service applications to be launched automatically at boot time.

      • +
      • Terminating applications +

        The service application can terminate itself when it receives a certain request.

      • +

      The device main menu does not contain any icons for service applications, because the applications run in the background. The task switcher does not show them either. Service applications can run simultaneously with other service and UI applications.

    @@ -66,77 +76,19 @@
    -

    Before you start, remember to prepare your application to use the service functionality.

    - -

    Fundamentals

    - -

    You can use a selection of the following Tizen wearable Web Device APIs to interact with the platform or other service applications. More Device APIs for service applications are supported in the next release.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Table: Fundamental APIs
    APIDescription
    TizenThe base object for accessing the Tizen wearable Web Device APIs.
    AlarmThis API provides methods for setting and unsetting alarms.
    ApplicationThis API provides information about the currently running and installed applications and ways to launch other applications. -

    Note that the getRequestedAppControl() method is only valid inside the onRequest() callback.

    PackageThis API provides methods to install and uninstall Tizen packages and to get information about installed packages.
    FilesystemThis API provides methods to access the file system of a device and to read, write, copy, move, and delete files.
    Message PortThis API provides methods for an application to communicate with other applications.
    PowerThis API provides interfaces and methods for controlling power resources. -

    Note that the isScreenOn(), restoreScreenBrightness(), turnScreenOn(), turnScreenOff(), setScreenBrightness(), and getScreenBrightness() methods are not supported for wearable Web service applications.

    System InformationThis API provides information about the device's display, network, storage, and other capabilities.
    - -

    Life-cycle

    -

    To make sure that you can run a service application, export a number of methods using the CommonJS Modules API. The methods need to be added to the module.exports object which is provided by the environment. These methods are called when there are life-cycle changes or application control events which are triggered by the application management framework.

    - -

    Figure: State transitions

    -

    State transitions

    - - -
      -
    • onStart(): The entry point of the service. It is called after the service runtime finishes the set-up.
    • -
    • onRequest(): The listener for application control callbacks. It is provided to handle requests from other applications. You can understand the intention of the request and reply to it using the tizen.application.getCurrentApplication().getRequestedAppControl() method. This callback is also called when the application is first launched as an application launch is considered to be a request as well.
    • -
    • onExit(): This is called when the service ends. You can release resources or save the context by using this callback.
    - -

    Package Management

    -

    Service applications are packaged with at least one UI application in a Web application package file. The Web application package file is installed, updated, and uninstalled as a single package, making the life-cycles of the service applications and the UI application synchronous.

    +

    Prerequisites

    -

    When privileges are defined, their scope covers the entire package. Hence privileges do not have to be specified for service applications because they are packaged with at least 1 UI application in a Web application package file.

    +

    To enable your application to use the service application functionality:

    -

    Configuration Extensions

    -

    To ensure that a service application is acknowledged by the platform, the config.xml file of the application must be extended.

    -

    Define the <tizen:service> element and check the configuration in the config.xml file.

    -

    The following is an example of a service application extension element:

    +
      +
    1. To make your application visible only for devices that support the Web Service Application, the application must specify the following feature in the config.xml file: +
      +<widget>
      +   <tizen:feature name="http://tizen.org/feature/web.service"/>
      +</widget>
      +
      +
    2. +
    3. To ensure that a service application is acknowledged by the platform, you must add a service application extension element (<tizen:service>) to the config.xml file of the application:
       <widget>
          <tizen:service id="[App_ID]" auto-restart="true" on-boot="true">
      @@ -148,46 +100,42 @@
       </widget>
       
      -

      <tizen:service> is a child element of the <widget> element in the config.xml file. With <tizen:service>, you can set the traits of a service application, such as application ID, auto restart, and boot launching capability. Under <tizen:service>, you can also set the starting script, the name, and the icon for the service application.

      +

      ´The <tizen:service> element is a child of the <widget> element in the config.xml file. With the <tizen:service> element attributes, you can set the traits of a service application, such as application ID, auto restart, and boot launching capability. With the <tizen:service> child elements, you can set the starting script, name, and icon for the service application.

      The definition of all service elements is listed and explained in the Extending Configuration Elements.

      - -

      Required Feature

      -

      The following feature must be specified in the config.xml file if you want your Web application to be visible only on devices that support the Web Service Application:

      +
    4. +
    5. To use the Application API, the application has to request permission by adding the following privilege to the config.xml file:
      -<widget>
      -   <tizen:feature name="http://tizen.org/feature/web.service"/>
      -</widget>
      +<tizen:privilege name="http://tizen.org/privilege/application.launch"/>
       
      +
    6. +
    -

    Warm-up

    - -

    Become familiar with the service application basics by learning about:

    - + + + + + + + + + +
    Note
    No privileges need to be separately defined for service applications, since the service application is always packaged with a UI application, and a scope of a privilege defined for the UI application covers the entire application package.
    +

    -

    Prerequisites

    -

    To use the Application API, the application has to request permission by adding the following privilege to the config.xml file:

    -
    -<tizen:privilege name="http://tizen.org/privilege/application.launch"/>
    -
    +

    Managing the Service Application Life-cycle

    +

    To run a service application, you must export a number of callbacks using the CommonJS Modules API. The callbacks need to be added to the module.exports object, which is provided by the environment. The following callbacks are called when there are life-cycle changes or application control events which are triggered by the application management framework:

    + +
      +
    • onStart(): The entry point of the service. It is called after the service runtime finishes the set-up.
    • +
    • onRequest(): The listener for application control callbacks. It is provided to handle requests from other applications. You can understand the intention of the request and reply to it using the tizen.application.getCurrentApplication().getRequestedAppControl() method. This callback is also called when the application is first launched as an application launch is considered to be a request as well.
    • +
    • onExit(): This is called when the service ends. You can release resources or save the context by using this callback.
    -

    Creating a Service Application

    +

    Figure: State transitions

    +

    State transitions

    -

    Learning how to create a service application is a basic application management skill:

    - - -

    The service application consists of a number of callbacks. To write a service application, you must implement the predefined callbacks for their purpose and register them using the CommonJS Modules API.

    +

    Learning how to manage service application callbacks is a basic application management skill:

    1. Create the service entry point with the onStart() callback.

      The callback is invoked when the service is launched. Within the callback, you can prepare resources and initialize whatever the service application needs during the execution.

      @@ -241,15 +189,14 @@ module.exports.onExit = function()    console.log("service terminate"); }
    - -

    Packaging a Service Application

    - -

    Learning how to package a service application is a basic application management skill:

    + +

    Packaging a Service Application

    -

    A Web application package can contain 1 Web UI application and several service applications. Each application in the Web application package shares the same package ID and has a unique application ID. In the following example, you can use the <tizen:application> element to contain information for the Web UI application. The <tizen:service> element is used to contain information about the service application. The UI application and the service application have the same package ID and different application IDs.

    +

    A Web application package can contain 1 Web UI application and several service applications. Each application in the Web application package shares the same package ID and has a unique application ID. In the following example, you can use the <tizen:application> element to define information for the Web UI application. The <tizen:service> element is used to define information about the service application. The UI application and the service application have the same package ID and different application IDs.

    -
    1. Define the service in the config.xml file. -

      The <tizen:service> element allows you to define the characteristics of the service application. For example, you can specify the name, icon, and starting JavaScipt file of the service application.

      +

      The Web application package file is installed, updated, and uninstalled as a single package, making the life-cycles of the service applications and the UI application synchronous.

      + +

      To package the service application with a UI application, define the service in the config.xml file. The <tizen:service> element allows you to define the characteristics of the service application. For example, you can specify the name, icon, and starting JavaScipt file of the service application.

       <?xml version="1.0"encoding="TF-8">
       <widget xmlns="http://www.w3.org/ns/widgets" xmlns:tizen="http://tizen.org/ns/widgets"
      @@ -266,12 +213,11 @@ module.exports.onExit = function()
             <tizen:description>WebServiceApplication1</tizen:description>
          </tizen:service>
       </widget>
      -
    + - -

    Launching a Service Application

    - -

    Learning how to launch a service application is a basic application management skill:

    +

    Launching a Service Application

    + +

    Learning how to launch a service application is a basic application management skill:

      @@ -326,6 +272,55 @@ var watchId = localMsgPort.addMessagePortListener(onreceived); + +

      Supported APIs for Service Applications

      + +

      You can use a selection of the following Tizen wearable Web Device APIs to interact with the platform or other service applications. More Device APIs for service applications are supported in the next release.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table: Supported APIs
      APIDescription
      TizenThe base object for accessing the Tizen wearable Web Device APIs.
      AlarmThis API provides methods for setting and unsetting alarms.
      ApplicationThis API provides information about the currently running and installed applications and ways to launch other applications. +

      Note that the getRequestedAppControl() method is only valid inside the onRequest() callback.

      PackageThis API provides methods to install and uninstall Tizen packages and to get information about installed packages.
      FilesystemThis API provides methods to access the file system of a device and to read, write, copy, move, and delete files.
      Message PortThis API provides methods for an application to communicate with other applications.
      PowerThis API provides interfaces and methods for controlling power resources. +

      Note that the isScreenOn(), restoreScreenBrightness(), turnScreenOn(), turnScreenOff(), setScreenBrightness(), and getScreenBrightness() methods are not supported for wearable Web service applications.

      System InformationThis API provides information about the device's display, network, storage, and other capabilities.
      +
    diff --git a/org.tizen.guides/html/web/app_management/widget_app_w.htm b/org.tizen.guides/html/web/app_management/widget_app_w.htm index bf3e5b2..038a6b8 100644 --- a/org.tizen.guides/html/web/app_management/widget_app_w.htm +++ b/org.tizen.guides/html/web/app_management/widget_app_w.htm @@ -27,14 +27,23 @@

    Content

    Related Info

      @@ -65,45 +74,26 @@

      The main features of the Widget Service API include:

      - -

      Warm-up

      -

      Become familiar with the Widget Service API basics by learning about:

      - - -

      Retrieving Widgets

      + +

      Widget Retrieval

      + +

      Using the WidgetServiceManager interface (in mobile and wearable applications), you can:

      +
        +
      • Retrieve a widget or widgets using the getWidgets() method.
      • +
      • Receive information about the primary widget ID or size related to the specific size type.
      • +
      + +

      Retrieving a Widget

      Learning how to retrieve the installed widget list is a basic widget management skill:

      1. Define a success handler implementing the WidgetArraySuccessCallback interface (in mobile and wearable applications). Optionally, you can specify an error handler too.

        @@ -118,7 +108,7 @@ var errorCallback = function(error)    console.log("Error " + error.message); };
      2. -
      3. To get a list of all installed widgets, use the getWidgets() method of the WidgetServiceManager interface (in mobile and wearable applications). If the optional packageId parameter is given, only the widgets belonging to the given package are returned.

        +
      4. To get a list of all installed widgets, use the getWidgets() method of the WidgetServiceManager interface. If the optional packageId parameter is given, only the widgets belonging to the given package are returned.

         var packageId = "org.tizen.contacts";
         tizen.widgetservice.getWidgets(successCallback, errorCallback, packageId);
        @@ -129,11 +119,11 @@ var myWidget = tizen.widgetservice.getWidget("org.tizen.gallery.widget"
         
      -

      Retrieving ID and Size Information

      +

      Retrieving ID and Size Information

      Learning how to retrieve the primary widget ID or size makes using the Widget Service API easy and convenient:

        -
      • To get the primary widget ID of a given application or package ID, use the getPrimaryWidgetId() method of the WidgetServiceManager interface (in mobile and wearable applications):

        +
      • To get the primary widget ID of a given application or package ID, use the getPrimaryWidgetId() method of the WidgetServiceManager interface:

         var widgetId = tizen.widgetservice.getPrimaryWidgetId("org.tizen.music-player");
         
      • @@ -143,7 +133,15 @@ var widgetSize = tizen.widgetservice.getSize("4x4");
      -

      Retrieving the Widget Name

      +

      Widget Management

      +

      Using the Widget interface (in mobile and wearable applications), you can:

      +
        +
      • Get the name of the widget in a given language using the getName() method.
      • +
      • Get all instances belonging to the widget using the getInstances() method.
      • +
      • Get variants of a specified size type.
      • +
      • Monitor state changes in an installed widget.
      • +
      +

      Retrieving the Widget Name

      To retrieve the widget name:

        @@ -151,13 +149,13 @@ var widgetSize = tizen.widgetservice.getSize("4x4");
         var myWidget = tizen.widgetservice.getWidget("org.tizen.gallery.widget");
         
        -
      1. To get the widget name, use the getName() method of the Widget interface (in mobile and wearable applications). If the locale parameter is omitted, the system locale is used.

        +
      2. To get the widget name, use the getName() method of the Widget interface. If the locale parameter is omitted, the system locale is used.

         var name = myWidget.getName("en-us");
         
      -

      Retrieving Widget Instances

      +

      Retrieving Widget Instances

      Learning how to retrieve information about installed widget instances makes the Widget Service API more useful:

        @@ -174,13 +172,13 @@ var errorCallback = function(error) }; -
      1. To retrieve a list of all instances belonging to the widget, use the getInstances() method of the Widget interface (in mobile and wearable applications):

        +
      2. To retrieve a list of all instances belonging to the widget, use the getInstances() method of the Widget interface:

         myWidget.getInstances(successCallback, errorCallback);
         
      -

      Retrieving Widget Variants

      +

      Retrieving Widget Variants

      To retrieve variants representing all of the supported widget size types:

        @@ -200,7 +198,7 @@ var errorCallback = function(error)
         var myWidget = tizen.widgetservice.getWidget("org.tizen.gallery.widget");
         
        -
      1. To get a list of all variants, use the getVariants() method of the Widget interface (in mobile and wearable applications):

        +
      2. To get a list of all variants, use the getVariants() method of the Widget interface:

         myWidget.getVariants(successCallback, errorCallback);
         
        @@ -210,7 +208,7 @@ var variant = myWidget.getVariant("4x4");
      -

      Monitoring Widget Changes

      +

      Monitoring Widget Changes

      Learning to receive notifications when the state of the widget has been changed is a useful widget management skill. There are 4 states that can be noticed: CREATE, DESTROY, PAUSE, and RESUME.

        @@ -227,7 +225,7 @@ var WidgetChangeCallback = function(instance, event) var myWidget = tizen.widgetservice.getWidget("org.tizen.music-player.widget"); -
      1. Add the listener to use the defined event handler with the addStateChangeListener() method of the Widget interface (in mobile and wearable applications):

        +
      2. Add the listener to use the defined event handler with the addStateChangeListener() method of the Widget interface:

         var watchId = myWidget.addStateChangeListener(WidgetChangeCallback);
         
      3. @@ -237,7 +235,14 @@ myWidget.removeStateChangeListener(watchId);
      -

      Changing the Update Period

      +

      Widget Instance Management

      +

      Using the WidgetInstance interface (in mobile and wearable applications), you can:

      +
        +
      • Change the update period of the instance using the changeUpdatePeriod() method.
      • +
      • Send or get content to and from the widget instance.
      • +
      + +

      Changing the Update Period

      To change the update interval for the widget instance:

        @@ -252,13 +257,13 @@ var successCallback = function(instances) var myWidget = tizen.widgetservice.getWidget("org.tizen.gallery.widget"); myWidget.getInstances(successCallback); -
      1. To change the update interval, use the changeUpdatePeriod() method of the WidgetInstance interface (in mobile and wearable applications) with the new value (in seconds):

        +
      2. To change the update interval, use the changeUpdatePeriod() method of the WidgetInstance interface with the new value (in seconds):

         instance.changeUpdatePeriod(2);
         
      -

      Sending and Getting Content

      +

      Sending and Getting Content

      Learning how to send and get the widget content is a useful widget management skill:

        @@ -274,7 +279,7 @@ var myWidget = tizen.widgetservice.getWidget("org.tizen.gallery.widget" myWidget.getInstances(successCallback); -
      1. To send data to the widget, use the sendContent() method of the WidgetInstance interface (in mobile and wearable applications). The second parameter defines whether the instance is updated even if the provider is paused.

        +
      2. To send data to the widget, use the sendContent() method of the WidgetInstance interface. The second parameter defines whether the instance is updated even if the provider is paused.

         instance.sendContent(data, true);
         
      3. diff --git a/org.tizen.guides/html/web/connectivity/bluetooth_w.htm b/org.tizen.guides/html/web/connectivity/bluetooth_w.htm index 1ad0d87..d70f238 100644 --- a/org.tizen.guides/html/web/connectivity/bluetooth_w.htm +++ b/org.tizen.guides/html/web/connectivity/bluetooth_w.htm @@ -62,15 +62,18 @@

        This feature is supported in mobile and wearable applications only.

        -

        Before you start, remember to prepare your application to use the Bluetooth functionality.

        - -

        The main features of the Bluetooth API include:

        +

        The main features of the Bluetooth API include:

          -
        • Managing the local Bluetooth adapter

          You can manage the local Bluetooth adapter using the system-provided service through the ApplicationControl interface (in mobile and wearable applications).

          To use the Bluetooth functionality of the device, you must switch the Bluetooth adapter on.

        • -
        • Discovering devices

          You can discover other Bluetooth devices.

          The device discovery process can retrieve multiple types of Bluetooth devices, such as printers, mobile phones, and headphones. To find the kind of devices you want to communicate with, the BluetoothClass interface (in mobile and wearable applications) is used to define characteristics and capabilities of a Bluetooth device. The BluetoothClassDeviceMajor interface (in mobile and wearable applications) and BluetoothClassDeviceMinor interface (in mobile and wearable applications) specify the identifiers for major and minor Class of Device (CoD).

          In addition, you can retrieve the known devices which were bonded or found in a prior discovery process.

        • -
        • Creating a bonding with a Bluetooth device

          You can create a bonding with another device retrieved through the discovery process. The bonding allows the 2 devices to establish a connection.

        • -
        • Connecting to and exchanging data with a Bluetooth device

          You can connect to and exchange data with a remote Bluetooth device. When you attempt to open a connection to another device, a Service Discovery Protocol (SDP) look-up is performed on the device, and the protocol and channel to be used for the connection are determined. If a connection is established and the socket is opened successfully, a BluetoothSocket instance (in mobile and wearable applications) with an open state is returned. The socket is subsequently used for exchanging data between the connected devices.

          If a device allows other devices to use its functionalities through this kind of connection, it is said to provide a service.

        • -
        • Communicating with a health source device

          The Health Device Profile defines the requirements for the Bluetooth health device implementation. In the profile, there are 2 device type: one device is a source, such as a blood pressure monitor or pulse oximeter, while the other is a sink, such as a mobile phone or laptop. You can use your device as a sink and communicate with a health source device.

        • +
        • Managing the local Bluetooth adapter +

          You can enable and disable the local Bluetooth adapter, and change the device name for it.

        • +
        • Discovering devices +

          You can discover other Bluetooth devices.

        • +
        • Creating a bonding with a Bluetooth device +

          You can create a bonding with another device retrieved through the discovery process. The bonding allows the 2 devices to establish a connection.

        • +
        • Connecting to and exchanging data with a Bluetooth device +

          You can connect to and exchange data with a remote Bluetooth device.

        • +
        • Communicating with a health source device +

          The Health Device Profile defines the requirements for the Bluetooth health device implementation. In the profile, there are 2 device type: one device is a source, such as a blood pressure monitor or pulse oximeter, while the other is a sink, such as a mobile phone or laptop. You can use your device as a sink and communicate with a health source device.

        The main Bluetooth (4.0) Low Energy features include:

        @@ -97,32 +100,9 @@

        You can read and write the Bluetooth GATT descriptor value.

    -

    Warm-up

    -

    Become familiar with the Bluetooth API basics by learning about:

    - -

    Task in Mobile Applications

    -

    In the Bluetooth Chat task, we will walk through how to use the device as a Bluetooth server or client in a chat application.

    - -

    Prerequisites

    +

    For a practical example of using the device as a Bluetooth server or client in a chat application, see the Bluetooth Chat mobile sample task.

    + +

    Prerequisites

    To use the Application (in mobile and wearable applications) and Bluetooth (in mobile and wearable applications) APIs, the application has to request permission by adding the following privileges to the config.xml file:

     <tizen:privilege name="http://tizen.org/privilege/application.launch"/>
    @@ -132,8 +112,8 @@
     	 
       

    Managing the Local Bluetooth Adapter

    -

    Learning how to enable or disable the local Bluetooth adapter, and set the device name is a basic Bluetooth management skill:

    -

    The Bluetooth API does not provide a method to enable or disable the Bluetooth adapter of the device directly. Whenever Bluetooth is required, request a built-in Settings application to present the relevant switch to the user so that they can enable or disable the Bluetooth.

    +

    You can enable or disable the local Bluetooth adapter, and set the device name using the system-provided service through the ApplicationControl interface (in mobile and wearable applications).

    +

    To use the Bluetooth functionality of the device, you must switch the Bluetooth adapter on. The Bluetooth API does not provide a method to enable or disable the Bluetooth adapter of the device directly. Whenever Bluetooth is required, request a built-in Settings application to present the relevant switch to the user so that they can enable or disable the Bluetooth.

    Figure: Bluetooth setting screen

    Bluetooth setting screen

      @@ -210,12 +190,17 @@ tizen.application.launchAppControl(bluetoothVisibilityAppControl, null, null, la

    Discovering Bluetooth Devices

    - -

    Learning how to search for remote devices and get the known devices is a basic Bluetooth management skill:

    +

    The device discovery process can retrieve multiple types of Bluetooth devices, such as printers, mobile phones, and headphones. To find the kind of devices you want to communicate with, the BluetoothClass interface (in mobile and wearable applications) is used to define characteristics and capabilities of a Bluetooth device. The BluetoothClassDeviceMajor interface (in mobile and wearable applications) and BluetoothClassDeviceMinor interface (in mobile and wearable applications) specify the identifiers for major and minor Class of Device (CoD).

    +

    You can also retrieve the known devices which were bonded or found in a prior discovery process.

    +

    To search for remote devices and get the known devices:

      -
    1. Retrieve a BluetoothAdapter object (in mobile and wearable applications) with the getDefaultAdapter() method:
      var adapter = tizen.bluetooth.getDefaultAdapter();
      +   
    2. Retrieve a BluetoothAdapter object (in mobile and wearable applications) with the getDefaultAdapter() method: +
      +var adapter = tizen.bluetooth.getDefaultAdapter();
       
    3. -
    4. To search for remote devices, use the discoverDevices() method.

      The results of the search are returned in the BluetoothDiscoverDevicesSuccessCallback (in mobile and wearable applications).

      +   
    5. To search for remote devices, use the discoverDevices() method.

      +

      The results of the search are returned in the BluetoothDiscoverDevicesSuccessCallback (in mobile and wearable applications).

      +
       var discoverDevicesSuccessCallback =
       {
          /* When a device is found */
      @@ -238,7 +223,9 @@ adapter.discoverDevices(discoverDevicesSuccessCallback, null);
             
            
            
    6. -
    7. To retrieve known devices (which have been previously paired or searched for), use the getKnownDevices() method.

      The results of the search are returned in the BluetoothDeviceArraySuccessCallback (in mobile and wearable applications).

      +   
    8. To retrieve known devices (which have been previously paired or searched for), use the getKnownDevices() method.

      +

      The results of the search are returned in the BluetoothDeviceArraySuccessCallback (in mobile and wearable applications).

      +
       /* When a known device is found */
       function onGotDevices(devices)
       {
      @@ -252,7 +239,7 @@ adapter.getKnownDevices(onGotDevices);
         
         

      Creating a Bonding with a Bluetooth Device

      -

      Learning how to create a bonding with other devices is a basic Bluetooth management skill:

      +

      To create a bonding with other Bluetooth devices:

      1. Retrieve a BluetoothAdapter object (in mobile and wearable applications) with the getDefaultAdapter() method:
        var adapter = tizen.bluetooth.getDefaultAdapter();
         
      2. @@ -285,13 +272,17 @@ adapter.createBonding("35:F4:59:D1:7A:03", onBondingSuccessCallback, o

      Connecting to and Exchanging Data with a Bluetooth Device

      - -

      The Radio Frequency Communication (RFCOMM) is a set of transport protocols which allows multiple simultaneous connections to a device. The device that provides a service is called a server device, and devices that request the service are called client devices.

      -

      Learning how to connect to services provided by a server device to the client devices is a basic Bluetooth management skill:

      +

      When you attempt to open a connection to another device, a Service Discovery Protocol (SDP) look-up is performed on the device, and the protocol and channel to be used for the connection are determined. If a connection is established and the socket is opened successfully, a BluetoothSocket instance (in mobile and wearable applications) with an open state is returned. The socket is subsequently used for exchanging data between the connected devices.

      + +

      The Radio Frequency Communication (RFCOMM) is a set of transport protocols which allows multiple simultaneous connections to a device. If a device allows other devices to use its functionalities through this kind of connection, it is said to provide a service and it is called a server device. The devices that request the service are called client devices.

      +

      To connect to services provided by a server device to the client devices:

        -
      1. Retrieve a BluetoothAdapter object (in mobile and wearable applications) with the getDefaultAdapter() method:
        var adapter = tizen.bluetooth.getDefaultAdapter();
        +   
      2. Retrieve a BluetoothAdapter object (in mobile and wearable applications) with the getDefaultAdapter() method: +
        +   var adapter = tizen.bluetooth.getDefaultAdapter();
         
      3. -
      4. To register a service and allow client devices to connect to it, use the registerRFCOMMServiceByUUID() method on the server device:

        adapter.registerRFCOMMServiceByUUID(serviceUUID, "My service");
        +
      5. To register a service and allow client devices to connect to it, use the registerRFCOMMServiceByUUID() method on the server device:

        +
        adapter.registerRFCOMMServiceByUUID(serviceUUID, "My service");
        @@ -325,7 +316,7 @@ var somemsg = [3, 2, 1]; var length = socket.writeData(somemsg); -

        To send data between the devices, use a socket mechanism with the BluetoothSocket interface (in mobile and wearable applications). The proper socket is received when the devices are connected.

        +

        To send data between the devices, use a socket mechanism with the BluetoothSocket interface. The proper socket is received when the devices are connected.

      6. To read the data in the server device, use the readData() method:

        @@ -355,7 +346,7 @@ healthProfileHandler.registerSinkApplication(4100, "testSinkApp", onSi

        When the sink application is registered successfully, the BluetoothHealthApplicationSuccessCallback interface (in mobile and wearable applications) is invoked and you can get the registered sink application object.

      7. Before establishing a connection, your device must be bonded with a health source device. For more information, see Creating a Bonding with a Bluetooth Device.
      8. -
      9. To connect to the health source device, use the connectToSource() method of the BluetoothHealthProfileHandler interface (in mobile and wearable applications):

        +
      10. To connect to the health source device, use the connectToSource() method of the BluetoothHealthProfileHandler interface:

         function onConnect(channel) 
         {
        @@ -383,7 +374,7 @@ healthChannel.close();
             
         

        Discovering Bluetooth Low Energy Devices

        -

        Learning how to search for remote devices is a basic Bluetooth management skill:

        +

        To search for remote Bluetooth devices:

        1. Define a scan event handler by implementing the BluetoothLEScanCallback callback (in mobile and wearable applications).

          The callback is invoked when a remote device has been detected.

          @@ -419,7 +410,7 @@ function successcallback(device)

          Managing the Advertising Options

          The Bluetooth Low Energy technology allows a device to broadcast some information without a connection between devices. The Bluetooth Low Energy API provides methods to control this advertising (broadcasting).

          -

          Learning how to control what information is advertised by the device is a useful Bluetooth Low Energy skill:

          +

          To control what information is advertised by the device:

          1. Retrieve a BluetoothLEAdapter object (in mobile and wearable applications) with the getLEAdapter() method of the BluetoothManager interface (in mobile and wearable applications):

            @@ -464,7 +455,7 @@ adapter.startAdvertise(advertiseData, "ADVERTISE",

            Connecting to a Bluetooth Low Energy Device

            -

            Learning how to connect to other devices is a basic Bluetooth Low Energy management skill:

            +

            To connect to other Bluetooth Low Energy devices:

            1. Retrieve a BluetoothLEAdapter object (in mobile and wearable applications) with the getLEAdapter() method of the BluetoothManager interface (in mobile and wearable applications):

              var adapter = tizen.bluetooth.getLEAdapter();
              @@ -513,11 +504,12 @@ function onDeviceFound(device)

              Receiving Notifications on Connection State Changes

              -

              Learning how to receive notifications whenever the device connection is established or lost is a useful Bluetooth management skill:

              +

              To receive notifications whenever the device connection is established or lost:

              1. Retrieve a BluetoothLEAdapter object (in mobile and wearable applications) with the getLEAdapter() method of the BluetoothManager interface (in mobile and wearable applications):

                -
                var adapter = tizen.bluetooth.getLEAdapter();
                +
                +var adapter = tizen.bluetooth.getLEAdapter();
              2. Define a connection state change listener by implementing the BluetoothLEConnectChangeCallback callback (in mobile and wearable applications):

                @@ -567,7 +559,7 @@ function onDeviceFound(device)
                 
                   

                Retrieving Bluetooth GATT Services

                -

                Learning how to retrieve a list of GATT services (Generic Attribute) provided by a remote device is basic Bluetooth Low Energy management skill:

                +

                To retrieve a list of GATT services (Generic Attribute) provided by a remote device:

                1. Connect to a Bluetooth Low Energy device.
                2. @@ -616,7 +608,7 @@ console.log("Services length " + services.length);

                  Accessing the Bluetooth GATT Characteristic Value

                  -

                  Learning how to read and write a value of the Bluetooth characteristic is a useful Bluetooth Low Energy management skill:

                  +

                  To read and write a value of the Bluetooth characteristic:

                  1. Connect to a Bluetooth Low Energy device.
                  2. @@ -675,7 +667,7 @@ property.writeValue(newValue, writeSuccess, writeFail);

                    Receiving Notifications on Characteristic Value Changes

                    -

                    Learning how to monitor a changes in a Bluetooth characteristic is a useful Bluetooth Low Energy management skill:

                    +

                    To monitor changes in a Bluetooth characteristic:

                    1. Connect to a Bluetooth Low Energy device.
                    2. @@ -706,7 +698,7 @@ function onValueChange(value)

                      Accessing the Bluetooth GATT Descriptor Value

                      -

                      Learning how to read and write a value of the Bluetooth descriptor is a useful Bluetooth Low Energy management skill:

                      +

                      To read and write a value of the Bluetooth descriptor:

                      1. Connect to a Bluetooth Low Energy device.
                      2. diff --git a/org.tizen.guides/html/web/connectivity/connectivity_cover_w.htm b/org.tizen.guides/html/web/connectivity/connectivity_cover_w.htm index 15029de..65057d3 100644 --- a/org.tizen.guides/html/web/connectivity/connectivity_cover_w.htm +++ b/org.tizen.guides/html/web/connectivity/connectivity_cover_w.htm @@ -42,9 +42,9 @@

                        You can use Bluetooth functionalities in your application, such as managing the Bluetooth service, pairing, and exchanging messages. The Bluetooth standard provides a peer-to-peer (P2P) data exchange functionality over short distance between compliant devices.

                        -
                      3. IoTivity +
                      4. IoT Connectivity -

                        You can use IoTivity in Tizen. You can use the seamless device-to-device connectivity to address the needs of the Internet of Things (IoT) through the open source reference implementation of the OIC (Open Interconnect Consortium) standard specifications.

                      5. +

                        You can use IoTivity features in Tizen. You can use the seamless device-to-device connectivity to address the needs of the Internet of Things (IoT) through the open source reference implementation of the OIC (Open Interconnect Consortium) standard specifications.

                      6. Near Field Communication (NFC) in mobile and wearable applications only diff --git a/org.tizen.guides/html/web/connectivity/convergence_w.htm b/org.tizen.guides/html/web/connectivity/convergence_w.htm index 7d96f14..c17481f 100644 --- a/org.tizen.guides/html/web/connectivity/convergence_w.htm +++ b/org.tizen.guides/html/web/connectivity/convergence_w.htm @@ -80,23 +80,6 @@
                      7. - -

                        Warm-up

                        - -

                        Become familiar with the Convergence API basics by learning about:

                        - -

                        Prerequisites

                        To use the Convergence API (in mobile, wearable, and TV applications), the application has to request permission by adding the following privileges to the config.xml file:

                        @@ -336,7 +319,7 @@ var discoverySuccessCallback =
                            {
                               for (i in device.services)
                               {
                        -         if (device.services[i].type === "REMOTE_APP_CONTROL")
                        +         if (device.services[i].type === "REMOTE_APP_CONTROL")
                                  {
                                     if (device.services[i].connectionState != "CONNECTED")
                                     {
                        @@ -387,13 +370,13 @@ function remoteAppControlCallback(data)
                         
                         function onstarted(service)
                         {
                        -   console.log('Remote app control service started');
                        +   console.log('Remote app control service started');
                            service.launch(requestAppId, remoteAppControlCallback, onerror);
                         }
                         
                         function onconnected(service)
                         {
                        -   console.log('Connected to the remote app control service');
                        +   console.log('Connected to the remote app control service');
                            service.start(onstarted, onerror);
                            service.launch(requestAppId, remoteAppControlCallback, onerror);
                         }
                        diff --git a/org.tizen.guides/html/web/connectivity/download_w.htm b/org.tizen.guides/html/web/connectivity/download_w.htm
                        index 76cc99b..51572ba 100644
                        --- a/org.tizen.guides/html/web/connectivity/download_w.htm
                        +++ b/org.tizen.guides/html/web/connectivity/download_w.htm
                        @@ -55,21 +55,10 @@
                            
                      8. Managing downloads

                        You can start, pause, resume, and cancel a download of content using the DownloadManager interface (in mobile, wearable, and TV applications).

                      9. Checking the download state and information

                        You can access the current download state and retrieve the download information using the DownloadManager interface. The states are defined in the DownloadState enumerator (in mobile, wearable, and TV applications).

                      10. - -

                        Before you start, remember to prepare your application to use the download functionality.

                        - -

                        Warm-up

                        -

                        Become familiar with the Download API basics by learning about:

                        - - -

                        Task

                        -

                        In the Download Manager task, we will walk through how to download URL content to the device storage.

                        -

                        Prerequisites

                        +

                        For a practical example of downloading URL content to the device storage, see the Download Manager sample task.

                        + +

                        Prerequisites

                        To use the Download API (in mobile, wearable, and TV applications), the application has to request permission by adding the following privilege to the config.xml file:

                        diff --git a/org.tizen.guides/html/web/connectivity/iotcon_w.htm b/org.tizen.guides/html/web/connectivity/iotcon_w.htm
                        index ead1e6b..0d072c8 100644
                        --- a/org.tizen.guides/html/web/connectivity/iotcon_w.htm
                        +++ b/org.tizen.guides/html/web/connectivity/iotcon_w.htm
                        @@ -11,7 +11,7 @@
                           
                           
                           
                        -  IoTivity
                        +  IoT Connectivity
                         
                         
                         
                        @@ -52,7 +52,7 @@
                         
                         
                        -

                        IoTivity

                        +

                        IoT Connectivity

                        IoTivity offers seamless device-to-device connectivity to address the emerging needs of the Internet of Things (IoT) through the open source reference implementation of the OIC (Open Interconnect Consortium) standard specifications. IoT connectivity (Iotcon) provides the means of using IoTivity in Tizen.

                        @@ -74,35 +74,7 @@
                      11. Remotely managing resources

                        You can retrieve and modify the remote resource attributes with GET and PUT methods. You can also use POST and DELETE methods to modify the resources on a remote server. You can monitor the resource attribute changes and the isAlive state.

                        -

                        For more information on all available remote resource management methods, see the native IoTivity guide.

                        -
                      12. - - -

                        Before you start, remember to prepare your application to use the IoT functionality.

                        - -

                        Warm-up

                        -

                        Become familiar with the Iotcon API basics by learning about:

                        - diff --git a/org.tizen.guides/html/web/connectivity/nfc_w.htm b/org.tizen.guides/html/web/connectivity/nfc_w.htm index e9ea27c..79b3d9f 100644 --- a/org.tizen.guides/html/web/connectivity/nfc_w.htm +++ b/org.tizen.guides/html/web/connectivity/nfc_w.htm @@ -27,7 +27,7 @@

                        Content

                      13. Using NFC Card Emulation
                      14. Using NFC Host-based Card Emulation
                      15. +
                      16. NFC Application Control Operations
                      17. Related Info

                          @@ -52,9 +53,26 @@

                          Near Field Communication (NFC)

                          -

                          Near Field Communication (NFC) service enables information exchange between NFC-enabled devices (called "peers") or tags. The NFC-enabled devices can share contacts, photos, and videos, and can also act as smart cards. You can use an NFC-enabled device to communicate with NFC tags for a variety of activities, such as paying the grocery bill or downloading a coupon.

                          +

                          Near Field Communication (NFC) service enables information exchange between NFC-enabled devices (called "peers") or tags. The NFC-enabled devices can share contacts, photos, and videos, and can also act as smart cards. You can use an NFC-enabled device to send NDEF messages to NFC tags to implement a variety of activities, such as paying the grocery bill or downloading a coupon. With application controls, you can launch NFC applications when NFC-related operations occur.

                          This feature is supported in mobile and wearable applications only.

                          + +

                          The main features of the NFC API include:

                          + +

                          NFC provides the following advantages over short-range communication technologies, such as Bluetooth:

                            @@ -63,165 +81,43 @@
                          • No device pairing requirements
                          • Reduction in unwanted interruptions
                          -

                          An NFC tag is a chip which can securely store personal information, such as debit card numbers or contact details. The methods of the NFCTag interface (in mobile and wearable applications) are used to access an NFC tag for reading or writing information. NFC tag types are identified using the type attribute of the NFCTagType type definition (in mobile and wearable applications).

                          -
      11. - - - - - - - - -
        Note
        Tizen provides the following NFC tag types: GENERIC_TARGET, ISO14443_A, ISO14443_4A, ISO14443_3A, MIFARE_MINI, MIFARE_1K, MIFARE_4K, MIFARE_ULTRA, MIFARE_DESFIRE, ISO14443_B, ISO14443_4B, ISO14443_BPRIME, FELICA, JEWEL, ISO15693, and UNKNOWN_TARGET.
        -

        The NFC forum defines the NFC data exchange format (NDEF) for encapsulating the data exchanged between 2 NFC-enabled devices or an NFC-enabled device and an NFC tag. An NDEF message can store data in various formats, such as text, Multipurpose Internet Mail Extension (MIME) type object, or ultra-short RagTime Document (RTD). The NFC tags use NDEF for exchanging messages.

        - -

        Before you start, remember to prepare your application to use the NFC functionality.

        -

        The main features of the NFC API include:

        -
          -
        • NFC device management

          You can manage NFC connectivity by enabling or disabling the NFC service.

          To use NFC, retrieve the default NFC adapter using the getDefaultAdapter() method of the NFCAdapter interface (in mobile and wearable applications). You can enable and disable NFC using the setPowered() method.

        • -
        • NFC tag and peer detection

          To receive notifications when an NFC tag or peer device has been detected, the setTagListener() and setPeerListener() methods of the NFCAdapter interface register event listeners, which trigger notifications when an NFC tag or peer device is detected, respectively. You can use the NFCTagDetectCallback (in mobile and wearable applications) and NFCPeerDetectCallback (in mobile and wearable applications) interfaces to define event handlers for receiving the notifications about attaching and detaching NFC tags and peers, respectively.

        • -
        • NDEF message manipulation

          You can handle NDEF messages by first creating NDEF records, using the NDEFRecord interface (in mobile and wearable applications), and then adding the records to an NDEF message using the records attribute of the NDEFMessage interface (in mobile and wearable applications).

        • -
        • NDEF data exchange

          You can exchange NDEF data between tags and peers. To exchange data between tags, read from tags and write to tags using the readNDEF() and writeNDEF() methods.

          To exchange data between peers, the setReceiveNDEFListener() method of the NFCPeer interface (in mobile and wearable applications) registers an event listener, which triggers an event when an NDEF message is received from a peer.

          You can use the NDEFMessageReadCallback interface (in mobile and wearable applications) to define event handlers for reading NDEF messages from tags and peer devices.

          -
        • -
        • NFC card emulation

          You can enable NFC card emulation and monitor the secure element transaction taking place using the NFCAdapter interface. The secure element transaction is carried out by the device. The Tizen application can detect the transaction, but does not take part in it. Interpreting the transaction data requires knowledge about the data protocol the transaction uses. With the required knowledge, the application can detect whether the transaction was successful.

        • -
        • NFC host-based card emulation (HCE)

          You can handle HCE events and transactions taking place using the NFCAdapter interface. HCE is an on-device technology that permits a phone to perform card emulation on an NFC-enabled device without relying on access to a secure element. The transaction data is routed to the host application directly, instead of routing to a secure element. The Tizen application can detect the transaction and can take part in it.

        • -
        - +

        For a practical example of exchanging contacts between devices over an NFC connection, see the Contacts Exchanger mobile sample task.

        + +

        NFC Tags and NDEF Messages

        +

        An NFC tag is a chip which can securely store personal information, such as debit card numbers or contact details. The methods of the NFCTag interface (in mobile and wearable applications) are used to access an NFC tag for reading or writing information. NFC tag types are identified using the type attribute of the NFCTagType type definition (in mobile and wearable applications).

        +
        - +
        Note
        If an application is on the background and uses the writeNDEF(), transceive(), or sendNDEF() method, an error callback is launched. These methods can only be used in the foreground.Tizen provides the following NFC tag types: GENERIC_TARGET, ISO14443_A, ISO14443_4A, ISO14443_3A, MIFARE_MINI, MIFARE_1K, MIFARE_4K, MIFARE_ULTRA, MIFARE_DESFIRE, ISO14443_B, ISO14443_4B, ISO14443_BPRIME, FELICA, JEWEL, ISO15693, and UNKNOWN_TARGET.
        -

        You can launch NFC applications based on the NDEF message content using the application control functionalities:

        - -
          -
        • NFC application can be launched by the receipt of an NDEF message or by the reading of an NFC tag. -

          If the application control with the http://tizen.org/appcontrol/operation/nfc/wellknown operation is defined in the config.xml file and an NFC-enabled device reads an NFC tag or receives an NDEF message whose first NDEF record has a record type (tnf value) set as NFC_RECORD_TNF_WELL_KNOWN, the NFC application is launched.

        • -
        • NFC applications can be launched by the transaction of the card emulation functionality. NFC devices can communicate with point of sales (POS) terminals using the card emulation functionality to, for example, make a payment. -

          If the application control with the http://tizen.org/appcontrol/operation/nfc/transaction or http://tizen.org/appcontrol/operation/nfc/off_host_apdu_service operation is defined in the config.xml file and a secure element transaction occurs, the NFC application is launched.

        • -
        • NFC applications can be launched by the transaction of the HCE functionality. The NFC application can communicate with point of sales (POS) terminals using the HCE functionality to, for example, make a payment. -

          If the application control with the http://tizen.org/appcontrol/operation/nfc/host_apdu_service operation is defined in the config.xml file and an HCE transaction occurs, the NFC application is launched.

        • -
        • The system sends the http://tizen.org/appcontrol/operation/nfc/card_emulation/default_changed application control event when the default wallet is changed. For example, in Setting > NFC > Set Default Wallet App, if the default wallet is changed, an application control with this operation is sent to the selected application (wallet).
        • -
        -

        The following table lists the NFC operations, URI scheme and mime.

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        - Table: NFC operations -
        OperationURI schemeMIME
        http://tizen.org/appcontrol/operation/nfc/emptyNULLNULL
        http://tizen.org/appcontrol/operation/nfc/wellknown<scheme>:<host>/<path>

        URL, for example:

        -
          -
        • http
        • -
        • http://tizen.org/
        • -
        • http://tizen.org/about/devices
        • -
        • http://tizen.org/about/*
        • -

        URN, for example:

        -
          -
        • tel
        • -
        • mailto
        • -
        • mailto:tommy@tizen.org
        • -
        U/<protocol_code>

        For example: U/0x03, U/0x05, U/*

        NULL<type_string>/*

        For example: T/*, sp/*, */*

        http://tizen.org/appcontrol/operation/nfc/mimeNULL<type_string>/<subtype_string> (case-insensitive)

        For example: text/x-vard, text/*, */*

        http://tizen.org/appcontrol/operation/nfc/uri<uri>

        For example: http://tizen.org/about/devices

        NULL
        http://tizen.org/appcontrol/operation/nfc/external<scheme>:<string> (case-insensitive)

        For example: nfc:ext.tizen.org.ABC

        NULL
        http://tizen.org/appcontrol/operation/nfc/transactionnfc://secure/<SE name>/aid/<aid>

        For example:

        -
          -
        • nfc://secure/SIM1/aid/123456789
        • -
        • nfc://secure/SIM1/aid/1234*
        • -
        • nfc://secure/SIM1/aid/*
        • -
        NULL
        http://tizen.org/appcontrol/operation/nfc/card_emulation/host_apdu_serviceNULLNULL
        http://tizen.org/appcontrol/operation/nfc/card_emulation/off_host_apdu_serviceNULLNULL
        http://tizen.org/appcontrol/operation/nfc/card_emulation/default_changedNULLNULL
        -

        * The <protocol_code> and <scheme> must be in sync. See NFCForum-TS-RTD_URI_1.0 and NFC RTD (Record Type Definition) documentation on the NFC forum.

        +

        The NFC forum defines the NFC data exchange format (NDEF) for encapsulating the data exchanged between 2 NFC-enabled devices or an NFC-enabled device and an NFC tag. An NDEF message can store data in various formats, such as text, Multipurpose Internet Mail Extension (MIME) type object, or ultra-short RagTime Document (RTD). The NFC tags use NDEF for exchanging messages. Tizen provides the NDEFMessage interface (in mobile and wearable applications) to define an NDEF message.

        -

        NDEF Messages

        -

        Tizen provides the NDEFMessage interface (in mobile and wearable applications) to define an NDEF message. An NDEF message is composed of multiple records.

        -

        An NDEF record is created using the NDEFRecord interface (in mobile and wearable applications) and is identified by record type, ID, and payload.

        -

        The following figure shows the conceptual structure of an NDEF message.

        +

        An NDEF message is composed of multiple records. An NDEF record is created using the NDEFRecord interface (in mobile and wearable applications) and is identified by record type, ID, and payload. The following figure shows the conceptual structure of an NDEF message.

        Figure: Structure of an NDEF message

        Structure of an NDEF message

        A record in an NDEF message can be created by using the following payload types:

          -
        • Text

          The NDEF record content is created using text format.

          The NDEFRecordText interface (in mobile and wearable applications) is used to create the text format payload using the text, languageCode, and encoding attributes.

        • -
        • URI

          The NDEF record content is created using a URI.

          The NDEFRecordURI interface (in mobile and wearable applications) is used to create the URI type payload using the uri attribute.

        • -
        • Media

          The NDEF record content is created using a media format.

          The NDEFRecordMedia interface (in mobile and wearable applications) is used to create the media format payload using the mimeType attribute.

        • +
        • Text +

          The NDEF record content is created using text format.

          +

          The NDEFRecordText interface (in mobile and wearable applications) is used to create the text format payload using the text, languageCode, and encoding attributes.

        • +
        • URI +

          The NDEF record content is created using a URI.

          +

          The NDEFRecordURI interface (in mobile and wearable applications) is used to create the URI type payload using the uri attribute.

        • +
        • Media +

          The NDEF record content is created using a media format.

          +

          The NDEFRecordMedia interface (in mobile and wearable applications) is used to create the media format payload using the mimeType attribute.

        -

        Warm-up

        -

        Become familiar with the NFC API basics by learning about:

        - -

        Task in Mobile Applications

        -

        In the Contacts Exchanger task, we will walk through how to exchange contacts between devices over an NFC connection.

        - -

        Prerequisites

        + + +

        Prerequisites

        To use the Application (in mobile and wearable applications) and NFC (in mobile and wearable applications) APIs, the application has to request permission by adding the following privileges to the config.xml file:

        @@ -234,8 +130,8 @@
         
         
           

        Managing NFC Connectivity

        - -

        Learning how to enable or disable the NFC service is a basic NFC management skill:

        +

        To use NFC, retrieve the default NFC adapter using the getDefaultAdapter() method of the NFCAdapter interface (in mobile and wearable applications). You can enable and disable NFC using the setPowered() method.

        + @@ -246,6 +142,9 @@
        + +

        To enable or disable the NFC service:

        +
        1. To get the default NFC adapter, use the getDefaultAdapter() method and prepare an ApplicationControl object (in mobile and wearable applications) to request the NFC switching operation:

          var nfcSwitchAppControl = new tizen.ApplicationControl("http://tizen.org/appcontrol/operation/setting/nfc", null, null, null,
          @@ -277,7 +176,7 @@ function launchError(error)
                 alert("NFC Settings application reported failure.");
              }
           }
        2. -
        3. If necessary, request launching the NFC Settings with nfcSwitchAppControl as parameter: +
        4. If necessary, request launching the NFC Settings with nfcSwitchAppControl as a parameter:
          if (adapter.powered)
           {
              console.log("NFC is already enabled");
          @@ -290,11 +189,13 @@ else
             

        Detecting NFC Tags and Peer Devices

        - -

        Learning how to detect NFC tags and peer devices is a basic NFC management skill:

        +

        To receive notifications when an NFC tag or peer device has been detected, register event listeners with the setTagListener() and setPeerListener() methods of the NFCAdapter interface (in mobile and wearable applications). You can use the NFCTagDetectCallback (in mobile and wearable applications) and NFCPeerDetectCallback (in mobile and wearable applications) interfaces to define event handlers for receiving the notifications about attaching and detaching NFC tags and peers, respectively.

        +

        To detect NFC tags and peer devices:

        1. To get the default NFC adapter, use the getDefaultAdapter() method:

          var nfcAdapter = tizen.nfc.getDefaultAdapter();
        2. -
        3. Define the event handlers for NFC tag detection using the NFCTagDetectCallback listener interface (in mobile and wearable applications):

          var setTagDetect =
          +   
        4. Define the event handlers for NFC tag detection using the NFCTagDetectCallback listener interface:

          +
          +var setTagDetect =
           {
              /* When an NFC tag is detected */
              onattach: function(nfcTag)
          @@ -307,7 +208,8 @@ else
              {
                 console.log("NFC Tag unavailable");
              }
          -}
        5. +} +
        6. Register the listener to use the defined event handlers.

          You can limit the listener to detect only specific NFC tag types by defining the tag types as the second parameter of the setTagListener() method. In the following example, only MIFARE tags are detected.

           /* Defines the tag types to be detected */
           var tagFilter = ["MIFARE_MINI", "MIFARE_1K", "MIFARE_4K", "MIFARE_ULTRA", "MIFARE_DESFIRE"];
          @@ -317,25 +219,31 @@ nfcAdapter.setTagListener(setTagDetect, tagFilter);
        7. To stop the tag detection, use the unsetTagListener() method:

           nfcAdapter.unsetTagListener();
        -

        NFC peers are detected similarly as NFC tags, except that the setPeerListener() method is used to register the NFCPeerDetectCallback listener interface (in mobile and wearable applications), and the unsetPeerListener() method is used to stop the peer detection.

        +

        NFC peers are detected similarly as NFC tags, except that the setPeerListener() method is used to register the NFCPeerDetectCallback listener interface, and the unsetPeerListener() method is used to stop the peer detection.

        Handling NDEF Messages

        - - -

        Learning how to create NDEF messages is a basic NFC management skill:

        + +

        You can handle NDEF messages by first creating NDEF records using the NDEFRecord interface (in mobile and wearable applications), and then adding the records to an NDEF message using the records attribute of the NDEFMessage interface (in mobile and wearable applications).

        +

        To create NDEF messages:

          -
        1. To create an NDEF URI record, create an NDEFRecordURI interface instance (in mobile and wearable applications) and specify the URI parameter.

          Additionally, you can create instances of the NDEFRecord (in mobile and wearable applications), NDEFRecordText (in mobile and wearable applications), or NDEFRecordMedia (in mobile and wearable applications) interfaces based on the record type to be created.

          var newRecord = new tizen.NDEFRecordURI("https://www.tizen.org/");
        2. -
        3. Create an NDEFMessage interface instance (in mobile and wearable applications):

          +   
        4. To create an NDEF URI record, create an NDEFRecordURI interface instance (in mobile and wearable applications) and specify the URI parameter.

          +

          Additionally, you can create instances of the NDEFRecord, NDEFRecordText (in mobile and wearable applications), or NDEFRecordMedia (in mobile and wearable applications) interfaces based on the record type to be created.

          +
          var newRecord = new tizen.NDEFRecordURI("https://www.tizen.org/");
        5. +
        6. Create an NDEFMessage interface instance:

          +
           var newMessage = new tizen.NDEFMessage(); 
        7. To add an NDEF record to an NDEF message, use the records attribute of the NDEFMessage interface:

           newMessage.records[0] = newRecord;

        Exchanging NDEF Data with Peers

        - -

        Learning how to exchange NDEF messages is a basic NFC management skill:

        +

        To exchange data between peers, the setReceiveNDEFListener() method of the NFCPeer interface (in mobile and wearable applications) registers an event listener, which triggers an event when an NDEF message is received from a peer.

        +

        You can use the NDEFMessageReadCallback interface (in mobile and wearable applications) to define event handlers for reading NDEF messages from peer devices.

        +

        To exchange NDEF messages:

          -
        1. To receive NDEF messages from a peer device, use the setReceiveNDEFListener() method of the NFCPeer interface (in mobile and wearable applications).

          The setReceiveNDEFListener() method registers the NDEFMessageReadCallback listener interface (in mobile and wearable applications), which is invoked when an NDEF message from a peer device is read.

          +   
        2. To receive NDEF messages from a peer device, use the setReceiveNDEFListener() method of the NFCPeer interface.

          +

          The setReceiveNDEFListener() method registers the NDEFMessageReadCallback listener interface, which is invoked when an NDEF message from a peer device is read.

          +
           /* NDEFMessageReadCallback listener */
           function readMessage(message)
           {
          @@ -349,12 +257,26 @@ var newMessage = new tizen.NDEFMessage();
           
           Peer.sendNDEF(newMessage);
        + + + + + + + + + + +
        Note
        If an application is on the background and uses the sendNDEF() method, an error callback is launched. This method can only be used in the foreground.

        Exchanging NDEF Data with Tags

        - -

        Learning how to exchange NDEF data with tags is a basic NFC management skill:

        +

        To exchange data between tags, you can read from tags and write to tags using the readNDEF() and writeNDEF() methods.

        +

        You can use the NDEFMessageReadCallback interface (in mobile and wearable applications) to define event handlers for reading NDEF messages from tags.

        +

        To exchange NDEF data with tags:

          -
        1. To read data from an NFC tag, use the readNDEF() method of the NFCTag interface (in mobile and wearable applications).

          The readNDEF() method registers the NDEFMessageReadCallback listener interface (in mobile and wearable applications), which is invoked when an NDEF message is read.

          +   
        2. To read data from an NFC tag, use the readNDEF() method of the NFCTag interface (in mobile and wearable applications).

          +

          The readNDEF() method registers the NDEFMessageReadCallback listener interface, which is invoked when an NDEF message is read.

          +
           /* NDEFMessageReadCallback listener */
           function readMessage(message)
           {
          @@ -367,7 +289,8 @@ if (Tag.isSupportedNDEF)
              /* Read NDEF data */
              Tag.readNDEF(readMessage);
           }
        3. -
        4. To write data on an NFC tag, use the writeNDEF() method:

          +
        5. To write data on an NFC tag, use the writeNDEF() method:

          +
           var newMessage = new tizen.NDEFMessage();
           function writeCallback()
           {
          @@ -375,12 +298,23 @@ function writeCallback()
           }
           Tag.writeNDEF(newMessage, writeCallback);

          You can use the transceive() method to transfer raw data as a byte array to an NFC tag without knowing the underlying details of the tag.

        + + + + + + + + + + +
        Note
        If an application is on the background and uses the writeNDEF() or transceive() method, an error callback is launched. These methods can only be used in the foreground.
        -

        Using NFC Card Emulation

        - -

        Learning how to enable or disable the NFC card emulation and detect Secure Element transactions is a basic NFC management skill:

        +

        Using NFC Card Emulation

        +

        You can enable NFC card emulation and monitor the secure element transaction taking place using the NFCAdapter interface (in mobile and wearable applications). The secure element transaction is carried out by the device. The Tizen application can detect the transaction, but does not take part in it. Interpreting the transaction data requires knowledge about the data protocol the transaction uses. With the required knowledge, the application can detect whether the transaction was successful.

        +

        To enable or disable the NFC card emulation and detect secure element transactions:

          -
        1. Declare the required variables and obtain the NFCAdapter object (in mobile and wearable applications) using the getDefaultAdapter() method of the NFCManager interface (in mobile and wearable applications): +
        2. Declare the required variables and obtain the NFCAdapter object using the getDefaultAdapter() method of the NFCManager interface (in mobile and wearable applications):
           var adapter = tizen.nfc.getDefaultAdapter();
           var modeListenerId = 0, aseListenerId = 0, transListenerId = 0;
          @@ -424,8 +358,8 @@ adapter.cardEmulationMode = "OFF";
           

        Using NFC Host-based Card Emulation

        - -

        Learning how to detect NFC HCE (host-based card emulation) events and manage AID (Application ID) is a basic NFC management skill:

        +

        You can handle HCE (host-based card emulation) events and transactions taking place using the NFCAdapter interface (in mobile and wearable applications). HCE is an on-device technology that permits a phone to perform card emulation on an NFC-enabled device without relying on access to a secure element. The transaction data is routed to the host application directly, instead of routing to a secure element. The Tizen application can detect the transaction and can take part in it.

        +

        To detect NFC HCE events and manage AID (Application ID):

        1. Specify an AID value for receiving HCE transaction events:

            @@ -493,7 +427,7 @@ adapter.cardEmulationMode = "OFF";
          1. off: The card can work when the device is off.
          2. sleep: The card can work when the device is in the sleep mode.
        2. -
        3. Declare the required variables and obtain the NFCAdapter object (in mobile and wearable applications) using the getDefaultAdapter() method of the NFCManager interface (in mobile and wearable applications).

          +
        4. Declare the required variables and obtain the NFCAdapter object using the getDefaultAdapter() method of the NFCManager interface (in mobile and wearable applications).

          To enable NFC card emulation, change the value of the cardEmulationMode attribute.

           var hceListenerId = 0;
          @@ -578,6 +512,99 @@ adapter.cardEmulationMode = "OFF";
           
        +

        NFC Application Control Operations

        +

        You can launch NFC applications based on the NDEF message content using the application control functionalities:

        +
          +
        • NFC application can be launched by the receipt of an NDEF message or by the reading of an NFC tag. +

          If the application control with the http://tizen.org/appcontrol/operation/nfc/wellknown operation is defined in the config.xml file and an NFC-enabled device reads an NFC tag or receives an NDEF message whose first NDEF record has a record type (tnf value) set as NFC_RECORD_TNF_WELL_KNOWN, the NFC application is launched.

        • +
        • NFC applications can be launched by the transaction of the card emulation functionality. NFC devices can communicate with point of sales (POS) terminals using the card emulation functionality to, for example, make a payment. +

          If the application control with the http://tizen.org/appcontrol/operation/nfc/transaction or http://tizen.org/appcontrol/operation/nfc/off_host_apdu_service operation is defined in the config.xml file and a secure element transaction occurs, the NFC application is launched.

        • +
        • NFC applications can be launched by the transaction of the HCE functionality. The NFC application can communicate with point of sales (POS) terminals using the HCE functionality to, for example, make a payment. +

          If the application control with the http://tizen.org/appcontrol/operation/nfc/host_apdu_service operation is defined in the config.xml file and an HCE transaction occurs, the NFC application is launched.

        • +
        • The system sends the http://tizen.org/appcontrol/operation/nfc/card_emulation/default_changed application control event when the default wallet is changed. For example, in Setting > NFC > Set Default Wallet App, if the default wallet is changed, an application control with this operation is sent to the selected application (wallet).
        • +
        + +

        The following table lists the NFC operations, URI scheme and mime.

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + Table: NFC operations +
        OperationURI schemeMIME
        http://tizen.org/appcontrol/operation/nfc/emptyNULLNULL
        http://tizen.org/appcontrol/operation/nfc/wellknown<scheme>:<host>/<path>

        URL, for example:

        +
          +
        • http
        • +
        • http://tizen.org/
        • +
        • http://tizen.org/about/devices
        • +
        • http://tizen.org/about/*
        • +

        URN, for example:

        +
          +
        • tel
        • +
        • mailto
        • +
        • mailto:tommy@tizen.org
        • +
        U/<protocol_code>

        For example: U/0x03, U/0x05, U/*

        NULL<type_string>/*

        For example: T/*, sp/*, */*

        http://tizen.org/appcontrol/operation/nfc/mimeNULL<type_string>/<subtype_string> (case-insensitive)

        For example: text/x-vard, text/*, */*

        http://tizen.org/appcontrol/operation/nfc/uri<uri>

        For example: http://tizen.org/about/devices

        NULL
        http://tizen.org/appcontrol/operation/nfc/external<scheme>:<string> (case-insensitive)

        For example: nfc:ext.tizen.org.ABC

        NULL
        http://tizen.org/appcontrol/operation/nfc/transactionnfc://secure/<SE name>/aid/<aid>

        For example:

        +
          +
        • nfc://secure/SIM1/aid/123456789
        • +
        • nfc://secure/SIM1/aid/1234*
        • +
        • nfc://secure/SIM1/aid/*
        • +
        NULL
        http://tizen.org/appcontrol/operation/nfc/card_emulation/host_apdu_serviceNULLNULL
        http://tizen.org/appcontrol/operation/nfc/card_emulation/off_host_apdu_serviceNULLNULL
        http://tizen.org/appcontrol/operation/nfc/card_emulation/default_changedNULLNULL
        +

        * The <protocol_code> and <scheme> must be in sync. See NFCForum-TS-RTD_URI_1.0 and NFC RTD (Record Type Definition) documentation on the NFC forum.

        + + diff --git a/org.tizen.guides/html/web/connectivity/secure_element_w.htm b/org.tizen.guides/html/web/connectivity/secure_element_w.htm index 330d21d..1602240 100644 --- a/org.tizen.guides/html/web/connectivity/secure_element_w.htm +++ b/org.tizen.guides/html/web/connectivity/secure_element_w.htm @@ -50,24 +50,17 @@

        The main features of the Secure Element API include:

          -
        • Managing secure elements

          You manage secure elements by retrieving all the available secure element readers and receiving notifications of reader changes using the SEService interface (in mobile and wearable applications). You can also shut down secure elements.

        • -
        • Opening and closing sessions and channels

          You can open a session to connect to a secure element reader. Within a session, you can open basic or logical channels. When the channel or session is no longer needed, you can close them.

        • -
        • Transmitting APDUs to the applet

          You can transmit application protocol data units (APDU) to a secure element using a channel.

        • +
        • Managing secure elements +

          You can manage secure elements by retrieving all the available secure element readers and receiving notifications of reader changes using the SEService interface (in mobile and wearable applications). You can also shut down secure elements.

        • +
        • Opening sessions and channels +

          You can open a session to connect to a secure element reader. Within a session, you can open basic or logical channels.

        • +
        • Transmitting APDUs to the applet +

          You can transmit application protocol data units (APDU) to a secure element using a channel.

        • +
        • Closing sessions and channels +

          When the channel or session is no longer needed, you can close them.

        -

        Before you start, remember to prepare your application to use the secure element functionality.

        - -

        Warm-up

        -

        Become familiar with the Secure Element API basics by learning about:

        - - -

        Prerequisites

        +

        Prerequisites

        To use the Secure Element API (in mobile and wearable applications), the application has to request permission by adding the following privilege to the config.xml file:

        diff --git a/org.tizen.guides/html/web/cordova/console_w.htm b/org.tizen.guides/html/web/cordova/console_w.htm
        index 201b12c..7b0df2b 100644
        --- a/org.tizen.guides/html/web/cordova/console_w.htm
        +++ b/org.tizen.guides/html/web/cordova/console_w.htm
        @@ -50,8 +50,6 @@
         
         

        The Console API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

        -

        Before you start, remember to prepare your application to use the console functionality.

        -

        The main features of the Console API include:

        • Writing log messages and errors @@ -75,15 +73,6 @@

          The global console object contains some additional features defined by Cordova.

          -

          Warm-up

          -

          Become familiar with the Console API basics by learning about:

          - -

          Prerequisites

          To perform any Cordova-related operations, you must wait until Cordova is fully set up (the deviceready event occurs):

          diff --git a/org.tizen.guides/html/web/cordova/device_w.htm b/org.tizen.guides/html/web/cordova/device_w.htm
          index 1b0afdf..fe24aad 100644
          --- a/org.tizen.guides/html/web/cordova/device_w.htm
          +++ b/org.tizen.guides/html/web/cordova/device_w.htm
          @@ -29,7 +29,7 @@
           		 

          Content

          Related Info

            @@ -44,13 +44,11 @@

            Device Information

            -

            You can use a device global dictionary to access the device hardware UUID (unique ID) and software version.

            +

            You can use a device global dictionary to access the device information, such as hardware UUID (unique ID) and software version.

            The Device API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

            -

            Before you start, remember to prepare your application to use the device functionality.

            - -

            The following table lists the properties are available in the global Device object (in mobile, wearable, and TV applications).

            +

            The following table lists the properties available in the global Device object (in mobile, wearable, and TV applications), and which allow you to access specific device information.

            @@ -77,18 +75,6 @@
            Table: Device properties
            -

            The following example demonstrates how you can access the properties:

            -
            -console.log("Model name: " + device.model);
            -
            - -

            Warm-up

            -

            Become familiar with the Device API basics by learning about:

            - -

            Prerequisites

            To perform any Cordova-related operations, you must wait until Cordova is fully set up (the deviceready event occurs):

            @@ -100,9 +86,7 @@ function onDeviceReady()
             }
             
            -

            Checking the Version, Platform, and Device UUID

            - -

            UUID is a unique identifier for a device, and can be the device IMEI (International Mobile Equipment Identity).

            +

            Accessing Device Properties

            To retrieve information on the device, Cordova, and operating system, and output it in the system log:

            @@ -119,7 +103,9 @@ function onDeviceReady()    console.log("OS version: " + device.version);    console.log("Device UUID: " + device.uuid); } -
        • +
        +

        UUID is a unique identifier for a device, and can be the device IMEI (International Mobile Equipment Identity).

        +
      12. Wait for the deviceready event:
         document.addEventListener("deviceready", onDeviceReady);
        diff --git a/org.tizen.guides/html/web/cordova/devicemotion_w.htm b/org.tizen.guides/html/web/cordova/devicemotion_w.htm
        index 624d5d2..79c696f 100644
        --- a/org.tizen.guides/html/web/cordova/devicemotion_w.htm
        +++ b/org.tizen.guides/html/web/cordova/devicemotion_w.htm
        @@ -28,6 +28,7 @@
         		
         		

        Content

          +
        • Acceleration Values
        • Prerequisites
        • Getting the Current Acceleration
        • Monitoring the Acceleration Values
        • @@ -45,13 +46,11 @@

          Device Motions

          -

          You can access the device accelerometer.

          +

          You can access the acceleration values from the device accelerometer.

          The Device Motion API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

          -

          Before you start, remember to prepare your application to use the device motion functionality.

          - -

          The main features of the Device Motion API include:

          +

          The main features of the Device Motion API include:

          -

          Acceleration Values

          +

          Acceleration Values

          The acceleration data is captured into the Acceleration interface (in mobile, wearable, and TV applications). The acceleration values include the effect of gravity (9.81 m/s^2), so that when a device lies flat and facing up, the x, y, and z values returned must be 0, 0, and 9.81.

          @@ -88,14 +87,6 @@

          This guide demonstrates how you can get access to the device accelerometer through the navigator.accelerometer object.

          -

          Warm-up

          -

          Become familiar with the Device Motion API basics by learning about:

          - -

          Prerequisites

          To perform any Cordova-related operations, you must wait until Cordova is fully set up (the deviceready event occurs):

          diff --git a/org.tizen.guides/html/web/cordova/dialogs_w.htm b/org.tizen.guides/html/web/cordova/dialogs_w.htm
          index edaf0b6..7348c66 100644
          --- a/org.tizen.guides/html/web/cordova/dialogs_w.htm
          +++ b/org.tizen.guides/html/web/cordova/dialogs_w.htm
          @@ -51,53 +51,23 @@
           
           

          The Dialogs API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

          -

          Before you start, remember to prepare your application to use the dialog functionality.

          -

          The main features of the Dialogs API include:

          • Alerts -

            You can show some message (an alert) with a dismiss button with custom text.

            -

            The callback triggered when the alert dialog box is closed has no parameters.

            +

            You can create an alert dialog box, which shows an alert text and a dismiss button with custom text.

          • Confirmations -

            You can show a confirmation dialog box with a set of buttons.

            -

            The callback triggered when the confirmation dialog box is closed has 1 parameter: the index of the pressed button.

            +

            You can create a confirmation dialog box, which shows a confirmation text with a set of buttons.

          • Prompts -

            You can show a prompt dialog box where the user can put some text, with a set of buttons.

            -

            The callback triggered when the prompt dialog box is closed has 1 parameter: the PromptData object (in mobile, wearable, and TV applications) containing user input and 2 properties.

            -
          - - - - - - - - - - - - - -
          Table: PromptData object properties
          PropertyValue
          buttonIndexIndex of a button pressed by the user. The index uses one-based indexing, so the values can be 1, 2, 3, and so on.
          input1Text entered by the user.
          - +

          You can create a prompt dialog box, which shows a prompt where the user can put some text, and a set of buttons.

          +
        • Beeps

          You can make a beep sound.

        -

        Warm-up

        -

        Become familiar with the Dialogs API basics by learning about:

        - -

        Prerequisites

        To perform any Cordova-related operations, you must wait until Cordova is fully set up (the deviceready event occurs):

        @@ -110,10 +80,12 @@ function onDeviceReady()
         

        Creating Alerts

        +

        To show a custom alert with 1 button:

          -
        1. Define a callback method to be invoked when the user closes the alert:

          +
        2. Define a callback method to be invoked when the user closes the alert.

          +

          The callback has no parameters.

           var alertDismissed = function()
           {
          @@ -123,7 +95,7 @@ var alertDismissed = function()
           
        3. Open the alert dialog box with an alert text and callback function:

          -navigator.notification.alert('Please click OK button.', alertDismissed );
          +navigator.notification.alert('Please click OK button.', alertDismissed);
           

          Alternatively, you can open the alert dialog box with an optional title (default is Dialog), and an optional button name (default is OK):

          @@ -135,10 +107,12 @@ navigator.notification.alert('Please click Close button.', alertDismisse
           

          When the user dismisses the dialog box, the log appears in the console.

          Creating Confirmations

          +

          To show a confirmation dialog box with a set of buttons:

            -
          1. Define a callback method to be invoked when the user clicks a button:

            +
          2. Define a callback method to be invoked when the user clicks a button.

            +

            The callback has 1 parameter: the index of the pressed button, or 0, if the dialog is dismissed without a button press.

             var confirmCallback = function(buttonIndex)
             {
            @@ -153,13 +127,16 @@ navigator.notification.confirm('Choose one option:', confirmCallback,
             
          -

          The callback is invoked when the user performs an action. It provides the index of the pressed button (such as 1, 2, 3) or 0, if the dialog was dismissed without a button press.

          +

          The callback is invoked when the user performs an action.

          Creating Prompts

          +

          To show a prompt dialog box where the user can put some text, with a set of buttons:

            -
          1. Define a callback method to be invoked when the user clicks a button:

            +
          2. Define a callback method to be invoked when the user clicks a button.

            +

            The callback has 1 parameter: the PromptData object (in mobile, wearable, and TV applications) containing the user input and pressed button index.

            +
             var promptCallback = function(results)
             {
            @@ -174,7 +151,22 @@ navigator.notification.prompt('Please enter text:', promptCallback, '
             
          -

          The callback call provides the PromptData object (in mobile, wearable, and TV applications) as a parameter, holding all the data provided by the user.

          +

          The callback provides the PromptData object, holding all the data provided by the user.

          + + + + + + + + + + + + + + +
          Table: PromptData object properties
          PropertyValue
          buttonIndexIndex of a button pressed by the user. The index uses one-based indexing, so the values can be 1, 2, 3, and so on.
          input1Text entered by the user.

          Making Beep Sounds

          To make a beep sound once or more:

          diff --git a/org.tizen.guides/html/web/cordova/events_w.htm b/org.tizen.guides/html/web/cordova/events_w.htm index 069928e..322ebd6 100644 --- a/org.tizen.guides/html/web/cordova/events_w.htm +++ b/org.tizen.guides/html/web/cordova/events_w.htm @@ -28,8 +28,8 @@

          Content

          @@ -53,47 +53,37 @@

          The Events API provides the following events:

          • deviceready -

            The deviceready event is a prerequisite for all Cordova operations. Use the deviceready event to receive a signal when Cordova's device APIs have loaded and are ready to access.

            +

            The deviceready event is a prerequisite for all Cordova operations. You can use the deviceready event to receive a signal when Cordova's device APIs have loaded and are ready to access. You can also use this event to register event listeners for other events you are interested in.

          • pause -

            Use the pause event to receive a signal when the application is put to the background. This happens typically when the screen is being locked or when the user switches to a different application.

            +

            You can use the pause event to receive a signal when the application is put to the background. This happens typically when the screen is being locked or when the user switches to a different application.

          • resume -

            Use the resume event to receive a signal when the application is retrieved from the background.

            +

            You can use the resume event to receive a signal when the application is retrieved from the background.

          • +
          • Button press events +

            You can add event listeners for specific button press events.

          -

          In addition, you can add event listeners for specific button press events, as defined in the following table.

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          Table: Button press events
          EventButton name
          backbuttonBack button
          menubuttonMenu button
          searchbuttonSearch button
          startcallbuttonStart call button
          endcallbuttonEnd call button
          volumedownbuttonVolume down button
          volumeupbuttonVolume up button
          + + +

          Prerequisites

          +

          To perform any Cordova-related operations, you must wait until Cordova is fully set up (the deviceready event occurs):

          +
          +document.addEventListener("deviceready", onDeviceReady, false);
          +
          +function onDeviceReady()
          +{
          +   console.log("Cordova features now available");
          +}
          +
          +

          Alternatively, you can add the event listener in the <body> element onload handler:

          +
          +window.onload = function()
          +{
          +   document.addEventListener("deviceready", onDeviceReady);
          +};
          +

          Adding Event Listeners

          The applications typically use the document.addEventListener() method to attach an event listener once the deviceready event fires. This means that event listeners for other events (such as pause, resume, and backbutton) are added during or after the deviceready event handler:

          @@ -118,32 +108,6 @@ function onVolumeUp() }
          -

          Warm-up

          -

          Become familiar with the Events API basics by learning about:

          - - -

          Prerequisites

          -

          To perform any Cordova-related operations, you must wait until Cordova is fully set up (the deviceready event occurs):

          -
          -document.addEventListener("deviceready", onDeviceReady, false);
          -
          -function onDeviceReady()
          -{
          -   console.log("Cordova features now available");
          -}
          -
          -

          Alternatively, you can add the event listener in the <body> element onload handler:

          -
          -window.onload = function()
          -{
          -   document.addEventListener("deviceready", onDeviceReady);
          -};
          -
          -

          Handling Pause and Resume Events

          The pause signals that the application is put into the background. This happens typically when the screen is being locked or when the user switches to a different application. The resume signals that the application returns from the background to the foreground.

          @@ -164,7 +128,7 @@ function onResume() }
      13. -
      14. Add the event listeners in the deviceready event handler (see Prerequisites).

        +
      15. In the deviceready event handler, add the listeners:

         document.addEventListener("pause", onPause);
         document.addEventListener("resume", onResume);
        @@ -174,6 +138,38 @@ document.addEventListener("resume", onResume);
         
         

        Handling Button Press Events

        +

        You can add event listeners for specific button press events, as defined in the following table.

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Table: Button press events
        EventButton name
        backbuttonBack button
        menubuttonMenu button
        searchbuttonSearch button
        startcallbuttonStart call button
        endcallbuttonEnd call button
        volumedownbuttonVolume down button
        volumeupbuttonVolume up button
        +

        Events are triggered when the corresponding button is pressed.

        To add event listeners for the menu, volume up, and volume down buttons:

        @@ -191,7 +187,7 @@ function onMenuButton() }
      16. -
      17. In the deviceready event handler (see Prerequisites), add the listeners.

        +
      18. In the deviceready event handler, add the listeners.

        In this example, the same listener is used for both the volume up and down buttons.

         document.addEventListener("menubutton", onMenuButton);
        diff --git a/org.tizen.guides/html/web/cordova/file_w.htm b/org.tizen.guides/html/web/cordova/file_w.htm
        index 7be2e69..8021896 100644
        --- a/org.tizen.guides/html/web/cordova/file_w.htm
        +++ b/org.tizen.guides/html/web/cordova/file_w.htm
        @@ -52,9 +52,7 @@
         
         

        The File API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

        -

        Before you start, remember to prepare your application to use the file functionality.

        - -

        The main features of the File API include:

        +

        The main features of the File API include:

        • Resolving the filesystem @@ -74,17 +72,6 @@
        -

        Warm-up

        -

        Become familiar with the File API basics by learning about:

        - -

        Prerequisites

        To enable your application to use the file functionality:

        diff --git a/org.tizen.guides/html/web/cordova/filetransfer_w.htm b/org.tizen.guides/html/web/cordova/filetransfer_w.htm index 4699cef..7b30db4 100644 --- a/org.tizen.guides/html/web/cordova/filetransfer_w.htm +++ b/org.tizen.guides/html/web/cordova/filetransfer_w.htm @@ -48,43 +48,22 @@

        File Transfers

        You can transfer files using HTTP requests, and download and upload files. You can also track a transfer's progress and abort it as needed. The default HTTP method is POST, but PUT is also supported.

        -

        The File Transfer API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

        -

        All file operations are accessible by the FileTransfer object (in mobile, wearable, and TV applications).

        - -

        Before you start, remember to prepare your application to use the file transfer functionality.

        - -

        The main features of the File Transfer API include:

        +

        The main features of the File Transfer API include:

        • Download -

          To download a file from a server, you must create a FileTransfer object and call its download() method.

          -

          The method is asynchronous, so you must provide a callback function which is invoked when the operation is successful. The callback parameter contains the just downloaded FileEntry object (in mobile, wearable, and TV applications).

          -

          If you need to track errors, you can provide an optional error callback as a parameter of the download() method.

          -
        • +

          You can download a file from a remote server.

        • Upload -

          The upload operation is very similar to download. To upload a file to a server, you must create a FileTransfer object and call its upload() method providing all necessary data as its parameters.

          -

          The parameters are the URL of the uploaded file, server location, and a success callback function, which is invoked when the upload is finished successfully. You can also provide an optional error callback.

          -
        • +

          You can upload a file to a remote server.

        • Abort -

          To abort an in-progress transfer, you must create the FileTransfer object, start the download or upload transfer operation (as described above), and call the abort() method. The method stops the transfer and sends the FileTransferError.ABORT_ERR error to the error callback (if provided).

          -
        • +

          You can terminate an on-going transfer.

        • Progress tracking -

          To track the progress of a file transfer, the FileTransfer object has the onprogress property, which is used to set up a function invoked each time a chunk of data is transferred. As a parameter, the function gets a ProgressEvent object (in mobile, wearable, and TV applications).

          -
        • +

          You can track the progress of a file transfer.

        + +

        All file operations are accessible by the FileTransfer object (in mobile, wearable, and TV applications).

        - -

        Warm-up

        -

        Become familiar with the File Transfer API basics by learning about:

        - -

        Prerequisites

        To enable your application to use the file transfer functionality:

        @@ -119,6 +98,13 @@ function onDeviceReady()

        Downloading Files

        +

        To download a file from a server, you must create a FileTransfer object (in mobile, wearable, and TV applications) and call its download() method with callbacks:

        +
          +
        • The method is asynchronous, so you must provide a callback function which is invoked when the operation is successful. +

          The callback parameter contains the downloaded FileEntry object (in mobile, wearable, and TV applications).

        • +
        • If you need to track errors, you can provide an optional error callback as a parameter of the download() method.
        • +
        +

        To download a file from a remote server:

        @@ -151,6 +137,8 @@ download complete: file:///home/owner/apps_rw/Gk6hf8hjk/tmp/file.txt
         

        Uploading Files

        + +

        The upload operation is very similar to download. To upload a file to a server, you must create a FileTransfer object (in mobile, wearable, and TV applications) and call its upload() method providing as parameters the URL of the uploaded file, server location, and a success callback function, which is invoked when the upload is finished successfully. You can also provide an optional error callback.

        To upload a file to a remote server:

         /* Valid URL needed, such as cdvfile://localhost/persistent/path/to/file.txt */
        @@ -182,6 +170,8 @@ Sent = 1024
         

        Aborting Transfers

        + +

        To abort an in-progress transfer, you must create the FileTransfer object (in mobile, wearable, and TV applications), start the download or upload transfer operation (as described above), and call the abort() method. The method stops the transfer and sends the FileTransferError.ABORT_ERR error to the error callback (if provided).

        To terminate a transfer:

         /* Valid URL needed, such as cdvfile://localhost/persistent/path/to/file.txt */
        @@ -212,6 +202,8 @@ upload error target http://some.server.com/file.txt
         

        Tracking Transfer Progress

        + +

        To track the progress of a file transfer, the FileTransfer object (in mobile, wearable, and TV applications) has the onprogress property, which is used to set up a function invoked each time a chunk of data is transferred. As a parameter, the function gets a ProgressEvent object (in mobile, wearable, and TV applications).

        To track the progress of a transfer:

         /* Valid URL needed, such as cdvfile://localhost/persistent/path/to/file.txt */
        diff --git a/org.tizen.guides/html/web/cordova/globalization_w.htm b/org.tizen.guides/html/web/cordova/globalization_w.htm
        index 0b69586..9c60d49 100644
        --- a/org.tizen.guides/html/web/cordova/globalization_w.htm
        +++ b/org.tizen.guides/html/web/cordova/globalization_w.htm
        @@ -56,11 +56,7 @@
         
         

        The Globalization API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

        -

        All Globalization functions are accessible by the navigator.globalization object (in mobile, wearable, and TV applications).

        - -

        Before you start, remember to prepare your application to use the globalization functionality.

        - -

        The main features of the Globalization API include:

        +

        The main features of the Globalization API include:

        • Obtaining locale information

          You can obtain the following locale information:

          @@ -76,32 +72,11 @@
      19. Converting data -

        You can convert strings, numbers, and dates according to the user locale. The following conversions are available:

        -
          -
        • Date to string
        • -
        • String to date
        • -
        • Number to string
        • -
        • String to number
        • -
        -
      20. +

        You can convert strings, numbers, and dates according to the user locale.

      21. +

        All Globalization functions are accessible by the navigator.globalization object (in mobile, wearable, and TV applications).

        -

        Warm-up

        -

        Become familiar with the Globalization API basics by learning about:

        - -

        Prerequisites

        To perform any Cordova-related operations, you must wait until Cordova is fully set up (the deviceready event occurs):

        diff --git a/org.tizen.guides/html/web/cordova/media_w.htm b/org.tizen.guides/html/web/cordova/media_w.htm
        index 571cff9..681243f 100644
        --- a/org.tizen.guides/html/web/cordova/media_w.htm
        +++ b/org.tizen.guides/html/web/cordova/media_w.htm
        @@ -28,7 +28,6 @@
         		
         		

        Content

      Using Playback Callbacks

      -

      Each time the audio playback is starting, paused, or finished, a success or error listener can be notified.

      + +

      You can monitor the playback status changes by defining a status callback for the Media constructor (in mobile, wearable, and TV applications). Each time the status changes, the defined callback is called with a status constant as a parameter. The following table lists the available status constants.

      + + + + + + + + + + + + + + + + + + + + + + + + +
      Table: Playback status changes
      ConstantDescription
      Media.MEDIA_NONEFile has no status.
      Media.MEDIA_STARTINGPlayback is starting.
      Media.MEDIA_RUNNINGPlayback is running.
      Media.MEDIA_PAUSEDPlayback is paused.
      Media.MEDIA_STOPPEDPlayback is stopped.

      To handle playback callbacks:

      @@ -272,7 +251,7 @@ var statusCallback = function(status)
    9. Construct a new media object and pass the callbacks as parameters.

      -

      Since the callbacks are optional, you do not need to provide them all.

      +

      Since the callbacks are optional, you do not need to provide them all. However, to monitor status changes, you must provide the status callback defined in the previous step.

       var src = "file:///home/owner/content/Music/play.mp3";
       var myMedia = new Media(src, successCallback, errorCallback, statusCallback);
      @@ -311,7 +290,7 @@ var myMedia = new Media("file:///home/owner/content/Music/play.mp3");
           
    10. Get the duration and print it to the system log. The -1 value means that the duration is unknown.

      -console.log( 'Audio duration in seconds is ' + myMedia.getDuration());
      +console.log('Audio duration in seconds is ' + myMedia.getDuration());
       
    11. Start playing:

      @@ -324,7 +303,7 @@ myMedia.play();
       var positionCallback = function(position)
       {
      -   console.log('Current position in seconds is ' + position );
      +   console.log('Current position in seconds is ' + position);
       }
       
    12. diff --git a/org.tizen.guides/html/web/cordova/network_information_w.htm b/org.tizen.guides/html/web/cordova/network_information_w.htm index bc79631..daeef91 100644 --- a/org.tizen.guides/html/web/cordova/network_information_w.htm +++ b/org.tizen.guides/html/web/cordova/network_information_w.htm @@ -49,9 +49,42 @@

      The Network Information API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

      -

      Before you start, remember to prepare your application to use the network information functionality.

      +

      The main features of the Network Information API include:

      + + +

      Prerequisites

      + +

      To enable your application to use the network information functionality:

      +
        +
      1. +

        To perform any Cordova-related operations, you must wait until Cordova is fully set up (the deviceready event occurs):

        +
        +document.addEventListener("deviceready", onDeviceReady, false);
        +
        +function onDeviceReady()
        +{
        +   console.log("Cordova features now available");
        +}
        +
        +
      2. +
      3. +

        To use the Network Information API (in mobile, wearable, and TV applications), the application has to request permission by adding the following privilege to the config.xml file:

        +
        +<tizen:privilege name="http://tizen.org/privilege/telephony"/>
        +
        +
      4. +
      + +

      Checking the Connection Status

      -

      The navigator.connection.type value can be compared with one of the values in Connection global dictionary to check the current connection status. The following table lists the available connection types.

      +

      The following table lists the available connection types in the Connection global dictionary, which you can use to determine the current connection status.

      @@ -87,43 +120,6 @@
      Table: Connection types
      -

      To monitor the changes in the network status, use the document.addEventListener() method to register the required callbacks.

      -

      Each time the connection type changes from Connection.NONE to any other value, the online event is fired. And each time the connection type becomes Connection.NONE, the offline event is fired.

      - - -

      Warm-up

      -

      Become familiar with the Network Information API basics by learning about:

      - - -

      Prerequisites

      - -

      To enable your application to use the network information functionality:

      -
        -
      1. -

        To perform any Cordova-related operations, you must wait until Cordova is fully set up (the deviceready event occurs):

        -
        -document.addEventListener("deviceready", onDeviceReady, false);
        -
        -function onDeviceReady()
        -{
        -   console.log("Cordova features now available");
        -}
        -
        -
      2. -
      3. -

        To use the Network Information API (in mobile, wearable, and TV applications), the application has to request permission by adding the following privilege to the config.xml file:

        -
        -<tizen:privilege name="http://tizen.org/privilege/telephony"/>
        -
        -
      4. -
      - -

      Checking the Connection Status

      -

      To determine whether the device is connected to a Wi-Fi network:

        diff --git a/org.tizen.guides/html/web/data/data_filter_w.htm b/org.tizen.guides/html/web/data/data_filter_w.htm index 3bae984..0b1c8d2 100644 --- a/org.tizen.guides/html/web/data/data_filter_w.htm +++ b/org.tizen.guides/html/web/data/data_filter_w.htm @@ -28,16 +28,16 @@

        Content

        Related Info

          @@ -53,35 +53,122 @@

          When managing large amounts of data, you can create filters to search for specific information, and make queries to receive only the information you are looking for. You can use various filter attributes and sort the received data.

          The Tizen API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

          - -

          The Tizen API provides a set of basic definitions and interfaces that are used in the Tizen Device API. The Tizen API contains filters and sorting modes for query methods, generic success and error event handlers, a generic error interface, and a simple coordinate interface for defining location information.

          -

          The main features of the Tizen API include:

          + +

          The main data handling features of the Tizen API include:

          + +

          Creating Attribute Filters

          + +

          Learning how to create attribute filters allows you effectively incorporate query methods in your application:

          +
            +
          1. The AttributeFilter filter (in mobile, wearable, and TV applications) is used to filter the search results based on an attribute value. In this example, the filter finds contacts, with the first name Chris, from the default address book.

            + +

            Create the filter with the AttributeFilter constructor. You can specify attribute options, such as the attribute name, match flag, and match value.

            /* Use the firstName attribute with the EXACTLY match flag and the Chris value */
            +var firstNameFilter = new tizen.AttributeFilter('name.firstName', 'EXACTLY', 'Chris');
          2. +
          3. Call the find() method of the AddressBook interface to find contacts. The filter (firstNameFilter) you created is included as a parameter.

            +tizen.contact.getDefaultAddressBook().find(successCB, errorCB, firstNameFilter);
          4. +
          + + +

          Creating Attribute Range Filters

          + +

          Learning how to use attribute range filters allows you effectively incorporate query methods in your application:

          +
            +
          1. The AttributeRangeFilter filter (in mobile, wearable, and TV applications)is used to search for results based on a range of attribute values. In this example, the filter finds all events starting on a defined day from the calendar.

            +

            Create the filter with the AttributeRangeFilter constructor. Specify the attribute, and the start and end points of the value range.

            /* Use the startDate attribute with a range that starts today and ends in 1 day */
            +/* (meaning that you search for all events occurring today) */
            +var now = tizen.time.getCurrentDateTime();
            +var today_begin = new tizen.TZDate(now.getFullYear(), now.getMonth(), now.getDate());
            +var today_end = today_begin.addDuration(new tizen.TimeDuration(1, "DAYS"));
            +var dateRangeFilter = new tizen.AttributeRangeFilter("startDate", today_begin, today_end);
          2. +
          3. Call the find() method of the Calendar interface to find events. The filter (dateRangeFilter) you created is included as a parameter.

            +tizen.calendar.getDefaultCalendar("EVENT").find(successCB, errorCB, dateRangeFilter);
          4. +
          + +

          Creating Composite Filters

          + +

          Learning how to use composite filters allows you effectively incorporate query methods in your application:

          +
            +
          1. The CompositeFilter filter (in mobile, wearable, and TV applications) is used to search for results based on a set of filters. In this example, the filter finds contacts, whose first name contains Chris and last name is Smith, from the default address book.

            +

            Create the filter with the CompositeFilter constructor. You can specify multiple sub-filters for the filter set.

            /* Create an attribute filter based on the firstName attribute */
            +var firstNameFilter = new tizen.AttributeFilter("name.firstName", "CONTAINS", "Chris");
            +
            +/* Create an attribute filter based on the lastName attribute */
            +var lastNameFilter = new tizen.AttributeFilter("name.lastName", "EXACTLY", "Smith");
            +
            +/* Create a composite filter based on the intersection of these 2 filters */
            +/* (intersection means that both filters must match for the contact to be included in the results) */
            +var nameCompositeFilter = new tizen.CompositeFilter("INTERSECTION", [firstNameFilter, lastNameFilter]);
          2. +
          3. Call the find() method of the AddressBook interface to find matching contacts. The filter (nameCompositeFilter) you created is included as a parameter.

            +tizen.contact.getDefaultAddressBook().find(successCB, errorCB, nameCompositeFilter);
          4. +
          + +

          Using Sorting Modes

          + +

          The following sorting modes are supported:

          • "ASC": Ascending sorting order

          • "DESC": Descending sorting order

          + +

          Learning how to use sorting modes allows you effectively incorporate query methods in your application:

          +
            +
          1. The SortMode interface (in mobile, wearable, and TV applications) is created to sort the search results. In this example, it is used to sort contacts in the device address book in ascending order, based on their first name.

            +

            Create the sort order with the SortMode() method. Specify an attribute name to sort by and an order option.

            +/* Use the firstName attribute with an ASC order */
            +var sortMode = new tizen.SortMode("name.firstName", "ASC");
          2. +
          3. Call the find() method of the AddressBook interface to find matching contacts. In this example, the filter parameter in the find() method is defined as null, which means that the method retrieves all contacts in the address book.

            +tizen.contact.getDefaultAddressBook().find(successCB, errorCB, null, sortMode);
          4. +
          + - -
          Note

          If you use a type attribute as a sort mode parameter, the sorting is not performed alphabetically since the attribute values are stored normally after the type conversion in the platform implementation.

          For example, if the ContentType enum (in mobile, wearable, and TV applications) is the type attribute and the sorting order is "DESC", the sorting result is ordered according to the listed enum order:

          +
          If you use a type attribute as a sort mode parameter, the sorting is not performed alphabetically since the attribute values are stored normally after the type conversion in the platform implementation. +

          For example, if the ContentType enum (in mobile, wearable, and TV applications) is the type attribute and the sorting order is "DESC", the sorting result is ordered according to the listed enum order:

          • Image
          • Video
          • Audio
          • Other
        -

        Calendar Filter Attributes

        + + +

        Making Complex Queries Using Filters

        + +

        Learning how to use filters allows you effectively incorporate complex query methods in your application. You can create queries using AND and OR conditions, like in SQL queries. The following example shows how to make the following query:

        +

        "where ((type='VIDEO' OR type='IMAGE') AND title like '%special%')"

        +

        Basically, you search in the content of the device for media items where the media type is video or image, and the title contains the word "special".

        +
          +
        1. Create attribute filters to include all content whose media type is either video or image:

          function makeQueryAndFire()
          +{
          +   /* Filter for the video media type */
          +   var typeVideoFilter = new tizen.AttributeFilter("type", "EXACTLY", "VIDEO");
          +
          +   /* Filter for the image media type */
          +   var typeImageFilter = new tizen.AttributeFilter("type", "EXACTLY", "IMAGE");
        2. +
        3. Create a composite filter that finds all content that matches one of the media type filters:

             var typeFilter = new tizen.CompositeFilter("UNION", [typeVideoFilter, typeImageFilter]);
        4. +
        5. Create another attribute filter that includes content containing the word "special" in its title:

             var titleFilter = new tizen.AttributeFilter("title", "CONTAINS", "special");
        6. +
        7. Create the final composite filter that finds all content that matches both the composite media type filter and the title filter:

             var finalFilter = new tizen.CompositeFilter("INTERSECTION", [typeFilter, titleFilter]);
        8. +
        9. Call the find() method of the Content API's ContentManager interface (in mobile, wearable, and TV applications) to retrieve the media items that match the final filter:

          +
             tizen.content.find(findMediaContentsCallback, onError, null, finalFilter);
          +}

          The findMediaContentsCallback() event handler returns the query result.

        10. +
        + +

        Calendar Filter Attributes

        The following table lists the filter types you can use with specific calendar item attributes in the methods of the Calendar interface.

        @@ -933,95 +1020,7 @@
        -

        Warm-up

        -

        Become familiar with the Tizen API basics by learning about:

        - - - -

        Creating Attribute Filters

        - -

        Learning how to create attribute filters allows you effectively incorporate query methods in your application:

        -
          -
        1. The AttributeFilter filter (in mobile, wearable, and TV applications) is used to filter the search results based on an attribute value. In this example, the filter finds contacts, with the first name Chris, from the default address book.

          - -

          Create the filter with the AttributeFilter constructor. You can specify attribute options, such as the attribute name, match flag, and match value.

          /* Use the firstName attribute with the EXACTLY match flag and the Chris value */
          -var firstNameFilter = new tizen.AttributeFilter('name.firstName', 'EXACTLY', 'Chris');
        2. -
        3. Call the find() method of the AddressBook interface to find contacts. The filter (firstNameFilter) you created is included as a parameter.

          -tizen.contact.getDefaultAddressBook().find(successCB, errorCB, firstNameFilter);
        4. -
        - - -

        Creating Attribute Range Filters

        - -

        Learning how to use attribute range filters allows you effectively incorporate query methods in your application:

        -
          -
        1. The AttributeRangeFilter filter (in mobile, wearable, and TV applications)is used to search for results based on a range of attribute values. In this example, the filter finds all events starting on a defined day from the calendar.

          -

          Create the filter with the AttributeRangeFilter constructor. Specify the attribute, and the start and end points of the value range.

          /* Use the startDate attribute with a range that starts today and ends in 1 day */
          -/* (meaning that you search for all events occurring today) */
          -var now = tizen.time.getCurrentDateTime();
          -var today_begin = new tizen.TZDate(now.getFullYear(), now.getMonth(), now.getDate());
          -var today_end = today_begin.addDuration(new tizen.TimeDuration(1, "DAYS"));
          -var dateRangeFilter = new tizen.AttributeRangeFilter("startDate", today_begin, today_end);
        2. -
        3. Call the find() method of the Calendar interface to find events. The filter (dateRangeFilter) you created is included as a parameter.

          -tizen.calendar.getDefaultCalendar("EVENT").find(successCB, errorCB, dateRangeFilter);
        4. -
        -

        Creating Composite Filters

        - -

        Learning how to use composite filters allows you effectively incorporate query methods in your application:

        -
          -
        1. The CompositeFilter filter (in mobile, wearable, and TV applications) is used to search for results based on a set of filters. In this example, the filter finds contacts, whose first name contains Chris and last name is Smith, from the default address book.

          -

          Create the filter with the CompositeFilter constructor. You can specify multiple sub-filters for the filter set.

          /* Create an attribute filter based on the firstName attribute */
          -var firstNameFilter = new tizen.AttributeFilter("name.firstName", "CONTAINS", "Chris");
          -
          -/* Create an attribute filter based on the lastName attribute */
          -var lastNameFilter = new tizen.AttributeFilter("name.lastName", "EXACTLY", "Smith");
          -
          -/* Create a composite filter based on the intersection of these 2 filters */
          -/* (intersection means that both filters must match for the contact to be included in the results) */
          -var nameCompositeFilter = new tizen.CompositeFilter("INTERSECTION", [firstNameFilter, lastNameFilter]);
        2. -
        3. Call the find() method of the AddressBook interface to find matching contacts. The filter (nameCompositeFilter) you created is included as a parameter.

          -tizen.contact.getDefaultAddressBook().find(successCB, errorCB, nameCompositeFilter);
        4. -
        - -

        Using Sorting Modes

        - -

        Learning how to use sorting modes allows you effectively incorporate query methods in your application:

        -
          -
        1. The SortMode interface (in mobile, wearable, and TV applications) is created to sort the search results. In this example, it is used to sort contacts in the device address book in ascending order, based on their first name.

          -

          Create the sort order with the SortMode() method. Specify an attribute name to sort by and an order option.

          -/* Use the firstName attribute with an ASC order */
          -var sortMode = new tizen.SortMode("name.firstName", "ASC");
        2. -
        3. Call the find() method of the AddressBook interface to find matching contacts. In this example, the filter parameter in the find() method is defined as null, which means that the method retrieves all contacts in the address book.

          -tizen.contact.getDefaultAddressBook().find(successCB, errorCB, null, sortMode);
        4. -
        - -

        Making Complex Queries Using Filters

        - -

        Learning how to use filters allows you effectively incorporate complex query methods in your application. You can create queries using AND and OR conditions, like in SQL queries. The following example shows how to make the following query:

        -

        "where ((type='VIDEO' OR type='IMAGE') AND title like '%special%')"

        -

        Basically, you search in the content of the device for media items where the media type is video or image, and the title contains the word "special".

        -
          -
        1. Create attribute filters to include all content whose media type is either video or image:

          function makeQueryAndFire()
          -{
          -   /* Filter for the video media type */
          -   var typeVideoFilter = new tizen.AttributeFilter("type", "EXACTLY", "VIDEO");
          -
          -   /* Filter for the image media type */
          -   var typeImageFilter = new tizen.AttributeFilter("type", "EXACTLY", "IMAGE");
        2. -
        3. Create a composite filter that finds all content that matches one of the media type filters:

             var typeFilter = new tizen.CompositeFilter("UNION", [typeVideoFilter, typeImageFilter]);
        4. -
        5. Create another attribute filter that includes content containing the word "special" in its title:

             var titleFilter = new tizen.AttributeFilter("title", "CONTAINS", "special");
        6. -
        7. Create the final composite filter that finds all content that matches both the composite media type filter and the title filter:

             var finalFilter = new tizen.CompositeFilter("INTERSECTION", [typeFilter, titleFilter]);
        8. -
        9. Call the find() method of the Content API's ContentManager interface (in mobile, wearable, and TV applications) to retrieve the media items that match the final filter:

          -
             tizen.content.find(findMediaContentsCallback, onError, null, finalFilter);
          -}

          The findMediaContentsCallback() event handler returns the query result.

        10. -
        diff --git a/org.tizen.guides/html/web/data/file_archiving_w.htm b/org.tizen.guides/html/web/data/file_archiving_w.htm index 2c2fb71..95e1f61 100644 --- a/org.tizen.guides/html/web/data/file_archiving_w.htm +++ b/org.tizen.guides/html/web/data/file_archiving_w.htm @@ -32,6 +32,7 @@
      1. Reading the Content of an Archive
      2. Creating an Archive
      3. Extracting Files from an Archive
      4. +
      5. Aborting File Operations
      6. Related Info

      - -

      Reading the Content of an Archive

      +

      Reading the Content of an Archive

      Opening an archive and accessing a list of its members is a basic archive management skill:

        @@ -156,7 +147,7 @@ archive.close();
    -

    Creating an Archive

    +

    Creating an Archive

    Creating an archive and adding files to it is a basic archive management skill:

      @@ -187,7 +178,7 @@ function createSuccess(archive)
    -

    Extracting Files from an Archive

    +

    Extracting Files from an Archive

    Extracting a file from an archive is a basic archive management skill:

    @@ -237,7 +228,23 @@ function openSuccess(archive) - + +

    Aborting File Operations

    + +

    You can abort an on-going file archive operation for the open(), add(), extractAll(), getEntries(), getEntryByName(), and extract() methods.

    + +

    To abort the file archive operation, use the operation ID and the abort() method of the ArchiveManager interface (in mobile, wearable, and TV applications):

    + +
    +function openSuccess(archive)
    +{
    +   operationId = archive.extractAll("downloads/extracted");
    +   tizen.archive.abort(operationId);
    +}
    +
    +tizen.archive.open("downloads/some_archive.zip", "r", openSuccess);
    +
    + diff --git a/org.tizen.guides/html/web/data/file_system_w.htm b/org.tizen.guides/html/web/data/file_system_w.htm index a31640a..2ee1b4d 100644 --- a/org.tizen.guides/html/web/data/file_system_w.htm +++ b/org.tizen.guides/html/web/data/file_system_w.htm @@ -28,11 +28,17 @@

    Content

    Related Info

      @@ -47,69 +53,35 @@

      File System

      -

      Tizen enables you to manage the files and directories in the device file system.

      +

      Tizen enables you to access the files and directories in the device file system.

      The Filesystem API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

      -

      The Filesystem API provides access to accessible parts of the file system, which are represented as virtual root locations. The virtual roots form a collection of locations that function as a single virtual device file system. The following table lists the supported virtual roots.

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - Table: Filesystem virtual roots -
      Virtual rootDescription
      documentsLocation for storing documents.
      downloadsLocation for storing downloaded items.
      imagesLocation for storing images.
      musicLocation for storing audio files.
      removableLocation for the removable storage.
      ringtonesLocation for ringtones (read-only location).
      videosLocation for storing videos.
      wgt-packageLocation for storing Web application packages (read-only location).
      wgt-privateLocation for the Web application private storage.
      wgt-private-tmpLocation for the Web application private temporary storage.
      - -

      Before you start, remember to prepare your application to use the file system functionality.

      - +

      The Filesystem API provides access to accessible parts of the file system, which are represented as virtual root locations.

      +

      The main features of the Filesystem API include:

        -
      • File storage management

        You can manage different storages on the device with the FileSystemManager interface (in mobile, wearable, and TV applications).

        You can retrieve additional information about the storages, including listing available storages and receiving storage change notifications with the listStorages() and addStorageStateChangeListener() methods provided by the FileSystemManager interface.

      • -
      • Access to files and directories

        You can access the virtual file system using the FileSystemManager interface.

        To access a file or directory within the virtual file system, you must use the fully qualified path, <root name>/<path>, where <rootname> is the name of the virtual root and <path> is the relative path to the file or directory within the root.

        +
      • File storage management +

        You can manage different storages on the device and retrieve additional information about the storages, including listing available storages and receiving storage change notifications.

        +
      • +
      • Files and directory management +

        You can perform basic file and directory management tasks using the File interface:

        +
      • +
      + +

      For a practical example of managing files in your application, see the File Manager sample task.

      + +

      File and Directory Access

      +

      You can access the virtual file system using the FileSystemManager interface (in mobile, wearable, and TV applications):

      + +
        +
      • To access a file or directory within the virtual file system, you must use the fully qualified path, <root name>/<path>, where <rootname> is the name of the virtual root and <path> is the relative path to the file or directory within the root. @@ -119,50 +91,13 @@ -
        When you use a path to access the device file system, make sure that the file path encoding uses the default encoding of the platform.

        To access a file or directory, you must also retrieve a file handle using the resolve() method of the FileSystemManager interface. A file handle is a reference object that points to and represents a file or directory.

        The isFile and isDirectory attributes of the File interface (in mobile, wearable, and TV applications) identify the type of the object: for example, for a file, the isFile attribute is set to true and the isDirectory attribute to false.

      • -
      • Files and directory management

        You can perform basic file and directory management tasks using the File interface:

        -
          -
        • Create files and directories using the createFile() and createDirectory() methods.

          The file or directory is created relative to the current directory that the operation is performed on.

          - - - - - - - - - -
          Note
          Do not use "." or ".." characters in the directory or file path components.
        • -
        • Retrieve a list of files or file URIs using the listFiles() and toURI() methods. The URI can be used to identify the file, for example, by using it as the src attribute on an HTML img element.

          You can retrieve file content as a DOMString with the readAsText() method. The encoding input parameter of the method defines the format in which the file content is returned.

        • -
        • Read or write to a file by first using the openStream() method to open the file. You can specify the file mode and encoding.

          The openStream() method returns a FileStream object (in mobile, wearable, and TV applications), which is a handle to the opened file. All actual operations, such as read, write, or close, on the file are performed through the FileStream object based on a position attribute, which represents the current position in the file.

        • -
        • Copy and move files and directories within the virtual file system with the copyTo() and moveTo() methods.

          If a file or directory of the same name already exists in the target location, the overwrite input parameter of the method defines whether the existing file is overwritten.

          - - - - - - - - - -
          Note
          The file or directory to be copied or moved must be located under the current directory.
        • -
        • Delete files and directories from the virtual file system using the deleteFile() and deleteDirectory() methods.

        • -
      • -
      - -

      Warm-up

      -

      Become familiar with the Filesystem API basics by learning about:

      - -
        -
      • Prerequisites

        Prepare your application to use the file system functionality.

      • -
      • Managing File Storages

        Retrieve file storages and storage details, and subscribe to notifications on storage state changes.

      • -
      • Creating and Deleting Files and Directories

        Create and delete files and directories in the file system.

      • -
      • Retrieving Files and File Details

        Retrieve a list of files in a directory, the URI of the file, or the file content as a DOMString.

      • -
      • Managing Files and Directories

        Open, read, write, copy, move, and close files and directories.

      • + + +
      • To access a file or directory, you must also retrieve a file handle using the resolve() method of the FileSystemManager interface. +

        A file handle is a reference object that points to and represents a file or directory.

      -

      Task

      -

      In the File Manager task, we will walk through how to manage files in your application.

      +

      The isFile and isDirectory attributes of the File interface (in mobile, wearable, and TV applications) identify the type of the object: for example, for a file, the isFile attribute is set to true and the isDirectory attribute to false.

      Prerequisites

      To use the Filesystem API (in mobile, wearable, and TV applications), the application has to request permission by adding the following privileges to the config.xml file:

      @@ -171,13 +106,12 @@ <tizen:privilege name="http://tizen.org/privilege/filesystem.write"/>
    - - -

    Managing File Storages

    - -

    Learning how to manage file storages is a basic data management skill:

    -
      -
    1. To list available storages, use the listStorages() method of the FileSystemManager interface (in mobile, wearable, and TV applications) to search for the storages available on the device.

      If the search is successful, a list of found FileSystemStorage objects (in mobile, wearable, and TV applications) is passed to the success event handler.

      +

      Managing File Storages

      +

      You can manage different storages on the device with the FileSystemManager interface (in mobile, wearable, and TV applications).

      +

      You can retrieve additional information about the storages, including listing available storages and receiving storage change notifications with the listStorages() and addStorageStateChangeListener() methods provided by the FileSystemManager interface.

      +

      To manage file storages:

      +
        +
      1. To list available storages, use the listStorages() method of the FileSystemManager interface to search for the storages available on the device.

        If the search is successful, a list of found FileSystemStorage objects (in mobile, wearable, and TV applications) is passed to the success event handler.

         /* Success event handler */
         function checkCorruptedRemovableDrives(storages) 
         { 
        @@ -217,9 +151,19 @@ function onStorageStateChanged(storage)
         tizen.filesystem.removeStorageStateChangeListener(watchID);
      -

      Creating and Deleting Files and Directories

      - -

      Learning how to create and delete files and directories is a basic data management skill:

      +

      Creating and Deleting Files and Directories

      +

      You can create files and directories using the createFile() and createDirectory() methods. The file or directory is created relative to the current directory that the operation is performed on.

      + + + + + + + + + +
      Note
      Do not use "." or ".." characters in the directory or file path components.
      +

      To create and delete files and directories:

      1. To create a file in the current directory, use the createFile() method of the File interface (in mobile, wearable, and TV applications):

         var documentsDir, newFile;
        @@ -245,9 +189,10 @@ documentsDir.deleteDirectory(newDir.fullPath, false, onDelete);
         anotherNewDir.parent.deleteDirectory(anotherNewDir.fullPath, false, onDelete);
      -

      Retrieving Files and File Details

      - -

      Learning how to get files and file details from the file system is a basic data management skill:

      +

      Retrieving Files and File Details

      +

      You can retrieve a list of files or file URIs using the listFiles() and toURI() methods. The URI can be used to identify the file, for example, by using it as the src attribute on an HTML img element.

      +

      You can retrieve file content as a DOMString with the readAsText() method. The encoding input parameter of the method defines the format in which the file content is returned.

      +

      To get files and file details from the file system:

      1. To access a specific file or directory within the file system, retrieve a file handle using the resolve() method of the FileSystemManager interface (in mobile, wearable, and TV applications):

         tizen.filesystem.resolve('documents', onResolveSuccess, null, 'r');

        The File object (in mobile, wearable, and TV applications) is returned in the success event handler.

      2. @@ -271,10 +216,29 @@ function onsuccess(files)

      Managing Files and Directories

      - -

      Learning how to read and write to files, and move and copy files and directories, is a basic data management skill:

      + +

      YTou can manage files and directories in many ways:

      +
        +
      • You can read and write to a file by first using the openStream() method to open the file. You can specify the file mode and encoding. +

        The openStream() method returns a FileStream object (in mobile, wearable, and TV applications), which is a handle to the opened file. All actual operations, such as read, write, or close, on the file are performed through the FileStream object based on a position attribute, which represents the current position in the file.

        +
      • +
      • You can copy and move files and directories within the virtual file system with the copyTo() and moveTo() methods. +

        If a file or directory of the same name already exists in the target location, the overwrite input parameter of the method defines whether the existing file is overwritten.

        + + + + + + + + + +
        Note
        The file or directory to be copied or moved must be located under the current directory.
        +
      • +
      +

      To read and write to files, and move and copy files and directories:

        -
      1. To open a file, use the openStream() method of the File interface (in mobile, wearable, and TV applications).

        The method returns a FileStream object (in mobile, wearable, and TV applications), which is a handle to the opened file.

        +   
      2. To open a file, use the openStream() method of the File interface (in mobile, wearable, and TV applications).

        The method returns a FileStream object, which is a handle to the opened file.

         var documentsDir;
         
         tizen.filesystem.resolve("documents", function(result) 
        @@ -286,8 +250,8 @@ var testFile = documentsDir.createFile("test.txt");
         if (testFile != null) 
         {
            testFile.openStream("rw", onOpenSuccess, null, "UTF-8");
        -}
      3. -
      4. Perform all actual operations, such as reading, writing, or closing, on the file through the FileStream object based on a position attribute, which represents the current position in the file:
        +}
      5. +
      6. Perform all actual operations, such as reading, writing, or closing, on the file through the FileStream object based on a position attribute, which represents the current position in the file:
         function onOpenSuccess(fs)
         {
            /* Write HelloWorld to the file */
        @@ -327,6 +291,62 @@ for (var i = 0; i < files.length; i++)
         
      +

      Supported Virtual Roots

      +

      The virtual roots form a collection of locations that function as a single virtual device file system. The following table lists the supported virtual roots.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + Table: Filesystem virtual roots +
      Virtual rootDescription
      documentsLocation for storing documents.
      downloadsLocation for storing downloaded items.
      imagesLocation for storing images.
      musicLocation for storing audio files.
      removableLocation for the removable storage.
      ringtonesLocation for ringtones (read-only location).
      videosLocation for storing videos.
      wgt-packageLocation for storing Web application packages (read-only location).
      wgt-privateLocation for the Web application private storage.
      wgt-private-tmpLocation for the Web application private temporary storage.
      + + + diff --git a/org.tizen.guides/html/web/data/stored_content_w.htm b/org.tizen.guides/html/web/data/stored_content_w.htm index ed35d34..31244a5 100644 --- a/org.tizen.guides/html/web/data/stored_content_w.htm +++ b/org.tizen.guides/html/web/data/stored_content_w.htm @@ -58,38 +58,20 @@
      -

      Stored Content Management

      +

      Stored Content Management

      -

      Tizen enables you to search for content (images, videos, music or other) located on the local device storage. You can also perform content management tasks, such as viewing and updating content attributes.

      +

      Tizen enables you to search for content (images, videos, music or other) located on the local device storage. You can also perform content management tasks, such as viewing and updating content attributes.

      The Content API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

      The main features of Content API include:

        -
      • Content retrieval

        The Content API uses the same ContentManager interface instance (in mobile, wearable, and TV applications) for all content-related functionalities. The instance provides higher efficiency by performing batch operations on content items.

        You can browse and search for content directories and content using the getDirectories() and find() methods of the ContentManager interface. When searching for content items, you can create attribute filters, attribute range filters, and composite filters based on specific filter attributes of the ContentManager interface. You can also sort the search results.

        - - - - - - - - - -
        Note
        The batch mode does not provide progress information about operations. To ensure that you can view the progress, break the batch operation down into multiple smaller batch operations. For example, break down a batch of 100 update requests into 10 batch operations that update 10 records at a time. Breaking down a batch operation also helps you avoid blocking other database operations, such as add or remove.
      • -
      • Content management

        You can view and edit content item details. The details are common file information and metadata attributes of the media file.

        To view content item details, use the find() method. To update some attributes of a content item, for example its rating, use the update() method.

        For more information on the content attributes, see the Content Full WebIDL Reference (in mobile, wearable, and TV applications).

        If a content item is copied or moved, you cannot find it because a scan is not performed automatically. To retrieve the copied or moved item, use the find() method after calling the scanFile() method.

        -

        You can create a thumbnail for a content item using the createThumbnail() method.

        - - - - - - - - - -
        Note
        You can only view (and not update) the read-only attributes.
      • -
      • Content change notifications

        You can keep the content in your application synchronized with an external content manager by receiving notifications in your application when the content changes. The setChangeListener() method of the ContentManager interface registers a change listener. You can use the ContentChangeCallback interface (in mobile, wearable, and TV applications) to define listener event handlers for receiving the notifications.

      • +
      • Content retrieval +

        You can browse and search for content directories and content items.

      • +
      • Content management +

        You can view and edit content item details. The details are common file information and metadata attributes of the media file.

      • +
      • Content change notifications +

        You can keep the content in your application synchronized with an external content manager by receiving notifications in your application when the content changes.

      • Playlist management

        Using the Playlist interface (in mobile, wearable, and TV applications), you can:

          @@ -102,28 +84,23 @@
      - -

      Before you start, remember to prepare your application to use the content functionality.

      -

      Warm-up

      -

      Become familiar with the Content API basics by learning about:

      - +

      The Content API uses the same ContentManager interface instance (in mobile, wearable, and TV applications) for all content-related functionalities. The instance provides higher efficiency by performing batch operations on content items.

      -

      Task

      -

      In the Media Content task, we will walk through how to browse and manage the media directories in your application.

      + + + + + + + + + +
      Note
      The batch mode does not provide progress information about operations. To ensure that you can view the progress, break the batch operation down into multiple smaller batch operations. For example, break down a batch of 100 update requests into 10 batch operations that update 10 records at a time. Breaking down a batch operation also helps you avoid blocking other database operations, such as add or remove.
      -

      Prerequisites

      +

      For a practical example of browsing and managing the media directories in your application, see the Media Content sample task.

      + +

      Prerequisites

      To use the Content API (in mobile, wearable, and TV applications), the application has to request permission by adding the following privileges to the config.xml file:

       <tizen:privilege name="http://tizen.org/privilege/content.read"/>
      @@ -132,10 +109,12 @@
       
            
        

      Browsing Content

      - -

      Learning how to browse and search for content directories and content items in directories is a basic content management skill:

      + +

      You can browse and search for content directories and content using the getDirectories() and find() methods of the ContentManager interface (in mobile, wearable, and TV applications). When searching for content items, you can create attribute filters, attribute range filters, and composite filters based on specific filter attributes of the ContentManager interface. You can also sort the search results.

      + +

      To browse and search for content directories and content items in directories:

        -
      1. Retrieve the ContentManager interface instance (in mobile, wearable, and TV applications) using the tizen global object:

        var manager = tizen.content;
      2. +
      3. Retrieve the ContentManager interface instance using the tizen global object:

        var manager = tizen.content;
      4. To search for the content directories in the local device, use the getDirectories() method of the ContentManager interface. The method returns an array of ContentDirectory objects (in mobile, wearable, and TV applications).

        function onDirectoryArraySuccess(directories)
         {
            for (var i = 0; i < directories.length; i++)
        @@ -157,21 +136,30 @@ var contentType = "VIDEO";
         var filter = new tizen.AttributeFilter("type", "EXACTLY", contentType);
         manager.find(onContentItemArraySuccess, null, null, filter);
         
        + +

        In the find() method in the above example, the directory ID parameter is set to null (which means that all directories are searched), the filter retrieves all content items whose type is VIDEO, and no sorting order is defined (which means that the default sorting order is used).

      5. +
      + +

      Managing Content

      + +

      You can manage content in many ways:

      +
        +
      • You can view content item details with the find() method.
      • +
      • You can update some attributes of a content item, for example its rating, with the update() method.

        For more information on the content attributes, see the Content Full WebIDL Reference (in mobile, wearable, and TV applications).

      • +
      • If a content item is copied or moved, you cannot find it because a scan is not performed automatically. You can retrieve a copied or moved item with the find() method after calling the scanFile() method.
      • +
      • You can create a thumbnail for a content item using the createThumbnail() method.
      • +
      - + -
      Note
      To retrieve a specific set of content items, you can specify a content directory (with the directory ID), filter, and sorting order for the search operation through the directoryId, filter and sortMode parameters (for attributes supported in the filter, see Content Filter Attributes).

      In this example, the directory ID is set to null (which means that all directories are searched), the filter retrieves all content items whose type is VIDEO, and no sorting order is defined (which means that the default sorting order is used).

      You can only view (and not update) the read-only attributes.
    2. -
    - -

    Managing Content

    - -

    Learning how to view content details and update them is a basic content management skill:

    + +

    To view and update content details:

    1. Retrieve the ContentManager interface instance (in mobile, wearable, and TV applications) using the tizen global object, and search for the item whose details you want to update.

      In the following example, the item whose title is image7.jpg is retrieved.

      var manager = tizen.content;
      @@ -234,8 +222,9 @@ tizen.content.find(findCB);
         

    Receiving Notifications on Content Changes

    +

    You can receive notifications when a content item is added, updated, or deleted. The setChangeListener() method of the ContentManager interface (in mobile, wearable, and TV applications) registers a change listener. You can use the ContentChangeCallback interface (in mobile, wearable, and TV applications) to define listener event handlers for receiving the notifications.

    -

    To create engaging applications with various content features, you must learn to receive notifications when content items are added, updated, or removed:

    +

    To receive notifications when content items are added, updated, or removed:

    1. Define the event handlers for different notifications using the ContentChangeCallback listener instance (in mobile, wearable, and TV applications):

       var listener =
      diff --git a/org.tizen.guides/html/web/device/feedback_w.htm b/org.tizen.guides/html/web/device/feedback_w.htm
      index c38fab1..faecce5 100644
      --- a/org.tizen.guides/html/web/device/feedback_w.htm
      +++ b/org.tizen.guides/html/web/device/feedback_w.htm
      @@ -46,26 +46,15 @@
       

      The main features of the Feedback API include:

      Each feedback pattern can have separate media files of sound and vibration type. For example, when receiving a new email message, a predefined sound and vibration feedback pattern can be played.

      -

      Warm-up

      -

      Become familiar with the Feedback API basics by learning about:

      - -

      Checking the Pattern

      You can check whether a feedback type (sound or vibration) is supported for a specified pattern. To get information about the supported specified system predefined pattern type pairs, use the isPatternSupported() method of the FeedbackManager interface (in mobile and wearable applications):

      @@ -83,7 +72,7 @@ console.log("pattern " + pattern + " is" + isSupportedStr +

      Setting the Media Pattern

      - +

      The available predefined system patterns are defined in the FeedbackPattern enumeration (in mobile and wearable applications).

      To start and stop playing various types of predefined reactions:

        diff --git a/org.tizen.guides/html/web/device/power_w.htm b/org.tizen.guides/html/web/device/power_w.htm index 63f75ca..8e30895 100644 --- a/org.tizen.guides/html/web/device/power_w.htm +++ b/org.tizen.guides/html/web/device/power_w.htm @@ -44,13 +44,30 @@

        Power States

        +

        Tizen enables you to access a device's power resource. Currently, the screen and CPU power resources are supported, allowing you to request a specific power state and control the brightness of the screen.

        -

        Tizen enables you to access a device's power resource. Currently, the screen and CPU power resources are supported, allowing you to request a specific power state and control the brightness of the screen.

        - -

        This feature is supported in mobile and wearable applications only.

        - -

        The Power API allows you to request and release a minimum power state for the screen and CPU. The request locks the screen to a minimum state and keeps the device bright and awake. For example, if you set the minimum power state to SCREEN_NORMAL, the device display always remains in the SCREEN_NORMAL level and never goes down to the SCREEN_DIM level.

        -

        The levels you can request are described in the following table.

        +

        This feature is supported in mobile and wearable applications only.

        + +

        The main features of the Power API include:

        + + +

        Prerequisites

        + +

        To use the Power API (in mobile and wearable applications), the application has to request permission by adding the following privilege to the config.xml file:

        +
        +<tizen:privilege name="http://tizen.org/privilege/power"/>
        +
        + +

        Managing the Power Resource

        +

        You can request and release a minimum power state for the screen and CPU. The request locks the screen to a minimum state and keeps the device bright and awake. For example, if you set the minimum power state to SCREEN_NORMAL, the device display always remains in the SCREEN_NORMAL level and never goes down to the SCREEN_DIM level.

        +

        The following table lists the levels you can request.

        Table: Power state levels @@ -88,29 +105,8 @@
        -

        The Power API allows you to get and set the screen brightness and switch the screen on and off.

        - -

        Before you start, remember to prepare your application to use the power functionality.

        - -

        Warm-up

        -

        Become familiar with the Power API basics by learning about:

        - -

        Prerequisites

        - -

        To use the Power API (in mobile and wearable applications), the application has to request permission by adding the following privilege to the config.xml file:

        -
        -<tizen:privilege name="http://tizen.org/privilege/power"/>
        -
        - - -

        Managing the Power Resource

        - -

        Learning how to request and release the power state is a basic power management skill:

        +

        To request and release the power state:

        1. To set the power state, call the request() method of the PowerManager interface (in mobile and wearable applications) with the intended power resource and its state. In this example, the SCREEN_NORMAL state is requested for the screen resource:

           tizen.power.request("SCREEN", "SCREEN_NORMAL");
        2. @@ -129,11 +125,10 @@ tizen.power.setScreenStateChangeListener(onScreenStateChanged);
    -

    Managing the Screen Brightness

    - -

    Learning how to manage the screen brightness is a basic power management skill:

    -
      -
    • To get the screen brightness, call the getScreenBrightness() method of the PowerManager interface (in mobile and wearable applications):

      +

      Managing the Screen Brightness

      +

      To get, set, and restore the screen brightness:

      +
        +
      • To get the screen brightness, call the getScreenBrightness() method of the PowerManager interface (in mobile and wearable applications):

         var screenBrightness = tizen.power.getScreenBrightness();
         
      • @@ -148,11 +143,10 @@ tizen.power.restoreScreenBrightness();
      -

      Managing the Screen State

      - -

      Learning how to manage the screen state is a basic power management skill:

      -
        -
      • To check whether the screen is on, call the isScreenOn() method of the PowerManager interface (in mobile and wearable applications):

        +

        Managing the Screen State

        +

        To switch the screen on and off, and check whether the screen is on:

        +

        Related Info

          @@ -95,172 +96,27 @@ tr.images td {

          System Information

          -

          You can access and monitor various device details, such as the battery level, available device storage, version number, model name, and the cellular network being used.

          +

          You can access and monitor the device and system properties (both hardware and capability), such as the battery level, available device storage, version number, model name, and the cellular network being used.

          The System Information API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

          - -

          Tizen enables you to access the device's system properties (both hardware and capability). You can obtain various device and system details, such as the current battery level, amount of available storage, and state of the cellular network connection.

          -

          The main features of the System Information API include:

          -
            -
          • Total memory check

            You can get the total amount of system memory using the getTotalMemory() method of the SystemInfo interface (in mobile, wearable, and TV applications).

          • -
          • Available memory check

            You can get the available amount of system memory using the getAvailableMemory() method of the SystemInfo interface.

          • -
          • Property count check

            You can get the number of system property information using the getCount() method of the SystemInfo interface.

          • -
          • Device capability retrieval

            You can get a device capability using the getCapability() method of the SystemInfo interface.

          • -
          • Property state checks

            You can retrieve the current state of a specific device property by using the getPropertyValue() method.

            The property state can determine whether your application has enough resources to complete a particular task or service successfully. For example, if you are creating a file, you need to check the storage property to know whether a writable storage is available on the device.

            -

            For example, you can check the device orientation. The device orientation defines the angle between the direction of what is considered to be the "top" side of the device and the physical upward direction. The device orientation is not directly related to the screen orientation. For example, when the Auto rotate screen option is disabled or the Web application has the screen-orientation option (in mobile and wearable applications) set to "landscape" or "portrait", the screen is not rotated and the window.screen.orientation property does not change; however, the SystemInfo device orientation changes.

            -

            When a device is in its natural position, it is considered to be in the PORTRAIT_PRIMARY orientation (in mobile, wearable, and TV applications) (if the screen height is greater than its width) or the LANDSCAPE_PRIMARY orientation (otherwise). When the device is rotated 90 degrees clockwise (rotated right), the orientation changes from LANDSCAPE_PRIMARY to PORTRAIT_PRIMARY, from PORTRAIT_PRIMARY to LANDSCAPE_SECONDARY, from LANDSCAPE_SECONDARY to PORTRAIT_SECONDARY, and from PORTRAIT_SECONDARY back to LANDSCAPE_PRIMARY.

            - - - - - - - - - - - - - - - - - - - - -
            - Table: Device orientations -
            LANDSCAPE_PRIMARYPORTRAIT_PRIMARYLANDSCAPE_SECONDARYPORTRAIT_SECONDARY
            -
          • - -
          • Property state updates

            You can receive state updates when a change occurs in a specific property.

            The addPropertyValueChangeListener() method registers an event listener for a specific property, and returns the subscription identifier for the listener. You can use the SystemInfoPropertySuccessCallback interface (in mobile, wearable, and TV applications) to define the event handler for receiving the change notification.

          • -
          - -

          Before you start, remember to prepare your application to use the system information functionality.

          - -

          The system properties are defines as subtypes of the SystemInfoProperty interface (in mobile, wearable, and TV applications). The following table lists the available subtypes, and the related SystemInfoPropertyId type (in mobile, wearable, and TV applications) values.

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          - Table: Available properties -
          PropertyPropertyIDDescription
          SystemInfoBattery (in mobile, wearable, and TV applications)BATTERYProvides information about the battery level and charging status. With this property, you can, for example, determine whether the application can be launched or whether the user needs to be warned about the level of power available for the device.
          SystemInfoCpu (in mobile, wearable, and TV applications)CPUProvides information about the CPU load, allowing you to determine the efficiency of an application.
          SystemInfoStorage (in mobile, wearable, and TV applications)STORAGEProvides information about the currently connected data storage devices and their details, such as available capacity. With this property, you can, for example, allow the user to select which available storage they want to use, and determine whether the storage in question has enough free space for the actions the user wants to perform.
          SystemInfoDisplay (in mobile, wearable, and TV applications)DISPLAYProvides information about the device display, allowing you, for example, to determine the resolution of the device to layout your application optimally on runtime.
          SystemInfoNetwork (in mobile, wearable, and TV applications)NETWORKProvides information about the data network. With this property, you can, for example, determine whether the network type provides adequate connection speeds for the actions the user wants to perform.
          SystemInfoWifiNetwork (in mobile, wearable, and TV applications)WIFI_NETWORKProvides information about the Wi-Fi network. With this property, you can, for example, determine whether a Wi-Fi network is available and what its signal strength or SSID is. - - - - - - - - - -
          Note
          The SSID of a Wi-Fi network represents the public name of the network that is specified by the manufacturer. The SSID identifies a network by using a 32-character long alphanumeric key. The key ensures that only devices using the SSID can communicate with each other.
          SystemInfoCellularNetwork (in mobile, wearable, and TV applications)CELLULAR_NETWORKProvides information about the cellular network. With this property, you can, for example, retrieve the network details that allow your application to access the network.
          SystemInfoEthernetNetwork (in mobile, wearable, and TV applications)ETHERNET_NETWORKProvides information about the Ethernet network. With this property, you can, for example, retrieve the network details that allow your application to access the network.
          SystemInfoNetProxyNetwork (in mobile, wearable, and TV applications)NET_PROXY_NETWORKProvides information about the proxy type network. With this property, you can, for example, retrieve the network details that allow your application to access the network.
          SystemInfoSIM (in mobile, wearable, and TV applications)SIMProvides information about the device SIM card, such as the operator name and the mobile country code (MCC).
          SystemInfoDeviceOrientation (in mobile, wearable, and TV applications)DEVICE_ORIENTATIONProvides information about the current device display orientation allowing you, for example, to determine when the orientation changes to layout your application optimally on runtime.
          SystemInfoBuild (in mobile, wearable, and TV applications)BUILDProvides information about the build, such as the model name and manufacturer.
          SystemInfoLocale (in mobile, wearable, and TV applications)LOCALEProvides information about the locale, such as the currently set language.
          SystemInfoPeripheral (in mobile, wearable, and TV applications)PERIPHERALProvides information about the video output status.
          SystemInfoMemory (in mobile, wearable, and TV applications)MEMORYProvides information about the memory state of the device.
          SystemInfoADS (in mobile, wearable, and TV applications)ADSProvides information about the advertisement service.
          - - -

          Warm-up

          -

          Become familiar with the System Information API basics by learning about:

          - -

          Task

          -

          In the System Information task, we will walk through how to access and use system information in your application.

          - -

          Prerequisites

          + + + +

          For a practical example of accessing and using system information in your application, see the System Information sample task.

          + +

          Prerequisites

          To use the System Information API (in mobile, wearable, and TV applications), the application has to request permission by adding the following privileges to the config.xml file:

          @@ -269,10 +125,9 @@ tr.images td {
           
          -

          Retrieving a Device Capability

          - -

          Learning how to get a capability of the device is a basic application development skill:

          -
            +

            Retrieving a Device Capability

            +

            Retrieve a device capability using the getCapability() method of the SystemInfo interface (in mobile, wearable, and TV applications):

            +
            1. To get a specific capability of the device, use the getCapability() method:

              var barometer = tizen.systeminfo.getCapability("http://tizen.org/feature/sensor.barometer");
              @@ -295,9 +150,9 @@ console.log(" Barometer = " + barometer);

              Retrieving the Current State of a Property

              - -

              Learning how to retrieve information about the property states is a basic application development skill:

              -
                +

                The property state can determine whether your application has enough resources to complete a particular task or service successfully. For example, if you are creating a file, you need to check the storage property to know whether a writable storage is available on the device.

                +

                Retrieve information about the property states using the applicable methods of the SystemInfo interface (in mobile, wearable, and TV applications):

                +
                1. To check the current state of the property, use the getPropertyValue() method.

                  The first method parameter must be of the SystemInfoPropertyId type (in mobile, wearable, and TV applications). For the available values, see the Available properties table.

                   /* Retrieve the battery property */
                   tizen.systeminfo.getPropertyValue("BATTERY", onPowerSuccessCallback);
                  @@ -336,9 +191,8 @@ tizen.systeminfo.getPropertyValueArray("SIM", successCallback);
                     

                Retrieving the Memory State

                - -

                Learning how to get the memory status of the device is a basic application development skill:

                -
                  +

                  Check the total or available amount of system memory using the applicable method of the SystemInfo interface (in mobile, wearable, and TV applications):

                  +
                  • To get the total amount of system memory, use the getTotalMemory() method:

                    console.log("The total memory size is " + tizen.systeminfo.getTotalMemory() + " bytes.");
                  • @@ -348,12 +202,36 @@ tizen.systeminfo.getPropertyValueArray("SIM", successCallback);
                    console.log("The available memory size is " + tizen.systeminfo.getAvailableMemory() + " bytes.");
                  -

                  Retrieving and Monitoring the Device Orientation

                  - -

                  Learning how to retrieve information about the device orientation is a basic mobile application development skill:

                  - +

                  Retrieving and Monitoring the Device Orientation

                  +

                  The device orientation defines the angle between the direction of what is considered to be the "top" side of the device and the physical upward direction. The device orientation is not directly related to the screen orientation. For example, when the Auto rotate screen option is disabled or the Web application has the screen-orientation option (in mobile and wearable applications) set to "landscape" or "portrait", the screen is not rotated and the window.screen.orientation property does not change; however, the SystemInfo device orientation changes.

                  +

                  When a device is in its natural position, it is considered to be in the PORTRAIT_PRIMARY orientation (if the screen height is greater than its width) or the LANDSCAPE_PRIMARY orientation (otherwise). When the device is rotated 90 degrees clockwise (rotated right), the orientation changes from LANDSCAPE_PRIMARY to PORTRAIT_PRIMARY, from PORTRAIT_PRIMARY to LANDSCAPE_SECONDARY, from LANDSCAPE_SECONDARY to PORTRAIT_SECONDARY, and from PORTRAIT_SECONDARY back to LANDSCAPE_PRIMARY.

                  + + + + + + + + + + + + + + + + + + + + +
                  + Table: Device orientations +
                  LANDSCAPE_PRIMARYPORTRAIT_PRIMARYLANDSCAPE_SECONDARYPORTRAIT_SECONDARY
                  -
                    +

                    To retrieve information about the device orientation:

                    + +
                    1. To retrieve the current orientation of the device, use the getPropertyValue() method of the SystemInfo interface (in mobile, wearable, and TV applications) and query the DEVICE_ORIENTATION property:

                       function onDeviceOrientation(deviceOrientation)
                      @@ -374,11 +252,11 @@ orientationListenerId = tizen.systeminfo.addPropertyValueChangeListener("DE
                       tizen.systeminfo.removePropertyValueChangeListener(orientationListenerId);
                       
                    -

                    Receiving Notifications on Property Value Changes

                    - -

                    Learning how to receive notifications on property value changes is a basic application development skill:

                    +

                    Receiving Notifications on Property Value Changes

                    +

                    You can receive state updates when a change occurs in a specific property. The addPropertyValueChangeListener() method registers an event listener for a specific property, and returns the subscription identifier for the listener. You can use the SystemInfoPropertySuccessCallback interface (in mobile, wearable, and TV applications) to define the event handler for receiving the change notification.

                    +

                    To receive notifications on property value changes:

                      -
                    1. Register a SystemInfoPropertySuccessCallback event handler (in mobile, wearable, and TV applications) for the property value changes using the addPropertyValueChangeListener() method of the SystemInfo interface (in mobile, wearable, and TV applications).

                      The first parameter defines the property whose value changes you want to track, and the optional last parameter defines any thresholds when you want the notifications to be triggered. In the following example, an event handler is registered for the memory property value changes.

                      +   
                    2. Register a SystemInfoPropertySuccessCallback event handler for the property value changes using the addPropertyValueChangeListener() method of the SystemInfo interface.

                      The first parameter defines the property whose value changes you want to track, and the optional last parameter defines any thresholds when you want the notifications to be triggered. In the following example, an event handler is registered for the memory property value changes.

                       function successCallback(memory)
                       {
                          console.log("The memory state is " + memory.state);
                      @@ -409,6 +287,112 @@ var id = tizen.systeminfo.addPropertyValueArrayChangeListener("SIM", s
                       
                    +

                    System Information Properties

                    +

                    The system properties are defined as subtypes of the SystemInfoProperty interface (in mobile, wearable, and TV applications). The following table lists the available subtypes, and the related SystemInfoPropertyId type values.

                    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + Table: Available properties +
                    PropertyPropertyIDDescription
                    SystemInfoBattery (in mobile, wearable, and TV applications)BATTERYProvides information about the battery level and charging status. With this property, you can, for example, determine whether the application can be launched or whether the user needs to be warned about the level of power available for the device.
                    SystemInfoCpu (in mobile, wearable, and TV applications)CPUProvides information about the CPU load, allowing you to determine the efficiency of an application.
                    SystemInfoStorage (in mobile, wearable, and TV applications)STORAGEProvides information about the currently connected data storage devices and their details, such as available capacity. With this property, you can, for example, allow the user to select which available storage they want to use, and determine whether the storage in question has enough free space for the actions the user wants to perform.
                    SystemInfoDisplay (in mobile, wearable, and TV applications)DISPLAYProvides information about the device display, allowing you, for example, to determine the resolution of the device to layout your application optimally on runtime.
                    SystemInfoNetwork (in mobile, wearable, and TV applications)NETWORKProvides information about the data network. With this property, you can, for example, determine whether the network type provides adequate connection speeds for the actions the user wants to perform.
                    SystemInfoWifiNetwork (in mobile, wearable, and TV applications)WIFI_NETWORKProvides information about the Wi-Fi network. With this property, you can, for example, determine whether a Wi-Fi network is available and what its signal strength or SSID is. + + + + + + + + + +
                    Note
                    The SSID of a Wi-Fi network represents the public name of the network that is specified by the manufacturer. The SSID identifies a network by using a 32-character long alphanumeric key. The key ensures that only devices using the SSID can communicate with each other.
                    SystemInfoCellularNetwork (in mobile, wearable, and TV applications)CELLULAR_NETWORKProvides information about the cellular network. With this property, you can, for example, retrieve the network details that allow your application to access the network.
                    SystemInfoEthernetNetwork (in mobile, wearable, and TV applications)ETHERNET_NETWORKProvides information about the Ethernet network. With this property, you can, for example, retrieve the network details that allow your application to access the network.
                    SystemInfoNetProxyNetwork (in mobile, wearable, and TV applications)NET_PROXY_NETWORKProvides information about the proxy type network. With this property, you can, for example, retrieve the network details that allow your application to access the network.
                    SystemInfoSIM (in mobile, wearable, and TV applications)SIMProvides information about the device SIM card, such as the operator name and the mobile country code (MCC).
                    SystemInfoDeviceOrientation (in mobile, wearable, and TV applications)DEVICE_ORIENTATIONProvides information about the current device display orientation allowing you, for example, to determine when the orientation changes to layout your application optimally on runtime.
                    SystemInfoBuild (in mobile, wearable, and TV applications)BUILDProvides information about the build, such as the model name and manufacturer.
                    SystemInfoLocale (in mobile, wearable, and TV applications)LOCALEProvides information about the locale, such as the currently set language.
                    SystemInfoPeripheral (in mobile, wearable, and TV applications)PERIPHERALProvides information about the video output status.
                    SystemInfoMemory (in mobile, wearable, and TV applications)MEMORYProvides information about the memory state of the device.
                    SystemInfoADS (in mobile, wearable, and TV applications)ADSProvides information about the advertisement service.
                    + +
          diff --git a/org.tizen.guides/html/web/device/system_setting_w.htm b/org.tizen.guides/html/web/device/system_setting_w.htm index 8a36fc6..506c815 100644 --- a/org.tizen.guides/html/web/device/system_setting_w.htm +++ b/org.tizen.guides/html/web/device/system_setting_w.htm @@ -31,7 +31,8 @@

          Related Info

            @@ -45,63 +46,18 @@

            System Settings

            -

            You can manage the device wallpaper settings, such as the home screen and lock screen wallpaper image, incoming call ringtone, and email notification tone.

            +

            You can access and modify some system settings properties, such as the home screen and lock screen wallpaper image, incoming call ringtone, and email notification tone.

            This feature is supported in mobile and wearable applications only.

            - -

            Tizen enables you to access the device's settings for the home and lock screen wallpaper, the incoming call ringtone, and email notification tone.

            +

            The main features of the System Setting API include:

            + -

            The following table lists the supported system settings properties.

            - - - - - - - - - - - - - - - - - - - - - - - - -
            - Table: Available properties -
            PropertyDescription
            HOME_SCREENProvides information about the home screen image of the device.
            LOCK_SCREENProvides information about the lock screen image of the device.
            INCOMING_CALLProvides information about the incoming call ringtone sound of the device.
            NOTIFICATION_EMAILProvides information about the notification email tone sound of the device.
            - -

            Before you start, remember to prepare your application to use the system settings functionality.

            - - - - - - - - - - -
            Note
            You can change the home and lock screen images and modify the incoming call ringtone and notification email tone sound by using the setProperty() method of the SystemSettingManager interface (in mobile and wearable applications). Similarly, you can get the information about them by using the getProperty() method.
            - -

            Warm-up

            -

            Become familiar with the System Setting API basics by learning about:

            - - -

            Prerequisites

            +

            Prerequisites

            To use the System Setting API (in mobile and wearable applications), the application has to request permission by adding the following privilege to the config.xml file:

            @@ -110,9 +66,9 @@
             
             
             

            Managing the Device Wallpapers

            - -

            Learning how to set the device wallpaper and get information about it is a basic application development skill:

            -
              +

              You can change the home and lock screen images by using the setProperty() method of the SystemSettingManager interface (in mobile and wearable applications). Similarly, you can retrieve information about them by using the getProperty() method.

              +

              To set the device wallpaper and get information about it:

              +
              • To set the specified image as the lock screen wallpaper, use the setProperty() method:

                 function setLockscreenWallpaper() 
                 {
                @@ -144,13 +100,13 @@ function getHomescreenWallpaper()
                    }
                 }
                 
              • -
            +

          Managing Ringtones and Notification Tones

          - -

          Learning how to set ringtones and notification tones is a basic application development skill:

          -
            -
          1. To set the specified audio file as the notification tone for emails, use the setProperty() method of the SystemSettingManager interface (in mobile and wearable applications):

            +

            You can modify the incoming call ringtone and notification email tone sound by using the setProperty() method of the SystemSettingManager interface (in mobile and wearable applications). Similarly, you can retrieve information about them by using the getProperty() method.

            +

            To set ringtones and notification tones:

            +
              +
            • To set the specified audio file as the notification tone for emails, use the setProperty() method of the SystemSettingManager interface:

               function onSet()
               {
              @@ -187,7 +143,37 @@ catch (error)
                  console.log("Error: " + error);
               }
               
            • -
          +
        + +

        System Settings Properties

        +

        The following table lists the supported system settings properties.

        + + + + + + + + + + + + + + + + + + + + + + + + +
        + Table: Available properties +
        PropertyDescription
        HOME_SCREENProvides information about the home screen image of the device.
        LOCK_SCREENProvides information about the lock screen image of the device.
        INCOMING_CALLProvides information about the incoming call ringtone sound of the device.
        NOTIFICATION_EMAILProvides information about the notification email tone sound of the device.
        diff --git a/org.tizen.guides/html/web/device/time_w.htm b/org.tizen.guides/html/web/device/time_w.htm index aa19d62..d839db1 100644 --- a/org.tizen.guides/html/web/device/time_w.htm +++ b/org.tizen.guides/html/web/device/time_w.htm @@ -53,14 +53,28 @@

        Time and Date Management

        -

        Tizen enables you to use locale-specific calendar features by retrieving date and time information. You can also change the date, time, and time zone, and make some date- and time-related calculations. The Time API overcomes several limitations of the JavaScript Date object.

        -

        Locale refers to the set of information that is specific to a language and a country. It affects the numeric formats (decimal and list separators), date formats, and the character sorting order. It determines how a locale-specific functionality behaves; for example, how numbers are displayed or strings converted to dates.

        +

        Tizen enables you to use locale-specific calendar features by retrieving date and time information. You can also change the date, time, and time zone, and make some date- and time-related calculations. The Time API overcomes several limitations of the JavaScript Date object.

        The Time API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

        + +

        Locale refers to the set of information that is specific to a language and a country. It affects the numeric formats (decimal and list separators), date formats, and the character sorting order. It determines how a locale-specific functionality behaves; for example, how numbers are displayed or strings converted to dates.

        The main features of the Time API include:

          -
        • Managing the current date, time, and time zone

          With the TimeUtil interface (in mobile, wearable, and TV applications), you can retrieve the current date and time. You can also get the current time zone and the number of available time zones and determine if a year is a leap year.

          You can also perform other date-and time-related tasks, such as getting the date of the next and previous daylight saving time transition, converting current time to UTC standard time, and getting the time zone abbreviation.

          +
        • Managing the current date, time, and time zone +

          You can retrieve the current date and time or all available time zones, and check whether a specific year is a leap year.

          +
        • +
        • Getting the locale-specific date and time formats +

          If locale-specific settings have been made on the device, the date must be displayed in the corresponding locale-specific format. Tizen supports several different date and time formats, and you can retrieve the currently used formats.

        • +
        • Performing date- and time-related calculations +

          You can perform different calculations and comparisons on date and time data regardless of the time units used in the compared events.

        • +
        • Monitoring time and time zone changes +

          You can retrieve notifications on time changes performed by the user.

        • +
        + +

        Retrieving Date and Time

        +

        With the TimeUtil interface (in mobile, wearable, and TV applications), you can retrieve the current date, time, and time zone, and the number of available time zones, and determine whether a year is a leap year.

        +

        You can also perform other date-and time-related tasks, such as getting the date of the next and previous daylight saving time transition, converting current time to UTC standard time, and getting the time zone abbreviation.

        @@ -70,26 +84,8 @@ -
        UTC is the primary time standard used by the world to track time. Time zones are created for the world as a positive or negative offset of UTC. For example, the time zone for Iceland is UTC+00:00, and the time zone for India is UTC+05:30.

        DST (or summer time) is the practice of clocks being advanced temporarily by a fixed time during the summer to take advantage of more daylight. Typically, this temporary adjustment is one hour. For example, one hour shift ahead in time will cause the last moment of 20:59 to jump to 22:00 instead of 21:00. In this case, the day will have 23 hours. In another scenario, one hour shift back in time will cause the day to have 25 hours.

      • -
      • Getting the locale-specific date and time formats

        If locale-specific settings have been made on the device, the date must be displayed in the corresponding locale-specific format. Tizen supports several different date and time formats, and you can retrieve the currently used formats.

        The date and time can be expressed, for example, in a numerical format YYYY-MM-DD hh:mm:ss (for example, "1996-10-23 16:08:27") or in hybrid format (for example, "Wednesday, October 23, 1996, 04:08:27 PM").

      • -
      • Performing date- and time-related calculations

        With the TimeDuration interface (in mobile, wearable, and TV applications), you can perform different calculations and comparisons on date and time data regardless of the time units used in the compared events.

      • -
      • Monitoring time and time zone changes

        With the TimeUtil interface, you can retrieve notifications on time changes performed by the user.

      • -
      - -

      Warm-up

      -

      Become familiar with the Time API basics by learning about:

      - - - -

      Retrieving Date and Time

      - -

      Learning how to handle date and time in your application is a basic locale management skill:

      + +

      To handle date and time in your application:

      1. To get the current date and time, use the getCurrentDateTime() method, which returns a TZDate object:

         var current_dt = tizen.time.getCurrentDateTime();
        @@ -119,8 +115,8 @@ if (is_leap)
           

      Retrieving the Local Date and Time Format

      - -

      Learning how to handle date and time formats in your application is a basic locale management skill:

      +

      The date and time can be expressed, for example, in a numerical format YYYY-MM-DD hh:mm:ss (for example, "1996-10-23 16:08:27") or in hybrid format (for example, "Wednesday, October 23, 1996, 04:08:27 PM").

      +

      To handle date and time formats in your application:

      1. To check the date format, use the getDateFormat() method:

         var dateFormat = tizen.time.getDateFormat();
        @@ -133,10 +129,10 @@ console.log("Time format is " + timeFormat);
           

      Calculating Date and Time Information

      - -

      Learning how to calculate and compare time and date information is a basic time management skill:

      -
        -
      1. To calculate the duration difference between 2 date or time events, use the difference() method of the TimeDuration object (in mobile, wearable, and TV applications):

        +

        Calculate and compare time and date information using the applicable methods of the TimeDuration interface (in mobile, wearable, and TV applications):

        +
          +
        1. To calculate the duration difference between 2 date or time events, use the difference() method of the TimeDuration object:

          +
           var event1, event2; /* Assume that those are correct tizen.CalendarEvent objects */
           /* Calculate event1.duration - event2.duration */
           var diff = event1.duration.difference(event2.duration);
          @@ -182,8 +178,7 @@ var tomorrow = now.addDuration(new tizen.TimeDuration(1,"DAYS");
             

        Retrieving Time Change Notifications

        - -

        Learning how to get notifications when the user changes the time or time zone allows you to react to those changes in your application:

        +

        Getting notifications when the user changes the time or time zone allows you to react to those changes in your application.

        1. To monitor time or time zone changes, define the event handlers:

            @@ -239,6 +234,7 @@ tizen.time.unsetTimezoneChangeListener();
        + diff --git a/org.tizen.guides/html/web/device/web_view_w.htm b/org.tizen.guides/html/web/device/web_view_w.htm index 6cdeb96..9fcf661 100644 --- a/org.tizen.guides/html/web/device/web_view_w.htm +++ b/org.tizen.guides/html/web/device/web_view_w.htm @@ -52,18 +52,9 @@
      2. Deleting cookies

        You can delete all cookies set for the running Web application.

    -

    Warm-up

    -

    Become familiar with the Web Setting API basics by learning about:

    - - -

    Setting a User Agent for a Running Application

    +

    Setting a User Agent for a Running Application

    -

    Learning how to set a user agent string to perform tasks is a basic Web setting management skill:

    -
      -
    1. Use the setUserAgentString() method to set a Web view user agent string:

      +

      Use the setUserAgentString() method to set a Web view user agent string:

      function successCallback()
       {
          console.log("The requested user agent string has just been set successfully." + navigator.userAgent);
      @@ -72,22 +63,18 @@
       /* Set a user agent string */
       var userAgent = "CUSTOM_USER_AGENT_STRING";
       tizen.websetting.setUserAgentString(userAgent, successCallback);
      -
    2. -
    - -

    Deleting Web View Cookies

    + + +

    Deleting Web View Cookies

    -

    Learning how to delete Web view cookies is a basic Web setting management skill:

    -
      -
    1. Use the removeAllCookies() method to delete all the Web view cookies:

      +

      Use the removeAllCookies() method to delete all the Web view cookies:

      function CookiesRemovedSuccessCallback()
       {
          console.log("The cookies saved for your application have just been removed.");
       }
       
       tizen.websetting.removeAllCookies(CookiesRemovedSuccessCallback);
      -
    2. -
    + diff --git a/org.tizen.guides/html/web/error/error_w.htm b/org.tizen.guides/html/web/error/error_w.htm index 844360d..05f124b 100644 --- a/org.tizen.guides/html/web/error/error_w.htm +++ b/org.tizen.guides/html/web/error/error_w.htm @@ -28,8 +28,6 @@

    Content

    Related Info

    @@ -46,10 +44,10 @@

    You can handle generic error situations in your application.

    The Tizen API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

    - -

    Handling Exceptions

    - -

    You can enable the Tizen APIs to throw errors synchronously with the WebAPIException interface (in mobile, wearable, and TV applications) of the Tizen API (in mobile, wearable, and TV applications), or return errors in the error event handlers of asynchronous methods with the WebAPIError interface (in mobile, wearable, and TV applications).

    +

    The main error handling features of the Tizen API include:

    +
      +
    • Exception handling +

      You can enable the Tizen APIs to throw errors synchronously with the WebAPIException interface (in mobile, wearable, and TV applications), or return errors in the error event handlers of asynchronous methods with the WebAPIError interface (in mobile, wearable, and TV applications).

      @@ -60,19 +58,13 @@
      +
    • +
    • Generic event handling +

      You can handle the results of asynchronous operations with generic events. The operations can implemented using the SuccessCallback (in mobile, wearable, and TV applications) and ErrorCallback (in mobile, wearable, and TV applications) event handlers of the Tizen API.

    • +
    -

    Handling Generic Events

    -

    Generic event handling features allow you to handle the results of asynchronous operations. The operations can implemented using the SuccessCallback (in mobile, wearable, and TV applications) and ErrorCallback (in mobile, wearable, and TV applications) event handlers of the Tizen API.

    - - -

    Warm-up

    -

    Become familiar with the Tizen API basics by learning about:

    - +

    Using the Generic Event Handlers

    -

    Using the Generic Event Handlers

    -

    Learning how to use generic, predefined event handlers allows you handle application operations and errors efficiently:

    1. The generic onSuccess() event handler of the SuccessCallBack interface (in mobile, wearable, and TV applications) can be used with methods that do not require a return value when successful.

      In this example, the event handler is used to stop a running application with the kill() method of the Application interface (in mobile, wearable, and TV applications).

      function onSuccess() 
      diff --git a/org.tizen.guides/html/web/media/audio_w.htm b/org.tizen.guides/html/web/media/audio_w.htm
      index bd1b132..ff49151 100644
      --- a/org.tizen.guides/html/web/media/audio_w.htm
      +++ b/org.tizen.guides/html/web/media/audio_w.htm
      @@ -28,8 +28,8 @@
       		

      Content

      @@ -52,26 +52,13 @@

      The main features of the Sound API include:

      -

      Before you start, remember to prepare your application to use the sound functionality.

      - -

      Warm-up

      -

      Become familiar with the Sound API basics by learning about:

      - - - +

      Prerequisites

      To use the Sound API (in mobile and wearable applications), the application has to request permission by adding the following privilege to the config.xml file:

      @@ -79,9 +66,9 @@
       
      -

      Managing Sound Mode and Volume

      +

      Managing Volume and Sound Mode

      -

      Managing sound modes and volume levels is a basic multimedia management skill:

      +

      Managing volume levels and sound modes is a basic multimedia management skill:

      1. Get the current volume level using the getVolume() method: @@ -106,9 +93,9 @@ console.log("Sound Mode is " + mode);
    -

    Monitoring Sound Mode and Volume Changes

    +

    Monitoring Volume and Sound Mode Changes

    -

    Managing sound and volume changes is a basic multimedia management skill:

    +

    Managing volume and sound mode changes is a basic multimedia management skill:

    1. Register the volume change listener to track changes in the volume level: diff --git a/org.tizen.guides/html/web/media/camera_w.htm b/org.tizen.guides/html/web/media/camera_w.htm index 29b033b..395f234 100644 --- a/org.tizen.guides/html/web/media/camera_w.htm +++ b/org.tizen.guides/html/web/media/camera_w.htm @@ -61,26 +61,9 @@
    2. Deallocating the camera preview stream

      You can deallocate the camera preview stream resources when the application is invisible so that the preview stream can be assigned to another Web application.

    3. - -

      Warm-up

      -

      Become familiar with the Camera API (Tizen Extension) API basics by learning about:

      - -

      Task

      -

      In the Camera task, we will walk through launching and controlling the camera on the Tizen wearable device.

      - -

      Accessing the Camera Device

      +

      Accessing the Camera Device

      To take advantage of the camera features, you must learn to access the camera device:

        diff --git a/org.tizen.guides/html/web/media/jpeg_exif_w.htm b/org.tizen.guides/html/web/media/jpeg_exif_w.htm index efbf0c4..14e0996 100644 --- a/org.tizen.guides/html/web/media/jpeg_exif_w.htm +++ b/org.tizen.guides/html/web/media/jpeg_exif_w.htm @@ -59,16 +59,7 @@
      1. Copying EXIF information

        You can copy EXIF information from one JPEG file to another.

      2. -

        Warm-up

        -

        Become familiar with the Exif API basics by learning about:

        - - -

        Loading the EXIF Data

        +

        Loading the EXIF Data

        Learning how to retrieve EXIF data from JPEG files is a useful content management skill:

          diff --git a/org.tizen.guides/html/web/media/media_controller_w.htm b/org.tizen.guides/html/web/media/media_controller_w.htm index 26bd9b1..dce7a02 100644 --- a/org.tizen.guides/html/web/media/media_controller_w.htm +++ b/org.tizen.guides/html/web/media/media_controller_w.htm @@ -52,9 +52,7 @@
          • Client that sends requests to the server in order to change, for example, the playback state and position modes.
          • Server that directly manages the media on the device.
          -

          Before you start, remember to prepare your application to use the media controller functionality.

          - -

          The main features of the Media Controller API include:

          +

          The main features of the Media Controller API include:

          • Setting up the client and server pair

            You can set up the client and server pair by creating a new server using the createServer() method. On the client side, you can get a client and find active servers using the getClient() and findServers() methods.

            @@ -71,20 +69,6 @@
          -

          Warm-up

          -

          Become familiar with the Media Controller API basics by learning about:

          -

          Prerequisites

          diff --git a/org.tizen.guides/html/web/media/media_key_w.htm b/org.tizen.guides/html/web/media/media_key_w.htm index c4f3c46..aa5c5a2 100644 --- a/org.tizen.guides/html/web/media/media_key_w.htm +++ b/org.tizen.guides/html/web/media/media_key_w.htm @@ -40,11 +40,9 @@

          Media Key Events

          -

          Tizen enables you to handle media keys in your application.

          +

          Tizen enables you to handle media keys in your application. The media keys are used to control multimedia playback. The user can click keys, such as PLAY and FAST FORWARD, and you can detect the key clicks in your application and change the playback accordingly.

          This feature is supported in mobile and wearable applications only.

          - -

          The media keys are used to control multimedia playback. The user can click keys, such as PLAY and FAST FORWARD, and you can detect the key clicks in your application and change the playback accordingly.

          The main features of the Media Key API include:

            @@ -63,13 +61,7 @@
          • Handling state changes

            With the registered listener, you can monitor the media keys and react to their state changes, when the user presses or releases a key.

          -

          Warm-up

          -

          Become familiar with the Media Key API basics by learning about:

          - - -

          Managing Media Key State Changes

          +

          Managing Media Key State Changes

          Learning how to register key event listener is a basic media key management skill:

            diff --git a/org.tizen.guides/html/web/media/player_util_w.htm b/org.tizen.guides/html/web/media/player_util_w.htm index 605227b..db2fba2 100644 --- a/org.tizen.guides/html/web/media/player_util_w.htm +++ b/org.tizen.guides/html/web/media/player_util_w.htm @@ -52,13 +52,6 @@

            You can set the latency mode of the player with the setLatencyMode() method.

            -

            Warm-up

            -

            Become familiar with the Player Util API basics by learning about:

            - -

            Getting the Current Latency Mode

            To get the current latency mode, use the getLatencyMode() method:

            diff --git a/org.tizen.guides/html/web/media/radio_w.htm b/org.tizen.guides/html/web/media/radio_w.htm index 5740fb6..974dd88 100644 --- a/org.tizen.guides/html/web/media/radio_w.htm +++ b/org.tizen.guides/html/web/media/radio_w.htm @@ -54,26 +54,12 @@
          1. Getting information about interruptions

            The Tizen system has a feature to prevent interference between radio sound and other source of sound. The sound of the radio is interrupted in reaction to various events, such as an incoming call or notification sound. You can use the oninterrupted event handler to detect the reason for the interruption.

          2. -

            The available operations depend on the current radio state. Radio states and transitions between them are illustrated in the following figure.

            +

            The available operations depend on the current radio state. To get information about the current radio state, read the state attribute of the FMRadioManager interface (the RadioState enum specifies the possible state values). The following figure illustrates the radio states and transitions between them.

            Figure: FM radio states and transitions

            FM radio states and transitions

            -

            To get information about current radio state, read the state attribute of the FMRadioManager interface. The RadioState enum specifies possible values of the attribute:

            -
              -
            • READY: Initial state, the radio is not playing and can be started or switched to scan.
            • -
            • PLAYING: The playback is ongoing.
            • -
            • SCANNING: The frequency scan is in progress, the radio is not playing.
            • -
            - -

            Warm-up

            - -

            Become familiar with the FM Radio API basics by learning about:

            - +

            -

            Managing the FM Radio

            +

            Managing the FM Radio

            Starting and stopping an FM radio and changing the frequency is a basic FM radio management skill:

            diff --git a/org.tizen.guides/html/web/messaging/messages_w.htm b/org.tizen.guides/html/web/messaging/messages_w.htm index a7400c2..a880a11 100644 --- a/org.tizen.guides/html/web/messaging/messages_w.htm +++ b/org.tizen.guides/html/web/messaging/messages_w.htm @@ -48,61 +48,35 @@

            Messages

            -

            Tizen enables you to create applications with messaging functionalities for SMS, MMS, and email.

            +

            Tizen enables you to create applications with messaging functionalities for SMS, MMS, and email.

            This feature is supported in mobile applications only.

            The messaging process used in HTML5 involves Uniform Resource Identifiers (URIs), which form values of attributes, such as tel, mailto, and sms. These attributes invoke external services which then perform the messaging tasks. The Messaging API minimizes your coding efforts by providing one-step capabilities to perform all high-level messaging-related operations.

            -

            Before you start, remember to prepare your application to use the messaging functionality.

            -

            The main features of the Messaging API include:

              -
            • Message writing

              You can create a message by using the Message object constructor, and you can set the message attributes and parameters using a MessageInit object (for example, you can set the message service type - SMS, MMS or email - by using the type parameter).

              You can add attachments to your MMS and email messages by creating a MessageAttachment object with the file path and the MIME type (image/png, text/pdf, or text/html) for each object and assigning an array of those objects to the attachments attribute of the Message object.

              To save message drafts for later, use the addDraftMessage() method of the MessageStorage interface.

              - - - - - - - - - -
              Note
              The system assigns a unique read-only message ID to each message the first time it is processed, such as when sending it or creating a draft message for it.
            • -
            • Message sending

              You can send messages by using the sendMessage() method of the MessageService interface.

              The method requires both success and error event handlers. Depending on the result of the sending operation, the message is moved to the device's Sent Items folder or Drafts folder, and additionally stored in the message storage database.

            • +
            • Message writing and sending +

              You can create and send messages, and save message drafts.

              +

              You can also retrieve information on available SIM cards and select the SIM card with which to send a message.

              +
            • Message management -

              You can find, update, and delete stored messages with methods provided by the MessageStorage interface: findMessages(), updateMessages(), and removeMessages(). The interface allows you to manage message storages.

              -

              When searching for messages, you can create attribute filters, attribute range filters, and composite filters based on specific filter attributes. You can also sort the search results.

            • -
            • Message storage change notifications -

              You can register event listeners to monitor changes in the message storage, a particular conversation, or a particular message folder.

              -

              The addMessagesChangeListener(), addConversationsChangeListener(), and addFoldersChangeListener() methods of the MessageStorage interface register an event listener, which starts asynchronously once the method returns the subscription identifier for the listener. You can use the MessagesChangeCallback, MessageConversationsChangeCallback, and MessageFoldersChangeCallback interfaces to define listener event handlers for receiving notifications about the changes.

            • -
            • Finding folders

              You can find message folders by using the findFolders() method of the MessageStorage interface.

            • -
            • Full message content retrieval from the email server

              It is possible that an email message is accessible through the Message object, but its full body or attachment has not been downloaded yet. You can load email messages and attachments from the email service with the loadMessageBody() and loadMessageAttachment() methods of the MessageService interface.

              To keep your email service accounts up-to-date, synchronize them with their respective external servers, such as Gmail and Microsoft Exchange, with the sync() method. You can also synchronize just one folder, such as the Inbox, with the syncFolder() method.

              You can specify the maximum number of messages that can be retrieved in each folder.

            • -
            • SMS and dual SIM -

              If there are multiple SIM cards in the device, by default the system determines which one is used to send a message. You can also specify the SIM card when sending an SMS.

              +

              You can find, update, and delete messages in the message storage.

              +
            • +
            • Finding folders +

              You can find message folders belonging to a message service.

              +
            • +
            • Full message content retrieval from the email server +

              You can load email messages and attachments from the email service and synchronize your email accounts.

              +
            • +
            • Message storage change notifications +

              You can receive notifications when messages are added, updated, or deleted.

            + +

            For a practical example of sending, receiving, and managing messages in your application, see the Chatter mobile sample task.

            -

            Warm-up

            -

            Become familiar with the Messaging API basics by learning about:

            - -

            Task

            -

            In the Chatter task, we will walk through how to send, receive, and manage messages in your application.

            - - -

            Prerequisites

            +

            Prerequisites

            To use the Messaging API, the application has to request permission by adding the following privileges to the config.xml file:

             <tizen:privilege name="http://tizen.org/privilege/messaging.read"/>
            @@ -112,7 +86,20 @@
             	
               

            Creating and Sending Messages

            -

            To create engaging applications with various messaging features, you must learn to create and send messages:

            +

            You can create a message by using the Message object constructor, and you can set the message attributes and parameters using a MessageInit object (for example, you can set the message service type - SMS, MMS or email - by using the type parameter).

            + + + + + + + + + + +
            Note
            The system assigns a unique read-only message ID to each message the first time it is processed, such as when sending it or creating a draft message for it.
            + +

            To create and send messages:

            1. Retrieve the messaging service using the getMessageServices() method. The first parameter specifies the type of the messaging service to retrieve. There are 3 possible types: "messaging.sms", "messaging.mms" and "messaging.email". In the following example, the SMS service is retrieved.

              @@ -123,7 +110,8 @@ function errorCallback(error)
               
               tizen.messaging.getMessageServices("messaging.sms", serviceListCB, errorCallback);
            2. -
            3. In the success callback of the getMessageServices() method, use the Message interface to define the content and attributes of the message, and then send the message using the sendMessage() method of the MessageService interface.

              If the message is not ready to be sent yet, save the message draft using the addDraftMessage() method of the MessageStorage interface.

              +
            4. In the success callback of the getMessageServices() method, use the Message interface to define the content and attributes of the message, and then send the message using the sendMessage() method of the MessageService interface. The sendMessage() method requires both success and error event handlers. Depending on the result of the sending operation, the message is moved to the device's Sent Items or Drafts folder, and additionally stored in the message storage database.

              +

              If the message is not ready to be sent yet, save the message draft using the addDraftMessage() method of the MessageStorage interface.

               function onAddSuccess()
               {
                  console.log("Successfully added");
              @@ -150,7 +138,11 @@ function serviceListCB(services)
                     /* Save a draft */
                     services[0].messageStorage.addDraftMessage(msg, onAddSuccess, errorCallback); 
                  }
              -}

              In case you are sending MMS or email messages with attachments, add the attachments as an array of MessageAttachment objects:

              +}

              In case you are sending MMS or email messages with attachments, add the attachments as an array of MessageAttachment objects with the file path and the MIME type (image/png, text/pdf, or text/html) defined for each object.

              + +

              Assign the array to the attachments attribute of the Message object.

              + +
               var msg = new tizen.Message("messaging.email");
               msg.attachments = [new tizen.MessageAttachment("images/myimage.png", "image/png"), 
                                  new tizen.MessageAttachment("docs/mydoc.pdf","text/pdf")];
              @@ -168,8 +160,8 @@ function messageSent(recipients)
               

              Defining a sending error callback allows you to handle all possible errors and exceptions that can occur causing the message delivery to fail.

            -

            Selecting the SIM Card for Sending Messages

            - +

            Selecting the SIM Card for Sending Messages

            +

            If there are multiple SIM cards in the device, by default the system determines which one is used to send a message. You can also specify the SIM card when sending an SMS.

            To add the dual SIM feature to your messaging application, you must learn to retrieve information on available SIM cards and select the SIM card to send SMS and MMS messages:

            1. To check how many SIM cards are available, call the getCount() method of the SystemInfo interface. @@ -217,11 +209,13 @@ tizen.messaging.getMessageServices("messaging.sms", serviceSuccess);
            -

            Managing Messages

            - -

            To create engaging applications with various messaging features, you must learn to work with messages in the message store:

            +

            Managing Messages

            +

            You can find, update, and delete stored messages with methods provided by the MessageStorage interface: findMessages(), updateMessages(), and removeMessages(). The interface allows you to manage message storages.

            + +

            To work with messages in the message store:

              -
            1. Retrieve messages whose sender is "me" from the message storage using the findMessages() method of the MessageStorage interface with a filter (for attributes supported in the filter, see Messaging Filter Attributes):

              +
            2. Retrieve messages whose sender is "me" from the message storage using the findMessages() method of the MessageStorage interface .

              +

              When searching for messages, you can create attribute filters, attribute range filters, and composite filters based on specific filter attributes. You can also sort the search results.

               var emailService;
               function serviceListCB(services) 
              @@ -255,9 +249,8 @@ function messageArrayCB(messages)
                 

            Finding Folders

            - -

            To create engaging applications with various messaging features, you must learn how to find message folders:

            -
              +

              To find message folders, use the findFolders() method of the MessageStorage interface:

              +
              1. To retrieve the messaging service, use the getMessageServices() method of the Messaging interface:

                 var service;
                @@ -290,19 +283,23 @@ function onFindFoldersFail(error)
                 
                 var filter = new tizen.AttributeFilter("serviceId", "EXACTLY", service.id);
                 
              2. -
              3. To get all message folders, use the findFolders() method of the MessageStorage interface:

                service.messageStorage.findFolders(filter, onFindFolders, onFindFoldersFail);
              4. +
              5. To get all message folders, use the findFolders() method of the MessageStorage interface:

                service.messageStorage.findFolders(filter, onFindFolders, onFindFoldersFail);

              Synchronizing with the Server

              -

              To create engaging applications with various messaging features, you must learn to load email messages and attachments and synchronize email:

              +

              To keep your email service accounts up-to-date, synchronize them with their respective external servers, such as Gmail and Microsoft Exchange, with the sync() method. You can also synchronize just one folder, such as the Inbox, with the syncFolder() method. You can specify the maximum number of messages that can be retrieved in each folder.

              + +

              It is possible that an email message is accessible through the Message object, but its full body or attachment has not been downloaded yet. You can load email messages and attachments from the email service with the loadMessageBody() and loadMessageAttachment() methods of the MessageService interface.

              + +

              To load email messages and attachments and synchronize email:

              1. Retrieve the messaging service using the getMessageServices() method.

                 tizen.messaging.getMessageServices("messaging.email", serviceListCB, errorCallback);
              2. Search for all email messages with attachments using the findMessages() method of the MessageStorage interface:

                 service.messageStorage.findMessages(new tizen.AttributeFilter("hasAttachment", "EXACTLY", true),
                                                     messageQueryCallback);
              3. -
              4. To load a message body, use the loadMessageBody() method of the MessageService interface:

                +   
              5. To load a message body, use the loadMessageBody() method of the MessageService interface:

                 /* Success callback for the search operation */
                 function messageQueryCallback(messages)
                 {
                @@ -358,9 +355,11 @@ emailService.messageStorage.findFolders(filter, folderQueryCallback)); 
              -

              Receiving Notifications on Message Storage Changes

              - -

              To create engaging applications with various messaging features, you must learn to receive notifications when messages and message folders are added, updated, or removed:

              +

              Receiving Notifications on Message Storage Changes

              +

              You can register event listeners to monitor changes in the message storage, a particular conversation, or a particular message folder.

              +

              The addMessagesChangeListener(), addConversationsChangeListener(), and addFoldersChangeListener() methods of the MessageStorage interface register an event listener, which starts asynchronously once the method returns the subscription identifier for the listener. You can use the MessagesChangeCallback, MessageConversationsChangeCallback, and MessageFoldersChangeCallback interfaces to define listener event handlers for receiving notifications about the changes.

              + +

              To receive notifications when messages and message folders are added, updated, or removed:

              1. Define the needed variable:
                /* Watch identifier */
                 var watchId;
              2. @@ -389,7 +388,7 @@ var messageChangeCallback =
              3. Register the listener to use the defined event handlers:
                 watchId = msgService.messageStorage.addMessagesChangeListener(messageChangeCallback);
                 
              4. -
              5. To stop receiving the notifications, use the removeChangeListener() method of the MessageStorage interface:

                msgService.messageStorage.removeChangeListener(watchId);
              6. +
              7. To stop receiving the notifications, use the removeChangeListener() method of the MessageStorage interface:

                msgService.messageStorage.removeChangeListener(watchId);
              diff --git a/org.tizen.guides/html/web/messaging/push_w.htm b/org.tizen.guides/html/web/messaging/push_w.htm index 6fb3e42..d2207d4 100644 --- a/org.tizen.guides/html/web/messaging/push_w.htm +++ b/org.tizen.guides/html/web/messaging/push_w.htm @@ -27,9 +27,7 @@

              Content

                -
              • Features
              • Architecture
              • -
              • Security
              • Prerequisites
              • Registering to the Push Service
              • Receiving Push Notifications
              • @@ -56,27 +54,34 @@

                When a push message arrives when the application is running, it is automatically delivered to the application. If not, the push service makes a sound or vibrates, and adds a ticker or a badge notification to notify the user. By touching the notification, the user can check the message. The application server can send a message with a LAUNCH option. In this case, the push service forcibly launches the application and hands over the message to the application.

                -

                To use the push messaging service, the application needs the permission to access the Tizen push server. Request the permission from the Tizen push service team by email, including the necessary information. When the team approves the request, you receive a push app ID corresponding to your package ID.

                - -

                Before you start, remember to prepare your application to use the push functionality.

                - -

                Features

                +

                To use the push messaging service, the application needs the permission to access the Tizen push server. Request the permission from the Tizen push service team by email, including the necessary information. When the team approves the request, you receive a push app ID corresponding to your package ID.

                The main features of the Push API include:

                  -
                • Registering to the push service -

                  You can register or deregister the application for the push service. If the registration process is successful, it returns the registration identifier through the PushRegisterSuccessCallback listener (in mobile and wearable applications). The application server needs the registration ID to send notifications to the application installed on a specific device.

                • -
                • Receiving push notifications -

                  You can connect to the push service and start receiving push notifications with the connectService() method up to Tizen 2.4, or with connect() method since Tizen 3.0. Up to Tizen 2.4, you must pass the PushNotificationCallback listener (in mobile and wearable applications) as a parameter in the method to receive push notifications. Since Tizen 3.0, you must pass the PushRegistrationStateChangeCallback (in mobile applications) and PushNotificationCallback callbacks as parameters in the method. The first callback is called when the registration change state changes. This callback is called at least once, just after the connection is established. The second callback is called when notification messages arrive. You can also pass the ErrorCallback as a parameter to be called if the connection request fails.

                • -
                • Retrieving missed push messages -

                  While the application is not running, messages cannot be delivered. You can retrieve such missed push messages later on.

                • -
                • Reacting to a launch by the push service -

                  The application can be launched by the push service. In that case, you must determine the reason for the launch, and react to it appropriately. If the application is launched due to a notification, you can retrieve and read the last message delivered from the push service.

                • +
                • Registering to the push service +

                  You can register to the push service and get the registration identifier.

                • +
                • Receiving push notifications +

                  You can connect to the push service and start receiving push notifications.

                • +
                • Retrieving missed push messages +

                  While the application is not running, messages cannot be delivered. You can retrieve such missed push messages later on.

                • +
                • Getting push messages when the application is launched by the push service +

                  The application can be launched by the push service. In that case, you must determine the reason for the launch, and react to it appropriately. If the application is launched due to a notification, you can retrieve and read the last message delivered from the push service.

                • Sending push notifications

                  The push service implements the RESTful open API for sending a push message. For more information on sending push notifications, see Push Server.

                +
              + + + + + + + + +
              Note
              Remember about security issues when sending notifications with sensitive information. For a list of strongly recommended rules, see Managing Security.
              +

              Architecture

              The architecture of the Tizen Push service is described in detail in the mobile native Push guide.

              @@ -94,21 +99,7 @@
            1. Receive notifications from the push service.
            -

            Security

            -

            Remember about security issues when sending notifications with sensitive information. For a list of strongly recommended rules, see Managing Security.

            - -

            Warm-up

            -

            Become familiar with the Push API basics by learning about:

            - - -

            Prerequisites

            +

            Prerequisites

            To enable your application to use the push functionality:

              @@ -193,7 +184,9 @@ +
            +

            Registering to the Push Service

            To receive push notifications, you must learn how to register your application to the push service:

              @@ -285,6 +278,8 @@ if (registrationId != null)

              Receiving Push Notifications

              +

              You can connect to the push service and start receiving push notifications with the connectService() method up to Tizen 2.4, or with the connect() method since Tizen 3.0. Up to Tizen 2.4, you must pass the PushNotificationCallback listener (in mobile and wearable applications) as a parameter in the method to receive push notifications. Since Tizen 3.0, you must pass the PushRegistrationStateChangeCallback (in mobile applications) and PushNotificationCallback callbacks as parameters in the method. The first callback is called when the registration change state changes. This callback is called at least once, just after the connection is established. The second callback is called when notification messages arrive. You can also pass the ErrorCallback as a parameter to be called if the connection request fails.

              +

              When a notification arrives at the device, its delivery mechanism depends on whether the application is running:

                @@ -405,7 +400,7 @@ tizen.push.connect(stateChangeCallback, notificationCallback, errorCallback);
          -

          To stop listening for new push messages, call the disconnectService() method up to Tizen 2.4 or the disconnect() method since Tizen 3.0:

          +

          To stop listening for new push messages, call the disconnectService() (up to Tizen 2.4) or disconnect() (since Tizen 3.0) method:

           /* Up to Tizen 2.4 */
           tizen.push.disconnectService();
          @@ -467,7 +462,7 @@ function stateChangeCallback(state)
                 /* Request application registration */
                 tizen.push.register(registerSuccessCallback, errorCallback);
              }
          -   else if (state === "REGISTERED")
          +   else if (state === "REGISTERED")
              {
                 /* Gets unread push notifications */
                 tizen.push.getUnreadNotifications();
          @@ -575,4 +570,4 @@ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga
           
           
           
          -
          +
          \ No newline at end of file
          diff --git a/org.tizen.guides/html/web/notification/notification_w.htm b/org.tizen.guides/html/web/notification/notification_w.htm
          index f7a482c..b7d2e82 100644
          --- a/org.tizen.guides/html/web/notification/notification_w.htm
          +++ b/org.tizen.guides/html/web/notification/notification_w.htm
          @@ -51,13 +51,14 @@
             
             

          The main features of the Notification API include:

          -

          Before you start, remember to prepare your application to use the notification functionality.

          -

          To display a notification, you need to create a Notification object (in mobile and wearable applications), or its subtype.

          @@ -69,16 +70,8 @@
          - -

          Warm-up

          -

          Become familiar with the Notification API basics by learning about:

          - - + +

          Prerequisites

          To use the Notification API (in mobile and wearable applications), the application has to request permission by adding the following privilege to the config.xml file:

          diff --git a/org.tizen.guides/html/web/personal/account_w.htm b/org.tizen.guides/html/web/personal/account_w.htm
          index 6e612b5..4bec470 100644
          --- a/org.tizen.guides/html/web/personal/account_w.htm
          +++ b/org.tizen.guides/html/web/personal/account_w.htm
          @@ -47,92 +47,71 @@
             

          Account Management

          You can access user accounts and account providers. After getting a specific account, you can manage it, retrieve account information, and monitor changes in it. You can use existing configured on-line accounts and providers, and create new accounts of known types.

          -

          This feature is supported in mobile applications only.

          - -

          The basic account management concepts are:

          -
          • Provider -

            An on-line service provider entity, such as Google, Vodafone, or Facebook. A service provider is identified by its application ID. The account provider is registered while the application is installed. The information is used in the Add account screen in the device settings.

          • -
          • Account -

            An entity that collects all the data (such as user name, credentials, settings) needed for connecting to services. An account is always bound to a single provider and has a list of service instances bound to the account. The services can be individually enabled and disabled on the given account. For instance, "Laccount1@gmail.com" can identify a Google account, giving access to services, such as gmail, gtalk, Picasa, and Youtube, with each service having a separate service instance bound to the account.

            -
          - -

          Some of the account management features can be invoked only in account provider applications. Such applications have a specially prepared config.xml file with an account provider section:

          - -
          -<tizen:account multiple-account-support="true">
          -   <tizen:icon section="Account">icon.png</tizen:icon>
          -   <tizen:icon section="AccountSmall">icon.png</tizen:icon>
          -   <tizen:display-name xml:lang="en-gb">Test</tizen:display-name>
          -   <tizen:capability>http://tizen.org/account/capability/contact</tizen:capability>
          -</tizen:account>
          - -

          If the application is registered as a provider, it is launched to authenticate the account. You must implement the appcontrol for the account provider. The following methods are available only in an account provider application: add(), remove(), and update().

          -

          The main features of the Account API include:

          - -

          Before you start, remember to prepare your application to use the account functionality.

          - -

          The account provider application declares the account capabilities. The capability name is decided by the author of the account provider application, and must have an IRI form. For example:

          -
          • http://tizen.org/account/capability/contact is used when the account is related to contacts.
          • -
          • http://tizen.org/account/capability/calendar is used when the account is related to the calendar. +

            To understand account management, you must be familiar with the following basic concepts:

            +
            • Provider +

              An on-line service provider entity, such as Google, Vodafone, or Facebook. A service provider is identified by its application ID. The account provider is registered while the application is installed. The information is used in the Add account screen in the device settings.

            • +
            • Account +

              An entity that collects all the data (such as user name, credentials, settings) needed for connecting to services. An account is always bound to a single provider and has a list of service instances bound to the account. The services can be individually enabled and disabled on the given account. For instance, "Laccount1@gmail.com" can identify a Google account, giving access to services, such as gmail, gtalk, Picasa, and Youtube, with each service having a separate service instance bound to the account.

            -

            To check whether this API is supported, use the tizen.systeminfo.getCapability() method and enable or disable code that needs this API, as needed. To guarantee that the account application runs on a device with the account feature, declare the http://tizen.org/feature/account feature requirement in the config.xml file.

            - +

            Prerequisites

            +

            To enable your application to use the account functionality:

            -

            Warm-up

            -

            Become familiar with the Account API basics by learning about:

            -
              -
            • Prerequisites -

              Prepare your application to use the account management functionality.

            • -
            • Retrieving Accounts -

              Get all accounts or one with a specific ID.

              -
            • -
            • Retrieving Providers -

              Get the account provider belonging to current application or get all account providers.

              -
            • -
            • Managing Accounts -

              Add, update, and remove an account.

              -
            • -
            • Receiving Notifications on Account Changes -

              Register and remove an account change listener.

              -
            • -
            • Managing Extended Account Data -

              Get and set extended data for an account.

              +
                +
              1. To make your application visible only for devices that support the account feature, the application must specify the following feature in the config.xml file: +
                +<widget>
                +   <tizen:feature name="http://tizen.org/feature/account"/>
                +</widget>
                +
                +

                Additionally, to double-check the Account API support while the application is running, use the tizen.systeminfo.getCapability() method and enable or disable the code that needs the API, as needed.

              2. -
            - -

            Prerequisites

            - -

            To use the Account API, the application has to request permission by adding the following privileges to the config.xml file:

            +
          • To use the Account API, the application has to request permission by adding the following privileges to the config.xml file:
             <tizen:privilege name="http://tizen.org/privilege/account.read"/>
             <tizen:privilege name="http://tizen.org/privilege/account.write"/>
             
            +
          • +
          • Some of the account management features can be invoked only in account provider applications. If you are creating an account provider application, pay attention to the following requirements: +
              +
            • Account provider applications must have a specially prepared config.xml file with an account provider section: + +
              +<tizen:account multiple-account-support="true">
              +   <tizen:icon section="Account">icon.png</tizen:icon>
              +   <tizen:icon section="AccountSmall">icon.png</tizen:icon>
              +   <tizen:display-name xml:lang="en-gb">Test</tizen:display-name>
              +   <tizen:capability>http://tizen.org/account/capability/contact</tizen:capability>
              +</tizen:account>
              +
            • +
            • If the application is registered as a provider, it is launched to authenticate the account. You must implement an application control to allow the account provider to be launched through the application control request. +
            • +
            • The following methods are available only in an account provider application: add(), remove(), and update(). +
            • +
            • The account provider application declares the account capabilities. The capability name is decided by the author of the account provider application, and must have an IRI form. For example: +
              • http://tizen.org/account/capability/contact is used when the account is related to contacts.
              • +
              • http://tizen.org/account/capability/calendar is used when the account is related to the calendar. +
              +
            +
        -

        Retrieving Accounts

        - +

        Retrieving Accounts

        Learning how to retrieve account information enables you to include account support into your applications:

        diff --git a/org.tizen.guides/html/web/personal/bookmarks_w.htm b/org.tizen.guides/html/web/personal/bookmarks_w.htm index 01057e0..2481d1c 100644 --- a/org.tizen.guides/html/web/personal/bookmarks_w.htm +++ b/org.tizen.guides/html/web/personal/bookmarks_w.htm @@ -51,21 +51,11 @@

        The main features of the Bookmark API include:

        -

        Before you start, remember to prepare your application to use the bookmark functionality.

        - -

        Warm-up

        -

        Become familiar with the Bookmark API basics by learning about:

        - - -

        Prerequisites

        +

        Prerequisites

        To use the Bookmark API, the application has to request permission by adding the following privileges to the config.xml file:

         <tizen:privilege name="http://tizen.org/privilege/bookmark.read"/>
        diff --git a/org.tizen.guides/html/web/personal/calendar_w.htm b/org.tizen.guides/html/web/personal/calendar_w.htm
        index c32a47e..3578015 100644
        --- a/org.tizen.guides/html/web/personal/calendar_w.htm
        +++ b/org.tizen.guides/html/web/personal/calendar_w.htm
        @@ -27,23 +27,27 @@
                 

        Content

        @@ -60,45 +64,19 @@

        Calendar

        - -

        Tizen enables you to manage your schedule and tasks.

        -

        A calendar is a collection of events or tasks, depending upon the calendar type. Each event or task has a series of attributes, such as purpose, starting time, and duration.

        +

        Tizen enables you to manage your schedule and tasks in calendars. A calendar is a collection of events or tasks, depending upon the calendar type. Each event or task has a series of attributes, such as purpose, starting time, and duration.

        This feature is supported in mobile applications only.

        - - - - - - - - - - -
        Note
        Due to time zone and daylight saving time, an event for "today" can actually occur in the past or in the future.
        -

        The events and tasks are identified using the CalendarItemId typedef, which is either a CalendarTaskId (for tasks) or CalendarEventId (for events). In recurring events, the CalendarEventId contains a recurrence ID (rid) in addition to the actual event ID, to separately identify each occurrence of the recurring event.

        -

        The Calendar API uses the TZDate object of the Time API and not the standard JavaScript Date object to handle difficult issues related to the time zone, because the TZDate object handles exact time and provides various utility methods.

        - -

        Before you start, remember to prepare your application to use the calendar functionality.

        -

        The main features of the Calendar API include:

          - -
        • Calendar management +
        • Calendar management

          You can create a new calendar using the addCalendar() method of the CalendarManager interface (you also need the Account API).

          -

          To access an existing calendar item, you must first retrieve the calendar object of the applicable type from the applicable calendar. To access the device calendars, you can use:

            - -
          • getDefaultCalendar() method of the CalendarManager interface to retrieve the default calendar.
          • -
          • getCalendars() method to retrieve all the available calendars as an array.
          • -
          • getUnifiedCalendar() method of the CalendarManager interface to retrieve the special calendar which combines events (or tasks) from all calendars of the same type.
          • -
        • - -
        • Calendar item management

          You can manage calendar items (add a new event or task to a calendar, or manage a single calendar event or task) by using the applicable methods of the Calendar interface.

          If you need to delete or update a single instance of a recurring event, get the list of event instances first with the expandRecurrence() method of the CalendarEvent object. Then, delete the applicable event instance, or update it by calling the update() method with the updateAllInstances parameter set to false.

          You can create multiple events or tasks, and manage multiple calendar events or tasks simultaneously by using the applicable batch methods: addBatch(), updateBatch(), and removeBatch(). The batch mode provides faster, optimized processing of multiple calendar items.

          - - - -

          When searching for calendar items, you can create attribute filters, attribute range filters, and composite filters based on specific filter attributes. You can also sort the search results.

          - + +
        • Calendar item management +

          You can manage calendar items (add a new event or task to a calendar, or manage a single calendar event or task) by using the applicable methods of the Calendar interface. You can also delete or update a single instance of a recurring event.

          +

          When creating an important event or task, such as a monthly meeting or a task of paying a utility bill, you can set an alarm for it by using the CalendarAlarm interface. The alarm is triggered at a defined time to remind the user of the event or task.

          +

          You can create multiple events or tasks, and manage multiple calendar events or tasks simultaneously by using the applicable batch methods. The batch mode provides faster, optimized processing of multiple calendar items.

          +
        • @@ -107,62 +85,21 @@ -
          NoteThe batch mode does not provide progress information about operations. To ensure that you can view the progress, break the batch operation down into multiple smaller batch operations. For example, break down a batch of 100 update requests into 10 batch operations that update 10 records at a time. Breaking down a batch operation also helps you avoid blocking other database operations, such as add or remove.
        • - -
        • Calendar item alarms

          You can set an alarm for an important event or task, such as a monthly meeting or a specific task (for example, paying a utility bill), by using the CalendarAlarm interface. The alarm is triggered at a defined time to remind the user of the event or task.

        • - - -
        • Calendar change notifications

          You can keep the calendar in your application synchronized with user-specific calendars, such as a calendar on a social networking Web site, by receiving notifications in your application when calendar items change.

          The addChangeListener() method of the Calendar interface registers an event listener, which starts asynchronously once the addChangeListener() method returns the subscription identifier for the listener. You can use the CalendarChangeCallback interface to define listener event handlers for receiving the notifications.

          Every change made to the calendar database triggers an event for which you can define a notification. For batch mode operations, each operation generates only a single event. A recurring calendar event is treated as one event.

        • -
        • iCalendar 2.0 format conversions

          You can convert a calendar event or task to the iCalendar format or back using the CalendarEvent or CalendarTask object constructor and the convertToString() method of the CalendarItem interface, respectively.

          The conversion allows you to exchange calendar data between applications by sharing files with the .ics extension. The iCalendar format is independent of the underlying transport protocol, meaning that calendar items can be exchanged using a variety of transports, including HTTP, SMTP, and Infrared.

          The iCalendar format can be used to store calendar item information and exchange calendar data over the Internet.

          The following example shows a sample event and task in the iCalendar format:

          -
          -/* Event */
          -BEGIN:VCALENDAR
          -BEGIN:VEVENT
          -DTSTART:20110714T150000Z
          -DTEND:20110715T173000Z
          -SUMMARY:Prepare team meeting
          -END:VEVENT
          -END:VCALENDAR
          -
          -/* Task */
          -BEGIN:VCALENDAR
          -BEGIN:VTODO
          -DTSTAMP:TZID=CET:20110902T110000Z
          -DTSTART:TZID=CET:20110906T140000Z
          -DUE:TZID=CET:20110906T150000Z
          -SUMMARY:Prepare team meeting
          -END:VTODO
          -END:VCALENDAR
        • + + +
        • iCalendar 2.0 format conversions +

          You can convert a calendar event or task to the iCalendar format and back.

          +
        • +
        • Calendar change notifications +

          You can keep the calendar in your application synchronized with user-specific calendars, such as a calendar on a social networking Web site, by receiving notifications in your application when calendar items change.

          +
        -

        Warm-up

        -

        Become familiar with the Calendar API basics by learning about:

        - -

        Task

        -

        In the Event Manager task, we will walk through how to manage calendar events in your application.

        - -

        Prerequisites

        +

        The Calendar API uses the TZDate object of the Time API and not the standard JavaScript Date object to handle difficult issues related to the time zone, because the TZDate object handles exact time and provides various utility methods.

        + +

        For a practical example of managing calendar events in your application, see the Event Manager sample task.

        + +

        Prerequisites

        To use the Calendar API, the application has to request permission by adding the following privileges to the config.xml file:

         <tizen:privilege name="http://tizen.org/privilege/calendar.read"/>
        @@ -171,8 +108,6 @@ END:VCALENDAR

        Creating a Calendar

        - -

        Creating a new calendar is a basic calendar management skill:

        @@ -184,6 +119,9 @@ END:VCALENDAR
        + +

        To create a new calendar:

        +
        1. Declare a variable to store the created calendar:
          var myCalendar = null;
          @@ -206,13 +144,57 @@ END:VCALENDAR
      - -

      Adding Events to a Calendar

      +

      Retrieving a Calendar

      +

      You must retrieve the calendar object of the applicable type from the applicable calendar to access an existing calendar item.

      + +

      To access the device calendars and retrieve calendar objects:

      +
        +
      • To retrieve the default calendar, use the getDefaultCalendar() method of the CalendarManager interface. +

        The following example retrieves the event-type default calendar:

        +
        +tizen.calendar.getDefaultCalendar("EVENT");
        +
      • +
      • To retrieve all the available calendars as an array, use the getCalendars() method. +

        The following example retrieves all event-type calendars:

        +
        +tizen.calendar.getCalendars("EVENT", calendarListCallback, errorCallback);
        +
      • +
      • To retrieve a special calendar, which combines events (or tasks) from all calendars of the same type, use the getUnifiedCalendar() method of the CalendarManager interface. +

        The following example retrieves a unified event-type calendar:

        +
        +tizen.calendar.getUnifiedCalendar("EVENT");
        +
      • +
      + +

      Events

      + +

      The events are identified using the CalendarEventId, which is a CalendarItemId typedef. In recurring events, the CalendarEventId contains a recurrence ID (rid) in addition to the actual event ID, to separately identify each occurrence of the recurring event.

      + + + + + + + + + +
      Note
      Due to time zone and daylight saving time, an event for "today" can actually occur in the past or in the future.
      + +

      Using the CalendarEvent object, you can:

      +
        +
      • Add events to a calendar one by one or in a batch mode.
      • +
      • Update or delete events one by one or in a batch mode.
      • +
      • Update recurring events.
      • +
      • Convert events to the iCalendar format and back.
      • +
      + +

      Adding Events to a Calendar

      -

      To create engaging applications with various calendar features, you must learn to add events to calendars:

      +

      To add events to a calendar:

        -
      1. Retrieve the default system calendar using the getDefaultCalendar() method of the CalendarManager interface.

        With the parameter, specify the calendar type as an event.

        +    
      2. Retrieve the default system calendar using the getDefaultCalendar() method of the CalendarManager interface.

        With the parameter, specify the calendar type as an event.

        +
         var calendar = tizen.calendar.getDefaultCalendar("EVENT");
         
      3. Create a CalendarEvent object and define the event properties:

        var ev = new tizen.CalendarEvent
        @@ -236,10 +218,9 @@ ev.alarms = [alarm];
              
      4. Add the CalendarEvent object to the default calendar with the add() method of the Calendar object.

        calendar.add(ev);  /* ev.id attribute is generated */
      -

      Adding Events to a Calendar in the Batch Mode

      - - -

      To create engaging applications with various calendar features, you must learn to add events to calendars in the batch mode:

      +

      Adding Events to a Calendar in the Batch Mode

      +

      You can create multiple events simultaneously by using the addBatch() method.

      +

      To add events to a calendar in the batch mode:

      1. Retrieve the default system calendar using the getDefaultCalendar() method of the CalendarManager interface:

         var calendar = tizen.calendar.getDefaultCalendar("EVENT");
        @@ -280,25 +261,17 @@ calendar.addBatch([ev]);
         
      -

      Managing a Single Calendar Event

      +

      Managing a Single Event

      -

      To create engaging applications with various calendar features, you must learn to manage a single calendar event:

      +

      To manage a single event:

      1. Retrieve the default system calendar using the getDefaultCalendar() method of the CalendarManager interface.

        With the parameter, specify the calendar type as event.

         var myCalendar = tizen.calendar.getDefaultCalendar("EVENT");
         
      2. Retrieve all events stored in the calendar by using the find() method of the Calendar object:

         myCalendar.find(eventSearchSuccessCallback);
        - - - - - - - - - -
        Note
        To retrieve a specific set of events, you can specify a filter and sorting order for the search operation through the filter and sortMode parameters (for attributes supported in the filter, see Calendar Filter Attributes).

        In this example, all the events are retrieved because no filter is used.

      3. + +

        When searching for calendar items, you can create attribute filters, attribute range filters, and composite filters based on specific filter attributes. You can also sort the search results. In this example, all the events are retrieved because no filter is used.

      4. Update or delete the found item inside the eventSearchSuccessCallback() event handler.

        In this example, the description parameter of the first event is changed and the event is updated in the calendar using the update() method. The second event is deleted using the remove() method.

        /* Define the event success callback */
         function eventSearchSuccessCallback(events)
         {
        @@ -311,16 +284,16 @@ function eventSearchSuccessCallback(events)
         }
      -

      Updating Recurring Calendar Events

      - -

      To create engaging applications with various calendar features, you must learn to update recurring calendar events:

      +

      Updating Recurring Events

      +

      If you need to delete or update a single instance of a recurring event, get the list of event instances first with the expandRecurrence() method of the CalendarEvent object. Then, delete the applicable event instance, or update it by calling the update() method with the updateAllInstances parameter set to false.

      +

      To update recurring events:

      1. Retrieve the default system calendar using the getDefaultCalendar() method of the CalendarManager interface.

        -

        Retrieve the calendar event using the get() method by specifying the event ID.

        +

        Retrieve the event using the get() method by specifying the event ID.

         var calendar = tizen.calendar.getDefaultCalendar("EVENT");
         var event = calendar.get(evId);
         
      2. -
      3. Expand the recurring event to get its instances by using the expandRecurrence() method of the CalendarEvent object:
        +     
      4. Expand the recurring event to get its instances by using the expandRecurrence() method of the CalendarEvent object:
         event.expandRecurrence(new tizen.TZDate(2012, 2, 1), new tizen.TZDate(2012, 2, 15),
                                eventExpandSuccessCB);

        The expanded event instances have their own id.uid and id.rid attributes, where the id.uid attribute is the same for all instances.

      5. Update a single instance of the expanded recurring event.

        In case of recurring events, you can use the second parameter of the update() method to determine whether a single instance or all occurrences of the event are updated. If the parameter is set to true, all instances are updated, while if it is set to false, only the indicated instance of the recurring event is updated (based on the id.rid attribute).

        In this example, the second instance of the event is updated.

        @@ -333,25 +306,16 @@ function eventExpandSuccessCB(events)
         
      -

      Managing Multiple Calendar Events in the Batch Mode

      - -

      To create engaging applications with various calendar features, you must learn to manage multiple calendar events in the batch mode:

      +

      Managing Multiple Events in the Batch Mode

      +

      You can manage multiple events simultaneously by using the applicable batch methods: updateBatch() and removeBatch().

      +

      To manage multiple events in the batch mode:

      1. Retrieve the default system calendar using the getDefaultCalendar() method of the CalendarManager interface.

        With the parameter, specify the calendar type as event.

         var myCalendar = tizen.calendar.getDefaultCalendar("EVENT");
         
      2. Retrieve all events stored in the calendar by using the find() method of the Calendar object:

         myCalendar.find(eventSearchSuccessCallback, errorCallback);
        - - - - - - - - - -
        Note
        To retrieve a specific set of events, you can specify a filter and sorting order for the search operation through the filter and sortMode parameters (for attributes supported in the filter, see Calendar Filter Attributes).

        In this example, all the events are retrieved because no filter is used.

      3. +

        When searching for calendar items, you can create attribute filters, attribute range filters, and composite filters based on specific filter attributes. You can also sort the search results. In this example, all the events are retrieved because no filter is used.

      4. To update events:
          @@ -375,12 +339,24 @@ function eventSearchSuccessCallback(events) }
        - -

        Converting Calendar Event Formats

        - -

        The following examples illustrate how to make calendar event exchange more efficient in your application by converting the calendar events to iCalendar format or the other way around using the CalendarEvent constructor and the convertToString() method of the Calendar object respectively:

        + +

        Converting Event Formats

        +

        You can make event exchange more efficient in your application by converting an event to the iCalendar format (or back) using the CalendarEvent object constructor and the convertToString() method of the CalendarItem interface.

        +

        The conversion allows you to exchange calendar data between applications by sharing files with the .ics extension. The iCalendar format is independent of the underlying transport protocol, meaning that calendar items can be exchanged using a variety of transports, including HTTP, SMTP, and Infrared. The iCalendar format can be used to store calendar item information and exchange calendar data over the Internet.

        +

        The following example shows a sample event in the iCalendar format:

        +
        +BEGIN:VCALENDAR
        +BEGIN:VEVENT
        +DTSTART:20110714T150000Z
        +DTEND:20110715T173000Z
        +SUMMARY:Prepare team meeting
        +END:VEVENT
        +END:VCALENDAR
        +
        + +

        To convert the events to iCalendar format and back:

          -
        • To convert an iCalendar string to a calendar event: +
        • To convert an iCalendar string to an event:
          1. Retrieve the default system calendar using the getDefaultCalendar() method of the CalendarManager interface.

            With the parameter, specify the calendar type as event.

             var calendar = tizen.calendar.getDefaultCalendar("EVENT");
          2. @@ -404,9 +380,9 @@ try    console.log('Event added with UID ' + ev.id.uid); }

          To convert multiple strings and import them to a calendar, convert the strings one by one and then use the addBatch() method to add all the events at once in a batch mode.

        • -
        • To convert a calendar event to the iCalendar format: +
        • To convert an event to the iCalendar format:
            -
          1. Get the default calendar and find all calendar events which include the "Tizen" string in the Summary attribute:
            +     
          2. Get the default calendar and find all events which include the "Tizen" string in the Summary attribute:
             var myCalendar;
             
             myCalendar = tizen.calendar.getDefaultCalendar("EVENT");
            @@ -417,7 +393,7 @@ var filter = new tizen.AttributeFilter("summary", "CONTAINS"
             /* Search for the events */
             myCalendar.find(eventSearchSuccessCallback, errorCallback, filter);
             
          3. -
          4. Convert a calendar event to an iCalendar string in the success event handler of the find() method using the convertToString() method:
            +     
          5. Convert an event to an iCalendar string in the success event handler of the find() method using the convertToString() method:
             function eventSearchSuccessCallback(events)
             {
                /* Convert the first event */
            @@ -427,10 +403,21 @@ function eventSearchSuccessCallback(events)
                 

          To export and convert multiple events from a calendar, find the required events using the find() method with an applicable filter, and then convert the found events one by one.

        - -

        Adding Tasks to a Calendar

        + +

        Tasks

        + +

        The tasks are identified using the CalendarTaskId, which is a CalendarItemId typedef.

        + +

        Using the CalendarTask object, you can:

        +
          +
        • Add tasks to a calendar one by one or in a batch mode.
        • +
        • Update or delete tasks one by one or in a batch mode.
        • +
        • Convert tasks to the iCalendar format and back.
        • +
        + +

        Adding Tasks to a Calendar

        -

        To create engaging applications with various calendar features, you must learn to add tasks to calendars:

        +

        To add tasks to a calendar:

        1. Retrieve the default system calendar using the getDefaultCalendar() method of the CalendarManager interface.

          With the parameter, specify the calendar type as task.

           var calendar = tizen.calendar.getDefaultCalendar("TASK");
          @@ -454,9 +441,9 @@ task.alarms = [alarm];
                
        2. Add the CalendarTask object to the default calendar with the add() method of the Calendar object:

          calendar.add(task);  /* task.id attribute is generated */
        -

        Adding Tasks to a Calendar in the Batch Mode

        - -

        To create engaging applications with various calendar features, you must learn to add tasks to calendars in the batch mode:

        +

        Adding Tasks to a Calendar in the Batch Mode

        +

        You can create multiple tasks simultaneously by using the addBatch() method.

        +

        To add tasks to a calendar in the batch mode:

        1. Retrieve the default system calendar using the getDefaultCalendar() method of the CalendarManager interface:

           var calendar = tizen.calendar.getDefaultCalendar("TASK");
          @@ -499,25 +486,16 @@ calendar.addBatch([task]);
           
        -

        Managing a Single Calendar Task

        +

        Managing a Single Task

        -

        To create engaging applications with various calendar features, you must learn to manage a single calendar task:

        +

        To manage a single task:

        1. Retrieve the default system calendar using the getDefaultCalendar() method of the CalendarManager interface.

          With the parameter, specify the calendar type as task.

           var myCalendar = tizen.calendar.getDefaultCalendar("TASK");
           
        2. Retrieve all tasks stored in the calendar by using the find() method of the Calendar object:

           myCalendar.find(taskSearchSuccessCallback);
          - - - - - - - - - -
          Note
          To retrieve a specific set of tasks, you can specify a filter and sorting order for the search operation through the filter and sortMode parameters (for attributes supported in the filter, see Calendar Filter Attributes).

          In this example, all the tasks are retrieved because no filter is used.

        3. +

          When searching for calendar items, you can create attribute filters, attribute range filters, and composite filters based on specific filter attributes. You can also sort the search results. In this example, all the events are retrieved because no filter is used.

        4. Update or delete the found item inside the taskSearchSuccessCallback() event handler.

          In this example, the description parameter of the first task is changed and the task is updated in the calendar using the update() method. The second task is deleted using the remove() method.

          /* Define the event success callback */
           function taskSearchSuccessCallback(tasks)
           {
          @@ -530,25 +508,16 @@ function taskSearchSuccessCallback(tasks)
           }
        -

        Managing Multiple Calendar Tasks in the Batch Mode

        - -

        To create engaging applications with various calendar features, you must learn to manage multiple calendar tasks in the batch mode:

        +

        Managing Multiple Tasks in the Batch Mode

        +

        You can manage multiple tasks simultaneously by using the applicable batch methods: updateBatch() and removeBatch().

        +

        To manage multiple tasks in the batch mode:

        1. Retrieve the default system calendar using the getDefaultCalendar() method of the CalendarManager interface.

          With the parameter, specify the calendar type as task.

           var myCalendar = tizen.calendar.getDefaultCalendar("TASK");
           
        2. Retrieve all tasks stored in the calendar by using the find() method of the Calendar object:

           myCalendar.find(taskSearchSuccessCallback);
          - - - - - - - - - -
          Note
          To retrieve a specific set of tasks, you can specify a filter and sorting order for the search operation through the filter and sortMode parameters (for attributes supported in the filter, see Calendar Filter Attributes).

          In this example, all the tasks are retrieved because no filter is used.

        3. +

          When searching for calendar items, you can create attribute filters, attribute range filters, and composite filters based on specific filter attributes. You can also sort the search results. In this example, all the events are retrieved because no filter is used.

        4. To update tasks:
          1. Define the items to be updated in the success event handler of the find() method:

            @@ -572,11 +541,23 @@ function taskSearchSuccessCallback(tasks)
             
          -

          Converting Calendar Task Formats

          - -

          The following examples illustrate how to make calendar task exchange more efficient in your application by converting the calendar task to iCalendar format or the other way around using the CalendarTask constructor and the convertToString() method of the Calendar object respectively:

          +

          Converting Task Formats

          +

          You can make task exchange more efficient in your application by converting a task to the iCalendar format (or back) using the CalendarTask object constructor and the convertToString() method of the CalendarItem interface.

          +

          The conversion allows you to exchange calendar data between applications by sharing files with the .ics extension. The iCalendar format is independent of the underlying transport protocol, meaning that calendar items can be exchanged using a variety of transports, including HTTP, SMTP, and Infrared. The iCalendar format can be used to store calendar item information and exchange calendar data over the Internet.

          +

          The following example shows a sample task in the iCalendar format:

          +
          +BEGIN:VCALENDAR
          +BEGIN:VTODO
          +DTSTAMP:TZID=CET:20110902T110000Z
          +DTSTART:TZID=CET:20110906T140000Z
          +DUE:TZID=CET:20110906T150000Z
          +SUMMARY:Prepare team meeting
          +END:VTODO
          +END:VCALENDAR
          + +

          To convert the task to iCalendar format and back:

            -
          • To convert an iCalendar string to a calendar task: +
          • To convert an iCalendar string to a task:
            1. Retrieve the default system calendar using the getDefaultCalendar() method of the CalendarManager interface.

              With the parameter, specify the calendar type as task.

               var calendar = tizen.calendar.getDefaultCalendar("TASK");
            2. @@ -600,7 +581,7 @@ calendar.add(task); console.log('Task added with id ' + task.id);

            To convert multiple strings and import them to a calendar, convert the strings one by one and then use the addBatch() method to add all the tasks at once in a batch mode.

          • -
          • To convert a calendar task to the iCalendar format: +
          • To convert a task to the iCalendar format:
            1. Get the default calendar and find all calendar items which include the "Tizen" string in the Summary attribute:
               var myCalendar;
              @@ -622,10 +603,13 @@ function taskSearchSuccessCallback(tasks)
               

            To export and convert multiple tasks from a calendar, find the required tasks using the find() method with an applicable filter, and then convert the found tasks one by one.

          - +

          Receiving Notifications on Calendar Changes

          - -

          To create engaging applications with various calendar features, you must learn to receive notifications when calendar items are added, updated, or removed:

          +

          You can keep the calendar in your application synchronized with user-specific calendars by receiving notifications in your application when calendar items are added, updated, or deleted. Every change made to the calendar database triggers an event for which you can define a notification. For batch mode operations, each operation generates only a single event. A recurring event is treated as one event.

          + +

          The addChangeListener() method of the Calendar interface registers an event listener, which starts asynchronously once the addChangeListener() method returns the subscription identifier for the listener. You can use the CalendarChangeCallback interface to define listener event handlers for receiving the notifications.

          + +

          To receive notifications when calendar items are added, updated, or removed:

          1. Define the needed variables:

             /* Watcher identifier */
            diff --git a/org.tizen.guides/html/web/personal/call_history_w.htm b/org.tizen.guides/html/web/personal/call_history_w.htm
            index 614a120..6aa45c8 100644
            --- a/org.tizen.guides/html/web/personal/call_history_w.htm
            +++ b/org.tizen.guides/html/web/personal/call_history_w.htm
            @@ -51,25 +51,17 @@
               
               

            The main features of the Call History API include:

            + +

            For a practical example of managing call logs in your application, see the Call Log sample task.

            -

            Before you start, remember to prepare your application to use the call history functionality.

            - -

            Warm-up

            -

            Become familiar with the Call History API basics by learning about:

            - -

            Task

            -

            In the Call Log task, we will walk through how to manage call logs in your application.

            - -

            Prerequisites

            +

            Prerequisites

            To use the Call History API, the application has to request permission by adding the following privileges to the config.xml file:

             <tizen:privilege name="http://tizen.org/privilege/callhistory.read"/>
            @@ -91,9 +83,11 @@
                   /* Process the CallHistoryEntry */
                }
             }
          2. -
          3. Use the filter parameter of the find() method to define a filter for the query result set. A filter with the CallHistoryEntry attributes is used to limit the results of the call history search.

            You can define various filters:

            +
          4. Use the filter parameter of the find() method to define a filter for the query result set. A filter with the CallHistoryEntry attributes is used to limit the results of the call history search.

            +

            When searching for call history items, you can create attribute filters, attribute range filters, and composite filters based on specific filter attributes.

            +

            You can define various filters:

              -
            • The AttributeFilter type is used to search based on a single CallHistoryEntry attribute (for attributes supported in the filter, see CallHistory Filter Attributes).

              For example, the following filters define that only cellular calls or calls where the remote party has the telephone number 123456789 are included in the query results:

              /* First filter example */
              +     
            • The AttributeFilter type is used to search based on a single CallHistoryEntry attribute.

              For example, the following filters define that only cellular calls or calls where the remote party has the telephone number 123456789 are included in the query results:

              /* First filter example */
               var filter = new tizen.AttributeFilter("type", "EXACTLY", "TEL");
               
               /* Second filter example */
              @@ -116,7 +110,7 @@ var tfilter = new tizen.AttributeFilter("features", "EXACTLY"
               /* Combine the filters into a set */
               var ifilter = new tizen.CompositeFilter("INTERSECTION", [numberFilter, dataFilter, tfilter]);
          5. -
          6. Use the sortMode parameter to order the query result set. If the parameter is undefined or set to null, the results are sorted by default in a descending order.

            In the following code snippet, the found call history items are sorted according to the start time, in descending order:

            var sortMode = new tizen.SortMode("startTime", "DESC");
          7. +
          8. Use the sortMode parameter to order the query result set. If the parameter is undefined or set to null, the results are sorted by default in a descending order.

            In the following code snippet, the found call history items are sorted according to the start time, in descending order:

            var sortMode = new tizen.SortMode("startTime", "DESC");
          9. Use the limit and offset parameters of the find() method to specify the starting point and upper limit of the results that are returned.

            The limit parameter specifies the maximum number of matching results that are returned (the value 0 makes the limit infinite), while the offset parameter skips that many matching results that are to be returned (the value 0 means nothing is skipped).

            For example, if your search results consist of 100 matching results and you have specified an offset of 10 and a limit of 20, you get the objects from 10-29. The matching results from 0-9 are skipped due to the offset, and the 20 results starting from the first result after the offset are returned.

          diff --git a/org.tizen.guides/html/web/personal/contacts_w.htm b/org.tizen.guides/html/web/personal/contacts_w.htm index 15d83b1..4f89a0e 100644 --- a/org.tizen.guides/html/web/personal/contacts_w.htm +++ b/org.tizen.guides/html/web/personal/contacts_w.htm @@ -38,8 +38,6 @@
        5. Adding a Contact
        6. Managing a Contact
        7. Receiving Notifications on Contact Changes
        8. -
        9. Importing Contacts
        10. -
        11. Exporting Contacts
        12. Multiple contacts @@ -54,6 +52,12 @@
        13. Managing Persons
        14. +
        15. vCard conversions + +
        16. Related Info

            @@ -69,20 +73,23 @@

            Contacts

            -

            Tizen enables you to manage the contacts and persons listed in your address books. A Contact object is always associated with a specific address book. A Person object is an aggregation of one or more contacts associated with the same person.

            +

            Tizen enables you to manage the contacts and persons listed in your address books. A Contact object is always associated with a specific address book. A Person object is an aggregation of one or more contacts associated with the same person.

            This feature is supported in mobile applications only.

            -

            Before you start, remember to prepare your application to use the contact functionality.

            - -

            The main features of the Contact API include:

            +

            The main features of the Contact API include:

              -
            • Address book management -

              You can create a new address book using the addAddressBook() method of the ContactManager interface (you also need the Account API).

              -

              To access an existing contact, you must first retrieve the Contact object from the applicable address book. To access the device address books, you can use the getDefaultAddressBook() method of the ContactManager interface to retrieve the default address book, or the getAddressBooks() method to retrieve all the available address books as an array. To get a specific address book, use the getAddressBook() method.

              -
            • -
            • Contact management

              You can add and manage a contact by using the applicable methods of the AddressBook interface. When managing a single contact at a time, the operations are handled in a synchronous mode.

              You can create and manage multiple contacts simultaneously by using the applicable batch methods: addBatch(), updateBatch(), and removeBatch(). The batch mode provides faster, optimized processing of multiple contacts.

              - +
            • Address book management +

              You can create a new address book, or access the device address books to access existing contacts.

              +
            • +
            • Contact management +

              You can add and manage a single contact at a time using synchronous operations.

              +

              You can also keep the address book in your application synchronized with an external contact manager by receiving notifications in your application when contact information changes. Every change made to the address book triggers an event for which you can define a notification.

              +
            • +
            • Group and multiple contact management +

              You can manage contact groups, including getting, updating, and deleting them, using the applicable methods of the AddressBook interface.

              +

              You can also create and manage multiple contacts simultaneously using the batch mode. The batch mode provides faster, optimized processing of multiple contacts.

              +
            • @@ -91,61 +98,19 @@ -
              NoteThe batch mode does not provide progress information about operations. To ensure that you can view the progress, break the batch operation down into multiple smaller batch operations. For example, break down a batch of 100 update requests into 10 batch operations that update 10 records at a time. Additionally, breaking down a batch operation helps you avoid blocking other database operations, such as add or remove.
              -

              When searching for contacts, you can create attribute filters, attribute range filters, and composite filters based on specific filter attributes. You can also sort the search results.

            • -
            • Group management

              You can manage contact groups, including getting, updating, and deleting them, using the applicable methods of the AddressBook interface.

            • -
            • Contact change notifications

              You can keep the address book in your application synchronized with external contact manager by receiving notifications in your application when contact information changes.

              The addChangeListener() method of the Addressbook interface registers an event listener, which starts asynchronously once the addChangeListener() method returns the subscription identifier for the listener. You can use the AddressBookChangeCallback interface to define listener event handlers for receiving the notifications.

              - - - - - - - - - -
              Note
              The listener object that is the first argument of the addChangeListener() method must have at least 1 event handler defined. If no handlers are defined, a TypeMismatchError error occurs.

              Every change made to the address book triggers an event for which you can define a notification. For batch mode operations, each requested batch operation generates only a single event.

            • -
            • Person management

              You can manage persons, including searching, updating, and deleting, by using the applicable methods of the ContactManager interface. When managing a single person at a time, the operations are handled in a synchronous mode.

              You can handle multiple persons simultaneously using the applicable batch methods: updateBatch() and removeBatch().

              -

              You can get the total number of each person's calls, messages, and emails by using the getUsageCount() function. You can also reset the usage count of a person using the resetUsageCount() function of the Person interface, which works in a synchronous mode. To reset the usage count for multiple persons, use the resetUsageCountBatch() function, which works in an asynchronous mode.

              -

              Persons are automatically added or modified when contacts are added to or unlinked from existing persons. You cannot add persons directly.

              When searching for persons, you can filter and sort the search results based on specific filter attributes.

            • -
            • vCard format conversions

              You can convert the contacts to vCard format or back to import and export contacts.

              The vCard (RFC 2426) file format (.vcf or .vcard) is a standard for electronic business cards, which contain contact information, such as name, address, phone numbers, email addresses, URLs, logos, photographs, and audio clips.

              The Contact API supports vCard version 3.0.

            • + +

              If you want to receive notifications for batch mode operations, note that each requested batch operation generates only a single event.

              + + +
            • Person management +

              You can manage persons using the applicable methods of the ContactManager interface.

              +

              Persons are automatically added or modified when contacts are added to or unlinked from existing persons. You cannot add persons directly.

              +
            • +
            • vCard format conversions +

              You can convert the contacts to vCard format or back to import and export contacts.

              +

              The vCard (RFC 2426) file format (.vcf or .vcard) is a standard for electronic business cards, which contain contact information, such as name, address, phone numbers, email addresses, URLs, logos, photographs, and audio clips.

              The Contact API supports vCard version 3.0.

            -

            Warm-up

            -

            Become familiar with the Contact API basics by learning about:

            - - -

            Prerequisites

            To use the Contact API, the application has to request permission by adding the following privileges to the config.xml file:

            @@ -155,8 +120,6 @@
             
               

            Creating an Address Book

            -

            Creating a new address book is a basic contact management skill:

            - @@ -167,6 +130,8 @@
            + +

            To create a new address book:

            1. Declare a variable to store the created address book:
              var myAddressBook = null;
              @@ -190,9 +155,9 @@

        Getting Address Books

        - -

        To create engaging applications with various contacts features, you must learn to access the address books in which the contacts are listed:

        -
          +

          You must retrieve the Contact object from the applicable address book to access an existing contact.

          +

          To access the address books in which the contacts are listed:

          +
          • To get the default address book, use the getDefaultAddressBook() method of the ContactManager interface to retrieve the default address book as an AddressBook object:

             var myAddressbook;
             
            @@ -217,11 +182,11 @@ tizen.contact.getAddressBooks(addressBooksCB);
                

            All available address books on the device are retrieved. You can use an AddressBook object ID to select a specific address book with the getAddressBook() method, if you know the ID of the address book in advance.

          • -
        +

        Adding a Contact

        - -

        To create engaging applications with various contacts features, you must learn to add a contact to an address book:

        +

        You can add a contact using the applicable methods of the AddressBook interface.

        +

        To add a contact to an address book:

        1. Retrieve the default system address book using the getDefaultAddressBook() method of the ContactManager interface:

           var addressbook = tizen.contact.getDefaultAddressBook();
          @@ -233,15 +198,15 @@ var contact = new tizen.Contact
              emails: [new tizen.ContactEmailAddress("user@example.com")]
           });
           
        2. -
        3. Add the Contact object to the default address book with the add() method of the AddressBook interface:

          addressbook.add(contact);
        4. +
        5. Add the Contact object to the default address book with the add() method of the AddressBook interface:

          addressbook.add(contact);

        Managing a Contact

        - -

        To create engaging applications with various contacts features, you must learn to manage a contact in your address book:

        +

        You can manage a contact by using the applicable methods of the AddressBook interface. When managing a single contact at a time, the operations are handled in a synchronous mode.

        +

        To manage a contact in your address book:

          -
        1. To retrieve a single contact, use the get() method of the AddressBook interface with the ContactID as a parameter: -

          The following example uses the object of the ContactRef interface. The ContactRef object contains both AddressBook ID and Contact ID.

          +   
        2. To retrieve a single contact, use the get() method of the AddressBook interface with the ContactID as a parameter: +

          The following example uses the object of the ContactRef interface. The ContactRef object contains both AddressBook ID and Contact ID.

           /* contactRef is retrieved by other APIs */
           var contactRef;
           try
          @@ -256,7 +221,7 @@ try
                
        3. Retrieve the default address book using the getDefaultAddressBook() method of the ContactManager interface.

           var addressbook = tizen.contact.getDefaultAddressBook();
           
        4. -
        5. Retrieve contacts stored in the address book by using the find() method of the AddressBook interface:

          +     
        6. Retrieve contacts stored in the address book by using the find() method of the AddressBook interface:

           var filter = new tizen.AttributeFilter("name.firstName", "CONTAINS", "Chris");
           var sortMode = new tizen.SortMode("name.lastName", "ASC");
           
          @@ -264,16 +229,9 @@ try
           {
              addressbook.find(contactsFoundCB, null, filter, sortMode);
           }
          - - - - - - - - - -
          Note
          To retrieve a specific contact, you can specify a filter and sorting order for the search operation through the filter and sortMode parameters (for attributes supported in the filter, see Contact Filter Attributes).

          In this example, contacts whose first name contains "Chris" are retrieved and sorted in the ascending order based on their last name. The filter includes the standard English characters in the uppercase and lowercase. The entire list consists of ASCII characters from 32 to 126, and from 160 to 255.

          The contacts that match the filter are passed as an array to the registered success event handler in the selected sorting order.

        7. + +

          When searching for contacts, you can create attribute filters, attribute range filters, and composite filters based on specific filter attributes. You can also sort the search results. In this example, contacts whose first name contains "Chris" are retrieved and sorted in the ascending order based on their last name. The filter includes the standard English characters in the uppercase and lowercase. The entire list consists of ASCII characters from 32 to 126, and from 160 to 255.

          +

          The contacts that match the filter are passed as an array to the registered success event handler in the selected sorting order.

        8. Update or delete the found contact inside the contactsFoundCB event handler.

          In this example, the first name of the first contact is changed and the contact is updated in the address book using the update() method. The second contact is deleted using the remove() method.

          /* Define the event success callback */
           function contactsFoundCB(contacts)
           {
          @@ -291,8 +249,10 @@ function contactsFoundCB(contacts)
             

        Receiving Notifications on Contact Changes

        - -

        To create engaging applications with various contacts features, you must learn to receive notifications when contacts are added, updated, or removed:

        +

        You can keep the address book in your application synchronized with the external contact manager by receiving notifications in your application when contact information is added, updated, or deleted.

        +

        The addChangeListener() method of the AddressBook interface registers an event listener, which starts asynchronously once the addChangeListener() method returns the subscription identifier for the listener. You can use the AddressBookChangeCallback interface to define listener event handlers for receiving the notifications.

        + +

        To receive notifications when contact information changes:

        1. Define the needed variables:

           /* Watcher identifier */
          @@ -301,7 +261,7 @@ var watcherId = 0;
           /* This example assumes that the address book is initialized */
           var addressbook;
           
        2. -
        3. Define the event handlers for different notifications about changes in the selected address book using the AddressBookChangeCallback listener interface:

          +   
        4. Define the event handlers for different notifications about changes in the selected address book using the AddressBookChangeCallback listener interface:

           var watcher =
           {
              /* When contacts are added */
          @@ -325,67 +285,26 @@ var watcher =
           
        5. Register the listener to use the defined event handlers:

           watcherId = addressbook.addChangeListener(watcher);
          -
        6. -
        7. To stop the notifications, use the removeChangeListener() method of the AddressBook interface:

          +
          + + + + + + + + + +
          Note
          The listener object that is the first argument of the addChangeListener() method must have at least 1 event handler defined. If no handlers are defined, a TypeMismatchError error occurs.
        8. +
        9. To stop the notifications, use the removeChangeListener() method of the Addressbook interface:

           addressbook.removeChangeListener(watcherId);
           
        - -

        Importing Contacts

        -

        To create engaging applications with various contacts features, you must learn to import contacts with the help of the vCard format:

        - -
          -
        1. Retrieve the default system address book using the getDefaultAddressBook() method of the ContactManager interface:

          -var addressbook = tizen.contact.getDefaultAddressBook();
          -
        2. -
        3. Create a new Contact object from the vCard string and add it to the default address book:

          -var contact = null;
          -
          -try
          -{
          -   contact = new tizen.Contact("BEGIN:VCARD\n"+
          -                               "VERSION:3.0\n"+
          -                               "N:Gump;Forrest\n"+
          -                               "FN:Forrest Gump\n"+
          -                               "ORG:Bubba Gump Shrimp Co.\n"+
          -                               "TITLE:Shrimp Man\n"+
          -                               "TEL;WORK:(111) 555-1212\n"+
          -                               "TEL;HOME:(404) 555-1212\n"+
          -                               "EMAIL;WORK;PREF:forrestgump@example.com\n"+
          -                               "END:VCARD");
          -
          -   addressbook.add(contact);
          -   console.log("Contact was added with ID " + contact.id);
          -}
        4. -

        To convert multiple strings and import them to an address book, convert the strings one by one and then use the addBatch() method of the AddressBook interface to add all the contacts at once in the batch mode.

        - -

        Exporting Contacts

        - -

        To create engaging applications with various contacts features, you must learn to export contacts with the help of the vCard format:

        -
          -
        1. Retrieve the default system address book using the getDefaultAddressBook() method of the ContactManager interface and find all contacts with "Chris" in the first name:

          -var addressbook;
          -
          -var addressbook = tizen.contact.getDefaultAddressBook();
          -
          -/* Define a filter */
          -var filter = new tizen.AttributeFilter("name.firstName", "CONTAINS", "Chris");
          -
          -/* Search for the contacts */
          -addressbook.find(contactsFoundCB, errorCB, filter);
          -
        2. -
        3. Convert a contact to a vCard string in the success event handler of the find() method.

          In the following example, the first found contact is exported by converting it to the vCard version 3.0 format.

          -function contactsFoundCB(contacts)
          -{
          -   /* Convert the first contact */
          -   var vcard = contacts[0].convertToString("VCARD_30");
          -}
        4. -

        Adding Multiple Contacts in the Batch Mode

        - -

        To create engaging applications with various contacts features, you must learn to add multiple contacts to an address book in the batch mode:

        +

        You can create multiple contacts simultaneously using the addBatch() method.

        +

        To add multiple contacts to an address book in the batch mode:

        1. Retrieve the default system address book using the getDefaultAddressBook() method of the ContactManager interface:

           addressbook = tizen.contact.getDefaultAddressBook();
          @@ -412,7 +331,7 @@ addressbook.addBatch([c1, c2]);
                  Note
                 
                 
          -       The addBatch(), updateBatch(), and removeBatch() methods are asynchronous. Provide success and error callbacks with them.
          +       The addBatch() method is asynchronous. Make sure you provide success and error callbacks with it.
                 
                
               
          @@ -420,8 +339,8 @@ addressbook.addBatch([c1, c2]);
               

        Managing Multiple Contacts in the Batch Mode

        - -

        To create engaging applications with various contacts features, you must learn to manage multiple contacts in your address books in the batch mode:

        +

        You can manage multiple contacts simultaneously using the applicable batch methods: updateBatch() and removeBatch().

        +

        To manage multiple contacts in your address books in the batch mode:

        1. Retrieve the default address book using the getDefaultAddressBook() method of the ContactManager interface.

           var addressbook = tizen.contact.getDefaultAddressBook();
          @@ -433,7 +352,9 @@ var sortMode = new tizen.SortMode("name.lastName", "ASC");
           try
           {
              addressbook.find(contactsFoundCB, null, filter, sortMode);
          -}
        2. +} +

          When searching for contacts, you can create attribute filters, attribute range filters, and composite filters based on specific filter attributes. You can also sort the search results. In this example, contacts whose first name contains "Chris" are retrieved and sorted in the ascending order based on their last name.

          +
        3. To update contacts:
          1. Define the contact changes to be made in the success event handler of the find() method:

            @@ -459,10 +380,21 @@ function contactsFoundCB(contacts)
             }
             
          + + + + + + + + + + +
          Note
          The updateBatch() and removeBatch() methods are asynchronous. Make sure you provide success and error callbacks with them.

          Managing Contact Groups

          -

          To create engaging applications with various contact features, you must learn to manage contact groups:

          +

          To create engaging applications with various contact features, learn to manage contact groups:

          1. Retrieve the default system address book using the getDefaultAddressBook() method of the ContactManager interface:

            @@ -520,16 +452,20 @@ try
                           
               

            Managing Persons

            -

            To create engaging applications with various contacts features, you must learn to manage persons in your contact database:

            -
              +

              You can manage persons, including searching, updating, and deleting, using the applicable methods of the ContactManager interface.

              +

              To manage persons in your contact database:

              +
              • To manage a single person: -
                  -
                1. To retrieve persons, use the find() method of the ContactManager interface.

                  +

                  When you are managing a single person at a time, the operations are handled in a synchronous mode.

                  +
                    +
                  1. To retrieve persons, use the find() method of the ContactManager interface.

                    You can retrieve the most frequently used persons using the sort mode as the final parameter.

                     var sortMode = new tizen.SortMode("usageCount", "ASC");
                     tizen.contact.find(personsFoundCB, personsErrorCB, null, sortMode);
                    -
                  2. +
            +

            When searching for persons, you can create attribute filters, attribute range filters, and composite filters based on specific filter attributes. You can also sort the search results. In this example, all contacts are retrieved (since no filter is defined), and the result is sorted in the ascending order based on the most frequently used persons.

            +
          2. Update or delete the found persons in the personsFoundCB() event handler. In this example, the favorite flag of the first person is changed and the contact is updated using the update() method. The second person is deleted using the remove() method.

            /* Define the event success callback */
             function personsFoundCB(persons)
            @@ -545,9 +481,10 @@ function personsFoundCB(persons)
                }
             }
        4. +
        5. To handle multiple persons simultaneously, use the applicable batch methods: updateBatch() and removeBatch().
        6. To merge multiple persons into a single person item: -
            +
            1. Retrieve the persons as described above.
            2. Define the persons to be merged in the personsFoundCB() event handler:

              function personsFoundCB(persons)
               {
              @@ -558,6 +495,7 @@ function personsFoundCB(persons)
               }
          1. To get and reset the number of person's calls, messages, and emails: +

            You can get the total number of each person's calls, messages, and emails by using the getUsageCount() function. You can also reset the usage count of a person using the resetUsageCount() function of the Person interface, which works in a synchronous mode. To reset the usage count for multiple persons, use the resetUsageCountBatch() function, which works in an asynchronous mode.

            • Retrieve the total number of calls, messages, and emails of a particular person:

              @@ -602,8 +540,61 @@ tizen.contact.resetUsageCountBatch([person1_id, person2_id], 'INCOMING_CALLS
               
          2. -
          + + + +

          Importing Contacts

          + +

          To create engaging applications with various contacts features, import contacts with the help of the vCard format:

          +
            +
          1. Retrieve the default system address book using the getDefaultAddressBook() method of the ContactManager interface:

            +var addressbook = tizen.contact.getDefaultAddressBook();
            +
          2. +
          3. Create a new Contact object from the vCard string and add it to the default address book:

            +var contact = null;
            +
            +try
            +{
            +   contact = new tizen.Contact("BEGIN:VCARD\n"+
            +                               "VERSION:3.0\n"+
            +                               "N:Gump;Forrest\n"+
            +                               "FN:Forrest Gump\n"+
            +                               "ORG:Bubba Gump Shrimp Co.\n"+
            +                               "TITLE:Shrimp Man\n"+
            +                               "TEL;WORK:(111) 555-1212\n"+
            +                               "TEL;HOME:(404) 555-1212\n"+
            +                               "EMAIL;WORK;PREF:forrestgump@example.com\n"+
            +                               "END:VCARD");
            +
            +   addressbook.add(contact);
            +   console.log("Contact was added with ID " + contact.id);
            +}
          4. +

          To convert multiple strings and import them to an address book, convert the strings one by one and then use the addBatch() method of the AddressBook interface to add all the contacts at once in the batch mode.

          + +

          Exporting Contacts

          + +

          To create engaging applications with various contacts features, export contacts with the help of the vCard format:

          +
            +
          1. Retrieve the default system address book using the getDefaultAddressBook() method of the ContactManager interface and find all contacts with "Chris" in the first name:

            +var addressbook;
            +
            +var addressbook = tizen.contact.getDefaultAddressBook();
            +
            +/* Define a filter */
            +var filter = new tizen.AttributeFilter("name.firstName", "CONTAINS", "Chris");
            +
            +/* Search for the contacts */
            +addressbook.find(contactsFoundCB, errorCB, filter);
            +
          2. +
          3. Convert a contact to a vCard string in the success event handler of the find() method.

            In the following example, the first found contact is exported by converting it to the vCard version 3.0 format.

            +function contactsFoundCB(contacts)
            +{
            +   /* Convert the first contact */
            +   var vcard = contacts[0].convertToString("VCARD_30");
            +}
          4. +
          + diff --git a/org.tizen.guides/html/web/personal/sync_w.htm b/org.tizen.guides/html/web/personal/sync_w.htm index 3b2b388..3ccc5aa 100644 --- a/org.tizen.guides/html/web/personal/sync_w.htm +++ b/org.tizen.guides/html/web/personal/sync_w.htm @@ -48,13 +48,15 @@

          The main features of the Data Synchronization API include:

            -
          • Checking for free profile slot

            Tizen sets a limitation on the number of supported OMA DS profiles on the device, so you must first check whether there is a profile slot available.

            You can check whether sync profile slots are available using the getProfilesNum() and getMaxProfilesNum() methods of the DataSynchronizationManager interface.

          • -
          • Creating a sync profile

            You can create a profile using the SyncProfileInfo interface. You can define the profile name and provide various information defined using the SyncInfo and SyncServiceInfo interfaces.

          • -
          • Retrieving synchronization process information

            After starting the synchronization process using the startSync() method of the DataSynchronizationManager interface, you can monitor the progress of the operation. Use the SyncProgressCallback interface to define listeners for receiving notifications. After the synchronization is completed, you can retrieve statistics using the getLastSyncStatistics() method.

          • +
          • Creating a sync profile +

            You can create a profile, define the profile name, and provide other profile and operation information using the applicable interfaces.

            +

            Tizen sets a limitation on the number of supported OMA DS profiles on the device. Before creating a new profile, you must check whether sync profile slots are available.

            +
          • +
          • Retrieving synchronization process information +

            After starting the synchronization process, you can monitor the progress of the operation.

            +
          -

          Before you start, remember to prepare your application to use the data synchronization functionality.

          - @@ -65,22 +67,8 @@
          - -

          Warm-up

          -

          Become familiar with the Data Synchronization API basics by learning about:

          - - -

          Prerequisites

          - + +

          Prerequisites

          To use the Data Synchronization API, the application has to request permission by adding the following privilege to the config.xml file:

          @@ -89,10 +77,10 @@
           
           
           

          Creating a Sync Profile

          - -

          To be able to synchronize your device data, such as contacts and calendar events, with the OMA DS server, you must learn how to create a sync profile:

          + +

          To create a sync profile:

            -
          1. Check whether there are available profile slots on the device:

            +   
          2. Check whether there are available profile slots on the device using the getProfilesNum() and getMaxProfilesNum() methods of the DataSynchronizationManager interface:

             var numMaxProfiles = tizen.datasync.getMaxProfilesNum();
             var numProfiles = tizen.datasync.getProfilesNum();
             
          3. @@ -105,17 +93,17 @@ if ((numMaxProfiles <= 0) || (numProfiles < numMaxProfiles))    var serviceInfo = [contactInfo, eventInfo];    var profile = new tizen.SyncProfileInfo("MyProfile", syncInfo, serviceInfo);
          4. -
          5. To be able to use the created profile, add it to your device using the add() method of the DataSynchronizationManager interface:

            +   
          6. To be able to use the created profile, add it to your device using the add() method of the DataSynchronizationManager interface:

                tizen.datasync.add(profile);
                var profileId = profile.profileId;
             }

          Starting and Monitoring Data Synchronization

          - -

          Learning how to start and monitor the data synchronization process is a basic data management skill:

          +

          After starting the synchronization process using the startSync() method of the DataSynchronizationManager interface, you can monitor the progress of the operation. Use the SyncProgressCallback interface to define listeners for receiving notifications. After the synchronization is completed, you can retrieve statistics using the getLastSyncStatistics() method.

          +

          To start and monitor the data synchronization process:

            -
          1. Define the event handlers for the notifications using the SyncProgressCallback listener interface:

            +   
          2. Define the event handlers for the notifications using the SyncProgressCallback listener interface:

             var syncCallback =
             {
                onprogress: function(profileId, serviceType, isFromServer, totalPerType, syncedPerType)
            diff --git a/org.tizen.guides/html/web/security/secure_key_w.htm b/org.tizen.guides/html/web/security/secure_key_w.htm
            index d56fb80..e5dedcc 100644
            --- a/org.tizen.guides/html/web/security/secure_key_w.htm
            +++ b/org.tizen.guides/html/web/security/secure_key_w.htm
            @@ -28,7 +28,8 @@
             		
                     

            Content

            @@ -44,14 +45,23 @@

            Secure Key Management

            -

            The key manager provides functions to securely store keys, certificates, and sensitive data related to users and their password-protected applications. Additionally, it provides secure cryptographic operations for non-exportable keys without revealing the key values to clients.

            +

            The key manager allows you to control data access by securely storing in a central secure repository keys, certificates, and sensitive data related to users and their password-protected applications. Additionally, the key manager provides secure cryptographic operations for non-exportable keys without revealing the key values to clients. The central secure repository is protected by a password.

            The Key Manager API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

            -

            A key manager stores keys, certificates, and sensitive user data in a central secure repository. The central secure repository is protected by a password.

            -

            The main features of the Key Manager API include:

            +
              +
            • Saving data +

              You can save data to a repository, and define which applications are allowed to access and remove it.

            • +
            • Getting data +

              You can retrieve data from a repository. You can access both data that you have added yourself, and data that another application has added and granted you permissions to access.

            • +
            • Removing data +

              You can remove data from a repository. You can remove both data that you have added yourself, and data that another application has added and granted you permissions to remove.

            • +
            + +

            Data Access Control

            +

            With the key manager, you can control various security aspects of your application:

            • Data store policy

              A client can specify simple access rules when storing data in the key manager:

              @@ -75,25 +85,7 @@

            Figure: Key manager process

            -

            Key manager process

            - -

            The key manager provides secure repository APIs. All applications can use the secure repository APIs to:

            - - -

            Warm-up

            -

            Become familiar with the Key Manager API basics by learning about:

            - +

            Key manager process

            Saving Data

            diff --git a/org.tizen.guides/html/web/sensors/device_sensors_w.htm b/org.tizen.guides/html/web/sensors/device_sensors_w.htm index 479930b..b8dc22c 100644 --- a/org.tizen.guides/html/web/sensors/device_sensors_w.htm +++ b/org.tizen.guides/html/web/sensors/device_sensors_w.htm @@ -30,6 +30,7 @@
          3. Managing Sensors
          4. Receiving Notifications on Sensor Data Changes
          5. Obtaining Sensor Hardware Information
          6. +
          7. Supported Sensors
          8. Related Info

              @@ -50,7 +51,7 @@

              Device Sensors

              -

              Tizen provides interfaces and methods to manage sensor data from various sensors on the device. The main purpose of a sensor is to provide a value for the relevant environment parameter.

              +

              Tizen provides interfaces and methods to manage sensor data from various sensors on the device. The main purpose of a sensor is to provide a value for the relevant environment parameter.

              This feature is supported in mobile and wearable applications only.

              @@ -63,78 +64,15 @@
            • Obtaining sensor hardware information

              You can retrieve information about the technical limits of the sensor.

            -

            The supported sensor types and their capabilities are listed in the following table.

            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
            - Table: Sensors and capabilities -
            SensorCapability
            Light sensorhttp://tizen.org/feature/sensor.photometer
            Magnetic sensorhttp://tizen.org/feature/sensor.magnetometer
            Pressure sensorhttp://tizen.org/feature/sensor.barometer
            Proximity sensorhttp://tizen.org/feature/sensor.proximity
            Ultraviolet sensorhttp://tizen.org/feature/sensor.ultraviolet
            Heart rate monitor sensorhttp://tizen.org/feature/sensor.heart_rate_monitor
            Gravity sensor in wearable applications onlyhttp://tizen.org/feature/sensor.gravity
            Gyroscope sensor in wearable applications onlyhttp://tizen.org/feature/sensor.gyroscope
            Gyroscope rotation vector sensor in wearable applications onlyhttp://tizen.org/feature/sensor.gyroscope_rotation_vector
            Linear acceleration sensorhttp://tizen.org/feature/sensor.linear_acceleration
            - -

            Warm-up

            - -

            Become familiar with the Sensor API basics by learning about:

            - - -

            Task in Mobile Applications

            -

            In the Sensor Ball task, we will walk through simulating ball behavior to create a game.

            +

            For a practical example of simulating ball behavior to create a game, see the Sensor Ball mobile sample task.

            Managing Sensors

            - +

            Learning how to start, read and stop a sensor is a basic sensor management skill:

              -
            1. Check that the sensor is supported by the device using the getCapability() method of the SystemInfo interface (in mobile and wearable applications) for the proper capability related to the sensor:

              +
            2. Check that the sensor is supported by the device using the getCapability() method of the SystemInfo interface (in mobile and wearable applications) for the proper capability related to the sensor:

               var proximityCapability = tizen.systeminfo.getCapability("http://tizen.org/feature/sensor.proximity");
              @@ -304,6 +242,62 @@ proximitySensor.getSensorHardwareInfo(onsuccessCB, onerrorCB);
               
            +

            Supported Sensors

            + +

            The following table lists the sensor capabilities you can use to determine whether a specific sensor is supported on a device.

            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + Table: Sensors and capabilities +
            SensorCapability
            Light sensorhttp://tizen.org/feature/sensor.photometer
            Magnetic sensorhttp://tizen.org/feature/sensor.magnetometer
            Pressure sensorhttp://tizen.org/feature/sensor.barometer
            Proximity sensorhttp://tizen.org/feature/sensor.proximity
            Ultraviolet sensorhttp://tizen.org/feature/sensor.ultraviolet
            Heart rate monitor sensorhttp://tizen.org/feature/sensor.heart_rate_monitor
            Gravity sensor in wearable applications onlyhttp://tizen.org/feature/sensor.gravity
            Gyroscope sensor in wearable applications onlyhttp://tizen.org/feature/sensor.gyroscope
            Gyroscope rotation vector sensor in wearable applications onlyhttp://tizen.org/feature/sensor.gyroscope_rotation_vector
            Linear acceleration sensorhttp://tizen.org/feature/sensor.linear_acceleration
            +
            @@ -326,4 +320,4 @@ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga - + \ No newline at end of file diff --git a/org.tizen.guides/html/web/sensors/ham_w.htm b/org.tizen.guides/html/web/sensors/ham_w.htm index 9e473fc..aaef97e 100644 --- a/org.tizen.guides/html/web/sensors/ham_w.htm +++ b/org.tizen.guides/html/web/sensors/ham_w.htm @@ -34,6 +34,8 @@
          9. Receiving Notifications on Pedometer Data Changes
          10. Recognizing an Activity
          11. Monitoring Sleep
          12. +
          13. Supported Monitors
          14. +
          15. Supported Recorders
          16. Related Info

              @@ -46,7 +48,7 @@

              Human Activity Monitor

              -

              Tizen enables you to access and record human activity data from various sensors on the device.

              +

              Tizen enables you to access and record human activity data from various sensors and recorders on the device.

              This feature is supported in mobile and wearable applications only.

              @@ -64,93 +66,6 @@

              You can recognize activities, or determine whether the user is sleeping.

            -

            Before you start, remember to prepare your application to use the human activity monitor functionality.

            - -

            The supported monitor types and their capabilities are listed in the following table.

            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
            - Table: Human activity monitors and capabilities -
            MonitorCapabilityNotes
            Pedometer and accumulative pedometerhttp://tizen.org/feature/sensor.pedometerWhen the pedometer sensor is started, a change callback is invoked when data changes. Use the getHumanActivityData() method to get the current data. -

            The accumulative pedometer sensor does not have to be started by your application as long as step counting is enabled by any other application or the system. Listener registered with the setAccumulativePedometerListener() method is called when accumulative counters are changed.

            Wrist uphttp://tizen.org/feature/sensor.wrist_upThe wrist up sensor is notified when the relevant gesture is performed. The sensor must be enabled using the start() method. An event listener invoked when the gesture is detected. This sensor does not provide any data.
            Heart rate monitorhttp://tizen.org/feature/sensor.heart_rate_monitorWhen the heart rate monitor (HRM) sensor is started, a change callback is invoked when data changes. Use the getHumanActivityData() method to get the current data.
            GPShttp://tizen.org/feature/location.batchWhen the GPS sensor is started, a change callback is invoked when data changes. Use the getHumanActivityData() method to get the current data. -

            The GPS sensor provides both the current value and a short history of last recorded GPS positions. The sensor supports sampling intervals, which can be used to create more power-efficient applications.

            Sleep monitorhttp://tizen.org/feature/sensor.sleep_monitorWhen the sleep sensor is started, a change callback is invoked when data changes. Use the getHumanActivityData() method to get the current data.
            Activity recognitionhttp://tizen.org/feature/sensor.activity_recognitionTo recognize an activity, start listening for it using the addActivityRecognitionListener() method. The following activity types can be recognized: -
              -
            • STATIONARY
            • -
            • WALKING
            • -
            • RUNNING
            • -
            • IN_VEHICLE
            • -
            - -

            The supported recorder types and their capabilities for wearable applications are listed in the following table.

            - - - - - - - - - - - - - - - -
            Table: Human activity recorders and capabilities
            RecorderCapabilityNotes
            Pressurehttp://tizen.org/feature/sensor.barometerUse the startRecorder() and stopRecorder() methods to record the pressure sensor data for the specific period of time. Use the readRecorderData() method to read the recorded pressure sensor data.
            - - -

            Warm-up

            - -

            Become familiar with the Human Activity Monitor API basics by learning about:

            - -

            Prerequisites

            To use the Human Activity Monitor API (in mobile and wearable applications), the application has to request permission by adding the following privileges to the config.xml file:

            @@ -165,7 +80,7 @@

            Enabling the monitor and retrieving data is a basic Human Activity Monitor (HAM) management skill:

              -
            1. Check whether a sensor is supported using the tizen.systeminfo.getCapability() method to get the appropriate capability.
            2. +
            3. Check whether a sensor is supported using the tizen.systeminfo.getCapability() method to get the appropriate capability.
            4. To enable the monitor and start collecting data, use the start() method of the HumanActivityMonitorManager interface (in mobile and wearable applications):
              var counter = 0;
              @@ -238,7 +153,7 @@ if (tizen.systeminfo.getCapability("http://tizen.org/feature/sensor.baromet
               
               
            5. To enable data recording, use the startRecorder() method of the HumanActivityMonitorManager interface (in mobile and wearable applications). Optionally, you can also define an interval and period for the data recording.
              -var type = 'PRESSURE':;
              +var type = 'PRESSURE';
               
               var options =
               {
              @@ -466,6 +381,80 @@ tizen.humanactivitymonitor.stop("SLEEP_MONITOR");
               
            +

            Supported Monitors

            + +

            The following table introduces the available monitor types and lists the monitor capabilities you can use to determine whether a specific monitor is supported on a device.

            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + Table: Human activity monitors and capabilities +
            MonitorCapabilityNotes
            Pedometer and accumulative pedometerhttp://tizen.org/feature/sensor.pedometerWhen the pedometer sensor is started, a change callback is invoked when data changes. Use the getHumanActivityData() method to get the current data. +

            The accumulative pedometer sensor does not have to be started by your application as long as step counting is enabled by any other application or the system. Listener registered with the setAccumulativePedometerListener() method is called when accumulative counters are changed.

            Wrist uphttp://tizen.org/feature/sensor.wrist_upThe wrist up sensor is notified when the relevant gesture is performed. The sensor must be enabled using the start() method. An event listener invoked when the gesture is detected. This sensor does not provide any data.
            Heart rate monitorhttp://tizen.org/feature/sensor.heart_rate_monitorWhen the heart rate monitor (HRM) sensor is started, a change callback is invoked when data changes. Use the getHumanActivityData() method to get the current data.
            GPShttp://tizen.org/feature/location.batchWhen the GPS sensor is started, a change callback is invoked when data changes. Use the getHumanActivityData() method to get the current data. +

            The GPS sensor provides both the current value and a short history of last recorded GPS positions. The sensor supports sampling intervals, which can be used to create more power-efficient applications.

            Sleep monitorhttp://tizen.org/feature/sensor.sleep_monitorWhen the sleep sensor is started, a change callback is invoked when data changes. Use the getHumanActivityData() method to get the current data.
            Activity recognitionhttp://tizen.org/feature/sensor.activity_recognitionTo recognize an activity, start listening for it using the addActivityRecognitionListener() method. The following activity types can be recognized: +
              +
            • STATIONARY
            • +
            • WALKING
            • +
            • RUNNING
            • +
            • IN_VEHICLE
            • +
            + +

            Supported Recorders in Wearable Applications

            + +

            The following table introduces the available recorder types and lists the capabilities you can use to determine whether a specific recorder is supported on a device.

            + + + + + + + + + + + + + + + +
            Table: Human activity recorders and capabilities
            RecorderCapabilityNotes
            Pressurehttp://tizen.org/feature/sensor.barometerUse the startRecorder() and stopRecorder() methods to record the pressure sensor data for the specific period of time. Use the readRecorderData() method to read the recorded pressure sensor data.
            @@ -489,4 +478,4 @@ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga - + \ No newline at end of file diff --git a/org.tizen.guides/html/web/text_input/input_device_w.htm b/org.tizen.guides/html/web/text_input/input_device_w.htm index 874e245..e80ca17 100644 --- a/org.tizen.guides/html/web/text_input/input_device_w.htm +++ b/org.tizen.guides/html/web/text_input/input_device_w.htm @@ -48,29 +48,17 @@

            The main features of the Input Device API include:

            The key names are listed in the DOM Level 3 KeyboardEvent key Values specification. The name attribute in the Input Device API is equal to the key value specified in the specification (the Media Controller Keys section is the most relevant to the Input Device API). If the specification does not contain an appropriate entry for the key, the Input Device API provides a device-specific name.

            -

            Warm-up

            -

            Become familiar with the Input Device API basics by learning about:

            - -

            Getting a List of All Supported Keys

            - -

            To manage input device keys, you must learn to gather a list of all supported keys:

            +

            To get a list of all supported keys:

            1. To get a supported key list, use the getSupportedKeys() method of the InputDeviceManager interface (in mobile and wearable applications):

              @@ -91,12 +79,10 @@ for (var i = 0; i < supportedKeys.length; ++i)

            Gathering Key Information

            - -

            To manage input device keys, you must learn to gather key information.

            - +

            To gather information about the key by its name:

            1. -

              Create a list of keys for which you want the information.

              +

              Create a list of keys for which you want the information by using the InputDeviceKey object (in mobile and wearable applications).

              If you do not want to gather information about all supported keys, create a separate list of keys for information gathering. If you want information about all supported keys, use the list retrieved in the previous use case.

              @@ -134,6 +120,19 @@ for (var i = 0; i < keys.length; i++)
               

            Registering and Deregistering Keys

            +

            When you want to react to input device key presses, register the applicable key using the InputDeviceManager interface (in mobile and wearable applications). After registering the input device key, the application receives a DOM keyboard event when the key is pressed or released. When the events are no longer needed, deregister the key.

            + + + + + + + + + + +
            Note
            The application cannot register the mandatory keys (ArrowLeft, ArrowRight, ArrowUp, ArrowDown, Enter, and Back).
            +

            To manage input device keys, you must learn to change the action of a supported key:

              diff --git a/org.tizen.guides/html/web/w3c/communication/server_sent_w.htm b/org.tizen.guides/html/web/w3c/communication/server_sent_w.htm index 997cd97..1ed2bde 100644 --- a/org.tizen.guides/html/web/w3c/communication/server_sent_w.htm +++ b/org.tizen.guides/html/web/w3c/communication/server_sent_w.htm @@ -43,8 +43,7 @@

              This feature is supported in mobile applications only.

              -

              The Server-Sent Events API defines a simple data structure and interface, and a communication mechanism to realize the server push. In addition, it can handle the received data in the general DOM event format. However, the API repeatedly requests the data from the client to the server, so it is not a complete server push.

              -

              The repeat period of the server request is determined by the retry value of the event stream data format. If the value is not defined, the repeat period is the default value of the browser.

              +

              The Server-Sent Events API defines a simple data structure and interface, and a communication mechanism to realize the server push. In addition, it can handle the received data in the general DOM event format. However, the API repeatedly requests the data from the client to the server, so it is not a complete server push. The repeat period of the server request is determined by the retry value of the event stream data format. If the value is not defined, the repeat period is the default value of the browser.

              The main features of the Server-Sent Events API include:

                @@ -57,15 +56,7 @@
              -

              Warm-up

              -

              Become familiar with the Server-Sent Events API basics by learning about:

              - - - -

              Triggering Server Push Requests

              +

              Triggering Server Push Requests

              To take advantage of the server push feature, you must learn to connect to the server to request push data:

                diff --git a/org.tizen.guides/html/web/w3c/communication/web_messaging_w.htm b/org.tizen.guides/html/web/w3c/communication/web_messaging_w.htm index 314f901..f336591 100644 --- a/org.tizen.guides/html/web/w3c/communication/web_messaging_w.htm +++ b/org.tizen.guides/html/web/w3c/communication/web_messaging_w.htm @@ -27,9 +27,7 @@

                Content

                Related Info

                @@ -47,16 +45,17 @@

                This feature is supported in mobile and wearable applications only.

                -

                With the Web Messaging API, messages are sent and received:

                - +

                The main features of the HTML5 Web Messaging API include:

                -

                Cross-document Messaging

                -

                You can send and receive data between more than 2 Web pages. Because the Same Origin Policy is not applied for cross-document messaging, communication between other domains is also possible.

                +

                With the Web Messaging API, messages are sent and received asynchronously using the MessageEvent object, within 1 domain or between different domains.

                + +

                Using Cross-document Messaging

                Send the message from the sending page using the postMessage() method of the receiving page window object. To receive the page, the receiving page window object must be registered to receive messages.

                The postMessage() method supports the following parameters:

                  @@ -65,19 +64,6 @@
                • transfer (optional): List of transferable objects.
                -

                Channel Messaging

                -

                With channel messaging, you can send and receive messages through the port of the MessageChannel interface.

                -

                The MessageChannel instance broadcasts message sending and receiving, and has 2 properties: port1 and port2. Each port is used to send and receive messages, and a message that is sent from one port with the postMessage() method is received by the other through the message event.

                - -

                Warm-up

                -

                Become familiar with the HTML5 Web Messaging API basics by learning about:

                - - -

                Using Cross-document Messaging

                -

                Learning how to use cross-document messaging enhances the communication capabilities of your application:

                1. Create document A and B.
                2. @@ -119,7 +105,7 @@

                  Using Channel Messaging

                  - +

                  The MessageChannel instance broadcasts message sending and receiving, and has 2 properties: port1 and port2. Each port is used to send and receive messages, and a message that is sent from one port with the postMessage() method is received by the other through the message event.

                  Learning how to use channel messaging enhances the communication capabilities of your application:

                  1. To send a message from document A to document B, create in document A a MessageChannel interface instance, which has 2 message port attributes: port1 and port2. diff --git a/org.tizen.guides/html/web/w3c/communication/websocket_w.htm b/org.tizen.guides/html/web/w3c/communication/websocket_w.htm index 5ed5958..e73cdc7 100644 --- a/org.tizen.guides/html/web/w3c/communication/websocket_w.htm +++ b/org.tizen.guides/html/web/w3c/communication/websocket_w.htm @@ -56,8 +56,6 @@
                  2. Connecting to a server

                    To connect to a server, you must create a WebSocket interface with the socket server URL as a mandatory parameter. The URL format has some restrictions, for example, it must use the ws or wss protocol. If the URL is not valid or uses a wrong protocol, a syntax error occurs.

                    -

                    If the connection with the socket server succeeds, the readyState attribute value is set to 1. If the connection fails the attribute value is set to 3, and the HTTP 503 error is returned.

                    -

                    When the connection is no longer needed, you can close the connection with the close() method.

                  3. Sending data

                    By using the send() method of theWebSocket interface, you can send data to the server. The data is transmitted using the established connection. If the readyState attribute value is CONNECTING, the method throws an InvalidStateError exception.

                    @@ -65,22 +63,12 @@ URL format has some restrictions, for example, it must use the receive data from the server through the message event.

                  4. +
                  5. Closing a socket +

                    When the connection is no longer needed, you can close the connection with the close() method.

                    +
                  6. -

                    Warm-up

                    -

                    Become familiar with the WebSocket API basics by learning about:

                    - - -

                    Connecting to the Socket Server

                    +

                    Connecting to the Socket Server

                    To use the Web socket features in your application, you must learn to connect to a socket server:

                      @@ -106,7 +94,7 @@ webSocket.onerror = function(e)    /* Error handling */ };
            -

            If the connection is established, the readyState attribute is changed to 1 and the open event is triggered.

            +

            If the connection is established, the readyState attribute is changed to 1 and the open event is triggered. If the connection fails, the attribute value is set to 3, and the HTTP 503 error is returned.

          Source Code

          diff --git a/org.tizen.guides/html/web/w3c/communication/xmlhttprequest_w.htm b/org.tizen.guides/html/web/w3c/communication/xmlhttprequest_w.htm index 270d050..f0b196c 100644 --- a/org.tizen.guides/html/web/w3c/communication/xmlhttprequest_w.htm +++ b/org.tizen.guides/html/web/w3c/communication/xmlhttprequest_w.htm @@ -115,21 +115,8 @@
        7. -

          Warm-up

          -

          Become familiar with the XMLHttpRequest Level 1 and 2 API basics by learning about:

          - - -

          Sending a Cross-origin Request

          +

          Sending a Cross-origin Request

          To use the XML HTTP request features in your application, you must learn to send a cross-origin request:

            diff --git a/org.tizen.guides/html/web/w3c/device/battery_w.htm b/org.tizen.guides/html/web/w3c/device/battery_w.htm index 97678d9..9822b7a 100644 --- a/org.tizen.guides/html/web/w3c/device/battery_w.htm +++ b/org.tizen.guides/html/web/w3c/device/battery_w.htm @@ -48,28 +48,23 @@

            This feature is supported in mobile and wearable applications only.

            -

            Knowing the battery status of the device helps you to defer or scale back work when the device is not charging or is low on battery. For example:

            -
            • A Web-based email client can modify how often it checks the server for new email based on the battery status. It can make the check very few seconds if the device is charging or has a full battery, but less often if the device is not charging or is low on battery.
            • -
            • A Web-based word processor can monitor the battery level and prevent data loss by saving any changes before the battery runs out.

            The main features of the Battery Status API include:

            • Retrieving the battery status -

              You can use the charging, chargingTime, dischargingTime, and level attributes of the BatteryManager interface to check the battery status information, such as battery charging status, remaining charging time (until fully charged), remaining battery life (until battery is empty), and battery level.

            • +

              You can use the attributes of the BatteryManager interface to check the battery status information, such as battery charging status, remaining charging time (until fully charged), remaining battery life (until battery is empty), and battery level.

            • Detecting battery status changes

              You can set event listeners with the BatteryManager interface attributes to detect changes in the battery status.

            - -

            Warm-up

            -

            Become familiar with the Battery Status API by learning about:

            - - -

            Retrieving Battery Status Information

            - +

            Knowing the battery status of the device helps you to defer or scale back work when the device is not charging or is low on battery. For example:

            +
            • A Web-based email client can modify how often it checks the server for new email based on the battery status. It can make the check every few seconds if the device is charging or has a full battery, but less often if the device is not charging or is low on battery.
            • +
            • A Web-based word processor can monitor the battery level and prevent data loss by saving any changes before the battery runs out.
            + + +

            Retrieving Battery Status Information

            +

            To enhance the user interaction with the device, you must learn to retrieve and display the battery status:

            1. diff --git a/org.tizen.guides/html/web/w3c/device/browser_state_w.htm b/org.tizen.guides/html/web/w3c/device/browser_state_w.htm index a06f69e..d13ee14 100644 --- a/org.tizen.guides/html/web/w3c/device/browser_state_w.htm +++ b/org.tizen.guides/html/web/w3c/device/browser_state_w.htm @@ -82,13 +82,6 @@ -

              Warm-up

              -

              Become familiar with the HTML5 Browser state API basics by learning about:

              - -

              Retrieving the Browser State

              To enhance the user interaction with the device, you must learn to retrieve the browser state:

              diff --git a/org.tizen.guides/html/web/w3c/device/device_orientation_w.htm b/org.tizen.guides/html/web/w3c/device/device_orientation_w.htm index 97bdf10..d4369d6 100644 --- a/org.tizen.guides/html/web/w3c/device/device_orientation_w.htm +++ b/org.tizen.guides/html/web/w3c/device/device_orientation_w.htm @@ -56,25 +56,11 @@
            2. Detecting acceleration

              You can use rotation speed (acceleration in the device) information, including gravity, with the devicemotion event. You can move game characters or elements, and capture acceleration values to add certain events.

            3. +

              For a practical example of using the magnetic sensor data to orient a compass needle, see the Compass mobile sample task.

              -

              Warm-up

              -

              Become familiar with the DeviceOrientation Event Specification API basics by learning about:

              +

              Detecting Device Rotation

              - - -

              Task in Mobile Applications

              -

              In the Compass task, we will walk through using the magnetic sensor data to orient a compass needle.

              - - -

              Detecting Device Rotation

              - -

              Learning how to detect device rotation is a basic device motion handling skill:

              +

              Learning how to detect device rotation is a basic device motion handling skill:

              1. Display the device rotation details on the screen:
                diff --git a/org.tizen.guides/html/web/w3c/device/screen_orientation_w.htm b/org.tizen.guides/html/web/w3c/device/screen_orientation_w.htm
                index cac9ebe..62794a1 100644
                --- a/org.tizen.guides/html/web/w3c/device/screen_orientation_w.htm
                +++ b/org.tizen.guides/html/web/w3c/device/screen_orientation_w.htm
                @@ -45,18 +45,12 @@
                 
                 

                The main features of the Screen Orientation API include:

                -
                • Accessing the current screen orientation -

                  You can use the current screen orientation information, for example, to define the visibility or dimensions of the HTML elements according to the orientation state. You can retrieve the state with the screen.orientation attribute. -

                  The following code snippet demonstrates how to access the current screen orientation information.

                  -
                  -var currentScreenOrientation = screen.orientation;
                  -
                  - -

                  The orientation can be portrait-primary, portrait-secondary, landscape-primary, or landscape-secondary.

                • +
                    +
                  • Accessing the current screen orientation +

                    You can use the current screen orientation information, for example, to define the visibility or dimensions of the HTML elements according to the orientation state. The orientation can be portrait-primary, portrait-secondary, landscape-primary, or landscape-secondary.

                  • Reacting to screen orientation changes -

                    To receive notifications of the screen orientation changes, add an event listener to the Screen object, or assign a function reference to the screen.onorientationchange attribute.

                    -

                    The following code snippet demonstrates how to receive notifications of screen orientation changes.

                    +

                    To receive notifications of the screen orientation changes, add an event listener to the Screen object, or assign a function reference to the screen.onorientationchange attribute:

                     /* Add listener */
                     screen.addEventListener("orientationchange", handleScreenOrientationFun, false);
                    @@ -64,44 +58,20 @@ screen.addEventListener("orientationchange", handleScreenOrientationFu
                     /* Or assign reference */
                     screen.onorientationchange = handleScreenOrientationFun;
                     
                    -

                    In the above example, the handleScreenOrientationFun is the event handler called when the screen orientation changes.

                  • Locking the screen to a specified orientation -

                    Locking means that the rendering of the current browsing context is forced to be shown in the specified orientation. The screen remains in the selected orientation state until the lock is removed.

                    -

                    Lock the screen with the lockOrientation() method. -

                    The following code snippet demonstrates how to lock the screen to a specified orientation.

                    -
                    screen.lockOrientation("portrait-secondary");
                    -
                    -

                    The method accepts the following parameter values: portrait-primary, portrait-secondary, landscape-primary, landscape-secondary, portrait, and landscape.

                    - - - - - - - - - -
                    Note
                    When using the screen orientation lock: -
                    • When the portrait value is used to lock the orientation, the orientation can change between portrait-primary and portrait-secondary. The landscape value behaves similarly.
                    • -
                    • Depending on the browser, unlocking the screen orientation may have no visual effect.
                    -
                  +

                  Locking means that the rendering of the current browsing context is forced to be shown in the specified orientation. The screen remains in the selected orientation state until the lock is removed.

                  +
                -

                Warm-up

                -

                Become familiar with the Screen Orientation API basics by learning about:

                - +

                Managing the Screen Orientation

                -

                Managing the Screen Orientation

                - -

                To enhance the user interaction with the device, you must learn to manage the screen orientation. The application implemented below consists of buttons used to either lock the screen orientation to a specific state or release the lock. The current orientation state is also displayed on the screen.

                +

                The application implemented below consists of buttons used to either lock the screen orientation to a specific state or release the lock. The current orientation state is also displayed on the screen.

                Figure: Screen orientation application

                Screen orientation application

                +

                To enhance the user interaction with the device, learn to manage the screen orientation:

                1. Define the text and button elements for the screen (the body of the HTML page):
                   <body>
                  @@ -118,7 +88,7 @@ screen.onorientationchange = handleScreenOrientationFun;
                   </body>
                   
                2. -
                3. When the screen is loaded, the onload() method is called. Within the method, add an event listener to the screen object, and define the updateCurrOrrTxt() event handler to be called whenever the screen orientation changes. The event handler updates the text element containing the current screen orientation information on the screen. +
                4. When the screen is loaded, the onload() method is called. Within the method, add an event listener to the screen object, and define the updateCurrOrrTxt() event handler to be called whenever the screen orientation changes. The event handler updates the text element containing the current screen orientation information on the screen, by retrieving the current state with the screen.orientation attribute.
                   <script>
                  @@ -135,6 +105,9 @@ screen.onorientationchange = handleScreenOrientationFun;
                   
                   
                5. Use the onclick event handlers to react to the button clicks. For the first 4 buttons, use the lockOrientation() method to lock the screen orientation in place, and for the final button, use the unlockOrientation() method to release the orientation lock.

                  + +

                  The lockOrientation() method accepts the following parameter values: portrait-primary, portrait-secondary, landscape-primary, landscape-secondary, portrait, and landscape.

                  +
                         document.getElementById("portrait-primary").onclick = function() 
                         {
                  @@ -149,7 +122,20 @@ screen.onorientationchange = handleScreenOrientationFun;
                         }
                      }
                   </script>
                  -
                6. +
                  + + + + + + + + + +
                  Note
                  When using the screen orientation lock: +
                  • When the portrait value is used to lock the orientation, the orientation can change between portrait-primary and portrait-secondary. The landscape value behaves similarly.
                  • +
                  • Depending on the browser, unlocking the screen orientation may have no visual effect.
                  +
                7. Define CSS styles in the <head> section of the document to make the application more eye-catching.
                  diff --git a/org.tizen.guides/html/web/w3c/device/touch_w.htm b/org.tizen.guides/html/web/w3c/device/touch_w.htm
                  index 0940910..60fcd44 100644
                  --- a/org.tizen.guides/html/web/w3c/device/touch_w.htm
                  +++ b/org.tizen.guides/html/web/w3c/device/touch_w.htm
                  @@ -57,7 +57,7 @@
                   

                  The main touch event features include:

                  • Touch event types -

                    You can define event handlers for 4 different types of touch events:

                    +

                    You can define event handlers for different types of touch events:

                    • touchstart handles an event which occurs when a finger comes in contact with the device screen.
                    • touchmove handles an event which occurs when a finger moves while it is in contact with the screen.
                    • @@ -65,16 +65,7 @@
                    • touchcancel handles an event which occurs when a touch is cancelled.

                    These events are similar to the mousedown, mousemove, and mouseup mouse events.

                    - - - - - - - - - -
                    Note
                    In Tizen, the touchcancel event occurs when a context menu is activated by a long press of a DOM element, such as text or image.
                    +
                  • Touch point coordinate

                    When a touch event occurs, you can retrieve the coordinate of the event point occurrence. Because the finger, and consequently the contact area of the screen, is quite large, the retrieved coordinate is the average value of the contact area.

                    @@ -82,39 +73,45 @@
                  • Multi-point touch control

                    Unlike with mouse events, multiple concurrent touch events (represented by the Touch interface) can occur. To control multi-point touch events, the TouchList interface is used to save the respective event status (based on the touches, targetTouches, and changedTouches attributes). The status stored in the TouchList instance is renewed every time a new touch event occurs.

                  +

                  For a practical example of drawing a simple image by using touch events and canvas elements, see the Touch Paint sample task (in mobile and wearable applications).

                  A touch-based mobile operating system uses tap and double-tap gestures. The tap is used to generate a click event, and double-tap used for zooming. To recognize the touch gestures, the OS sets a timer which starts at the first tap and checks for a second before the event is fired. This causes a delay in the single tap event, making the touch responsiveness of the application suffer. To avoid the delay, you can enhance the touch event responsiveness by making the page unscalable, or modifying touch responses.

                  -

                  Warm-up

                  -

                  Become familiar with the Touch Events version 1 API basics by learning about:

                  +

                  Handling Touch Events

                  +

                  Depending on the touch type, different touch events occur:

                  +
                8. When the user moves their finger across the element, and then removes their finger, the touchstart, touchmove, and touchend events occur. -

                  Task in Mobile Applications

                  -

                  In the Touch Paint task, we will walk through drawing a simple image by using touch events and canvas elements.

                  +

                  Figure: Moving touch (in mobile applications only)

                  +

                  Moving touch (in mobile applications only)

                  +
                9. -

                  Task in Wearable Applications

                  -

                  In the Touch Paint task, we will walk through drawing a simple image by using touch events and canvas elements.

                  +
                10. When the user long-presses the DOM element, such as text or image, in the element, the touchstart and touchcancel events occur. -

                  Follow-up

                  -

                  Once we have learned the basics of Touch Events version 1 API, we can now move on to more advanced tasks, including:

                  - - -

                  Handling Touch Events

                  - -

                  Learning how to handle touch events improves the user interaction of your application:

                  +

                  Figure: Cancelling touch with a long press (in mobile applications only)

                  +

                  Cancelling touch with a long press (in mobile applications only)

                  + + + + + + + + + + +
                  Note
                  In Tizen, the touchcancel event occurs when a context menu is activated by a long press of a DOM element, such as text or image.
                  +
                11. + + +

                  Learning how to handle touch events improves the user interaction of your application:

                  1. Define the element from which you want to trigger touch events. In this case, an area with a text and an image is defined as an element. @@ -160,26 +157,6 @@
                -

                Depending on the touch type, different touch events occur:

                -
                  -
                • When the user touches the element, the touchstart and touchend events occur. - -

                  Figure: Simple touch (in mobile applications only)

                  -

                  Simple touch (in mobile applications only)

                  -
                • - -
                • When the user moves their finger across the element, and then removes their finger, the touchstart, touchmove, and touchend events occur. - -

                  Figure: Moving touch (in mobile applications only)

                  -

                  Moving touch (in mobile applications only)

                  -
                • - -
                • When the user long-presses the DOM element, such as text or image, in the element, the touchstart and touchcancel events occur. - -

                  Figure: Cancelling touch with a long press (in mobile applications only)

                  -

                  Cancelling touch with a long press (in mobile applications only)

                  -
                • -
                diff --git a/org.tizen.guides/html/web/w3c/device/vibration_w.htm b/org.tizen.guides/html/web/w3c/device/vibration_w.htm index b0efbe7..f820316 100644 --- a/org.tizen.guides/html/web/w3c/device/vibration_w.htm +++ b/org.tizen.guides/html/web/w3c/device/vibration_w.htm @@ -41,45 +41,21 @@

                Vibration

                -

                Making a Tizen device vibrate is a good way to provide tactile feedback to the user or to interact with the user even when the device volume is low. The vibration provides better user experience and therefore improves the perception of your application.

                +

                To provide tactile feedback to the user or to interact with the user even when the device volume is low, you can make a Tizen device vibrate. The vibration provides better user experience and therefore improves the perception of your application.

                This feature is supported in mobile and wearable applications only.

                The vibration interface is implemented by all Navigator instances. With the vibrate() method parameters, you can define different vibration types:

                  -
                • Continuous vibration for a given length of time
                • -
                • Vibration in a given pattern
                • +
                • Continuous vibration for a given length of time +

                  The time parameter defines the vibration time in milliseconds.

                • +
                • Vibration in a given pattern +

                  The pattern parameter defines a vibration pattern as a list of time entries. Odd entries represent the vibration time in milliseconds, and even entries represent still periods in milliseconds between the vibrations.

                -

                The following table describes the available parameters.

                -
                - - - - - - - - - - - - - - - -
                Table: Vibration parameters
                ParameterDescription
                timeVibration time in milliseconds.
                patternVibration pattern represented by a list of time entries. Odd entries represent vibration time in milliseconds, and even entries still periods in milliseconds between the vibrations.
                - -

                Warm-up

                -

                Become familiar with the Vibration API basics by learning about:

                - - - -

                Managing Vibrations

                +

                Managing Vibrations

                -

                To enhance the user interaction with the device, you must learn to manage vibrations:

                +

                To enhance the user interaction with the device, learn to manage vibrations:

                1. To launch a vibration for a given length of time, call the vibrate() method, which is implemented by all Navigator instances: diff --git a/org.tizen.guides/html/web/w3c/graphics/canvas_w.htm b/org.tizen.guides/html/web/w3c/graphics/canvas_w.htm index 3ebdcf4..d7c8395 100644 --- a/org.tizen.guides/html/web/w3c/graphics/canvas_w.htm +++ b/org.tizen.guides/html/web/w3c/graphics/canvas_w.htm @@ -27,12 +27,12 @@

                  Content

                  Related Info

                    @@ -50,103 +50,47 @@

                    HTML5 Canvas

                    -

                    The HTML5 canvas allows you to use graphics on the screen, and draw and manage various shapes. The HTML Canvas 2D Context API (in mobile or wearable applications) defines a special canvas element that expresses images or shapes with JavaScript. To use the canvas, you must insert a <canvas> element in the HTML page.

                    +

                    The HTML5 canvas allows you to use graphics on the screen, and draw and manage various shapes. The HTML Canvas 2D Context API (in mobile or wearable applications) defines a special canvas element that expresses images or shapes with JavaScript.

                    This feature is supported in mobile and wearable applications only.

                    - -

                    In mobile applications only, in HTML5, the HTML5 SVG API (in mobile or wearable applications) provides similar features as the canvas. Their difference is that SVG expresses graphics using vectors, while the canvas is based on pixels. To express complex graphics, use the canvas, and to express graphics with a liberal expansion or reduction, use SVG. -

                    - - - - - - - - - -
                    Note
                    The canvas currently supports 2D graphics only, since the 3D graphics specification is still in progress. The WebGL API is currently called 3D Canvas, and is used to express 3D graphics. For more information on the performance differences between Canvas 2D and WebGL in mobile applications, see Performance Comparison of Canvas 2D and WebGL.

                    The main features of the Canvas Element API include:

                      +
                    • Creating a canvas +

                      To draw and manage shapes, you must insert a <canvas> element in the HTML page.

                      +
                    • Using images -

                      To use images in the canvas, use the drawImage() method of the HTML Canvas 2D Context API. The method receives information, such as the image URL and position, and where it is -indicated, and then creates the image in the canvas. The created image is pixel-based.

                      - - - - - - - - - -
                      Note
                      To edit the created image, you must comply with the same-origin policy.
                      +

                      You can use images in the canvas by using the applicable method of the HTML Canvas 2D Context API.

                    • Drawing shapes -

                      With the HTML Canvas 2D Context API, you can draw various shapes, such as rectangles (rect()), circles (arc() and arcTo()), and lines (lineTo() and bezierCurveTo()) to a canvas. You can define the position and size of the shapes, and also merge shapes with other shape objects.

                      +

                      With the HTML Canvas 2D Context API, you can draw various shapes, such as rectangles, circles, and lines to a canvas.

                      You can also draw and mask objects on the canvas.

                    • Using styles and transformations -

                      You can use a canvas to create text or lines other than images and shapes. For all canvas objects (images, shapes, text, and lines), you can define colors (the fillStyle and strokeStyle attributes), shadows (the shadowColor and shadowBlur attributes), and gradation (the createLinearGradient() method). You can also use the transformation methods, such as scale(), translate(), transform(), and rotate(), to implement, for example, transparency or shape gradient transformations.

                      +

                      You can use a canvas to create text or lines other than images and shapes.

                    -

                    Performance Comparison of Canvas 2D and WebGL in Mobile Applications

                    +

                    For all canvas objects (images, shapes, text, and lines), you can define colors (the fillStyle and strokeStyle attributes), shadows (the shadowColor and shadowBlur attributes), and gradation (the createLinearGradient() method). You can also use the transformation methods, such as scale(), translate(), transform(), and rotate(), to implement, for example, transparency or shape gradient transformations.

                    -

                    In Web documents prior to HTML5, only simple image loading was supported. To create graphic animations, you had to use a separate plug-in. However, as the graphic-related APIs have become more standardized, you can now express graphics by using only JavaScript, without a separate plug-in.

                    - -

                    When developing Web applications that need to express complex graphics, such as games, the most important issue to consider is graphic performance. Currently, the HTML Canvas 2D Context API and WebGL are used to express graphic elements in many games. The following example illustrates how to create an effective graphic animation by comparing the performance of the renderers in the Canvas 2D Context API and WebGL.

                    -

                    To compare the performance, 2 simple Web applications must be created, using respectively the Canvas 2D Context API and WebGL:

                    - -
                      -
                    1. Create the applications with the following logic: -
                      1. Load an image.
                      2. -
                      3. Render the loaded image in the random location of the canvas.
                      4. -
                      5. Use the requestAnimationFrame() method of the Timing control for script-based animations API (in mobile or wearable applications) to change the color of the loaded image, based on different times.
                      6. -
                      7. Create a logic that measures FPS (frames per second) in order to check the performance.
                    2. -
                    3. Execute the applications and measure the FPS.
                    4. -
                    5. Increase only the number of objects so that the same 1~N images, under the same conditions, are shown repeatedly based on 1~N.
                    6. -
                    7. Measure the FPS as the number of repeatedly shown objects increase.
                    - -

                    The following figure shows the result of the test: As the number of objects increase, the performance of the Canvas 2D Context API rapidly decreases when compared to WebGL (the result is subject to change according to the complexity of the application logic). As such, when expressing many graphic objects all differently, it is much more efficient to use WebGL than the Canvas 2D Context API.

                    - -

                    Figure: Test result

                    -

                    Test result

                    - -

                    There is one problem with using WebGL; the ratio of mobile browsers supporting it is quite low compared to the Canvas 2D Context API, and even when it is supported, usually only partial features are included (support for 3D acceleration, reflection effect, and camera effect is particularly low). The following figure shows the support status of WebGL in computer (top) and mobile (bottom) browsers, as published in http://webglstats.com/ in June 2013.

                    - -

                    Figure: WebGL support in computer and mobile browsers

                    -

                    WebGL support in computer and mobile browsers

                    - -

                    Many mobile browsers do not support WebGL or only partially support WebGL. Even though Tizen supports WebGL, it is recommended to use the Canvas 2D Context API for small amount of 2D drawings, since the API is supported in most mobile browsers. However, for performance critical applications, use WebGL for faster 2D performance.

                    - -

                    Warm-up

                    -

                    Become familiar with the HTML5 Canvas Element and HTML Canvas 2D Context API basics by learning about:

                    - +

                    In mobile applications only, in HTML5, the HTML5 SVG API (in mobile or wearable applications) provides similar features as the canvas. Their difference is that SVG expresses graphics using vectors, while the canvas is based on pixels. To express complex graphics, use the canvas, and to express graphics with a liberal expansion or reduction, use SVG. +

                    + + + + + + + + + +
                    Note
                    The canvas currently supports 2D graphics only, since the 3D graphics specification is still in progress. The WebGL API is currently called 3D Canvas, and is used to express 3D graphics. For more information on the performance differences between Canvas 2D and WebGL in mobile applications, see Performance Comparison of Canvas 2D and WebGL.
                    -

                    Task in Wearable Applications

                    -

                    In the Basic Watch task, we will walk through using canvas contexts to create and display a clock on the canvas.

                    +

                    For a practical example of using canvas contexts to create and display a clock on the canvas, see the Basic Watch wearable sample task.

                    +

                    Using a Canvas

                    -

                    Using a Canvas

                    - -

                    To draw images with JavaScript, you must learn to use a canvas in your application:

                    +

                    To create a canvas in your application:

                    1. Create a <canvas> element with the HTML5 Canvas Element API. @@ -194,8 +138,19 @@ if (!(canvas.getContext))

                  Using Images on the Canvas

                  - -

                  To use a canvas in your application, you must learn to use images on it:

                  +

                  To use images in the canvas, use the drawImage() method of the HTML Canvas 2D Context API. The method receives information, such as the image URL and position, and where it is indicated, and then creates the image in the canvas. The created image is pixel-based.

                  + + + + + + + + + +
                  Note
                  To edit the created image, you must comply with the same-origin policy.
                  + +

                  To use images on a canvas:

                  1. Use the drawImage() method to express an image in the canvas.

                    @@ -257,7 +212,8 @@ context.restore();

                Drawing Shapes to the Canvas

                -

                To use a canvas in your application, you must learn to create draw shapes on it:

                +

                With the HTML Canvas 2D Context API, you can draw various shapes, such as rectangles (rect()), circles (arc() and arcTo()), and lines (lineTo() and bezierCurveTo()), to a canvas. You can define the position and size of the shapes, and also merge shapes with other shape objects.

                +

                To create and draw shapes on a canvas:

                1. Use the rect() method to create a rectangle. @@ -337,10 +293,10 @@ context.fillStyle = 'tomato'; - -

                  Drawing Masks to the Canvas

                  - -

                  To use a canvas in your application, you must learn to draw masks on it:

                  + +

                  Drawing Masks to the Canvas

                  + +

                  To draw masks on a canvas:

                  1. Create the HTML layout with a canvas and 2 button input elements for brush selection: @@ -485,9 +441,9 @@ function updateLastPos(e) - -

                    Creating Text and Lines on the Canvas

                    -

                    To use a canvas in your application, you must learn to create text and lines:

                    + +

                    Creating Text and Lines on the Canvas

                    +

                    To create text and lines on a canvas:

                      @@ -545,6 +501,37 @@ context.measureText("textAlign=end", 150, 100);
                    1. Text_Styles_4.html
                    2. +

                      Performance Comparison of Canvas 2D and WebGL in Mobile Applications

                      + +

                      In Web documents prior to HTML5, only simple image loading was supported. To create graphic animations, you had to use a separate plug-in. However, as the graphic-related APIs have become more standardized, you can now express graphics by using only JavaScript, without a separate plug-in.

                      + +

                      When developing Web applications that need to express complex graphics, such as games, the most important issue to consider is graphic performance. Currently, the HTML Canvas 2D Context API and WebGL are used to express graphic elements in many games. The following example illustrates how to create an effective graphic animation by comparing the performance of the renderers in the Canvas 2D Context API and WebGL.

                      + +

                      To compare the performance, 2 simple Web applications must be created, using respectively the Canvas 2D Context API and WebGL:

                      + +
                        +
                      1. Create the applications with the following logic: +
                        1. Load an image.
                        2. +
                        3. Render the loaded image in the random location of the canvas.
                        4. +
                        5. Use the requestAnimationFrame() method of the Timing control for script-based animations API (in mobile or wearable applications) to change the color of the loaded image, based on different times.
                        6. +
                        7. Create a logic that measures FPS (frames per second) in order to check the performance.
                      2. +
                      3. Execute the applications and measure the FPS.
                      4. +
                      5. Increase only the number of objects so that the same 1~N images, under the same conditions, are shown repeatedly based on 1~N.
                      6. +
                      7. Measure the FPS as the number of repeatedly shown objects increase.
                      + +

                      The following figure shows the result of the test: As the number of objects increase, the performance of the Canvas 2D Context API rapidly decreases when compared to WebGL (the result is subject to change according to the complexity of the application logic). As such, when expressing many graphic objects all differently, it is much more efficient to use WebGL than the Canvas 2D Context API.

                      + +

                      Figure: Test result

                      +

                      Test result

                      + +

                      There is one problem with using WebGL; the ratio of mobile browsers supporting it is quite low compared to the Canvas 2D Context API, and even when it is supported, usually only partial features are included (support for 3D acceleration, reflection effect, and camera effect is particularly low). The following figure shows the support status of WebGL in computer (top) and mobile (bottom) browsers, as published in http://webglstats.com/ in June 2013.

                      + +

                      Figure: WebGL support in computer and mobile browsers

                      +

                      WebGL support in computer and mobile browsers

                      + +

                      Many mobile browsers do not support WebGL or only partially support WebGL. Even though Tizen supports WebGL, it is recommended to use the Canvas 2D Context API for small amount of 2D drawings, since the API is supported in most mobile browsers. However, for performance critical applications, use WebGL for faster 2D performance.

                      + + diff --git a/org.tizen.guides/html/web/w3c/graphics/svg_w.htm b/org.tizen.guides/html/web/w3c/graphics/svg_w.htm index b13b93d..c656e99 100644 --- a/org.tizen.guides/html/web/w3c/graphics/svg_w.htm +++ b/org.tizen.guides/html/web/w3c/graphics/svg_w.htm @@ -27,6 +27,7 @@

                      Content

                        +
                      • Creating Text and Images
                      • Making Shapes
                      • Grouping SVG Elements
                      • Animating SVG Elements
                      • @@ -48,61 +49,49 @@

                        This feature is supported in mobile and wearable applications only.

                        -

                        You can use the svg tag in HTML <body> element to create various SVG elements:

                        +

                        The main HTML5 SVG API features include:

                        + +

                        For more information on using SVG, see Scalable Vector Graphics (SVG) Tiny 1.2 Specification.

                        +

                        Creating Text and Images

                        +

                        To create text and images, use the svg tag in HTML <body> element:

                          -
                        • Images - -

                          For the images, define the image file, the image location on the screen, and the image size:

                          -
                          -<svg xmlns="http://www.w3.org/2000/svg">
                          -   <image xlink:href="http://developer.tizen.org/sites/all/themes/tizen_theme/logo.png" 
                          -          x="10" y="10" width="224" height="74" />
                          -</svg>
                          -
                        • Text - -

                          For the text, define the textual content and the location on the screen:

                          +

                          Define the textual content and the location on the screen:

                           <svg xmlns="http://www.w3.org/2000/svg">
                              <text x="60" y="150">Hello World</text>
                           </svg>
                           
                        • -
                        • Shapes -

                          The following code snippet demonstrates how to retrieve shapes. For a complete source code, see svg_shape.html.

                          - -

                          For the shapes, define the shape, size, location on the screen, line width, and the line and fill colors:

                          +
                        • Images +

                          Define the image file, the image location on the screen, and the image size:

                           <svg xmlns="http://www.w3.org/2000/svg">
                          -   <circle cx="150" cy="100" r="60" fill="blue" stroke="red" stroke-width="3" />
                          +   <image xlink:href="http://developer.tizen.org/sites/all/themes/tizen_theme/logo.png" 
                          +          x="10" y="10" width="224" height="74" />
                           </svg>
                        -

                        You can manage multiple SVG element easily by grouping them together. You can also animate SVG elements and control them through scripting. For more information on using SVG, see Scalable Vector Graphics (SVG) Tiny 1.2 Specification.

                        - -

                        Warm-up

                        -

                        Become familiar with the HTML5 SVG API basics by learning about:

                        - - +

                        Making Shapes

                        -

                        Making Shapes

                        - -

                        To use inline SVG elements in your application, you must learn to create shapes:

                        +

                        To create shapes as inline SVG elements:

                          -
                        1. Create the SVG with the svg tag.
                        2. -
                        3. Use the graphic elements to create various shapes. The absolute coordinates of the graphics element determine the size of the SVG. +
                        4. Create the SVG element with the svg tag.
                        5. +
                        6. Use the graphic elements to create various shapes. The absolute coordinates of the graphics element determine the size of the SVG. You can define the shape, size, location on the screen, line width, and the line and fill colors for the shapes.
                          • To create a line between 2 assigned coordinates, use the <line> element:

                            @@ -149,10 +138,10 @@ - -

                            Grouping SVG Elements

                            - -

                            To use inline SVG elements in your application, you must learn to group elements:

                            + +

                            Grouping SVG Elements

                            + +

                            To group inline SVG elements:

                            1. Combine various SVG elements in a group using the <g> container element, whose id attribute must be defined.

                              @@ -206,10 +195,10 @@ - -

                              Animating SVG Elements

                              - -

                              To use inline SVG elements in your application, you must learn to animate elements:

                              + +

                              Animating SVG Elements

                              + +

                              To animate inline SVG elements:

                              1. @@ -255,10 +244,10 @@ - -

                                Controlling SVG Elements through Scripting

                                - -

                                To use inline SVG elements in your application, you must learn to use scripting:

                                + +

                                Controlling SVG Elements through Scripting

                                + +

                                To use scripts to manage events related to SVG elements:

                                1. Define an SVG element: diff --git a/org.tizen.guides/html/web/w3c/location/geolocation_w.htm b/org.tizen.guides/html/web/w3c/location/geolocation_w.htm index 24767f4..1daae46 100644 --- a/org.tizen.guides/html/web/w3c/location/geolocation_w.htm +++ b/org.tizen.guides/html/web/w3c/location/geolocation_w.htm @@ -48,7 +48,7 @@

                                  This feature is supported in mobile and wearable applications only.

                                  -

                                  The Geolocation interface allows you to retrieve position information with "one-shot" position requests (with the getCurrentPosition() method) or repeated position updates (with the watchPosition() method). Both methods take the following parameters:

                                  +

                                  Using the Geolocation interface, you can retrieve position information with "one-shot" position requests (with the getCurrentPosition() method) or repeated position updates (with the watchPosition() method). Both methods take the following parameters:

                                  • Success event handler, which is a function invoked when an attempt to obtain the current location is successful.
                                  • Error event handler, which is a function invoked when an attempt to obtain the current location fails (optional).
                                  • @@ -72,13 +72,6 @@ -

                                    Warm-up

                                    -

                                    Become familiar with the Geolocation API Specification basics by learning about:

                                    - - -

                                    Retrieving Location Information

                                    To provide users with location-based features, you must learn to create a mobile GPS application to retrieve location information:

                                    diff --git a/org.tizen.guides/html/web/w3c/media/getusermedia_w.htm b/org.tizen.guides/html/web/w3c/media/getusermedia_w.htm index e88289b..7e3ab09 100644 --- a/org.tizen.guides/html/web/w3c/media/getusermedia_w.htm +++ b/org.tizen.guides/html/web/w3c/media/getusermedia_w.htm @@ -52,7 +52,7 @@
                                  • Retrieving multimedia streams

                                    You can use the navigator.webkitGetUserMedia() method to request user access to retrieve the multimedia streams of local devices, such as camera. The method returns the media as a JSON object.

                                  • Capturing media -

                                    You can capture media content and transform it to various formats.

                                    +

                                    You can capture media content and transform it to various formats.

                                  @@ -68,19 +68,9 @@ -

                                  Warm-up

                                  -

                                  Become familiar with the getUserMedia API basics by learning about:

                                  - - -

                                  Task in Mobile Applications

                                  -

                                  In the Self Camera task, we will walk through displaying a camera video stream and capturing images from it.

                                  +

                                  For a practical example of displaying a camera video stream and capturing images from it, see the Self Camera mobile sample task.

                                  -

                                  Accessing a Video Stream

                                  +

                                  Accessing a Video Stream

                                  Learning how to access a video stream is a basic user media management skill:

                                    diff --git a/org.tizen.guides/html/web/w3c/media/media_capture_w.htm b/org.tizen.guides/html/web/w3c/media/media_capture_w.htm index 2a4cfc4..cfce8de 100644 --- a/org.tizen.guides/html/web/w3c/media/media_capture_w.htm +++ b/org.tizen.guides/html/web/w3c/media/media_capture_w.htm @@ -50,27 +50,19 @@
                                  1. microphone

                                    Activates the device sound recorder.

                          -

                          Warm-up

                          -

                          Become familiar with the HTML Media Capture API basics by learning about:

                          - - -

                          Activating the Media Capture

                          +

                          Activating the Media Capture

                          To provide users with the HTML media capture feature, you must learn to activate the media capture feature by selecting the file type during file upload:

                            -
                          1. Activate the media capture feature by -adding the capture attribute to the <input> element: +

                          2. Activate the media capture feature by adding the capture attribute to the <input> element:

                             <input type="file" capture="filesystem"/>
                             
                            -

                            File types

                            +

                            File types

                          3. Assign format, such as filesystem, camera, or camcorder:

                            diff --git a/org.tizen.guides/html/web/w3c/media/video_audio_w.htm b/org.tizen.guides/html/web/w3c/media/video_audio_w.htm index 7643cfb..36c05a0 100644 --- a/org.tizen.guides/html/web/w3c/media/video_audio_w.htm +++ b/org.tizen.guides/html/web/w3c/media/video_audio_w.htm @@ -39,6 +39,7 @@
                          4. Resizing the Video Screen
                          5. Checking Supported Media Formats
                          6. Handling Errors
                          7. +
                          8. Supported Codecs

                      Related Info

                        @@ -79,149 +80,12 @@

                        You can resize the video screen to offer different viewing options for the user.

                      • Checking supported media formats

                        You can check whether the media data can be played using the canPlayType() method. Basically, the MIME type must be set in the Web server in a format that is supported in Tizen. If a non-supported MIME type is used, you can handle exceptions in advance.

                        -

                        Tizen supports the following media formats:

                        -
                          -
                        • Video: 3GP, AVI, ASF, OGV, MP4, MKV, WMV
                        • -
                        • Audio: AAC, AMR, MP3, OGG, WAV, WMA
                        • -
                        -

                        The following table lists the codecs supported in Tizen.

                        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                        Table: Supported codecs
                        TypeCodecEncoderDecoder

                        Video

                        MPEG-1

                        No

                        Yes

                        MPEG-4 part 2

                        Yes

                        Yes

                        MPEG-4 part 2 MS v1

                        No

                        Yes

                        MPEG-4 part 2 MS v2

                        Yes

                        Yes

                        MPEG-4 part 2 MS v3

                        Yes

                        Yes

                        H.264, H.263-1996, H.263+, H263-1998, H263 v2

                        Yes

                        Yes

                        H.264, MPEG-4 AVC, MPEG-4 part10

                        No

                        Yes

                        WMV3

                        No

                        Yes

                        VC1

                        No

                        Yes

                        THEORA

                        Yes

                        Yes

                        Audio

                        AAC

                        No

                        Yes

                        MP3

                        No

                        Yes

                        WMA (Available up to WMA8. WMA9 is not available.)

                        No

                        Yes

                        AMR-NB

                        Yes

                        Yes

                        AMR-WB

                        No

                        Yes

                        VORBIS

                        Yes

                        Yes

                      -

                      Warm-up

                      -

                      Become familiar with the HTML5 video and audio element API basics by learning about:

                      - +

                      For a practical example of creating a piano in your application and playing sounds, see the Piano mobile sample task.

                      -

                      Task in Mobile Applications

                      -

                      In the Piano task, we will walk through creating a piano in your application and playing sounds.

                      - -

                      Creating an Audio and Video Player

                      +

                      Creating an Audio and Video Player

                      To provide users with HTML5 audio and video features, you must learn to create a simple player for streaming playback:

                      @@ -646,6 +510,12 @@ browser) is created. The control is visible only when the Checking Supported Media Formats

    -<-HFEgLR_#Qf9zf5lp^J1+q?tC(XZn6G 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%0A^IChn_tK2juOcYm*9m3@ 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