aboutsummaryrefslogtreecommitdiff
path: root/MediaTek/FmRadio
diff options
context:
space:
mode:
Diffstat (limited to 'MediaTek/FmRadio')
-rwxr-xr-xMediaTek/FmRadio/Android.mk61
-rwxr-xr-xMediaTek/FmRadio/Android.mk~68
-rwxr-xr-xMediaTek/FmRadio/AndroidManifest.xml80
-rw-r--r--MediaTek/FmRadio/NOTICE0
-rwxr-xr-xMediaTek/FmRadio/README30
-rwxr-xr-xMediaTek/FmRadio/bsp/com/mediatek/fmradio/ExtensionUtils.java49
-rwxr-xr-xMediaTek/FmRadio/ext/Android.mk12
-rw-r--r--MediaTek/FmRadio/ext/NOTICE0
-rwxr-xr-xMediaTek/FmRadio/ext/README25
-rwxr-xr-xMediaTek/FmRadio/ext/src/com/mediatek/fmradio/ext/DefaultProjectStringExt.java46
-rwxr-xr-xMediaTek/FmRadio/ext/src/com/mediatek/fmradio/ext/IProjectStringExt.java45
-rwxr-xr-xMediaTek/FmRadio/res/drawable-hdpi/bg_rec_infobar.9.pngbin0 -> 98 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-hdpi/bottom_bar.9.pngbin0 -> 126 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-hdpi/btn_fm_decrease.pngbin0 -> 3022 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-hdpi/btn_fm_decrease_disable.pngbin0 -> 3009 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-hdpi/btn_fm_favorite_off.pngbin0 -> 1317 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-hdpi/btn_fm_favorite_on.pngbin0 -> 1992 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-hdpi/btn_fm_increase.pngbin0 -> 3020 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-hdpi/btn_fm_increase_disable.pngbin0 -> 3008 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-hdpi/btn_fm_list.pngbin0 -> 2955 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-hdpi/btn_fm_list_disable.pngbin0 -> 2944 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-hdpi/btn_fm_nextstation.pngbin0 -> 3059 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-hdpi/btn_fm_nextstation_disable.pngbin0 -> 3042 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-hdpi/btn_fm_overflow.pngbin0 -> 2870 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-hdpi/btn_fm_overflow_disable.pngbin0 -> 2869 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-hdpi/btn_fm_prevstation.pngbin0 -> 3064 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-hdpi/btn_fm_prevstation_disable.pngbin0 -> 3050 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-hdpi/btn_fm_rec_playback_disabled.pngbin0 -> 3062 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-hdpi/btn_fm_rec_playback_enabled.pngbin0 -> 3055 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-hdpi/btn_fm_rec_stop_disabled.pngbin0 -> 2863 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-hdpi/btn_fm_rec_stop_enabled.pngbin0 -> 2864 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-hdpi/btn_fm_record_disabled.pngbin0 -> 3220 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-hdpi/btn_fm_record_enabled.pngbin0 -> 3242 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-hdpi/btn_fm_start.pngbin0 -> 3505 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-hdpi/btn_fm_start_disable.pngbin0 -> 3442 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-hdpi/btn_fm_stop.pngbin0 -> 3444 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-hdpi/btn_fm_stop_disable.pngbin0 -> 3393 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-hdpi/fm_anim.pngbin0 -> 3108 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-hdpi/fm_title_icon.pngbin0 -> 1338 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-hdpi/ic_launcher.pngbin0 -> 9162 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldpi/btn_fm_decrease.pngbin0 -> 157 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldpi/btn_fm_decrease_disable.pngbin0 -> 157 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldpi/btn_fm_favorite_off.pngbin0 -> 3329 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldpi/btn_fm_favorite_on.pngbin0 -> 3401 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldpi/btn_fm_increase.pngbin0 -> 155 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldpi/btn_fm_increase_disable.pngbin0 -> 155 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldpi/btn_fm_list.pngbin0 -> 135 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldpi/btn_fm_list_disable.pngbin0 -> 2845 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldpi/btn_fm_nextstation.pngbin0 -> 2994 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldpi/btn_fm_nextstation_disable.pngbin0 -> 2966 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldpi/btn_fm_overflow.pngbin0 -> 2876 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldpi/btn_fm_overflow_disable.pngbin0 -> 2875 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldpi/btn_fm_prevstation.pngbin0 -> 3000 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldpi/btn_fm_prevstation_disable.pngbin0 -> 2970 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldpi/btn_fm_rec_playback_disabled.pngbin0 -> 2948 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldpi/btn_fm_rec_playback_enabled.pngbin0 -> 2982 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldpi/btn_fm_rec_stop_disabled.pngbin0 -> 2857 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldpi/btn_fm_rec_stop_enabled.pngbin0 -> 2858 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldpi/btn_fm_record_disabled.pngbin0 -> 3046 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldpi/btn_fm_record_enabled.pngbin0 -> 2992 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldpi/btn_fm_start.pngbin0 -> 3129 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldpi/btn_fm_start_disable.pngbin0 -> 3169 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldpi/btn_fm_stop.pngbin0 -> 3204 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldpi/btn_fm_stop_disable.pngbin0 -> 3130 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldpi/fm_anim.pngbin0 -> 3383 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldpi/fm_title_icon.pngbin0 -> 417 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldpi/ic_launcher.pngbin0 -> 2860 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_decrease.pngbin0 -> 361 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_decrease_disable.pngbin0 -> 348 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_increase.pngbin0 -> 362 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_increase_disable.pngbin0 -> 347 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_list.pngbin0 -> 282 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_list_disable.pngbin0 -> 271 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_nextstation.pngbin0 -> 407 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_nextstation_disable.pngbin0 -> 387 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_prevstation.pngbin0 -> 408 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_prevstation_disable.pngbin0 -> 398 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_rec_playback_disabled.pngbin0 -> 422 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_rec_playback_enabled.pngbin0 -> 432 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-hdpi/fm_anim.pngbin0 -> 488 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_decrease.pngbin0 -> 211 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_decrease_disable.pngbin0 -> 228 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_increase.pngbin0 -> 211 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_increase_disable.pngbin0 -> 237 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_list.pngbin0 -> 158 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_nextstation.pngbin0 -> 922 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_nextstation_disable.pngbin0 -> 885 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_prevstation.pngbin0 -> 925 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_prevstation_disable.pngbin0 -> 879 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_rec_playback_disabled.pngbin0 -> 829 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_rec_playback_enabled.pngbin0 -> 933 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-ldpi/fm_anim.pngbin0 -> 642 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_decrease.pngbin0 -> 359 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_decrease_disable.pngbin0 -> 343 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_increase.pngbin0 -> 370 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_increase_disable.pngbin0 -> 349 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_list.pngbin0 -> 197 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_list_disable.pngbin0 -> 189 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_nextstation.pngbin0 -> 286 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_nextstation_disable.pngbin0 -> 280 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_prevstation.pngbin0 -> 293 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_prevstation_disable.pngbin0 -> 282 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_rec_playback_disabled.pngbin0 -> 312 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_rec_playback_enabled.pngbin0 -> 326 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-mdpi/fm_anim.pngbin0 -> 305 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_decrease.pngbin0 -> 823 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_decrease_disable.pngbin0 -> 689 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_increase.pngbin0 -> 823 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_increase_disable.pngbin0 -> 700 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_list.pngbin0 -> 785 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_list_disable.pngbin0 -> 667 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_nextstation.pngbin0 -> 541 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_nextstation_disable.pngbin0 -> 523 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_prevstation.pngbin0 -> 554 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_prevstation_disable.pngbin0 -> 525 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_rec_playback_disabled.pngbin0 -> 612 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_rec_playback_enabled.pngbin0 -> 591 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-xhdpi/fm_anim.pngbin0 -> 603 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_decrease.pngbin0 -> 823 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_decrease_disable.pngbin0 -> 689 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_increase.pngbin0 -> 823 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_increase_disable.pngbin0 -> 700 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_list.pngbin0 -> 785 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_list_disable.pngbin0 -> 667 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_nextstation.pngbin0 -> 541 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_nextstation_disable.pngbin0 -> 523 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_prevstation.pngbin0 -> 554 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_prevstation_disable.pngbin0 -> 525 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_rec_playback_disabled.pngbin0 -> 612 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_rec_playback_enabled.pngbin0 -> 591 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/fm_anim.pngbin0 -> 603 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-ldrtl/anim.xml9
-rwxr-xr-xMediaTek/FmRadio/res/drawable-mdpi/bg_rec_infobar.9.pngbin0 -> 98 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-mdpi/bottom_bar.9.pngbin0 -> 126 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-mdpi/btn_fm_decrease.pngbin0 -> 3052 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-mdpi/btn_fm_decrease_disable.pngbin0 -> 3032 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-mdpi/btn_fm_favorite_off.pngbin0 -> 857 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-mdpi/btn_fm_favorite_on.pngbin0 -> 1239 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-mdpi/btn_fm_increase.pngbin0 -> 3045 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-mdpi/btn_fm_increase_disable.pngbin0 -> 3029 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-mdpi/btn_fm_list.pngbin0 -> 2898 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-mdpi/btn_fm_list_disable.pngbin0 -> 2891 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-mdpi/btn_fm_nextstation.pngbin0 -> 2981 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-mdpi/btn_fm_nextstation_disable.pngbin0 -> 2968 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-mdpi/btn_fm_overflow.pngbin0 -> 2850 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-mdpi/btn_fm_overflow_disable.pngbin0 -> 2849 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-mdpi/btn_fm_prevstation.pngbin0 -> 2981 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-mdpi/btn_fm_prevstation_disable.pngbin0 -> 2967 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-mdpi/btn_fm_rec_playback_disabled.pngbin0 -> 2993 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-mdpi/btn_fm_rec_playback_enabled.pngbin0 -> 3001 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-mdpi/btn_fm_rec_stop_disabled.pngbin0 -> 2843 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-mdpi/btn_fm_rec_stop_enabled.pngbin0 -> 2844 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-mdpi/btn_fm_record_disabled.pngbin0 -> 3070 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-mdpi/btn_fm_record_enabled.pngbin0 -> 3096 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-mdpi/btn_fm_start.pngbin0 -> 3257 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-mdpi/btn_fm_start_disable.pngbin0 -> 3223 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-mdpi/btn_fm_stop.pngbin0 -> 3215 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-mdpi/btn_fm_stop_disable.pngbin0 -> 3173 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-mdpi/fm_anim.pngbin0 -> 2976 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-mdpi/fm_title_icon.pngbin0 -> 849 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-mdpi/ic_launcher.pngbin0 -> 5251 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-sw1024dp-ldpi/btn_fm_favorite_off.pngbin0 -> 857 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-sw1024dp-ldpi/btn_fm_favorite_on.pngbin0 -> 1239 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xhdpi/bg_rec_infobar.9.pngbin0 -> 98 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xhdpi/bottom_bar.9.pngbin0 -> 126 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xhdpi/btn_fm_decrease.pngbin0 -> 3423 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xhdpi/btn_fm_decrease_disable.pngbin0 -> 3310 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xhdpi/btn_fm_favorite_off.pngbin0 -> 1749 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xhdpi/btn_fm_favorite_on.pngbin0 -> 4060 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xhdpi/btn_fm_increase.pngbin0 -> 3415 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xhdpi/btn_fm_increase_disable.pngbin0 -> 3306 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xhdpi/btn_fm_list.pngbin0 -> 3390 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xhdpi/btn_fm_list_disable.pngbin0 -> 3299 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xhdpi/btn_fm_nextstation.pngbin0 -> 3163 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xhdpi/btn_fm_nextstation_disable.pngbin0 -> 3143 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xhdpi/btn_fm_overflow.pngbin0 -> 2906 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xhdpi/btn_fm_overflow_disable.pngbin0 -> 2904 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xhdpi/btn_fm_prevstation.pngbin0 -> 3164 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xhdpi/btn_fm_prevstation_disable.pngbin0 -> 3150 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xhdpi/btn_fm_rec_playback_disabled.pngbin0 -> 3217 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xhdpi/btn_fm_rec_playback_enabled.pngbin0 -> 3214 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xhdpi/btn_fm_rec_stop_disabled.pngbin0 -> 2898 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xhdpi/btn_fm_rec_stop_enabled.pngbin0 -> 2899 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xhdpi/btn_fm_record_disabled.pngbin0 -> 3578 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xhdpi/btn_fm_record_enabled.pngbin0 -> 3586 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xhdpi/btn_fm_start.pngbin0 -> 3714 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xhdpi/btn_fm_start_disable.pngbin0 -> 3658 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xhdpi/btn_fm_stop.pngbin0 -> 3653 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xhdpi/btn_fm_stop_disable.pngbin0 -> 3590 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xhdpi/fm_anim.pngbin0 -> 3226 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xhdpi/fm_title_icon.pngbin0 -> 1846 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xhdpi/ic_launcher.pngbin0 -> 13662 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xxhdpi/bg_rec_infobar.9.pngbin0 -> 98 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xxhdpi/bottom_bar.9.pngbin0 -> 126 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_decrease.pngbin0 -> 3423 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_decrease_disable.pngbin0 -> 3310 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_favorite_off.pngbin0 -> 1749 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_favorite_on.pngbin0 -> 4060 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_increase.pngbin0 -> 3415 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_increase_disable.pngbin0 -> 3306 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_list.pngbin0 -> 3390 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_list_disable.pngbin0 -> 3299 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_nextstation.pngbin0 -> 3163 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_nextstation_disable.pngbin0 -> 3143 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_overflow.pngbin0 -> 2906 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_overflow_disable.pngbin0 -> 2904 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_prevstation.pngbin0 -> 3164 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_prevstation_disable.pngbin0 -> 3150 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_rec_playback_disabled.pngbin0 -> 3217 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_rec_playback_enabled.pngbin0 -> 3214 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_rec_stop_disabled.pngbin0 -> 2898 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_rec_stop_enabled.pngbin0 -> 2899 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_record_disabled.pngbin0 -> 3578 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_record_enabled.pngbin0 -> 3586 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_start.pngbin0 -> 3714 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_start_disable.pngbin0 -> 3658 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_stop.pngbin0 -> 3653 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_stop_disable.pngbin0 -> 3590 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xxhdpi/fm_anim.pngbin0 -> 3226 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xxhdpi/fm_title_icon.pngbin0 -> 2061 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable-xxhdpi/ic_launcher.pngbin0 -> 24564 bytes
-rwxr-xr-xMediaTek/FmRadio/res/drawable/anim.xml46
-rwxr-xr-xMediaTek/FmRadio/res/drawable/btn_fm_decrease_frequency.xml44
-rwxr-xr-xMediaTek/FmRadio/res/drawable/btn_fm_favorite_off_selector.xml41
-rwxr-xr-xMediaTek/FmRadio/res/drawable/btn_fm_favorite_on_selector.xml41
-rwxr-xr-xMediaTek/FmRadio/res/drawable/btn_fm_increase_frequency.xml44
-rwxr-xr-xMediaTek/FmRadio/res/drawable/btn_fm_list_selector.xml44
-rwxr-xr-xMediaTek/FmRadio/res/drawable/btn_fm_next.xml44
-rwxr-xr-xMediaTek/FmRadio/res/drawable/btn_fm_overflow_selector.xml44
-rwxr-xr-xMediaTek/FmRadio/res/drawable/btn_fm_powerdown_selector.xml44
-rwxr-xr-xMediaTek/FmRadio/res/drawable/btn_fm_powerup_selector.xml44
-rwxr-xr-xMediaTek/FmRadio/res/drawable/btn_fm_previous.xml44
-rwxr-xr-xMediaTek/FmRadio/res/drawable/btn_fm_rec_play.xml44
-rwxr-xr-xMediaTek/FmRadio/res/drawable/btn_fm_rec_stop.xml44
-rwxr-xr-xMediaTek/FmRadio/res/drawable/btn_fm_record.xml44
-rwxr-xr-xMediaTek/FmRadio/res/layout-ldrtl/addstation.xml46
-rwxr-xr-xMediaTek/FmRadio/res/layout-ldrtl/editstation.xml50
-rwxr-xr-xMediaTek/FmRadio/res/layout-ldrtl/fm_recorder_dialog.xml81
-rwxr-xr-xMediaTek/FmRadio/res/layout-ldrtl/main.xml243
-rwxr-xr-xMediaTek/FmRadio/res/layout-sw1024dp-land/main.xml270
-rwxr-xr-xMediaTek/FmRadio/res/layout-sw1024dp-port/main.xml270
-rwxr-xr-xMediaTek/FmRadio/res/layout/addstation.xml80
-rwxr-xr-xMediaTek/FmRadio/res/layout/editstation.xml82
-rwxr-xr-xMediaTek/FmRadio/res/layout/favorite.xml57
-rwxr-xr-xMediaTek/FmRadio/res/layout/fm_recorder_dialog.xml117
-rwxr-xr-xMediaTek/FmRadio/res/layout/fm_rx_em.xml789
-rwxr-xr-xMediaTek/FmRadio/res/layout/main.xml270
-rwxr-xr-xMediaTek/FmRadio/res/layout/simpleadapter.xml70
-rwxr-xr-xMediaTek/FmRadio/res/layout/test_view.xml28
-rwxr-xr-xMediaTek/FmRadio/res/menu/fm_action_bar.xml60
-rwxr-xr-xMediaTek/FmRadio/res/menu/fm_menu.xml48
-rwxr-xr-xMediaTek/FmRadio/res/values-af/strings.xml98
-rwxr-xr-xMediaTek/FmRadio/res/values-am/strings.xml98
-rwxr-xr-xMediaTek/FmRadio/res/values-ar/strings.xml108
-rwxr-xr-xMediaTek/FmRadio/res/values-bg/strings.xml107
-rwxr-xr-xMediaTek/FmRadio/res/values-bn/strings.xml110
-rwxr-xr-xMediaTek/FmRadio/res/values-ca/strings.xml107
-rwxr-xr-xMediaTek/FmRadio/res/values-cs/strings.xml108
-rwxr-xr-xMediaTek/FmRadio/res/values-da/strings.xml107
-rwxr-xr-xMediaTek/FmRadio/res/values-de-rAT/strings.xml107
-rwxr-xr-xMediaTek/FmRadio/res/values-de/strings.xml108
-rwxr-xr-xMediaTek/FmRadio/res/values-el/strings.xml108
-rwxr-xr-xMediaTek/FmRadio/res/values-en-rGB/strings.xml107
-rwxr-xr-xMediaTek/FmRadio/res/values-en-rIN/strings.xml98
-rwxr-xr-xMediaTek/FmRadio/res/values-en-rUS/strings.xml108
-rwxr-xr-xMediaTek/FmRadio/res/values-es-rUS/strings.xml107
-rwxr-xr-xMediaTek/FmRadio/res/values-es/strings.xml108
-rwxr-xr-xMediaTek/FmRadio/res/values-et-rEE/strings.xml107
-rwxr-xr-xMediaTek/FmRadio/res/values-fa/strings.xml109
-rwxr-xr-xMediaTek/FmRadio/res/values-fi/strings.xml107
-rwxr-xr-xMediaTek/FmRadio/res/values-fr-rCA/strings.xml98
-rwxr-xr-xMediaTek/FmRadio/res/values-fr/strings.xml108
-rwxr-xr-xMediaTek/FmRadio/res/values-hi/strings.xml108
-rwxr-xr-xMediaTek/FmRadio/res/values-hr/strings.xml107
-rwxr-xr-xMediaTek/FmRadio/res/values-hu/strings.xml108
-rwxr-xr-xMediaTek/FmRadio/res/values-hy-rAM/strings.xml107
-rwxr-xr-xMediaTek/FmRadio/res/values-in/strings.xml108
-rwxr-xr-xMediaTek/FmRadio/res/values-it/strings.xml108
-rwxr-xr-xMediaTek/FmRadio/res/values-iw/strings.xml107
-rwxr-xr-xMediaTek/FmRadio/res/values-ja/strings.xml107
-rwxr-xr-xMediaTek/FmRadio/res/values-ka-rGE/strings.xml98
-rwxr-xr-xMediaTek/FmRadio/res/values-kk/strings.xml70
-rwxr-xr-xMediaTek/FmRadio/res/values-km-rKH/strings.xml107
-rwxr-xr-xMediaTek/FmRadio/res/values-ko/strings.xml107
-rwxr-xr-xMediaTek/FmRadio/res/values-lo-rLA/strings.xml98
-rwxr-xr-xMediaTek/FmRadio/res/values-lt/strings.xml107
-rwxr-xr-xMediaTek/FmRadio/res/values-lv/strings.xml107
-rwxr-xr-xMediaTek/FmRadio/res/values-mn-rMN/strings.xml98
-rwxr-xr-xMediaTek/FmRadio/res/values-ms/strings.xml108
-rwxr-xr-xMediaTek/FmRadio/res/values-my-rMM/strings.xml107
-rwxr-xr-xMediaTek/FmRadio/res/values-my-rZG/strings.xml70
-rwxr-xr-xMediaTek/FmRadio/res/values-nb/strings.xml107
-rwxr-xr-xMediaTek/FmRadio/res/values-nl/strings.xml109
-rwxr-xr-xMediaTek/FmRadio/res/values-pl/strings.xml107
-rwxr-xr-xMediaTek/FmRadio/res/values-pt-rPT/strings.xml109
-rwxr-xr-xMediaTek/FmRadio/res/values-pt/strings.xml108
-rwxr-xr-xMediaTek/FmRadio/res/values-ro/strings.xml108
-rwxr-xr-xMediaTek/FmRadio/res/values-ru/strings.xml108
-rwxr-xr-xMediaTek/FmRadio/res/values-sk/strings.xml107
-rwxr-xr-xMediaTek/FmRadio/res/values-sl/strings.xml107
-rwxr-xr-xMediaTek/FmRadio/res/values-sr/strings.xml107
-rwxr-xr-xMediaTek/FmRadio/res/values-sv/strings.xml107
-rwxr-xr-xMediaTek/FmRadio/res/values-sw/strings.xml98
-rwxr-xr-xMediaTek/FmRadio/res/values-th/strings.xml108
-rwxr-xr-xMediaTek/FmRadio/res/values-tl/strings.xml108
-rwxr-xr-xMediaTek/FmRadio/res/values-tr/strings.xml108
-rwxr-xr-xMediaTek/FmRadio/res/values-uk/strings.xml107
-rwxr-xr-xMediaTek/FmRadio/res/values-ur/strings.xml109
-rwxr-xr-xMediaTek/FmRadio/res/values-vi/strings.xml108
-rwxr-xr-xMediaTek/FmRadio/res/values-zh-rCN/strings.xml108
-rwxr-xr-xMediaTek/FmRadio/res/values-zh-rHK/strings.xml70
-rwxr-xr-xMediaTek/FmRadio/res/values-zh-rTW/strings.xml108
-rwxr-xr-xMediaTek/FmRadio/res/values-zu/strings.xml98
-rwxr-xr-xMediaTek/FmRadio/res/values/strings.xml149
-rwxr-xr-xMediaTek/FmRadio/res/values/strings_test.xml6
-rwxr-xr-xMediaTek/FmRadio/res/values/styles.xml45
-rwxr-xr-xMediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioActivity.java2196
-rwxr-xr-xMediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioActivity.java~2196
-rwxr-xr-xMediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioContentProvider.java297
-rwxr-xr-xMediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioEmActivity.java1049
-rwxr-xr-xMediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioFavorite.java533
-rwxr-xr-xMediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioListener.java140
-rwxr-xr-xMediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioNative.java253
-rwxr-xr-xMediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioService.java2802
-rwxr-xr-xMediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioService.java~2802
-rwxr-xr-xMediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioStation.java524
-rwxr-xr-xMediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioUtils.java262
-rwxr-xr-xMediaTek/FmRadio/src/com/mediatek/fmradio/FmRecordDialogFragment.java333
-rwxr-xr-xMediaTek/FmRadio/src/com/mediatek/fmradio/FmRecorder.java807
-rwxr-xr-xMediaTek/FmRadio/src/com/mediatek/fmradio/TestFM.java168
-rwxr-xr-xMediaTek/FmRadio/src/com/mediatek/fmradio/TestFM.java~168
-rwxr-xr-xMediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/AddFavoriteDialog.java137
-rwxr-xr-xMediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/DeleteFavoriteDialog.java107
-rwxr-xr-xMediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/EditFavoriteDialog.java225
-rwxr-xr-xMediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/NoAntennaDialog.java124
-rwxr-xr-xMediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/SearchChannelsDialog.java111
-rwxr-xr-xMediaTek/FmRadio/tests/Android.mk57
-rwxr-xr-xMediaTek/FmRadio/tests/AndroidManifest.xml27
-rw-r--r--MediaTek/FmRadio/tests/NOTICE0
-rwxr-xr-xMediaTek/FmRadio/tests/README25
-rwxr-xr-xMediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioActivityTest.java1054
-rwxr-xr-xMediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioFavoriteTest.java261
-rwxr-xr-xMediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioFunctionRunner.java59
-rwxr-xr-xMediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioLaunchPerformance.java59
-rwxr-xr-xMediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioPerformanceRunner.java57
-rwxr-xr-xMediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioPerformanceTest.java554
-rwxr-xr-xMediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioTestCaseUtil.java219
-rwxr-xr-xMediaTek/FmRadio/turnkey/com/mediatek/fmradio/ExtensionUtils.java67
348 files changed, 27945 insertions, 0 deletions
diff --git a/MediaTek/FmRadio/Android.mk b/MediaTek/FmRadio/Android.mk
new file mode 100755
index 0000000..2918f01
--- /dev/null
+++ b/MediaTek/FmRadio/Android.mk
@@ -0,0 +1,61 @@
+# Copyright Statement:
+#
+# This software/firmware and related documentation ("MediaTek Software") are
+# protected under relevant copyright laws. The information contained herein
+# is confidential and proprietary to MediaTek Inc. and/or its licensors.
+# Without the prior written permission of MediaTek inc. and/or its licensors,
+# any reproduction, modification, use or disclosure of MediaTek Software,
+# and information contained herein, in whole or in part, shall be strictly prohibited.
+#
+# MediaTek Inc. (C) 2011-2014. All rights reserved.
+#
+# BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+# THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+# RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
+# AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+# NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+# SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+# SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
+# THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
+# THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
+# CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
+# SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+# STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
+# CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+# AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+# OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
+# MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+#
+# The following software/firmware and/or related documentation ("MediaTek Software")
+# have been modified by MediaTek Inc. All revisions are subject to any receiver's
+# applicable license agreements with MediaTek Inc.
+
+ifeq ($(MTK_FM_SUPPORT),yes)
+ifeq ($(MTK_FM_RX_SUPPORT),yes)
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+LOCAL_CERTIFICATE := platform
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := FmRadio
+LOCAL_JNI_SHARED_LIBRARIES := libfmjni
+
+LOCAL_PROGUARD_ENABLED := disabled
+LOCAL_PRIVILEGED_MODULE := true
+
+LOCAL_STATIC_JAVA_LIBRARIES := com.mediatek.fmradio.ext
+LOCAL_SRC_FILES += bsp/com/mediatek/fmradio/ExtensionUtils.java
+
+include $(BUILD_PACKAGE)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
+
+endif
+endif
diff --git a/MediaTek/FmRadio/Android.mk~ b/MediaTek/FmRadio/Android.mk~
new file mode 100755
index 0000000..d7c93e8
--- /dev/null
+++ b/MediaTek/FmRadio/Android.mk~
@@ -0,0 +1,68 @@
+# Copyright Statement:
+#
+# This software/firmware and related documentation ("MediaTek Software") are
+# protected under relevant copyright laws. The information contained herein
+# is confidential and proprietary to MediaTek Inc. and/or its licensors.
+# Without the prior written permission of MediaTek inc. and/or its licensors,
+# any reproduction, modification, use or disclosure of MediaTek Software,
+# and information contained herein, in whole or in part, shall be strictly prohibited.
+#
+# MediaTek Inc. (C) 2011-2014. All rights reserved.
+#
+# BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+# THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+# RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
+# AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+# NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+# SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+# SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
+# THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
+# THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
+# CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
+# SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+# STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
+# CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+# AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+# OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
+# MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+#
+# The following software/firmware and/or related documentation ("MediaTek Software")
+# have been modified by MediaTek Inc. All revisions are subject to any receiver's
+# applicable license agreements with MediaTek Inc.
+
+ifeq ($(MTK_FM_SUPPORT),yes)
+ifeq ($(MTK_FM_RX_SUPPORT),yes)
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+LOCAL_CERTIFICATE := platform
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := FmRadio
+LOCAL_JNI_SHARED_LIBRARIES := libfmjni
+
+LOCAL_PROGUARD_ENABLED := disabled
+LOCAL_PRIVILEGED_MODULE := true
+
+LOCAL_JAVA_LIBRARIES += mediatek-framework
+
+ifeq ($(strip $(MTK_BSP_PACKAGE)),yes)
+ LOCAL_STATIC_JAVA_LIBRARIES := com.mediatek.fmradio.ext
+ LOCAL_SRC_FILES += bsp/com/mediatek/fmradio/ExtensionUtils.java
+else
+ LOCAL_STATIC_JAVA_LIBRARIES := com.mediatek.fmradio.ext
+ LOCAL_SRC_FILES += turnkey/com/mediatek/fmradio/ExtensionUtils.java
+endif
+
+include $(BUILD_PACKAGE)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
+
+endif
+endif
diff --git a/MediaTek/FmRadio/AndroidManifest.xml b/MediaTek/FmRadio/AndroidManifest.xml
new file mode 100755
index 0000000..8cc32cc
--- /dev/null
+++ b/MediaTek/FmRadio/AndroidManifest.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.mediatek.fmradio"
+ android:versionCode="1"
+ android:versionName="1.0">
+
+ <uses-permission android:name="android.permission.ACCESS_FM_RADIO" />
+ <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
+ <uses-permission android:name="android.permission.WAKE_LOCK" />
+ <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+ <uses-permission android:name="android.permission.RECORD_AUDIO" />
+ <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
+ <uses-permission android:name="android.permission.BLUETOOTH" />
+<!-- Vanzo:libing on: Tue, 10 Feb 2015 16:24:03 +0800
+ add for gesture
+-->
+ <uses-permission android:name="android.permission.GET_TASKS" />
+<!-- End of Vanzo:libing -->
+
+ <application android:hardwareAccelerated="true"
+ android:icon="@drawable/ic_launcher"
+ android:theme="@style/AppTheme"
+ android:label="@string/app_name"
+ android:supportsRtl="true">
+
+ <activity android:name=".FmRadioActivity"
+ android:clearTaskOnLaunch="true"
+ android:configChanges="orientation|mcc|mnc|screenSize"
+ android:label="@string/app_name"
+ android:launchMode="singleTask">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name=".FmRadioFavorite"
+ android:configChanges="orientation|screenSize"
+ android:label="@string/favorite_manager"
+ android:windowSoftInputMode="stateAlwaysHidden">
+ </activity>
+
+ <activity
+ android:clearTaskOnLaunch="true"
+ android:configChanges="orientation|screenSize"
+ android:label="@string/app_name"
+ android:launchMode="singleTask"
+ android:name=".FmRadioEmActivity" >
+ <intent-filter >
+ <action android:name="com.mediatek.fmradio.FmRadioEmActivity" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+
+<!-- Vanzo:yujianpeng on: Fri, 30 Jan 2015 14:34:43 +0800
+ * vanzo factory mode porting
+-->
+ <activity android:name=".TestFM"
+ android:screenOrientation="portrait">
+ <intent-filter>
+ <action android:name="com.mediatek.FMRadio.test" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+<!-- End of Vanzo:yujianpeng -->
+ <service android:name=".FmRadioService"
+ android:exported="false">
+ <intent-filter>
+ <action android:name="com.mediatek.fmradio.IFmRadioService" />
+ </intent-filter>
+ </service>
+
+ <provider android:name=".FmRadioContentProvider"
+ android:authorities="com.mediatek.fmradio.FmRadioContentProvider">
+ </provider>
+
+ </application>
+
+</manifest>
diff --git a/MediaTek/FmRadio/NOTICE b/MediaTek/FmRadio/NOTICE
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/MediaTek/FmRadio/NOTICE
diff --git a/MediaTek/FmRadio/README b/MediaTek/FmRadio/README
new file mode 100755
index 0000000..5ec36fe
--- /dev/null
+++ b/MediaTek/FmRadio/README
@@ -0,0 +1,30 @@
+APK of listening the FM radio programme, including listen a station, change station,
+and record a station.
+
+This library is pre-built by MediaTek internal.
+
+WHAT IT DOES?
+=============
+FmRadio.apk listen the FM radio programme.
+1. listen a FM radio station
+2. change station
+3. search stations
+4. record a station
+5. add station to favorite
+
+HOW IT WAS BUILT?
+==================
+It needs the following library from AOSP:
+1. framework.jar
+
+and the following libs from MediaTek:
+1. mediatek-framework.jar
+2. com.mediatek.fmradio.ext.jar
+3. libfmjni.so
+
+All source/dependency modules of this module are already put in
+'vendor/mediatek/libs' folder.
+
+HOW TO USE IT?
+==============
+install FmRadio.apk in mediatek platform.
diff --git a/MediaTek/FmRadio/bsp/com/mediatek/fmradio/ExtensionUtils.java b/MediaTek/FmRadio/bsp/com/mediatek/fmradio/ExtensionUtils.java
new file mode 100755
index 0000000..962e387
--- /dev/null
+++ b/MediaTek/FmRadio/bsp/com/mediatek/fmradio/ExtensionUtils.java
@@ -0,0 +1,49 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2010. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.fmradio;
+
+import android.content.Context;
+import com.mediatek.fmradio.ext.IProjectStringExt;
+import com.mediatek.fmradio.ext.DefaultProjectStringExt;
+
+public class ExtensionUtils {
+ public static IProjectStringExt getExtension(Context context) {
+ return new DefaultProjectStringExt();
+ }
+
+}
diff --git a/MediaTek/FmRadio/ext/Android.mk b/MediaTek/FmRadio/ext/Android.mk
new file mode 100755
index 0000000..d5eef9f
--- /dev/null
+++ b/MediaTek/FmRadio/ext/Android.mk
@@ -0,0 +1,12 @@
+
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE := com.mediatek.fmradio.ext
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+
diff --git a/MediaTek/FmRadio/ext/NOTICE b/MediaTek/FmRadio/ext/NOTICE
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/MediaTek/FmRadio/ext/NOTICE
diff --git a/MediaTek/FmRadio/ext/README b/MediaTek/FmRadio/ext/README
new file mode 100755
index 0000000..163ce0f
--- /dev/null
+++ b/MediaTek/FmRadio/ext/README
@@ -0,0 +1,25 @@
+The FM radio plugin host side.
+
+This library is pre-built by MediaTek internal.
+
+WHAT IT DOES?
+=============
+The FM Radio plugin host is designed to change some strings
+for vendor customing. It contains:
+1. Plugin host API
+2. A default implement
+
+HOW IT WAS BUILT?
+==================
+It needs the following library from AOSP:
+No need.
+
+and the following libs from MediaTek:
+No need.
+
+All source/dependency modules of this module are already put in
+'vendor/mediatek/libs' folder.
+
+HOW TO USE IT?
+==============
+Install FmRadio.apk and plugin apk in mediatek platform.
diff --git a/MediaTek/FmRadio/ext/src/com/mediatek/fmradio/ext/DefaultProjectStringExt.java b/MediaTek/FmRadio/ext/src/com/mediatek/fmradio/ext/DefaultProjectStringExt.java
new file mode 100755
index 0000000..3a7dbf9
--- /dev/null
+++ b/MediaTek/FmRadio/ext/src/com/mediatek/fmradio/ext/DefaultProjectStringExt.java
@@ -0,0 +1,46 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2010. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.fmradio.ext;
+
+import android.content.Context;
+public class DefaultProjectStringExt implements IProjectStringExt {
+
+ public String getProjectString(Context context, int normalResId, int cmccResId) {
+ return context.getString(normalResId);
+ }
+}
diff --git a/MediaTek/FmRadio/ext/src/com/mediatek/fmradio/ext/IProjectStringExt.java b/MediaTek/FmRadio/ext/src/com/mediatek/fmradio/ext/IProjectStringExt.java
new file mode 100755
index 0000000..cfcdee0
--- /dev/null
+++ b/MediaTek/FmRadio/ext/src/com/mediatek/fmradio/ext/IProjectStringExt.java
@@ -0,0 +1,45 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2010. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.fmradio.ext;
+
+import android.content.Context;
+
+public interface IProjectStringExt {
+
+ public String getProjectString(Context context, int normalResId, int cmccResId);
+}
diff --git a/MediaTek/FmRadio/res/drawable-hdpi/bg_rec_infobar.9.png b/MediaTek/FmRadio/res/drawable-hdpi/bg_rec_infobar.9.png
new file mode 100755
index 0000000..c38132d
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-hdpi/bg_rec_infobar.9.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-hdpi/bottom_bar.9.png b/MediaTek/FmRadio/res/drawable-hdpi/bottom_bar.9.png
new file mode 100755
index 0000000..4985b08
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-hdpi/bottom_bar.9.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_decrease.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_decrease.png
new file mode 100755
index 0000000..24ef191
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_decrease.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_decrease_disable.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_decrease_disable.png
new file mode 100755
index 0000000..f786a6f
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_decrease_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_favorite_off.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_favorite_off.png
new file mode 100755
index 0000000..942722e
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_favorite_off.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_favorite_on.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_favorite_on.png
new file mode 100755
index 0000000..fecb1af
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_favorite_on.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_increase.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_increase.png
new file mode 100755
index 0000000..2032636
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_increase.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_increase_disable.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_increase_disable.png
new file mode 100755
index 0000000..811f015
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_increase_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_list.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_list.png
new file mode 100755
index 0000000..61a466e
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_list.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_list_disable.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_list_disable.png
new file mode 100755
index 0000000..d05cc32
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_list_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_nextstation.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_nextstation.png
new file mode 100755
index 0000000..a7e326a
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_nextstation.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_nextstation_disable.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_nextstation_disable.png
new file mode 100755
index 0000000..ae7d400
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_nextstation_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_overflow.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_overflow.png
new file mode 100755
index 0000000..02bf8e0
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_overflow.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_overflow_disable.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_overflow_disable.png
new file mode 100755
index 0000000..af02bf8
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_overflow_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_prevstation.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_prevstation.png
new file mode 100755
index 0000000..46c1afe
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_prevstation.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_prevstation_disable.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_prevstation_disable.png
new file mode 100755
index 0000000..8e5454f
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_prevstation_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_rec_playback_disabled.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_rec_playback_disabled.png
new file mode 100755
index 0000000..6b3a5e4
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_rec_playback_disabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_rec_playback_enabled.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_rec_playback_enabled.png
new file mode 100755
index 0000000..1e4601b
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_rec_playback_enabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_rec_stop_disabled.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_rec_stop_disabled.png
new file mode 100755
index 0000000..068eecb
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_rec_stop_disabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_rec_stop_enabled.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_rec_stop_enabled.png
new file mode 100755
index 0000000..e5a34bf
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_rec_stop_enabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_record_disabled.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_record_disabled.png
new file mode 100755
index 0000000..75d6ac1
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_record_disabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_record_enabled.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_record_enabled.png
new file mode 100755
index 0000000..e674d07
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_record_enabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_start.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_start.png
new file mode 100755
index 0000000..067397a
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_start.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_start_disable.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_start_disable.png
new file mode 100755
index 0000000..4ce7da3
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_start_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_stop.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_stop.png
new file mode 100755
index 0000000..3e104c0
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_stop.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_stop_disable.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_stop_disable.png
new file mode 100755
index 0000000..3b102e5
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_stop_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-hdpi/fm_anim.png b/MediaTek/FmRadio/res/drawable-hdpi/fm_anim.png
new file mode 100755
index 0000000..2309234
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-hdpi/fm_anim.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-hdpi/fm_title_icon.png b/MediaTek/FmRadio/res/drawable-hdpi/fm_title_icon.png
new file mode 100755
index 0000000..9a69528
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-hdpi/fm_title_icon.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-hdpi/ic_launcher.png b/MediaTek/FmRadio/res/drawable-hdpi/ic_launcher.png
new file mode 100755
index 0000000..f2b54b7
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_decrease.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_decrease.png
new file mode 100755
index 0000000..009b4ba
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_decrease.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_decrease_disable.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_decrease_disable.png
new file mode 100755
index 0000000..a66f36d
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_decrease_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_favorite_off.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_favorite_off.png
new file mode 100755
index 0000000..eeab430
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_favorite_off.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_favorite_on.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_favorite_on.png
new file mode 100755
index 0000000..61cfb69
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_favorite_on.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_increase.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_increase.png
new file mode 100755
index 0000000..41941f7
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_increase.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_increase_disable.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_increase_disable.png
new file mode 100755
index 0000000..b021ca4
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_increase_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_list.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_list.png
new file mode 100755
index 0000000..73fecf2
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_list.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_list_disable.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_list_disable.png
new file mode 100755
index 0000000..498489f
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_list_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_nextstation.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_nextstation.png
new file mode 100755
index 0000000..c0de4ef
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_nextstation.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_nextstation_disable.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_nextstation_disable.png
new file mode 100755
index 0000000..cf6dbcf
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_nextstation_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_overflow.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_overflow.png
new file mode 100755
index 0000000..5c1b6f9
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_overflow.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_overflow_disable.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_overflow_disable.png
new file mode 100755
index 0000000..21669ab
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_overflow_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_prevstation.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_prevstation.png
new file mode 100755
index 0000000..d25704f
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_prevstation.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_prevstation_disable.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_prevstation_disable.png
new file mode 100755
index 0000000..84fad14
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_prevstation_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_rec_playback_disabled.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_rec_playback_disabled.png
new file mode 100755
index 0000000..8e74448
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_rec_playback_disabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_rec_playback_enabled.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_rec_playback_enabled.png
new file mode 100755
index 0000000..c1137f9
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_rec_playback_enabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_rec_stop_disabled.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_rec_stop_disabled.png
new file mode 100755
index 0000000..efbc115
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_rec_stop_disabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_rec_stop_enabled.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_rec_stop_enabled.png
new file mode 100755
index 0000000..13e35a1
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_rec_stop_enabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_record_disabled.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_record_disabled.png
new file mode 100755
index 0000000..c208f73
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_record_disabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_record_enabled.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_record_enabled.png
new file mode 100755
index 0000000..3f27dd0
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_record_enabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_start.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_start.png
new file mode 100755
index 0000000..17a20c2
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_start.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_start_disable.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_start_disable.png
new file mode 100755
index 0000000..da098e8
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_start_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_stop.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_stop.png
new file mode 100755
index 0000000..2650185
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_stop.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_stop_disable.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_stop_disable.png
new file mode 100755
index 0000000..01b9a95
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_stop_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldpi/fm_anim.png b/MediaTek/FmRadio/res/drawable-ldpi/fm_anim.png
new file mode 100755
index 0000000..20c55ad
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldpi/fm_anim.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldpi/fm_title_icon.png b/MediaTek/FmRadio/res/drawable-ldpi/fm_title_icon.png
new file mode 100755
index 0000000..672e050
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldpi/fm_title_icon.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldpi/ic_launcher.png b/MediaTek/FmRadio/res/drawable-ldpi/ic_launcher.png
new file mode 100755
index 0000000..fc1da78
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldpi/ic_launcher.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_decrease.png b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_decrease.png
new file mode 100755
index 0000000..6b3ac01
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_decrease.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_decrease_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_decrease_disable.png
new file mode 100755
index 0000000..c3c46be
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_decrease_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_increase.png b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_increase.png
new file mode 100755
index 0000000..0c67050
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_increase.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_increase_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_increase_disable.png
new file mode 100755
index 0000000..4d68e66
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_increase_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_list.png b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_list.png
new file mode 100755
index 0000000..6bf78a9
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_list.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_list_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_list_disable.png
new file mode 100755
index 0000000..0812c1b
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_list_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_nextstation.png b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_nextstation.png
new file mode 100755
index 0000000..ac7d6b0
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_nextstation.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_nextstation_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_nextstation_disable.png
new file mode 100755
index 0000000..c402fa1
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_nextstation_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_prevstation.png b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_prevstation.png
new file mode 100755
index 0000000..1b4276d
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_prevstation.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_prevstation_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_prevstation_disable.png
new file mode 100755
index 0000000..0b787c1
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_prevstation_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_rec_playback_disabled.png b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_rec_playback_disabled.png
new file mode 100755
index 0000000..6ecb091
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_rec_playback_disabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_rec_playback_enabled.png b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_rec_playback_enabled.png
new file mode 100755
index 0000000..6cb1a31
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_rec_playback_enabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/fm_anim.png b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/fm_anim.png
new file mode 100755
index 0000000..44b5107
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/fm_anim.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_decrease.png b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_decrease.png
new file mode 100755
index 0000000..65d407e
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_decrease.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_decrease_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_decrease_disable.png
new file mode 100755
index 0000000..880b55f
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_decrease_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_increase.png b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_increase.png
new file mode 100755
index 0000000..d8cfbd3
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_increase.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_increase_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_increase_disable.png
new file mode 100755
index 0000000..41197c0
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_increase_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_list.png b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_list.png
new file mode 100755
index 0000000..b0fc9e1
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_list.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_nextstation.png b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_nextstation.png
new file mode 100755
index 0000000..47e9a70
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_nextstation.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_nextstation_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_nextstation_disable.png
new file mode 100755
index 0000000..acd9c45
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_nextstation_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_prevstation.png b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_prevstation.png
new file mode 100755
index 0000000..5318e4b
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_prevstation.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_prevstation_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_prevstation_disable.png
new file mode 100755
index 0000000..abe6eb2
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_prevstation_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_rec_playback_disabled.png b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_rec_playback_disabled.png
new file mode 100755
index 0000000..14ccbeb
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_rec_playback_disabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_rec_playback_enabled.png b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_rec_playback_enabled.png
new file mode 100755
index 0000000..1a4aa77
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_rec_playback_enabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/fm_anim.png b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/fm_anim.png
new file mode 100755
index 0000000..f4a63ee
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/fm_anim.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_decrease.png b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_decrease.png
new file mode 100755
index 0000000..bcd0611
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_decrease.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_decrease_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_decrease_disable.png
new file mode 100755
index 0000000..f75b2de
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_decrease_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_increase.png b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_increase.png
new file mode 100755
index 0000000..8c7cc8b
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_increase.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_increase_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_increase_disable.png
new file mode 100755
index 0000000..fb5875d
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_increase_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_list.png b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_list.png
new file mode 100755
index 0000000..b88d8a9
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_list.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_list_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_list_disable.png
new file mode 100755
index 0000000..9813971
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_list_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_nextstation.png b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_nextstation.png
new file mode 100755
index 0000000..162164c
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_nextstation.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_nextstation_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_nextstation_disable.png
new file mode 100755
index 0000000..1b95d49
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_nextstation_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_prevstation.png b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_prevstation.png
new file mode 100755
index 0000000..7c6e06a
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_prevstation.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_prevstation_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_prevstation_disable.png
new file mode 100755
index 0000000..e9ca061
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_prevstation_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_rec_playback_disabled.png b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_rec_playback_disabled.png
new file mode 100755
index 0000000..d1447fb
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_rec_playback_disabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_rec_playback_enabled.png b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_rec_playback_enabled.png
new file mode 100755
index 0000000..3d0dfef
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_rec_playback_enabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/fm_anim.png b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/fm_anim.png
new file mode 100755
index 0000000..28e09d3
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/fm_anim.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_decrease.png b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_decrease.png
new file mode 100755
index 0000000..9a44bf3
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_decrease.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_decrease_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_decrease_disable.png
new file mode 100755
index 0000000..dbcb0cf
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_decrease_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_increase.png b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_increase.png
new file mode 100755
index 0000000..877bb86
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_increase.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_increase_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_increase_disable.png
new file mode 100755
index 0000000..b53e3ad
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_increase_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_list.png b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_list.png
new file mode 100755
index 0000000..a6313e2
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_list.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_list_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_list_disable.png
new file mode 100755
index 0000000..5064901
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_list_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_nextstation.png b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_nextstation.png
new file mode 100755
index 0000000..a0d9bd9
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_nextstation.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_nextstation_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_nextstation_disable.png
new file mode 100755
index 0000000..5aa0d07
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_nextstation_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_prevstation.png b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_prevstation.png
new file mode 100755
index 0000000..2933bd4
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_prevstation.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_prevstation_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_prevstation_disable.png
new file mode 100755
index 0000000..b042212
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_prevstation_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_rec_playback_disabled.png b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_rec_playback_disabled.png
new file mode 100755
index 0000000..27593fc
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_rec_playback_disabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_rec_playback_enabled.png b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_rec_playback_enabled.png
new file mode 100755
index 0000000..cf165ec
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_rec_playback_enabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/fm_anim.png b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/fm_anim.png
new file mode 100755
index 0000000..70791f5
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/fm_anim.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_decrease.png b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_decrease.png
new file mode 100755
index 0000000..9a44bf3
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_decrease.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_decrease_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_decrease_disable.png
new file mode 100755
index 0000000..dbcb0cf
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_decrease_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_increase.png b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_increase.png
new file mode 100755
index 0000000..877bb86
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_increase.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_increase_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_increase_disable.png
new file mode 100755
index 0000000..b53e3ad
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_increase_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_list.png b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_list.png
new file mode 100755
index 0000000..a6313e2
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_list.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_list_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_list_disable.png
new file mode 100755
index 0000000..5064901
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_list_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_nextstation.png b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_nextstation.png
new file mode 100755
index 0000000..a0d9bd9
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_nextstation.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_nextstation_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_nextstation_disable.png
new file mode 100755
index 0000000..5aa0d07
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_nextstation_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_prevstation.png b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_prevstation.png
new file mode 100755
index 0000000..2933bd4
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_prevstation.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_prevstation_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_prevstation_disable.png
new file mode 100755
index 0000000..b042212
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_prevstation_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_rec_playback_disabled.png b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_rec_playback_disabled.png
new file mode 100755
index 0000000..27593fc
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_rec_playback_disabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_rec_playback_enabled.png b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_rec_playback_enabled.png
new file mode 100755
index 0000000..cf165ec
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_rec_playback_enabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/fm_anim.png b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/fm_anim.png
new file mode 100755
index 0000000..70791f5
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/fm_anim.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-ldrtl/anim.xml b/MediaTek/FmRadio/res/drawable-ldrtl/anim.xml
new file mode 100755
index 0000000..ea41e38
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-ldrtl/anim.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+<translate
+ android:repeatCount="1000"
+ android:fromXDelta="180%p"
+ android:toXDelta="-100%p"
+ android:duration="500"
+ />
+</set> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/drawable-mdpi/bg_rec_infobar.9.png b/MediaTek/FmRadio/res/drawable-mdpi/bg_rec_infobar.9.png
new file mode 100755
index 0000000..c38132d
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-mdpi/bg_rec_infobar.9.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-mdpi/bottom_bar.9.png b/MediaTek/FmRadio/res/drawable-mdpi/bottom_bar.9.png
new file mode 100755
index 0000000..4985b08
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-mdpi/bottom_bar.9.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_decrease.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_decrease.png
new file mode 100755
index 0000000..0111567
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_decrease.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_decrease_disable.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_decrease_disable.png
new file mode 100755
index 0000000..de3e323
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_decrease_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_favorite_off.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_favorite_off.png
new file mode 100755
index 0000000..05563bf
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_favorite_off.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_favorite_on.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_favorite_on.png
new file mode 100755
index 0000000..c0c6b49
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_favorite_on.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_increase.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_increase.png
new file mode 100755
index 0000000..772530f
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_increase.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_increase_disable.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_increase_disable.png
new file mode 100755
index 0000000..f362f89
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_increase_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_list.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_list.png
new file mode 100755
index 0000000..5eaf0ba
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_list.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_list_disable.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_list_disable.png
new file mode 100755
index 0000000..8fe43b4
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_list_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_nextstation.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_nextstation.png
new file mode 100755
index 0000000..01fbc5a
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_nextstation.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_nextstation_disable.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_nextstation_disable.png
new file mode 100755
index 0000000..997485f
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_nextstation_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_overflow.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_overflow.png
new file mode 100755
index 0000000..80e2504
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_overflow.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_overflow_disable.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_overflow_disable.png
new file mode 100755
index 0000000..3a7bab7
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_overflow_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_prevstation.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_prevstation.png
new file mode 100755
index 0000000..1fe787f
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_prevstation.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_prevstation_disable.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_prevstation_disable.png
new file mode 100755
index 0000000..71803b8
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_prevstation_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_rec_playback_disabled.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_rec_playback_disabled.png
new file mode 100755
index 0000000..4e1fe7f
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_rec_playback_disabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_rec_playback_enabled.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_rec_playback_enabled.png
new file mode 100755
index 0000000..48ee750
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_rec_playback_enabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_rec_stop_disabled.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_rec_stop_disabled.png
new file mode 100755
index 0000000..b54058f
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_rec_stop_disabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_rec_stop_enabled.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_rec_stop_enabled.png
new file mode 100755
index 0000000..08f8388
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_rec_stop_enabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_record_disabled.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_record_disabled.png
new file mode 100755
index 0000000..0b464d2
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_record_disabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_record_enabled.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_record_enabled.png
new file mode 100755
index 0000000..026b9d1
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_record_enabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_start.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_start.png
new file mode 100755
index 0000000..ff53bb9
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_start.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_start_disable.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_start_disable.png
new file mode 100755
index 0000000..1bbfb9e
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_start_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_stop.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_stop.png
new file mode 100755
index 0000000..134807f
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_stop.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_stop_disable.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_stop_disable.png
new file mode 100755
index 0000000..f9b804a
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_stop_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-mdpi/fm_anim.png b/MediaTek/FmRadio/res/drawable-mdpi/fm_anim.png
new file mode 100755
index 0000000..116af88
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-mdpi/fm_anim.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-mdpi/fm_title_icon.png b/MediaTek/FmRadio/res/drawable-mdpi/fm_title_icon.png
new file mode 100755
index 0000000..2f38c87
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-mdpi/fm_title_icon.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-mdpi/ic_launcher.png b/MediaTek/FmRadio/res/drawable-mdpi/ic_launcher.png
new file mode 100755
index 0000000..d1cb30b
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-sw1024dp-ldpi/btn_fm_favorite_off.png b/MediaTek/FmRadio/res/drawable-sw1024dp-ldpi/btn_fm_favorite_off.png
new file mode 100755
index 0000000..05563bf
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-sw1024dp-ldpi/btn_fm_favorite_off.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-sw1024dp-ldpi/btn_fm_favorite_on.png b/MediaTek/FmRadio/res/drawable-sw1024dp-ldpi/btn_fm_favorite_on.png
new file mode 100755
index 0000000..c0c6b49
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-sw1024dp-ldpi/btn_fm_favorite_on.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/bg_rec_infobar.9.png b/MediaTek/FmRadio/res/drawable-xhdpi/bg_rec_infobar.9.png
new file mode 100755
index 0000000..c38132d
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xhdpi/bg_rec_infobar.9.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/bottom_bar.9.png b/MediaTek/FmRadio/res/drawable-xhdpi/bottom_bar.9.png
new file mode 100755
index 0000000..4985b08
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xhdpi/bottom_bar.9.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_decrease.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_decrease.png
new file mode 100755
index 0000000..4dd4042
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_decrease.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_decrease_disable.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_decrease_disable.png
new file mode 100755
index 0000000..06fe97c
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_decrease_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_favorite_off.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_favorite_off.png
new file mode 100755
index 0000000..c591cae
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_favorite_off.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_favorite_on.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_favorite_on.png
new file mode 100755
index 0000000..8f14270
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_favorite_on.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_increase.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_increase.png
new file mode 100755
index 0000000..45ce276
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_increase.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_increase_disable.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_increase_disable.png
new file mode 100755
index 0000000..16b948e
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_increase_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_list.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_list.png
new file mode 100755
index 0000000..3028829
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_list.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_list_disable.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_list_disable.png
new file mode 100755
index 0000000..8ce3d27
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_list_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_nextstation.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_nextstation.png
new file mode 100755
index 0000000..07f4c44
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_nextstation.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_nextstation_disable.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_nextstation_disable.png
new file mode 100755
index 0000000..9929646
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_nextstation_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_overflow.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_overflow.png
new file mode 100755
index 0000000..3902d93
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_overflow.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_overflow_disable.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_overflow_disable.png
new file mode 100755
index 0000000..9494074
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_overflow_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_prevstation.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_prevstation.png
new file mode 100755
index 0000000..0b38c7a
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_prevstation.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_prevstation_disable.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_prevstation_disable.png
new file mode 100755
index 0000000..7743e11
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_prevstation_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_rec_playback_disabled.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_rec_playback_disabled.png
new file mode 100755
index 0000000..dead2bd
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_rec_playback_disabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_rec_playback_enabled.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_rec_playback_enabled.png
new file mode 100755
index 0000000..bb9582a
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_rec_playback_enabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_rec_stop_disabled.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_rec_stop_disabled.png
new file mode 100755
index 0000000..4bef4e8
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_rec_stop_disabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_rec_stop_enabled.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_rec_stop_enabled.png
new file mode 100755
index 0000000..d2c6c90
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_rec_stop_enabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_record_disabled.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_record_disabled.png
new file mode 100755
index 0000000..96590b2
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_record_disabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_record_enabled.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_record_enabled.png
new file mode 100755
index 0000000..8c97fcd
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_record_enabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_start.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_start.png
new file mode 100755
index 0000000..e6c0f6b
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_start.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_start_disable.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_start_disable.png
new file mode 100755
index 0000000..4fdda08
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_start_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_stop.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_stop.png
new file mode 100755
index 0000000..68135bc
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_stop.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_stop_disable.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_stop_disable.png
new file mode 100755
index 0000000..bc88941
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_stop_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/fm_anim.png b/MediaTek/FmRadio/res/drawable-xhdpi/fm_anim.png
new file mode 100755
index 0000000..420dc9c
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xhdpi/fm_anim.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/fm_title_icon.png b/MediaTek/FmRadio/res/drawable-xhdpi/fm_title_icon.png
new file mode 100755
index 0000000..a8d9f5d
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xhdpi/fm_title_icon.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/ic_launcher.png b/MediaTek/FmRadio/res/drawable-xhdpi/ic_launcher.png
new file mode 100755
index 0000000..c11060e
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/bg_rec_infobar.9.png b/MediaTek/FmRadio/res/drawable-xxhdpi/bg_rec_infobar.9.png
new file mode 100755
index 0000000..c38132d
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xxhdpi/bg_rec_infobar.9.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/bottom_bar.9.png b/MediaTek/FmRadio/res/drawable-xxhdpi/bottom_bar.9.png
new file mode 100755
index 0000000..4985b08
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xxhdpi/bottom_bar.9.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_decrease.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_decrease.png
new file mode 100755
index 0000000..4dd4042
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_decrease.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_decrease_disable.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_decrease_disable.png
new file mode 100755
index 0000000..06fe97c
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_decrease_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_favorite_off.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_favorite_off.png
new file mode 100755
index 0000000..c591cae
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_favorite_off.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_favorite_on.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_favorite_on.png
new file mode 100755
index 0000000..8f14270
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_favorite_on.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_increase.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_increase.png
new file mode 100755
index 0000000..45ce276
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_increase.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_increase_disable.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_increase_disable.png
new file mode 100755
index 0000000..16b948e
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_increase_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_list.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_list.png
new file mode 100755
index 0000000..3028829
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_list.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_list_disable.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_list_disable.png
new file mode 100755
index 0000000..8ce3d27
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_list_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_nextstation.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_nextstation.png
new file mode 100755
index 0000000..07f4c44
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_nextstation.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_nextstation_disable.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_nextstation_disable.png
new file mode 100755
index 0000000..9929646
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_nextstation_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_overflow.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_overflow.png
new file mode 100755
index 0000000..3902d93
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_overflow.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_overflow_disable.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_overflow_disable.png
new file mode 100755
index 0000000..9494074
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_overflow_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_prevstation.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_prevstation.png
new file mode 100755
index 0000000..0b38c7a
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_prevstation.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_prevstation_disable.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_prevstation_disable.png
new file mode 100755
index 0000000..7743e11
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_prevstation_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_rec_playback_disabled.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_rec_playback_disabled.png
new file mode 100755
index 0000000..dead2bd
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_rec_playback_disabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_rec_playback_enabled.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_rec_playback_enabled.png
new file mode 100755
index 0000000..bb9582a
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_rec_playback_enabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_rec_stop_disabled.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_rec_stop_disabled.png
new file mode 100755
index 0000000..4bef4e8
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_rec_stop_disabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_rec_stop_enabled.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_rec_stop_enabled.png
new file mode 100755
index 0000000..d2c6c90
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_rec_stop_enabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_record_disabled.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_record_disabled.png
new file mode 100755
index 0000000..96590b2
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_record_disabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_record_enabled.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_record_enabled.png
new file mode 100755
index 0000000..8c97fcd
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_record_enabled.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_start.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_start.png
new file mode 100755
index 0000000..e6c0f6b
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_start.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_start_disable.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_start_disable.png
new file mode 100755
index 0000000..4fdda08
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_start_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_stop.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_stop.png
new file mode 100755
index 0000000..68135bc
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_stop.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_stop_disable.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_stop_disable.png
new file mode 100755
index 0000000..bc88941
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_stop_disable.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/fm_anim.png b/MediaTek/FmRadio/res/drawable-xxhdpi/fm_anim.png
new file mode 100755
index 0000000..420dc9c
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xxhdpi/fm_anim.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/fm_title_icon.png b/MediaTek/FmRadio/res/drawable-xxhdpi/fm_title_icon.png
new file mode 100755
index 0000000..1ba5028
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xxhdpi/fm_title_icon.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/ic_launcher.png b/MediaTek/FmRadio/res/drawable-xxhdpi/ic_launcher.png
new file mode 100755
index 0000000..964da33
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/MediaTek/FmRadio/res/drawable/anim.xml b/MediaTek/FmRadio/res/drawable/anim.xml
new file mode 100755
index 0000000..dcd3738
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable/anim.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+<translate
+ android:repeatCount="1000"
+ android:fromXDelta="-80%p"
+ android:toXDelta="100%p"
+ android:duration="500"
+ />
+</set> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/drawable/btn_fm_decrease_frequency.xml b/MediaTek/FmRadio/res/drawable/btn_fm_decrease_frequency.xml
new file mode 100755
index 0000000..fa6f858
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable/btn_fm_decrease_frequency.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_enabled="true"
+ android:drawable="@drawable/btn_fm_decrease" />
+ <item android:state_enabled="false"
+ android:drawable="@drawable/btn_fm_decrease_disable" />
+</selector>
diff --git a/MediaTek/FmRadio/res/drawable/btn_fm_favorite_off_selector.xml b/MediaTek/FmRadio/res/drawable/btn_fm_favorite_off_selector.xml
new file mode 100755
index 0000000..0d526d4
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable/btn_fm_favorite_off_selector.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:drawable="@drawable/btn_fm_favorite_off" />
+</selector>
diff --git a/MediaTek/FmRadio/res/drawable/btn_fm_favorite_on_selector.xml b/MediaTek/FmRadio/res/drawable/btn_fm_favorite_on_selector.xml
new file mode 100755
index 0000000..08e2c5c
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable/btn_fm_favorite_on_selector.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:drawable="@drawable/btn_fm_favorite_on" />
+</selector>
diff --git a/MediaTek/FmRadio/res/drawable/btn_fm_increase_frequency.xml b/MediaTek/FmRadio/res/drawable/btn_fm_increase_frequency.xml
new file mode 100755
index 0000000..d31c0cc
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable/btn_fm_increase_frequency.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_enabled="true"
+ android:drawable="@drawable/btn_fm_increase" />
+ <item android:state_enabled="false"
+ android:drawable="@drawable/btn_fm_increase_disable" />
+</selector>
diff --git a/MediaTek/FmRadio/res/drawable/btn_fm_list_selector.xml b/MediaTek/FmRadio/res/drawable/btn_fm_list_selector.xml
new file mode 100755
index 0000000..8fbcb87
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable/btn_fm_list_selector.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_enabled="true"
+ android:drawable="@drawable/btn_fm_list" />
+ <item android:state_enabled="false"
+ android:drawable="@drawable/btn_fm_list_disable" />
+</selector>
diff --git a/MediaTek/FmRadio/res/drawable/btn_fm_next.xml b/MediaTek/FmRadio/res/drawable/btn_fm_next.xml
new file mode 100755
index 0000000..6ecc323
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable/btn_fm_next.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_enabled="true"
+ android:drawable="@drawable/btn_fm_nextstation" />
+ <item android:state_enabled="false"
+ android:drawable="@drawable/btn_fm_nextstation_disable" />
+</selector>
diff --git a/MediaTek/FmRadio/res/drawable/btn_fm_overflow_selector.xml b/MediaTek/FmRadio/res/drawable/btn_fm_overflow_selector.xml
new file mode 100755
index 0000000..a3c6410
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable/btn_fm_overflow_selector.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_enabled="true"
+ android:drawable="@drawable/btn_fm_overflow" />
+ <item android:state_enabled="false"
+ android:drawable="@drawable/btn_fm_overflow_disable" />
+</selector>
diff --git a/MediaTek/FmRadio/res/drawable/btn_fm_powerdown_selector.xml b/MediaTek/FmRadio/res/drawable/btn_fm_powerdown_selector.xml
new file mode 100755
index 0000000..ccce13a
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable/btn_fm_powerdown_selector.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_enabled="true"
+ android:drawable="@drawable/btn_fm_stop" />
+ <item android:state_enabled="false"
+ android:drawable="@drawable/btn_fm_stop_disable" />
+</selector>
diff --git a/MediaTek/FmRadio/res/drawable/btn_fm_powerup_selector.xml b/MediaTek/FmRadio/res/drawable/btn_fm_powerup_selector.xml
new file mode 100755
index 0000000..a81c592
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable/btn_fm_powerup_selector.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_enabled="true"
+ android:drawable="@drawable/btn_fm_start" />
+ <item android:state_enabled="false"
+ android:drawable="@drawable/btn_fm_start_disable" />
+</selector>
diff --git a/MediaTek/FmRadio/res/drawable/btn_fm_previous.xml b/MediaTek/FmRadio/res/drawable/btn_fm_previous.xml
new file mode 100755
index 0000000..dc7c9b5
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable/btn_fm_previous.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_enabled="true"
+ android:drawable="@drawable/btn_fm_prevstation" />
+ <item android:state_enabled="false"
+ android:drawable="@drawable/btn_fm_prevstation_disable" />
+</selector>
diff --git a/MediaTek/FmRadio/res/drawable/btn_fm_rec_play.xml b/MediaTek/FmRadio/res/drawable/btn_fm_rec_play.xml
new file mode 100755
index 0000000..9bf10d8
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable/btn_fm_rec_play.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_enabled="true"
+ android:drawable="@drawable/btn_fm_rec_playback_enabled" />
+ <item android:state_enabled="false"
+ android:drawable="@drawable/btn_fm_rec_playback_disabled" />
+</selector>
diff --git a/MediaTek/FmRadio/res/drawable/btn_fm_rec_stop.xml b/MediaTek/FmRadio/res/drawable/btn_fm_rec_stop.xml
new file mode 100755
index 0000000..c954bee
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable/btn_fm_rec_stop.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_enabled="true"
+ android:drawable="@drawable/btn_fm_rec_stop_enabled" />
+ <item android:state_enabled="false"
+ android:drawable="@drawable/btn_fm_rec_stop_disabled" />
+</selector>
diff --git a/MediaTek/FmRadio/res/drawable/btn_fm_record.xml b/MediaTek/FmRadio/res/drawable/btn_fm_record.xml
new file mode 100755
index 0000000..ae54431
--- /dev/null
+++ b/MediaTek/FmRadio/res/drawable/btn_fm_record.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_enabled="true"
+ android:drawable="@drawable/btn_fm_record_enabled" />
+ <item android:state_enabled="false"
+ android:drawable="@drawable/btn_fm_record_disabled" />
+</selector>
diff --git a/MediaTek/FmRadio/res/layout-ldrtl/addstation.xml b/MediaTek/FmRadio/res/layout-ldrtl/addstation.xml
new file mode 100755
index 0000000..78032de
--- /dev/null
+++ b/MediaTek/FmRadio/res/layout-ldrtl/addstation.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:id="@+id/layout_add_station"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textDirection="locale">
+<TextView
+ android:id="@+id/dlg_add_station_name"
+ android:text="@string/dlg_addedit_station_name"
+ android:layout_width="wrap_content"
+ android:layout_height="50dip"
+ android:textStyle="bold"
+ android:layout_marginLeft="10dip"
+ android:gravity="center_vertical"/>
+<EditText
+ android:layout_toEndOf="@+id/dlg_add_station_name"
+ android:layout_height="50dip"
+ android:id="@+id/dlg_add_station_name_text"
+ android:layout_width="fill_parent"
+ android:textStyle="bold"
+ android:layout_marginStart="10dip"
+ android:layout_marginEnd="10dip"
+ android:maxLength="15"
+ android:inputType="textPersonName"
+ android:gravity="center_vertical"
+ android:textDirection="locale"></EditText>
+<TextView
+ android:id="@+id/dlg_add_station_freq"
+ android:text="@string/dlg_addedit_station_freq"
+ android:layout_width="wrap_content"
+ android:layout_height="50dip"
+ android:textStyle="bold"
+ android:layout_marginStart="10dip"
+ android:layout_below="@+id/dlg_add_station_name"
+ android:gravity="center_vertical"/>
+<TextView
+ android:id="@+id/dlg_add_station_freq_text"
+ android:layout_width="wrap_content"
+ android:layout_height="50dip"
+ android:textStyle="bold"
+ android:layout_marginStart="10dip"
+ android:layout_below="@+id/dlg_add_station_name"
+ android:layout_toEndOf="@+id/dlg_add_station_freq"
+ android:gravity="center_vertical"/>
+</RelativeLayout> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/layout-ldrtl/editstation.xml b/MediaTek/FmRadio/res/layout-ldrtl/editstation.xml
new file mode 100755
index 0000000..3ed5acb
--- /dev/null
+++ b/MediaTek/FmRadio/res/layout-ldrtl/editstation.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:id="@+id/layout_edit_station"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textDirection="locale">
+<TextView
+ android:id="@+id/dlg_edit_station_name"
+ android:text="@string/dlg_addedit_station_name"
+ android:layout_width="wrap_content"
+ android:layout_height="50dip"
+ android:textStyle="bold"
+ android:layout_marginStart="10dip"
+ android:gravity="center_vertical"/>
+<EditText
+ android:id="@+id/dlg_edit_station_name_text"
+ android:layout_width="match_parent"
+ android:layout_height="50dip"
+ android:layout_marginStart="10dip"
+ android:layout_marginEnd="10dip"
+ android:layout_toEndOf="@+id/dlg_edit_station_name"
+ android:gravity="center_vertical"
+ android:inputType="textPersonName"
+ android:maxLength="15"
+ android:singleLine="true"
+ android:textStyle="bold"
+ android:textDirection="locale">
+</EditText>
+<TextView
+ android:id="@+id/dlg_edit_station_freq"
+ android:text="@string/dlg_addedit_station_freq"
+ android:layout_width="wrap_content"
+ android:layout_height="50dip"
+ android:textStyle="bold"
+ android:layout_marginStart="10dip"
+ android:layout_below="@+id/dlg_edit_station_name"
+ android:gravity="center_vertical"/>
+<EditText
+ android:id="@+id/dlg_edit_station_freq_text"
+ android:layout_width="match_parent"
+ android:layout_height="50dip"
+ android:textStyle="bold"
+ android:layout_marginStart="10dip"
+ android:inputType="numberDecimal"
+ android:layout_below="@+id/dlg_edit_station_name"
+ android:layout_toEndOf="@+id/dlg_edit_station_freq"
+ android:gravity="center_vertical"
+ android:textDirection="locale"/>
+</RelativeLayout> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/layout-ldrtl/fm_recorder_dialog.xml b/MediaTek/FmRadio/res/layout-ldrtl/fm_recorder_dialog.xml
new file mode 100755
index 0000000..35f92f2
--- /dev/null
+++ b/MediaTek/FmRadio/res/layout-ldrtl/fm_recorder_dialog.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/fm_recording_layout"
+ android:orientation="vertical"
+ android:layout_width="286dp"
+ android:layout_height="wrap_content">
+ <TextView
+ android:id="@+id/fm_recording_title_bar"
+ style="?android:attr/windowTitleStyle"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="53dp"
+ android:padding="10dp"
+ android:singleLine="true"
+ android:gravity="right"
+ android:text="@string/dlg_save_recording_title"/>
+ <View
+ android:id="@+id/divider"
+ android:layout_width="match_parent"
+ android:layout_height="2dp"
+ android:background="#31b6e7" />
+ <LinearLayout
+ android:id="@+id/contentPanel"
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center">
+ <TextView
+ android:id="@+id/save_recording_storage_warning"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:visibility="gone"
+ android:paddingLeft="12dip"
+ android:paddingRight="12dip"
+ android:text="@string/dlg_save_recording_storage_warning"
+ style="?android:attr/textAppearanceMedium"/>
+ </LinearLayout>
+ <LinearLayout
+ android:id="@+id/contentPanel"
+ android:orientation="horizontal"
+ android:layout_width="wrap_content"
+ android:layout_height="68dp"
+ android:gravity="center">
+ <EditText
+ android:id="@+id/fm_recording_text"
+ android:layout_width="265dp"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:maxLength="80"
+ android:textDirection="locale"/>
+ </LinearLayout>
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:background="#424542" />
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+ <Button
+ android:id="@+id/fm_recording_btn_discard"
+ style="?android:attr/buttonBarButtonStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="@string/btn_discard_recording"/>
+
+ <View
+ android:layout_width="1dp"
+ android:layout_height="match_parent"
+ android:background="#424542" />
+ <Button
+ android:id="@+id/fm_recording_btn_save"
+ style="?android:attr/buttonBarButtonStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="@string/btn_save_recording"/>
+
+ </LinearLayout>
+</LinearLayout> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/layout-ldrtl/main.xml b/MediaTek/FmRadio/res/layout-ldrtl/main.xml
new file mode 100755
index 0000000..e2ea4dc
--- /dev/null
+++ b/MediaTek/FmRadio/res/layout-ldrtl/main.xml
@@ -0,0 +1,243 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/main_view"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:orientation="vertical" >
+ <!-- middle part starts -->
+
+ <RelativeLayout
+ android:id="@+id/rl_middlepart"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_above="@+id/bottombar_parent">
+
+ <TextView
+ android:id="@+id/station_name"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_above="@+id/station_value"
+ android:gravity="center"
+ android:singleLine="true"
+ android:textSize="20dip"
+ android:textStyle="bold" >
+ </TextView>
+
+ <TextView
+ android:id="@+id/text_fm"
+ android:layout_width="80dip"
+ android:layout_height="wrap_content"
+ android:layout_below="@+id/station_name"
+ android:layout_toStartOf="@+id/station_value"
+ android:gravity="center_horizontal"
+ android:textSize="20dip"
+ android:textStyle="bold" >
+ </TextView>
+
+ <TextView
+ android:id="@+id/station_value"
+ android:layout_width="160dip"
+ android:layout_height="wrap_content"
+ android:layout_centerInParent="true"
+ android:gravity="center_horizontal"
+ android:textSize="60dip"
+ android:textStyle="bold" >
+ </TextView>
+
+ <TextView
+ android:id="@+id/text_mhz"
+ android:layout_width="80dip"
+ android:layout_height="wrap_content"
+ android:layout_alignBaseline="@+id/station_value"
+ android:layout_below="@+id/station_name"
+ android:layout_toEndOf="@+id/station_value"
+ android:gravity="center_horizontal"
+ android:textSize="20dip"
+ android:textStyle="bold" >
+ </TextView>
+
+ <TextView
+ android:id="@+id/text_rds"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_below="@+id/station_value"
+ android:ellipsize="marquee"
+ android:gravity="center_horizontal"
+ android:marqueeRepeatLimit="marquee_forever"
+ android:singleLine="true"
+ android:textColor="#BBBBBB"
+ android:textSize="20dip"
+ android:textStyle="bold" >
+ </TextView>
+
+ <ImageButton
+ android:id="@+id/button_add_to_favorite"
+ android:layout_marginStart="15dip"
+ android:layout_width="50dip"
+ android:layout_height="42dip"
+ android:layout_alignTop="@+id/text_mhz"
+ android:layout_toEndOf="@+id/station_value"
+ android:adjustViewBounds="true"
+ style="?android:attr/buttonBarButtonStyle"
+ android:src="@drawable/btn_fm_favorite_off"
+ android:enabled="false">
+ </ImageButton>
+ </RelativeLayout>
+
+ <!-- middle part ends -->
+
+ <LinearLayout
+ android:id="@+id/bottombar_parent"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true" >
+
+ <LinearLayout
+ android:id="@+id/bottom_bar"
+ android:layout_width="fill_parent"
+ android:layout_height="60dip"
+ android:layout_alignParentBottom="true"
+ android:background="@drawable/bottom_bar"
+ android:gravity="center_vertical"
+ android:splitMotionEvents="false"
+ android:weightSum="4" >
+
+ <!-- Must set the background to "btn_pressed" which is the same with what is set in source code. -->
+ <!-- Because if not set it, the button size will change when clicked. -->
+
+ <ImageButton
+ android:id="@+id/button_prevstation"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ style="?android:attr/buttonBarButtonStyle"
+ android:layout_weight="1"
+ android:adjustViewBounds="true"
+ android:src="@drawable/btn_fm_previous"
+ android:enabled="false"/>
+
+ <ImageButton
+ android:id="@+id/button_decrease"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:adjustViewBounds="true"
+ style="?android:attr/buttonBarButtonStyle"
+ android:src="@drawable/btn_fm_decrease_frequency"
+ android:enabled="false" />
+
+ <ImageButton
+ android:id="@+id/button_increase"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:adjustViewBounds="true"
+ style="?android:attr/buttonBarButtonStyle"
+ android:src="@drawable/btn_fm_increase_frequency"
+ android:enabled="false" />
+
+ <ImageButton
+ android:id="@+id/button_nextstation"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:adjustViewBounds="true"
+ style="?android:attr/buttonBarButtonStyle"
+ android:src="@drawable/btn_fm_next"
+ android:enabled="false" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/bottom_bar_recorder"
+ android:layout_width="match_parent"
+ android:layout_height="60dip"
+ android:layout_alignParentBottom="true"
+ android:background="@drawable/bottom_bar"
+ android:gravity="center_vertical"
+ android:visibility="gone"
+ android:splitMotionEvents="false"
+ android:weightSum="3" >
+
+ <!-- Must set the background to "btn_pressed" which is the same with what is set in source code. -->
+ <!-- Because if not set it, the button size will change when clicked. -->
+
+ <ImageButton
+ android:id="@+id/btn_record"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ style="?android:attr/buttonBarButtonStyle"
+ android:src="@drawable/btn_fm_record"
+ android:enabled="false"/>
+
+ <ImageButton
+ android:id="@+id/btn_stop"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ style="?android:attr/buttonBarButtonStyle"
+ android:src="@drawable/btn_fm_rec_stop"
+ android:enabled="false"/>
+
+ <ImageButton
+ android:id="@+id/btn_playback"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ style="?android:attr/buttonBarButtonStyle"
+ android:src="@drawable/btn_fm_rec_play"
+ android:enabled="false"/>
+ </LinearLayout>
+ </LinearLayout>
+
+ <RelativeLayout
+ android:id="@+id/rl_recinfo"
+ android:layout_width="match_parent"
+ android:layout_height="48dip"
+ android:layout_above="@id/bottombar_parent"
+ android:background="@drawable/bg_rec_infobar"
+ android:gravity="right"
+ android:paddingStart="5dip"
+ android:paddingEnd="5dip"
+ android:visibility="gone" >
+
+ <TextView
+ android:id="@+id/txtRecInfoLeft"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentStart="true"
+ android:layout_toStartOf="@+id/txtRecInfoRight"
+ android:ellipsize="marquee"
+ android:singleLine="true"
+ android:textColor="#ffffff"
+ android:textSize="20sp"
+ android:gravity="right"
+ android:textStyle="normal" >
+ </TextView>
+
+ <TextView
+ android:id="@+id/txtRecInfoRight"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentEnd="true"
+ android:layout_marginStart="20dip"
+ android:textColor="#ffffff"
+ android:textSize="20sp"
+ android:textStyle="normal">
+ </TextView>
+ </RelativeLayout>
+
+ <LinearLayout
+ android:id="@+id/anim_background"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_above="@id/rl_recinfo" >
+
+ <ImageView
+ android:id="@+id/iv_anim"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@drawable/fm_anim"
+ android:visibility="invisible" />
+ </LinearLayout>
+
+</RelativeLayout>
diff --git a/MediaTek/FmRadio/res/layout-sw1024dp-land/main.xml b/MediaTek/FmRadio/res/layout-sw1024dp-land/main.xml
new file mode 100755
index 0000000..b0c2449
--- /dev/null
+++ b/MediaTek/FmRadio/res/layout-sw1024dp-land/main.xml
@@ -0,0 +1,270 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/main_view"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ <!-- middle part starts -->
+
+ <RelativeLayout
+ android:id="@+id/rl_middlepart"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_above="@+id/bottombar_parent">
+
+ <TextView
+ android:id="@+id/station_name"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_above="@+id/station_value"
+ android:gravity="center"
+ android:singleLine="true"
+ android:textSize="20dip"
+ android:textStyle="bold" />
+
+ <TextView
+ android:id="@+id/text_fm"
+ android:layout_width="80dip"
+ android:layout_height="wrap_content"
+ android:layout_below="@+id/station_name"
+ android:layout_toLeftOf="@+id/station_value"
+ android:gravity="center_horizontal"
+ android:textSize="30dip"
+ android:textStyle="bold" />
+
+ <TextView
+ android:id="@+id/station_value"
+ android:layout_width="240dip"
+ android:layout_height="wrap_content"
+ android:layout_centerInParent="true"
+ android:gravity="center_horizontal"
+ android:textSize="80dip"
+ android:textStyle="bold" />
+
+ <TextView
+ android:id="@+id/text_mhz"
+ android:layout_width="80dip"
+ android:layout_height="wrap_content"
+ android:layout_alignBaseline="@+id/station_value"
+ android:layout_below="@+id/station_name"
+ android:layout_toRightOf="@+id/station_value"
+ android:gravity="center_horizontal"
+ android:textSize="30dip"
+ android:textStyle="bold" />
+
+ <TextView
+ android:id="@+id/text_rds"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_below="@+id/station_value"
+ android:ellipsize="marquee"
+ android:gravity="center_horizontal"
+ android:marqueeRepeatLimit="marquee_forever"
+ android:singleLine="true"
+ android:textColor="#BBBBBB"
+ android:textSize="20dip"
+ android:textStyle="bold" />
+
+ <ImageButton
+ android:id="@+id/button_add_to_favorite"
+ android:layout_marginLeft="15dip"
+ android:layout_width="50dip"
+ android:layout_height="42dip"
+ android:layout_alignTop="@+id/text_mhz"
+ android:layout_toRightOf="@+id/station_value"
+ android:adjustViewBounds="true"
+ style="?android:attr/buttonBarButtonStyle"
+ android:src="@drawable/btn_fm_favorite_off"
+ android:enabled="false" />
+ </RelativeLayout>
+
+ <!-- middle part ends -->
+
+ <LinearLayout
+ android:id="@+id/bottombar_parent"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true" >
+
+ <LinearLayout
+ android:id="@+id/bottom_bar"
+ android:layout_width="match_parent"
+ android:layout_height="60dip"
+ android:layout_alignParentBottom="true"
+ android:background="@drawable/bottom_bar"
+ android:gravity="center_vertical"
+ android:splitMotionEvents="false"
+ android:weightSum="4" >
+
+ <!-- Must set the background to "btn_pressed" which is the same with what is set in source code. -->
+ <!-- Because if not set it, the button size will change when clicked. -->
+
+ <ImageButton
+ android:id="@+id/button_prevstation"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ style="?android:attr/buttonBarButtonStyle"
+ android:layout_weight="1"
+ android:adjustViewBounds="true"
+ android:src="@drawable/btn_fm_previous"
+ android:enabled="false"/>
+
+ <ImageButton
+ android:id="@+id/button_decrease"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:adjustViewBounds="true"
+ style="?android:attr/buttonBarButtonStyle"
+ android:src="@drawable/btn_fm_decrease_frequency"
+ android:enabled="false" />
+
+ <ImageButton
+ android:id="@+id/button_increase"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:adjustViewBounds="true"
+ style="?android:attr/buttonBarButtonStyle"
+ android:src="@drawable/btn_fm_increase_frequency"
+ android:enabled="false" />
+
+ <ImageButton
+ android:id="@+id/button_nextstation"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:adjustViewBounds="true"
+ style="?android:attr/buttonBarButtonStyle"
+ android:src="@drawable/btn_fm_next"
+ android:enabled="false" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/bottom_bar_recorder"
+ android:layout_width="match_parent"
+ android:layout_height="60dip"
+ android:layout_alignParentBottom="true"
+ android:background="@drawable/bottom_bar"
+ android:gravity="center_vertical"
+ android:visibility="gone"
+ android:splitMotionEvents="false"
+ android:weightSum="3" >
+
+ <!-- Must set the background to "btn_pressed" which is the same with what is set in source code. -->
+ <!-- Because if not set it, the button size will change when clicked. -->
+
+ <ImageButton
+ android:id="@+id/btn_record"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ style="?android:attr/buttonBarButtonStyle"
+ android:src="@drawable/btn_fm_record"
+ android:enabled="false"/>
+
+ <ImageButton
+ android:id="@+id/btn_stop"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ style="?android:attr/buttonBarButtonStyle"
+ android:src="@drawable/btn_fm_rec_stop"
+ android:enabled="false"/>
+
+ <ImageButton
+ android:id="@+id/btn_playback"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ style="?android:attr/buttonBarButtonStyle"
+ android:src="@drawable/btn_fm_rec_play"
+ android:enabled="false"/>
+ </LinearLayout>
+ </LinearLayout>
+
+ <RelativeLayout
+ android:id="@+id/rl_recinfo"
+ android:layout_width="match_parent"
+ android:layout_height="48dip"
+ android:layout_above="@id/bottombar_parent"
+ android:background="@drawable/bg_rec_infobar"
+ android:gravity="center_vertical"
+ android:paddingLeft="5dip"
+ android:paddingRight="5dip"
+ android:visibility="gone" >
+
+ <TextView
+ android:id="@+id/txtRecInfoLeft"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentLeft="true"
+ android:layout_toLeftOf="@+id/txtRecInfoRight"
+ android:ellipsize="marquee"
+ android:singleLine="true"
+ android:textColor="#ffffff"
+ android:textSize="20sp"
+ android:textStyle="normal" />
+
+ <TextView
+ android:id="@+id/txtRecInfoRight"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentRight="true"
+ android:layout_marginLeft="20dip"
+ android:textColor="#ffffff"
+ android:textSize="20sp"
+ android:textStyle="normal" />
+ </RelativeLayout>
+
+ <LinearLayout
+ android:id="@+id/anim_background"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_above="@id/rl_recinfo" >
+
+ <ImageView
+ android:id="@+id/iv_anim"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@drawable/fm_anim"
+ android:visibility="invisible" />
+ </LinearLayout>
+
+</RelativeLayout>
diff --git a/MediaTek/FmRadio/res/layout-sw1024dp-port/main.xml b/MediaTek/FmRadio/res/layout-sw1024dp-port/main.xml
new file mode 100755
index 0000000..b0c2449
--- /dev/null
+++ b/MediaTek/FmRadio/res/layout-sw1024dp-port/main.xml
@@ -0,0 +1,270 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/main_view"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ <!-- middle part starts -->
+
+ <RelativeLayout
+ android:id="@+id/rl_middlepart"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_above="@+id/bottombar_parent">
+
+ <TextView
+ android:id="@+id/station_name"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_above="@+id/station_value"
+ android:gravity="center"
+ android:singleLine="true"
+ android:textSize="20dip"
+ android:textStyle="bold" />
+
+ <TextView
+ android:id="@+id/text_fm"
+ android:layout_width="80dip"
+ android:layout_height="wrap_content"
+ android:layout_below="@+id/station_name"
+ android:layout_toLeftOf="@+id/station_value"
+ android:gravity="center_horizontal"
+ android:textSize="30dip"
+ android:textStyle="bold" />
+
+ <TextView
+ android:id="@+id/station_value"
+ android:layout_width="240dip"
+ android:layout_height="wrap_content"
+ android:layout_centerInParent="true"
+ android:gravity="center_horizontal"
+ android:textSize="80dip"
+ android:textStyle="bold" />
+
+ <TextView
+ android:id="@+id/text_mhz"
+ android:layout_width="80dip"
+ android:layout_height="wrap_content"
+ android:layout_alignBaseline="@+id/station_value"
+ android:layout_below="@+id/station_name"
+ android:layout_toRightOf="@+id/station_value"
+ android:gravity="center_horizontal"
+ android:textSize="30dip"
+ android:textStyle="bold" />
+
+ <TextView
+ android:id="@+id/text_rds"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_below="@+id/station_value"
+ android:ellipsize="marquee"
+ android:gravity="center_horizontal"
+ android:marqueeRepeatLimit="marquee_forever"
+ android:singleLine="true"
+ android:textColor="#BBBBBB"
+ android:textSize="20dip"
+ android:textStyle="bold" />
+
+ <ImageButton
+ android:id="@+id/button_add_to_favorite"
+ android:layout_marginLeft="15dip"
+ android:layout_width="50dip"
+ android:layout_height="42dip"
+ android:layout_alignTop="@+id/text_mhz"
+ android:layout_toRightOf="@+id/station_value"
+ android:adjustViewBounds="true"
+ style="?android:attr/buttonBarButtonStyle"
+ android:src="@drawable/btn_fm_favorite_off"
+ android:enabled="false" />
+ </RelativeLayout>
+
+ <!-- middle part ends -->
+
+ <LinearLayout
+ android:id="@+id/bottombar_parent"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true" >
+
+ <LinearLayout
+ android:id="@+id/bottom_bar"
+ android:layout_width="match_parent"
+ android:layout_height="60dip"
+ android:layout_alignParentBottom="true"
+ android:background="@drawable/bottom_bar"
+ android:gravity="center_vertical"
+ android:splitMotionEvents="false"
+ android:weightSum="4" >
+
+ <!-- Must set the background to "btn_pressed" which is the same with what is set in source code. -->
+ <!-- Because if not set it, the button size will change when clicked. -->
+
+ <ImageButton
+ android:id="@+id/button_prevstation"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ style="?android:attr/buttonBarButtonStyle"
+ android:layout_weight="1"
+ android:adjustViewBounds="true"
+ android:src="@drawable/btn_fm_previous"
+ android:enabled="false"/>
+
+ <ImageButton
+ android:id="@+id/button_decrease"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:adjustViewBounds="true"
+ style="?android:attr/buttonBarButtonStyle"
+ android:src="@drawable/btn_fm_decrease_frequency"
+ android:enabled="false" />
+
+ <ImageButton
+ android:id="@+id/button_increase"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:adjustViewBounds="true"
+ style="?android:attr/buttonBarButtonStyle"
+ android:src="@drawable/btn_fm_increase_frequency"
+ android:enabled="false" />
+
+ <ImageButton
+ android:id="@+id/button_nextstation"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:adjustViewBounds="true"
+ style="?android:attr/buttonBarButtonStyle"
+ android:src="@drawable/btn_fm_next"
+ android:enabled="false" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/bottom_bar_recorder"
+ android:layout_width="match_parent"
+ android:layout_height="60dip"
+ android:layout_alignParentBottom="true"
+ android:background="@drawable/bottom_bar"
+ android:gravity="center_vertical"
+ android:visibility="gone"
+ android:splitMotionEvents="false"
+ android:weightSum="3" >
+
+ <!-- Must set the background to "btn_pressed" which is the same with what is set in source code. -->
+ <!-- Because if not set it, the button size will change when clicked. -->
+
+ <ImageButton
+ android:id="@+id/btn_record"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ style="?android:attr/buttonBarButtonStyle"
+ android:src="@drawable/btn_fm_record"
+ android:enabled="false"/>
+
+ <ImageButton
+ android:id="@+id/btn_stop"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ style="?android:attr/buttonBarButtonStyle"
+ android:src="@drawable/btn_fm_rec_stop"
+ android:enabled="false"/>
+
+ <ImageButton
+ android:id="@+id/btn_playback"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ style="?android:attr/buttonBarButtonStyle"
+ android:src="@drawable/btn_fm_rec_play"
+ android:enabled="false"/>
+ </LinearLayout>
+ </LinearLayout>
+
+ <RelativeLayout
+ android:id="@+id/rl_recinfo"
+ android:layout_width="match_parent"
+ android:layout_height="48dip"
+ android:layout_above="@id/bottombar_parent"
+ android:background="@drawable/bg_rec_infobar"
+ android:gravity="center_vertical"
+ android:paddingLeft="5dip"
+ android:paddingRight="5dip"
+ android:visibility="gone" >
+
+ <TextView
+ android:id="@+id/txtRecInfoLeft"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentLeft="true"
+ android:layout_toLeftOf="@+id/txtRecInfoRight"
+ android:ellipsize="marquee"
+ android:singleLine="true"
+ android:textColor="#ffffff"
+ android:textSize="20sp"
+ android:textStyle="normal" />
+
+ <TextView
+ android:id="@+id/txtRecInfoRight"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentRight="true"
+ android:layout_marginLeft="20dip"
+ android:textColor="#ffffff"
+ android:textSize="20sp"
+ android:textStyle="normal" />
+ </RelativeLayout>
+
+ <LinearLayout
+ android:id="@+id/anim_background"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_above="@id/rl_recinfo" >
+
+ <ImageView
+ android:id="@+id/iv_anim"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@drawable/fm_anim"
+ android:visibility="invisible" />
+ </LinearLayout>
+
+</RelativeLayout>
diff --git a/MediaTek/FmRadio/res/layout/addstation.xml b/MediaTek/FmRadio/res/layout/addstation.xml
new file mode 100755
index 0000000..c895051
--- /dev/null
+++ b/MediaTek/FmRadio/res/layout/addstation.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/layout_add_station"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+ <TextView
+ android:id="@+id/dlg_add_station_name"
+ android:text="@string/dlg_addedit_station_name"
+ android:layout_width="wrap_content"
+ android:layout_height="50dip"
+ android:textStyle="bold"
+ android:layout_marginLeft="10dip"
+ android:gravity="center_vertical"/>
+ <EditText
+ android:layout_toRightOf="@+id/dlg_add_station_name"
+ android:layout_height="50dip"
+ android:id="@+id/dlg_add_station_name_text"
+ android:layout_width="match_parent"
+ android:textStyle="bold"
+ android:layout_marginLeft="10dip"
+ android:layout_marginRight="10dip"
+ android:maxLength="15"
+ android:inputType="textPersonName"
+ android:gravity="center_vertical"/>
+ <TextView
+ android:id="@+id/dlg_add_station_freq"
+ android:text="@string/dlg_addedit_station_freq"
+ android:layout_width="wrap_content"
+ android:layout_height="50dip"
+ android:textStyle="bold"
+ android:layout_marginLeft="10dip"
+ android:layout_below="@+id/dlg_add_station_name"
+ android:gravity="center_vertical"/>
+ <TextView
+ android:id="@+id/dlg_add_station_freq_text"
+ android:layout_width="wrap_content"
+ android:layout_height="50dip"
+ android:textStyle="bold"
+ android:layout_marginLeft="10dip"
+ android:layout_below="@+id/dlg_add_station_name"
+ android:layout_toRightOf="@+id/dlg_add_station_freq"
+ android:gravity="center_vertical"/>
+</RelativeLayout> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/layout/editstation.xml b/MediaTek/FmRadio/res/layout/editstation.xml
new file mode 100755
index 0000000..a08d798
--- /dev/null
+++ b/MediaTek/FmRadio/res/layout/editstation.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/layout_edit_station"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+ <TextView
+ android:id="@+id/dlg_edit_station_name"
+ android:text="@string/dlg_addedit_station_name"
+ android:layout_width="wrap_content"
+ android:layout_height="50dip"
+ android:textStyle="bold"
+ android:layout_marginLeft="10dip"
+ android:gravity="center_vertical"/>
+ <EditText
+ android:id="@+id/dlg_edit_station_name_text"
+ android:layout_width="match_parent"
+ android:layout_height="50dip"
+ android:layout_marginLeft="10dip"
+ android:layout_marginRight="10dip"
+ android:layout_toRightOf="@+id/dlg_edit_station_name"
+ android:gravity="center_vertical"
+ android:inputType="textPersonName"
+ android:maxLength="15"
+ android:singleLine="true"
+ android:textStyle="bold" />
+ <TextView
+ android:id="@+id/dlg_edit_station_freq"
+ android:text="@string/dlg_addedit_station_freq"
+ android:layout_width="wrap_content"
+ android:layout_height="50dip"
+ android:textStyle="bold"
+ android:layout_marginLeft="10dip"
+ android:layout_below="@+id/dlg_edit_station_name"
+ android:gravity="center_vertical"/>
+ <EditText
+ android:id="@+id/dlg_edit_station_freq_text"
+ android:layout_width="match_parent"
+ android:layout_height="50dip"
+ android:textStyle="bold"
+ android:layout_marginLeft="10dip"
+ android:inputType="numberDecimal"
+ android:layout_below="@+id/dlg_edit_station_name"
+ android:layout_toRightOf="@+id/dlg_edit_station_freq"
+ android:gravity="center_vertical"/>
+</RelativeLayout> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/layout/favorite.xml b/MediaTek/FmRadio/res/layout/favorite.xml
new file mode 100755
index 0000000..e6a0f48
--- /dev/null
+++ b/MediaTek/FmRadio/res/layout/favorite.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/favorite_view"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" >
+
+ <ListView
+ android:id="@+id/station_list"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+ <TextView
+ android:id="@+id/empty"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:text="@string/empty_list"
+ android:visibility="gone"
+ android:gravity="center"
+ android:textSize="20sp"/>
+</RelativeLayout> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/layout/fm_recorder_dialog.xml b/MediaTek/FmRadio/res/layout/fm_recorder_dialog.xml
new file mode 100755
index 0000000..6b083a0
--- /dev/null
+++ b/MediaTek/FmRadio/res/layout/fm_recorder_dialog.xml
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/fm_recording_layout"
+ android:orientation="vertical"
+ android:layout_width="286dp"
+ android:layout_height="wrap_content">
+ <TextView
+ android:id="@+id/fm_recording_title_bar"
+ style="?android:attr/windowTitleStyle"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="53dp"
+ android:padding="10dp"
+ android:singleLine="true"
+ android:gravity="center|left"
+ android:text="@string/dlg_save_recording_title"/>
+ <View
+ android:id="@+id/divider"
+ android:layout_width="match_parent"
+ android:layout_height="2dp"
+ android:background="#31b6e7" />
+ <LinearLayout
+ android:id="@+id/contentPanel"
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center">
+ <TextView
+ android:id="@+id/save_recording_storage_warning"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:visibility="gone"
+ android:paddingLeft="12dip"
+ android:paddingRight="12dip"
+ android:text="@string/dlg_save_recording_storage_warning"
+ style="?android:attr/textAppearanceMedium"/>
+ </LinearLayout>
+ <LinearLayout
+ android:id="@+id/contentPanel"
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="68dp"
+ android:gravity="center">
+ <EditText
+ android:id="@+id/fm_recording_text"
+ android:layout_width="265dp"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:maxLength="80"/>
+ </LinearLayout>
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:background="#424542" />
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+ <Button
+ android:id="@+id/fm_recording_btn_discard"
+ style="?android:attr/buttonBarButtonStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="@string/btn_discard_recording"/>
+
+ <View
+ android:layout_width="1dp"
+ android:layout_height="match_parent"
+ android:background="#424542" />
+ <Button
+ android:id="@+id/fm_recording_btn_save"
+ style="?android:attr/buttonBarButtonStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="@string/btn_save_recording"/>
+
+ </LinearLayout>
+</LinearLayout> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/layout/fm_rx_em.xml b/MediaTek/FmRadio/res/layout/fm_rx_em.xml
new file mode 100755
index 0000000..4a4da7c
--- /dev/null
+++ b/MediaTek/FmRadio/res/layout/fm_rx_em.xml
@@ -0,0 +1,789 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:custom="http://FMTransmitter.mediatek.com/custom"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent" >
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:orientation="vertical" >
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:orientation="horizontal"
+ android:padding="10dip" >
+
+ <TextView
+ android:id="@+id/FMR_Freq_text"
+ android:layout_width="110dip"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="5dip"
+ android:layout_marginTop="6dip"
+ android:text="@string/FMR_Freq_text" />
+
+ <EditText
+ android:id="@+id/FMR_Freq_edit"
+ android:layout_width="96dip"
+ android:layout_height="48dip"
+ android:layout_centerHorizontal="true"
+ android:layout_marginTop="6dip"
+ android:maxLength="10"
+ android:singleLine="true" />
+
+ <Button
+ android:id="@+id/FMR_Freq_tune"
+ android:layout_width="84dip"
+ android:layout_height="48dip"
+ android:layout_marginTop="6dip"
+ android:text="@string/FMR_Freq_tune" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:padding="10dip" >
+
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_Antenna_text" >
+ </TextView>
+
+ <RadioGroup
+ android:id="@+id/FMR_Antenna_type"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="30dip"
+ android:orientation="horizontal" >
+
+ <RadioButton
+ android:id="@+id/FMR_Antenna_short"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_Antenna_short" >
+ </RadioButton>
+
+ <RadioButton
+ android:id="@+id/FMR_Antenna_long"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="30dip"
+ android:text="@string/FMR_Antenna_long" >
+ </RadioButton>
+ </RadioGroup>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:padding="10dip" >
+
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_Force_Stereomono_text" >
+ </TextView>
+
+ <RadioGroup
+ android:id="@+id/FMR_Stereomono_type"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="30dip"
+ android:orientation="horizontal" >
+
+ <RadioButton
+ android:id="@+id/FMR_Stereomono_stereo"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_Stereomono_stereo" >
+ </RadioButton>
+
+ <RadioButton
+ android:id="@+id/FMR_Stereomono_mono"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="30dip"
+ android:text="@string/FMR_Stereomono_mono" >
+ </RadioButton>
+ </RadioGroup>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:background="#001515"
+ android:orientation="vertical"
+ android:padding="10dip" >
+
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_Status_text" >
+ </TextView>
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:padding="10dip" >
+
+ <TextView
+ android:layout_width="120dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_Status_Stereomono_text" >
+ </TextView>
+
+ <TextView
+ android:id="@+id/FMR_Status_Stereomono"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_Status_Stereomono" >
+ </TextView>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:padding="10dip" >
+
+ <TextView
+ android:layout_width="120dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_Status_RSSI_text" >
+ </TextView>
+
+ <TextView
+ android:id="@+id/FMR_Status_RSSI"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_Status_RSSI" >
+ </TextView>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:padding="10dip" >
+
+ <TextView
+ android:layout_width="120dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_Status_Caparray_text" >
+ </TextView>
+
+ <TextView
+ android:id="@+id/FMR_Status_Caparray"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_Status_Caparray" >
+ </TextView>
+ </LinearLayout>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:background="#151500"
+ android:orientation="vertical"
+ android:padding="10dip" >
+
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_RDS_text" >
+ </TextView>
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:padding="10dip" >
+
+ <TextView
+ android:layout_width="120dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_RDS_Ratio_text" >
+ </TextView>
+
+ <TextView
+ android:id="@+id/FMR_RDS_Ratio"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_RDS_Ratio" >
+ </TextView>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:padding="10dip" >
+
+ <TextView
+ android:layout_width="120dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_RDS_PS_text" >
+ </TextView>
+
+ <TextView
+ android:id="@+id/FMR_RDS_PS"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_RDS_PS" >
+ </TextView>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:padding="10dip" >
+
+ <TextView
+ android:layout_width="120dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_RDS_RT_text" >
+ </TextView>
+
+ <TextView
+ android:id="@+id/FMR_RDS_RT"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_RDS_RT" >
+ </TextView>
+ </LinearLayout>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:background="#151500"
+ android:orientation="vertical"
+ android:padding="10dip" >
+
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_Hardware_version" >
+ </TextView>
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:padding="10dip" >
+
+ <TextView
+ android:layout_width="120dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_Chip_ID_text" >
+ </TextView>
+
+ <TextView
+ android:id="@+id/FMR_Chip_ID"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_Chip_ID" >
+ </TextView>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:padding="10dip" >
+
+ <TextView
+ android:layout_width="120dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_ECO_Version_text" >
+ </TextView>
+
+ <TextView
+ android:id="@+id/FMR_ECO_Version"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_ECO_Version" >
+ </TextView>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:padding="10dip" >
+
+ <TextView
+ android:layout_width="120dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_Patch_Version_text" >
+ </TextView>
+
+ <TextView
+ android:id="@+id/FMR_Patch_Version"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_Patch_Version" >
+ </TextView>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:padding="10dip" >
+
+ <TextView
+ android:layout_width="120dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_DSP_Version_text" >
+ </TextView>
+
+ <TextView
+ android:id="@+id/FMR_DSP_Version"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_DSP_Version" >
+ </TextView>
+ </LinearLayout>
+ </LinearLayout>
+ <!-- FM EM new feature -->
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:padding="10dip" >
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:padding="10dip" >
+
+ <TextView
+ android:layout_width="120dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_RSSI_THRESHOLD_text" >
+ </TextView>
+
+ <EditText
+ android:id="@+id/FMR_EM_RSSI_THRESHOLD_edit"
+ android:layout_width="120dip"
+ android:layout_height="wrap_content"
+ android:maxLength="10"
+ android:text="@string/FMR_EM_DEFAULT_VALUE" >
+ </EditText>
+
+ <Button
+ android:id="@+id/FMR_EM_RSSI_THRESHOLD_OK"
+ android:layout_width="60dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_OK_TEXT" />
+ </LinearLayout>
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:padding="10dip" >
+
+ <TextView
+ android:layout_width="120dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_MUTE_GAIN_text" >
+ </TextView>
+
+ <EditText
+ android:id="@+id/FMR_EM_MUTE_GAIN_edit"
+ android:layout_width="120dip"
+ android:layout_height="wrap_content"
+ android:maxLength="10"
+ android:text="@string/FMR_EM_DEFAULT_VALUE" >
+ </EditText>
+
+ <Button
+ android:id="@+id/FMR_EM_MUTE_GAIN_OK"
+ android:layout_width="60dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_OK_TEXT" />
+ </LinearLayout>
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:padding="10dip" >
+
+ <TextView
+ android:layout_width="120dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_DESENSE_RSSI_text" >
+ </TextView>
+
+ <EditText
+ android:id="@+id/FMR_EM_DESENSE_RSSI_edit"
+ android:layout_width="120dip"
+ android:layout_height="wrap_content"
+ android:maxLength="10"
+ android:text="@string/FMR_EM_DEFAULT_VALUE" >
+ </EditText>
+
+ <Button
+ android:id="@+id/FMR_EM_DESENSE_RSSI_OK"
+ android:layout_width="60dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_OK_TEXT" />
+ </LinearLayout>
+
+ </LinearLayout>
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical" >
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:padding="10dip" >
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:layout_marginLeft="120dip"
+ android:text="@string/FMR_EM_CMD_title" >
+ </TextView>
+ </LinearLayout>
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal" >
+ <TextView
+ android:layout_width="17dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_CMD_text" >
+ </TextView>
+ <EditText
+ android:id="@+id/FMR_EM_CMD_edit0"
+ android:layout_width="65dip"
+ android:layout_height="wrap_content"
+ android:maxLength="4"
+ android:text="@string/FMR_EM_DEFAULT_VALUE" >
+ </EditText>
+ <TextView
+ android:layout_width="17dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_CMD_text" >
+ </TextView>
+ <EditText
+ android:id="@+id/FMR_EM_CMD_edit1"
+ android:layout_width="65dip"
+ android:layout_height="wrap_content"
+ android:maxLength="4"
+ android:text="@string/FMR_EM_DEFAULT_VALUE" >
+ </EditText>
+ <TextView
+ android:layout_width="17dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_CMD_text" >
+ </TextView>
+ <EditText
+ android:id="@+id/FMR_EM_CMD_edit2"
+ android:layout_width="65dip"
+ android:layout_height="wrap_content"
+ android:maxLength="4"
+ android:text="@string/FMR_EM_DEFAULT_VALUE" >
+ </EditText>
+ <TextView
+ android:layout_width="17dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_CMD_text" >
+ </TextView>
+ <EditText
+ android:id="@+id/FMR_EM_CMD_edit3"
+ android:layout_width="65dip"
+ android:layout_height="wrap_content"
+ android:maxLength="4"
+ android:text="@string/FMR_EM_DEFAULT_VALUE" >
+ </EditText>
+ </LinearLayout>
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+ <TextView
+ android:layout_width="17dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_CMD_text" >
+ </TextView>
+ <EditText
+ android:id="@+id/FMR_EM_CMD_edit4"
+ android:layout_width="65dip"
+ android:layout_height="wrap_content"
+ android:maxLength="4"
+ android:text="@string/FMR_EM_DEFAULT_VALUE" >
+ </EditText>
+ <TextView
+ android:layout_width="17dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_CMD_text" >
+ </TextView>
+ <EditText
+ android:id="@+id/FMR_EM_CMD_edit5"
+ android:layout_width="65dip"
+ android:layout_height="wrap_content"
+ android:maxLength="4"
+ android:text="@string/FMR_EM_DEFAULT_VALUE" >
+ </EditText>
+ <TextView
+ android:layout_width="17dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_CMD_text" >
+ </TextView>
+ <EditText
+ android:id="@+id/FMR_EM_CMD_edit6"
+ android:layout_width="65dip"
+ android:layout_height="wrap_content"
+ android:maxLength="4"
+ android:text="@string/FMR_EM_DEFAULT_VALUE" >
+ </EditText>
+ <TextView
+ android:layout_width="17dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_CMD_text" >
+ </TextView>
+ <EditText
+ android:id="@+id/FMR_EM_CMD_edit7"
+ android:layout_width="65dip"
+ android:layout_height="wrap_content"
+ android:maxLength="4"
+ android:text="@string/FMR_EM_DEFAULT_VALUE" >
+ </EditText>
+ </LinearLayout>
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+ <TextView
+ android:layout_width="17dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_CMD_text" >
+ </TextView>
+ <EditText
+ android:id="@+id/FMR_EM_CMD_edit8"
+ android:layout_width="65dip"
+ android:layout_height="wrap_content"
+ android:maxLength="4"
+ android:text="@string/FMR_EM_DEFAULT_VALUE" >
+ </EditText>
+ <TextView
+ android:layout_width="17dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_CMD_text" >
+ </TextView>
+ <EditText
+ android:id="@+id/FMR_EM_CMD_edit9"
+ android:layout_width="65dip"
+ android:layout_height="wrap_content"
+ android:maxLength="4"
+ android:text="@string/FMR_EM_DEFAULT_VALUE" >
+ </EditText>
+ <TextView
+ android:layout_width="17dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_CMD_text" >
+ </TextView>
+ <EditText
+ android:id="@+id/FMR_EM_CMD_edit10"
+ android:layout_width="65dip"
+ android:layout_height="wrap_content"
+ android:maxLength="4"
+ android:text="@string/FMR_EM_DEFAULT_VALUE" >
+ </EditText>
+ <TextView
+ android:layout_width="17dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_CMD_text" >
+ </TextView>
+ <EditText
+ android:id="@+id/FMR_EM_CMD_edit11"
+ android:layout_width="65dip"
+ android:layout_height="wrap_content"
+ android:maxLength="4"
+ android:text="@string/FMR_EM_DEFAULT_VALUE" >
+ </EditText>
+ </LinearLayout>
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+ <TextView
+ android:layout_width="17dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_CMD_text" >
+ </TextView>
+ <EditText
+ android:id="@+id/FMR_EM_CMD_edit12"
+ android:layout_width="65dip"
+ android:layout_height="wrap_content"
+ android:maxLength="4"
+ android:text="@string/FMR_EM_DEFAULT_VALUE" >
+ </EditText>
+ <TextView
+ android:layout_width="17dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_CMD_text" >
+ </TextView>
+ <EditText
+ android:id="@+id/FMR_EM_CMD_edit13"
+ android:layout_width="65dip"
+ android:layout_height="wrap_content"
+ android:maxLength="4"
+ android:text="@string/FMR_EM_DEFAULT_VALUE" >
+ </EditText>
+ <TextView
+ android:layout_width="17dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_CMD_text" >
+ </TextView>
+ <EditText
+ android:id="@+id/FMR_EM_CMD_edit14"
+ android:layout_width="65dip"
+ android:layout_height="wrap_content"
+ android:maxLength="4"
+ android:text="@string/FMR_EM_DEFAULT_VALUE" >
+ </EditText>
+ <TextView
+ android:layout_width="17dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_CMD_text" >
+ </TextView>
+ <EditText
+ android:id="@+id/FMR_EM_CMD_edit15"
+ android:layout_width="65dip"
+ android:layout_height="wrap_content"
+ android:maxLength="4"
+ android:text="@string/FMR_EM_DEFAULT_VALUE" >
+ </EditText>
+ </LinearLayout>
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+ <TextView
+ android:layout_width="17dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_CMD_text" >
+ </TextView>
+ <EditText
+ android:id="@+id/FMR_EM_CMD_edit16"
+ android:layout_width="65dip"
+ android:layout_height="wrap_content"
+ android:maxLength="4"
+ android:text="@string/FMR_EM_DEFAULT_VALUE" >
+ </EditText>
+ <TextView
+ android:layout_width="17dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_CMD_text" >
+ </TextView>
+ <EditText
+ android:id="@+id/FMR_EM_CMD_edit17"
+ android:layout_width="65dip"
+ android:layout_height="wrap_content"
+ android:maxLength="4"
+ android:text="@string/FMR_EM_DEFAULT_VALUE" >
+ </EditText>
+ <TextView
+ android:layout_width="17dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_CMD_text" >
+ </TextView>
+ <EditText
+ android:id="@+id/FMR_EM_CMD_edit18"
+ android:layout_width="65dip"
+ android:layout_height="wrap_content"
+ android:maxLength="4"
+ android:text="@string/FMR_EM_DEFAULT_VALUE" >
+ </EditText>
+ <TextView
+ android:layout_width="17dip"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_CMD_text" >
+ </TextView>
+ <EditText
+ android:id="@+id/FMR_EM_CMD_edit19"
+ android:layout_width="65dip"
+ android:layout_height="wrap_content"
+ android:maxLength="4"
+ android:text="@string/FMR_EM_DEFAULT_VALUE" >
+ </EditText>
+ </LinearLayout>
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:padding="10dip" >
+ <Button
+ android:id="@+id/FMR_EM_CMD_OK"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_OK_TEXT" />
+ </LinearLayout>
+
+ </LinearLayout>
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:padding="10dip" >
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:layout_marginLeft="80dip"
+ android:text="@string/FMR_EM_CMD_return" >
+ </TextView>
+ </LinearLayout>
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:padding="10dip" >
+ <TextView
+ android:id="@+id/FMR_EM_CMD_RETURN0"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_CMD_text" >
+ </TextView>
+ <TextView
+ android:id="@+id/FMR_EM_CMD_RETURN1"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_CMD_text" >
+ </TextView>
+ <TextView
+ android:id="@+id/FMR_EM_CMD_RETURN2"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_CMD_text" >
+ </TextView>
+ <TextView
+ android:id="@+id/FMR_EM_CMD_RETURN3"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_CMD_text" >
+ </TextView>
+ <TextView
+ android:id="@+id/FMR_EM_CMD_RETURN4"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/FMR_EM_CMD_text" >
+ </TextView>
+ </LinearLayout>
+ </LinearLayout>
+
+</ScrollView>
diff --git a/MediaTek/FmRadio/res/layout/main.xml b/MediaTek/FmRadio/res/layout/main.xml
new file mode 100755
index 0000000..dc2b35f
--- /dev/null
+++ b/MediaTek/FmRadio/res/layout/main.xml
@@ -0,0 +1,270 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/main_view"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ <!-- middle part starts -->
+
+ <RelativeLayout
+ android:id="@+id/rl_middlepart"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_above="@+id/bottombar_parent">
+
+ <TextView
+ android:id="@+id/station_name"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_above="@+id/station_value"
+ android:gravity="center"
+ android:singleLine="true"
+ android:textSize="20dip"
+ android:textStyle="bold" />
+
+ <TextView
+ android:id="@+id/text_fm"
+ android:layout_width="80dip"
+ android:layout_height="wrap_content"
+ android:layout_below="@+id/station_name"
+ android:layout_toLeftOf="@+id/station_value"
+ android:gravity="center_horizontal"
+ android:textSize="20dip"
+ android:textStyle="bold" />
+
+ <TextView
+ android:id="@+id/station_value"
+ android:layout_width="160dip"
+ android:layout_height="wrap_content"
+ android:layout_centerInParent="true"
+ android:gravity="center_horizontal"
+ android:textSize="60dip"
+ android:textStyle="bold" />
+
+ <TextView
+ android:id="@+id/text_mhz"
+ android:layout_width="80dip"
+ android:layout_height="wrap_content"
+ android:layout_alignBaseline="@+id/station_value"
+ android:layout_below="@+id/station_name"
+ android:layout_toRightOf="@+id/station_value"
+ android:gravity="center_horizontal"
+ android:textSize="20dip"
+ android:textStyle="bold" />
+
+ <TextView
+ android:id="@+id/text_rds"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_below="@+id/station_value"
+ android:ellipsize="marquee"
+ android:gravity="center_horizontal"
+ android:marqueeRepeatLimit="marquee_forever"
+ android:singleLine="true"
+ android:textColor="#BBBBBB"
+ android:textSize="20dip"
+ android:textStyle="bold" />
+
+ <ImageButton
+ android:id="@+id/button_add_to_favorite"
+ android:layout_marginLeft="15dip"
+ android:layout_width="50dip"
+ android:layout_height="42dip"
+ android:layout_alignTop="@+id/text_mhz"
+ android:layout_toRightOf="@+id/station_value"
+ android:adjustViewBounds="true"
+ style="?android:attr/buttonBarButtonStyle"
+ android:src="@drawable/btn_fm_favorite_off"
+ android:enabled="false" />
+ </RelativeLayout>
+
+ <!-- middle part ends -->
+
+ <LinearLayout
+ android:id="@+id/bottombar_parent"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true" >
+
+ <LinearLayout
+ android:id="@+id/bottom_bar"
+ android:layout_width="match_parent"
+ android:layout_height="60dip"
+ android:layout_alignParentBottom="true"
+ android:background="@drawable/bottom_bar"
+ android:gravity="center_vertical"
+ android:splitMotionEvents="false"
+ android:weightSum="4" >
+
+ <!-- Must set the background to "btn_pressed" which is the same with what is set in source code. -->
+ <!-- Because if not set it, the button size will change when clicked. -->
+
+ <ImageButton
+ android:id="@+id/button_prevstation"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ style="?android:attr/buttonBarButtonStyle"
+ android:layout_weight="1"
+ android:adjustViewBounds="true"
+ android:src="@drawable/btn_fm_previous"
+ android:enabled="false"/>
+
+ <ImageButton
+ android:id="@+id/button_decrease"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:adjustViewBounds="true"
+ style="?android:attr/buttonBarButtonStyle"
+ android:src="@drawable/btn_fm_decrease_frequency"
+ android:enabled="false" />
+
+ <ImageButton
+ android:id="@+id/button_increase"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:adjustViewBounds="true"
+ style="?android:attr/buttonBarButtonStyle"
+ android:src="@drawable/btn_fm_increase_frequency"
+ android:enabled="false" />
+
+ <ImageButton
+ android:id="@+id/button_nextstation"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:adjustViewBounds="true"
+ style="?android:attr/buttonBarButtonStyle"
+ android:src="@drawable/btn_fm_next"
+ android:enabled="false" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/bottom_bar_recorder"
+ android:layout_width="match_parent"
+ android:layout_height="60dip"
+ android:layout_alignParentBottom="true"
+ android:background="@drawable/bottom_bar"
+ android:gravity="center_vertical"
+ android:visibility="gone"
+ android:splitMotionEvents="false"
+ android:weightSum="3" >
+
+ <!-- Must set the background to "btn_pressed" which is the same with what is set in source code. -->
+ <!-- Because if not set it, the button size will change when clicked. -->
+
+ <ImageButton
+ android:id="@+id/btn_record"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ style="?android:attr/buttonBarButtonStyle"
+ android:src="@drawable/btn_fm_record"
+ android:enabled="false"/>
+
+ <ImageButton
+ android:id="@+id/btn_stop"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ style="?android:attr/buttonBarButtonStyle"
+ android:src="@drawable/btn_fm_rec_stop"
+ android:enabled="false"/>
+
+ <ImageButton
+ android:id="@+id/btn_playback"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ style="?android:attr/buttonBarButtonStyle"
+ android:src="@drawable/btn_fm_rec_play"
+ android:enabled="false"/>
+ </LinearLayout>
+ </LinearLayout>
+
+ <RelativeLayout
+ android:id="@+id/rl_recinfo"
+ android:layout_width="match_parent"
+ android:layout_height="48dip"
+ android:layout_above="@id/bottombar_parent"
+ android:background="@drawable/bg_rec_infobar"
+ android:gravity="center_vertical"
+ android:paddingLeft="5dip"
+ android:paddingRight="5dip"
+ android:visibility="gone" >
+
+ <TextView
+ android:id="@+id/txtRecInfoLeft"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentLeft="true"
+ android:layout_toLeftOf="@+id/txtRecInfoRight"
+ android:ellipsize="marquee"
+ android:singleLine="true"
+ android:textColor="#ffffff"
+ android:textSize="20sp"
+ android:textStyle="normal" />
+
+ <TextView
+ android:id="@+id/txtRecInfoRight"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentRight="true"
+ android:layout_marginLeft="20dip"
+ android:textColor="#ffffff"
+ android:textSize="20sp"
+ android:textStyle="normal" />
+ </RelativeLayout>
+
+ <LinearLayout
+ android:id="@+id/anim_background"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_above="@id/rl_recinfo" >
+
+ <ImageView
+ android:id="@+id/iv_anim"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@drawable/fm_anim"
+ android:visibility="invisible" />
+ </LinearLayout>
+
+</RelativeLayout>
diff --git a/MediaTek/FmRadio/res/layout/simpleadapter.xml b/MediaTek/FmRadio/res/layout/simpleadapter.xml
new file mode 100755
index 0000000..9c78061
--- /dev/null
+++ b/MediaTek/FmRadio/res/layout/simpleadapter.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center_vertical"
+ android:gravity="center_vertical"
+ android:minHeight="48dip">
+ <ImageView
+ android:id="@+id/lv_station_type"
+ android:adjustViewBounds="true"
+ android:layout_width="32dip"
+ android:layout_height="32dip"
+ android:layout_marginLeft="14dip"
+ android:layout_marginRight="14dip"/>
+ <TextView
+ android:id="@+id/lv_station_freq"
+ android:gravity="center_vertical"
+ android:layout_width="60dip"
+ android:layout_height="42dip"
+ android:textStyle="bold"
+ android:textAppearance="?android:attr/textAppearanceMedium"/>
+ <TextView
+ android:id="@+id/lv_station_name"
+ android:gravity="center_vertical"
+ android:layout_width="match_parent"
+ android:layout_height="42dip"
+ android:textStyle="bold"
+ android:layout_marginLeft="10dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:singleLine="true"
+ android:marqueeRepeatLimit="marquee_forever"
+ android:ellipsize="marquee"/>
+</LinearLayout> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/layout/test_view.xml b/MediaTek/FmRadio/res/layout/test_view.xml
new file mode 100755
index 0000000..c26db52
--- /dev/null
+++ b/MediaTek/FmRadio/res/layout/test_view.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <Button
+ android:id="@+id/search"
+ android:layout_width="match_parent"
+ android:layout_height="100dip"
+ android:textSize="30sp"
+ android:text="@string/test_search"
+ />
+ <Button
+ android:id="@+id/success"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:textSize="30sp"
+ android:text="@string/test_success" />
+ <Button
+ android:id="@+id/fail"
+ android:layout_width="match_parent"
+ android:layout_height="100dip"
+ android:textSize="30sp"
+ android:text="@string/test_fail" />
+</LinearLayout>
diff --git a/MediaTek/FmRadio/res/menu/fm_action_bar.xml b/MediaTek/FmRadio/res/menu/fm_action_bar.xml
new file mode 100755
index 0000000..70aa2db
--- /dev/null
+++ b/MediaTek/FmRadio/res/menu/fm_action_bar.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:id="@+id/fm_channel_list"
+ android:showAsAction ="always"
+ android:title="@string/favorite_manager"
+ style="@android:style/Widget.Holo.ActionButton.Overflow"
+ android:icon="@drawable/btn_fm_list_selector"
+ android:enabled="false"/>
+ <item android:id="@+id/fm_power"
+ android:showAsAction ="always"
+ android:title="@string/power"
+ style="@android:style/Widget.Holo.ActionButton.Overflow"
+ android:icon="@drawable/btn_fm_powerdown_selector"
+ android:enabled="false"/>
+
+ <item android:id="@+id/fm_menu"
+ android:showAsAction="always"
+ android:title="@string/more"
+ style="@android:style/Widget.Holo.ActionButton.Overflow"
+ android:icon="@drawable/btn_fm_overflow_selector"
+ android:enabled="false"/>
+</menu>
diff --git a/MediaTek/FmRadio/res/menu/fm_menu.xml b/MediaTek/FmRadio/res/menu/fm_menu.xml
new file mode 100755
index 0000000..12b6015
--- /dev/null
+++ b/MediaTek/FmRadio/res/menu/fm_menu.xml
@@ -0,0 +1,48 @@
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:id="@+id/fm_search"
+ android:title="@string/optmenu_search"
+ android:enabled="false"/>
+ <item android:id="@+id/fm_sound_mode"
+ android:title="@string/optmenu_speaker"
+ android:enabled="false"/>
+ <item android:id="@+id/fm_record"
+ android:title="@string/optmenu_record"
+ android:enabled="false"/>
+</menu>
diff --git a/MediaTek/FmRadio/res/values-af/strings.xml b/MediaTek/FmRadio/res/values-af/strings.xml
new file mode 100755
index 0000000..524b44a
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-af/strings.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name">FM-radio</string>
+ <string name="dlg_progress_title">Soek</string>
+ <string name="btn_yes">Ja</string>
+ <string name="optmenu_speaker">Luidspreker</string>
+ <string name="edit_frequency_overwrite_text">Skryf oorheen</string>
+ <string name="toast_start_recording">Begin opneem...</string>
+ <string name="fm_unit">MHz</string>
+ <string name="empty_list">Kanaallys is leeg.</string>
+ <string name="optmenu_rds_settings">RDS-instellings</string>
+ <string name="toast_channel_searched">Het beskikbare kanale uitgesoek:</string>
+ <string name="already_exists">bestaan reeds</string>
+ <string name="dlg_noantenna_title">Inprop-oorfoon</string>
+ <string name="add_to_favorite">Voeg by Gunsteling</string>
+ <string name="toast_sdcard_insufficient_space">Te min ruimte op SD-kaart!</string>
+ <string name="dlg_delete_confirm_title">Bevestig verwyder uit gunstelinge</string>
+ <string name="optmenu_record">Neem FM op</string>
+ <string name="optmenu_earphone">Oorfoon</string>
+ <string name="sound_mode">Klankmodus</string>
+ <string name="toast_already_favorite">Hierdie kanaal is reeds in die gunstelinglys.</string>
+ <string name="not_available">Tans nie beskikbaar nie</string>
+ <string name="toast_channel_deleted">Suksesvol uit gunstelinge verwyder.</string>
+ <string name="toast_channel_added">Suksesvol by gunstelinge gevoeg.</string>
+ <string name="dlg_rds_settings_channel_information">Kanaalinligting</string>
+ <string name="toast_favorite_full">Kan nie die kanaal by die gunstelinglys voeg nie, want dis vol.</string>
+ <string name="btn_save_recording">Stoor</string>
+ <string name="optmenu_search">Soek</string>
+ <string name="dlg_rds_settings_alternative_frequency">Alternatiewe frekwensie</string>
+ <string name="dlg_progress_text">Deursoek kanale...</string>
+ <string name="optmenu_exit">Verlaat</string>
+ <string name="more">Meer</string>
+ <string name="btn_discard_recording">Gooi weg</string>
+ <string name="contmenu_item_edit">Redigeer</string>
+ <string name="toast_cannot_search">Kan nie beskikbare kanaal uitsoek nie.</string>
+ <string name="dlg_save_recording_storage_warning">Te min ruimte! Wil jy die huidige opname stoor?</string>
+ <string name="toast_in_call">Jy kan nie FM-radio begin terwyl jy in \'n oproep is nie.</string>
+ <string name="dlg_addedit_station_freq">Frekwensie:</string>
+ <string name="toast_recorder_internal_error">\'n Interne fout het in opnemer voorgekom!</string>
+ <string name="dlg_save_recording_title">Stoor opnamelêer</string>
+ <string name="btn_ok">Oukei</string>
+ <string name="power">Krag</string>
+ <string name="contmenu_item_delete">Verwyder uit gunstelinge</string>
+ <string name="toast_powerup_before_record_warning">Skakel eers FM aan!</string>
+ <string name="fm_recorder_name">FM-opnemer</string>
+ <string name="toast_recording_lost_warning">Jou opname sal verlore gaan, weens SD-kaart uitgehaal!</string>
+ <string name="dlg_delete_confirm_text">Is jy seker jy wil hierdie kanaal uit gunstelinge verwyder?</string>
+ <string name="default_station_name">Nuwe kanaal</string>
+ <string name="btn_cancel">Kanselleer</string>
+ <string name="contmenu_title">Werkinge</string>
+ <string name="btn_no">Nee</string>
+ <string name="favorite_manager">Kanaallys</string>
+ <string name="toast_invalid_frequency">Ongeldige frekwensie vir huidige ligging. Geldige frekwensieomvang: 87,5-108,0</string>
+ <string name="toast_sdcard_missing">Jou SD-kaart word vermis!</string>
+ <string name="dlg_addedit_station_name">Naam:</string>
+ <string name="dlg_addedit_title_edit">Redigeer kanaal</string>
+ <string name="toast_invalid_input">Vorige invoer is ongeldig; geldige waarde is 0 of 5.</string>
+ <string name="edit_recording_name_hint">Tik lêernaam hier</string>
+ <string name="dlg_noantenna_text">Jy kort \'n oorfoon as antenna. Prop een by jou foon in.</string>
+ <string name="toast_player_internal_error">\'n Interne fout het in speler voorgekom!</string>
+</resources> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/values-am/strings.xml b/MediaTek/FmRadio/res/values-am/strings.xml
new file mode 100755
index 0000000..40dd643
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-am/strings.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name"> FM ሬዲዮ</string>
+ <string name="dlg_progress_title"> ፈልግ</string>
+ <string name="btn_yes"> አዎ</string>
+ <string name="optmenu_speaker"> ድምጽ ማጉያ</string>
+ <string name="edit_frequency_overwrite_text"> ደምስሰህ ጻፍ</string>
+ <string name="toast_start_recording"> መቅዳት ጀምር…</string>
+ <string name="fm_unit"> MHz</string>
+ <string name="empty_list"> የጣቢያዉ ዝርዝር ባዶ ነዉ፡፡</string>
+ <string name="optmenu_rds_settings"> RDS ቅንብሮች</string>
+ <string name="toast_channel_searched"> ያሉትን ጣበያዎች ፈልጎ ጨርሷል፡</string>
+ <string name="already_exists"> ከዚህ በፊት አለ</string>
+ <string name="dlg_noantenna_title"> የጆሮ ማዳመጫዉን ይሰኩ</string>
+ <string name="add_to_favorite"> ወደ ተወዳጆች ጨምር</string>
+ <string name="toast_sdcard_insufficient_space"> በቂ ያልሆነ የSD ካርድ ቦታ!</string>
+ <string name="dlg_delete_confirm_title"> ከተወዳጆች መወገዱን ያረጋግጡ</string>
+ <string name="optmenu_record"> FMን ቅዳ </string>
+ <string name="optmenu_earphone">  የጆሮ ማዳመጫ</string>
+ <string name="sound_mode"> የድምጽ ሁኔታ</string>
+ <string name="toast_already_favorite"> ጣቢያዉ ከዚህ በፊት በተወዳጆች ዝርዝር ዉስጥ አለ፡፡</string>
+ <string name="not_available"> በአሁኑ ወቅት የለም</string>
+ <string name="toast_channel_deleted"> በተሳካ ሁኔታ ከተወዳጆች ተወግዷል፡፡</string>
+ <string name="toast_channel_added"> በተሳካ ሁኔታ ወደተወዳጆች ተጨምሯል፡፡</string>
+ <string name="dlg_rds_settings_channel_information"> የጣቢያ መረጃ</string>
+ <string name="toast_favorite_full"> የተወዳጆች ጣቢያ ዝርዝር ስለሞላ ጣቢያዉን ወደ ተወዳጆች ዝርዝር ማስገባት አይቻልም፡፡</string>
+ <string name="btn_save_recording"> አስቀምጥ</string>
+ <string name="optmenu_search"> ፈልግ</string>
+ <string name="dlg_rds_settings_alternative_frequency"> አማራጭ ሞገድ</string>
+ <string name="dlg_progress_text"> ጣቢያዎችን ፈልግ</string>
+ <string name="optmenu_exit"> ዉጣ</string>
+ <string name="more"> የበለጡ</string>
+ <string name="btn_discard_recording"> አስወግድ</string>
+ <string name="contmenu_item_edit"> አርታእ</string>
+ <string name="toast_cannot_search"> ያሉትን ጣበያዎች መፈለግ አይቻልም፡፡</string>
+ <string name="dlg_save_recording_storage_warning"> በቂ ያልሆነ ማከማቻ! አሁን የተቀዳዉን ማስቀመጥ ይፈልጋሉ;</string>
+ <string name="toast_in_call"> በጥሪ ላይ እያሉ FMሬዲዮን ማስነሳት አይችሉም፡፡</string>
+ <string name="dlg_addedit_station_freq"> ሞገድ፡</string>
+ <string name="toast_recorder_internal_error"> በመቅጃዉ ላይ ዉስጣዊ ስህተት ተከስቷል!</string>
+ <string name="dlg_save_recording_title"> የፍይሉን </string>
+ <string name="btn_ok"> እሺ</string>
+ <string name="power"> ሃይል</string>
+ <string name="contmenu_item_delete"> ከተወዳጆች አስወግድ</string>
+ <string name="toast_powerup_before_record_warning"> እባክዎ በመጀመሪያ FMን ያስነሱ!</string>
+ <string name="fm_recorder_name"> የFM መቅጃ</string>
+ <string name="toast_recording_lost_warning"> SD በመወገዱ ምክንያት ቅጂዎ ይጠፋል!</string>
+ <string name="dlg_delete_confirm_text"> ይህንን ጣቢያ ከተወዳጆች ለማስወገድ መፈለግዎትን እርግጠኛ ነዎት?</string>
+ <string name="default_station_name"> አዲስ ጣቢያ</string>
+ <string name="btn_cancel"> ሰርዝ</string>
+ <string name="contmenu_title"> እንቅስቃሴዎች</string>
+ <string name="btn_no"> አይ</string>
+ <string name="favorite_manager"> የጣቢያ ዝርዝር</string>
+ <string name="toast_invalid_frequency"> ለአሁኑ ቦታ ትክክለኛ ያልሆነ ሞገድ ነዉ፡፡ ትክክለኛ የሆነ የሞገድ መጠን ፡87.5-108.0</string>
+ <string name="toast_sdcard_missing"> SD ካርድዎ የለም!</string>
+ <string name="dlg_addedit_station_name"> ስም፡</string>
+ <string name="dlg_addedit_title_edit"> ጣቢያን አርታእ</string>
+ <string name="toast_invalid_input"> የመጨረሻ ያስገቡት ግቤት ትክክል አይደለም፣ ትክክለኛዉ ከ 0 እስከ 5 መሆን አለበት፡፡</string>
+ <string name="edit_recording_name_hint"> የፋይሉን ስም እዚህ ጋር ይተይቡ</string>
+ <string name="dlg_noantenna_text"> የጆሮ ማዳመጫ እንደ አንቴና ያስፈልጎታል፡፡ እባክዎ የጆሮ ማዳመጫዉን ይሰኩ፡፡</string>
+ <string name="toast_player_internal_error"> በማጫወቻዉ ላይ ዉስጣዊ ስህተት ተከስቷል!</string>
+</resources> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/values-ar/strings.xml b/MediaTek/FmRadio/res/values-ar/strings.xml
new file mode 100755
index 0000000..d5a3c77
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-ar/strings.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name">راديو FM</string>
+ <string name="favorite_manager">قائمة القنوات</string>
+ <string name="add_to_favorite">إضافة إلى المفضلات</string>
+ <string name="optmenu_search">"بحث"</string>
+ <string name="optmenu_exit">خروج</string>
+ <string name="contmenu_title">العمليات</string>
+ <string name="contmenu_item_edit">"تعديل"</string>
+ <string name="contmenu_item_delete">إزالة من المفضلات</string>
+ <string name="dlg_noantenna_text">يجب أن يكون لديك سماعة أذن لهوائي. رجاء توصيل سماعة الأذن.</string>
+ <string name="dlg_noantenna_title">توصيل سماعة الأذن</string>
+ <string name="btn_yes">"نعم"</string>
+ <string name="btn_no">"لا"</string>
+ <string name="btn_ok">"موافق"</string>
+ <string name="btn_cancel">"إلغاء"</string>
+ <string name="dlg_progress_title">مسح</string>
+ <string name="dlg_progress_text">مسح القنوات...</string>
+ <string name="dlg_addedit_station_name">الاسم:</string>
+ <string name="dlg_addedit_station_freq">التكرار:</string>
+ <string name="dlg_addedit_title_edit">تحرير القناة</string>
+ <string name="default_station_name">قناة جديدة</string>
+ <string name="dlg_delete_confirm_title">تأكيد مسح القناة</string>
+ <string name="dlg_delete_confirm_text">هل تريد بالتأكيد حذف هذه القناة؟</string>
+ <string name="toast_favorite_full">تتعذر إضافة القناة إلى قائمة المفضلة نظرًا لاكتمالها.</string>
+ <string name="toast_already_favorite">هذه القناة موجودة بالفعل في قائمة المفضلة.</string>
+ <string name="toast_channel_deleted">تمت الإزالة من المفضلات بنجاح</string>
+ <string name="toast_channel_added">تمت الإضافة إلى المفضلات بنجاح</string>
+ <string name="toast_channel_searched">القنوات المتوفرة التي تم مسحها:</string>
+ <string name="toast_cannot_search">تعذر البحث عن قناة متاحة.</string>
+ <string name="optmenu_rds_settings">إعدادات نظام بيانات الراديو</string>
+ <string name="dlg_rds_settings_channel_information">معلومات القناة</string>
+ <string name="dlg_rds_settings_alternative_frequency">التردد البديل</string>
+ <string name="more">المزيد من التطبيقات</string>
+ <string name="power">أس</string>
+ <string name="sound_mode">وضع الصوت</string>
+ <string name="edit_frequency_overwrite_text">"استبدال"</string>
+ <string name="fm_unit">ميجا هرتز</string>
+ <string name="no_antenna_info">قم بتوصيل سماعات الأذن لاستخدامها كهوائي الراديو.</string>
+ <!-- For FM recording -->
+ <string name="fm_recorder_name">مسجل FM</string>
+ <string name="toast_recording_lost_warning">ستفقد التسجيلات نتيجة نزع بطاقة SD!</string>
+ <string name="toast_start_recording">بدء التسجيل…</string>
+ <string name="toast_sdcard_missing">بطاقة SD مفقودة!</string>
+ <string name="toast_sdcard_insufficient_space">مساحة غير كافية على بطاقة SD!</string>
+ <string name="toast_recorder_internal_error">حدث خطأ داخلي في المسجل!</string>
+ <string name="toast_player_internal_error">حدث خطأ داخلي في المشغل!</string>
+ <string name="toast_powerup_before_record_warning">يرجى تشغيل FM أولاً!</string>
+ <string name="optmenu_record">تسجيل FM</string>
+ <string name="btn_save_recording">حفظ</string>
+ <string name="btn_discard_recording">تجاهل</string>
+ <string name="edit_recording_name_hint">اكتب اسم الملف هنا</string>
+ <string name="dlg_save_recording_title">حفظ ملف التسجيل</string>
+ <string name="dlg_save_recording_storage_warning">مساحة التخزين غير كافية! هل تريد حفظ التسجيل الحالي؟</string>
+ <string name="already_exists">موجود بالفعل</string>
+ <string name="toast_invalid_frequency">تردد غير صالح للموقع الحالي. نطاق التردد الصالح: 87,5-108,0.</string>
+ <string name="toast_invalid_input">المُدخل الأخير غير صحيح، القيمة الصحيحة هي 0 أو 5.</string>
+ <string name="toast_in_call">لا يمكن تشغيل راديو FM أثناء إجراء مكالمة.</string>
+ <string name="empty_list">قائمة القنوات فارغة.</string>
+ <string name="optmenu_speaker">"السماعة"</string>
+ <string name="optmenu_earphone">سماعة رأس</string>
+ <string name="not_available">غير متاح حاليًا</string>
+ <string name="add_to_favorite1">إضافة إلى القنوات مسبقة الضبط</string>
+ <string name="contmenu_item_delete1">إزالة من القنوات مسبقة الضبط</string>
+ <string name="dlg_delete_confirm_title1">تأكيد الإزالة من القنوات مسبقة الضبط</string>
+ <string name="dlg_delete_confirm_text1">هل أنت متأكد من رغبتك في إزالة هذه القناة من القنوات مسبقة الضبط؟</string>
+ <string name="toast_favorite_full1">يتعذر إضافة القناة إلى قائمة القنوات مسبقة الضبط لأنها ممتلئة.</string>
+ <string name="toast_already_favorite1">هذه القناة موجودة بالفعل في قائمة القنوات مسبقة الضبط.</string>
+ <string name="toast_channel_deleted1">تمت الإزالة بنجاح من القنوات مسبقة الضبط.</string>
+ <string name="toast_channel_added1">تمت الإضافة بنجاح إلى القنوات مسبقة الضبط.</string>
+</resources> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/values-bg/strings.xml b/MediaTek/FmRadio/res/values-bg/strings.xml
new file mode 100755
index 0000000..394ee51
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-bg/strings.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">УКВ радио</string>
+ <string name="favorite_manager">Списък канали</string>
+ <string name="add_to_favorite">Добави към предпочитани</string>
+ <string name="optmenu_search">Търсене</string>
+ <string name="optmenu_exit">Изход</string>
+ <string name="contmenu_title">Действия</string>
+ <string name="contmenu_item_edit">Редактиране</string>
+ <string name="contmenu_item_delete">Изтриване от предпочитани</string>
+ <string name="dlg_noantenna_text">Като антена трябва да има слушалки. Включете слушалките.</string>
+ <string name="dlg_noantenna_title">Включете слешалките</string>
+ <string name="btn_yes">"Да"</string>
+ <string name="btn_no">"Не"</string>
+ <string name="btn_ok">ОК</string>
+ <string name="btn_cancel">Отказ</string>
+ <string name="dlg_progress_title">Търсене</string>
+ <string name="dlg_progress_text">Търсене на канали…</string>
+ <string name="dlg_addedit_station_name">Име:</string>
+ <string name="dlg_addedit_station_freq">Честота:</string>
+ <string name="dlg_addedit_title_edit">Редактиране канал</string>
+ <string name="default_station_name">Нов канал</string>
+ <string name="dlg_delete_confirm_title">Потвърдете изтриване от предпочитани</string>
+ <string name="dlg_delete_confirm_text">Настоявате ли да изтрием този канал от предпочитаните?</string>
+ <string name="toast_favorite_full">Каналът не може да се добави в списък предпочитани - списъкът е пълен.</string>
+ <string name="toast_already_favorite">Каналът вече е в списък предпочитани.</string>
+ <string name="toast_channel_deleted">Успешно изтриване от предпочитани.</string>
+ <string name="toast_channel_added">Успешно добавяне към предпочитани.</string>
+ <string name="toast_channel_searched">Търсене на достъпни канали:</string>
+ <string name="toast_cannot_search">Търсенето на достъпен канал невъзможно.</string>
+ <string name="toast_invalid_frequency">Невалидна честота за това местоположение. Допустим честотен диапазон: 87,5 - 108,0</string>
+ <string name="toast_invalid_input">Последно невалидно въвеждане - разрешени стойности 0 или 5.</string>
+ <string name="optmenu_rds_settings">Настройки RDS</string>
+ <string name="dlg_rds_settings_channel_information">Информация за канали</string>
+ <string name="dlg_rds_settings_alternative_frequency">Резервна честота</string>
+ <string name="sound_mode">Режим саунд</string>
+ <string name="more">"Още"</string>
+ <string name="power">"степен"</string>
+ <string name="toast_in_call">Не можете да включите УКВ радио по време на обаждане.</string>
+ <string name="empty_list">Празен списък канали.</string>
+ <string name="edit_frequency_overwrite_text">Пренаписване</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">Включете слушалките за използване като радио антена.</string>
+ <string name="fm_recorder_name">УКВ записващо у-во</string>
+ <string name="toast_recording_lost_warning">Записът ще изчезне при изваждане на SD картата!</string>
+ <string name="toast_start_recording">Начало запис…</string>
+ <string name="toast_sdcard_missing">Липсва SD карта!</string>
+ <string name="toast_sdcard_insufficient_space">Недостатъчно място на SD картата!</string>
+ <string name="toast_recorder_internal_error">Вътрешна грешка в записващото у-во!</string>
+ <string name="toast_player_internal_error">Вътрешна грешка в плеъра!</string>
+ <string name="toast_powerup_before_record_warning">Първо включете УКВ!</string>
+ <string name="optmenu_record">Запис на УКВ</string>
+ <string name="btn_save_recording">"Запазване"</string>
+ <string name="btn_discard_recording">Отхвърляне</string>
+ <string name="edit_recording_name_hint">Въведете име на файл тук</string>
+ <string name="dlg_save_recording_title">Запаметяване на записващия файл</string>
+ <string name="dlg_save_recording_storage_warning">Недостатъчно памет! Искате ли да запаметите този запис?</string>
+ <string name="already_exists">вече съществува</string>
+ <string name="optmenu_speaker">Високоговорител</string>
+ <string name="optmenu_earphone">Слушалки</string>
+ <string name="not_available">Недостъпен в момента</string>
+ <string name="add_to_favorite1">Добави към пре-настроени канали</string>
+ <string name="contmenu_item_delete1">Изтриване от пре-настроени канали</string>
+ <string name="dlg_delete_confirm_title1">Потвърдете изтриване от пре-настроени канали</string>
+ <string name="dlg_delete_confirm_text1">Настоявате ли да изтрием този канал от пре-настроените?</string>
+ <string name="toast_favorite_full1">Каналът не може да се добави в списък пре-настроени - списъкът е пълен.</string>
+ <string name="toast_already_favorite1">Каналът вече е в списък пре-настроени.</string>
+ <string name="toast_channel_deleted1">Успешно изтриване от пре-настроени.</string>
+ <string name="toast_channel_added1">Успешно добавяне към пре-настроени.</string>
+</resources> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/values-bn/strings.xml b/MediaTek/FmRadio/res/values-bn/strings.xml
new file mode 100755
index 0000000..7c24348
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-bn/strings.xml
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name">এফএম রেডিও</string>
+ <string name="favorite_manager">চ্যানেলের তালিকা</string>
+ <string name="add_to_favorite">প্রিয়-তে যোগ করুন</string>
+ <string name="optmenu_search">অনুসন্ধান করুন</string>
+ <string name="optmenu_exit">প্রস্থান</string>
+ <string name="contmenu_title">অপারেশন</string>
+ <string name="contmenu_item_edit">সম্পাদনা করুন</string>
+ <string name="contmenu_item_delete">প্রিয় তালিকা থেকে সরিয়ে ফেলুন</string>
+ <string name="dlg_noantenna_text">এন্টেনা হিসেবে আপনার ইয়ারফোন প্রয়োজন। আপনার ইয়ারফোন লাগান।</string>
+ <string name="dlg_noantenna_title">ইয়ারফোন লাগান</string>
+ <string name="btn_yes">হ্যাঁ</string>
+ <string name="btn_no">না </string>
+ <string name="btn_ok">ঠিক আছে </string>
+ <string name="btn_cancel">বাতিল করুন</string>
+ <string name="dlg_progress_title">স্ক্যান করুন</string>
+ <string name="dlg_progress_text">চ্যানেল স্ক্যান করুন...</string>
+ <string name="dlg_addedit_station_name">নাম:</string>
+ <string name="dlg_addedit_station_freq">ফ্রিকোয়েন্সি:</string>
+ <string name="dlg_addedit_title_edit">চ্যানেল সম্পাদনা</string>
+ <string name="default_station_name">নতুন চ্যানেল</string>
+ <string name="dlg_delete_confirm_title">চ্যানেলটি মুছে ফেলা নিশ্চিত করুন</string>
+ <string name="dlg_delete_confirm_text">আপনি কি নিশ্চিতভাবেই চ্যানেলটি মুছে ফেলতে চান?</string>
+ <string name="toast_favorite_full">প্রিয় তালিকায় চ্যানেলটি যুক্ত করা যাচ্ছে না কারণ তালিকা পূর্ণ। </string>
+ <string name="toast_already_favorite">চ্যানেলটি প্রিয় তালিকায় আগে থেকেই বিদ্যমান।</string>
+ <string name="toast_channel_deleted">প্রিয় তালিকা থেকে সফলভাবে সরিয়ে ফেলা হয়েছে</string>
+ <string name="toast_channel_added">প্রিয় তালিকায় সফলভাবে যোগ করা হয়েছে</string>
+ <string name="toast_channel_searched">বিদ্যমানগুলো চ্যানেল অনুসন্ধান করা হয়েছে:</string>
+ <string name="toast_cannot_search">বিদ্যমান চ্যানেল অনুসন্ধান করে বের করতে পারছে না ।</string>
+ <string name="optmenu_rds_settings">আরডিএস সেটিং</string>
+ <string name="dlg_rds_settings_channel_information">চ্যানেলের তথ্য</string>
+ <string name="dlg_rds_settings_alternative_frequency">বিকল্প ফ্রিকোয়েন্সি</string>
+ <string name="more">আরো অ্যাপ্লিকেশন</string>
+ <string name="power">পাওয়ার</string>
+ <string name="sound_mode">সাউন্ড মোড</string>
+ <string name="edit_frequency_overwrite_text">ওভাররাইট করুন</string>
+ <string name="fm_unit">মে.হার্টস</string>
+ <string name="no_antenna_info">রেডিও এন্টেনা হিসেবে ব্যবহার করতে আপনার ইয়ারফোন লাগান।</string>
+
+ <!-- For FM recording -->
+ <string name="fm_recorder_name">এফএম রেকর্ডার</string>
+ <string name="toast_recording_lost_warning">এসডি সরিয়ে ফেলার কারণে আপনার রেকর্ড করা জিনিস হারিয়ে যাবে!</string>
+ <string name="toast_start_recording">রেকর্ড করা শুরু…</string>
+ <string name="toast_sdcard_missing">আপনার এসডি কার্ড পাওয়া যাচ্ছে না!</string>
+ <string name="toast_sdcard_insufficient_space">এসডি কার্ডে জায়গা অপর্যাপ্ত!</string>
+ <string name="toast_recorder_internal_error">রেকর্ডারে একটি অভ্যন্তরীণ ত্রুটি ঘটেছে!</string>
+ <string name="toast_player_internal_error">প্লেয়ারে একটি অভ্যন্তরীণ ত্রুটি ঘটেছে!</string>
+ <string name="toast_powerup_before_record_warning">প্রথমে এফএম চালু করুন!</string>
+ <string name="optmenu_record">এফএম রেকর্ড করুন</string>
+ <string name="btn_save_recording">সংরক্ষণ করুন</string>
+ <string name="btn_discard_recording">বাতিল করুন</string>
+ <string name="edit_recording_name_hint">এখানে ফাইলের নাম লিখুন</string>
+ <string name="dlg_save_recording_title">রেকর্ড করা ফাইল সংরক্ষণ করুন</string>
+ <string name="dlg_save_recording_storage_warning">সংরক্ষণাগার অপর্যাপ্ত! আপনি কি বর্তমানে রেকর্ড করা জিনিস সংরক্ষণ করতে চান?</string>
+ <string name="already_exists">ইতিমধ্যেই বিদ্যমান</string>
+ <string name="toast_invalid_frequency">বর্তমান অবস্থানের জন্য অকার্যকর ফ্রিকোয়েন্সি। কার্যকর ফ্রিকোয়েন্সি স্কোপ: 87.5-108.0।</string>
+ <string name="toast_invalid_input">সর্বশেষ অকার্যকর ইনপুট, কার্যকর মূল্য হল ০ বা ৫।</string>
+ <string name="toast_in_call">কলে থাকা অবস্থায় আপনি এফএম রেডিও চালু করতে পারবেন না।</string>
+ <string name="empty_list">চ্যানেল তালিকা খালি।</string>
+ <string name="optmenu_speaker">স্পিকার</string>
+ <string name="optmenu_earphone">হেডসেট</string>
+ <string name="not_available">বর্তমানে পাওয়া যাচ্ছে না</string>
+
+ <string name="add_to_favorite1">চ্যানেল প্রিসেট করতে যোগ করুন</string>
+ <string name="contmenu_item_delete1">প্রিসেট চ্যানেল থেকে সরিয়ে ফেলুন</string>
+ <string name="dlg_delete_confirm_title1">প্রিসেট চ্যানেল থেকে সরানো নিশ্চিত করুন</string>
+ <string name="dlg_delete_confirm_text1">আপনি কি নিশ্চিত যে আপনি এই চ্যানেল প্রিসেট চ্যানেল থেকে সরিয়ে ফেলতে চান?</string>
+ <string name="toast_favorite_full1">প্রিসেট চ্যানেলের তালিকায় চ্যানেলটি যোগ করা যাচ্ছে না কারণ এটি পূর্ণ।</string>
+ <string name="toast_already_favorite1">এই চ্যানেল ইতিমধ্যে প্রিসেট চ্যানেল তালিকায় আছে।</string>
+ <string name="toast_channel_deleted1">প্রিসেট চ্যানেল থেকে সফলভাবে সরিয়ে ফেলা হয়েছে।</string>
+ <string name="toast_channel_added1">প্রিসেট চ্যানেলে সফলভাবে যোগ করা হয়েছে।</string>
+</resources>
diff --git a/MediaTek/FmRadio/res/values-ca/strings.xml b/MediaTek/FmRadio/res/values-ca/strings.xml
new file mode 100755
index 0000000..3ddfd09
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-ca/strings.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name">Ràdio FM</string>
+ <string name="dlg_progress_title">Cerca</string>
+ <string name="btn_yes">Sí</string>
+ <string name="optmenu_speaker">Altaveu</string>
+ <string name="edit_frequency_overwrite_text">Sobreescriu</string>
+ <string name="toast_start_recording">Inicia l’enregistrament…</string>
+ <string name="fm_unit">MHz</string>
+ <string name="empty_list">La llista de canals és buida.</string>
+ <string name="optmenu_rds_settings">Configuració d’RDS</string>
+ <string name="toast_channel_searched">Canals disponibles que s’han cercat:</string>
+ <string name="already_exists">ja existeix</string>
+ <string name="dlg_noantenna_title">Connecta l’auricular</string>
+ <string name="add_to_favorite">Afegeix als favorits</string>
+ <string name="toast_sdcard_insufficient_space">Espai insuficient a la targeta SD!</string>
+ <string name="dlg_delete_confirm_title">Confirma la supressió dels favorits</string>
+ <string name="optmenu_record">Enregistra FM</string>
+ <string name="optmenu_earphone">Auricular</string>
+ <string name="sound_mode">Mode de so</string>
+ <string name="toast_already_favorite">Aquest canal ja és a la llista de favorits.</string>
+ <string name="not_available">Actualment no està disponible</string>
+ <string name="toast_channel_deleted">S’ha eliminat correctament dels favorits.</string>
+ <string name="toast_channel_added">S’ha afegit correctament als favorits.</string>
+ <string name="dlg_rds_settings_channel_information">Informació del canal</string>
+ <string name="toast_favorite_full">El canal no pot afegir-se a la llista de favorits perquè és plena.</string>
+ <string name="btn_save_recording">Desa-ho</string>
+ <string name="optmenu_search">Cerca</string>
+ <string name="dlg_rds_settings_alternative_frequency">Freqüència alternativa</string>
+ <string name="dlg_progress_text">Cerca canals...</string>
+ <string name="optmenu_exit">Surt</string>
+ <string name="more">Més</string>
+ <string name="btn_discard_recording">Descarta</string>
+ <string name="contmenu_item_edit">Edita</string>
+ <string name="toast_cannot_search">No es poden cercar canals disponibles.</string>
+ <string name="dlg_save_recording_storage_warning">Emmagatzematge insuficient! Voleu desar l’enregistrament actual?</string>
+ <string name="toast_in_call">La ràdio FM no pot iniciar-se amb una trucada en curs.</string>
+ <string name="dlg_addedit_station_freq">Freqüència:</string>
+ <string name="toast_recorder_internal_error">S’ha produït un error intern a l’enregistrador!</string>
+ <string name="dlg_save_recording_title">Desa fitxer d’enregistrament</string>
+ <string name="btn_ok">Accepta</string>
+ <string name="power">Alimentació</string>
+ <string name="contmenu_item_delete">Suprimeix dels favorits</string>
+ <string name="toast_powerup_before_record_warning">Engega primer l’FM!</string>
+ <string name="fm_recorder_name">Enregistrador d’FM</string>
+ <string name="toast_recording_lost_warning">L’extracció de l’SD provocarà la pèrdua de l’enregistrament!</string>
+ <string name="dlg_delete_confirm_text">Esteu segur que voleu eliminar aquest canal dels favorits?</string>
+ <string name="default_station_name">Canal nou</string>
+ <string name="btn_cancel">Cancel·la</string>
+ <string name="contmenu_title">Operacions</string>
+ <string name="btn_no">No</string>
+ <string name="favorite_manager">Llista de canals</string>
+ <string name="toast_invalid_frequency">Freqüència no vàlida per a la ubicació actual. Interval de freqüències vàlides: 87.5-108.0</string>
+ <string name="toast_sdcard_missing">No hi ha cap targeta SD!</string>
+ <string name="dlg_addedit_station_name">Nom:</string>
+ <string name="dlg_addedit_title_edit">Edita el canal</string>
+ <string name="toast_invalid_input">La darrera entrada no és vàlida, els valors vàlids són 0 o 5.</string>
+ <string name="edit_recording_name_hint">Escriviu aquí el nom de fitxer</string>
+ <string name="dlg_noantenna_text">Necessiteu un auricular com a antena. Endolleu l’auricular.</string>
+ <string name="toast_player_internal_error">S’ha produït un error intern al reproductor!</string>
+ <string name="no_antenna_info">Connecta els auriculars per utilitzar-los com a antena d’àudio.</string>
+ <string name="add_to_favorite1">Afegeix als canals predeterminats</string>
+ <string name="contmenu_item_delete1">Suprimeix dels canals predeterminats</string>
+ <string name="dlg_delete_confirm_title1">Confirma la supressió dels canals predeterminats</string>
+ <string name="dlg_delete_confirm_text1">Estàs segur que vols suprimir aquest canal dels canals predeterminats?</string>
+ <string name="toast_favorite_full1">No es pot afegir el canal a la llista de canals predeterminats perquè està plena.</string>
+ <string name="toast_already_favorite1">Aquest canal ja es troba a la llista de canals predeterminats.</string>
+ <string name="toast_channel_deleted1">S’ha suprimit correctament dels canals predeterminats.</string>
+ <string name="toast_channel_added1">S’ha afegit correctament als canals predeterminats</string>
+</resources> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/values-cs/strings.xml b/MediaTek/FmRadio/res/values-cs/strings.xml
new file mode 100755
index 0000000..9ac1ac0
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-cs/strings.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">FM rádio</string>
+ <string name="favorite_manager">Seznam kanálů</string>
+ <string name="add_to_favorite">Přidat k oblíbeným položkám</string>
+ <string name="optmenu_search">Hledat</string>
+ <string name="optmenu_exit">Konec</string>
+ <string name="contmenu_title">Operace</string>
+ <string name="contmenu_item_edit">Úpravy</string>
+ <string name="contmenu_item_delete">Odebrat z oblíbených položek</string>
+ <string name="dlg_noantenna_text">Jsou zapotřebí sluchátka jako anténa. Připojte sluchátka.</string>
+ <string name="dlg_noantenna_title">Připojit sluchátka</string>
+ <string name="btn_yes">Ano</string>
+ <string name="btn_no">Ne</string>
+ <string name="btn_ok">OK</string>
+ <string name="btn_cancel">Storno</string>
+ <string name="dlg_progress_title">Vyhledat</string>
+ <string name="dlg_progress_text">Prohledat kanály...</string>
+ <string name="dlg_addedit_station_name">Název:</string>
+ <string name="dlg_addedit_station_freq">Frekvence:</string>
+ <string name="dlg_addedit_title_edit">Upravit kanál</string>
+ <string name="default_station_name">Nový kanál</string>
+ <string name="dlg_delete_confirm_title">Potvrdit odebrání z oblíbených</string>
+ <string name="dlg_delete_confirm_text">Opravdu chcete odebrat tento kanál z oblíbených?</string>
+ <string name="toast_favorite_full">Nelze přidat kanál do seznamu oblíbených, protože je plný.</string>
+ <string name="toast_already_favorite">Tento kanál je již v seznamu oblíbených.</string>
+ <string name="toast_channel_deleted">Úspěšně odebráno z oblíbených položek.</string>
+ <string name="toast_channel_added">Úspěšně přidáno k oblíbeným položkám.</string>
+ <string name="toast_channel_searched">Vyhledané dostupné kanály:</string>
+ <string name="toast_cannot_search">Nelze vyhledat dostupný kanál.</string>
+ <string name="toast_invalid_frequency">Neplatná frekvence pro aktuální umístění. Platný rozsah frekvence: 87,5-108,0.</string>
+ <string name="optmenu_rds_settings">Nastavení RDS</string>
+ <string name="dlg_rds_settings_channel_information">Informace o kanálu</string>
+ <string name="dlg_rds_settings_alternative_frequency">Náhradní frekvence</string>
+ <string name="sound_mode">Režim zvuku</string>
+ <string name="more">Další aplikace</string>
+ <string name="power">síla</string>
+ <string name="edit_frequency_overwrite_text">"Přepsat"</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">Připojte sluchátka jako rozhlasovou anténu.</string>
+ <!-- For FM recording -->
+ <string name="fm_recorder_name">FM rekordér</string>
+ <string name="toast_recording_lost_warning">Váš záznam bude ztracen z důvodu vyjmutí SD!</string>
+ <string name="toast_start_recording">Spustit záznam…</string>
+ <string name="toast_sdcard_missing">Karta SD chybí!</string>
+ <string name="toast_sdcard_insufficient_space">Nedostatek prostoru na kartě SD!</string>
+ <string name="toast_recorder_internal_error">Došlo k vnitřní chybě rekordéru!</string>
+ <string name="toast_player_internal_error">Došlo k vnitřní chybě přehrávače!</string>
+ <string name="toast_powerup_before_record_warning">Nejdříve zapněte napájení FM!</string>
+ <string name="optmenu_record">Záznam FM</string>
+ <string name="btn_save_recording">Uložit</string>
+ <string name="btn_discard_recording">Zahodit</string>
+ <string name="edit_recording_name_hint">Zde zadejte název souboru</string>
+ <string name="dlg_save_recording_title">Uložit soubor se záznamem</string>
+ <string name="dlg_save_recording_storage_warning">Nedostatek úložného prostoru. Chcete uložit aktuální záznam?</string>
+ <string name="already_exists">již existuje</string>
+ <string name="toast_invalid_input">Poslední neplatné zadání, platná hodnota je 0 nebo 5.</string>
+ <string name="toast_in_call">Nelze spustit FM rádio během volání.</string>
+ <string name="empty_list">Seznam kanálů je prázdný.</string>
+ <string name="optmenu_speaker">"Reproduktor"</string>
+ <string name="optmenu_earphone">Sluchátka s mikrofonem</string>
+ <string name="not_available">Aktuálně není k dispozici</string>
+ <string name="add_to_favorite1">Přidat k předvoleným kanálům</string>
+ <string name="contmenu_item_delete1">Odebrat z předvolených kanálů</string>
+ <string name="dlg_delete_confirm_title1">Potvrdit odebrání z předvolených kanálů</string>
+ <string name="dlg_delete_confirm_text1">Opravdu chcete odebrat tento kanál z předvolených kanálů?</string>
+ <string name="toast_favorite_full1">Nelze přidat kanál do seznamu předvolených kanálů, protože je plný.</string>
+ <string name="toast_already_favorite1">Tento kanál je již v seznamu předvolených kanálů.</string>
+ <string name="toast_channel_deleted1">Úspěšně odebráno z předvolených kanálů.</string>
+ <string name="toast_channel_added1">Úspěšně přidáno k předvoleným kanálům.</string>
+</resources>
diff --git a/MediaTek/FmRadio/res/values-da/strings.xml b/MediaTek/FmRadio/res/values-da/strings.xml
new file mode 100755
index 0000000..06e5a8b
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-da/strings.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">FM-radio</string>
+ <string name="favorite_manager">Kanalliste</string>
+ <string name="add_to_favorite">Tilføj til favoritter</string>
+ <string name="optmenu_search">Søg</string>
+ <string name="optmenu_exit">Forlad</string>
+ <string name="contmenu_title">Operationer</string>
+ <string name="contmenu_item_edit">Rediger</string>
+ <string name="contmenu_item_delete">Fjern fra Favoritter</string>
+ <string name="dlg_noantenna_text">Du skal bruge en øretelefon som antenne. Tilslut dine øretelefoner.</string>
+ <string name="dlg_noantenna_title">Tilslut dine øretelefoner</string>
+ <string name="btn_yes">"Ja"</string>
+ <string name="btn_no">"Nej"</string>
+ <string name="btn_ok">OK</string>
+ <string name="btn_cancel">Annuller</string>
+ <string name="dlg_progress_title">Søg</string>
+ <string name="dlg_progress_text">Søg efter kanaler...</string>
+ <string name="dlg_addedit_station_name">Navn:</string>
+ <string name="dlg_addedit_station_freq">Frekvens:</string>
+ <string name="dlg_addedit_title_edit">Rediger kanal</string>
+ <string name="default_station_name">Ny kanal</string>
+ <string name="dlg_delete_confirm_title">Bekræft at fjerne fra favoritter</string>
+ <string name="dlg_delete_confirm_text">Er du sikker på, at du vil fjerne denne kanal fra favoritter?</string>
+ <string name="toast_favorite_full">Kan ikke tilføje kanalen til listen med favoritter, da listen er fyldt.</string>
+ <string name="toast_already_favorite">Denne kanal er allerede på listen med favoritter.</string>
+ <string name="toast_channel_deleted">Fjernet fra favoritter.</string>
+ <string name="toast_channel_added">Tilføjet til favoritter.</string>
+ <string name="toast_channel_searched">Søgt efter tilgængelige kanaler:</string>
+ <string name="toast_cannot_search">Kan ikke søge efter tilgængelig kanal.</string>
+ <string name="toast_invalid_frequency">Ugyldigt frekvens for den aktuelle placering. Gyldigt frekvensinterval: 87,5-108,0</string>
+ <string name="toast_invalid_input">Den sidste ugyldige indtastning. Gyldig værdi er 0 eller 5.</string>
+ <string name="optmenu_rds_settings">RDS-indstillinger</string>
+ <string name="dlg_rds_settings_channel_information">Kanaloplysninger</string>
+ <string name="dlg_rds_settings_alternative_frequency">Alternativ frekvens</string>
+ <string name="sound_mode">Lydfunktion</string>
+ <string name="more">"Mere"</string>
+ <string name="power">"tænd/sluk"</string>
+ <string name="toast_in_call">Du kan ikke starte FM-radio, når du er i gang med et opkald.</string>
+ <string name="empty_list">Kanallisten er tom.</string>
+ <string name="edit_frequency_overwrite_text">Overskriv</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">Tilslut dine øretelefoner for at bruge dem som radioantenne.</string>
+ <string name="fm_recorder_name">FM-optager</string>
+ <string name="toast_recording_lost_warning">Din optagelse mistes, hvis du fjerner SD-kortet!</string>
+ <string name="toast_start_recording">Start optagelse...</string>
+ <string name="toast_sdcard_missing">Dit SD-kort mangler!</string>
+ <string name="toast_sdcard_insufficient_space">Utilstrækkelig plads på SD-kort!</string>
+ <string name="toast_recorder_internal_error">Der opstod en intern fejl i optageren!</string>
+ <string name="toast_player_internal_error">Der opstod en intern fejl i afspilleren!</string>
+ <string name="toast_powerup_before_record_warning">Tænd først for FM!</string>
+ <string name="optmenu_record">Optag FM</string>
+ <string name="btn_save_recording">"Gem"</string>
+ <string name="btn_discard_recording">Kassér</string>
+ <string name="edit_recording_name_hint">Indtast filnavn her</string>
+ <string name="dlg_save_recording_title">Gem optaget fil</string>
+ <string name="dlg_save_recording_storage_warning">Utilstrækkelig lagerplads! Vil du gemme den aktuelle optagelse?</string>
+ <string name="already_exists">findes allerede</string>
+ <string name="optmenu_speaker">Højttaler</string>
+ <string name="optmenu_earphone">Øretelefon</string>
+ <string name="not_available">Ikke tilgængelig for øjeblikket</string>
+ <string name="add_to_favorite1">Tilføj til forudindstillede kanaler</string>
+ <string name="contmenu_item_delete1">Fjern fra forudindstillede kanaler</string>
+ <string name="dlg_delete_confirm_title1">Bekræft at fjerne fra forudindstillede kanaler</string>
+ <string name="dlg_delete_confirm_text1">Er du sikker på, at du vil fjerne denne kanal fra forudindstillede kanaler?</string>
+ <string name="toast_favorite_full1">Kan ikke tilføje kanalen til listen med forudindstillede kanaler, da listen er fyldt.</string>
+ <string name="toast_already_favorite1">Denne kanal er allerede på listen med forudindstillede kanaler.</string>
+ <string name="toast_channel_deleted1">Fjern fra forudindstillede kanaler.</string>
+ <string name="toast_channel_added1">Tilføjet til forudindstillede kanaler.</string>
+</resources> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/values-de-rAT/strings.xml b/MediaTek/FmRadio/res/values-de-rAT/strings.xml
new file mode 100755
index 0000000..e564f4d
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-de-rAT/strings.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">FM-Radio</string>
+ <string name="favorite_manager">Kanalliste</string>
+ <string name="add_to_favorite">Zum Favoriten. hinzufügen</string>
+ <string name="optmenu_search">Suchen</string>
+ <string name="optmenu_exit">Beenden</string>
+ <string name="contmenu_title">Aktionen</string>
+ <string name="contmenu_item_edit">Editieren</string>
+ <string name="contmenu_item_delete">Aus Favoriten löschen</string>
+ <string name="dlg_noantenna_text">Sie benötigen Kopfhörer als Antenne. Stöpseln Sie Ihren Kopfhörer ein.</string>
+ <string name="dlg_noantenna_title">Kopfhörer einstecken</string>
+ <string name="btn_yes">Ja</string>
+ <string name="btn_no">Nein</string>
+ <string name="btn_ok">OK</string>
+ <string name="btn_cancel">Abbrechen</string>
+ <string name="dlg_progress_title">Suchen</string>
+ <string name="dlg_progress_text">Kanäle suchen...</string>
+ <string name="dlg_addedit_station_name">Name:</string>
+ <string name="dlg_addedit_station_freq">Frequenz:</string>
+ <string name="dlg_addedit_title_edit">Kanal editieren</string>
+ <string name="default_station_name">Neuer Kanal</string>
+ <string name="dlg_delete_confirm_title">Aus Favoriten löschen bestätigen</string>
+ <string name="dlg_delete_confirm_text">Wollen Sie diesen Kanal wirklich aus den Favoriten löschen?</string>
+ <string name="toast_favorite_full">Kann Kanal nicht zur Favoritenliste hinzufügen, da diese voll ist.</string>
+ <string name="toast_already_favorite">Der Kanal existiert bereits in der Favoritenliste.</string>
+ <string name="toast_channel_deleted">Erfolgreich aus den Favoriten gelöscht.</string>
+ <string name="toast_channel_added">Erfolgreich den Favoriten hinzugefügt.</string>
+ <string name="toast_channel_searched">Suche aus verfügbaren Kanälen:</string>
+ <string name="toast_cannot_search">Suche aus verfügbaren Kanälen nicht möglich.</string>
+ <string name="toast_invalid_frequency">Ungültige Frequenz für momentanen Standort Gültiger Frequenzbereich: 87,5-108,0</string>
+ <string name="toast_invalid_input">Letzte ungültige Eingabe, gültige Werte sind 0 oder 5.</string>
+ <string name="optmenu_rds_settings">RDS-Einstellungen</string>
+ <string name="dlg_rds_settings_channel_information">Kanal-Information</string>
+ <string name="dlg_rds_settings_alternative_frequency">Alternativfrequenz</string>
+ <string name="sound_mode">Sound-Modus</string>
+ <string name="more">Mehr</string>
+ <string name="power">Leistung</string>
+ <string name="toast_in_call">Sie können, wenn Sie telefonieren, das FM-Radio nicht starten.</string>
+ <string name="empty_list">Kanalliste ist leer.</string>
+ <string name="edit_frequency_overwrite_text">Überschreiben</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">Stöpseln Sie den Ohrhörer ein, um ihn als Antenne zu verwenden.</string>
+ <string name="fm_recorder_name">FM-Recorder</string>
+ <string name="toast_recording_lost_warning">Da die SD-Karte entfernt wurde, geht die Aufnahme verloren.</string>
+ <string name="toast_start_recording">Aufnahme wird gestartet...</string>
+ <string name="toast_sdcard_missing">Ihre SD-Karte fehlt!</string>
+ <string name="toast_sdcard_insufficient_space">Platz auf SD-Karte reicht nicht aus!</string>
+ <string name="toast_recorder_internal_error">Interner Aufnahmefehler!</string>
+ <string name="toast_player_internal_error">Interner Wiedergabefehler!</string>
+ <string name="toast_powerup_before_record_warning">FM erst einschalten!</string>
+ <string name="optmenu_record">FM aufnehmen</string>
+ <string name="btn_save_recording">Speichern</string>
+ <string name="btn_discard_recording">Verwerfen</string>
+ <string name="edit_recording_name_hint">Hier Dateinamen eingeben</string>
+ <string name="dlg_save_recording_title">Aufnahmedatei speichern</string>
+ <string name="dlg_save_recording_storage_warning">Unzureichender Speicherplatz! Do you want to save current recording?</string>
+ <string name="already_exists">Existiert bereits</string>
+ <string name="optmenu_speaker">Lautsprecher</string>
+ <string name="optmenu_earphone">Kopfhörer</string>
+ <string name="not_available">Momentan nicht verfügbar</string>
+ <string name="add_to_favorite1">Zu gespeicherten Kanälen hinzufügen</string>
+ <string name="contmenu_item_delete1">Aus gespeicherten Kanälen löschen</string>
+ <string name="dlg_delete_confirm_title1">Aus gespeicherten Kanälen löschen betätigen</string>
+ <string name="dlg_delete_confirm_text1">Wollen Sie diesen Kanal wirklich aus den gespeicherten Kanälen löschen?</string>
+ <string name="toast_favorite_full1">Kann Kanal nicht zur Liste der gespeicherten Kanäle hinzufügen, da diese voll ist.</string>
+ <string name="toast_already_favorite1">Der Kanal existiert bereits in der Liste der gespeicherten Kanäle.</string>
+ <string name="toast_channel_deleted1">Erfolgreich aus den gespeicherten Kanälen gelöscht.</string>
+ <string name="toast_channel_added1">Erfolgreich zu den gespeicherten Kanälen hinzugefügt.</string>
+</resources> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/values-de/strings.xml b/MediaTek/FmRadio/res/values-de/strings.xml
new file mode 100755
index 0000000..a317db7
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-de/strings.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">FM-Übertragung</string>
+ <string name="favorite_manager">Senderliste</string>
+ <string name="add_to_favorite">Zu Favoriten hinzufügen</string>
+ <string name="optmenu_search">Suche</string>
+ <string name="optmenu_exit">Ausgang</string>
+ <string name="contmenu_title">Vorgänge</string>
+ <string name="contmenu_item_edit">Bearbeiten</string>
+ <string name="contmenu_item_delete">Aus Favoriten entfernen</string>
+ <string name="dlg_noantenna_text">Sie benötigen einen Kopfhörer als Antenne. Bitte schließen Sie Ihren Kopfhörer an.</string>
+ <string name="dlg_noantenna_title">Kopfhörer anschließen</string>
+ <string name="btn_yes">Ja</string>
+ <string name="btn_no">Nein</string>
+ <string name="btn_ok">OK</string>
+ <string name="btn_cancel">Abbrechen</string>
+ <string name="dlg_progress_title">Suchen</string>
+ <string name="dlg_progress_text">Kanalsuche…</string>
+ <string name="dlg_addedit_station_name">Name:</string>
+ <string name="dlg_addedit_station_freq">Häufigkeit:</string>
+ <string name="dlg_addedit_title_edit">Kanal bearbeiten</string>
+ <string name="default_station_name">Neuer Kanal</string>
+ <string name="dlg_delete_confirm_title">Löschung des Senders bestätigen</string>
+ <string name="dlg_delete_confirm_text">Möchten Sie diesen Sender wirklich löschen?</string>
+ <string name="toast_favorite_full">Der Sender kann nicht zur Favoritenliste hinzugefügt werden, da die Liste voll ist.</string>
+ <string name="toast_already_favorite">Dieser Sender befindet sich bereits in der Favoritenliste.</string>
+ <string name="toast_channel_deleted">Erfolgreich aus Favoriten entfernt.</string>
+ <string name="toast_channel_added">Erfolgreich zu Favoriten hinzugefügt.</string>
+ <string name="toast_channel_searched">Entdeckte verfügbare Kanäle:</string>
+ <string name="toast_cannot_search">Suche nach verfügbarem Kanal nicht möglich.</string>
+ <string name="optmenu_rds_settings">RDS-Einstellungen</string>
+ <string name="dlg_rds_settings_channel_information">Kanalinformationen</string>
+ <string name="dlg_rds_settings_alternative_frequency">Alternative Frequenz</string>
+ <string name="more">Mehr Apps</string>
+ <string name="power">Potenz</string>
+ <string name="sound_mode">Klangmodus</string>
+ <string name="edit_frequency_overwrite_text">"Überschreiben"</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">Kopfhörer zur Nutzung als Radioantenne anschließen.</string>
+ <!-- For FM recording -->
+ <string name="fm_recorder_name">UKW-Rekorder</string>
+ <string name="toast_recording_lost_warning">Ihre Aufzeichnung geht beim Entfernen der SD-Karte verloren!</string>
+ <string name="toast_start_recording">Aufzeichnung starten…</string>
+ <string name="toast_sdcard_missing">Ihre SD-Karte fehlt!</string>
+ <string name="toast_sdcard_insufficient_space">Nicht genügend Platz auf der SD-Karte!</string>
+ <string name="toast_recorder_internal_error">Im Recorder ist ein interner Fehler aufgetreten!</string>
+ <string name="toast_player_internal_error">Im Player ist ein interner Fehler aufgetreten!</string>
+ <string name="toast_powerup_before_record_warning">Bitte zuerst UKW einschalten!</string>
+ <string name="optmenu_record">UKW aufnehmen</string>
+ <string name="btn_save_recording">Speichern</string>
+ <string name="btn_discard_recording">Verwerfen</string>
+ <string name="edit_recording_name_hint">Hier Dateinamen eingeben</string>
+ <string name="dlg_save_recording_title">Aufzeichnungsdatei speichern</string>
+ <string name="dlg_save_recording_storage_warning">Nicht genügend Speicher! Möchten Sie die aktuelle Aufzeichnung speichern?</string>
+ <string name="already_exists">Existiert bereits</string>
+ <string name="toast_invalid_frequency">Ungültige Frequenz für aktuellen Standort. Gültiger Frequenzbereich: 87,5-108,0.</string>
+ <string name="toast_invalid_input">Die letzte Eingabe war ungültig, gültiger Wert: 0 oder 5.</string>
+ <string name="toast_in_call">Sie können das UKW-Radio während eines Telefonats nicht starten.</string>
+ <string name="empty_list">Kanalliste ist leer.</string>
+ <string name="optmenu_speaker">"Lautsprecher"</string>
+ <string name="optmenu_earphone">Headset</string>
+ <string name="not_available">Derzeit nicht verfügbar</string>
+ <string name="add_to_favorite1">Zu voreingestellten Kanälen hinzufügen</string>
+ <string name="contmenu_item_delete1">Aus voreingestellten Kanälen entfernen</string>
+ <string name="dlg_delete_confirm_title1">Entfernung aus voreingestellten Kanälen bestätigen</string>
+ <string name="dlg_delete_confirm_text1">Möchten Sie diesen Kanal wirklich aus den voreingestellten Kanälen entfernen?</string>
+ <string name="toast_favorite_full1">Der Kanal kann nicht zur Liste voreingestellter Kanäle hinzugefügt werden, da diese voll ist.</string>
+ <string name="toast_already_favorite1">Dieser Kanal ist bereits in der Liste voreingestellter Kanäle.</string>
+ <string name="toast_channel_deleted1">Erfolgreich aus voreingestellten Kanälen entfernt.</string>
+ <string name="toast_channel_added1">Erfolgreich zu voreingestellten Kanälen hinzufügt.</string>
+</resources>
diff --git a/MediaTek/FmRadio/res/values-el/strings.xml b/MediaTek/FmRadio/res/values-el/strings.xml
new file mode 100755
index 0000000..1fdf094
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-el/strings.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">Ραδιόφωνο FM</string>
+ <string name="favorite_manager">Λίστα καναλιών</string>
+ <string name="add_to_favorite">Προσθήκη στα αγαπημένα</string>
+ <string name="optmenu_search">Αναζήτηση</string>
+ <string name="optmenu_exit">Έξοδος</string>
+ <string name="contmenu_title">Λειτουργίες</string>
+ <string name="contmenu_item_edit">Επεξεργασία</string>
+ <string name="contmenu_item_delete">Κατάργηση από τα αγαπημένα</string>
+ <string name="dlg_noantenna_text">Χρειάζεται ένα ακουστικό για κεραία. Συνδέστε το ακουστικό σας.</string>
+ <string name="dlg_noantenna_title">Συνδέστε τα ακουστικά</string>
+ <string name="btn_yes">Ναι</string>
+ <string name="btn_no">Όχι</string>
+ <string name="btn_ok">OK</string>
+ <string name="btn_cancel">Άκυρο</string>
+ <string name="dlg_progress_title">Σάρωση</string>
+ <string name="dlg_progress_text">Σάρωση καναλιών...</string>
+ <string name="dlg_addedit_station_name">Όνομα:</string>
+ <string name="dlg_addedit_station_freq">Συχνότητα:</string>
+ <string name="dlg_addedit_title_edit">Επεξεργασία καναλιού</string>
+ <string name="default_station_name">Νέο κανάλι</string>
+ <string name="dlg_delete_confirm_title">Επιβεβαίωση κατάργησης από τα αγαπημένα</string>
+ <string name="dlg_delete_confirm_text">Είστε βέβαιοι ότι θέλετε να καταργήσετε αυτό το κανάλι από τα αγαπημένα;</string>
+ <string name="toast_favorite_full">Δεν είναι δυνατή η προσθήκη του καναλιού στη λίστα αγαπημένων, επειδή είναι πλήρης.</string>
+ <string name="toast_already_favorite">Αυτό το κανάλι βρίσκεται ήδη στη λίστα αγαπημένων.</string>
+ <string name="toast_channel_deleted">Καταργήθηκε από τα αγαπημένα με επιτυχία.</string>
+ <string name="toast_channel_added">Προστέθηκε στα αγαπημένα με επιτυχία.</string>
+ <string name="toast_channel_searched">Έγινε αναζήτηση διαθέσιμων καναλιών:</string>
+ <string name="toast_cannot_search">Δεν είναι δυνατή η αναζήτηση διαθέσιμων καναλιών.</string>
+ <string name="toast_invalid_frequency">Μη έγκυρη συχνότητα για την τρέχουσα τοποθεσία. Έγκυρο εύρος συχνοτήτων: 87,5-108,0.</string>
+ <string name="optmenu_rds_settings">Ρυθμίσεις RDS</string>
+ <string name="dlg_rds_settings_channel_information">Πληροφορίες καναλιού</string>
+ <string name="dlg_rds_settings_alternative_frequency">Εναλλακτική συχνότητα</string>
+ <string name="sound_mode">Λειτουργία ήχου</string>
+ <string name="more">Περισσότερες εφαρμογές</string>
+ <string name="power">υψωμένο στη δύναμη</string>
+ <string name="edit_frequency_overwrite_text">"Αντικατάσταση"</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">Συνδέστε τα ακουστικά σας που λειτουργούν ως κεραία ραδιοφώνου. </string>
+ <!-- For FM recording -->
+ <string name="fm_recorder_name">Πρόγραμμα εγγραφής FM</string>
+ <string name="toast_recording_lost_warning">Η εγγραφή σας θα χαθεί λόγω αφαίρεσης της κάρτας SD!</string>
+ <string name="toast_start_recording">Έναρξη εγγραφής...</string>
+ <string name="toast_sdcard_missing">Η κάρτα SD λείπει!</string>
+ <string name="toast_sdcard_insufficient_space">Ανεπαρκής χώρος στην κάρτα SD!</string>
+ <string name="toast_recorder_internal_error">Παρουσιάστηκε εσωτερικό σφάλμα στο πρόγραμμα εγγραφής!</string>
+ <string name="toast_player_internal_error">Παρουσιάστηκε εσωτερικό σφάλμα στο πρόγραμμα αναπαραγωγής!</string>
+ <string name="toast_powerup_before_record_warning">Πρώτα ενεργοποιήστε τα FM!</string>
+ <string name="optmenu_record">Εγγραφή FM</string>
+ <string name="btn_save_recording">Αποθήκευση</string>
+ <string name="btn_discard_recording">Απόρριψη</string>
+ <string name="edit_recording_name_hint">Πληκτρολογήστε εδώ το όνομα αρχείου</string>
+ <string name="dlg_save_recording_title">Αποθήκευση αρχείου εγγραφής</string>
+ <string name="dlg_save_recording_storage_warning">Ανεπαρκής χώρος αποθήκευσης! Θέλετε να αποθηκεύσετε την τρέχουσα εγγραφή;</string>
+ <string name="already_exists">υπάρχει ήδη</string>
+ <string name="toast_invalid_input">Η τελευταία μη έγκυρη εισαγωγή, οι έγκυρες τιμές είναι 0 ή 5.</string>
+ <string name="toast_in_call">Δεν είναι δυνατή η εκκίνηση της εφαρμογής "Ραδιόφωνο FM" ενώ βρίσκεται σε εξέλιξη κλήση.</string>
+ <string name="empty_list">Η λίστα καναλιών είναι κενή.</string>
+ <string name="optmenu_speaker">"Ηχείο"</string>
+ <string name="optmenu_earphone">Ακουστικά</string>
+ <string name="not_available">Επί του παρόντος δεν είναι διαθέσιμη</string>
+ <string name="add_to_favorite1">Προσθήκη στα προκαθορισμένα κανάλια</string>
+ <string name="contmenu_item_delete1">Κατάργηση από τα προκαθορισμένα κανάλια</string>
+ <string name="dlg_delete_confirm_title1">Επιβεβαίωση κατάργησης από τα προκαθορισμένα κανάλια</string>
+ <string name="dlg_delete_confirm_text1">Είστε βέβαιοι ότι θέλετε να καταργήσετε αυτό το κανάλι από τα προκαθορισμένα κανάλια;</string>
+ <string name="toast_favorite_full1">Δεν είναι δυνατή η προσθήκη αυτού του καναλιού στη λίστα προκαθορισμένων καναλιών, επειδή είναι πλήρης.</string>
+ <string name="toast_already_favorite1">Αυτό το κανάλι βρίσκεται ήδη στη λίστα προκαθορισμένων καναλιών.</string>
+ <string name="toast_channel_deleted1">Η κατάργηση από τα προκαθορισμένα κανάλια ολοκληρώθηκε με επιτυχία.</string>
+ <string name="toast_channel_added1">Η προσθήκη στα προκαθορισμένα κανάλια ολοκληρώθηκε με επιτυχία.</string>
+</resources>
diff --git a/MediaTek/FmRadio/res/values-en-rGB/strings.xml b/MediaTek/FmRadio/res/values-en-rGB/strings.xml
new file mode 100755
index 0000000..adfec38
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-en-rGB/strings.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">FM Radio</string>
+ <string name="favorite_manager">Channel list</string>
+ <string name="add_to_favorite">Add to Favourites</string>
+ <string name="optmenu_search">Search</string>
+ <string name="optmenu_exit">Exit</string>
+ <string name="contmenu_title">Operations</string>
+ <string name="contmenu_item_edit">Edit</string>
+ <string name="contmenu_item_delete">Remove from favourites</string>
+ <string name="dlg_noantenna_text">You need an earphone cable as an antenna. Please plug in your earphone.</string>
+ <string name="dlg_noantenna_title">Plug in earphone</string>
+ <string name="btn_yes">"Yes"</string>
+ <string name="btn_no">"No"</string>
+ <string name="btn_ok">OK</string>
+ <string name="btn_cancel">Cancel</string>
+ <string name="dlg_progress_title">Search</string>
+ <string name="dlg_progress_text">Search channels...</string>
+ <string name="dlg_addedit_station_name">Name:</string>
+ <string name="dlg_addedit_station_freq">Frequency:</string>
+ <string name="dlg_addedit_title_edit">Edit Channel</string>
+ <string name="default_station_name">New Channel</string>
+ <string name="dlg_delete_confirm_title">Confirm remove from favourites</string>
+ <string name="dlg_delete_confirm_text">Are you sure you want to remove this channel from favourites?</string>
+ <string name="toast_favorite_full">Cannot add channel to favourites because list is full.</string>
+ <string name="toast_already_favorite">This channel is already in the favourites list.</string>
+ <string name="toast_channel_deleted">Successfully removed from favourites.</string>
+ <string name="toast_channel_added">Successfully added to favourites.</string>
+ <string name="toast_channel_searched">Searched all available channels:</string>
+ <string name="toast_cannot_search">Cannot search all available channels.</string>
+ <string name="toast_invalid_frequency">Invalid frequency for current location. Valid frequency range: 87,5 - 108,0</string>
+ <string name="toast_invalid_input">Last input invalid, valid value is 0 or 5.</string>
+ <string name="optmenu_rds_settings">RDS settings</string>
+ <string name="dlg_rds_settings_channel_information">Channel information</string>
+ <string name="dlg_rds_settings_alternative_frequency">Alternative frequency</string>
+ <string name="sound_mode">Sound mode</string>
+ <string name="more">"More"</string>
+ <string name="power">"Power"</string>
+ <string name="toast_in_call">Cannot launch FM Radio with a call in progress.</string>
+ <string name="empty_list">Channel list is empty.</string>
+ <string name="edit_frequency_overwrite_text">Overwrite</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">Plug in earphones, lead acts as radio antenna.</string>
+ <string name="fm_recorder_name">FM Recorder</string>
+ <string name="toast_recording_lost_warning">Your recording will be lost if SD is removed!</string>
+ <string name="toast_start_recording">Start recording...</string>
+ <string name="toast_sdcard_missing">Your SD card is missing!</string>
+ <string name="toast_sdcard_insufficient_space">Insufficient space on SD card!</string>
+ <string name="toast_recorder_internal_error">Internal record error!</string>
+ <string name="toast_player_internal_error">Internal play error!</string>
+ <string name="toast_powerup_before_record_warning">Please power up FM first!</string>
+ <string name="optmenu_record">Record FM</string>
+ <string name="btn_save_recording">"Save"</string>
+ <string name="btn_discard_recording">Discard</string>
+ <string name="edit_recording_name_hint">Type file name here</string>
+ <string name="dlg_save_recording_title">Save recorded file</string>
+ <string name="dlg_save_recording_storage_warning">Insufficient storage! Do you want to save current recording?</string>
+ <string name="already_exists">already exists</string>
+ <string name="optmenu_speaker">Speaker</string>
+ <string name="optmenu_earphone">Earphone</string>
+ <string name="not_available">Currently not available</string>
+ <string name="add_to_favorite1">Add to preset channels</string>
+ <string name="contmenu_item_delete1">Remove from preset channels</string>
+ <string name="dlg_delete_confirm_title1">Confirm remove from preset channels</string>
+ <string name="dlg_delete_confirm_text1">Are you sure you want to remove this preset channel?</string>
+ <string name="toast_favorite_full1">Cannot add channel because preset list is full.</string>
+ <string name="toast_already_favorite1">This channel is already in the preset channel list.</string>
+ <string name="toast_channel_deleted1">Successfully removed from preset channels.</string>
+ <string name="toast_channel_added1">Successfully added to preset channels.</string>
+</resources> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/values-en-rIN/strings.xml b/MediaTek/FmRadio/res/values-en-rIN/strings.xml
new file mode 100755
index 0000000..b4d31e1
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-en-rIN/strings.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name">FM Radio</string>
+ <string name="dlg_progress_title">Search</string>
+ <string name="btn_yes">Yes</string>
+ <string name="optmenu_speaker">Speaker</string>
+ <string name="edit_frequency_overwrite_text">Overwrite</string>
+ <string name="toast_start_recording">Start recording...</string>
+ <string name="fm_unit">MHz</string>
+ <string name="empty_list">Channel list is empty.</string>
+ <string name="optmenu_rds_settings">RDS settings</string>
+ <string name="toast_channel_searched">Searched out available channels:</string>
+ <string name="already_exists">already exists</string>
+ <string name="dlg_noantenna_title">Plug in earphone</string>
+ <string name="add_to_favorite">Add to Favorite</string>
+ <string name="toast_sdcard_insufficient_space">Insufficient SD card space!</string>
+ <string name="dlg_delete_confirm_title">Confirm remov‍al from favorites</string>
+ <string name="optmenu_record">Record FM</string>
+ <string name="optmenu_earphone">Earphone</string>
+ <string name="sound_mode">Sound mode</string>
+ <string name="toast_already_favorite">This channel is already in favorite list.</string>
+ <string name="not_available">Currently not available</string>
+ <string name="toast_channel_deleted">Successfully removed from favorites.</string>
+ <string name="toast_channel_added">Successfully added to favorites.</string>
+ <string name="dlg_rds_settings_channel_information">Channel information</string>
+ <string name="toast_favorite_full">Cannot add the channel to favorite list because it is full.</string>
+ <string name="btn_save_recording">Save</string>
+ <string name="optmenu_search">Search</string>
+ <string name="dlg_rds_settings_alternative_frequency">Alternative frequency</string>
+ <string name="dlg_progress_text">Search channels...</string>
+ <string name="optmenu_exit">Exit</string>
+ <string name="more">More</string>
+ <string name="btn_discard_recording">Discard</string>
+ <string name="contmenu_item_edit">Edit</string>
+ <string name="toast_cannot_search">Cannot search available channel.</string>
+ <string name="dlg_save_recording_storage_warning">Insufficient storage! Do you want to save current recording?</string>
+ <string name="toast_in_call">You can not launch FM Radio when you are in call.</string>
+ <string name="dlg_addedit_station_freq">Frequency:</string>
+ <string name="toast_recorder_internal_error">An internal error occured in recorder!</string>
+ <string name="dlg_save_recording_title">Save recording file</string>
+ <string name="btn_ok">OK</string>
+ <string name="power">Power</string>
+ <string name="contmenu_item_delete">Remove from favorites</string>
+ <string name="toast_powerup_before_record_warning">Please switch on FM first!</string>
+ <string name="fm_recorder_name">FM Recorder</string>
+ <string name="toast_recording_lost_warning">Your recording will be lost due to SD removal!</string>
+ <string name="dlg_delete_confirm_text">Are you sure you want to remove this channel from favorites?</string>
+ <string name="default_station_name">New Channel</string>
+ <string name="btn_cancel">Cancel</string>
+ <string name="contmenu_title">Operations</string>
+ <string name="btn_no">No</string>
+ <string name="favorite_manager">Channel list</string>
+ <string name="toast_invalid_frequency">Invalid frequency for current location. Valid frequency scope: 87.5-108.0</string>
+ <string name="toast_sdcard_missing">Your SD card is missing!</string>
+ <string name="dlg_addedit_station_name">Name:</string>
+ <string name="dlg_addedit_title_edit">Edit Channel</string>
+ <string name="toast_invalid_input">The last invalid input, valid value is 0 or 5.</string>
+ <string name="edit_recording_name_hint">Type file name here</string>
+ <string name="dlg_noantenna_text">You need an earphone as antenna. Please plug in your earphone.</string>
+ <string name="toast_player_internal_error">An internal error occured in player!</string>
+</resources> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/values-en-rUS/strings.xml b/MediaTek/FmRadio/res/values-en-rUS/strings.xml
new file mode 100755
index 0000000..043c43f
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-en-rUS/strings.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">FM Radio</string>
+ <string name="favorite_manager">Channel list</string>
+ <string name="add_to_favorite">Add to Favorite</string>
+ <string name="optmenu_search">Search</string>
+ <string name="optmenu_exit">Exit</string>
+ <string name="contmenu_title">Operations</string>
+ <string name="contmenu_item_edit">Edit</string>
+ <string name="contmenu_item_delete">Remove from favorites</string>
+ <string name="dlg_noantenna_text">You need an earphone as antenna. Please plug in your earphone.</string>
+ <string name="dlg_noantenna_title">Plug in earphone</string>
+ <string name="btn_yes">Yes</string>
+ <string name="btn_no">No</string>
+ <string name="btn_ok">OK</string>
+ <string name="btn_cancel">Cancel</string>
+ <string name="dlg_progress_title">Search</string>
+ <string name="dlg_progress_text">Search channels...</string>
+ <string name="dlg_addedit_station_name">Name:</string>
+ <string name="dlg_addedit_station_freq">Frequency:</string>
+ <string name="dlg_addedit_title_edit">Edit Channel</string>
+ <string name="default_station_name">New Channel</string>
+ <string name="dlg_delete_confirm_title">Confirm remove from favorites</string>
+ <string name="dlg_delete_confirm_text">Are you sure you want to remove this channel from favorites?</string>
+ <string name="toast_favorite_full">Cannot add the channel to favorite list because it is full.</string>
+ <string name="toast_already_favorite">This channel is already in favorite list.</string>
+ <string name="toast_channel_deleted">Successfully removed from favorites.</string>
+ <string name="toast_channel_added">Successfully added to favorites.</string>
+ <string name="toast_channel_searched">Searched out available channels:</string>
+ <string name="toast_cannot_search">Cannot search out available channel.</string>
+ <string name="toast_invalid_frequency">Invalid frequency for current location. Valid frequency scope: 87.5-108.0</string>
+ <string name="toast_invalid_input">The last invalid input, valid value is 0 or 5.</string>
+ <string name="optmenu_rds_settings">RDS settings</string>
+ <string name="dlg_rds_settings_channel_information">Channel information</string>
+ <string name="dlg_rds_settings_alternative_frequency">Alternative frequency</string>
+ <string name="sound_mode">Sound mode</string>
+ <string name="more">More</string>
+ <string name="power">Power</string>
+ <string name="toast_in_call">You can not launch FM Radio when you are in call.</string>
+ <string name="empty_list">Channel list is empty.</string>
+ <string name="optmenu_speaker">Speaker</string>
+ <string name="optmenu_earphone">Earphone</string>
+ <string name="edit_frequency_overwrite_text">Overwrite</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">Plug in your earphones to use as a radio antenna.</string>
+ <!-- For FM recording -->
+ <string name="fm_recorder_name">FM Recorder</string>
+ <string name="toast_recording_lost_warning">Your recording will be lost due to SD removal!</string>
+ <string name="toast_start_recording">Start recording...</string>
+ <string name="toast_sdcard_missing">Your SD card is missing!</string>
+ <string name="toast_sdcard_insufficient_space">Insufficient SD card space!</string>
+ <string name="toast_recorder_internal_error">An internal error occured in recorder!</string>
+ <string name="toast_player_internal_error">An internal error occured in player!</string>
+ <string name="toast_powerup_before_record_warning">Please power up FM first!</string>
+ <string name="optmenu_record">Record FM</string>
+ <string name="btn_save_recording">Save</string>
+ <string name="btn_discard_recording">Discard</string>
+ <string name="edit_recording_name_hint">Type file name here</string>
+ <string name="dlg_save_recording_title">Save recording file</string>
+ <string name="dlg_save_recording_storage_warning">Insufficient storage! Do you want to save current recording?</string>
+ <string name="already_exists">already exists</string>
+ <string name="not_available">Currently not available</string>
+ <string name="add_to_favorite1">Add to preset channels</string>
+ <string name="contmenu_item_delete1">Remove from preset channels</string>
+ <string name="dlg_delete_confirm_title1">Confirm remove from preset channels</string>
+ <string name="dlg_delete_confirm_text1">Are you sure you want to remove this channel from preset channels?</string>
+ <string name="toast_favorite_full1">Cannot add the channel to preset channel list because it is full.</string>
+ <string name="toast_already_favorite1">This channel is already in preset channel list.</string>
+ <string name="toast_channel_deleted1">Successfully removed from preset channels.</string>
+ <string name="toast_channel_added1">Successfully added to preset channels.</string>
+</resources>
diff --git a/MediaTek/FmRadio/res/values-es-rUS/strings.xml b/MediaTek/FmRadio/res/values-es-rUS/strings.xml
new file mode 100755
index 0000000..73abb52
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-es-rUS/strings.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">Radio FM</string>
+ <string name="favorite_manager">Lista de canales</string>
+ <string name="add_to_favorite">Añadir a Favoritos</string>
+ <string name="optmenu_search">Buscar</string>
+ <string name="optmenu_exit">Salir</string>
+ <string name="contmenu_title">Operaciones</string>
+ <string name="contmenu_item_edit">Editar</string>
+ <string name="contmenu_item_delete">Eliminar desde favoritos</string>
+ <string name="dlg_noantenna_text">Precisa un auricular como antena. Enchufe su auricular.</string>
+ <string name="dlg_noantenna_title">Enchufe auricular</string>
+ <string name="btn_yes">"Sí"</string>
+ <string name="btn_no">"No"</string>
+ <string name="btn_ok">Aceptar</string>
+ <string name="btn_cancel">Cancelar</string>
+ <string name="dlg_progress_title">Buscar</string>
+ <string name="dlg_progress_text">Buscar canales...</string>
+ <string name="dlg_addedit_station_name">Nombre:</string>
+ <string name="dlg_addedit_station_freq">Frecuencia:</string>
+ <string name="dlg_addedit_title_edit">Editar Canal</string>
+ <string name="default_station_name">Nuevo Canal</string>
+ <string name="dlg_delete_confirm_title">Confirmar eliminar de favoritos</string>
+ <string name="dlg_delete_confirm_text">¿Está seguro que desea eliminar este canal de favoritos?</string>
+ <string name="toast_favorite_full">No puede añadir el canal a la lista de favoritos porque está llena.</string>
+ <string name="toast_already_favorite">Este canal ya está en la lista de favoritos.</string>
+ <string name="toast_channel_deleted">Eliminado de favoritos con éxito.</string>
+ <string name="toast_channel_added">Añadido a favoritos con éxito.</string>
+ <string name="toast_channel_searched">Canales disponibles buscados:</string>
+ <string name="toast_cannot_search">No pueden buscarse los canales disponibles.</string>
+ <string name="toast_invalid_frequency">Frecuencia inválida para la ubicación actual. Ámbito de frecuencia inválida: 87,5-108,0</string>
+ <string name="toast_invalid_input">La última entrada inválida, el valor válido es 0 o 5.</string>
+ <string name="optmenu_rds_settings">Configuración RDS</string>
+ <string name="dlg_rds_settings_channel_information">Información de canal</string>
+ <string name="dlg_rds_settings_alternative_frequency">Frecuencia alternativa</string>
+ <string name="sound_mode">Modo de sonido</string>
+ <string name="more">"Más"</string>
+ <string name="power">"potencia"</string>
+ <string name="toast_in_call">No puede lanzar la Radio FM cuando está en una llamada.</string>
+ <string name="empty_list">La lista de canales está vacía.</string>
+ <string name="edit_frequency_overwrite_text">Sobrescribir</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">Enchufar los auriculares para utilizar como antena de radio.</string>
+ <string name="fm_recorder_name">Grabadora FM</string>
+ <string name="toast_recording_lost_warning">¡Su grabación se perderá debido a la remoción de la SD!</string>
+ <string name="toast_start_recording">Iniciar grabación...</string>
+ <string name="toast_sdcard_missing">¡Falta su Tarjeta SD!</string>
+ <string name="toast_sdcard_insufficient_space">¡Espacio de tarjeta SD insuficiente!</string>
+ <string name="toast_recorder_internal_error">¡Ocurrió un error interno en la grabadora!</string>
+ <string name="toast_player_internal_error">¡Ocurrió un error interno en la reproductora!</string>
+ <string name="toast_powerup_before_record_warning">¡Inicie FM primero!</string>
+ <string name="optmenu_record">Grabar FM</string>
+ <string name="btn_save_recording">"Guardar"</string>
+ <string name="btn_discard_recording">Descartar</string>
+ <string name="edit_recording_name_hint">Ingresar el nombre del archivo aquí</string>
+ <string name="dlg_save_recording_title">Guardar archivo de grabación</string>
+ <string name="dlg_save_recording_storage_warning">¡Almacenamiento insuficiente! ¿Desea usted guardar la grabación actual?</string>
+ <string name="already_exists">ya existe</string>
+ <string name="optmenu_speaker">Altavoz</string>
+ <string name="optmenu_earphone">Auricular</string>
+ <string name="not_available">Actualmente no disponible</string>
+ <string name="add_to_favorite1">Añadir a los canales preseleccionados</string>
+ <string name="contmenu_item_delete1">Eliminar de canales preprogramados</string>
+ <string name="dlg_delete_confirm_title1">Confirmar eliminar de canales preconfigurados</string>
+ <string name="dlg_delete_confirm_text1">¿Está seguro que desea eliminar este canal de canales preconfigurados?</string>
+ <string name="toast_favorite_full1">No puede añadir el canal a la lista de canales preconfigurados porque está llena.</string>
+ <string name="toast_already_favorite1">Este canal ya está en la lista de favoritos preconfigurados.</string>
+ <string name="toast_channel_deleted1">Eliminado de canales preconfigurados con éxito.</string>
+ <string name="toast_channel_added1">Añadido a canales preconfigurados con éxito.</string>
+</resources> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/values-es/strings.xml b/MediaTek/FmRadio/res/values-es/strings.xml
new file mode 100755
index 0000000..1722396
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-es/strings.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">Transmisión FM</string>
+ <string name="favorite_manager">Lista de canales</string>
+ <string name="add_to_favorite">Agregar a favoritos</string>
+ <string name="optmenu_search">Búsqueda</string>
+ <string name="optmenu_exit">Salir</string>
+ <string name="contmenu_title">Operaciones</string>
+ <string name="contmenu_item_edit">Editar</string>
+ <string name="contmenu_item_delete">Quitar de favoritos</string>
+ <string name="dlg_noantenna_text">Necesita unos auriculares como antena. Enchufe los auriculares.</string>
+ <string name="dlg_noantenna_title">Enchufar el auricular</string>
+ <string name="btn_yes">Si</string>
+ <string name="btn_no">No</string>
+ <string name="btn_ok">Aceptar</string>
+ <string name="btn_cancel">Cancelar</string>
+ <string name="dlg_progress_title">Buscar</string>
+ <string name="dlg_progress_text">Buscar canales...</string>
+ <string name="dlg_addedit_station_name">Nombre:</string>
+ <string name="dlg_addedit_station_freq">Frecuencia: </string>
+ <string name="dlg_addedit_title_edit">Canal editar</string>
+ <string name="default_station_name">Canal nuevo</string>
+ <string name="dlg_delete_confirm_title">Confirmar eliminación de canal</string>
+ <string name="dlg_delete_confirm_text">¿Está seguro de que desea eliminar este canal?</string>
+ <string name="toast_favorite_full">No se puede agregar el canal a la lista de favoritos porque está llena.</string>
+ <string name="toast_already_favorite">Este canal ya está en la lista de favoritos.</string>
+ <string name="toast_channel_deleted">Se quitó de los favoritos correctamente.</string>
+ <string name="toast_channel_added">Se agregó a los favoritos correctamente.</string>
+ <string name="toast_channel_searched">Canales disponibles encontrados:</string>
+ <string name="toast_cannot_search">No se puede encontrar el canal disponible.</string>
+ <string name="optmenu_rds_settings">Configurar RDS</string>
+ <string name="dlg_rds_settings_channel_information">Información del canal</string>
+ <string name="dlg_rds_settings_alternative_frequency">Frecuencia alternativa</string>
+ <string name="more">Más aplicaciones</string>
+ <string name="power">potencia</string>
+ <string name="sound_mode">Modo de sonido</string>
+ <string name="edit_frequency_overwrite_text">"Sobrescribir"</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">Enchufe los auriculares para utilizarlos como antena de radio.</string>
+ <!-- For FM recording -->
+ <string name="fm_recorder_name">Grabadora de FM</string>
+ <string name="toast_recording_lost_warning">¡La grabación se perderá debido a la eliminación de la tarjeta SD!</string>
+ <string name="toast_start_recording">Iniciar grabación…</string>
+ <string name="toast_sdcard_missing">La tarjeta SD no está presente!</string>
+ <string name="toast_sdcard_insufficient_space">¡Espacio en tarjeta SD insuficiente!</string>
+ <string name="toast_recorder_internal_error">¡Error interno en la grabadora!</string>
+ <string name="toast_player_internal_error">¡Error interno en el reproductor!</string>
+ <string name="toast_powerup_before_record_warning">¡Active primero FM!</string>
+ <string name="optmenu_record">Grabar FM</string>
+ <string name="btn_save_recording">Guardar</string>
+ <string name="btn_discard_recording">Descartar</string>
+ <string name="edit_recording_name_hint">Escribir aquí el nombre de archivo</string>
+ <string name="dlg_save_recording_title">Guardar archivo de grabación</string>
+ <string name="dlg_save_recording_storage_warning">¡Almacenamiento insuficiente! ¿Desea guardar la grabación actual?</string>
+ <string name="already_exists">Ya existe</string>
+ <string name="toast_invalid_frequency">Frecuencia no válida para la ubicación actual. Intervalo válido de frecuencias: 87,5-108,0.</string>
+ <string name="toast_invalid_input">La última entrada no es válida, un valor válido es 0 o 5.</string>
+ <string name="toast_in_call">No puede ejecutar la radio FM durante una llamada.</string>
+ <string name="empty_list">La lista de canales está vacía.</string>
+ <string name="optmenu_speaker">"Altavoz"</string>
+ <string name="optmenu_earphone">Auriculares</string>
+ <string name="not_available">Actualmente no disponible</string>
+ <string name="add_to_favorite1">Agregar a canales predefinidos</string>
+ <string name="contmenu_item_delete1">Quitar desde canales predefinidos</string>
+ <string name="dlg_delete_confirm_title1">Confirmar la eliminación desde canales predefinidos</string>
+ <string name="dlg_delete_confirm_text1">¿Está seguro de que desea quitar este canal desde los canales predefinidos?</string>
+ <string name="toast_favorite_full1">No se puede agregar el canal a la lista de canales predefinidos porque está llena.</string>
+ <string name="toast_already_favorite1">Este canal ya está en la lista de canales predefinidos.</string>
+ <string name="toast_channel_deleted1">La eliminación desde los canales predefinidos se realizó correctamente.</string>
+ <string name="toast_channel_added1">La adición a los canales predefinidos se realizó correctamente.</string>
+</resources>
diff --git a/MediaTek/FmRadio/res/values-et-rEE/strings.xml b/MediaTek/FmRadio/res/values-et-rEE/strings.xml
new file mode 100755
index 0000000..db8035e
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-et-rEE/strings.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name">FM raadio</string>
+ <string name="dlg_progress_title">Otsi</string>
+ <string name="btn_yes">Jah</string>
+ <string name="optmenu_speaker">Kõlar</string>
+ <string name="edit_frequency_overwrite_text">Kirjuta üle</string>
+ <string name="toast_start_recording">Alusta salvestamist...</string>
+ <string name="fm_unit">MHz</string>
+ <string name="empty_list">Kanalite loend on tühi.</string>
+ <string name="optmenu_rds_settings">RDS seaded</string>
+ <string name="toast_channel_searched">Otsiti välja saadaolevad kanalid:</string>
+ <string name="already_exists">on juba olemas</string>
+ <string name="dlg_noantenna_title">Ühenda kõrvaklapid</string>
+ <string name="add_to_favorite">Lisa Lemmikutesse</string>
+ <string name="toast_sdcard_insufficient_space">SD kaardil pole piisavalt ruumi!</string>
+ <string name="dlg_delete_confirm_title">Kinnita lemmikutest eemaldamine</string>
+ <string name="optmenu_record">Salvesta FM</string>
+ <string name="optmenu_earphone">Kõrvaklapid</string>
+ <string name="sound_mode">Helirežiim</string>
+ <string name="toast_already_favorite">See kanal on juba lemmikute loendis.</string>
+ <string name="not_available">Ei ole praegu saadaval</string>
+ <string name="toast_channel_deleted">Lemmikutest eemaldamine õnnestus.</string>
+ <string name="toast_channel_added">Lemmikutesse lisamine õnnestus.</string>
+ <string name="dlg_rds_settings_channel_information">Kanali teave</string>
+ <string name="toast_favorite_full">Ei saa lisada kanalit lemmikute loendisse, kuna see on täis.</string>
+ <string name="btn_save_recording">Salvesta</string>
+ <string name="optmenu_search">Otsi</string>
+ <string name="dlg_rds_settings_alternative_frequency">Alternatiivne sagedus</string>
+ <string name="dlg_progress_text">Otsi kanaleid...</string>
+ <string name="optmenu_exit">Välju</string>
+ <string name="more">Veel</string>
+ <string name="btn_discard_recording">Likvideeri</string>
+ <string name="contmenu_item_edit">Redigeeri</string>
+ <string name="toast_cannot_search">Ei saa saadaolevat kanalit välja otsida.</string>
+ <string name="dlg_save_recording_storage_warning">Pole piisavalt mälu! Kas soovid praeguse salvestuse salvestada?</string>
+ <string name="toast_in_call">Sa ei saa käivitada FM raadiot helistamise ajal.</string>
+ <string name="dlg_addedit_station_freq">Sagedus:</string>
+ <string name="toast_recorder_internal_error">Salvestil ilmnes sisetõrge!</string>
+ <string name="dlg_save_recording_title">Salvesta salvestusfail</string>
+ <string name="btn_ok">OK</string>
+ <string name="power">Võimsus</string>
+ <string name="contmenu_item_delete">Eemalda lemmikutest</string>
+ <string name="toast_powerup_before_record_warning">Lülita kõigepealt FM sisse!</string>
+ <string name="no_antenna_info">Ühendage kõrvaklapid, et kasutada neid raadioantennina.</string>
+ <string name="fm_recorder_name">FM salvesti</string>
+ <string name="toast_recording_lost_warning">Sinu salvestus läheb SD eemaldamise tõttu kaotsi!</string>
+ <string name="dlg_delete_confirm_text">Kas soovid kindlasti selle kanali lemmikutest eemaldada?</string>
+ <string name="default_station_name">Uus kanal</string>
+ <string name="btn_cancel">Loobu</string>
+ <string name="contmenu_title">Toimingud</string>
+ <string name="btn_no">Ei</string>
+ <string name="favorite_manager">Kanalite loend</string>
+ <string name="toast_invalid_frequency">Vigane sagedus praeguse asukoha jaoks. Kehtiv sagedusulatus: 87,5-108,0</string>
+ <string name="toast_sdcard_missing">SD kaart puudub!</string>
+ <string name="dlg_addedit_station_name">Nimi:</string>
+ <string name="dlg_addedit_title_edit">Redigeeri kanalit</string>
+ <string name="toast_invalid_input">Viimane vigane sisestus, õige väärtus on 0 või 5.</string>
+ <string name="edit_recording_name_hint">Sisesta faili nimi siin</string>
+ <string name="dlg_noantenna_text">Sa vajad kõrvaklappe antenniks. Ühenda oma kõrvaklapid.</string>
+ <string name="toast_player_internal_error">Pleieril ilmnes sisetõrge!</string>
+ <string name="add_to_favorite1">Lisa eelseatud kanalitesse</string>
+ <string name="contmenu_item_delete1">Eemalda eelseatud kanalitest</string>
+ <string name="dlg_delete_confirm_title1">Kinnita eelseatud kanalitest eemaldamine</string>
+ <string name="dlg_delete_confirm_text1">Kas soovid kindlasti selle kanali eelseatud kanalitest eemaldada?</string>
+ <string name="toast_favorite_full1">Ei saa lisada kanalit eelseatud kanalite loendisse, kuna see on täis.</string>
+ <string name="toast_already_favorite1">See kanal on juba eelseatud kanalite loendis.</string>
+ <string name="toast_channel_deleted1">Eelseatud kanalitest eemaldamine õnnestus.</string>
+ <string name="toast_channel_added1">Eelseatud kanalitesse lisamine õnnestus.</string>
+</resources> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/values-fa/strings.xml b/MediaTek/FmRadio/res/values-fa/strings.xml
new file mode 100755
index 0000000..868031a
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-fa/strings.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name">راديو FM</string>
+ <string name="favorite_manager">فهرست کانال</string>
+ <string name="add_to_favorite">افزودن به علاقمندی</string>
+ <string name="optmenu_search">جستجو</string>
+ <string name="optmenu_exit">خروج</string>
+ <string name="contmenu_title">عمليات</string>
+ <string name="contmenu_item_edit">ويرايش</string>
+ <string name="contmenu_item_delete">حذف از موارد موردعلاقه </string>
+ <string name="dlg_noantenna_text">شما به هدفون در نقش آنتن نیاز دارید. لطفا گوشی خود را وصل کنید.</string>
+ <string name="dlg_noantenna_title">هدفون را وارد کنيد</string>
+ <string name="btn_yes">بله</string>
+ <string name="btn_no">خير</string>
+ <string name="btn_ok">تاييد</string>
+ <string name="btn_cancel">لغو</string>
+ <string name="dlg_progress_title">اسکن</string>
+ <string name="dlg_progress_text">اسکن کانال ها...</string>
+ <string name="dlg_addedit_station_name">نام:</string>
+ <string name="dlg_addedit_station_freq">تکرار:</string>
+ <string name="dlg_addedit_title_edit">ويرايش کانال</string>
+ <string name="default_station_name">کانال جديد</string>
+ <string name="dlg_delete_confirm_title">تاييد حذف کانال</string>
+ <string name="dlg_delete_confirm_text">آيا از حذف اين کانال مطمئن هستيد؟</string>
+ <string name="toast_favorite_full">افزودن کانال به فهرست علاقمندی ممکن نيست زيرا فهرست پر است.</string>
+ <string name="toast_already_favorite">اين کانال هم اکنون در فهرست علاقمندی موجود است.</string>
+ <string name="toast_channel_deleted">از موارد موردعلاقه حذف شد</string>
+ <string name="toast_channel_added">به موارد موردعلاقه اضافه شد</string>
+ <string name="toast_channel_searched">کانالهای موجود پيدا شده:</string>
+ <string name="toast_cannot_search">کانالی يافت نشد.</string>
+ <string name="optmenu_rds_settings">تنظيمات RDS</string>
+ <string name="dlg_rds_settings_channel_information">اطلاعات کانال</string>
+ <string name="dlg_rds_settings_alternative_frequency">فرکانس جايگزين</string>
+ <string name="more">برنامه‌های کاربردی بیشتر</string>
+ <string name="power">توان</string>
+ <string name="sound_mode">حالت صدا</string>
+ <string name="fm_unit">مگاهرتز</string>
+ <string name="no_antenna_info">گوشی ها را وصل کنید تا از آن به عنوان آنتن رادیو استفاده شود.</string>
+ <!-- For FM recording -->
+ <string name="edit_frequency_overwrite_text">"رونویسی"</string>
+ <string name="fm_recorder_name">ضبط FM</string>
+ <string name="toast_recording_lost_warning">به دلیل خارج شدن SD، مورد ضبط شده شما از بین خواهد رفت!</string>
+ <string name="toast_start_recording">شروع ضبط…</string>
+ <string name="toast_sdcard_missing">کارت SD شما وجود ندارد!</string>
+ <string name="toast_sdcard_insufficient_space">کارت SD شما وجود ندارد!</string>
+ <string name="toast_recorder_internal_error">فضای کارت SD کافی نیست!</string>
+ <string name="toast_player_internal_error">یک خطای داخلی در ضبط کننده رخ داد!</string>
+ <string name="toast_powerup_before_record_warning">لطفا ابتدا FM را روشن کنید!</string>
+ <string name="optmenu_record">ضبط FM</string>
+ <string name="btn_save_recording">ذخيره</string>
+ <string name="btn_discard_recording">صرفنظر</string>
+ <string name="edit_recording_name_hint">نام فایل را در اینجا تایپ کنید</string>
+ <string name="dlg_save_recording_title">ذخیره فایل ضبط</string>
+ <string name="dlg_save_recording_storage_warning">حافظه ناکافی! مایلید مورد ضبط شده فعلی را ذخیره کنید؟</string>
+ <string name="already_exists">تکراری</string>
+ <string name="toast_invalid_frequency">فرکانس مکان فعلی نامعتبر است. محدوده فرکانس معتبر: 87,5 تا 108,0.</string>
+ <string name="toast_invalid_input">آخرین ورودی نامعتبر، ارزش معتبر 0 یا 5 است.</string>
+ <string name="toast_in_call">زمانی که در حال مکالمه هستید نمی توانید رادیو FM را راه اندازی کنید.</string>
+ <string name="empty_list">لیست کانال خالی است.</string>
+ <string name="optmenu_speaker">"بلندگو"</string>
+ <string name="optmenu_earphone">هدست</string>
+ <string name="not_available">فعلا در دسترس نیست</string>
+ <string name="add_to_favorite1">افزودن به کانال های از پیش تنظیم شده</string>
+ <string name="contmenu_item_delete1">حذف از کانال های از پیش تنظیم شده</string>
+ <string name="dlg_delete_confirm_title1">حذف از کانال های از پیش تنظیم شده را تایید کنید</string>
+ <string name="dlg_delete_confirm_text1">آیا از حذف این کانال از کانال های از پیش تنظیم شده مطمئن هستید؟</string>
+ <string name="toast_favorite_full1">افزودن این کانال به فهرست کانال های از پیش تنظیم شده امکان پذیر نیست زیرا این فهرست پر است.</string>
+ <string name="toast_already_favorite1">این کانال در فهرست کانال های از پیش تنظیم شده موجود است.</string>
+ <string name="toast_channel_deleted1">با موفقیت از کانال های از پیش تنظیم شده حذف شد.</string>
+ <string name="toast_channel_added1">با موفقیت به کانال های از پیش تنظیم شده اضافه شد.</string>
+</resources>
+
diff --git a/MediaTek/FmRadio/res/values-fi/strings.xml b/MediaTek/FmRadio/res/values-fi/strings.xml
new file mode 100755
index 0000000..16d5977
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-fi/strings.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">FM-radio</string>
+ <string name="favorite_manager">Kanavaluettelo</string>
+ <string name="add_to_favorite">Lisää suosikkeihin</string>
+ <string name="optmenu_search">Etsi</string>
+ <string name="optmenu_exit">Lopeta</string>
+ <string name="contmenu_title">Toiminnot</string>
+ <string name="contmenu_item_edit">Muokkaa</string>
+ <string name="contmenu_item_delete">Poista suosikeista</string>
+ <string name="dlg_noantenna_text">Tarvitset kuulokkeet antenniksi. Liitä kuulokkeet.</string>
+ <string name="dlg_noantenna_title">Liitä kuuloke</string>
+ <string name="btn_yes">"Kyllä"</string>
+ <string name="btn_no">"Ei"</string>
+ <string name="btn_ok">OK</string>
+ <string name="btn_cancel">Peru</string>
+ <string name="dlg_progress_title">Etsi</string>
+ <string name="dlg_progress_text">Hae kanavia...</string>
+ <string name="dlg_addedit_station_name">Nimi:</string>
+ <string name="dlg_addedit_station_freq">Taajuus:</string>
+ <string name="dlg_addedit_title_edit">Muokkaa kanavaa</string>
+ <string name="default_station_name">Uusi kanava</string>
+ <string name="dlg_delete_confirm_title">Vahvista poistaminen suosikeista</string>
+ <string name="dlg_delete_confirm_text">Haluatko varmasti poistaa tämän kanavan suosikeista?</string>
+ <string name="toast_favorite_full">Kanavaa ei voi lisätä suosikkilistaan, koska se on täynnä.</string>
+ <string name="toast_already_favorite">Tämä kanava on jo suosikkilistallasi.</string>
+ <string name="toast_channel_deleted">Poistaminen suosikeista onnistui.</string>
+ <string name="toast_channel_added">Suosikkeihin lisääminen onnistui.</string>
+ <string name="toast_channel_searched">Haetut käytettävissä olevat kanavat:</string>
+ <string name="toast_cannot_search">Ei voi hakea käytettävissä olevia kanavia.</string>
+ <string name="toast_invalid_frequency">Väärä taajuus nykyiselle sijainnille. Kelvollinen taajuusalue: 87,5-108,0</string>
+ <string name="toast_invalid_input">Viimeinen virheellinen syöte, kelvollinen arvo on 0 tai 5.</string>
+ <string name="optmenu_rds_settings">RDS-asetukset</string>
+ <string name="dlg_rds_settings_channel_information">Kanavatiedot</string>
+ <string name="dlg_rds_settings_alternative_frequency">Vaihtoehtoinen taajuus</string>
+ <string name="sound_mode">Äänitila</string>
+ <string name="more">"Lisää"</string>
+ <string name="power">"potenssi"</string>
+ <string name="toast_in_call">Et voi käynnistää FM-radiota kesken puhelun.</string>
+ <string name="empty_list">Kanavaluettelo on tyhjä.</string>
+ <string name="edit_frequency_overwrite_text">Korvaa</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">Liitä korvanapit radioantennina käytettäväksi.</string>
+ <string name="fm_recorder_name">FM-tallennin</string>
+ <string name="toast_recording_lost_warning">Tallennuksesi menetetään, koska SD-kortti irrotettiin!</string>
+ <string name="toast_start_recording">Käynnistä tallennus...</string>
+ <string name="toast_sdcard_missing">SD-kortti puuttuu!</string>
+ <string name="toast_sdcard_insufficient_space">SD-kortin tila ei riitä!</string>
+ <string name="toast_recorder_internal_error">Tallentimessa ilmeni sisäinen virhe!</string>
+ <string name="toast_player_internal_error">Soittimessa ilmeni sisäinen virhe!</string>
+ <string name="toast_powerup_before_record_warning">Käynnistä ensin FM!</string>
+ <string name="optmenu_record">Tallenna FM</string>
+ <string name="btn_save_recording">"Tallenna"</string>
+ <string name="btn_discard_recording">Hylkää</string>
+ <string name="edit_recording_name_hint">Näppäile tiedostonimi tässä</string>
+ <string name="dlg_save_recording_title">Tallenna tallennetiedosto</string>
+ <string name="dlg_save_recording_storage_warning">Tallennustila ei riitä! Haluatko tallentaa nykyisen tallenteen?</string>
+ <string name="already_exists">on jo olemassa</string>
+ <string name="optmenu_speaker">Kaiutin</string>
+ <string name="optmenu_earphone">Kuulokkeet</string>
+ <string name="not_available">Ei tällä hetkellä käytettävissä</string>
+ <string name="add_to_favorite1">Lisää esiasetettuihin kanaviin</string>
+ <string name="contmenu_item_delete1">Poista esiasetetuista kanavista</string>
+ <string name="dlg_delete_confirm_title1">Vahvista poistaminen esiasetetuista kanavista</string>
+ <string name="dlg_delete_confirm_text1">Haluatko varmasti poistaa tämän kanavan esiasetetuista kanavista?</string>
+ <string name="toast_favorite_full1">Kanavaa ei voi lisätä esiasetettujen kanavien luetteloon, koska se on täynnä.</string>
+ <string name="toast_already_favorite1">Tämä kanava on jo esiasetettujen kanavien luettelossa.</string>
+ <string name="toast_channel_deleted1">Poistaminen esiasetetuista kanavista onnistui.</string>
+ <string name="toast_channel_added1">Lisääminen esiasetettuihin kanaviin onnistui.</string>
+</resources> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/values-fr-rCA/strings.xml b/MediaTek/FmRadio/res/values-fr-rCA/strings.xml
new file mode 100755
index 0000000..d5fe4e3
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-fr-rCA/strings.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name">Radio FM</string>
+ <string name="dlg_progress_title">Recherche</string>
+ <string name="btn_yes">Oui</string>
+ <string name="optmenu_speaker">Haut-parleur</string>
+ <string name="edit_frequency_overwrite_text">Écraser</string>
+ <string name="toast_start_recording">Démarrer l\'enregistrement...</string>
+ <string name="fm_unit">MHz</string>
+ <string name="empty_list">La liste des stations est vide.</string>
+ <string name="optmenu_rds_settings">Paramètres RDS</string>
+ <string name="toast_channel_searched">Stations disponibles recherchées :</string>
+ <string name="already_exists">existe (ent) déjà</string>
+ <string name="dlg_noantenna_title">Brancher l\'écouteur</string>
+ <string name="add_to_favorite">Ajouter aux favoris</string>
+ <string name="toast_sdcard_insufficient_space">Espace insuffisant pour la carte SD!</string>
+ <string name="dlg_delete_confirm_title">Confirmer la suppression des favoris</string>
+ <string name="optmenu_record">Enregistrement FM</string>
+ <string name="optmenu_earphone">Écouteur</string>
+ <string name="sound_mode">Mode son</string>
+ <string name="toast_already_favorite">Cette station est déjà dans la liste des favoris.</string>
+ <string name="not_available">Actuellement non disponible</string>
+ <string name="toast_channel_deleted">Retiré avec succès des favoris.</string>
+ <string name="toast_channel_added">Ajouté avec succès aux favoris.</string>
+ <string name="dlg_rds_settings_channel_information">Informations sur la station</string>
+ <string name="toast_favorite_full">La station ne peut être ajoutée à la liste des favoris car celle-ci est pleine.</string>
+ <string name="btn_save_recording">Sauvegarder</string>
+ <string name="optmenu_search">Rechercher</string>
+ <string name="dlg_rds_settings_alternative_frequency">Fréquence alternative</string>
+ <string name="dlg_progress_text">Recherche de stations...</string>
+ <string name="optmenu_exit">Quitter</string>
+ <string name="more">Plus</string>
+ <string name="btn_discard_recording">Supprimer</string>
+ <string name="contmenu_item_edit">Modifier </string>
+ <string name="toast_cannot_search">Impossible de rechercher la station disponible.</string>
+ <string name="dlg_save_recording_storage_warning">Espace de stockage insuffisant! Sauvegarder l\'enregistrement en cours?</string>
+ <string name="toast_in_call">Impossible de démarrer la radio FM en cours d\'appel</string>
+ <string name="dlg_addedit_station_freq">Fréquence :</string>
+ <string name="toast_recorder_internal_error">Une erreur interne s\'est produite dans l\'enregistreur!</string>
+ <string name="dlg_save_recording_title">Sauvegarde du fichier d\'enregistrement</string>
+ <string name="btn_ok">OK</string>
+ <string name="power">Alimentation</string>
+ <string name="contmenu_item_delete">Suppression des favoris</string>
+ <string name="toast_powerup_before_record_warning">Veuillez allumer le FM d\'abord!</string>
+ <string name="fm_recorder_name">Enregistreur FM</string>
+ <string name="toast_recording_lost_warning">Votre enregistrement sera perdu en raison de l\'enlèvement SD!</string>
+ <string name="dlg_delete_confirm_text">Supprimer cette station des favoris?</string>
+ <string name="default_station_name">Nouvelle station</string>
+ <string name="btn_cancel">Annuler</string>
+ <string name="contmenu_title">Fonctionnement</string>
+ <string name="btn_no">Non</string>
+ <string name="favorite_manager">Liste des stations</string>
+ <string name="toast_invalid_frequency">Fréquence non valide pour l\'emplacement actuel. Gamme de fréquences valides: 87.5-108.0</string>
+ <string name="toast_sdcard_missing">Votre carte SD est introuvable!</string>
+ <string name="dlg_addedit_station_name">Nom :</string>
+ <string name="dlg_addedit_title_edit">Modifier la station</string>
+ <string name="toast_invalid_input">Dernière entrée non valide; la valeur valide est 0 ou 5.</string>
+ <string name="edit_recording_name_hint">Tapez le nom de fichier ici</string>
+ <string name="dlg_noantenna_text">Un écouteur est requis en guise d\'antenne. Veuillez brancher votre écouteur.</string>
+ <string name="toast_player_internal_error">Une erreur interne s\'est produite dans le lecteur!</string>
+</resources>
diff --git a/MediaTek/FmRadio/res/values-fr/strings.xml b/MediaTek/FmRadio/res/values-fr/strings.xml
new file mode 100755
index 0000000..77ff4ec
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-fr/strings.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">Émission FM</string>
+ <string name="favorite_manager">Liste des chaînes</string>
+ <string name="add_to_favorite">Ajouter aux favoris</string>
+ <string name="optmenu_search">Recherche</string>
+ <string name="optmenu_exit">Sortie</string>
+ <string name="contmenu_title">Opérations</string>
+ <string name="contmenu_item_edit">Modifier</string>
+ <string name="contmenu_item_delete">Retirer des favoris</string>
+ <string name="dlg_noantenna_text">"Vous avez besoin d'un casque comme antenne. Veuillez brancher votre casque d'écoute."</string>
+ <string name="dlg_noantenna_title">Branchez l\'écouteur</string>
+ <string name="btn_yes">Oui</string>
+ <string name="btn_no">Non</string>
+ <string name="btn_ok">OK</string>
+ <string name="btn_cancel">Annuler</string>
+ <string name="dlg_progress_title">Rechercher</string>
+ <string name="dlg_progress_text">Balayer les chaînes…</string>
+ <string name="dlg_addedit_station_name">Nom:</string>
+ <string name="dlg_addedit_station_freq">Fréquence:</string>
+ <string name="dlg_addedit_title_edit">Modifier la chaîne </string>
+ <string name="default_station_name">Nouvelle chaîne</string>
+ <string name="dlg_delete_confirm_title">Confirmer la suppression de station</string>
+ <string name="dlg_delete_confirm_text">Etes-vous sûr de vouloir supprimer cette station?</string>
+ <string name="toast_favorite_full">Impossible d\'ajouter la station à la liste des favoris, parce qu\'elle est pleine.</string>
+ <string name="toast_already_favorite">Cette station est déjà dans la liste des favoris.</string>
+ <string name="toast_channel_deleted">Retrait des favoris réussi</string>
+ <string name="toast_channel_added">Ajout au favoris réussi</string>
+ <string name="toast_channel_searched">Canaux disponibles trouvés :</string>
+ <string name="toast_cannot_search">Impossible de chercher les canaux disponibles.</string>
+ <string name="optmenu_rds_settings">Paramètres RDS</string>
+ <string name="dlg_rds_settings_channel_information">Informations sur le canal</string>
+ <string name="dlg_rds_settings_alternative_frequency">Fréquence alternative</string>
+ <string name="more">Autres applications</string>
+ <string name="power">puissance</string>
+ <string name="sound_mode">Mode audio</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">Branchez vos oreillettes pour les utiliser comme antenne radio.</string>
+ <!-- For FM recording -->
+ <string name="edit_frequency_overwrite_text">"Remplacer"</string>
+ <string name="fm_recorder_name">Enregistreur FM</string>
+ <string name="toast_recording_lost_warning">Votre enregistrement sera perdu suite au retrait de la carte SD!</string>
+ <string name="toast_start_recording">"Démarrer l'enregistrement…"</string>
+ <string name="toast_sdcard_missing">Carte SD manquante!</string>
+ <string name="toast_sdcard_insufficient_space">Espace insuffisant sur carte SD!</string>
+ <string name="toast_recorder_internal_error">"Une erreur interne est survenue dans l'enregistreur!"</string>
+ <string name="toast_player_internal_error">Une erreur interne est survenue dans le lecteur!</string>
+ <string name="toast_powerup_before_record_warning">"Veuillez d'abord allumer FM!"</string>
+ <string name="optmenu_record">Enregistrer FM</string>
+ <string name="btn_save_recording">Sauvegarder</string>
+ <string name="btn_discard_recording">Rejeter</string>
+ <string name="edit_recording_name_hint">Saisissez le nom du fichier ici</string>
+ <string name="dlg_save_recording_title">"Sauvegarder le fichier d'enregistrement"</string>
+ <string name="dlg_save_recording_storage_warning">"Stockage insuffisant! Sauvegarder l'enregistrement en cours?"</string>
+ <string name="already_exists">Existe déjà</string>
+ <string name="toast_invalid_frequency">Fréquence invalide pour cet emplacement. Plage de fréquence valide: 87,5-108,0.</string>
+ <string name="toast_invalid_input">Dernière saisie invalide, valeur valide de 0 ou 5.</string>
+ <string name="toast_in_call">"Impossible d'activer la radio FM lorsqu'un appel est en cours."</string>
+ <string name="empty_list">La liste des chaînes est vide.</string>
+ <string name="optmenu_speaker">"Haut-parleur"</string>
+ <string name="optmenu_earphone">"Casque d'écoute"</string>
+ <string name="not_available">Actuellement indisponible</string>
+ <string name="add_to_favorite1">Ajouter aux chaînes préréglées</string>
+ <string name="contmenu_item_delete1">Retirer des chaînes préréglées</string>
+ <string name="dlg_delete_confirm_title1">Confirmer le retrait des chaînes préréglées</string>
+ <string name="dlg_delete_confirm_text1">Confirmer le retrait de cette chaîne des chaînes préréglées?</string>
+ <string name="toast_favorite_full1">"Impossible d'ajouter la chaîne aux chaînes préréglées car liste pleine."</string>
+ <string name="toast_already_favorite1">Cette chaîne figure déjà dans la liste.</string>
+ <string name="toast_channel_deleted1">Retrait réussi des chaînes préréglées.</string>
+ <string name="toast_channel_added1">Ajout réussi aux chaînes préréglées.</string>
+</resources>
diff --git a/MediaTek/FmRadio/res/values-hi/strings.xml b/MediaTek/FmRadio/res/values-hi/strings.xml
new file mode 100755
index 0000000..277fe06
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-hi/strings.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name">एफएम रेडियो</string>
+ <string name="favorite_manager">चैनल सूची</string>
+ <string name="add_to_favorite">पसंदीदा में जोड़ें</string>
+ <string name="optmenu_search">खोजें</string>
+ <string name="optmenu_exit">बाहर</string>
+ <string name="contmenu_title">कार्य</string>
+ <string name="contmenu_item_edit">संपादन</string>
+ <string name="contmenu_item_delete">पसंदीदा से हटाएं</string>
+ <string name="dlg_noantenna_text">आपको एंटिना के रूप में एक ईयरफ़ोन की जरूरत है। कृपया अपने ईयरफ़ोन का प्लग लगा लें।</string>
+ <string name="dlg_noantenna_title">ईयरफोन का प्‍लग लगाएं</string>
+ <string name="btn_yes">हाँ</string>
+ <string name="btn_no">नहीं</string>
+ <string name="btn_ok">ठीक</string>
+ <string name="btn_cancel">रद्द</string>
+ <string name="dlg_progress_title">स्कैन करें</string>
+ <string name="dlg_progress_text">चैनल स्कैन करें...</string>
+ <string name="dlg_addedit_station_name">नाम</string>
+ <string name="dlg_addedit_station_freq">आवृत्ति:</string>
+ <string name="dlg_addedit_title_edit">चैनल संपादित करें</string>
+ <string name="default_station_name">नया चैनल</string>
+ <string name="dlg_delete_confirm_title">डिलीट चैनल की पुष्टि करें</string>
+ <string name="dlg_delete_confirm_text">क्‍या आप निश्चित हैं कि आप यह चैनल मिटाना चाहते हैं?</string>
+ <string name="toast_favorite_full">चैनल को पसंदीदा सूची में नहीं जोड़ सकते क्‍योंकि यह भरी हुई है।</string>
+ <string name="toast_already_favorite">यह चैनल पहले से पसंदीदा सूची में है।</string>
+ <string name="toast_channel_deleted">पसंदीदा से सफलतापूर्वक हटा</string>
+ <string name="toast_channel_added">पसंदीदा में सफलतापूर्वक जुड़ा</string>
+ <string name="toast_channel_searched">उपलब्‍ध चैनल को खोजा गया:</string>
+ <string name="toast_cannot_search">उपलब्‍ध चैनल को सर्च नहीं कर सकता।</string>
+ <string name="optmenu_rds_settings">RDS सेटिंग</string>
+ <string name="dlg_rds_settings_channel_information">चैनल सूचना</string>
+ <string name="dlg_rds_settings_alternative_frequency">वैकल्पिक फ्रीक्‍वेंसी</string>
+ <string name="more">अधिक अनुप्रयोग</string>
+ <string name="power">घात</string>
+ <string name="sound_mode">ध्वनि मोड</string>
+ <string name="edit_frequency_overwrite_text">"ओवरराइट करें"</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">इयरफ़ोन को रेडियो एंटीना के रूप में उपयोग करने के लिए प्लग-इन करें।</string>
+ <!-- For FM recording -->
+ <string name="fm_recorder_name">FM रिकॉर्डर</string>
+ <string name="toast_recording_lost_warning">आपकी रिकॉर्डिंग SD हटाने के कारण गुम हो जाएगी!</string>
+ <string name="toast_start_recording">रिकॉर्डिंग आरंभ करें…</string>
+ <string name="toast_sdcard_missing">आपका SD कार्ड मौजूद नहीं है!</string>
+ <string name="toast_sdcard_insufficient_space">अपर्याप्त SD कार्ड स्थान!</string>
+ <string name="toast_recorder_internal_error">रिकॉर्डर में एक आंतरिक त्रुटि घटित हुई!</string>
+ <string name="toast_player_internal_error">प्लेयर में एक आंतरिक त्रुटि घटित हुई!</string>
+ <string name="toast_powerup_before_record_warning">कृपया पहले FM को पावर अप करें!</string>
+ <string name="optmenu_record">FM रिकॉर्ड करें</string>
+ <string name="btn_save_recording">सहेजें</string>
+ <string name="btn_discard_recording">छोड़ें</string>
+ <string name="edit_recording_name_hint">फ़ाइल का नाम यहां टाइप करें</string>
+ <string name="dlg_save_recording_title">रिकॉर्डिंग फ़ाइल सहेजें</string>
+ <string name="dlg_save_recording_storage_warning">अपर्याप्त भंडारण! क्या आप वर्तमान रिकॉर्डिंग सहेजना चाहते हैं?</string>
+ <string name="already_exists">पहले से ही मौजूद हैं</string>
+ <string name="toast_invalid_frequency">वर्तमान स्थान के लिए अमान्य फ्रीक्वेंसी। मान्य फ्रीक्वेंसी विस्तार: 87.5-108.0</string>
+ <string name="toast_invalid_input">अंतिम अमान्य इनपुट, मान्य मान 0 या 5 है।</string>
+ <string name="toast_in_call">आप कॉल के दौरान FM रेडियो चालू नहीं कर सकते।</string>
+ <string name="empty_list">चैनल सूची खाली है।</string>
+ <string name="optmenu_speaker">"स्‍पीकर"</string>
+ <string name="optmenu_earphone">हेडसेट</string>
+ <string name="not_available">वर्तमान में उपलब्ध नहीं है</string>
+ <string name="add_to_favorite1">प्रीसेट चैनल में जोड़ें</string>
+ <string name="contmenu_item_delete1">प्रीसेट चैनल से हटाएँ</string>
+ <string name="dlg_delete_confirm_title1">प्रीसेट चैनल से हटाने की पुष्टि करें</string>
+ <string name="dlg_delete_confirm_text1">क्या आप वाकई इस चैनल को प्रीसेट चैनल से हटाना चाहते हैं?</string>
+ <string name="toast_favorite_full1">चैनल को प्रीसेट चैनल सूची में नहीं जोड़ सकते क्योंकि यह भरी है।</string>
+ <string name="toast_already_favorite1">यह चैनल पहले से ही प्रीसेट चैनल सूची में मौजूद है।</string>
+ <string name="toast_channel_deleted1">प्रीसेट चैनल से सफलतापूर्वक हटा।</string>
+ <string name="toast_channel_added1">प्रीसेट चैनल में सफलतापूर्वक जुड़ा।</string>
+</resources> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/values-hr/strings.xml b/MediaTek/FmRadio/res/values-hr/strings.xml
new file mode 100755
index 0000000..5d65109
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-hr/strings.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">FM radio</string>
+ <string name="favorite_manager">Popis kanala</string>
+ <string name="add_to_favorite">Dodaj u favorite</string>
+ <string name="optmenu_search">Pretraži</string>
+ <string name="optmenu_exit">Izlaz</string>
+ <string name="contmenu_title">Operacije</string>
+ <string name="contmenu_item_edit">Uredi</string>
+ <string name="contmenu_item_delete">Ukloni iz favorita</string>
+ <string name="dlg_noantenna_text">Potrebna je slušalica kao antena. Priključite slušalicu.</string>
+ <string name="dlg_noantenna_title">Priključite slušalicu</string>
+ <string name="btn_yes">"Da"</string>
+ <string name="btn_no">"Ne"</string>
+ <string name="btn_ok">U redu</string>
+ <string name="btn_cancel">Otkaži</string>
+ <string name="dlg_progress_title">Pretraži</string>
+ <string name="dlg_progress_text">Pretraži kanale...</string>
+ <string name="dlg_addedit_station_name">Naziv:</string>
+ <string name="dlg_addedit_station_freq">Frekvencija:</string>
+ <string name="dlg_addedit_title_edit">Uredi kanal</string>
+ <string name="default_station_name">Novi kanal</string>
+ <string name="dlg_delete_confirm_title">Potvrdi uklanjanje iz favorita</string>
+ <string name="dlg_delete_confirm_text">Jeste li sigurni da želite ukloniti ovaj kanal iz favorita?</string>
+ <string name="toast_favorite_full">Ne može se dodati kanal na popis favorita jer je on pun.</string>
+ <string name="toast_already_favorite">Ovaj kanal već je na popisu favorita.</string>
+ <string name="toast_channel_deleted">Uspješno uklonjen iz favorita.</string>
+ <string name="toast_channel_added">Uspješno dodan u favorite.</string>
+ <string name="toast_channel_searched">Pronađeni su dostupni kanali:</string>
+ <string name="toast_cannot_search">Ne može se pronaći dostupni kanal.</string>
+ <string name="toast_invalid_frequency">Neispravna frekvencija za trenutnu lokaciju. Ispravni raspon frekvencije: 87,5-108,0</string>
+ <string name="toast_invalid_input">Posljednji neispravni unos, ispravna vrijednost je od 0 do 5.</string>
+ <string name="optmenu_rds_settings">Postavke RDS-a</string>
+ <string name="dlg_rds_settings_channel_information">Podaci o kanalu</string>
+ <string name="dlg_rds_settings_alternative_frequency">Alternativna frekvencija</string>
+ <string name="sound_mode">Način zvuka</string>
+ <string name="more">"Više"</string>
+ <string name="power">"snaga"</string>
+ <string name="toast_in_call">Ne možete pokrenuti FM Radio kada ste u pozivu.</string>
+ <string name="empty_list">Popis kanala je prazan.</string>
+ <string name="edit_frequency_overwrite_text">Presnimi</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">Priključite slušalice radi korištenja kao radijske antene.</string>
+ <string name="fm_recorder_name">FM snimač</string>
+ <string name="toast_recording_lost_warning">Vaša snimka će biti izgubljena zbog uklanjanja SD kartice!</string>
+ <string name="toast_start_recording">Početak snimanja...</string>
+ <string name="toast_sdcard_missing">Nema vaše SD kartice!</string>
+ <string name="toast_sdcard_insufficient_space">Na SD kartici nema dovoljno mjesta!</string>
+ <string name="toast_recorder_internal_error">Na snimaču se pojavila unutarnja greška!</string>
+ <string name="toast_player_internal_error">U programu za reprodukciju se pojavila unutarnja greška!</string>
+ <string name="toast_powerup_before_record_warning">Prvo pokrenite FM!</string>
+ <string name="optmenu_record">Snimaj FM</string>
+ <string name="btn_save_recording">"Spremi"</string>
+ <string name="btn_discard_recording">Odbaci</string>
+ <string name="edit_recording_name_hint">Ovdje unesite naziv datoteke</string>
+ <string name="dlg_save_recording_title">Spremi datoteku sa snimkom</string>
+ <string name="dlg_save_recording_storage_warning">Nedovoljno prostora za pohranu! Želite li spremiti trenutnu snimku?</string>
+ <string name="already_exists">već postoji</string>
+ <string name="optmenu_speaker">Zvučnik</string>
+ <string name="optmenu_earphone">Slušalica</string>
+ <string name="not_available">Trenutno nije dostupno</string>
+ <string name="add_to_favorite1">Dodaj u unaprijed zadane kanale</string>
+ <string name="contmenu_item_delete1">Ukloni iz unaprijed zadanih kanala</string>
+ <string name="dlg_delete_confirm_title1">Potvrdite uklanjanje iz unaprijed zadanih kanala</string>
+ <string name="dlg_delete_confirm_text1">Jeste li sigurni da želite ukloniti ovaj kanal iz unaprijed zadanih kanala?</string>
+ <string name="toast_favorite_full1">Ne može se dodati kanal na popis unaprijed zadanih kanala jer je on pun.</string>
+ <string name="toast_already_favorite1">Ovaj kanal već je na popisu unaprijed zadanih kanala.</string>
+ <string name="toast_channel_deleted1">Uspješno uklonjen iz unaprijed zadanih kanala.</string>
+ <string name="toast_channel_added1">Uspješno dodan u unaprijed zadane kanale.</string>
+</resources> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/values-hu/strings.xml b/MediaTek/FmRadio/res/values-hu/strings.xml
new file mode 100755
index 0000000..06f6794
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-hu/strings.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">FM-rádió</string>
+ <string name="favorite_manager">Csatornalista</string>
+ <string name="add_to_favorite">Hozzáadás a kedvencekhez</string>
+ <string name="optmenu_search">Keresés</string>
+ <string name="optmenu_exit">Kilépés</string>
+ <string name="contmenu_title">Műveletek</string>
+ <string name="contmenu_item_edit">Szerkesztés</string>
+ <string name="contmenu_item_delete">Eltávolítás a kedvencek közül</string>
+ <string name="dlg_noantenna_text">Fülhallgató szükséges, ami antennaként működik. Csatlakoztassa a fülhallgatót.</string>
+ <string name="dlg_noantenna_title">Csatlakoztassa a fülhallgatót</string>
+ <string name="btn_yes">Igen</string>
+ <string name="btn_no">Nem</string>
+ <string name="btn_ok">OK</string>
+ <string name="btn_cancel">Mégse</string>
+ <string name="dlg_progress_title">Keresés</string>
+ <string name="dlg_progress_text">Csatornák keresése…</string>
+ <string name="dlg_addedit_station_name">Név:</string>
+ <string name="dlg_addedit_station_freq">Gyakoriság:</string>
+ <string name="dlg_addedit_title_edit">Csatorna szerkesztése</string>
+ <string name="default_station_name">Új csatorna</string>
+ <string name="dlg_delete_confirm_title">Kedvencek közüli eltávolítás megerősítése</string>
+ <string name="dlg_delete_confirm_text">Biztosan el akarja távolítani ezt a csatornát a kedvencek közül?</string>
+ <string name="toast_favorite_full">A csatorna nem adható a Kedvencekhez, mert megtelt a lista.</string>
+ <string name="toast_already_favorite">Ez a csatorna már a Kedvencek között van.</string>
+ <string name="toast_channel_deleted">Sikeresen eltávolítva a kedvencek közül.</string>
+ <string name="toast_channel_added">Sikeresen hozzáadva a kedvencekhez.</string>
+ <string name="toast_channel_searched">Talált csatornák az elérhetők közül:</string>
+ <string name="toast_cannot_search">Nem találhatók az elérhető csatornák közül.</string>
+ <string name="toast_invalid_frequency">Érvénytelen frekvencia az aktuális helyen. Érvényes frekvenciatartomány: 87,5-108,0.</string>
+ <string name="optmenu_rds_settings">RDS-beállítások</string>
+ <string name="dlg_rds_settings_channel_information">Csatornainformáció</string>
+ <string name="dlg_rds_settings_alternative_frequency">Alternatív frekvencia</string>
+ <string name="sound_mode">Hangzásmód</string>
+ <string name="more">További alkalmazások</string>
+ <string name="power">hatvány</string>
+ <string name="edit_frequency_overwrite_text">"Felülírás"</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">Dugja be a fülhallgatót, hogy rádióantennaként használhassa.</string>
+ <!-- For FM recording -->
+ <string name="fm_recorder_name">FM-rögzítő</string>
+ <string name="toast_recording_lost_warning">A felvétel el fog veszni az SD-kártya eltávolítása miatt!</string>
+ <string name="toast_start_recording">Rögzítés indítása…</string>
+ <string name="toast_sdcard_missing">Az SD-kártya hiányzik!</string>
+ <string name="toast_sdcard_insufficient_space">Nincs elegendő hely az SD-kártyán!</string>
+ <string name="toast_recorder_internal_error">Belső hiba történt a rögzítőn!</string>
+ <string name="toast_player_internal_error">Belső hiba történt a lejátszón!</string>
+ <string name="toast_powerup_before_record_warning">Előbb kapcsolja be az FM-rádiót!</string>
+ <string name="optmenu_record">FM-műsor rögzítése</string>
+ <string name="btn_save_recording">Mentés</string>
+ <string name="btn_discard_recording">Elvetés</string>
+ <string name="edit_recording_name_hint">Ide gépelje a fájlnevet</string>
+ <string name="dlg_save_recording_title">Rögzített fájl mentése</string>
+ <string name="dlg_save_recording_storage_warning">Nincs elegendő tárhely! Menteni akarja az aktuális felvételt?</string>
+ <string name="already_exists">már létezik</string>
+ <string name="toast_invalid_input">Érvénytelen bevitel. Érvényes: 0 v. 5.</string>
+ <string name="toast_in_call">Az FM-rádió hívás közben nem indítható el.</string>
+ <string name="empty_list">A csatornalista üres.</string>
+ <string name="optmenu_speaker">"Hangszóró"</string>
+ <string name="optmenu_earphone">Fejhallgató</string>
+ <string name="not_available">Jelenleg nem érhető el</string>
+ <string name="add_to_favorite1">Hozzáadás a beállított csatornákhoz</string>
+ <string name="contmenu_item_delete1">Törlés a beállított csatornák közül</string>
+ <string name="dlg_delete_confirm_title1">Beállított csatornák közüli eltávolítás megerősítése</string>
+ <string name="dlg_delete_confirm_text1">Biztosan el akarja távolítani ezt a csatornát a beállított csatornák közül?</string>
+ <string name="toast_favorite_full1">A csatorna nem adható a beállított csatornákhoz, mert megtelt a lista.</string>
+ <string name="toast_already_favorite1">Ez a csatorna már a beállított csatornák között van.</string>
+ <string name="toast_channel_deleted1">Sikeresen eltávolítva a beállított csatornák közül.</string>
+ <string name="toast_channel_added1">Sikeresen hozzáadva a beállított csatornákhoz.</string>
+</resources>
diff --git a/MediaTek/FmRadio/res/values-hy-rAM/strings.xml b/MediaTek/FmRadio/res/values-hy-rAM/strings.xml
new file mode 100755
index 0000000..6445587
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-hy-rAM/strings.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name">FM ռադիո</string>
+ <string name="dlg_progress_title">Որոնել</string>
+ <string name="btn_yes">Այո</string>
+ <string name="optmenu_speaker">Բարձրախոս</string>
+ <string name="edit_frequency_overwrite_text">Վրագրել</string>
+ <string name="toast_start_recording">Սկսել ձայնագրում...</string>
+ <string name="fm_unit">ՄՀց</string>
+ <string name="empty_list">Կապուղիների ցանկը դատարկ է:</string>
+ <string name="optmenu_rds_settings">RDS կարգավորումներ</string>
+ <string name="toast_channel_searched">Որոնված մատչելի կապուղիներ`</string>
+ <string name="already_exists">արդեն գոյություն ունի</string>
+ <string name="dlg_noantenna_title">Միացնել ականջակալ</string>
+ <string name="add_to_favorite">Ավելացնել Ընտրյալներին</string>
+ <string name="toast_sdcard_insufficient_space">SD քարտում չկա բավարար տարածք:</string>
+ <string name="dlg_delete_confirm_title">Հաստատել ընտրյալներից հեռացումը</string>
+ <string name="optmenu_record">Ձայնագրել FM</string>
+ <string name="optmenu_earphone">Ականջակալ</string>
+ <string name="sound_mode">Ձայնի ռեժիմ</string>
+ <string name="toast_already_favorite">Այս կապուղին արդեն ընտրյալների ցանկում է:</string>
+ <string name="not_available">Այժմ մատչելի չէ</string>
+ <string name="toast_channel_deleted">Հաջողությամբ հեռացվեց ընտրյալներից:</string>
+ <string name="toast_channel_added">Հաջողությամբ ավելացվեց ընտրյալներին:</string>
+ <string name="dlg_rds_settings_channel_information">Կապուղու տեղեկություններ</string>
+ <string name="toast_favorite_full">Հնարավոր չէ ավելացնել կապուղին ընտրյալների ցանկին, քանի որ այն լիքն է:</string>
+ <string name="btn_save_recording">Պահել</string>
+ <string name="optmenu_search">Որոնել</string>
+ <string name="dlg_rds_settings_alternative_frequency">Այլընտրական հաճախականություն</string>
+ <string name="dlg_progress_text">Որոնել կապուղիներ...</string>
+ <string name="optmenu_exit">Ելնել</string>
+ <string name="more">Ավելին</string>
+ <string name="btn_discard_recording">Ջնջել</string>
+ <string name="contmenu_item_edit">Խմբագրել</string>
+ <string name="toast_cannot_search">Հնարավոր չէ որոնել մատչելի կապուղի:</string>
+ <string name="dlg_save_recording_storage_warning">Ոչ բավարար պահոց: Ցանկանու՞մ եք պահել այս ձայնագրությունը:</string>
+ <string name="toast_in_call">Չեք կարող գործարկել FM ռադիոն, քանի դեռ զանգն ընթացքի մեջ է:</string>
+ <string name="dlg_addedit_station_freq">Հաճախականություն`</string>
+ <string name="toast_recorder_internal_error">Տեղի ունեցավ ձայնագրիչի ներքին սխալ:</string>
+ <string name="dlg_save_recording_title">Պահել ձայնագրության ֆայլը</string>
+ <string name="btn_ok">Լավ</string>
+ <string name="power">Հոսանք</string>
+ <string name="contmenu_item_delete">Հանել ընտրյալներից</string>
+ <string name="toast_powerup_before_record_warning">Նախ միացրեք FM-ը:</string>
+ <string name="fm_recorder_name">FM ձայնագրիչ</string>
+ <string name="toast_recording_lost_warning">Ձեր ձայնագրությունը կկորչի SD-ն հանելու պատճառով:</string>
+ <string name="dlg_delete_confirm_text">Համոզվա՞ծ եք, որ ցանկանում եք հեռացնել այս կապուղին ընտրյալներից:</string>
+ <string name="default_station_name">Նոր կապուղի</string>
+ <string name="btn_cancel">Չեղարկել</string>
+ <string name="contmenu_title">Գործողություններ</string>
+ <string name="btn_no">Ոչ</string>
+ <string name="favorite_manager">Կապուղիների ցանկ</string>
+ <string name="toast_invalid_frequency">Ներկա տեղադրության համար անհասանելի հաճախականություն: Հասանելի հաճախականության տիրույթ` 87.5-108.0</string>
+ <string name="toast_sdcard_missing">Ձեր SD քարտն առկա չէ:</string>
+ <string name="dlg_addedit_station_name">Անվանում`</string>
+ <string name="dlg_addedit_title_edit">Խմբագրել կապուղին</string>
+ <string name="toast_invalid_input">Վերջին անվավեր ներմուծումը, վավեր արժեք` 0-ից 5:</string>
+ <string name="edit_recording_name_hint">Մուտքագրել ֆայլի անվանումն այստեղ</string>
+ <string name="dlg_noantenna_text">Անհրաժեշտ է ականջակալ` որպես ալեհավաք: Միացրեք ականջակալը:</string>
+ <string name="toast_player_internal_error">Տեղի ունեցավ նվագարկիչի ներքին սխալ:</string>
+ <string name="no_antenna_info">Միացրեք ականջակալները` որպես ռադիոյի ալեհավաք օգտագործելու համար:</string>
+ <string name="add_to_favorite1">Հավելել նախակայված ալիքներին</string>
+ <string name="contmenu_item_delete1">Հեռացնել նախակայված ալիքներից</string>
+ <string name="dlg_delete_confirm_title1">Հաստատել նախակայվածներից հեռացումը</string>
+ <string name="dlg_delete_confirm_text1">Դուք վստա՞հ եք, որ ցանկանում եք հեռացնել այս ալիքը նախակայված ալիքներից:</string>
+ <string name="toast_favorite_full1">Հնարավոր չէ հավելել ալիքը նախակայված ալիքների ցուցակին, քանի որ այն լցված է:</string>
+ <string name="toast_already_favorite1">Այս ալիքն արդեն գտնվում է նախակայված ալիքների ցուցակում:</string>
+ <string name="toast_channel_deleted1">Հաջող հեռացվեց նախակայված ալիքների ցուցակից:</string>
+ <string name="toast_channel_added1">Հաջող հավելվեց նախակայված ալիքների ցուցակին:</string>
+</resources> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/values-in/strings.xml b/MediaTek/FmRadio/res/values-in/strings.xml
new file mode 100755
index 0000000..cb5d281
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-in/strings.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">Radio FM</string>
+ <string name="favorite_manager">Daftar saluran</string>
+ <string name="add_to_favorite">Tambahkan ke Favorit</string>
+ <string name="optmenu_search">Cari</string>
+ <string name="optmenu_exit">Keluar</string>
+ <string name="contmenu_title">Operasi</string>
+ <string name="contmenu_item_edit">Edit</string>
+ <string name="contmenu_item_delete">Hapus dari favorit</string>
+ <string name="dlg_noantenna_text">Anda memerlukan earphone sebagai antena. Pasang earphone.</string>
+ <string name="dlg_noantenna_title">Pasang earphone?</string>
+ <string name="btn_yes">Ya</string>
+ <string name="btn_no">Tidak</string>
+ <string name="btn_ok">OK</string>
+ <string name="btn_cancel">Batal</string>
+ <string name="dlg_progress_title">Pindai</string>
+ <string name="dlg_progress_text">Pindai saluran…</string>
+ <string name="dlg_addedit_station_name">Nama:</string>
+ <string name="dlg_addedit_station_freq">Frekuensi:</string>
+ <string name="dlg_addedit_title_edit">Edit Saluran</string>
+ <string name="default_station_name">Saluran Baru</string>
+ <string name="dlg_delete_confirm_title">Konfirmasikan Penghapusan Saluran</string>
+ <string name="dlg_delete_confirm_text">Anda yakin ingin menghapus saluran ini?</string>
+ <string name="toast_favorite_full">Tidak dapat menambahkan saluran ke daftar favorit karena penuh.</string>
+ <string name="toast_already_favorite">Saluran ini sudah ada di daftar favorit.</string>
+ <string name="toast_channel_deleted">Berhasil dihapus dari favorit.</string>
+ <string name="toast_channel_added">Berhasil ditambahkan ke favorit.</string>
+ <string name="toast_channel_searched">Saluran tersedia yang dicari:</string>
+ <string name="toast_cannot_search">Tidak dapat mencari saluran yang tersedia.</string>
+ <string name="optmenu_rds_settings">Pengaturan RDS</string>
+ <string name="dlg_rds_settings_channel_information">Informasi saluran</string>
+ <string name="dlg_rds_settings_alternative_frequency">Frekuensi alternatif</string>
+ <string name="more">Aplikasi Lain</string>
+ <string name="power">Power</string>
+ <string name="sound_mode">Mode Suara</string>
+ <string name="edit_frequency_overwrite_text">"Timpa"</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">Pasang earphone untuk digunakan sebagai antena radio.</string>
+ <!-- For FM recording -->
+ <string name="fm_recorder_name">Perekam FM</string>
+ <string name="toast_recording_lost_warning">Perekaman Anda akan hilang karena penghapusan SD!</string>
+ <string name="toast_start_recording">Mulai merekam…</string>
+ <string name="toast_sdcard_missing">Kartu SD Anda tidak ada!</string>
+ <string name="toast_sdcard_insufficient_space">Kapasitas kartu SD tidak memadai!</string>
+ <string name="toast_recorder_internal_error">Terjadi kesalahan internal pada perekam!</string>
+ <string name="toast_player_internal_error">Terjadi kesalahan internal pada pemutar!</string>
+ <string name="toast_powerup_before_record_warning">Aktifkan FM terlebih dulu!</string>
+ <string name="optmenu_record">Rekam FM</string>
+ <string name="btn_save_recording">Simpan</string>
+ <string name="btn_discard_recording">Hapus</string>
+ <string name="edit_recording_name_hint">Ketik nama file di sini</string>
+ <string name="dlg_save_recording_title">Simpan file perekaman</string>
+ <string name="dlg_save_recording_storage_warning">Kapasitas penyimpanan tidak memadai! Anda ingin menyimpan perekaman saat ini?</string>
+ <string name="already_exists">Sudah ada</string>
+ <string name="toast_invalid_frequency">Frekuensi tidak valid untuk lokasi saat ini. Rentang frekuensi yang valid: 87,5-10,0.</string>
+ <string name="toast_invalid_input">Input terakhir tidak valid, nilai valid adalah 0 atau 5.</string>
+ <string name="toast_in_call">Anda tidak dapat mengaktifkan Radio FM saat menangani panggilan.</string>
+ <string name="empty_list">Daftar saluran kosong.</string>
+ <string name="optmenu_speaker">"Speaker"</string>
+ <string name="optmenu_earphone">Headset</string>
+ <string name="not_available">Tidak tersedia saat ini</string>
+ <string name="add_to_favorite1">Tambahkan ke daftar saluran standar</string>
+ <string name="contmenu_item_delete1">Hapus dari daftar saluran standar</string>
+ <string name="dlg_delete_confirm_title1">Konfirmasikan penghapusan dari daftar saluran standar</string>
+ <string name="dlg_delete_confirm_text1">Anda yakin ingin menghapus saluran ini dari daftar saluran standar?</string>
+ <string name="toast_favorite_full1">Tidak dapat menambahkan saluran ke daftar saluran standar karena sudah penuh.</string>
+ <string name="toast_already_favorite1">Saluran ini sudah ada dalam daftar saluran standar.</string>
+ <string name="toast_channel_deleted1">Berhasil dihapus dari saluran standar.</string>
+ <string name="toast_channel_added1">Berhasil ditambahkan ke saluran standar.</string>
+</resources>
diff --git a/MediaTek/FmRadio/res/values-it/strings.xml b/MediaTek/FmRadio/res/values-it/strings.xml
new file mode 100755
index 0000000..abf9952
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-it/strings.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">"Radio FM"</string>
+ <string name="favorite_manager">Elenco canali</string>
+ <string name="add_to_favorite">Aggiungi a preferiti</string>
+ <string name="optmenu_search">Ricerca</string>
+ <string name="optmenu_exit">Exit</string>
+ <string name="contmenu_title">Operazioni</string>
+ <string name="contmenu_item_edit">Modifica</string>
+ <string name="contmenu_item_delete">Rimuovi dai preferiti</string>
+ <string name="dlg_noantenna_text">È necessario usare le cuffie come antenna. Collegare le cuffie.</string>
+ <string name="dlg_noantenna_title">Collegare le cuffie</string>
+ <string name="btn_yes">Sì</string>
+ <string name="btn_no">No</string>
+ <string name="btn_ok">OK</string>
+ <string name="btn_cancel">Annulla</string>
+ <string name="dlg_progress_title">Scansione</string>
+ <string name="dlg_progress_text">Cerca canali...</string>
+ <string name="dlg_addedit_station_name">Nome:</string>
+ <string name="dlg_addedit_station_freq">Frequenza:</string>
+ <string name="dlg_addedit_title_edit">Modifica canale</string>
+ <string name="default_station_name">Nuovo canale</string>
+ <string name="dlg_delete_confirm_title">Conferma Elimina canale</string>
+ <string name="dlg_delete_confirm_text">Si è certi di volere eliminare questo canale?</string>
+ <string name="toast_favorite_full">Impossibile aggiungere il canale all’elenco dei preferiti perché è pieno.</string>
+ <string name="toast_already_favorite">Questo canale è già nell’elenco dei preferiti.</string>
+ <string name="toast_channel_deleted">Rimozione dai preferiti riuscita.</string>
+ <string name="toast_channel_added">Aggiunta ai preferiti riuscita.</string>
+ <string name="toast_channel_searched">Canali disponibili ricercati:</string>
+ <string name="toast_cannot_search">Impossibile ricercare i canali disponibili</string>
+ <string name="optmenu_rds_settings">Impostazioni RDS</string>
+ <string name="dlg_rds_settings_channel_information">Informazioni canale</string>
+ <string name="dlg_rds_settings_alternative_frequency">Frequenza alternativa</string>
+ <string name="more">Altra applicazione</string>
+ <string name="power">potenza</string>
+ <string name="sound_mode">Modalità audio</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">Collegare le cuffie da utilizzare come antenna radio. </string>
+ <!-- For FM recording -->
+ <string name="edit_frequency_overwrite_text">"Sostituisci"</string>
+ <string name="fm_recorder_name">Registratore FM</string>
+ <string name="toast_recording_lost_warning">La registrazione andrà persa per la rimozione della scheda SD!</string>
+ <string name="toast_start_recording">Avvio registrazione…</string>
+ <string name="toast_sdcard_missing">Scheda SD mancante!</string>
+ <string name="toast_sdcard_insufficient_space">Spazio su scheda SD insufficiente!</string>
+ <string name="toast_recorder_internal_error">Errore interno nel registratore!</string>
+ <string name="toast_player_internal_error">Errore interno nel lettore!</string>
+ <string name="toast_powerup_before_record_warning">Prima accendere FM!</string>
+ <string name="optmenu_record">Registra FM</string>
+ <string name="btn_save_recording">Salva</string>
+ <string name="btn_discard_recording">Ignora</string>
+ <string name="edit_recording_name_hint">Digita qui nome file</string>
+ <string name="dlg_save_recording_title">Salva registrazione file</string>
+ <string name="dlg_save_recording_storage_warning">Memoria insufficiente! Salvare registrazione attuale?</string>
+ <string name="already_exists">Già presente</string>
+ <string name="toast_invalid_frequency">Frequenza non valida per posizione attuale. Gamma frequenza valida: 87,5-108,0.</string>
+ <string name="toast_invalid_input">Ultimo input non valido. Valore valido 0 o 5.</string>
+ <string name="toast_in_call">Non è possibile avviare la radio FM durante una chiamata.</string>
+ <string name="empty_list">L’elenco dei canali è vuoto.</string>
+ <string name="optmenu_speaker">"Altoparlante"</string>
+ <string name="optmenu_earphone">Cuffie</string>
+ <string name="not_available">Al momento non disponibile</string>
+ <string name="add_to_favorite1">Aggiungi a canali preselezionati</string>
+ <string name="contmenu_item_delete1">Rimuovi da canali preselezionati</string>
+ <string name="dlg_delete_confirm_title1">Conferma rimozione da canali preselezionati</string>
+ <string name="dlg_delete_confirm_text1">Rimuovere questo canale dai canali preselezionati?</string>
+ <string name="toast_favorite_full1">"Impossibile aggiungere il canale all'elenco dei canali preselezionati in quanto è pieno."</string>
+ <string name="toast_already_favorite1">"Canale già presente nell'elenco dei canali preselezionati."</string>
+ <string name="toast_channel_deleted1">Rimozione da canali preselezionati riuscita.</string>
+ <string name="toast_channel_added1">Aggiunta a canali preselezionati riuscita.</string>
+</resources>
diff --git a/MediaTek/FmRadio/res/values-iw/strings.xml b/MediaTek/FmRadio/res/values-iw/strings.xml
new file mode 100755
index 0000000..5780a51
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-iw/strings.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">רדיו FM</string>
+ <string name="favorite_manager">רשימת תחנות</string>
+ <string name="add_to_favorite">הוסף למועדפים</string>
+ <string name="optmenu_search">חיפוש</string>
+ <string name="optmenu_exit">יציאה</string>
+ <string name="contmenu_title">פעולות</string>
+ <string name="contmenu_item_edit">עריכה</string>
+ <string name="contmenu_item_delete">הסר מהמועדפים</string>
+ <string name="dlg_noantenna_text">אתה זקוק לאוזניות בתור אנטנה. חבר את האוזניות.</string>
+ <string name="dlg_noantenna_title">חבר את האזניות</string>
+ <string name="btn_yes">כן</string>
+ <string name="btn_no">לא</string>
+ <string name="btn_ok">אישור</string>
+ <string name="btn_cancel">ביטול</string>
+ <string name="dlg_progress_title">חיפוש</string>
+ <string name="dlg_progress_text">חיפוש תחנות...</string>
+ <string name="dlg_addedit_station_name">שם:</string>
+ <string name="dlg_addedit_station_freq">תדר:</string>
+ <string name="dlg_addedit_title_edit">ערוך תחנה</string>
+ <string name="default_station_name">תחנה חדשה</string>
+ <string name="dlg_delete_confirm_title">אשר הסרה מהמועדפים</string>
+ <string name="dlg_delete_confirm_text">האם אתה בטוח שברצונך להסיר תחנה זו מהמועדפים?</string>
+ <string name="toast_favorite_full">לא ניתן להוסיף את התחנה לרשימת המועדפים מכיוון שהיא מלאה.</string>
+ <string name="toast_already_favorite">התחנה נמצאת כבר ברשימת המועדפים.</string>
+ <string name="toast_channel_deleted">הוסרה בהצלחה מהמועדפים.</string>
+ <string name="toast_channel_added">הוספה בהצלחה למועדפים.</string>
+ <string name="toast_channel_searched">חיפש תחנות זמינות:</string>
+ <string name="toast_cannot_search">לא ניתן לחפש תחנה זמינה.</string>
+ <string name="toast_invalid_frequency">תדר לא חוקי למיקום הנוכחי. טווח התדרים החוקי: 87.5 - 108.0</string>
+ <string name="toast_invalid_input">הזנה לא חוקית, ערך חוקי הוא 0 או 5.</string>
+ <string name="optmenu_rds_settings">הגדרות RDS</string>
+ <string name="dlg_rds_settings_channel_information">פרטי תחנה</string>
+ <string name="dlg_rds_settings_alternative_frequency">תדר חלופי</string>
+ <string name="sound_mode">מצב צליל</string>
+ <string name="more">עוד</string>
+ <string name="power">בחזקת</string>
+ <string name="edit_frequency_overwrite_text">"החלף"</string>
+ <string name="fm_unit">מגה הרץ</string>
+ <string name="no_antenna_info">הרכב את האוזניות לשימוש כאנטנת רדיו.</string>
+ <string name="fm_recorder_name">מקליט FM</string>
+ <string name="toast_recording_lost_warning">ההקלטה תאבד בשל הסרת כרטיס ה-SD!</string>
+ <string name="toast_start_recording">התחל בהקלטה...</string>
+ <string name="toast_sdcard_missing">כרטיס ה-SD חסר!</string>
+ <string name="toast_sdcard_insufficient_space">אין מספיק מקום בכרטיס ה-SD!</string>
+ <string name="toast_recorder_internal_error">אירעה שגיאה פנימית במקליט!</string>
+ <string name="toast_player_internal_error">אירעה שגיאה פנימית בנגן!</string>
+ <string name="toast_powerup_before_record_warning">הפעל תחילה את ה-FM!</string>
+ <string name="optmenu_record">הקלט FM</string>
+ <string name="btn_save_recording">שמור</string>
+ <string name="btn_discard_recording">מחק</string>
+ <string name="edit_recording_name_hint">הקלד שם קובץ כאן</string>
+ <string name="dlg_save_recording_title">שמור קובץ הקלטה</string>
+ <string name="dlg_save_recording_storage_warning">שטח אחסון לא מספיק! האם ברצונך לשמור את ההקלטה הנוכחית?</string>
+ <string name="already_exists">כבר קיים</string>
+ <string name="toast_in_call">לא ניתן להפעיל רדיו FM בעת שיחה.</string>
+ <string name="empty_list">רשימת התחנות ריקה.</string>
+ <string name="optmenu_speaker">"רמקול"</string>
+ <string name="optmenu_earphone">אזניות</string>
+ <string name="not_available">לא זמין כעת</string>
+ <string name="add_to_favorite1">הוסף לתחנות שמורות</string>
+ <string name="contmenu_item_delete1">הסר מהתחנות השמורות</string>
+ <string name="dlg_delete_confirm_title1">אשר הסרה מהתחנות השמורות</string>
+ <string name="dlg_delete_confirm_text1">האם אתה בטוח שברצונך להסיר תחנה זו מהתחנות השמורות?</string>
+ <string name="toast_favorite_full1">לא ניתן להוסיף את התחנה לרשימת התחנות השמורות מכיוון שהיא מלאה.</string>
+ <string name="toast_already_favorite1">התחנה נמצאת כבר ברשימת התחנות השמורות.</string>
+ <string name="toast_channel_deleted1">הוסרה בהצלחה מהתחנות השמורות.</string>
+ <string name="toast_channel_added1">הוספה בהצלחה לתחנות השמורות.</string>
+</resources>
diff --git a/MediaTek/FmRadio/res/values-ja/strings.xml b/MediaTek/FmRadio/res/values-ja/strings.xml
new file mode 100755
index 0000000..bca98aa
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-ja/strings.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name">FMラジオ</string>
+ <string name="dlg_progress_title">検索</string>
+ <string name="btn_yes">はい</string>
+ <string name="optmenu_speaker">スピーカー</string>
+ <string name="edit_frequency_overwrite_text">上書き</string>
+ <string name="toast_start_recording">録音開始...</string>
+ <string name="fm_unit">MHz</string>
+ <string name="empty_list">チャンネルリストは空です。</string>
+ <string name="optmenu_rds_settings">RDS設定</string>
+ <string name="toast_channel_searched">利用可能なチャンネルを検索:</string>
+ <string name="already_exists">すでに存在しています</string>
+ <string name="dlg_noantenna_title">イヤホンの差し込み</string>
+ <string name="add_to_favorite">お気に入りに追加</string>
+ <string name="toast_sdcard_insufficient_space">SDカード容量が不足しています!</string>
+ <string name="dlg_delete_confirm_title">お気に入りからの削除を確認</string>
+ <string name="optmenu_record">FMを録音</string>
+ <string name="optmenu_earphone">イヤホン</string>
+ <string name="sound_mode">サウンドモード</string>
+ <string name="toast_already_favorite">このチャンネルはすでにお気に入りリストの中にあります。</string>
+ <string name="not_available">現在使用できません</string>
+ <string name="toast_channel_deleted">お気に入りから削除されました。</string>
+ <string name="toast_channel_added">お気に入りに追加されました。</string>
+ <string name="dlg_rds_settings_channel_information">チャンネル情報</string>
+ <string name="toast_favorite_full">満杯のため、お気に入りリストにチャンネルを追加できません。</string>
+ <string name="btn_save_recording">保存</string>
+ <string name="optmenu_search">検索</string>
+ <string name="dlg_rds_settings_alternative_frequency">代替周波数</string>
+ <string name="dlg_progress_text">チャンネルの検索...</string>
+ <string name="optmenu_exit">終了</string>
+ <string name="more">詳細</string>
+ <string name="btn_discard_recording">捨てる</string>
+ <string name="contmenu_item_edit">編集</string>
+ <string name="toast_cannot_search">利用可能なチャンネルを検索できません。</string>
+ <string name="dlg_save_recording_storage_warning">容量が不足しています!現在の録音を保存しますか?</string>
+ <string name="toast_in_call">通話中にFMラジオは起動できません。</string>
+ <string name="dlg_addedit_station_freq">周波数:</string>
+ <string name="toast_recorder_internal_error">レコーダーで内部エラーが発生しました!</string>
+ <string name="dlg_save_recording_title">録音ファイルを保存</string>
+ <string name="btn_ok">OK</string>
+ <string name="power">電源</string>
+ <string name="contmenu_item_delete">お気に入りから削除</string>
+ <string name="toast_powerup_before_record_warning">最初にFMの電源を入れてください!</string>
+ <string name="fm_recorder_name">FMレコーダー</string>
+ <string name="toast_recording_lost_warning">SDが取り出されたため、録音は失われます!</string>
+ <string name="dlg_delete_confirm_text">お気に入りからこのチャンネルを削除してもよろしいですか?</string>
+ <string name="default_station_name">新しいチャンネル</string>
+ <string name="btn_cancel">キャンセル</string>
+ <string name="contmenu_title">操作</string>
+ <string name="btn_no">いいえ</string>
+ <string name="favorite_manager">チャンネルリスト</string>
+ <string name="toast_invalid_frequency">現在の場所では無効な周波数です。有効な周波数範囲:87.5-108.0</string>
+ <string name="toast_sdcard_missing">SDカードがありません!</string>
+ <string name="dlg_addedit_station_name">名前:</string>
+ <string name="dlg_addedit_title_edit">チャンネルの編集</string>
+ <string name="toast_invalid_input">最後の入力は無効です。有効な値は0または5です。</string>
+ <string name="edit_recording_name_hint">ここにファイル名を入力します</string>
+ <string name="dlg_noantenna_text">アンテナとしてイヤホンが必要です。イヤホンを差し込んでください。</string>
+ <string name="toast_player_internal_error">プレイヤーで内部エラーが発生しました!</string>
+ <string name="no_antenna_info">イヤホンを差し込み、ラジオのアンテナとして使用します。</string>
+ <string name="add_to_favorite1">プリセットチャンネルに追加する</string>
+ <string name="contmenu_item_delete1">プリセットチャンネルから外す</string>
+ <string name="dlg_delete_confirm_title1">プリセットチャンネルからの削除を確定する</string>
+ <string name="dlg_delete_confirm_text1">このチャンネルをプリセットから削除しますか?</string>
+ <string name="toast_favorite_full1">プリセットが一杯なので、チャンネルを追加できません。</string>
+ <string name="toast_already_favorite1">このチャンネルは既にプリセットに登録されています。</string>
+ <string name="toast_channel_deleted1">プリセットチャンネルから削除しました。</string>
+ <string name="toast_channel_added1">プリセットチャンネルに登録しました。</string>
+</resources> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/values-ka-rGE/strings.xml b/MediaTek/FmRadio/res/values-ka-rGE/strings.xml
new file mode 100755
index 0000000..6b9e9f4
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-ka-rGE/strings.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name">FM რადიო</string>
+ <string name="dlg_progress_title">ძებნა</string>
+ <string name="btn_yes">კი</string>
+ <string name="optmenu_speaker">დინამიკი</string>
+ <string name="edit_frequency_overwrite_text">გადაწერა</string>
+ <string name="toast_start_recording">ჩაწერის დაწყება...</string>
+ <string name="fm_unit">მჰც</string>
+ <string name="empty_list">არხების სია ცარიელია.</string>
+ <string name="optmenu_rds_settings">RDS პარამეტრები</string>
+ <string name="toast_channel_searched">ხელმისაწვდომი არხების ძებნა დასრულებულია:</string>
+ <string name="already_exists">უკვე არსებობს</string>
+ <string name="dlg_noantenna_title">ჩართეთ ყურსასმენები</string>
+ <string name="add_to_favorite">ფავორიტებში დამატება</string>
+ <string name="toast_sdcard_insufficient_space">არასაკმარისი SD ბარათის მოცულობა!</string>
+ <string name="dlg_delete_confirm_title">დაადასტურეთ წაშლა ფავორიტებიდან</string>
+ <string name="optmenu_record">Record FM</string>
+ <string name="optmenu_earphone">ყურსასმენები</string>
+ <string name="sound_mode">ხმის რეჟიმი</string>
+ <string name="toast_already_favorite">ეს არხი უკვე ფავორიტების სიაში.</string>
+ <string name="not_available">ამჟამად არ არის ხელმისაწვდომი</string>
+ <string name="toast_channel_deleted">წარმატებით წაშლილია ფავორიტებიდან.</string>
+ <string name="toast_channel_added">წარმატებით დამატებულია ფავორიტებში.</string>
+ <string name="dlg_rds_settings_channel_information">ინფორმაცია არხზე</string>
+ <string name="toast_favorite_full">ახრის დამატება ფავორიტების სიაში ვერ მოხერხდა, რადგან ის სავსეა.</string>
+ <string name="btn_save_recording">დამახსოვრება</string>
+ <string name="optmenu_search">ძებნა</string>
+ <string name="dlg_rds_settings_alternative_frequency">ალტერნატიული სიხშირე</string>
+ <string name="dlg_progress_text">არხების ძებნა...</string>
+ <string name="optmenu_exit">გამოსვლა</string>
+ <string name="more">კიდევ</string>
+ <string name="btn_discard_recording">გაუქმება</string>
+ <string name="contmenu_item_edit">რედაქტირება</string>
+ <string name="toast_cannot_search">ხელმისაწვდომი არხი ვერ მოიძებნა.</string>
+ <string name="dlg_save_recording_storage_warning">შენახვის ადგილი არასაკმარისია! გსურთ შეინახოთ მიმდინარე ჩანაწერი?</string>
+ <string name="toast_in_call">თქვენ ვერ ჩართავთ FM რადიოს ზარის განხორციელების დროს.</string>
+ <string name="dlg_addedit_station_freq">სიხშირე:</string>
+ <string name="toast_recorder_internal_error">შიდა შეცდომა ჩამწერში!</string>
+ <string name="dlg_save_recording_title">ჩაწერილი ფაილის დამახსოვრება</string>
+ <string name="btn_ok">OK</string>
+ <string name="power">ჩართვა</string>
+ <string name="contmenu_item_delete">წაშლა ფავორიტებიდან</string>
+ <string name="toast_powerup_before_record_warning">გთხოვთ პირველ რიგში ჩართოთ FM!</string>
+ <string name="fm_recorder_name">FM ჩამწერი</string>
+ <string name="toast_recording_lost_warning">თქვენი ჩანაწერი დაიკარგება SD ამოღების შემთხვევაში!</string>
+ <string name="dlg_delete_confirm_text">დარწმუნებული ხართ, რომ გსურთ ამ არხის წაშლა ფავორიტებიდან?</string>
+ <string name="default_station_name">ახალი არხი</string>
+ <string name="btn_cancel">გაუქმება</string>
+ <string name="contmenu_title">ოპერაციები</string>
+ <string name="btn_no">არა</string>
+ <string name="favorite_manager">არხების სია</string>
+ <string name="toast_invalid_frequency">არასწორი სიხშირე მიმდინარე ადგილსთვის. ძალაშია სიხშირის ფარგლებში: 87.5-108.0</string>
+ <string name="toast_sdcard_missing">თქვენი SD ბარათი არ არის დაყენებული!</string>
+ <string name="dlg_addedit_station_name">დასახელება:</string>
+ <string name="dlg_addedit_title_edit">არხის რედაქტირება</string>
+ <string name="toast_invalid_input">ბოლო არასწორად შეყვანილი მნიშვნელობა, სწორი მნიშვნელობა არის 0 ან 5.</string>
+ <string name="edit_recording_name_hint">აქრიფეთ აქ ფაილის დასახელება</string>
+ <string name="dlg_noantenna_text">თქვენ გჭირდებათ ყურსასმენები ანტენის სახით. გთხოვთ ჩართოთ თქვენს ყურსასმენები.</string>
+ <string name="toast_player_internal_error">შიდა შეცდომა ფლეერში!</string>
+</resources> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/values-kk/strings.xml b/MediaTek/FmRadio/res/values-kk/strings.xml
new file mode 100755
index 0000000..1b189e5
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-kk/strings.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="app_name">FM радио</string>
+ <string name="favorite_manager">Арна тізімі</string>
+ <string name="add_to_favorite">Сүйіктілерге қосу</string>
+ <string name="add_to_favorite1">Алдын ала орнатылған арналарға қосу</string>
+ <string name="optmenu_search">Іздеу</string>
+ <string name="optmenu_exit">Шығу</string>
+ <string name="contmenu_title">Әрекеттер</string>
+ <string name="contmenu_item_edit">Өңдеу</string>
+ <string name="contmenu_item_delete">Таңдаулылар қатарынан өшіру</string>
+ <string name="contmenu_item_delete1">Алдын ала орнатылған арналардан жою</string>
+ <string name="dlg_noantenna_text">Антенна ретінде құлаққап қажет. Құлаққабыңызды жалғаңыз.</string>
+ <string name="dlg_noantenna_title">Құлаққабыңызды жалғаңыз</string>
+ <string name="btn_yes">Иә</string>
+ <string name="btn_no">Жоқ</string>
+ <string name="btn_ok">OK</string>
+ <string name="btn_cancel">Болдырмау</string>
+ <string name="dlg_progress_title">Іздеу</string>
+ <string name="dlg_progress_text">Арналарды іздеу...</string>
+ <string name="dlg_addedit_station_name">Атауы:</string>
+ <string name="dlg_addedit_station_freq">Жиілігі:</string>
+ <string name="dlg_addedit_title_edit">Арнаны өңдеу</string>
+ <string name="default_station_name">Жаңа арна</string>
+ <string name="dlg_delete_confirm_title">Сүйіктілерден жоюды растау</string>
+ <string name="dlg_delete_confirm_title1">Алдын ала орнатылған арналар тізімінен жоюды растау</string>
+ <string name="dlg_delete_confirm_text">Бұл арнаны сүйіктілерден жою қажет пе?</string>
+ <string name="dlg_delete_confirm_text1">Бұл арнаны алдын ала орнатылған арналар тізімінен жою қажет пе?</string>
+ <string name="toast_favorite_full">Арнаны сүйіктілер тізіміне қосу мүмкін емес, тізім толып кетті.</string>
+ <string name="toast_favorite_full1">Арнаны алдын ала орнатылған арналар тізіміне қосу мүмкін емес, тізім толып кетті.</string>
+ <string name="toast_already_favorite">Бұл арна бұрыннан сүйіктілер тізімінде.</string>
+ <string name="toast_already_favorite1">Бұл арна бұрыннан алдын ала орнатылған арналар тізімінде.</string>
+ <string name="toast_channel_deleted">Сүйіктілер тізімінен сәтті жойылды.</string>
+ <string name="toast_channel_deleted1">Алдын ала орнатылған арналар тізімінен сәтті жойылды.</string>
+ <string name="toast_channel_added">Сүйіктілер тізіміне сәтті қосылды.</string>
+ <string name="toast_channel_added1">Алдын ала орнатылған арналар тізіміне сәтті қосылды.</string>
+ <string name="toast_channel_searched">Табылған қолжетімді арналар:</string>
+ <string name="toast_cannot_search">Қолжетімді арнаны табу мүмкін емес.</string>
+ <string name="toast_invalid_frequency">Ағымдағы орын үшін жарамсыз жиіліг. Жарамды жиілік ауқымы: 87,5-108,0</string>
+ <string name="toast_invalid_input">Соңғы жарамсыз енгізілім, жарамды мән 0 немесе 5.</string>
+ <string name="optmenu_rds_settings">RDS параметрлері</string>
+ <string name="dlg_rds_settings_channel_information">Арна ақпараты</string>
+ <string name="dlg_rds_settings_alternative_frequency">Балама жиілік</string>
+ <string name="sound_mode">Дыбыс режимі</string>
+ <string name="more">Қосымша параметрлер</string>
+ <string name="power">Қуат</string>
+ <string name="toast_in_call">Қоңырау кезінде FM радионы қосу мүмкін емес.</string>
+ <string name="empty_list">Арналар тізімі бос.</string>
+ <string name="edit_frequency_overwrite_text">Қайта жазу</string>
+ <string name="fm_unit">МГц</string>
+ <string name="no_antenna_info">Құлаққабыңызды жалғаңыз</string>
+ <string name="fm_recorder_name">FM жазу құрылғысы</string>
+ <string name="toast_recording_lost_warning">Жазба SD картасының шығарылуына байланысты жоғалады!</string>
+ <string name="toast_start_recording">Жазуды іске қосу...</string>
+ <string name="toast_sdcard_missing">SD картасы жоқ!</string>
+ <string name="toast_sdcard_insufficient_space">SD картасында бос орын жоқ!</string>
+ <string name="toast_recorder_internal_error">Жазу құралында ішкі қате орын алды!</string>
+ <string name="toast_player_internal_error">Ойнатқышта ішкі қате орын алды!</string>
+ <string name="toast_powerup_before_record_warning">Алдымен FM қабылдағышын қосыңыз!</string>
+ <string name="optmenu_record">FM жазу</string>
+ <string name="btn_save_recording">Сақтау</string>
+ <string name="btn_discard_recording">Жою</string>
+ <string name="edit_recording_name_hint">Файл атауын мұнда енгізіңіз</string>
+ <string name="dlg_save_recording_title">Жазылған файлды сақтау</string>
+ <string name="dlg_save_recording_storage_warning">Бос орын жеткіліксіз! Ағымдағы жазуды сақтау қажет пе?</string>
+ <string name="already_exists">бұрыннан бар</string>
+ <string name="optmenu_speaker">Динамик</string>
+ <string name="optmenu_earphone">Құлаққап</string>
+ <string name="not_available">Ағымдағы уақытта қолжетімсіз</string>
+</resources>
diff --git a/MediaTek/FmRadio/res/values-km-rKH/strings.xml b/MediaTek/FmRadio/res/values-km-rKH/strings.xml
new file mode 100755
index 0000000..af446c1
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-km-rKH/strings.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">វិទ្យុ FM</string>
+ <string name="favorite_manager">បញ្ជីប៉ុស្ត៍វិទ្យុ</string>
+ <string name="add_to_favorite">បន្ថែមទៅក្នុងបញ្ជីចំណូលចិត្ត</string>
+ <string name="optmenu_search">រាវរក</string>
+ <string name="optmenu_exit">ចាកចេញ</string>
+ <string name="contmenu_title">ប្រតិបត្តិការ</string>
+ <string name="contmenu_item_edit">កែសម្រួល</string>
+ <string name="contmenu_item_delete">លុបចេញពីបញ្ជីចំណូលចិត្ត</string>
+ <string name="dlg_noantenna_text">អ្នកត្រូវការកាសស្តាប់ត្រចៀក​ធ្វើជាអង់តែន ។ សូមស៊កបញ្ចូលកាសស្តាប់ត្រចៀករបស់អ្នក ។</string>
+ <string name="dlg_noantenna_title">ស៊កឧបករណ៍ស្តាប់ត្រចៀកចូល</string>
+ <string name="btn_yes">បាទ</string>
+ <string name="btn_no">ទេ</string>
+ <string name="btn_ok">យល់ព្រម</string>
+ <string name="btn_cancel">លើកលែង</string>
+ <string name="dlg_progress_title">រាវរក</string>
+ <string name="dlg_progress_text">រាវរកប៉ុស្តិ៍ ...</string>
+ <string name="dlg_addedit_station_name">ឈ្មោះ ៖</string>
+ <string name="dlg_addedit_station_freq">ហ្វេ្រកង់ ៖</string>
+ <string name="dlg_addedit_title_edit">កែសម្រួលប៉ុស្តិ៍</string>
+ <string name="default_station_name">ប៉ុស្តិ៍ថ្មី</string>
+ <string name="dlg_delete_confirm_title">បញ្ជាក់ការលុបចោលពីបញ្ជីចំណូលចិត្ត</string>
+ <string name="dlg_delete_confirm_text">តើប្រាកដទេថាអ្នកចង់លុបប៉ុស្តិ៍នេះចោលពីបញ្ជីចំណូលចិត្ត?</string>
+ <string name="toast_favorite_full">មិនអាចបន្ថែមប៉ុស្តិ៍ទៅក្នុងបញ្ជីចំណូលចិត្ត ដោយសាវាពេញហើយ ។</string>
+ <string name="toast_already_favorite">ប៉ុស្តិ៍នេះស្ថិតនៅក្នុងបញ្ជីចំណូលចិត្តរួចហើយ ។</string>
+ <string name="toast_channel_deleted">បានលុបចោលពីបញ្ជីចំណូលចិត្តដោយជោគជ័យ ។</string>
+ <string name="toast_channel_added">បានបន្ថែមទៅក្នុងបញ្ជីចំណូលចិត្តដោយជោគជ័យ ។</string>
+ <string name="toast_channel_searched">រាវរកប៉ុស្តិ៍ផ្សេងៗដែលមាន ៖</string>
+ <string name="toast_cannot_search">មិនអាចរាវរកប៉ុស្តិ៍ដែលមានបានឡើយ ។</string>
+ <string name="toast_invalid_frequency">ហ្វ្រេកង់គ្មានសុពលភាពសម្រាប់ទីតាំងបច្ចុប្បន្ន ។ វិសាលភាពនៃហ្វ្រេកង់ដែលមានសុពលភាព ៖ 87.5-108.0</string>
+ <string name="toast_invalid_input">បញ្ចូលតម្លៃដែលគ្មានសុពលភាព ។ តម្លៃដែលមានសុពលភាពគឺ 0 ឬ 5 ។</string>
+ <string name="optmenu_rds_settings">ការសិត RDS</string>
+ <string name="dlg_rds_settings_channel_information">ព័ត៌មានប៉ុស្តិ៍</string>
+ <string name="dlg_rds_settings_alternative_frequency">ហ្វ្រេកង់ផ្សេងទៀត</string>
+ <string name="sound_mode">ម៉ូដសម្លេង</string>
+ <string name="more">បន្ថែមទៀត</string>
+ <string name="power">ស្វ័យគុណ</string>
+ <string name="edit_frequency_overwrite_text">សរសេរពីលើ</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">ដោត​កាសស្ដាប់​អ្នក​ដើម្បី​ប្រើ​ជា​អង់តែន​វិទ្យុ។</string>
+ <string name="fm_recorder_name">ឧបករណ៍ថតសម្លេង FM</string>
+ <string name="toast_recording_lost_warning">ការថតសម្លេងរបស់អ្នកនឹងត្រូវបាត់បង់ ដោយសារអ្នកបានដក SD ចេញ!</string>
+ <string name="toast_start_recording">ចាប់ផ្តើមការថតសម្លេង ...</string>
+ <string name="toast_sdcard_missing">កាត SD របស់អ្នកបានបាត់!</string>
+ <string name="toast_sdcard_insufficient_space">កន្លែងនៅក្នុងកាត SD មិនគ្រប់គ្រាន់!</string>
+ <string name="toast_recorder_internal_error">កំហុសខាងក្នុងបានកើតឡើង នៅក្នុងឧបករណ៍ថតសម្លេង!</string>
+ <string name="toast_player_internal_error">កំហុសខាងក្នុងបានកើតឡើង នៅក្នុងឧបករណ៍ចាក់សម្លេង!</string>
+ <string name="toast_powerup_before_record_warning">សូមបើក FM ជាមុនសិន!</string>
+ <string name="optmenu_record">ថតសម្លេង FM</string>
+ <string name="btn_save_recording">រក្សាទុក</string>
+ <string name="btn_discard_recording">បោះចោល</string>
+ <string name="edit_recording_name_hint">វាយឈ្មោះឯកសារនៅទីនេះ</string>
+ <string name="dlg_save_recording_title">រក្សាទុកឯកសារដែលបានថត</string>
+ <string name="dlg_save_recording_storage_warning">កន្លែងផ្ទុកមិនគ្រប់គ្រាន់! តើអ្នកចង់រក្សាទុកនូវសម្លេងដែលកំពុងថតមែនទេ?</string>
+ <string name="already_exists">មានរួចហើយ</string>
+ <string name="toast_in_call">អ្នកមិនអាចបើកវិទ្យុ FM បានទេពេលអ្នកកំពុងហៅ ។</string>
+ <string name="empty_list">បញ្ជីប៉ុស្តិ៍ទទេ ។</string>
+ <string name="optmenu_speaker">ឧបល័រ</string>
+ <string name="optmenu_earphone">កាសស្តាប់ត្រចៀក</string>
+ <string name="not_available">បច្ចុប្បន្នមិនអាចរកបានទេ</string>
+ <string name="add_to_favorite1">បន្ថែមទៅក្នុងការសិតប៉ុស្តិ៍វិទ្យុឡើងវិញ</string>
+ <string name="contmenu_item_delete1">លុបចេញពីក្នុងការសិតប៉ុស្តិ៍វិទ្យុឡើងវិញ</string>
+ <string name="dlg_delete_confirm_title1">បញ្ជាក់ការលុបចោលពីក្នុងការសិតប៉ុស្តិ៍ឡើងវិញ</string>
+ <string name="dlg_delete_confirm_text1">តើប្រាកដទេថាអ្នកចង់លុបប៉ុស្តិ៍នេះចេញពីក្នុងការសិតប៉ុស្តិ៍ឡើងវិញ?</string>
+ <string name="toast_favorite_full1">មិនអាចបន្ថែមប៉ុស្តិ៍ទៅក្នុងការសិតប៉ុស្តិ៍លើងវិញ ដោយសាវាពេញហើយ ។</string>
+ <string name="toast_already_favorite1">ប៉ុស្តិ៍នេះស្ថិតនៅក្នុងបញ្ជីសិតប៉ុស្តិ៍ឡើងវិញរួចហើយ ។</string>
+ <string name="toast_channel_deleted1">បានលុបចោលពីបញ្ជីសិតប៉ុស្តិ៍ឡើងវិញដោយជ០គជ័យ ។</string>
+ <string name="toast_channel_added1">បានបន្ថែមទៅក្នុងបញ្ជីសិតប៉ុស្តិ៍ឡើងវិញដោយជោគជ័យ ។</string>
+</resources>
diff --git a/MediaTek/FmRadio/res/values-ko/strings.xml b/MediaTek/FmRadio/res/values-ko/strings.xml
new file mode 100755
index 0000000..839ae90
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-ko/strings.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">FM 라디오</string>
+ <string name="favorite_manager">채널 목록</string>
+ <string name="add_to_favorite">즐겨찾기에 추가</string>
+ <string name="optmenu_search">검색</string>
+ <string name="optmenu_exit">종료</string>
+ <string name="contmenu_title">작업</string>
+ <string name="contmenu_item_edit">편집</string>
+ <string name="contmenu_item_delete">즐겨찾기에서 제거</string>
+ <string name="dlg_noantenna_text">안테나로 이어폰이 필요합니다. 이어폰을 연결하십시오.</string>
+ <string name="dlg_noantenna_title">이어폰에 연결</string>
+ <string name="btn_yes">예</string>
+ <string name="btn_no">아니요</string>
+ <string name="btn_ok">확인</string>
+ <string name="btn_cancel">취소</string>
+ <string name="dlg_progress_title">검색</string>
+ <string name="dlg_progress_text">채널을 검색하는 중...</string>
+ <string name="dlg_addedit_station_name">이름:</string>
+ <string name="dlg_addedit_station_freq">주파수:</string>
+ <string name="dlg_addedit_title_edit">주파수 편집</string>
+ <string name="default_station_name">새 주파수</string>
+ <string name="dlg_delete_confirm_title">즐겨찾기에서 제거 확인</string>
+ <string name="dlg_delete_confirm_text">이 채널을 즐겨찾기에서 제거하시겠습니까?</string>
+ <string name="toast_favorite_full">즐겨찾기 목록이 가득 차서 채널을 추가할 수 없습니다.</string>
+ <string name="toast_already_favorite">이 채널은 이미 즐겨찾기 목록에 있습니다.</string>
+ <string name="toast_channel_deleted">즐겨찾기에서 성공적으로 제거되었습니다.</string>
+ <string name="toast_channel_added">즐겨찾기에 성공적으로 추가되었습니다.</string>
+ <string name="toast_channel_searched">검색된 사용 가능한 채널:</string>
+ <string name="toast_cannot_search">사용 가능한 채널을 검색할 수 없습니다.</string>
+ <string name="toast_invalid_frequency">현재 위치에 대한 잘못된 주파수. 유효한 주파수 범위: 87.5-108.0</string>
+ <string name="toast_invalid_input">잘못된 입력, 유효한 값은 0 또는 5입니다.</string>
+ <string name="optmenu_rds_settings">RDS 설정</string>
+ <string name="dlg_rds_settings_channel_information">채널 정보</string>
+ <string name="dlg_rds_settings_alternative_frequency">대체 주파수</string>
+ <string name="sound_mode">사운드 모드</string>
+ <string name="more">자세히</string>
+ <string name="power">거듭제곱</string>
+ <string name="edit_frequency_overwrite_text">"덮어쓰기"</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">이어폰을 연결하여 라디오 안테나로서 사용하십시오.</string>
+ <string name="fm_recorder_name">FM 레코더</string>
+ <string name="toast_recording_lost_warning">SD 제거로 인해 녹음이 손실됩니다!</string>
+ <string name="toast_start_recording">녹음 시작...</string>
+ <string name="toast_sdcard_missing">SD 카드가 없습니다!</string>
+ <string name="toast_sdcard_insufficient_space">SD 카드 공간이 부족합니다!</string>
+ <string name="toast_recorder_internal_error">레코더에서 내부 오류가 발생했습니다!</string>
+ <string name="toast_player_internal_error">플레이어에서 내부 오류가 발생했습니다!</string>
+ <string name="toast_powerup_before_record_warning">먼저 FM 전원을 켜십시오!</string>
+ <string name="optmenu_record">FM 녹음</string>
+ <string name="btn_save_recording">저장</string>
+ <string name="btn_discard_recording">폐기</string>
+ <string name="edit_recording_name_hint">여기에 파일 이름을 입력</string>
+ <string name="dlg_save_recording_title">녹음 파일 저장</string>
+ <string name="dlg_save_recording_storage_warning">저장 공간이 부족합니다! 현재 녹음을 저장하시겠습니까?</string>
+ <string name="already_exists">이미 존재합니다</string>
+ <string name="toast_in_call">통화 중에는 FM 라디오를 시작할 수 없습니다.</string>
+ <string name="empty_list">채널 목록이 비어 있습니다.</string>
+ <string name="optmenu_speaker">"스피커"</string>
+ <string name="optmenu_earphone">헤드폰</string>
+ <string name="not_available">현재 사용할 수 없음</string>
+ <string name="add_to_favorite1">사전설정 채널에 추가</string>
+ <string name="contmenu_item_delete1">사전설정 채널에서 제거</string>
+ <string name="dlg_delete_confirm_title1">사전설정 채널에서 제거 확인</string>
+ <string name="dlg_delete_confirm_text1">이 채널을 사전설정 채널에서 제거하시겠습니까?</string>
+ <string name="toast_favorite_full1">사전설정 채널 목록이 가득 차서 채널을 추가할 수 없습니다.</string>
+ <string name="toast_already_favorite1">이 채널은 이미 사전설정 채널 목록에 있습니다.</string>
+ <string name="toast_channel_deleted1">사전설정 채널에서 성공적으로 제거되었습니다.</string>
+ <string name="toast_channel_added1">사전설정 채널에 성공적으로 추가되었습니다.</string>
+</resources>
diff --git a/MediaTek/FmRadio/res/values-lo-rLA/strings.xml b/MediaTek/FmRadio/res/values-lo-rLA/strings.xml
new file mode 100755
index 0000000..6911328
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-lo-rLA/strings.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name">ວິທະຍຸ FM</string>
+ <string name="dlg_progress_title">ຊອກຫາ</string>
+ <string name="btn_yes">ແມ່ນແລ້ວ</string>
+ <string name="optmenu_speaker">ຜູ້ຢິງເວົ້າ</string>
+ <string name="edit_frequency_overwrite_text">ຂຽນກ່ຽວກັບການເທິງ</string>
+ <string name="toast_start_recording">ເລີ່ມຕົ້ນການບັນທຶກ…</string>
+ <string name="fm_unit">MHz</string>
+ <string name="empty_list">ບັນຊີລາຍຊື່ຊ່ອງເປົ່າຫວ່າງ.</string>
+ <string name="optmenu_rds_settings">ການປັບຄ່າ RDS </string>
+ <string name="toast_channel_searched">ຊອກຫາຊ່ອງທາງອອກທີ່ມີຢູ່:</string>
+ <string name="already_exists">ມີແລ້ວ</string>
+ <string name="dlg_noantenna_title">ສຽບໃນໂທລະສັບຫູ</string>
+ <string name="add_to_favorite">ເພີ່ມເຖິງຄວາມຕ້ອງການ</string>
+ <string name="toast_sdcard_insufficient_space">ຊ່ອງບັດ SD ບໍ່ພຽງພໍ!</string>
+ <string name="dlg_delete_confirm_title">ຢືນຢັນອອກຈາກຄວາມຕ້ອງການ</string>
+ <string name="optmenu_record">ການບັນທຶກການ FM</string>
+ <string name="optmenu_earphone">ໂທລະສັບຫູ</string>
+ <string name="sound_mode">ຮູບແບບສຽງ</string>
+ <string name="toast_already_favorite">ຊ່ອງທາງນີ້ແມ່ນຢູ່ໃນບັນຊີລາຍຊື່ຂອງຄວາມຕ້ອງການ.</string>
+ <string name="not_available">ປະຈຸບັນຍັງບໍ່ທັນມີ</string>
+ <string name="toast_channel_deleted">ການໂຍກຍ້າຍສົບຜົນສໍາເລັດຈາກຄວາມຕ້ອງການ.</string>
+ <string name="toast_channel_added">ເພີ່ມສົບຜົນສໍາເລັດກັບຄວາມຕ້ອງການ.</string>
+ <string name="dlg_rds_settings_channel_information">ຂໍ້ມູນຂ່າວສານທາງ</string>
+ <string name="toast_favorite_full">ບໍ່ສາມາດເພີ່ມຊ່ອງທາງໃນການບັນຊີຂອງທ່ານເພາະວ່າມັນເປັນອັນເຕັມທີ່.</string>
+ <string name="btn_save_recording">ຊ່ວຍປະຢັດ</string>
+ <string name="optmenu_search">ຊອກຫາ</string>
+ <string name="dlg_rds_settings_alternative_frequency">ຄວາມຖີ່ຂອງການເລືອກ</string>
+ <string name="dlg_progress_text">ຊ່ອງທາງການຊອກຫາ…</string>
+ <string name="optmenu_exit">ອອກໄປ</string>
+ <string name="more">ອ່ານຕໍ່</string>
+ <string name="btn_discard_recording">ຖິ້ມ</string>
+ <string name="contmenu_item_edit">ດັດແກ້</string>
+ <string name="toast_cannot_search">ບໍ່ສາມາດຊອກຫາຊ່ອງທາງອອກທີ່ມີຢູ່.</string>
+ <string name="dlg_save_recording_storage_warning">ການເກັບຮັກສາບໍ່ພຽງພໍ! ທ່ານຕ້ອງການທີ່ຈະຊ່ວຍປະຢັດການບັນທຶກການປະຈຸບັນ?</string>
+ <string name="toast_in_call">ທ່ານບໍ່ສາມາດເປີດວິທະຍຸ FM ໃນເວລາທີ່ທ່ານຢູ່ໃນການເອີ້ນ.</string>
+ <string name="dlg_addedit_station_freq">ຄວາມຖີ່ຂອງການ:</string>
+ <string name="toast_recorder_internal_error">ເປັນຄວາມຜິດພາດທີ່ເກີດຂຶ້ນພາຍໃນໃນການບັນທຶກ!</string>
+ <string name="dlg_save_recording_title">ຊ່ວຍປະຢັດໄຟລ໌ບັນທຶກ</string>
+ <string name="btn_ok">ຖືກແລ້ວ</string>
+ <string name="power">ພະລັງງານ</string>
+ <string name="contmenu_item_delete">ເອົາອອກຈາກຂອງ</string>
+ <string name="toast_powerup_before_record_warning">ກະລຸນາພະລັງງານສູງ FM ທໍາອິດ!</string>
+ <string name="fm_recorder_name">ເຄື່ອງມືບັນທຶກ FM</string>
+ <string name="toast_recording_lost_warning">ການບັນທຶກຂອງທ່ານຈະໄດ້ຮັບການສູນເສຍເນື່ອງຈາກການໂຍກຍ້າຍ SD!</string>
+ <string name="dlg_delete_confirm_text">ທ່ານແນ່ໃຈວ່າທ່ານຕ້ອງການທີ່ຈະເອົາຊ່ອງທາງນີ້ຈາກຂອງ?</string>
+ <string name="default_station_name">ໃຫມ່ຊ່ອງ</string>
+ <string name="btn_cancel">ຍົກເລີກການ</string>
+ <string name="contmenu_title">ການປະຕິບັດ</string>
+ <string name="btn_no">ບໍ່</string>
+ <string name="favorite_manager">ບັນຊີລາຍຊື່ຊ່ອງ</string>
+ <string name="toast_invalid_frequency">ຄວາມຖີ່ຂອງການບໍ່ຖືກຕ້ອງສໍາລັບສະຖານທີ່ໃນປະຈຸບັນ. ຂອບເຂດຄວາມຖີ່ຂອງຄວາມຖືກຕ້ອງ: 87.5-108.0</string>
+ <string name="toast_sdcard_missing">ບັດ SD ຂອງທ່ານໄດ້ຖືກຫາຍ!</string>
+ <string name="dlg_addedit_station_name">ຊື່ຂອງທ່ານ:</string>
+ <string name="dlg_addedit_title_edit">ດັດແກ້ການຊ່ອງ</string>
+ <string name="toast_invalid_input">ການປະກອບບໍ່ຖືກຕ້ອງທີ່ສຸດ, ມູນຄ່າຖືກຕ້ອງແມ່ນ 0 ຫຼື 5.</string>
+ <string name="edit_recording_name_hint">ຊື່ໄຟລ໌ທີ່ນີ້</string>
+ <string name="dlg_noantenna_text">ທ່ານຈໍາເປັນຕ້ອງໂທລະສັບຫູເປັນສາຍອາກາດ. ກະລຸນາສຽບໃນໂທລະສັບຫູຂອງທ່ານ.</string>
+ <string name="toast_player_internal_error">ເປັນຄວາມຜິດພາດພາຍໃນທີ່ເກີດຂຶ້ນໃນລະ!</string>
+</resources> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/values-lt/strings.xml b/MediaTek/FmRadio/res/values-lt/strings.xml
new file mode 100755
index 0000000..7688452
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-lt/strings.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">FM radijas</string>
+ <string name="favorite_manager">Kanalų sąrašas</string>
+ <string name="add_to_favorite">Pridėti prie mėgstamiausių</string>
+ <string name="optmenu_search">Ieškoti</string>
+ <string name="optmenu_exit">Uždaryti</string>
+ <string name="contmenu_title">Operacijos</string>
+ <string name="contmenu_item_edit">Redaguoti</string>
+ <string name="contmenu_item_delete">Pašalinti iš parankinių</string>
+ <string name="dlg_noantenna_text">Reikia ausinių vietoj antenos. Prijunkite ausines.</string>
+ <string name="dlg_noantenna_title">Prijungti ausines</string>
+ <string name="btn_yes">"Taip"</string>
+ <string name="btn_no">"Ne"</string>
+ <string name="btn_ok">Gerai</string>
+ <string name="btn_cancel">Atšaukti</string>
+ <string name="dlg_progress_title">Ieškoti</string>
+ <string name="dlg_progress_text">Ieškoma kanalų...</string>
+ <string name="dlg_addedit_station_name">Pavadinimas:</string>
+ <string name="dlg_addedit_station_freq">Dažnis:</string>
+ <string name="dlg_addedit_title_edit">Redaguoti kanalą</string>
+ <string name="default_station_name">Naujas kanalas</string>
+ <string name="dlg_delete_confirm_title">Patvirtinti šalinimą iš mėgstamiausių</string>
+ <string name="dlg_delete_confirm_text">Ar tikrai norite pašalinti šį kanalą iš mėgstamiausių?</string>
+ <string name="toast_favorite_full">Nepavyko pridėti kanalo prie mėgstamiausių sąrašo, nes jis pilnas.</string>
+ <string name="toast_already_favorite">Šis kanalas jau įtrauktas į mėgstamiausių sąrašą.</string>
+ <string name="toast_channel_deleted">Sėkmingai pašalintas iš mėgstamiausių.</string>
+ <string name="toast_channel_added">Sėkmingai pridėtas prie mėgstamiausių.</string>
+ <string name="toast_channel_searched">Rasti esami kanalai:</string>
+ <string name="toast_cannot_search">Nepavyko rasti esamo kanalo.</string>
+ <string name="toast_invalid_frequency">Dažnis netinka esamai vietovei. Tinkamos dažnio ribos: 87,5-108,0</string>
+ <string name="toast_invalid_input">Neteisinga paskutinė įvestis; teisinga vertė yra 0 arba 5.</string>
+ <string name="optmenu_rds_settings">RDS parametrai</string>
+ <string name="dlg_rds_settings_channel_information">Kanalo informacija</string>
+ <string name="dlg_rds_settings_alternative_frequency">Alternatyvus dažnis</string>
+ <string name="sound_mode">Garso režimas</string>
+ <string name="more">"Daugiau"</string>
+ <string name="power">"laipsnis"</string>
+ <string name="toast_in_call">Negalima paleisti FM radijo kalbant telefonu.</string>
+ <string name="empty_list">Kanalų sąrašas tuščias.</string>
+ <string name="edit_frequency_overwrite_text">Perrašyti</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">Prijunkite ausines, kad jos veiktų kaip radijo antena.</string>
+ <string name="fm_recorder_name">FM rašytuvas</string>
+ <string name="toast_recording_lost_warning">Išėmus SD, įrašas bus prarastas!</string>
+ <string name="toast_start_recording">Pradedamas įrašymas...</string>
+ <string name="toast_sdcard_missing">Nėra SD kortelės!</string>
+ <string name="toast_sdcard_insufficient_space">Nepakanka vietos SD kortelėje!</string>
+ <string name="toast_recorder_internal_error">Įvyko vidinė rašytuvo klaida!</string>
+ <string name="toast_player_internal_error">Įvyko vidinė grotuvo klaida!</string>
+ <string name="toast_powerup_before_record_warning">Pirmiausiai įjunkite FM radiją!</string>
+ <string name="optmenu_record">Įrašyti FM</string>
+ <string name="btn_save_recording">"Išsaugoti"</string>
+ <string name="btn_discard_recording">Išmesti</string>
+ <string name="edit_recording_name_hint">Įrašykite failo pavadinimą čia</string>
+ <string name="dlg_save_recording_title">Išsaugoti įrašo failas</string>
+ <string name="dlg_save_recording_storage_warning">Nepakanka vietos! Norite išsaugoti dabartinį įrašą?</string>
+ <string name="already_exists">jau yra</string>
+ <string name="optmenu_speaker">Garsiakalbis</string>
+ <string name="optmenu_earphone">Ausinės</string>
+ <string name="not_available">Šiuo metu nėra</string>
+ <string name="add_to_favorite1">Pridėti prie nustatytų kanalų</string>
+ <string name="contmenu_item_delete1">Šalinti iš nustatytų kanalų</string>
+ <string name="dlg_delete_confirm_title1">Patvirtinti šalinimą iš nustatytų kanalų</string>
+ <string name="dlg_delete_confirm_text1">Ar tikrai norite pašalinti šį kanalą iš nustatytų kanalų?</string>
+ <string name="toast_favorite_full1">Nepavyko pridėti kanalo prie nustatytų kanalų sąrašo, nes jis pilnas.</string>
+ <string name="toast_already_favorite1">Šis kanalas jau įtrauktas į nustatytų kanalų sąrašą.</string>
+ <string name="toast_channel_deleted1">Sėkmingai pašalintas iš nustatytų kanalų.</string>
+ <string name="toast_channel_added1">Sėkmingai pridėtas prie nustatytų kanalų.</string>
+</resources> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/values-lv/strings.xml b/MediaTek/FmRadio/res/values-lv/strings.xml
new file mode 100755
index 0000000..8356149
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-lv/strings.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">FM radio</string>
+ <string name="favorite_manager">Kanālu saraksts</string>
+ <string name="add_to_favorite">Pievienot izlasei</string>
+ <string name="optmenu_search">Meklēt</string>
+ <string name="optmenu_exit">Aizvērt</string>
+ <string name="contmenu_title">Darbības</string>
+ <string name="contmenu_item_edit">Rediģēt</string>
+ <string name="contmenu_item_delete">Noņemt no izlases</string>
+ <string name="dlg_noantenna_text">Austiņas nepieciešamas kā antena. Pievienojiet austiņas.</string>
+ <string name="dlg_noantenna_title">Pievienot austiņas</string>
+ <string name="btn_yes">"Jā"</string>
+ <string name="btn_no">"Nē"</string>
+ <string name="btn_ok">Labi</string>
+ <string name="btn_cancel">Atcelt</string>
+ <string name="dlg_progress_title">Meklēt</string>
+ <string name="dlg_progress_text">Meklē kanālus...</string>
+ <string name="dlg_addedit_station_name">Nosaukums:</string>
+ <string name="dlg_addedit_station_freq">Frekvence:</string>
+ <string name="dlg_addedit_title_edit">Rediģēt kanālu</string>
+ <string name="default_station_name">Jauns kanāls</string>
+ <string name="dlg_delete_confirm_title">Apstiprināt noņemšanu no izlases</string>
+ <string name="dlg_delete_confirm_text">Vai tiešām vēlaties noņemt šo kanālu no izlases?</string>
+ <string name="toast_favorite_full">Nevar pievienot kanālu izlases sarakstam, jo tas ir pilns.</string>
+ <string name="toast_already_favorite">Šis kanāls jau ir izlases sarakstā.</string>
+ <string name="toast_channel_deleted">Veiksmīgi noņemts no izlases.</string>
+ <string name="toast_channel_added">Veiksmīgi pievienots izlasei.</string>
+ <string name="toast_channel_searched">Atrasti pieejamie kanāli:</string>
+ <string name="toast_cannot_search">Nevar atrast pieejamos kanālus.</string>
+ <string name="toast_invalid_frequency">Pašreizējai atrašanās vietai nederīga frekvence. Derīgu frekvenču diapazons: 87,5-108,0</string>
+ <string name="toast_invalid_input">Pēdējā nederīgā ievade, derīga vērtība ir no 0 līdz 5.</string>
+ <string name="optmenu_rds_settings">RDS iestatījumi</string>
+ <string name="dlg_rds_settings_channel_information">Kanāla informācija</string>
+ <string name="dlg_rds_settings_alternative_frequency">Alternatīva frekvence</string>
+ <string name="sound_mode">Skaņas režīms</string>
+ <string name="more">"Vairāk"</string>
+ <string name="power">"pakāpe"</string>
+ <string name="toast_in_call">Zvanīšanas laikā nevar palaist FM radio.</string>
+ <string name="empty_list">Kanālu saraksts ir tukšs.</string>
+ <string name="edit_frequency_overwrite_text">Pārrakstīt</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">Pievienojiet austiņas, lai lietotu kā radio antenu.</string>
+ <string name="fm_recorder_name">FM ierakstītājs</string>
+ <string name="toast_recording_lost_warning">Pēc SD kartes izņemšanas ieraksts tiks zaudēts!</string>
+ <string name="toast_start_recording">Sāk ierakstīšanu...</string>
+ <string name="toast_sdcard_missing">Nepieciešama SD karte!</string>
+ <string name="toast_sdcard_insufficient_space">SD kartē nepietiek vietas!</string>
+ <string name="toast_recorder_internal_error">Rakstītājā radās iekšēja kļūda!</string>
+ <string name="toast_player_internal_error">Atskaņotājā radās iekšēja kļūda!</string>
+ <string name="toast_powerup_before_record_warning">Vispirms ieslēdziet FM!</string>
+ <string name="optmenu_record">Ierakstīt FM</string>
+ <string name="btn_save_recording">"Saglabāt"</string>
+ <string name="btn_discard_recording">Atmest</string>
+ <string name="edit_recording_name_hint">Faila nosaukumu ievadiet šeit</string>
+ <string name="dlg_save_recording_title">Saglabāt ierakstīto failu</string>
+ <string name="dlg_save_recording_storage_warning">Nepietiekama atmiņa! Vai vēlaties saglabāt pašreizējo ierakstu?</string>
+ <string name="already_exists">jau eksistē</string>
+ <string name="optmenu_speaker">Skaļrunis</string>
+ <string name="optmenu_earphone">Austiņas</string>
+ <string name="not_available">Pašlaik nav pieejams</string>
+ <string name="add_to_favorite1">Pievienot iepriekš iestatītiem kanāliem</string>
+ <string name="contmenu_item_delete1">Noņemt no iepriekš iestatītiem kanāliem</string>
+ <string name="dlg_delete_confirm_title1">Apstiprināt noņemšanu no iepriekš iestatītiem kanāliem</string>
+ <string name="dlg_delete_confirm_text1">Vai tiešām vēlaties noņemt šo kanālu no iepriekš iestatītiem kanāliem?</string>
+ <string name="toast_favorite_full1">Nevar pievienot kanālu iepriekš iestatītu kanālu sarakstam, jo tas ir pilns.</string>
+ <string name="toast_already_favorite1">Šis kanāls jau ir iepriekš iestatīto kanālu sarakstā.</string>
+ <string name="toast_channel_deleted1">Veiksmīgi noņemts no iepriekš iestatītiem kanāliem.</string>
+ <string name="toast_channel_added1">Veiksmīgi pievienots iepriekš iestatītiem kanāliem.</string>
+</resources> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/values-mn-rMN/strings.xml b/MediaTek/FmRadio/res/values-mn-rMN/strings.xml
new file mode 100755
index 0000000..2a17335
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-mn-rMN/strings.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name">FM радио</string>
+ <string name="dlg_progress_title">Хайх</string>
+ <string name="btn_yes">Тийм</string>
+ <string name="optmenu_speaker">Спикер</string>
+ <string name="edit_frequency_overwrite_text">Дарж бичих</string>
+ <string name="toast_start_recording">Бичлэгийг эхлэх...</string>
+ <string name="fm_unit">МГц</string>
+ <string name="empty_list">Сувгийн жагсаалт хоосон байна.</string>
+ <string name="optmenu_rds_settings">RDS тохиргоо</string>
+ <string name="toast_channel_searched">Боломжтой сувгийг илрүүлсэн:</string>
+ <string name="already_exists">аль хэдийн байна</string>
+ <string name="dlg_noantenna_title">Чихэвчийг залгах</string>
+ <string name="add_to_favorite">Дуртай зүйлээ нэмэх</string>
+ <string name="toast_sdcard_insufficient_space">Хангалттай бус SD картын зай!</string>
+ <string name="dlg_delete_confirm_title">Дуртай зүйлээсээ хасахыг баталгаажуулах</string>
+ <string name="optmenu_record">FM-ийг бичих</string>
+ <string name="optmenu_earphone">Чихэвч</string>
+ <string name="sound_mode">Дууны горим</string>
+ <string name="toast_already_favorite">Энэ суваг аль хэдийн дуртай зүйлийн жагсаалтад байна.</string>
+ <string name="not_available">Одоогоор боломжгүй</string>
+ <string name="toast_channel_deleted">Дуртай зүйлээс амжилттай хаслаа.</string>
+ <string name="toast_channel_added">Дуртай зүйлд амжилттай нэмлээ.</string>
+ <string name="dlg_rds_settings_channel_information">Сувгийн мэдээлэл</string>
+ <string name="toast_favorite_full">Дуртай зүйлийн жагсаалт дүүрсэн тул суваг нэмж чадахгүй байна.</string>
+ <string name="btn_save_recording">Хадгалах</string>
+ <string name="optmenu_search">Хайх</string>
+ <string name="dlg_rds_settings_alternative_frequency">Альтернатив давтамж</string>
+ <string name="dlg_progress_text">Сувгуудыг хайх...</string>
+ <string name="optmenu_exit">Гарах</string>
+ <string name="more">Илүү</string>
+ <string name="btn_discard_recording">Хаях</string>
+ <string name="contmenu_item_edit">Засах</string>
+ <string name="toast_cannot_search">Боломжтой сувгийг илрүүлж чадахгүй байна.</string>
+ <string name="dlg_save_recording_storage_warning">Хангалтгүй хадгалах багтаамж! Одоогийн бичлэгийг хадгалахын хүсэж байна уу?</string>
+ <string name="toast_in_call">Та дуудлага хийж байх үедээ FM радиог ажиллуулах боломжгүй</string>
+ <string name="dlg_addedit_station_freq">Давтамж:</string>
+ <string name="toast_recorder_internal_error">Бичлэгт дотоод алдаа тохиолдлоо!</string>
+ <string name="dlg_save_recording_title">Бичлэгийн файлыг хадгалах</string>
+ <string name="btn_ok">Тийм</string>
+ <string name="power">Хүч</string>
+ <string name="contmenu_item_delete">Дуртай зүйлээс хасах</string>
+ <string name="toast_powerup_before_record_warning">FM-ээ эхлээд асаа!</string>
+ <string name="fm_recorder_name">FM бичигч</string>
+ <string name="toast_recording_lost_warning">SD-ыг чөлөөлснөөс үүдэн таны бичлэг алдагдах болно!</string>
+ <string name="dlg_delete_confirm_text">Энэ сувгийг өөрийн дуртай зүйлээс устгахыг хүсэж байгаадаа итгэлтэй байна уу?</string>
+ <string name="default_station_name">Шинэ суваг</string>
+ <string name="btn_cancel">Цуцлах</string>
+ <string name="contmenu_title">Ажиллагаа</string>
+ <string name="btn_no">Үгүй</string>
+ <string name="favorite_manager">Сувгийн жагсаалт</string>
+ <string name="toast_invalid_frequency">Одоогийн байршлын хүчингүй давтамж. Хүчинтэй давтамжийн хамрах хүрээ: 87.5-108.0</string>
+ <string name="toast_sdcard_missing">Таны SD карт байхгүй байна!</string>
+ <string name="dlg_addedit_station_name">Нэр:</string>
+ <string name="dlg_addedit_title_edit">Сувгийг засах</string>
+ <string name="toast_invalid_input">Сүүлийн хүчингүй оролт, хүчинтэй утга is 0 or 5.</string>
+ <string name="edit_recording_name_hint">Файлын нэрийг энд шивэх</string>
+ <string name="dlg_noantenna_text">You need an earphone as antenna. Please plug in your earphone.</string>
+ <string name="toast_player_internal_error">Антен байдлаар ашиглах чихэвч хэрэгтэй. Чихэвчээ залгана уу.</string>
+</resources> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/values-ms/strings.xml b/MediaTek/FmRadio/res/values-ms/strings.xml
new file mode 100755
index 0000000..e9ba9f9
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-ms/strings.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">Radio FM</string>
+ <string name="favorite_manager">Senarai saluran</string>
+ <string name="add_to_favorite">Tambah ke Kegemaran</string>
+ <string name="optmenu_search">Cari</string>
+ <string name="optmenu_exit">Keluar</string>
+ <string name="contmenu_title">Operasi</string>
+ <string name="contmenu_item_edit">Edit</string>
+ <string name="contmenu_item_delete">Alih keluar daripada kegemaran</string>
+ <string name="dlg_noantenna_text">Anda memerlukan fon telinga sebagai antena. Sila pasangkan fon telinga anda.</string>
+ <string name="dlg_noantenna_title">Cucukkan fon telinga</string>
+ <string name="btn_yes">Ya</string>
+ <string name="btn_no">Tidak</string>
+ <string name="btn_ok">OK</string>
+ <string name="btn_cancel">Batal</string>
+ <string name="dlg_progress_title">Imbas</string>
+ <string name="dlg_progress_text">Imbas saluran…</string>
+ <string name="dlg_addedit_station_name">Nama:</string>
+ <string name="dlg_addedit_station_freq">Kekerapan:</string>
+ <string name="dlg_addedit_title_edit">Edit Saluran</string>
+ <string name="default_station_name">Saluran Baru</string>
+ <string name="dlg_delete_confirm_title">Sahkan Padam Saluran</string>
+ <string name="dlg_delete_confirm_text">Adakah anda pasti anda mahu memadam saluran ini?</string>
+ <string name="toast_favorite_full">Tidak boleh menambah saluran ke senarai kegemaran kerana sudah penuh.</string>
+ <string name="toast_already_favorite">Saluran ini sudah ada di dalam senarai kegemaran.</string>
+ <string name="toast_channel_deleted">Berjaya dialih keluar daripada kegemaran.</string>
+ <string name="toast_channel_added">Berjaya ditambah pada kegemaran.</string>
+ <string name="toast_channel_searched">Cari saluran yang tersedia:</string>
+ <string name="toast_cannot_search">Tidak dapat mencari saluran tersedia.</string>
+ <string name="optmenu_rds_settings">Tetapan RDS</string>
+ <string name="dlg_rds_settings_channel_information">Maklumat saluran</string>
+ <string name="dlg_rds_settings_alternative_frequency">Frekuensi alternatif</string>
+ <string name="more">Lebih banyak Apl</string>
+ <string name="power">kuasa</string>
+ <string name="sound_mode">Mod bunyi</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">Pasang fon telinga anda untuk digunakan sebagai antena radio.</string>
+ <!-- For FM recording -->
+ <string name="edit_frequency_overwrite_text">"Tulis ganti"</string>
+ <string name="fm_recorder_name">Perakam FM</string>
+ <string name="toast_recording_lost_warning">Rakaman anda akan hilang disebabkan pengalihan keluar SD!</string>
+ <string name="toast_start_recording">Mula merakam…</string>
+ <string name="toast_sdcard_missing">Kad SD anda tiada!</string>
+ <string name="toast_sdcard_insufficient_space">Ruang kad SD tidak mencukupi!</string>
+ <string name="toast_recorder_internal_error">Ralat dalaman berlaku dalam perakam!</string>
+ <string name="toast_player_internal_error">Ralat dalaman berlaku dalam pemain!!</string>
+ <string name="toast_powerup_before_record_warning">Sila hidupkan FM terlebih dahulu!</string>
+ <string name="optmenu_record">Rakam FM</string>
+ <string name="btn_save_recording">Simpan</string>
+ <string name="btn_discard_recording">Buang</string>
+ <string name="edit_recording_name_hint">Taipkan nama fail di sini</string>
+ <string name="dlg_save_recording_title">Simpan fail rakaman</string>
+ <string name="dlg_save_recording_storage_warning">Storan tidak mencukupi! Adakah anda mahu menyimpan rakaman semasa?</string>
+ <string name="already_exists">Sudah wujud</string>
+ <string name="toast_invalid_frequency">Frekuensi tidak sah untuk lokasi semasa. Skop frekuensi sah: 87.5-108.0.</string>
+ <string name="toast_invalid_input">Input tidak sah terakhir, nilai sah ialah 0 atau 5.</string>
+ <string name="toast_in_call">Anda tidak boleh melancarkan Radio FM semasa anda sedang membuat panggilan.</string>
+ <string name="empty_list">Senarai saluran kosong.</string>
+ <string name="optmenu_speaker">"Pembesar suara"</string>
+ <string name="optmenu_earphone">Headset</string>
+ <string name="not_available">Tidak tersedia pada masa ini</string>
+ <string name="add_to_favorite1">Tambahkan pada saluran dipratetap</string>
+ <string name="contmenu_item_delete1">Alih keluar daripada saluran dipratetap</string>
+ <string name="dlg_delete_confirm_title1">Sahkan alih keluar daripada saluran dipratetap</string>
+ <string name="dlg_delete_confirm_text1">Adakah anda pasti mahu mengalih keluar saluran ini daripada saluran dipratetap?</string>
+ <string name="toast_favorite_full1">Tidak dapat menambah saluran pada senarai saluran dipratetap kerana ia telah penuh.</string>
+ <string name="toast_already_favorite1">Saluran ini sudah berada dalam senarai saluran dipratetap.</string>
+ <string name="toast_channel_deleted1">Berjaya dialih keluar daripada saluran dipratetap.</string>
+ <string name="toast_channel_added1">Berjaya ditambahkan pada saluran dipratetap.</string>
+</resources>
diff --git a/MediaTek/FmRadio/res/values-my-rMM/strings.xml b/MediaTek/FmRadio/res/values-my-rMM/strings.xml
new file mode 100755
index 0000000..ee751b5
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-my-rMM/strings.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">FM ရေဒီယို</string>
+ <string name="favorite_manager">ချန်နယ် စာရင်း</string>
+ <string name="add_to_favorite">အနှစ်သက်ဆုံးထဲသို့ ထည့်ရန်</string>
+ <string name="optmenu_search">ရှာဖွေရန်</string>
+ <string name="optmenu_exit">ထွက်ရန်</string>
+ <string name="contmenu_title">လုပ်ငန်းများ</string>
+ <string name="contmenu_item_edit">တည်းဖြတ်ရန်</string>
+ <string name="contmenu_item_delete">အနှစ်သက်ဆုံးထဲမှ ဖယ်ရှားရန်</string>
+ <string name="dlg_noantenna_text">ဧရိယာတိုင်အဖြစ် နားကြပ်လိုအပ်သည်။ သင့်နားကြပ်ကြိုးတပ်ပါ။</string>
+ <string name="dlg_noantenna_title">နားကြပ်ကို တပ်လိုက်ပါ</string>
+ <string name="btn_yes">မှန်</string>
+ <string name="btn_no">မှား</string>
+ <string name="btn_ok">လုပ်မည်</string>
+ <string name="btn_cancel">ပယ်ဖျက်</string>
+ <string name="dlg_progress_title">ရှာဖွေရန်</string>
+ <string name="dlg_progress_text">ချန်နယ်များကို ရှာရန်…</string>
+ <string name="dlg_addedit_station_name">အမည်-</string>
+ <string name="dlg_addedit_station_freq">ကြိမ်နှုန်း-</string>
+ <string name="dlg_addedit_title_edit">ချန်နယ်ကို တည်းဖြတ်ရန်</string>
+ <string name="default_station_name">ချန်နယ်အသစ်</string>
+ <string name="dlg_delete_confirm_title">အနှစ်သက်ဆုံးများမှ ဖယ်ရှားရန် အတည်ပြုပါ</string>
+ <string name="dlg_delete_confirm_text">အနှစ်သက်ဆုံးများမှ ဤချန်နယ်ကို သင်ဖယ်ရှားလိုသည်မှာ သေချာပါသလား။</string>
+ <string name="toast_favorite_full">ပြည့်နေသောကြောင့် အနှစ်သက်ဆုံးစာရင်းထဲ့သို့ ချန်နယ်ကို ထပ်မထည့်နိုင်ပါ။</string>
+ <string name="toast_already_favorite">ဤချန်နယ်သည် အနှစ်သက်ဆုံးစာရင်းထဲတွင် ရှိပြီးဖြစ်သည်</string>
+ <string name="toast_channel_deleted">အနှစ်သက်ဆုံးများမှ အောင်မြင်စွာ ဖယ်ရှားပြီးဖြစ်သည်။</string>
+ <string name="toast_channel_added">အနှစ်သက်ဆုံးများထဲသို့ အောင်မြင်စွာ ထည့်ပြီးဖြစ်သည်။</string>
+ <string name="toast_channel_searched">ရနိုင်သော ချန်နယ်များကို ရှာခဲ့သည်-</string>
+ <string name="toast_cannot_search">ရနိုင်သော ချန်နယ်များကို မရှာနိုင်ခဲ့ပါ-</string>
+ <string name="toast_invalid_frequency">လက်ရှိနေရာအတွက် ကြိမ်နှုန်း မမှန်ပါ။ မှန်ကန်သော အတိုင်းအတာ- ၈၇.၅-၁၀၈.၀</string>
+ <string name="toast_invalid_input">ထည့်သွင်းမှု မမှန်ကန်ပါ၊ မှန်ကန်သော တန်ဖိုးမှာ ၀ သို့မဟုတ် ၅။</string>
+ <string name="optmenu_rds_settings">RDS ဆက်တင်များ</string>
+ <string name="dlg_rds_settings_channel_information">ချန်နယ်အချက်အလက်များ</string>
+ <string name="dlg_rds_settings_alternative_frequency">အခြား ကြိမ်နှုန်း</string>
+ <string name="sound_mode">အသံနည်းစနစ်</string>
+ <string name="more">နောက်ထပ်</string>
+ <string name="power">ထပ်ကိန်း</string>
+ <string name="edit_frequency_overwrite_text">ထပ်ရေးရန်</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">ရေဒီယို အန်တီနာတစ်ခုအဖြစ် သုံးရန် သင့် နားကြပ်များကို တပ်ဆင်ပါ။</string>
+ <string name="fm_recorder_name">FM အသံဖမ်းစက်</string>
+ <string name="toast_recording_lost_warning">SD ဖယ်ရှားမှုကြောင့် သင်၏ အသံဖမ်းခြင်းသည် ပျောက်ဆုံးသွားလိမ့်မည်။</string>
+ <string name="toast_start_recording">အသံဖမ်းခြင်း စတင်ရန်</string>
+ <string name="toast_sdcard_missing">သင်၏ SD ကတ် ပျောက်နေသည်။</string>
+ <string name="toast_sdcard_insufficient_space">SD ကတ်နေရာလွတ် မလုံလောက်ပါ။</string>
+ <string name="toast_recorder_internal_error">အသံဖမ်းစက်တွင် အတွင်းပိုင်း ပြဿနာတစ်ခု ဖြစ်သည်။</string>
+ <string name="toast_player_internal_error">ဖွင့်စက်တွင် အတွင်းပိုင်း ပြဿနာတစ်ခု ဖြစ်သည်။</string>
+ <string name="toast_powerup_before_record_warning">FM ကို ဦးစွာ ဖွင့်ပါ။</string>
+ <string name="optmenu_record">FM ကို မှတ်တမ်းတင်ရန်</string>
+ <string name="btn_save_recording">သိမ်းရန်</string>
+ <string name="btn_discard_recording">စွန့်ပစ်ရန်</string>
+ <string name="edit_recording_name_hint">ဤနေရာတွင် ဖိုင်အမည်ကို ရေးသွင်းပါ</string>
+ <string name="dlg_save_recording_title">အသံဖမ်းနေသောဖိုင်ကို သိမ်းရန်</string>
+ <string name="dlg_save_recording_storage_warning">သိမ်းဆည်းနေရာ မလုံလောက်ပါ။ လက်ရှိအသံဖမ်းမှုကို သိမ်းလိုပါသလား။</string>
+ <string name="already_exists">ရှိပြီးဖြစ်သည်</string>
+ <string name="toast_in_call">သင်ဖုန်းခေါ်ဆိုနေစဉ် FM ရေဒီယိုဖွင့်၍မရပါ။</string>
+ <string name="empty_list">လိုင်းစာရင်းမှာ ဗလာဖြစ်နေသည်။</string>
+ <string name="optmenu_speaker">စပီကာ</string>
+ <string name="optmenu_earphone">နားကြပ်</string>
+ <string name="not_available">လောလောဆယ် မရနိုင်ပါ</string>
+ <string name="add_to_favorite1">ကြိုတင်သတ်မှတ်ထားသော ချန်နယ်များထဲသို့ ထည့်ရန်</string>
+ <string name="contmenu_item_delete1">ကြိုတင်သတ်မှတ်ထားသော ချန်နယ်များထဲမှ ဖယ်ရှားရန်</string>
+ <string name="dlg_delete_confirm_title1">ကြိုတင်သတ်မှတ်ထားသော ချန်နယ်များမှ ဖယ်ရှားရန် အတည်ပြုပါ</string>
+ <string name="dlg_delete_confirm_text1">ကြိုတင်သတ်မှတ်ထားသော ချန်နယ်များမှ ဤချန်နယ်ကို သင်ဖယ်ရှားလိုသည်မှာ သေချာပါသလား။</string>
+ <string name="toast_favorite_full1">ပြည့်နေသောကြောင့် ကြိုတင်သတ်မှတ်ထားသော ချန်နယ်စာရင်းထဲ့သို့ ချန်နယ်ကို ထပ်မထည့်နိုင်ပါ။</string>
+ <string name="toast_already_favorite1">ဤချန်နယ်သည် ကြိုတင်သတ်မှတ်ထားသော ချန်နယ်စာရင်းထဲတွင် ရှိပြီးဖြစ်သည်</string>
+ <string name="toast_channel_deleted1">ကြိုတင်သတ်မှတ်ထားသော ချန်နယ်များမှ အောင်မြင်စွာ ဖယ်ရှားပြီးဖြစ်သည်။</string>
+ <string name="toast_channel_added1">ကြိုတင်သတ်မှတ်ထားသော ချန်နယ်များထဲသို့ အောင်မြင်စွာ ထည့်ပြီးဖြစ်သည်။</string>
+</resources>
diff --git a/MediaTek/FmRadio/res/values-my-rZG/strings.xml b/MediaTek/FmRadio/res/values-my-rZG/strings.xml
new file mode 100755
index 0000000..0735d62
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-my-rZG/strings.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="app_name">FM ေရဒီယို</string>
+ <string name="favorite_manager">ခ်န္နယ္ စာရင္း</string>
+ <string name="add_to_favorite">အႏွစ္သက္ဆံုးထဲသို႔ ထည့္ရန္</string>
+ <string name="add_to_favorite1">ႀကိဳတင္ သတ္မွတ္ထားေသာ ခ်န္နယ္မ်ားထဲသို႔ ထည့္ရန္</string>
+ <string name="optmenu_search">ရွာေဖြပါ</string>
+ <string name="optmenu_exit">ထြက္ပါ</string>
+ <string name="contmenu_title">လုပ္ငန္းမ်ား</string>
+ <string name="contmenu_item_edit">တည္းျဖတ္ပါ</string>
+ <string name="contmenu_item_delete">အႏွစ္သက္ဆံုးမ်ားမွ ဖယ္ရွားရန္</string>
+ <string name="contmenu_item_delete1">ႀကိဳတင္ သတ္မွတ္ထားေသာ ခ်န္နယ္မ်ားထဲမွ ဖယ္ရွားရန္</string>
+ <string name="dlg_noantenna_text">ဧရိယာတိုင္အျဖစ္ နားၾကပ္လိုအပ္သည္။ သင့္နားၾကပ္ ႀကိဳးတပ္ပါ။</string>
+ <string name="dlg_noantenna_title">နားၾကပ္ကို တပ္လိုက္ပါ</string>
+ <string name="btn_yes">ဟုတ္ပါသည္</string>
+ <string name="btn_no">မဟုတ္ပါ</string>
+ <string name="btn_ok">အိုေက</string>
+ <string name="btn_cancel">မလုပ္ပါ</string>
+ <string name="dlg_progress_title">ရွာေဖြပါ</string>
+ <string name="dlg_progress_text">ခ်န္နယ္မ်ားကို ရွာရန္…</string>
+ <string name="dlg_addedit_station_name">အမည္-</string>
+ <string name="dlg_addedit_station_freq">ႀကိမ္ႏႈန္း-</string>
+ <string name="dlg_addedit_title_edit">ခ်န္နယ္ကို တည္းျဖတ္ပါ</string>
+ <string name="default_station_name">ခ်န္နယ္အသစ္</string>
+ <string name="dlg_delete_confirm_title">အႏွစ္သက္ဆံုးမ်ားမွ ဖယ္ရွားရန္ အတည္ျပဳပါ</string>
+ <string name="dlg_delete_confirm_title1">ႀကိဳတင္ သတ္မွတ္ထားေသာ ခ်န္နယ္မ်ားမွ ဖယ္ရွားရန္ အတည္ျပဳပါ</string>
+ <string name="dlg_delete_confirm_text">အႏွစ္သက္ဆံုးမ်ားမွ ဤခ်န္နယ္ကို သင္ဖယ္ရွားလိုသည္မွာ ေသခ်ာပါသလား။</string>
+ <string name="dlg_delete_confirm_text1">ႀကိဳတင္သတ္မွတ္ထားေသာ ခ်န္နယ္မ်ားမွ ဤခ်န္နယ္ကို သင္ဖယ္ရွားလိုသည္မွာ ေသခ်ာပါသလား။</string>
+ <string name="toast_favorite_full">ျပည့္ေနေသာေၾကာင့္ အႏွစ္သက္ဆံုး စာရင္းထဲသို႔ ခ်န္နယ္ကို ထပ္မထည့္ႏိုင္ပါ။</string>
+ <string name="toast_favorite_full1">ျပည့္ေနေသာေၾကာင့္ ႀကိဳတင္ သတ္မွတ္ထားေသာ ခ်န္နယ္စာရင္းထဲ့သို႔ ခ်န္နယ္ကို ထပ္မထည့္ႏိုင္ပါ။</string>
+ <string name="toast_already_favorite">ဤခ်န္နယ္သည္ အႏွစ္သက္ဆံုး စာရင္းထဲတြင္ ရွိၿပီးျဖစ္သည္။</string>
+ <string name="toast_already_favorite1">ဤခ်န္နယ္သည္ ႀကိဳတင္ သတ္မွတ္ထားေသာ ခ်န္နယ္စာရင္းထဲတြင္ ရွိၿပီးျဖစ္သည္။</string>
+ <string name="toast_channel_deleted">အႏွစ္သက္ဆံုးမ်ားမွ ေအာင္ျမင္စြာ ဖယ္ရွားၿပီးျဖစ္သည္။</string>
+ <string name="toast_channel_deleted1">ႀကိဳတင္ သတ္မွတ္ထားေသာ ခ်န္နယ္မ်ားမွ ေအာင္ျမင္စြာ ဖယ္ရွားၿပီးျဖစ္သည္။</string>
+ <string name="toast_channel_added">အႏွစ္သက္ဆံုးမ်ားထဲသို႔ ေအာင္ျမင္စြာ ထည့္ၿပီးျဖစ္သည္။</string>
+ <string name="toast_channel_added1">ႀကိဳတင္ သတ္မွတ္ထားေသာ ခ်န္နယ္မ်ားထဲသို႔ ေအာင္ျမင္စြာ ထည့္ၿပီးျဖစ္သည္။</string>
+ <string name="toast_channel_searched">ရႏိုင္ေသာ ခ်န္နယ္မ်ားကို ရွာခဲ့သည္-</string>
+ <string name="toast_cannot_search">ရႏိုင္ေသာ ခ်န္နယ္မ်ားကို မရွာႏိုင္ခဲ့ပါ-</string>
+ <string name="toast_invalid_frequency">လက္ရွိေနရာအတြက္ ႀကိမ္ႏႈန္း မမွန္ပါ။ မွန္ကန္ေသာ အတိုင္းအတာ- ၈၇.၅-၁၀၈.ဝ</string>
+ <string name="toast_invalid_input">ထည့္သြင္းမႈ မမွန္ကန္ပါ၊ မွန္ကန္ေသာ တန္ဖိုးမွာ ဝ သို႔မဟုတ္ ၅။</string>
+ <string name="optmenu_rds_settings">RDS ဆက္တင္မ်ား</string>
+ <string name="dlg_rds_settings_channel_information">ခ်န္နယ္ အခ်က္အလက္မ်ား</string>
+ <string name="dlg_rds_settings_alternative_frequency">အျခား ႀကိမ္ႏႈန္း</string>
+ <string name="sound_mode">အသံနည္းစနစ္</string>
+ <string name="more">ေနာက္ထပ္</string>
+ <string name="power">ထပ္ကိန္း</string>
+ <string name="toast_in_call">သင္ဖုန္းေခၚဆိုေနစဥ္ FM ေရဒီယိုဖြင့္၍မရပါ။</string>
+ <string name="empty_list">လိုင္းစာရင္းမွာ ဗလာျဖစ္ေနသည္။</string>
+ <string name="edit_frequency_overwrite_text">ထပ္ေရးရန္</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">နားၾကပ္ကို တပ္လိုက္ပါ</string>
+ <string name="fm_recorder_name">FM အသံဖမ္းစက္</string>
+ <string name="toast_recording_lost_warning">SD ဖယ္ရွားမႈေၾကာင့္ သင္၏ အသံဖမ္းျခင္းသည္ ဆုံး႐ႈံးသြားလိမ့္မည္။</string>
+ <string name="toast_start_recording">အသံဖမ္းျခင္း စတင္ရန္</string>
+ <string name="toast_sdcard_missing">သင္၏ SD ကတ္ ေပ်ာက္ေနသည္။</string>
+ <string name="toast_sdcard_insufficient_space">SD ကတ္ေနရာလြတ္ မလံုေလာက္ပါ။</string>
+ <string name="toast_recorder_internal_error">အသံဖမ္းစက္တြင္ အတြင္းပိုင္း ျပႆနာတစ္ခု ျဖစ္သည္။</string>
+ <string name="toast_player_internal_error">ဖြင့္စက္တြင္ အတြင္းပိုင္း ျပႆနာတစ္ခု ျဖစ္သည္။</string>
+ <string name="toast_powerup_before_record_warning">FM ကို ဦးစြာ ဖြင့္ပါ။</string>
+ <string name="optmenu_record">FM ကို မွတ္တမ္းတင္ရန္</string>
+ <string name="btn_save_recording">သိမ္းဆည္းပါ</string>
+ <string name="btn_discard_recording">ျဖဳတ္ခ်ပါ</string>
+ <string name="edit_recording_name_hint">ဤေနရာတြင္ ဖိုင္အမည္ကို ေရးသြင္းပါ</string>
+ <string name="dlg_save_recording_title">အသံဖမ္းေနေသာဖိုင္ကို သိမ္းရန္</string>
+ <string name="dlg_save_recording_storage_warning">သိမ္းဆည္းေနရာ မလံုေလာက္ပါ။ လက္ရွိအသံဖမ္းမႈကို သိမ္းလိုပါသလား။</string>
+ <string name="already_exists">ရွိၿပီးျဖစ္သည္</string>
+ <string name="optmenu_speaker">စပီကာ</string>
+ <string name="optmenu_earphone">နားၾကပ္</string>
+ <string name="not_available">ေလာေလာဆယ္ မရႏိုင္ပါ</string>
+</resources>
diff --git a/MediaTek/FmRadio/res/values-nb/strings.xml b/MediaTek/FmRadio/res/values-nb/strings.xml
new file mode 100755
index 0000000..7082e10
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-nb/strings.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">FM-radio</string>
+ <string name="favorite_manager">Kanalliste</string>
+ <string name="add_to_favorite">Legg til favoritt</string>
+ <string name="optmenu_search">Søk</string>
+ <string name="optmenu_exit">Avslutt</string>
+ <string name="contmenu_title">Operasjoner</string>
+ <string name="contmenu_item_edit">Rediger</string>
+ <string name="contmenu_item_delete">Fjern fra favoritter</string>
+ <string name="dlg_noantenna_text">Du må bruke en øretelefon som antenne. Plugg inn øretelefoner.</string>
+ <string name="dlg_noantenna_title">Plugg inn øretelefon</string>
+ <string name="btn_yes">"Ja"</string>
+ <string name="btn_no">"Nei"</string>
+ <string name="btn_ok">OK</string>
+ <string name="btn_cancel">Avbryt</string>
+ <string name="dlg_progress_title">Søk</string>
+ <string name="dlg_progress_text">Søk etter kanaler …</string>
+ <string name="dlg_addedit_station_name">Navn:</string>
+ <string name="dlg_addedit_station_freq">Frekvens:</string>
+ <string name="dlg_addedit_title_edit">Rediger kanal</string>
+ <string name="default_station_name">Ny kanal</string>
+ <string name="dlg_delete_confirm_title">Bekreft fjerning fra favoritter</string>
+ <string name="dlg_delete_confirm_text">Er du sikker på at du vil fjerne denne kanalen fra favoritter?</string>
+ <string name="toast_favorite_full">Kan ikke legge til kanalen i favorittlisten, da listen er full.</string>
+ <string name="toast_already_favorite">Kanalen er allerede i favorittlisten.</string>
+ <string name="toast_channel_deleted">Kanalen ble fjernet fra favoritter.</string>
+ <string name="toast_channel_added">Kanalen ble lagt til i favoritter.</string>
+ <string name="toast_channel_searched">Fant tilgjengelige kanaler:</string>
+ <string name="toast_cannot_search">Kan ikke finne tilgjengelige kanal.</string>
+ <string name="toast_invalid_frequency">Ugyldig frekvens for gjeldende plassering. Gyldig frekvensomfang: 87,5–108,0</string>
+ <string name="toast_invalid_input">Ugyldige inndata. Gyldig verdi er 0 eller 5.</string>
+ <string name="optmenu_rds_settings">RDS-innstillinger</string>
+ <string name="dlg_rds_settings_channel_information">Kanalinformasjon</string>
+ <string name="dlg_rds_settings_alternative_frequency">Alternativ frekvens</string>
+ <string name="sound_mode">Lydmodus</string>
+ <string name="more">"Mer"</string>
+ <string name="power">"potens"</string>
+ <string name="toast_in_call">Du kan ikke starte FM-radio når du er i en samtale.</string>
+ <string name="empty_list">Kanallisten er tom.</string>
+ <string name="edit_frequency_overwrite_text">Overskriv</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">Plugg inn øretelefonene for å bruke som en radioantenne.</string>
+ <string name="fm_recorder_name">FM-opptaker</string>
+ <string name="toast_recording_lost_warning">Opptaket vil gå tapt på grunn av fjerning av SD!</string>
+ <string name="toast_start_recording">Start opptak …</string>
+ <string name="toast_sdcard_missing">SD-kortet mangler!</string>
+ <string name="toast_sdcard_insufficient_space">Utilstrekkelig plass på SD-kort!</string>
+ <string name="toast_recorder_internal_error">Det oppstod en intern feil i opptaker!</string>
+ <string name="toast_player_internal_error">Det oppstod en intern feil i spiller!</string>
+ <string name="toast_powerup_before_record_warning">Slå på FM først!</string>
+ <string name="optmenu_record">Ta opp FM</string>
+ <string name="btn_save_recording">"Lagre"</string>
+ <string name="btn_discard_recording">Forkast</string>
+ <string name="edit_recording_name_hint">Skriv inn filnavnet her</string>
+ <string name="dlg_save_recording_title">Lagre opptaksfil</string>
+ <string name="dlg_save_recording_storage_warning">Utilstrekkelig plass! Vil du lagre dette opptaket?</string>
+ <string name="already_exists">finnes allerede</string>
+ <string name="optmenu_speaker">Hoyttaler</string>
+ <string name="optmenu_earphone">Hodetelefon</string>
+ <string name="not_available">Ikke tilgjengelig for øyeblikket</string>
+ <string name="add_to_favorite1">Legg til forhåndsinnstilte kanaler</string>
+ <string name="contmenu_item_delete1">Fjern fra forhåndsinnstilte kanaler</string>
+ <string name="dlg_delete_confirm_title1">Bekreft fjerning fra forhåndsinnstilte kanaler</string>
+ <string name="dlg_delete_confirm_text1">Er du sikker på at du vil fjerne denne kontoen fra forhåndsinnstilte kanaler?</string>
+ <string name="toast_favorite_full1">Kan ikke legge til kanalen i liste over forhåndsinnstilte kanaler, da listen er full.</string>
+ <string name="toast_already_favorite1">Kanalen er allerede i listen over forhåndsinnstilte kanaler.</string>
+ <string name="toast_channel_deleted1">Kanalen ble fjernet fra forhåndsinnstilte kanaler.</string>
+ <string name="toast_channel_added1">Kanalen ble lagt til i forhåndsinnstilte kanaler.</string>
+</resources> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/values-nl/strings.xml b/MediaTek/FmRadio/res/values-nl/strings.xml
new file mode 100755
index 0000000..d176812
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-nl/strings.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name">FM-radio</string>
+ <string name="favorite_manager">Kanalenlijst</string>
+ <string name="add_to_favorite">Toevoegen aan favorieten</string>
+ <string name="optmenu_search">Zoeken</string>
+ <string name="optmenu_exit">Afsluiten</string>
+ <string name="contmenu_title">Bewerkingen</string>
+ <string name="contmenu_item_edit">Bewerken</string>
+ <string name="contmenu_item_delete">Uit favorieten verwijderen</string>
+ <string name="dlg_noantenna_text">U hebt een oortelefoon nodig als antenne. Sluit de oortelefoon aan.</string>
+ <string name="dlg_noantenna_title">Oortelefoon aansluiten</string>
+ <string name="btn_yes">Ja</string>
+ <string name="btn_no">Nee</string>
+ <string name="btn_ok">OK</string>
+ <string name="btn_cancel">Annuleren</string>
+ <string name="dlg_progress_title">Scannen</string>
+ <string name="dlg_progress_text">Kanalen scannen…</string>
+ <string name="dlg_addedit_station_name">Naam:</string>
+ <string name="dlg_addedit_station_freq">Frequentie:</string>
+ <string name="dlg_addedit_title_edit">Kanaal bewerken</string>
+ <string name="default_station_name">Nieuw kanaal</string>
+ <string name="dlg_delete_confirm_title">Verwijderen kanaal bevestigen</string>
+ <string name="dlg_delete_confirm_text">Weet u zeker dat u dit kanaal wilt verwijderen?</string>
+ <string name="toast_favorite_full">Kan het kanaal niet toevoegen aan de lijst met favorieten omdat deze vol is.</string>
+ <string name="toast_already_favorite">Dit kanaal staat al in de favorietenlijst.</string>
+ <string name="toast_channel_deleted">Verwijderen uit favorieten geslaagd.</string>
+ <string name="toast_channel_added">Toevoegen aan favorieten geslaagd.</string>
+ <string name="toast_channel_searched">Gezocht in beschikbare kanalen:</string>
+ <string name="toast_cannot_search">Kan beschikbaar kanaal niet uitzoeken:</string>
+ <string name="optmenu_rds_settings">RDS-instellingen</string>
+ <string name="dlg_rds_settings_channel_information">Kanaalinformatie</string>
+ <string name="dlg_rds_settings_alternative_frequency">Alternatieve frequentie</string>
+ <string name="more">Meer toepassingen</string>
+ <string name="power">macht</string>
+ <string name="sound_mode">Geluidsmodus</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">Sluit de oortelefoon aan om als radio-antenne te gebruiken.</string>
+ <!-- For FM recording -->
+ <string name="edit_frequency_overwrite_text">"Overschrijven"</string>
+ <string name="fm_recorder_name">FM-recorder</string>
+ <string name="toast_recording_lost_warning">Uw opname gaat verloren doordat de SD-kaart is verwijderd!</string>
+ <string name="toast_start_recording">Opname start…</string>
+ <string name="toast_sdcard_missing">SD-kaart ontbreekt.</string>
+ <string name="toast_sdcard_insufficient_space">Onvoldoende ruimte op SD-kaart!</string>
+ <string name="toast_recorder_internal_error">In de recorder is een interne fout opgetreden!</string>
+ <string name="toast_player_internal_error">In de speler is een interne fout opgetreden!</string>
+ <string name="toast_powerup_before_record_warning">Schakel eerst FM in!</string>
+ <string name="optmenu_record">FM opnemen</string>
+ <string name="btn_save_recording">Opslaan</string>
+ <string name="btn_discard_recording">Verwijderen</string>
+ <string name="edit_recording_name_hint">Typ hier de bestandsnaam</string>
+ <string name="dlg_save_recording_title">Opnamebestand opslaan</string>
+ <string name="dlg_save_recording_storage_warning">Onvoldoende opslagruimte! Wilt u de huidige opname opslaan?</string>
+ <string name="already_exists">bestaat al</string>
+ <string name="toast_invalid_frequency">Ongeldige frequentie voor huidige locatie. Geldig frequentiebereik: 87,5-108,0.</string>
+ <string name="toast_invalid_input">De laatste invoer is ongeldig, geldige waarde is 0 of 5.</string>
+ <string name="toast_in_call">U kunt FM-radio niet starten terwijl u een telefoongesprek voert.</string>
+ <string name="empty_list">Lijst met zenders is leeg.</string>
+ <string name="optmenu_speaker">"Luidspreker"</string>
+ <string name="optmenu_earphone">Kuulokkeet</string>
+ <string name="not_available">Momenteel niet beschikbaar</string>
+ <string name="add_to_favorite1">Aan vooringestelde kanalen toevoegen</string>
+ <string name="contmenu_item_delete1">Uit vooringestelde kanalen verwijderen</string>
+ <string name="dlg_delete_confirm_title1">Verwijderen uit vooringestelde kanalen bevestigen</string>
+ <string name="dlg_delete_confirm_text1">Wilt u werkelijk dit kanaal uit vooringestelde kanalen verwijderen?</string>
+ <string name="toast_favorite_full1">Kan het kanaal niet toevoegen aan de lijst met vooringestelde kanalen omdat deze vol is.</string>
+ <string name="toast_already_favorite1">Dit kanaal bevindt zich reeds in de lijst met vooringestelde kanalen.</string>
+ <string name="toast_channel_deleted1">Uit vooringestelde kanalen verwijderd.</string>
+ <string name="toast_channel_added1">Aan vooringestelde kanalen toegevoegd.</string>
+</resources>
+
diff --git a/MediaTek/FmRadio/res/values-pl/strings.xml b/MediaTek/FmRadio/res/values-pl/strings.xml
new file mode 100755
index 0000000..098e1ea
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-pl/strings.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">Radio FM</string>
+ <string name="favorite_manager">Lista kanałów</string>
+ <string name="add_to_favorite">Dodaj do ulubionych</string>
+ <string name="optmenu_search">Wyszukaj</string>
+ <string name="optmenu_exit">Zakończ</string>
+ <string name="contmenu_title">Operacje</string>
+ <string name="contmenu_item_edit">Edytuj</string>
+ <string name="contmenu_item_delete">Usuń z ulubionych</string>
+ <string name="dlg_noantenna_text">Potrzebna jest antena w postaci słuchawek. Podłącz słuchawki.</string>
+ <string name="dlg_noantenna_title">Podłącz słuchawki</string>
+ <string name="btn_yes">"Tak"</string>
+ <string name="btn_no">"Nie"</string>
+ <string name="btn_ok">OK</string>
+ <string name="btn_cancel">Anuluj</string>
+ <string name="dlg_progress_title">Wyszukaj</string>
+ <string name="dlg_progress_text">Trwa wyszukiwanie kanałów...</string>
+ <string name="dlg_addedit_station_name">Nazwa:</string>
+ <string name="dlg_addedit_station_freq">Częstotliwość:</string>
+ <string name="dlg_addedit_title_edit">Edytuj kanał</string>
+ <string name="default_station_name">Nowy kanał</string>
+ <string name="dlg_delete_confirm_title">Potwierdź usunięcie z ulubionych</string>
+ <string name="dlg_delete_confirm_text">Czy na pewno chcesz usunąć ten kanał z ulubionych?</string>
+ <string name="toast_favorite_full">Nie można dodać kanału do listy ulubionych, ponieważ została ona zapełniona.</string>
+ <string name="toast_already_favorite">Kanał ten znajduje się już na liście ulubionych.</string>
+ <string name="toast_channel_deleted">Pomyślnie usunięto z ulubionych.</string>
+ <string name="toast_channel_added">Pomyślnie dodano do ulubionych.</string>
+ <string name="toast_channel_searched">Wyszukano dostępne kanały:</string>
+ <string name="toast_cannot_search">Nie można wyszukać dostępnych kanałów.</string>
+ <string name="toast_invalid_frequency">Nieprawidłowa częstotliwość dla bieżącej lokalizacji. Prawidłowy zakres częstotliwości: 87,5–108,0</string>
+ <string name="toast_invalid_input">Ostatni wpis jest nieprawidłowy; prawidłowa wartość to 0 lub 5.</string>
+ <string name="optmenu_rds_settings">Ustawienia RDS</string>
+ <string name="dlg_rds_settings_channel_information">Informacje o kanale</string>
+ <string name="dlg_rds_settings_alternative_frequency">Częstotliwość alternatywna</string>
+ <string name="sound_mode">Tryb dźwięku</string>
+ <string name="more">"Więcej"</string>
+ <string name="power">"do potęgi"</string>
+ <string name="toast_in_call">Nie można włączyć radia FM podczas trwania rozmowy telefonicznej.</string>
+ <string name="empty_list">Lista kanałów jest pusta.</string>
+ <string name="edit_frequency_overwrite_text">Zastąp</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">Podłącz słuchawki, aby móc ich używać jako anteny radiowej.</string>
+ <string name="fm_recorder_name">Rejestrator FM</string>
+ <string name="toast_recording_lost_warning">Nagranie zostanie utracone z powodu wyjęcia karty SD!</string>
+ <string name="toast_start_recording">Trwa rozpoczynanie nagrywania...</string>
+ <string name="toast_sdcard_missing">Brak karty SD!</string>
+ <string name="toast_sdcard_insufficient_space">Za mało miejsca na karcie SD!</string>
+ <string name="toast_recorder_internal_error">Wystąpił błąd wewnętrzny w rejestratorze!</string>
+ <string name="toast_player_internal_error">Wystąpił błąd wewnętrzny w odtwarzaczu!</string>
+ <string name="toast_powerup_before_record_warning">Włącz najpierw tryb FM!</string>
+ <string name="optmenu_record">Nagrywaj w paśmie FM</string>
+ <string name="btn_save_recording">"Zapisz"</string>
+ <string name="btn_discard_recording">Odrzuć</string>
+ <string name="edit_recording_name_hint">Wpisz tutaj nazwę pliku</string>
+ <string name="dlg_save_recording_title">Zapisz plik nagrania</string>
+ <string name="dlg_save_recording_storage_warning">Za mało miejsca w pamięci! Czy chcesz zapisać bieżące nagranie?</string>
+ <string name="already_exists">już istnieje</string>
+ <string name="optmenu_speaker">Głośnik</string>
+ <string name="optmenu_earphone">Słuchawki</string>
+ <string name="not_available">Obecnie niedostępne</string>
+ <string name="add_to_favorite1">Dodaj do ustawionych wstępnie kanałów</string>
+ <string name="contmenu_item_delete1">Usuń z ustawionych wstępnie kanałów</string>
+ <string name="dlg_delete_confirm_title1">Potwierdź usunięcie z ustawionych wstępnie kanałów</string>
+ <string name="dlg_delete_confirm_text1">Czy na pewno chcesz usunąć ten kanał z ustawionych wstępnie kanałów?</string>
+ <string name="toast_favorite_full1">Nie można dodać kanału do listy ustawionych wstępnie kanałów, ponieważ została ona zapełniona.</string>
+ <string name="toast_already_favorite1">Kanał ten znajduje się już na liście ustawionych wstępnie kanałów.</string>
+ <string name="toast_channel_deleted1">Pomyślnie usunięto z ustawionych wstępnie kanałów.</string>
+ <string name="toast_channel_added1">Pomyślnie dodano do ustawionych wstępnie kanałów.</string>
+</resources> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/values-pt-rPT/strings.xml b/MediaTek/FmRadio/res/values-pt-rPT/strings.xml
new file mode 100755
index 0000000..9c6edce
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-pt-rPT/strings.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name">Rádio FM</string>
+ <string name="favorite_manager">Lista de canais</string>
+ <string name="add_to_favorite">Adicionar a Favorito</string>
+ <string name="optmenu_search">Procurar</string>
+ <string name="optmenu_exit">Exit</string>
+ <string name="contmenu_title">Operações</string>
+ <string name="contmenu_item_edit">Editar</string>
+ <string name="contmenu_item_delete">Remover dos favoritos</string>
+ <string name="dlg_noantenna_text">É necessário utilizar os auscultadores como antena. Ligue os auscultadores.</string>
+ <string name="dlg_noantenna_title">Plugar o fone de ouvido</string>
+ <string name="btn_yes">Sim</string>
+ <string name="btn_no">Não</string>
+ <string name="btn_ok">OK</string>
+ <string name="btn_cancel">Cancelar</string>
+ <string name="dlg_progress_title">Sintonizar</string>
+ <string name="dlg_progress_text">A pesquisar canais…</string>
+ <string name="dlg_addedit_station_name">Nome: </string>
+ <string name="dlg_addedit_station_freq">Frequência:</string>
+ <string name="dlg_addedit_title_edit">Editar Canal</string>
+ <string name="default_station_name">Novo Canal</string>
+ <string name="dlg_delete_confirm_title">Confirmar Exclusão do Canal</string>
+ <string name="dlg_delete_confirm_text">Você tem certeza que deseja excluir este canal?</string>
+ <string name="toast_favorite_full">Impossível adicionar o canal à lista de favoritos porque ela está cheia.</string>
+ <string name="toast_already_favorite">Esta canal já existe na lista de favoritos.</string>
+ <string name="toast_channel_deleted">Remoção dos favoritos efectuada com êxito.</string>
+ <string name="toast_channel_added">Adição aos favoritos efectuada com êxito.</string>
+ <string name="toast_channel_searched">Procurado nos canais disponíveis:</string>
+ <string name="toast_cannot_search">Impossível encontrar canal disponível.</string>
+ <string name="optmenu_rds_settings">Config. RDS</string>
+ <string name="dlg_rds_settings_channel_information">Info. do canal</string>
+ <string name="dlg_rds_settings_alternative_frequency">Freqüência alternativa</string>
+ <string name="more">Mais Aplicações</string>
+ <string name="power">expoente</string>
+ <string name="sound_mode">Modo de som</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">Ligue os seus auscultadores para os utilizar como antena de rádio.</string>
+ <!-- For FM recording -->
+ <string name="edit_frequency_overwrite_text">"Substituir"</string>
+ <string name="fm_recorder_name">Gravador FM</string>
+ <string name="toast_recording_lost_warning">A sua gravação irá perder-se devido à remoção do cartão SD!</string>
+ <string name="toast_start_recording">Iniciar gravação…</string>
+ <string name="toast_sdcard_missing">Não existe cartão SD!</string>
+ <string name="toast_sdcard_insufficient_space">Espaço insuficiente no cartão SD!</string>
+ <string name="toast_recorder_internal_error">Ocorreu um erro interno no gravador!</string>
+ <string name="toast_player_internal_error">Ocorreu um erro interno no leitor!</string>
+ <string name="toast_powerup_before_record_warning">Ligue primeiro o rádio FM!</string>
+ <string name="optmenu_record">Gravar FM</string>
+ <string name="btn_save_recording">Guardar</string>
+ <string name="btn_discard_recording">Rejeitar</string>
+ <string name="edit_recording_name_hint">Introduza aqui o nome do ficheiro</string>
+ <string name="dlg_save_recording_title">Guardar ficheiro de gravação</string>
+ <string name="dlg_save_recording_storage_warning">Espaço de armazenamento insuficiente! Deseja guardar a gravação actual?</string>
+ <string name="already_exists">já existe</string>
+ <string name="toast_invalid_frequency">Frequência inválida para local atual. Escopo de frequência válida: 87,5-108,0.</string>
+ <string name="toast_invalid_input">O último valor introduzido é inválido, o valor válido é 0 ou 5.</string>
+ <string name="toast_in_call">Não é possível utilizar o Rádio FM durante uma chamada.</string>
+ <string name="empty_list">A lista de canais está vazia.</string>
+ <string name="optmenu_speaker">"Altifalante"</string>
+ <string name="optmenu_earphone">Auricular</string>
+ <string name="not_available">Não disponível actualmente</string>
+ <string name="add_to_favorite1">Adicionar como canal predefinido</string>
+ <string name="contmenu_item_delete1">Remover de canais predefinidos</string>
+ <string name="dlg_delete_confirm_title1">Confirmar remoção de canais predefinidos</string>
+ <string name="dlg_delete_confirm_text1">Tem certeza que deseja remover este canal dos canais predefinidos?</string>
+ <string name="toast_favorite_full1">Impossível adicionar o canal à lista de canais predefinidos porque está cheia.</string>
+ <string name="toast_already_favorite1">Este canal já está na lista de canais predefinidos.</string>
+ <string name="toast_channel_deleted1">Removido com sucesso de canais predefinidos.</string>
+ <string name="toast_channel_added1">Adicionar om sucesso de canais predefinidos.</string>
+</resources>
+
diff --git a/MediaTek/FmRadio/res/values-pt/strings.xml b/MediaTek/FmRadio/res/values-pt/strings.xml
new file mode 100755
index 0000000..d2fc5ef
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-pt/strings.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">Transmissão FM</string>
+ <string name="favorite_manager">Canais</string>
+ <string name="add_to_favorite">Adicionar aos Favoritos</string>
+ <string name="optmenu_search">Pesquisar</string>
+ <string name="optmenu_exit">Sair</string>
+ <string name="contmenu_title">Operações</string>
+ <string name="contmenu_item_edit">Editar</string>
+ <string name="contmenu_item_delete">Remover</string>
+ <string name="dlg_noantenna_text">Você precisa de um fone de ouvido como antena. Conecte seu fone de ouvido.</string>
+ <string name="dlg_noantenna_title">Conectar o fone de ouvido</string>
+ <string name="btn_yes">Sim</string>
+ <string name="btn_no">Não</string>
+ <string name="btn_ok">OK</string>
+ <string name="btn_cancel">Cancelar</string>
+ <string name="dlg_progress_title">A procurar</string>
+ <string name="dlg_progress_text">procurar canais...</string>
+ <string name="dlg_addedit_station_name">Nome:</string>
+ <string name="dlg_addedit_station_freq">Frequencia:</string>
+ <string name="dlg_addedit_title_edit">Editar canal</string>
+ <string name="default_station_name">Novo canal</string>
+ <string name="dlg_delete_confirm_title">Confirmar Exclusão de Canal</string>
+ <string name="dlg_delete_confirm_text">Tem certeza de que deseja excluir este canal?</string>
+ <string name="toast_favorite_full">Impossível adicionar o canal para a lista de favoritos porque ela está cheia.</string>
+ <string name="toast_already_favorite">Este canal já está na lista de favoritos.</string>
+ <string name="toast_channel_deleted">O canal é excluído da lista de favoritos.</string>
+ <string name="toast_channel_added">O canal é adicionado para lista de favoritos.</string>
+ <string name="toast_channel_searched">Procurado nos canais disponíveis:</string>
+ <string name="toast_cannot_search">Impossível encontrar canal disponível.</string>
+ <string name="optmenu_rds_settings">Config. RDS</string>
+ <string name="dlg_rds_settings_channel_information">Info. do canal</string>
+ <string name="dlg_rds_settings_alternative_frequency">Freqüência alternativa</string>
+ <string name="more">Mais Aplicativos</string>
+ <string name="power">potência</string>
+ <string name="sound_mode">Modo de som</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">Conecte seus fones de ouvido para usar como uma antena de rádio.</string>
+ <!-- For FM recording -->
+ <string name="edit_frequency_overwrite_text">"Substituir"</string>
+ <string name="fm_recorder_name">Gravador FM</string>
+ <string name="toast_recording_lost_warning">Sua gravação será perdida devido à removação do SD!</string>
+ <string name="toast_start_recording">Iniciar gravação…</string>
+ <string name="toast_sdcard_missing">Seu cartão SD está faltando!</string>
+ <string name="toast_sdcard_insufficient_space">Espaço insuficiente no cartão SD!</string>
+ <string name="toast_recorder_internal_error">Um erro interno ocorreu no gravador!</string>
+ <string name="toast_player_internal_error">Um erro interno ocorreu no reprodutor!</string>
+ <string name="toast_powerup_before_record_warning">Ligue FM primeiro!</string>
+ <string name="optmenu_record">Gravar FM</string>
+ <string name="btn_save_recording">Salvar</string>
+ <string name="btn_discard_recording">Descartar</string>
+ <string name="edit_recording_name_hint">Digite o nome do arquivo aqui</string>
+ <string name="dlg_save_recording_title">Salvar arquivo de gravação</string>
+ <string name="dlg_save_recording_storage_warning">Armazenamento insuficiente! Deseja salvar a gravação atual?</string>
+ <string name="already_exists">Já existe</string>
+ <string name="toast_invalid_frequency">Frequência inválida para a localização actual. Intervalo de frequências válidas: 87,5-108,0.</string>
+ <string name="toast_invalid_input">A última entrada inválida, valor válido é 0 ou 5.</string>
+ <string name="toast_in_call">Você não pode iniciar a Rádio FM quando esá er chamada.</string>
+ <string name="empty_list">Lista de canal está vazia.</string>
+ <string name="optmenu_speaker">"Alto-falante"</string>
+ <string name="optmenu_earphone">Headset</string>
+ <string name="not_available">Atualmente indisponível</string>
+ <string name="add_to_favorite1">Adicionar aos canais predefinidos</string>
+ <string name="contmenu_item_delete1">Remover dos canais predefinidos</string>
+ <string name="dlg_delete_confirm_title1">Confirmar a remoção dos canais predefinidos</string>
+ <string name="dlg_delete_confirm_text1">Deseja realmente remover este canal dos canais predefinidos?</string>
+ <string name="toast_favorite_full1">Não é possível adicionar o canal à lista de canais predefinidos porque a lista está cheia.</string>
+ <string name="toast_already_favorite1">Este canal já se encontra na lista de canais predefinidos.</string>
+ <string name="toast_channel_deleted1">Removido com sucesso dos canais predefinidos.</string>
+ <string name="toast_channel_added1">Adicionado com sucesso aos canais predefinidos.</string>
+</resources>
diff --git a/MediaTek/FmRadio/res/values-ro/strings.xml b/MediaTek/FmRadio/res/values-ro/strings.xml
new file mode 100755
index 0000000..dfc986d
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-ro/strings.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">Radio FM</string>
+ <string name="favorite_manager">Listă canale</string>
+ <string name="add_to_favorite">Adăugare la Preferinţe</string>
+ <string name="optmenu_search">Căutare</string>
+ <string name="optmenu_exit">Ieşire</string>
+ <string name="contmenu_title">Operaţii</string>
+ <string name="contmenu_item_edit">Editare</string>
+ <string name="contmenu_item_delete">Eliminare din preferinţe</string>
+ <string name="dlg_noantenna_text">Aveţi nevoie de căşti, acestea acţionând pe post de antenă. Conectaţi căştile.</string>
+ <string name="dlg_noantenna_title">Conectare căşti</string>
+ <string name="btn_yes">Da</string>
+ <string name="btn_no">Nu</string>
+ <string name="btn_ok">OK</string>
+ <string name="btn_cancel">Revocare</string>
+ <string name="dlg_progress_title">Scanare</string>
+ <string name="dlg_progress_text">Scanare canale...</string>
+ <string name="dlg_addedit_station_name">Nume:</string>
+ <string name="dlg_addedit_station_freq">Frecvenţă:</string>
+ <string name="dlg_addedit_title_edit">Editare canal</string>
+ <string name="default_station_name">Canal nou</string>
+ <string name="dlg_delete_confirm_title">Confirmare eliminare din preferinţe</string>
+ <string name="dlg_delete_confirm_text">Sigur doriţi să eliminaţi acest canal din preferinţe?</string>
+ <string name="toast_favorite_full">Imposibil de adăugat canalul la lista de preferinţe deoarece aceasta este plină.</string>
+ <string name="toast_already_favorite">Canalul este deja în lista de preferinţe.</string>
+ <string name="toast_channel_deleted">Eliminarea din preferinţe a reuşit.</string>
+ <string name="toast_channel_added">Adăugarea la preferinţe a reuşit.</string>
+ <string name="toast_channel_searched">Canale disponibile căutate:</string>
+ <string name="toast_cannot_search">Imposibil de căutat canalul disponibil.</string>
+ <string name="toast_invalid_frequency">Frecvenţă nevalidă pentru locaţia curentă. Interval valid de frecvenţă: 87,5-108,0</string>
+ <string name="optmenu_rds_settings">Setări RDS</string>
+ <string name="dlg_rds_settings_channel_information">Informaţii canal</string>
+ <string name="dlg_rds_settings_alternative_frequency">Frecvenţă alternativă</string>
+ <string name="sound_mode">Mod sunet</string>
+ <string name="more">Mai multe aplicaţii</string>
+ <string name="power">putere</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">Conectaţi căştile pentru că acestea funcţionează pe post de antenă radio.</string>
+ <!-- For FM recording -->
+ <string name="edit_frequency_overwrite_text">"Suprascrieţi"</string>
+ <string name="fm_recorder_name">Înregistrator FM</string>
+ <string name="toast_recording_lost_warning">Înregistrarea dvs. se va pierde din cauza scoaterii cartelei SD!</string>
+ <string name="toast_start_recording">Pornire înregistrare...</string>
+ <string name="toast_sdcard_missing">Cartela SD lipseşte!</string>
+ <string name="toast_sdcard_insufficient_space">Spaţiu insuficient pe cartela SD!</string>
+ <string name="toast_recorder_internal_error">S-a produs o eroare internă în înregistrator!</string>
+ <string name="toast_player_internal_error">S-a produs o eroare internă în player!</string>
+ <string name="toast_powerup_before_record_warning">Mai întâi porniţi radioul FM!</string>
+ <string name="optmenu_record">Înregistrare FM</string>
+ <string name="btn_save_recording">Salvare</string>
+ <string name="btn_discard_recording">Renunţare</string>
+ <string name="edit_recording_name_hint">Tastaţi numele de fişier aici</string>
+ <string name="dlg_save_recording_title">Salvare fişier de înregistrare</string>
+ <string name="dlg_save_recording_storage_warning">Spaţiu de stocare insuficient! Doriţi să salvaţi înregistrarea curentă?</string>
+ <string name="already_exists">există deja</string>
+ <string name="toast_invalid_input">Ultima intrare nevalidă, valoarea validă este 0 sau 5.</string>
+ <string name="toast_in_call">Nu puteţi lansa aplicaţia de radio FM cât timp vă aflaţi într-un apel.</string>
+ <string name="empty_list">Lista de canale este goală.</string>
+ <string name="optmenu_speaker">"Difuzor"</string>
+ <string name="optmenu_earphone">Set cu căşti</string>
+ <string name="not_available">Indisponibil în prezent</string>
+ <string name="add_to_favorite1">Adăugaţi la canalele presetate</string>
+ <string name="contmenu_item_delete1">Eliminaţi din canalele presetate</string>
+ <string name="dlg_delete_confirm_title1">Confirmaţi eliminarea din canalele presetate</string>
+ <string name="dlg_delete_confirm_text1">Sigur doriţi să eliminaţi acest canal din canalele presetate?</string>
+ <string name="toast_favorite_full1">Imposibil de adăugat canalul la lista de canale presetate deoarece aceasta este plină.</string>
+ <string name="toast_already_favorite1">Canalul este deja în lista de canale presetate.</string>
+ <string name="toast_channel_deleted1">Eliminarea din canalele presetate a reuşit.</string>
+ <string name="toast_channel_added1">Adăugarea la canalele presetate a reuşit.</string>
+</resources>
diff --git a/MediaTek/FmRadio/res/values-ru/strings.xml b/MediaTek/FmRadio/res/values-ru/strings.xml
new file mode 100755
index 0000000..55d8e10
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-ru/strings.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">FM-станция</string>
+ <string name="favorite_manager">Список каналов</string>
+ <string name="add_to_favorite">Добавить в избранное</string>
+ <string name="optmenu_search">Поиск</string>
+ <string name="optmenu_exit">Выйти</string>
+ <string name="contmenu_title">Операции</string>
+ <string name="contmenu_item_edit">Изменить</string>
+ <string name="contmenu_item_delete">Удалить из избранного</string>
+ <string name="dlg_noantenna_text">Вам нужен головной телефон в роли антенны. Подключите головной телефон.</string>
+ <string name="dlg_noantenna_title">Подключите наушники</string>
+ <string name="btn_yes">Да </string>
+ <string name="btn_no">Нет</string>
+ <string name="btn_ok">OK</string>
+ <string name="btn_cancel">Отменить</string>
+ <string name="dlg_progress_title">Сканирование</string>
+ <string name="dlg_progress_text">Поиск каналов...</string>
+ <string name="dlg_addedit_station_name">Имя:</string>
+ <string name="dlg_addedit_station_freq">Частота:</string>
+ <string name="dlg_addedit_title_edit">Изменить станция</string>
+ <string name="default_station_name">Новая станция</string>
+ <string name="dlg_delete_confirm_title">Подтвердите удаление канала</string>
+ <string name="dlg_delete_confirm_text">Действительно удалить этот канал?</string>
+ <string name="toast_favorite_full">Невозможно добавить канал в список избранных, поскольку список полон.</string>
+ <string name="toast_already_favorite">Этот канал уже добавлен в список избранных.</string>
+ <string name="toast_channel_deleted">Удалено из папки избранного.</string>
+ <string name="toast_channel_added">Добавлено в избранное.</string>
+ <string name="toast_channel_searched">Найденные доступные каналы:</string>
+ <string name="toast_cannot_search">Не удается найти доступный канал.</string>
+ <string name="optmenu_rds_settings">Настройки RDS</string>
+ <string name="dlg_rds_settings_channel_information">Информация о канале</string>
+ <string name="dlg_rds_settings_alternative_frequency">Альтернативная частота</string>
+ <string name="more">Еще приложения</string>
+ <string name="power">в степени</string>
+ <string name="sound_mode">Звуковой режим</string>
+ <string name="fm_unit">МГц</string>
+ <string name="no_antenna_info">Подключите наушники для использования в качестве антенны.</string>
+ <!-- For FM recording -->
+ <string name="edit_frequency_overwrite_text">"Перезаписать"</string>
+ <string name="fm_recorder_name">FM-рекордер</string>
+ <string name="toast_recording_lost_warning">Запись будет утеряна из-за извлечения SD-карты!</string>
+ <string name="toast_start_recording">Запуск записи…</string>
+ <string name="toast_sdcard_missing">Отсутствует SD-карта!</string>
+ <string name="toast_sdcard_insufficient_space">Недостаточно места на SD-карте!</string>
+ <string name="toast_recorder_internal_error">Внутренняя ошибка в устройстве записи!</string>
+ <string name="toast_player_internal_error">Внутренняя ошибка в плеере!</string>
+ <string name="toast_powerup_before_record_warning">Сначала включите FM-приемник!</string>
+ <string name="optmenu_record">Записать с FM-диапазона</string>
+ <string name="btn_save_recording">Сохранить</string>
+ <string name="btn_discard_recording">Аннулировать</string>
+ <string name="edit_recording_name_hint">Введите имя файла</string>
+ <string name="dlg_save_recording_title">Сохранить файл записи</string>
+ <string name="dlg_save_recording_storage_warning">Недостаточно памяти! Сохранить текущую запись?</string>
+ <string name="already_exists">Уже существует</string>
+ <string name="toast_invalid_frequency">Недопустимая частота для текущего положения. Диапазон допустимых частот: 87,5-108,0.</string>
+ <string name="toast_invalid_input">Последний неверный ввод, допустимое значение 0 или 5.</string>
+ <string name="toast_in_call">Во время вызова нельзя включить FM-радио.</string>
+ <string name="empty_list">Список каналов пуст.</string>
+ <string name="optmenu_speaker">"Динамик"</string>
+ <string name="optmenu_earphone">Наушники</string>
+ <string name="not_available">Недоступно в данный момент</string>
+ <string name="add_to_favorite1">Добавить в настроенные каналы</string>
+ <string name="contmenu_item_delete1">Удалить из настроенных каналов</string>
+ <string name="dlg_delete_confirm_title1">Подтвердить удаление из настроенных каналов</string>
+ <string name="dlg_delete_confirm_text1">Действительно удалить данный канал из настроенных каналов?</string>
+ <string name="toast_favorite_full1">Невозможно добавить данный канал в список настроенных каналов, так как список заполнен.</string>
+ <string name="toast_already_favorite1">Данный канал уже имеется в списке настроенных каналов.</string>
+ <string name="toast_channel_deleted1">Удалено из списка настроенных каналов.</string>
+ <string name="toast_channel_added1">Добавлено в список настроенных каналов.</string>
+</resources>
diff --git a/MediaTek/FmRadio/res/values-sk/strings.xml b/MediaTek/FmRadio/res/values-sk/strings.xml
new file mode 100755
index 0000000..359146d
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-sk/strings.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">Rádio FM</string>
+ <string name="favorite_manager">Zoznam kanálov</string>
+ <string name="add_to_favorite">Pridať do zoznamu obľúbených kanálov</string>
+ <string name="optmenu_search">Vyhľadať</string>
+ <string name="optmenu_exit">Ukončiť</string>
+ <string name="contmenu_title">Operácie</string>
+ <string name="contmenu_item_edit">Upraviť</string>
+ <string name="contmenu_item_delete">Odstrániť zo zoznamu obľúbených kanálov</string>
+ <string name="dlg_noantenna_text">Slúchadlá potrebujete ako anténu. Zapojte slúchadlá.</string>
+ <string name="dlg_noantenna_title">Zapojte slúchadlá</string>
+ <string name="btn_yes">"Áno"</string>
+ <string name="btn_no">"Nie"</string>
+ <string name="btn_ok">OK</string>
+ <string name="btn_cancel">Zrušiť </string>
+ <string name="dlg_progress_title">Vyhľadať</string>
+ <string name="dlg_progress_text">Vyhľadávam kanály...</string>
+ <string name="dlg_addedit_station_name">Názov:</string>
+ <string name="dlg_addedit_station_freq">Frekvencia:</string>
+ <string name="dlg_addedit_title_edit">Upraviť kanál</string>
+ <string name="default_station_name">Nový kanál</string>
+ <string name="dlg_delete_confirm_title">Potvrďte odstránenie zo zoznamu obľúbených kanálov</string>
+ <string name="dlg_delete_confirm_text">Ste si istí, že chcete odstrániť tento kanál zo zoznamu obľúbených kanálov?</string>
+ <string name="toast_favorite_full">Tento kanál nemožno pridať do zoznamu obľúbených kanálov, pretože je plný.</string>
+ <string name="toast_already_favorite">Tento kanál je už v zozname obľúbených kanálov.</string>
+ <string name="toast_channel_deleted">Kanál bol úspešne odstránený zo zoznamu obľúbených kanálov.</string>
+ <string name="toast_channel_added">Kanál bol úspešne pridaný do zoznamu obľúbených kanálov.</string>
+ <string name="toast_channel_searched">Vyhľadať dostupné kanály:</string>
+ <string name="toast_cannot_search">Dostupné kanály nemožno vyhľadať.</string>
+ <string name="toast_invalid_frequency">Neplatná frekvencia aktuálneho umiestnenia. Platí frekvenčný rozsah: 87,5 až 108,0</string>
+ <string name="toast_invalid_input">Naposledy zadaný vstup je neplatný. Platná hodnota je 0 alebo 5.</string>
+ <string name="optmenu_rds_settings">Nastavenia RDS</string>
+ <string name="dlg_rds_settings_channel_information">Informácie o kanále</string>
+ <string name="dlg_rds_settings_alternative_frequency">Alternatívna frekvencia</string>
+ <string name="sound_mode">Režim zvuku</string>
+ <string name="more">"Viac"</string>
+ <string name="power">"mocnina"</string>
+ <string name="toast_in_call">Počas hovoru nemôžete spustiť rádio FM.</string>
+ <string name="empty_list">Zoznam kanálov je prázdny</string>
+ <string name="edit_frequency_overwrite_text">Prepísať</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">Zapojte slúchadlá a používajte ako rádiovú anténu.</string>
+ <string name="fm_recorder_name">Nahrávač FM</string>
+ <string name="toast_recording_lost_warning">Keď vyberiete kartu SD, vaša nahrávka bude stratená!</string>
+ <string name="toast_start_recording">Spustiť nahrávanie...</string>
+ <string name="toast_sdcard_missing">Chýba vaša karta SD!</string>
+ <string name="toast_sdcard_insufficient_space">Nedostatok miesta na karte SD!</string>
+ <string name="toast_recorder_internal_error">Došlo k internej chybe v nahrávači!</string>
+ <string name="toast_player_internal_error">Došlo k internej chybe v prehrávači!</string>
+ <string name="toast_powerup_before_record_warning">Najskôr zapnite rádio FM!</string>
+ <string name="optmenu_record">Nahrať FM</string>
+ <string name="btn_save_recording">"Uložiť"</string>
+ <string name="btn_discard_recording">Vymazať</string>
+ <string name="edit_recording_name_hint">Sem napíšte názov súboru</string>
+ <string name="dlg_save_recording_title">Uložiť súbor s nahrávkou</string>
+ <string name="dlg_save_recording_storage_warning">V pamäti je nedostatok miesta! Chcete uložiť aktuálnu nahrávku?</string>
+ <string name="already_exists">už existuje</string>
+ <string name="optmenu_speaker">reproduktor</string>
+ <string name="optmenu_earphone">Slúchadlá</string>
+ <string name="not_available">Momentálne nie je k dispozícii</string>
+ <string name="add_to_favorite1">Pridať do prednastavených kanálov</string>
+ <string name="contmenu_item_delete1">Odstrániť z prednastavených kanálov</string>
+ <string name="dlg_delete_confirm_title1">Potvrďte odstránenie z prednastavených kanálov</string>
+ <string name="dlg_delete_confirm_text1">Ste si istí, že chcete odstrániť tento kanál z prednastavených kanálov?</string>
+ <string name="toast_favorite_full1">Tento kanál nemožno pridať do zoznamu prednastavených kanálov, pretože je plný.</string>
+ <string name="toast_already_favorite1">Tento kanál je už v zozname prednastavených kanálov.</string>
+ <string name="toast_channel_deleted1">Kanál bol úspešne odstránený zo zoznamu prednastavených kanálov.</string>
+ <string name="toast_channel_added1">Kanál bol úspešne pridaný do zoznamu prednastavených kanálov.</string>
+</resources> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/values-sl/strings.xml b/MediaTek/FmRadio/res/values-sl/strings.xml
new file mode 100755
index 0000000..460fe51
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-sl/strings.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name">Radio FM</string>
+ <string name="dlg_progress_title">Iskanje</string>
+ <string name="btn_yes">Da</string>
+ <string name="optmenu_speaker">Zvočnik</string>
+ <string name="edit_frequency_overwrite_text">Prepiši</string>
+ <string name="toast_start_recording">Začetek snemanja ...</string>
+ <string name="fm_unit">MHz</string>
+ <string name="empty_list">Seznam kanalov je prazen.</string>
+ <string name="optmenu_rds_settings">Nastavitve RDS</string>
+ <string name="toast_channel_searched">Najdeni razpoložljivi kanali:</string>
+ <string name="already_exists">že obstaja</string>
+ <string name="dlg_noantenna_title">Priklop slušalk</string>
+ <string name="add_to_favorite">Dodaj priljubljenim</string>
+ <string name="toast_sdcard_insufficient_space">Na kartici SD ni dovolj prostora!</string>
+ <string name="dlg_delete_confirm_title">Potrdi odstranitev iz priljubljenih</string>
+ <string name="optmenu_record">Snemanje FM</string>
+ <string name="optmenu_earphone">Slušalka</string>
+ <string name="sound_mode">Način zvoka</string>
+ <string name="toast_already_favorite">Ta kanal je že med priljubljenimi.</string>
+ <string name="not_available">Trenutno ni na voljo</string>
+ <string name="toast_channel_deleted">Uspešno odstranjeno iz priljubljenih</string>
+ <string name="toast_channel_added">Uspešno dodano priljubljenim.</string>
+ <string name="dlg_rds_settings_channel_information">Podatki o kanalu</string>
+ <string name="toast_favorite_full">Kanala ni mogoče dodati na seznam priljubljenih, ker je ta poln.</string>
+ <string name="btn_save_recording">Shrani</string>
+ <string name="optmenu_search">Išči</string>
+ <string name="dlg_rds_settings_alternative_frequency">Alternativna frekvenca</string>
+ <string name="dlg_progress_text">Iskanje kanalov ...</string>
+ <string name="optmenu_exit">Izhod</string>
+ <string name="more">Več</string>
+ <string name="btn_discard_recording">Zavrzi</string>
+ <string name="contmenu_item_edit">Uredi</string>
+ <string name="toast_cannot_search">Iskanje razpoložljivih kanalov ni na voljo.</string>
+ <string name="dlg_save_recording_storage_warning">V pomnilniku ni dovolj prostora! Ali želite shraniti trenutni posnetek?</string>
+ <string name="toast_in_call">Radia FM ne morete zagnati, medtem ko imate klic.</string>
+ <string name="dlg_addedit_station_freq">Frekvenca:</string>
+ <string name="toast_recorder_internal_error">V snemalniku je prišlo do notranje napake!</string>
+ <string name="dlg_save_recording_title">Shrani posneto datoteko</string>
+ <string name="btn_ok">V redu</string>
+ <string name="power">Napajanje</string>
+ <string name="contmenu_item_delete">Odstrani iz priljubljenih</string>
+ <string name="toast_powerup_before_record_warning">Najprej napolnite FM!</string>
+ <string name="fm_recorder_name">Snemalnik FM</string>
+ <string name="toast_recording_lost_warning">Če odstranite SD, boste posnetek izgubili!</string>
+ <string name="dlg_delete_confirm_text">Ali ste prepričani, da želite ta kanal odstraniti iz priljubljenih?</string>
+ <string name="default_station_name">Nov kanal</string>
+ <string name="btn_cancel">Prekliči</string>
+ <string name="contmenu_title">Dejanja</string>
+ <string name="btn_no">Ne</string>
+ <string name="favorite_manager">Seznam kanalov</string>
+ <string name="toast_invalid_frequency">Neveljavna frekvenca za trenutno lokacijo. Veljaven frekvenčni razpon: 87,5–108,0</string>
+ <string name="toast_sdcard_missing">Kartica SD manjka!</string>
+ <string name="dlg_addedit_station_name">Ime:</string>
+ <string name="dlg_addedit_title_edit">Urejanje kanala</string>
+ <string name="toast_invalid_input">Zadnji neveljaven vnos, veljavna vrednost je 0 ali 5.</string>
+ <string name="edit_recording_name_hint">Sem vpišite ime datoteke</string>
+ <string name="dlg_noantenna_text">Slušalke rabite kot anteno. Priključite slušalke.</string>
+ <string name="toast_player_internal_error">V predvajalniku je prišlo do notranje napake!</string>
+ <string name="no_antenna_info">Priključite slušalke, da bodo služile kot antena radia.</string>
+ <string name="add_to_favorite1">Dodaj med prednastavljene kanale</string>
+ <string name="contmenu_item_delete1">Odstrani iz prednastavljenih kanalov</string>
+ <string name="dlg_delete_confirm_title1">Potrdi odstranitev iz prednastavljenih kanalov</string>
+ <string name="dlg_delete_confirm_text1">Ali ste prepričani, da želite odstraniti ta kanal iz prednastavljenih kanalov?</string>
+ <string name="toast_favorite_full1">Kanala ni mogoče dodati na seznam prednastavljenih kanalov, ker je seznam poln.</string>
+ <string name="toast_already_favorite1">Ta kanal je že na seznamu prednastavljenih kanalov.</string>
+ <string name="toast_channel_deleted1">Uspešno odstranjeno iz prednastavljenih kanalov.</string>
+ <string name="toast_channel_added1">Uspešno dodano med prednastavljene kanale.</string>
+</resources> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/values-sr/strings.xml b/MediaTek/FmRadio/res/values-sr/strings.xml
new file mode 100755
index 0000000..bccb8e8
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-sr/strings.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name">FM радио</string>
+ <string name="dlg_progress_title">Претрага</string>
+ <string name="btn_yes">Да</string>
+ <string name="optmenu_speaker">Звучник</string>
+ <string name="edit_frequency_overwrite_text">Замени</string>
+ <string name="toast_start_recording">Почни снимање...</string>
+ <string name="fm_unit">MHz</string>
+ <string name="empty_list">Листа канала је празна.</string>
+ <string name="optmenu_rds_settings">Подешавања RDS</string>
+ <string name="toast_channel_searched">Претрага доступних канала:</string>
+ <string name="already_exists">већ постоји</string>
+ <string name="dlg_noantenna_title">Укључите слушалицу</string>
+ <string name="add_to_favorite">Листа канала</string>
+ <string name="toast_sdcard_insufficient_space">Недовољан простор на SD картици!</string>
+ <string name="dlg_delete_confirm_title">Потврди уклањање из омиљених</string>
+ <string name="optmenu_record">Сними FM</string>
+ <string name="optmenu_earphone">Слушалица</string>
+ <string name="sound_mode">Режим звука</string>
+ <string name="toast_already_favorite">Овај канал је већ на листи омиљених.</string>
+ <string name="not_available">Тренутно није доступно</string>
+ <string name="toast_channel_deleted">Успешно уклоњено из омиљених.</string>
+ <string name="toast_channel_added">Успешно додато омиљеним.</string>
+ <string name="dlg_rds_settings_channel_information">Информације о каналу</string>
+ <string name="toast_favorite_full">Није могуће додати канал на листу омиљених зато што је листа пуна.</string>
+ <string name="btn_save_recording">Сачувај</string>
+ <string name="optmenu_search">Претрага</string>
+ <string name="dlg_rds_settings_alternative_frequency">Алтернативна фреквенција</string>
+ <string name="dlg_progress_text">Претрага канала...</string>
+ <string name="optmenu_exit">Изађи</string>
+ <string name="more">Још</string>
+ <string name="btn_discard_recording">Одбаци</string>
+ <string name="contmenu_item_edit">Уреди</string>
+ <string name="toast_cannot_search">Није могуће тражити доступни канал.</string>
+ <string name="dlg_save_recording_storage_warning">Недовољна меморија! Желите ли да снимите тренутни снимак?</string>
+ <string name="toast_in_call">За време позива покретање FM радија није могуће.</string>
+ <string name="dlg_addedit_station_freq">Име:</string>
+ <string name="toast_recorder_internal_error">Дошло је до интерне грешке у снимачу!</string>
+ <string name="dlg_save_recording_title">Сачувај датотеку снимања</string>
+ <string name="btn_ok">Потврди</string>
+ <string name="power">Напајање</string>
+ <string name="contmenu_item_delete">Уклони из омиљених</string>
+ <string name="toast_powerup_before_record_warning">Прво укључите FM!</string>
+ <string name="fm_recorder_name">FM снимач</string>
+ <string name="toast_recording_lost_warning">Ваш снимак ће бити изгубљен због уклањања SD картице!</string>
+ <string name="dlg_delete_confirm_text">Желите ли сигурно да уклоните овај канал из омиљених?</string>
+ <string name="default_station_name">Нови канали</string>
+ <string name="btn_cancel">Откажи</string>
+ <string name="contmenu_title">Операције</string>
+ <string name="btn_no">Не</string>
+ <string name="favorite_manager">Листа канала</string>
+ <string name="toast_invalid_frequency">Неважећа фреквенција за тренутну локацију. Опсег важеће фреквенције: 87,5-108,0</string>
+ <string name="toast_sdcard_missing">Ваша SD картица недостаје!</string>
+ <string name="dlg_addedit_station_name">Повезивање:</string>
+ <string name="dlg_addedit_title_edit">Уреди канал</string>
+ <string name="toast_invalid_input">Последњи неважећи унос, важећа вредност је 0 или 5.</string>
+ <string name="edit_recording_name_hint">Овде укуцајте име датотеке</string>
+ <string name="dlg_noantenna_text">Потребна вам је слушалица као антена. Укључите слушалицу.</string>
+ <string name="toast_player_internal_error">Дошло је до интерне грешке у плејеру!</string>
+ <string name="no_antenna_info">Укључите слушалице да бисте их користили као радио антену</string>
+ <string name="add_to_favorite1">Додај унапред подешеним каналима</string>
+ <string name="contmenu_item_delete1">Уклони из унапред подешених канала</string>
+ <string name="dlg_delete_confirm_title1">Потврди уклањање из унапред подешених канала</string>
+ <string name="dlg_delete_confirm_text1">Желите ли сигурно да уклоните овај канал из унапред подешених канала?</string>
+ <string name="toast_favorite_full1">Није могуће додати канал на листу унапред подешених канала зато што је листа пуна.</string>
+ <string name="toast_already_favorite1">Овај канал је већ на листи унапред подешених.</string>
+ <string name="toast_channel_deleted1">Успешно уклоњено из унапред подешених канала.</string>
+ <string name="toast_channel_added1">Успешно додато унапред подешеним каналима.</string>
+</resources> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/values-sv/strings.xml b/MediaTek/FmRadio/res/values-sv/strings.xml
new file mode 100755
index 0000000..adc6834
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-sv/strings.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">FM-radio</string>
+ <string name="favorite_manager">Kanallista</string>
+ <string name="add_to_favorite">Lägg till som favorit</string>
+ <string name="optmenu_search">Sök</string>
+ <string name="optmenu_exit">Avsluta</string>
+ <string name="contmenu_title">Användning</string>
+ <string name="contmenu_item_edit">Redigera</string>
+ <string name="contmenu_item_delete">Ta bort från favoriter</string>
+ <string name="dlg_noantenna_text">Du behöver en hörlur som antenn. Anslut dina hörlurar.</string>
+ <string name="dlg_noantenna_title">Anslut hörlurar</string>
+ <string name="btn_yes">"Ja"</string>
+ <string name="btn_no">"Nej"</string>
+ <string name="btn_ok">OK</string>
+ <string name="btn_cancel">Avbryt</string>
+ <string name="dlg_progress_title">Sök</string>
+ <string name="dlg_progress_text">Sök kanaler…</string>
+ <string name="dlg_addedit_station_name">Namn:</string>
+ <string name="dlg_addedit_station_freq">Frekvens:</string>
+ <string name="dlg_addedit_title_edit">Redigera kanal</string>
+ <string name="default_station_name">Ny kanal</string>
+ <string name="dlg_delete_confirm_title">Bekräfta borttagning från favoriter</string>
+ <string name="dlg_delete_confirm_text">Är du säker på att du vill ta bort den här kanalen från favoriter?</string>
+ <string name="toast_favorite_full">Kan inte lägga till kanalen i favoritlistan eftersom den är full.</string>
+ <string name="toast_already_favorite">Denna kanal finns redan i favoritlistan.</string>
+ <string name="toast_channel_deleted">Kanalen har tagits bort från favoriter.</string>
+ <string name="toast_channel_added">Kanalen har lagts till i favoriter.</string>
+ <string name="toast_channel_searched">Tillgängliga kanaler efter sökning:</string>
+ <string name="toast_cannot_search">Kan inte söka efter tillgängliga kanaler.</string>
+ <string name="toast_invalid_frequency">Ogiltig frekvens för nuvarande plats. Giltigt frekvensområde: 87,5-108,0</string>
+ <string name="toast_invalid_input">Senast ogitliga inmatning, aktivt värde är 0 eller 5.</string>
+ <string name="optmenu_rds_settings">RDS-inställningar</string>
+ <string name="dlg_rds_settings_channel_information">Kanalinformation</string>
+ <string name="dlg_rds_settings_alternative_frequency">Alternativ frekvens</string>
+ <string name="sound_mode">Ljudläge</string>
+ <string name="more">"Mer"</string>
+ <string name="power">"exponent"</string>
+ <string name="toast_in_call">Du kan inte starta FM-radio när ett samtal pågår.</string>
+ <string name="empty_list">Kanallistan är tom.</string>
+ <string name="edit_frequency_overwrite_text">Skriv över</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">Anslut dina hörlurar för användning som radioantenn.</string>
+ <string name="fm_recorder_name">FM-inspelare</string>
+ <string name="toast_recording_lost_warning">Inspelningen kommer att tappas eftersom SD-kortet borttagning!</string>
+ <string name="toast_start_recording">Starta inspelning…</string>
+ <string name="toast_sdcard_missing">SD-kortet saknas!</string>
+ <string name="toast_sdcard_insufficient_space">Inte tillräckligt med ledigt utrymme på SD-kortet!</string>
+ <string name="toast_recorder_internal_error">Ett internt fel har inträffat i inspelaren!</string>
+ <string name="toast_player_internal_error">Ett internt fel har inträffat i spelaren!</string>
+ <string name="toast_powerup_before_record_warning">Starta FM först!</string>
+ <string name="optmenu_record">Spela in FM</string>
+ <string name="btn_save_recording">"Spara"</string>
+ <string name="btn_discard_recording">Kasta bort</string>
+ <string name="edit_recording_name_hint">Ange filnamnet här</string>
+ <string name="dlg_save_recording_title">Spara inspelad fil</string>
+ <string name="dlg_save_recording_storage_warning">Otillräckligt utrymme! Vill du spara befintlig inspelning?</string>
+ <string name="already_exists">finns redan</string>
+ <string name="optmenu_speaker">Högtalare</string>
+ <string name="optmenu_earphone">hörlur</string>
+ <string name="not_available">Inte tillgänglig för närvarande</string>
+ <string name="add_to_favorite1">Lägg till i förinställda kanaler</string>
+ <string name="contmenu_item_delete1">Ta bort från förinställda kanaler</string>
+ <string name="dlg_delete_confirm_title1">Bekräfta borttagning från förinställda kanaler</string>
+ <string name="dlg_delete_confirm_text1">Är du säker på att du vill ta bort den här kanalen från förinställda kanaler?</string>
+ <string name="toast_favorite_full1">Kan inte lägga till kanalen i listan över förinställda kanaler eftersom den är full.</string>
+ <string name="toast_already_favorite1">Denna kanal finns redan i listan över förinställda kanaler.</string>
+ <string name="toast_channel_deleted1">Kanalen har tagits bort från förinställda kanaler.</string>
+ <string name="toast_channel_added1">Kanalen har lagts till i förinställda kanaler.</string>
+</resources> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/values-sw/strings.xml b/MediaTek/FmRadio/res/values-sw/strings.xml
new file mode 100755
index 0000000..4d5ae7a
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-sw/strings.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name">Redio ya FM</string>
+ <string name="dlg_progress_title">Tafuta</string>
+ <string name="btn_yes">Ndiyo</string>
+ <string name="optmenu_speaker">Spika</string>
+ <string name="edit_frequency_overwrite_text">Andika juu</string>
+ <string name="toast_start_recording">Anza kurekodi…</string>
+ <string name="fm_unit">MHz</string>
+ <string name="empty_list">Orodha ya vituo iko tupu.</string>
+ <string name="optmenu_rds_settings">Mipangilio ya RDS</string>
+ <string name="toast_channel_searched">Vituo vinavyopatikana vilivyotafutwa:</string>
+ <string name="already_exists">tayari ipo</string>
+ <string name="dlg_noantenna_title">Vaa vifaa vya masikioni</string>
+ <string name="add_to_favorite">Ongeza kwa Kipendwa</string>
+ <string name="toast_sdcard_insufficient_space">Nafasi ya kadi ya SD haitoshi!</string>
+ <string name="dlg_delete_confirm_title">Thibitisha ondoa kutoka kwenye vipendwa</string>
+ <string name="optmenu_record">Rekodi FM</string>
+ <string name="optmenu_earphone">Kifaa cha masikio</string>
+ <string name="sound_mode">Hali ya sauti</string>
+ <string name="toast_already_favorite">Kituo hiki kiko tayari katika orodha ya vipendwa.</string>
+ <string name="not_available">Haipatikani kwa sasa</string>
+ <string name="toast_channel_deleted">Imefanikiwa kuondolewa kwenye vipendwa.</string>
+ <string name="toast_channel_added">Imefanikiwa kuongezwa kwenye vipendwa.</string>
+ <string name="dlg_rds_settings_channel_information">Maelezo ya kituto</string>
+ <string name="toast_favorite_full">Haiwezi kuongeza kituo kwenye orodha ya vipendwa kwa sababu imejaa.</string>
+ <string name="btn_save_recording">Hifadhi</string>
+ <string name="optmenu_search">Tafuta</string>
+ <string name="dlg_rds_settings_alternative_frequency">Masafa mbadala</string>
+ <string name="dlg_progress_text">Tafuta vituo…</string>
+ <string name="optmenu_exit">Toka</string>
+ <string name="more">Zaidi</string>
+ <string name="btn_discard_recording">Tupa</string>
+ <string name="contmenu_item_edit">Hariri</string>
+ <string name="toast_cannot_search">Haiwezi kutafuta kituo kinachopatikana.</string>
+ <string name="dlg_save_recording_storage_warning">Hifadhi haitoshi! Je, unataka kuhifadhi rekodi ya sasa?</string>
+ <string name="toast_in_call">Huwezi kuzindua Redio ya FM unapopiga simu.</string>
+ <string name="dlg_addedit_station_freq">Masafa:</string>
+ <string name="toast_recorder_internal_error">Hitilafu ya ndani imetokea katika rekoda!</string>
+ <string name="dlg_save_recording_title">Hifadhi faili ya rekodi</string>
+ <string name="btn_ok">Sawa</string>
+ <string name="power">Nishati</string>
+ <string name="contmenu_item_delete">Ondoa kwenye vipendwa</string>
+ <string name="toast_powerup_before_record_warning">Tafadhali washa FM kwanza!</string>
+ <string name="fm_recorder_name">Rekoda ya FM</string>
+ <string name="toast_recording_lost_warning">Rekodi yako itapotea kwa sababu ya uondoaji SD!</string>
+ <string name="dlg_delete_confirm_text">Je, una uhakika unataka kuondoa kituo hiki kutoka kwa vipendwa?</string>
+ <string name="default_station_name">Kituo Kipya</string>
+ <string name="btn_cancel">Ghairi</string>
+ <string name="contmenu_title">Shughuli</string>
+ <string name="btn_no">La</string>
+ <string name="favorite_manager">Orodha ya vituo</string>
+ <string name="toast_invalid_frequency">Masafa ya eneo la sasa sio sahihi. Upeo wa masafa sahihi: 87.5-108.0</string>
+ <string name="toast_sdcard_missing">Kadi yako ya SD inakosekana!</string>
+ <string name="dlg_addedit_station_name">Jina:</string>
+ <string name="dlg_addedit_title_edit">Hariri Kituo</string>
+ <string name="toast_invalid_input">Ingizo la mwisho lisilo halali, thamani halali ni 0 au 5.</string>
+ <string name="edit_recording_name_hint">Charaza jina la faili hapa</string>
+ <string name="dlg_noantenna_text">Unahitaji kifaa cha masikio kama antena. Tafadhali chopeka kifaa chako cha masikio.</string>
+ <string name="toast_player_internal_error">Hitilafu ya kindani imetokea katika kichezaji!</string>
+</resources> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/values-th/strings.xml b/MediaTek/FmRadio/res/values-th/strings.xml
new file mode 100755
index 0000000..916fe97
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-th/strings.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">วิทยุ FM</string>
+ <string name="favorite_manager">รายการสถานี</string>
+ <string name="add_to_favorite">เพิ่มลงในรายการโปรด</string>
+ <string name="optmenu_search">ค้นหา</string>
+ <string name="optmenu_exit">ออก</string>
+ <string name="contmenu_title">การใช้งาน</string>
+ <string name="contmenu_item_edit">แก้ไข</string>
+ <string name="contmenu_item_delete">ลบออกจากรายการที่ชอบ</string>
+ <string name="dlg_noantenna_text">คุณจำเป็นต้องมีหูฟังเพื่อใช้เป็นเสาอากาศ โปรดเสียบหูฟังของคุณ</string>
+ <string name="dlg_noantenna_title">เสียบหูฟัง</string>
+ <string name="btn_yes">"ใช่"</string>
+ <string name="btn_no">"ไม่"</string>
+ <string name="btn_ok">ตกลง</string>
+ <string name="btn_cancel">ยกเลิก</string>
+ <string name="dlg_progress_title">ค้นหา</string>
+ <string name="dlg_progress_text">ค้นหาสถานี...</string>
+ <string name="dlg_addedit_station_name">ชื่อ:</string>
+ <string name="dlg_addedit_station_freq">ความถี่:</string>
+ <string name="dlg_addedit_title_edit">แก้ไขแชนเนล</string>
+ <string name="default_station_name">สถานีใหม่</string>
+ <string name="dlg_delete_confirm_title">ยืนยันการลบ ช่อง</string>
+ <string name="dlg_delete_confirm_text">แน่ใจหรือไม่ว่าคุณต้องการลบช่องนี้?</string>
+ <string name="toast_favorite_full">ไม่สามารถเพิ่มช่องไปยังรายการโปรดได้ เนื่องจากรายการเต็ม</string>
+ <string name="toast_already_favorite">ช่องนี้อยู่ในรายการโปรดอยู่แล้ว</string>
+ <string name="toast_channel_deleted">ลบออกจากรายการที่ชอบสำเร็จแล้ว</string>
+ <string name="toast_channel_added">เพิ่มลงในรายการที่ชอบสำเร็จแล้ว</string>
+ <string name="toast_channel_searched">ค้นหาจากแชนเนลที่มี:</string>
+ <string name="toast_cannot_search">ไม่สามารถค้นหาจากแชนเนลที่มี</string>
+ <string name="optmenu_rds_settings">การตั้งค่า RDS</string>
+ <string name="dlg_rds_settings_channel_information">ข้อมูลแชนเนล</string>
+ <string name="dlg_rds_settings_alternative_frequency">ความถี่ทางเลือก</string>
+ <string name="more">เพิ่มเติม</string>
+ <string name="power">เปิด/ปิด</string>
+ <string name="sound_mode">โหมดเสียง</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">เสียบหูฟังเพื่อใช้เป็น เสาอากาศวิทยุ</string>
+ <!-- For FM recording -->
+ <string name="edit_frequency_overwrite_text">"เขียนทับ"</string>
+ <string name="fm_recorder_name">บันทึกเสียงวิทยุ</string>
+ <string name="toast_recording_lost_warning">การบันทึกของคุณจะหายไปเนื่องจากการถอด SD ออก!</string>
+ <string name="toast_start_recording">เริ่มบันทึกเสียง</string>
+ <string name="toast_sdcard_missing">การ์ด SD ของคุณหายไป</string>
+ <string name="toast_sdcard_insufficient_space">มีเนื้อที่ว่างในการ์ด SD ไม่เพียงพอ!</string>
+ <string name="toast_recorder_internal_error">เกิดความผิดพลาดภายในในตัวเครื่องบันทึก!</string>
+ <string name="toast_player_internal_error">เกิดความผิดพลาดภายในในตัวเครื่องเล่น!</string>
+ <string name="toast_powerup_before_record_warning">ขั้นแรกกรุณาเปิด FM!</string>
+ <string name="optmenu_record">บันทึกเสียงวิทยุ</string>
+ <string name="btn_save_recording">บันทึก</string>
+ <string name="btn_discard_recording">ยกเลิก</string>
+ <string name="edit_recording_name_hint">พิมพ์ชื่อไฟล์ที่นี่</string>
+ <string name="dlg_save_recording_title">บันทึกไฟล์อัดเสียง</string>
+ <string name="dlg_save_recording_storage_warning">มีเนื้อที่เก็บไม่เพียงพอ! คุณต้องการบันทึกการบันทึกปัจจุบันหรือไม่</string>
+ <string name="already_exists">มีอยู่แล้ว</string>
+ <string name="toast_invalid_frequency">ความถี่ใช้ไม่ได้สำหรับที่ตั้งปัจจุบัน ช่วงความถี่ที่ใช้ได้: 87.5-108.0.</string>
+ <string name="toast_invalid_input">ข้อมูลที่ป้อนล่าสุดไม่ถูกต้อง ค่าที่ถูกต้องคือ 0 หรือ 5</string>
+ <string name="toast_in_call">คุณไม่สามารถเปิดใช้งานวิทยุเอฟเอ็มได้เมื่อคุณกำลังโทร</string>
+ <string name="empty_list">รายการสถานีว่างอยู่</string>
+ <string name="optmenu_speaker">"ลำโพง"</string>
+ <string name="optmenu_earphone">หูฟัง</string>
+ <string name="not_available">ขณะนี้ใช้ไม่ได้</string>
+ <string name="add_to_favorite1">เพิ่มลงในช่องที่ตั้งไว้</string>
+ <string name="contmenu_item_delete1">ลบออกจากช่องที่ตั้งไว้</string>
+ <string name="dlg_delete_confirm_title1">ยืนยันการลบออกจากช่องที่ตั้งไว้</string>
+ <string name="dlg_delete_confirm_text1">คุณแน่ใจว่าต้องการลบช่องนี้ออกจากช่องที่ตั้งไว้หรือไม่</string>
+ <string name="toast_favorite_full1">ไม่สามารถเพิ่มช่องลงในรายการช่องที่ตั้งไว้ได้ เนื่องจากรายการเต็ม</string>
+ <string name="toast_already_favorite1">ช่องนี้มีอยู่ในรายการช่องที่ตั้งไว้แล้ว</string>
+ <string name="toast_channel_deleted1">ลบออกจากช่องที่ตั้งไว้สำเร็จแล้ว</string>
+ <string name="toast_channel_added1">เพิ่มลงในช่องที่ตั้งไว้สำเร็จแล้ว</string>
+</resources>
diff --git a/MediaTek/FmRadio/res/values-tl/strings.xml b/MediaTek/FmRadio/res/values-tl/strings.xml
new file mode 100755
index 0000000..3509ba6
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-tl/strings.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">DM Radyo</string>
+ <string name="favorite_manager">Listahan ng channel</string>
+ <string name="add_to_favorite">Magdagdag sa Paborito</string>
+ <string name="optmenu_search">Maghanap</string>
+ <string name="optmenu_exit">Lumabas</string>
+ <string name="contmenu_title">Mga Operasyon</string>
+ <string name="contmenu_item_edit">I-edit</string>
+ <string name="contmenu_item_delete">Alisin mula sa mga paborito</string>
+ <string name="dlg_noantenna_text">Kailangan mo ng earphone bilang antenna. Pakisaksak ang earphone mo.</string>
+ <string name="dlg_noantenna_title">Isaksak ang earphone</string>
+ <string name="btn_yes">Oo</string>
+ <string name="btn_no">Wala</string>
+ <string name="btn_ok">OK</string>
+ <string name="btn_cancel">Kanselahin</string>
+ <string name="dlg_progress_title">I-scan</string>
+ <string name="dlg_progress_text">Hanapan ang mga channerl…</string>
+ <string name="dlg_addedit_station_name">Pangalan:</string>
+ <string name="dlg_addedit_station_freq">Dalas:</string>
+ <string name="dlg_addedit_title_edit">I-edit ang Channel</string>
+ <string name="default_station_name">Bagong Channel</string>
+ <string name="dlg_delete_confirm_title">Kumpirmahin ang pag-alis mula sa mga paborito</string>
+ <string name="dlg_delete_confirm_text">Sigurado ka bang nais mong alisin ang channel na ito mula sa mga paborito?</string>
+ <string name="toast_favorite_full">Hindi maidagdag ang channel sa listahan ng paborito dahil puno na ito.</string>
+ <string name="toast_already_favorite">Nasa listahan na ng paborito ang channel na ito.</string>
+ <string name="toast_channel_deleted">Tagumpay na inalis mula sa mga paborito.</string>
+ <string name="toast_channel_added">Tagumpay na naidagdag sa mga paborito.</string>
+ <string name="toast_channel_searched">Hinanapan ang mga magagamit na channel.</string>
+ <string name="toast_cannot_search">Hindi mahanap ang magagamit na channel.</string>
+ <string name="toast_invalid_frequency">Hindi balidong frequency para sa kasalukuyang lokasyon. Sakop ng balidong frequency: 87.5-108.0.</string>
+ <string name="optmenu_rds_settings">Mga RDS na setting</string>
+ <string name="dlg_rds_settings_channel_information">Impormasyon sa channel</string>
+ <string name="dlg_rds_settings_alternative_frequency">Alternatibong frequency</string>
+ <string name="sound_mode">Mode ng tunog</string>
+ <string name="more">Marami Pang Apps</string>
+ <string name="power">power</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">I-plug ang earphones mo para gamitin bilang antenna ng radyo.</string>
+ <!-- For FM recording -->
+ <string name="edit_frequency_overwrite_text">"I-overwrite"</string>
+ <string name="fm_recorder_name">FM na recorder</string>
+ <string name="toast_recording_lost_warning">Ang recording mo ay mawawala dahil sa pagtanggal ng SD!</string>
+ <string name="toast_start_recording">Simulan ang pag-record…</string>
+ <string name="toast_sdcard_missing">Nawawala ang SD card mo!</string>
+ <string name="toast_sdcard_insufficient_space">Hindi sapat na espasyo ng SD card!</string>
+ <string name="toast_recorder_internal_error">May panloob na error na naganap sa recorder!</string>
+ <string name="toast_player_internal_error">May panloob na error na naganap sa player!</string>
+ <string name="toast_powerup_before_record_warning">Paki-paganahin muna ang FM!</string>
+ <string name="optmenu_record">I-record ang FM</string>
+ <string name="btn_save_recording">I-save</string>
+ <string name="btn_discard_recording">Itapon</string>
+ <string name="edit_recording_name_hint">I-type ang pangalan ng file dito</string>
+ <string name="dlg_save_recording_title">I-save ang file ng recording</string>
+ <string name="dlg_save_recording_storage_warning">Hindi sapat ang imbakan! Gusto mo bang i-save ang kasalukuyang recording?</string>
+ <string name="already_exists">umiiral na</string>
+ <string name="toast_invalid_input">Ang huling hindi balidong input, balidong halaga ay 0 o 5.</string>
+ <string name="toast_in_call">Hindi mo maila-launch ang FM Radio kapag nasa tawag ka.</string>
+ <string name="empty_list">Walang laman ang listahan ng channel.</string>
+ <string name="optmenu_speaker">"Speaker"</string>
+ <string name="optmenu_earphone">Headset</string>
+ <string name="not_available">Kasalukuyang hindi magagamit</string>
+ <string name="add_to_favorite1">Idagdag sa mga naka-set anng channel</string>
+ <string name="contmenu_item_delete1">Alisin mula sa mga naka-set nang channel</string>
+ <string name="dlg_delete_confirm_title1">Kumpirmahin ang pag-alis mula sa mga naka-set nang channel</string>
+ <string name="dlg_delete_confirm_text1">Sigurado ka bang gusto mong alisin ang channel na ito mula sa mga preset na channel?</string>
+ <string name="toast_favorite_full1">Hindi maidagdag ang channel sa listahan na preset dahil puno na ito.</string>
+ <string name="toast_already_favorite1">Nasa listahan na ng preset na channel ang channel na ito.</string>
+ <string name="toast_channel_deleted1">Tagumpay na inalis mula sa mga naka-set nang channel.</string>
+ <string name="toast_channel_added1">Tagumpay na idinagdag mula sa mga naka-set nang channel.</string>
+</resources>
diff --git a/MediaTek/FmRadio/res/values-tr/strings.xml b/MediaTek/FmRadio/res/values-tr/strings.xml
new file mode 100755
index 0000000..800f5f6
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-tr/strings.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">FM Radyo</string>
+ <string name="favorite_manager">Kanal listesi</string>
+ <string name="add_to_favorite">Sık Kullanılanlara Ekle</string>
+ <string name="optmenu_search">Ara</string>
+ <string name="optmenu_exit">Exit</string>
+ <string name="contmenu_title">İşlemler</string>
+ <string name="contmenu_item_edit">Düzenle</string>
+ <string name="contmenu_item_delete">Sık kullanılanlardan kaldır</string>
+ <string name="dlg_noantenna_text">Anten işlevi için bir kulaklık gerekiyor. Lütfen kulaklığınızı takın.</string>
+ <string name="dlg_noantenna_title">Kulaklığı takın</string>
+ <string name="btn_yes">Evet</string>
+ <string name="btn_no">Hayır</string>
+ <string name="btn_ok">Tamam</string>
+ <string name="btn_cancel">İptal</string>
+ <string name="dlg_progress_title">Tara</string>
+ <string name="dlg_progress_text">Kanalları ara…</string>
+ <string name="dlg_addedit_station_name">Ad:</string>
+ <string name="dlg_addedit_station_freq">Sıklık:</string>
+ <string name="dlg_addedit_title_edit">Kanalı Düzenle</string>
+ <string name="default_station_name">Yeni Kanal</string>
+ <string name="dlg_delete_confirm_title">Kanal Silme İşlemini Onayla</string>
+ <string name="dlg_delete_confirm_text">Bu kanalı silmek istediğinizden emin misiniz?</string>
+ <string name="toast_favorite_full">Sık kullanılanlar listesi dolu olduğu için listeye kanal eklenemiyor.</string>
+ <string name="toast_already_favorite">Bu kanal zaten sık kullanılanlar listesinde.</string>
+ <string name="toast_channel_deleted">Sık kullanılanlardan başarıyla kaldır.</string>
+ <string name="toast_channel_added">Sık kullanılanlara başarıyla eklendi.</string>
+ <string name="toast_channel_searched">Uygun kanallar bulundu:</string>
+ <string name="toast_cannot_search">Uygun kanal bulunamıyor.</string>
+ <string name="optmenu_rds_settings">RDS ayarları</string>
+ <string name="dlg_rds_settings_channel_information">Kanal bilgileri</string>
+ <string name="dlg_rds_settings_alternative_frequency">Alternatif frekans</string>
+ <string name="more">Diğer Uyg</string>
+ <string name="sound_mode">Ses modu</string>
+ <string name="power">üstü</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">Radyo anteni olarak kullanmak için kulaklıklarınızı takın.</string>
+ <!-- For FM recording -->
+ <string name="edit_frequency_overwrite_text">"Üzerine yaz"</string>
+ <string name="fm_recorder_name">FM kaydedici</string>
+ <string name="toast_recording_lost_warning">SD çıkarıldığı için kaydınız kaybolacak!</string>
+ <string name="toast_start_recording">Kayıdı başla…</string>
+ <string name="toast_sdcard_missing">SD kartınız yok!</string>
+ <string name="toast_sdcard_insufficient_space">Yetersiz SD kartı alanı!</string>
+ <string name="toast_recorder_internal_error">Kayıt cihazında dahili hata oluştu!</string>
+ <string name="toast_player_internal_error">Müzik çalarda dahili hata oluştu!</string>
+ <string name="toast_powerup_before_record_warning">"Lütfen ilk önce FM'i açın!"</string>
+ <string name="optmenu_record">"FM'i kaydet"</string>
+ <string name="btn_save_recording">Kaydet</string>
+ <string name="btn_discard_recording">Çıkar</string>
+ <string name="edit_recording_name_hint">Dosya adını buraya yazın</string>
+ <string name="dlg_save_recording_title">Kayıt dosyasını kaydet</string>
+ <string name="dlg_save_recording_storage_warning">Yetersiz depolama alanı! Mevcut kaydı kaydetmek istiyor musunuz?</string>
+ <string name="already_exists">Zaten var</string>
+ <string name="toast_invalid_frequency">Şu anki konum için geçersiz frekans. Geçerli frekans aralığı: 87,5 - 108,0.</string>
+ <string name="toast_invalid_input">"En son geçersiz giriş, geçersiz değer 0 veya 5'dir."</string>
+ <string name="toast_in_call">"Görüşme sırasında FM Radyo'yu başlatmazsınız."</string>
+ <string name="empty_list">Kanal listesi boş.</string>
+ <string name="optmenu_speaker">"Hoparlör"</string>
+ <string name="optmenu_earphone">Kulaklık</string>
+ <string name="not_available">Şu anda kullanılamaz</string>
+ <string name="add_to_favorite1">Önceden ayarlanmış kanallara ekle</string>
+ <string name="contmenu_item_delete1">Önceden ayarlanmış kanallardan sil</string>
+ <string name="dlg_delete_confirm_title1">Önceden ayarlanmış kanallardan silmeyi onayla</string>
+ <string name="dlg_delete_confirm_text1">Bu kanalı önceden ayarlanmış kanallar arasından silmek istediğinizden emin misiniz?</string>
+ <string name="toast_favorite_full1">Önceden ayarlanmış kanal listesi dolu olduğundan kanal eklenemiyor.</string>
+ <string name="toast_already_favorite1">Bu kanal zaten önceden ayarlanmış kanal listesinde var.</string>
+ <string name="toast_channel_deleted1">Önceden ayarlanmış kanallardan başarıyla silindi.</string>
+ <string name="toast_channel_added1">Önceden ayarlanmış kanallara başarıyla eklendi.</string>
+</resources>
diff --git a/MediaTek/FmRadio/res/values-uk/strings.xml b/MediaTek/FmRadio/res/values-uk/strings.xml
new file mode 100755
index 0000000..7a8678a
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-uk/strings.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">FM-радіо</string>
+ <string name="favorite_manager">Список каналів</string>
+ <string name="add_to_favorite">Додати до улюбленого</string>
+ <string name="optmenu_search">Пошук</string>
+ <string name="optmenu_exit">Вихід</string>
+ <string name="contmenu_title">Операції</string>
+ <string name="contmenu_item_edit">Редагувати</string>
+ <string name="contmenu_item_delete">Видалити з улюбленого</string>
+ <string name="dlg_noantenna_text">Навушники потрібні як антена. Будь ласка, підключіть навушники.</string>
+ <string name="dlg_noantenna_title">Увімкніть навушники</string>
+ <string name="btn_yes">"Так"</string>
+ <string name="btn_no">"Ні"</string>
+ <string name="btn_ok">ОК</string>
+ <string name="btn_cancel">Скасувати</string>
+ <string name="dlg_progress_title">Пошук</string>
+ <string name="dlg_progress_text">Пошук каналів...</string>
+ <string name="dlg_addedit_station_name">Назва:</string>
+ <string name="dlg_addedit_station_freq">Частота:</string>
+ <string name="dlg_addedit_title_edit">Редагувати канал</string>
+ <string name="default_station_name">Новий канал</string>
+ <string name="dlg_delete_confirm_title">Підтвердити видалення з улюбленого</string>
+ <string name="dlg_delete_confirm_text">Точно видалити цей канал з улюблених?</string>
+ <string name="toast_favorite_full">Неможливо додати канал до списку улюблених: він повний.</string>
+ <string name="toast_already_favorite">Цей канал вже у списку улюбленого.</string>
+ <string name="toast_channel_deleted">Успішно видалено з улюблених.</string>
+ <string name="toast_channel_added">Успішно додано до улюблених.</string>
+ <string name="toast_channel_searched">Пошук доступних каналів:</string>
+ <string name="toast_cannot_search">Неможливо знайти доступні канали.</string>
+ <string name="toast_invalid_frequency">Недійсна частота для поточного розташування. Дійсний діапазон частот 87,5 - 108,0</string>
+ <string name="toast_invalid_input">Недійсне останнє введення. Дійсне значення 0 або 5.</string>
+ <string name="optmenu_rds_settings">Налаштування RDS</string>
+ <string name="dlg_rds_settings_channel_information">Інфо канала</string>
+ <string name="dlg_rds_settings_alternative_frequency">Альтернативна частота</string>
+ <string name="sound_mode">Режим звуку</string>
+ <string name="more">"Більше"</string>
+ <string name="power">"показник ступеня"</string>
+ <string name="toast_in_call">Неможливо запустити FM-радіо під час виклику.</string>
+ <string name="empty_list">Список каналів порожній.</string>
+ <string name="edit_frequency_overwrite_text">Перезапис</string>
+ <string name="fm_unit">МГц</string>
+ <string name="no_antenna_info">Підключіть навушники для використання в якості радіоантени. </string>
+ <string name="fm_recorder_name">FM-запис</string>
+ <string name="toast_recording_lost_warning">Запис буде втрачено через зняття SD!</string>
+ <string name="toast_start_recording">Почати запис...</string>
+ <string name="toast_sdcard_missing">Відсутня карта SD!</string>
+ <string name="toast_sdcard_insufficient_space">Недостатньо місця на карті SD.</string>
+ <string name="toast_recorder_internal_error">Внутрішня помилка диктофона!</string>
+ <string name="toast_player_internal_error">Внутрішня помилка програвача!</string>
+ <string name="toast_powerup_before_record_warning">Будь ласка, спочатку увімкніть живлення FM!</string>
+ <string name="optmenu_record">Запис FM</string>
+ <string name="btn_save_recording">"Зберегти"</string>
+ <string name="btn_discard_recording">Відхилити</string>
+ <string name="edit_recording_name_hint">Наберіть тут назву файла</string>
+ <string name="dlg_save_recording_title">Зберегти файл, що записується</string>
+ <string name="dlg_save_recording_storage_warning">"Недостаньо пам'яті! Бажаєте зберегти поточний запис?"</string>
+ <string name="already_exists">вже існує</string>
+ <string name="optmenu_speaker">Динамік</string>
+ <string name="optmenu_earphone">Навушник</string>
+ <string name="not_available">Зараз недоступний</string>
+ <string name="add_to_favorite1">Додати до поточних каналів</string>
+ <string name="contmenu_item_delete1">Видалити з поточних каналів</string>
+ <string name="dlg_delete_confirm_title1">Підтвердіть видалення з поточних каналів</string>
+ <string name="dlg_delete_confirm_text1">Точно видалити цей канал з поточних?</string>
+ <string name="toast_favorite_full1">Неможливо додати канал до списку поточних: він повний.</string>
+ <string name="toast_already_favorite1">Цей канал вже у списку поточних.</string>
+ <string name="toast_channel_deleted1">Успішно видалено з поточних.</string>
+ <string name="toast_channel_added1">Успішно додано до поточних каналів.</string>
+</resources> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/values-ur/strings.xml b/MediaTek/FmRadio/res/values-ur/strings.xml
new file mode 100755
index 0000000..5b31f8a
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-ur/strings.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name">ایف ایم ریڈیو</string>
+ <string name="favorite_manager">چینل کی فہرست</string>
+ <string name="add_to_favorite">پسند میں شامل کرنا</string>
+ <string name="optmenu_search">تلاش کرنا</string>
+ <string name="optmenu_exit">خارج ہونا</string>
+ <string name="contmenu_title">آپریشن</string>
+ <string name="contmenu_item_edit">ترمیم کرنا</string>
+ <string name="contmenu_item_delete">پسندیدگان سے ہٹائيں</string>
+ <string name="dlg_noantenna_text">آپ کو انٹینا کے بطور ایک ایر فون درکار ہے۔ براہ کرم اپنا ایرفون لگائیں۔</string>
+ <string name="dlg_noantenna_title">ائیرفون لگائیں</string>
+ <string name="btn_yes">ہاں</string>
+ <string name="btn_no">نہیں</string>
+ <string name="btn_ok">ٹھیک ہے</string>
+ <string name="btn_cancel">منسوخ کرنا</string>
+ <string name="dlg_progress_title">اسکین</string>
+ <string name="dlg_progress_text">چینلز اسکین کریں…</string>
+ <string name="dlg_addedit_station_name">نام:</string>
+ <string name="dlg_addedit_station_freq">فریکوئنسی:</string>
+ <string name="dlg_addedit_title_edit">چینل میں ترمیم کریں</string>
+ <string name="default_station_name">نیا چینل</string>
+ <string name="dlg_delete_confirm_title">چینل حذف کرنا یقینی بنانا</string>
+ <string name="dlg_delete_confirm_text">کیا آپ واقعی یہ چینل حذف کرنا چاہتے ہیں؟</string>
+ <string name="toast_favorite_full">پسندیدہ فہرست میں چینل شامل نہیں ہوسکتا کیوں کہ یہ بھری ہوا ہے۔</string>
+ <string name="toast_already_favorite">یہ پہلے سے ہی پسندیدہ فہرست میں موجود ہے۔</string>
+ <string name="toast_channel_deleted">پسندیدگان سے کامیابی کے ساتھ ہٹایا گیا۔</string>
+ <string name="toast_channel_added">پسندیدگان میں کامیابی سے شامل کیا گيا۔</string>
+ <string name="toast_channel_searched">تلاش کردہ دستیاب چینلز:</string>
+ <string name="toast_cannot_search">دستیبات چینل تلاش نہیں کرسکتا۔</string>
+ <string name="optmenu_rds_settings">RDS ترتیبات</string>
+ <string name="dlg_rds_settings_channel_information">چینل کی معلومات</string>
+ <string name="dlg_rds_settings_alternative_frequency">متبادل تعدد</string>
+ <string name="more">مزید ایپلی کیشن</string>
+ <string name="power">پاور</string>
+ <string name="sound_mode">آواز کی وضع</string>
+ <string name="edit_frequency_overwrite_text">اس کے اوپر تحریر کریں</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">ریڈیو انٹینا کے بطور استعمال کرنے کے لیے اپنے ایر فون لگائیں۔</string>
+ <!-- For FM recording -->
+ <string name="fm_recorder_name">ایف ایم ریکارڈر</string>
+ <string name="toast_recording_lost_warning">SD ہٹانے کی وجہ سے آپ کی ریکارڈنگ ختم ہوجائے گی!</string>
+ <string name="toast_start_recording">ریکارڈ کرنا شروع کریں…</string>
+ <string name="toast_sdcard_missing">آپ کا SD کارڈ غائب ہے!</string>
+ <string name="toast_sdcard_insufficient_space">SD کارڈ میں جگہ کافی نہيں!</string>
+ <string name="toast_recorder_internal_error">ریکارڈر میں اندرونی غلطی واقع!</string>
+ <string name="toast_player_internal_error">پلئیر میں اندرونی غلطی واقع!</string>
+ <string name="toast_powerup_before_record_warning">برائے مہربانی پہلے FM کھولیں!</string>
+ <string name="optmenu_record">FM ریکارڈ کریں</string>
+ <string name="btn_save_recording">محفوظ کریں</string>
+ <string name="btn_discard_recording">رد کریں</string>
+ <string name="edit_recording_name_hint">فائل کا نام یہاں لکھیں</string>
+ <string name="dlg_save_recording_title">ریکارڈنگ کی فائل محفوظ کریں</string>
+ <string name="dlg_save_recording_storage_warning">ذخیرہ کافی نہيں ہے! کیا آپ حالیہ ریکارڈنگ محفوظ کرنا چاہتے ہيں؟</string>
+ <string name="already_exists">پہلے سے موجود ہے</string>
+ <string name="toast_invalid_frequency">حالیہ مقام کے لئے غلط فریکوینسی۔ جائز فریکوینسی کا دائرہ کار: 87.5-108.0.</string>
+ <string name="toast_invalid_input">آخری غلط اندرج، درست قدر 0 اور 5 ہے۔</string>
+ <string name="toast_in_call">آپ کال میں رہنے کے دوران FM ریڈیو لانچ نہیں کرسکتے۔</string>
+ <string name="empty_list">چینل کی فہرست خالی ہے۔</string>
+ <string name="optmenu_speaker">اسپیکر</string>
+ <string name="optmenu_earphone">ہیڈ سیٹ</string>
+ <string name="not_available">ابھی دستیاب نہیں ہے</string>
+ <string name="add_to_favorite1">پہلے سے مرتب کردہ چینلوں میں شامل کریں</string>
+ <string name="contmenu_item_delete1">پہلے سے مرتب کردہ چینلوں سے ہٹائيں</string>
+ <string name="dlg_delete_confirm_title1">پہلے سے مرتب کردہ چینلوں سے ہٹانے کی تصدیق کریں</string>
+ <string name="dlg_delete_confirm_text1">کیا آپ واقعی اس چینل کو پہلے سے مرتب کردہ چینلوں سے مٹانا چاہتے ہيں؟</string>
+ <string name="toast_favorite_full1">پہلے سے مرتب کردہ چینل کی فہرست پر ہونے کی وجہ سے چینل کو پہلے سے مرتب کردہ چینل کی فہرست میں شامل نہیں کیا جاسکتا۔</string>
+ <string name="toast_already_favorite1">یہ چینل پہلے ہی پہلے سے مرتب کردہ چینل کی فہرست میں موجود ہے۔</string>
+ <string name="toast_channel_deleted1">پہلے سے مرتب کردہ چینلوں کی فہرست سے کامیابی سے ہٹایا گیا۔</string>
+ <string name="toast_channel_added1">پہلے سے مرتب کردہ چینلوں میں کامیابی سے شامل کیا گيا۔</string>
+</resources>
+
diff --git a/MediaTek/FmRadio/res/values-vi/strings.xml b/MediaTek/FmRadio/res/values-vi/strings.xml
new file mode 100755
index 0000000..bd66447
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-vi/strings.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">Đài FM</string>
+ <string name="favorite_manager">D.sách kênh</string>
+ <string name="add_to_favorite">Thêm vào Mục y.thích</string>
+ <string name="optmenu_search">Tìm kiếm</string>
+ <string name="optmenu_exit">Thoát</string>
+ <string name="contmenu_title">Thao tác</string>
+ <string name="contmenu_item_edit">Sửa</string>
+ <string name="contmenu_item_delete">Xóa khỏi mục yêu thích</string>
+ <string name="dlg_noantenna_text">Bạn cần dùng tai nghe làm ăngten. Hãy cắm tai nghe.</string>
+ <string name="dlg_noantenna_title">Cắm tai nghe</string>
+ <string name="btn_yes">"Có"</string>
+ <string name="btn_no">"Không"</string>
+ <string name="btn_ok">OK</string>
+ <string name="btn_cancel">Hủy</string>
+ <string name="dlg_progress_title">Dò</string>
+ <string name="dlg_progress_text">Đang dò kênh…</string>
+ <string name="dlg_addedit_station_name">Tên:</string>
+ <string name="dlg_addedit_station_freq">Tần suất:</string>
+ <string name="dlg_addedit_title_edit">Sửa kênh</string>
+ <string name="default_station_name">Kênh mới</string>
+ <string name="dlg_delete_confirm_title">Xác nhận xóa kênh</string>
+ <string name="dlg_delete_confirm_text">Bạn chắc chắn muốn xóa kênh này?</string>
+ <string name="toast_favorite_full">Không thể thêm kênh vào d.sách yêu thích vì đã đầy.</string>
+ <string name="toast_already_favorite">Kênh này đã có trong d.sách yêu thích.</string>
+ <string name="toast_channel_deleted">Đã xóa thành công khỏi mục yêu thích.</string>
+ <string name="toast_channel_added">Đã thêm thành công vào mục yêu thích.</string>
+ <string name="toast_channel_searched">Các kênh có sẵn đã tìm thấy:</string>
+ <string name="toast_cannot_search">Không tìm thấy kênh có sẵn.</string>
+ <string name="optmenu_rds_settings">Cài đặt RDS</string>
+ <string name="dlg_rds_settings_channel_information">Thông tin kênh</string>
+ <string name="dlg_rds_settings_alternative_frequency">Tần số thay thế</string>
+ <string name="more">Ứng dụng khác</string>
+ <string name="power">lũy thừa</string>
+ <string name="sound_mode">C.độ âm thanh</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">Cắm tai nghe để dùng làm ăng ten đài FM.</string>
+ <!-- For FM recording -->
+ <string name="edit_frequency_overwrite_text">"Ghi đè"</string>
+ <string name="fm_recorder_name">Máy ghi âm FM</string>
+ <string name="toast_recording_lost_warning">Bản ghi âm của bạn sẽ bị mất do tháo thẻ SD!</string>
+ <string name="toast_start_recording">Bắt đầu ghi âm…</string>
+ <string name="toast_sdcard_missing">Thẻ SD của bạn bị thiếu!</string>
+ <string name="toast_sdcard_insufficient_space">D.lượng thẻ SD không đủ!</string>
+ <string name="toast_recorder_internal_error">Đã xảy ra lỗi nội bộ trong máy ghi âm!</string>
+ <string name="toast_player_internal_error">Đã xảy ra lỗi nội bộ trong trình phát!</string>
+ <string name="toast_powerup_before_record_warning">Hãy bật nguồn đài FM trước!</string>
+ <string name="optmenu_record">Ghi âm đài FM</string>
+ <string name="btn_save_recording">Lưu</string>
+ <string name="btn_discard_recording">Hủy bỏ</string>
+ <string name="edit_recording_name_hint">Nhập tên file vào đây</string>
+ <string name="dlg_save_recording_title">Lưu file ghi âm</string>
+ <string name="dlg_save_recording_storage_warning">Bộ nhớ không đủ! Bạn muốn lưu lại bản ghi hiện hành?</string>
+ <string name="already_exists">Đã tồn tại</string>
+ <string name="toast_invalid_frequency">Tần số không hợp lệ cho địa điểm hiện tại. Phạm vi tần số hợp lệ: 87,5-108,0.</string>
+ <string name="toast_invalid_input">Nhập số cuối không hợp lệ, giá trị hợp lệ là 0 hoặc 5.</string>
+ <string name="toast_in_call">Bạn không thể bật đài FM khi đang gọi điện.</string>
+ <string name="empty_list">Danh sách kênh trống.</string>
+ <string name="optmenu_speaker">"Loa"</string>
+ <string name="optmenu_earphone">Tai nghe</string>
+ <string name="not_available">Hiện không có sẵn</string>
+ <string name="add_to_favorite1">Thêm vào các kênh cài sẵn</string>
+ <string name="contmenu_item_delete1">Xóa khỏi các kênh cài sẵn</string>
+ <string name="dlg_delete_confirm_title1">Xác nhận xóa khỏi các kênh cài sẵn</string>
+ <string name="dlg_delete_confirm_text1">Bạn chắn chắn muốn xóa kênh này khỏi các kênh cài sẵn?</string>
+ <string name="toast_favorite_full1">Không thể thêm kênh vào d.sách kênh cài sẵn vì đã đầy.</string>
+ <string name="toast_already_favorite1">Kênh này đã có trong d.sách kênh cài sẵn.</string>
+ <string name="toast_channel_deleted1">Đã xóa thành công khỏi các kênh cài sẵn.</string>
+ <string name="toast_channel_added1">Đã thêm thành công vào các kênh cài sẵn.</string>
+</resources>
diff --git a/MediaTek/FmRadio/res/values-zh-rCN/strings.xml b/MediaTek/FmRadio/res/values-zh-rCN/strings.xml
new file mode 100755
index 0000000..97cd5d9
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-zh-rCN/strings.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">收音机</string>
+ <string name="favorite_manager">频道列表</string>
+ <string name="add_to_favorite">添加到收藏</string>
+ <string name="optmenu_search">搜索</string>
+ <string name="optmenu_exit">退出</string>
+ <string name="contmenu_title">操作</string>
+ <string name="contmenu_item_edit">编辑</string>
+ <string name="contmenu_item_delete">取消收藏</string>
+ <string name="dlg_noantenna_text">您需要使用耳机来充当天线。请插入耳机。</string>
+ <string name="dlg_noantenna_title">插入耳机</string>
+ <string name="btn_yes">是</string>
+ <string name="btn_no">否</string>
+ <string name="btn_ok">确定</string>
+ <string name="btn_cancel">取消</string>
+ <string name="dlg_progress_title">搜索</string>
+ <string name="dlg_progress_text">搜索频道中…</string>
+ <string name="dlg_addedit_station_name">名字:</string>
+ <string name="dlg_addedit_station_freq">频率:</string>
+ <string name="dlg_addedit_title_edit">编辑频道</string>
+ <string name="default_station_name">新频道</string>
+ <string name="dlg_delete_confirm_title">确认取消收藏</string>
+ <string name="dlg_delete_confirm_text">您要取消收藏这个频道吗?</string>
+ <string name="toast_favorite_full">收藏栏已满,无法添加。</string>
+ <string name="toast_already_favorite">该频道已在收藏栏中。</string>
+ <string name="toast_channel_deleted">已取消收藏。</string>
+ <string name="toast_channel_added">收藏成功。</string>
+ <string name="toast_channel_searched">共找到有效频道:</string>
+ <string name="toast_cannot_search">找不到有效频道。</string>
+ <string name="toast_invalid_frequency">无效频段。有效频率范围:87.5-108.0。</string>
+ <string name="toast_invalid_input">最后一位输入无效,有效值为0或5。</string>
+ <string name="optmenu_rds_settings">RDS设置</string>
+ <string name="dlg_rds_settings_channel_information">频道信息</string>
+ <string name="dlg_rds_settings_alternative_frequency">自动切换频率</string>
+ <string name="sound_mode">声音模式</string>
+ <string name="more">更多</string>
+ <string name="power">电源</string>
+ <string name="toast_in_call">通话中无法打开收音机。</string>
+ <string name="empty_list">频道列表为空。</string>
+ <string name="optmenu_speaker">扬声器</string>
+ <string name="optmenu_earphone">耳机</string>
+ <string name="edit_frequency_overwrite_text">"覆盖"</string>
+ <string name="fm_unit">兆赫</string>
+ <string name="no_antenna_info">耳机是收音机的天线,请插入耳机。</string>
+ <!-- For FM recording -->
+ <string name="fm_recorder_name">FM录音</string>
+ <string name="toast_recording_lost_warning">由于SD卡被移除,录音文件将丢失!</string>
+ <string name="toast_start_recording">开始录音...</string>
+ <string name="toast_sdcard_missing">存储卡丢失!</string>
+ <string name="toast_sdcard_insufficient_space">SD卡存储空间不足!</string>
+ <string name="toast_recorder_internal_error">录音机发生内部错误!</string>
+ <string name="toast_player_internal_error">播放器发生内部错误!</string>
+ <string name="toast_powerup_before_record_warning">请先打开FM!</string>
+ <string name="optmenu_record">FM录音</string>
+ <string name="btn_save_recording">保存</string>
+ <string name="btn_discard_recording">放弃</string>
+ <string name="edit_recording_name_hint">在这里输入文件名称</string>
+ <string name="dlg_save_recording_title">保存录音文件</string>
+ <string name="dlg_save_recording_storage_warning">存储空间不足!是否要保存当前录音?</string>
+ <string name="already_exists">已存在</string>
+ <string name="not_available">当前不可用</string>
+ <string name="add_to_favorite1">添加至预置频道</string>
+ <string name="contmenu_item_delete1">从预置频道中删除</string>
+ <string name="dlg_delete_confirm_title1">确认频道删除</string>
+ <string name="dlg_delete_confirm_text1">您要删除这个预置频道吗?</string>
+ <string name="toast_favorite_full1">预置栏已满,无法添加。</string>
+ <string name="toast_already_favorite1">该频道已在预置栏中。</string>
+ <string name="toast_channel_deleted1">已从预置栏中删除频道。</string>
+ <string name="toast_channel_added1">已将频道添加到预置栏。</string>
+</resources>
diff --git a/MediaTek/FmRadio/res/values-zh-rHK/strings.xml b/MediaTek/FmRadio/res/values-zh-rHK/strings.xml
new file mode 100755
index 0000000..821b450
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-zh-rHK/strings.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="app_name">FM 收音機</string>
+ <string name="favorite_manager">頻道清單</string>
+ <string name="add_to_favorite">新增至我的最愛</string>
+ <string name="add_to_favorite1">新增至預設頻道</string>
+ <string name="optmenu_search">"搜尋"</string>
+ <string name="optmenu_exit">"結束"</string>
+ <string name="contmenu_title">操作</string>
+ <string name="contmenu_item_edit">"編輯"</string>
+ <string name="contmenu_item_delete">從我的最愛移除</string>
+ <string name="contmenu_item_delete1">從預設頻道刪除</string>
+ <string name="dlg_noantenna_text">你需要耳機作為天線。請插上你的耳機。</string>
+ <string name="dlg_noantenna_title">插入耳機</string>
+ <string name="btn_yes">"是"</string>
+ <string name="btn_no">"否"</string>
+ <string name="btn_ok">"確定"</string>
+ <string name="btn_cancel">"取消"</string>
+ <string name="dlg_progress_title">"搜尋"</string>
+ <string name="dlg_progress_text">搜索頻道......</string>
+ <string name="dlg_addedit_station_name">名字:</string>
+ <string name="dlg_addedit_station_freq">頻率:</string>
+ <string name="dlg_addedit_title_edit">編輯通道</string>
+ <string name="default_station_name">新頻道</string>
+ <string name="dlg_delete_confirm_title">確認從我的最愛刪除</string>
+ <string name="dlg_delete_confirm_title1">確認從預設頻道刪除</string>
+ <string name="dlg_delete_confirm_text">你確定你要從我的最愛中刪除此頻道?</string>
+ <string name="dlg_delete_confirm_text1">是否確定要從預設的頻道刪除此頻道?</string>
+ <string name="toast_favorite_full">無法新增此頻道到我的最愛清單,因為它已滿。</string>
+ <string name="toast_favorite_full1">無法新增此頻道到我的預設頻道清單中,因為它已滿。</string>
+ <string name="toast_already_favorite">此頻道已在我的最愛清單中。</string>
+ <string name="toast_already_favorite1">此頻道已在預設的頻道清單中。</string>
+ <string name="toast_channel_deleted">成功地從我的最愛中刪除。</string>
+ <string name="toast_channel_deleted1">成功從預設頻道中移除。</string>
+ <string name="toast_channel_added">已成功新增到我的最愛。</string>
+ <string name="toast_channel_added1">已成功新增到預設頻道。</string>
+ <string name="toast_channel_searched">搜詢出可用的頻道:</string>
+ <string name="toast_cannot_search">無法搜詢出可用的頻道。</string>
+ <string name="toast_invalid_frequency">不正確頻率為當前所在的位置。有效頻率範圍: 87.5-108.0</string>
+ <string name="toast_invalid_input">最後一個無效輸入,有效的值是 0 或 5。</string>
+ <string name="optmenu_rds_settings">RDS 的設定</string>
+ <string name="dlg_rds_settings_channel_information">頻道資訊</string>
+ <string name="dlg_rds_settings_alternative_frequency">可替代頻率</string>
+ <string name="sound_mode">聲音模式</string>
+ <string name="more">"更多"</string>
+ <string name="power">"指數"</string>
+ <string name="toast_in_call">撥接中,無法進行FM收音機。</string>
+ <string name="empty_list">頻道清單是空的。</string>
+ <string name="edit_frequency_overwrite_text">"覆寫"</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">插入耳機當作收音機天線。</string>
+ <string name="fm_recorder_name">FM 答錄機</string>
+ <string name="toast_recording_lost_warning">因SD卡的移除,您的錄音檔將遺失 !</string>
+ <string name="toast_start_recording">開始錄製......</string>
+ <string name="toast_sdcard_missing">你的 SD 已遺失 !</string>
+ <string name="toast_sdcard_insufficient_space">SD 卡空間不足 !</string>
+ <string name="toast_recorder_internal_error">在答錄機中出現內部錯誤 !</string>
+ <string name="toast_player_internal_error">在播放機中出現內部錯誤 !</string>
+ <string name="toast_powerup_before_record_warning">首先請打開FM電源 !</string>
+ <string name="optmenu_record">記錄FM</string>
+ <string name="btn_save_recording">"儲存"</string>
+ <string name="btn_discard_recording">"捨棄"</string>
+ <string name="edit_recording_name_hint">在此輸入檔案名稱</string>
+ <string name="dlg_save_recording_title">將錄音檔保存</string>
+ <string name="dlg_save_recording_storage_warning">儲存空間不足 !您想保存當前錄製嗎?</string>
+ <string name="already_exists">已存在</string>
+ <string name="optmenu_speaker">"揚聲器"</string>
+ <string name="optmenu_earphone">耳機</string>
+ <string name="not_available">現在不可用</string>
+</resources>
diff --git a/MediaTek/FmRadio/res/values-zh-rTW/strings.xml b/MediaTek/FmRadio/res/values-zh-rTW/strings.xml
new file mode 100755
index 0000000..b9e47c6
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-zh-rTW/strings.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">調頻廣播</string>
+ <string name="favorite_manager">頻道清單</string>
+ <string name="add_to_favorite">新增到我的最愛</string>
+ <string name="optmenu_search">搜尋</string>
+ <string name="optmenu_exit">結束</string>
+ <string name="contmenu_title">操作</string>
+ <string name="contmenu_item_edit">編輯</string>
+ <string name="contmenu_item_delete">從我的最愛移除</string>
+ <string name="dlg_noantenna_text">您需要耳機充當天線。請插入您的耳機。</string>
+ <string name="dlg_noantenna_title">插入耳機</string>
+ <string name="btn_yes">是</string>
+ <string name="btn_no">否</string>
+ <string name="btn_ok">確定</string>
+ <string name="btn_cancel">取消</string>
+ <string name="dlg_progress_title">搜尋</string>
+ <string name="dlg_progress_text">搜尋頻道...</string>
+ <string name="dlg_addedit_station_name">名稱:</string>
+ <string name="dlg_addedit_station_freq">頻率:</string>
+ <string name="dlg_addedit_title_edit">編輯頻道</string>
+ <string name="default_station_name">新頻道</string>
+ <string name="dlg_delete_confirm_title">確認從我的最愛移除</string>
+ <string name="dlg_delete_confirm_text">您是否確定要從我的最愛移除這個頻道?</string>
+ <string name="toast_favorite_full">由於已滿,而無法將頻道新增到我的最愛清單。</string>
+ <string name="toast_already_favorite">這個頻道已在我的最愛清單內。</string>
+ <string name="toast_channel_deleted">已成功從我的最愛移除。</string>
+ <string name="toast_channel_added">已成功新增至我的最愛。</string>
+ <string name="toast_channel_searched">找到可用頻道:</string>
+ <string name="toast_cannot_search">找不到可用頻道。</string>
+ <string name="toast_invalid_frequency">目前位置的頻率無效。有效頻率範圍:87.5至108.0</string>
+ <string name="toast_invalid_input">最近一次輸入無效,有效值為0或5。</string>
+ <string name="optmenu_rds_settings">RDS設定</string>
+ <string name="dlg_rds_settings_channel_information">頻道資訊</string>
+ <string name="dlg_rds_settings_alternative_frequency">替代頻率</string>
+ <string name="more">更多應用程式</string>
+ <string name="power">電源</string>
+ <string name="sound_mode">音效模式</string>
+ <string name="toast_in_call">你在通話時,無法啟動調頻(FM)廣播。</string>
+ <string name="empty_list">頻道清單空白。</string>
+ <string name="optmenu_speaker">擴音器</string>
+ <string name="optmenu_earphone">耳機</string>
+ <string name="edit_frequency_overwrite_text">"覆寫"</string>
+ <string name="fm_unit">兆赫</string>
+ <string name="no_antenna_info">插入耳機當作收音機天線。</string>
+ <!-- For FM recording -->
+ <string name="fm_recorder_name">調頻(FM)錄音機</string>
+ <string name="toast_recording_lost_warning">您的錄音將因SD記憶卡移除而遺失!</string>
+ <string name="toast_start_recording">開始錄製…</string>
+ <string name="toast_sdcard_missing">您的SD記憶卡遺失中!</string>
+ <string name="toast_sdcard_insufficient_space">SD記憶卡空間不足!</string>
+ <string name="toast_recorder_internal_error">錄製程式發生內部錯誤!</string>
+ <string name="toast_player_internal_error">播放程式發生內部錯誤!</string>
+ <string name="toast_powerup_before_record_warning">請先打開FM的電源!</string>
+ <string name="optmenu_record">錄製 FM</string>
+ <string name="btn_save_recording">儲存</string>
+ <string name="btn_discard_recording">捨棄</string>
+ <string name="edit_recording_name_hint">在這裡輸檔案名稱入</string>
+ <string name="dlg_save_recording_title">儲存錄製檔案</string>
+ <string name="dlg_save_recording_storage_warning">儲存空間不足!要儲存目前錄製的資料?</string>
+ <string name="already_exists">已經存在</string>
+ <string name="not_available">目前不可用</string>
+ <string name="add_to_favorite1">新增到預設頻道</string>
+ <string name="contmenu_item_delete1">從預設頻道中移除</string>
+ <string name="dlg_delete_confirm_title1">確認從預設頻道移除</string>
+ <string name="dlg_delete_confirm_text1">您是否確定要從預設頻道移除這個頻道?</string>
+ <string name="toast_favorite_full1">由於已滿,而無法將頻道新增到預設頻道清單。</string>
+ <string name="toast_already_favorite1">這個頻道已在預設頻道清單內。</string>
+ <string name="toast_channel_deleted1">已成功從預設頻道移除。</string>
+ <string name="toast_channel_added1">已成功新增至預設頻道。</string>
+</resources>
diff --git a/MediaTek/FmRadio/res/values-zu/strings.xml b/MediaTek/FmRadio/res/values-zu/strings.xml
new file mode 100755
index 0000000..ecc4715
--- /dev/null
+++ b/MediaTek/FmRadio/res/values-zu/strings.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name">Umsakazo we-FM</string>
+ <string name="dlg_progress_title">Sesha</string>
+ <string name="btn_yes">Yebo</string>
+ <string name="optmenu_speaker">Isikhulumi</string>
+ <string name="edit_frequency_overwrite_text">Bhala ngaphezulu</string>
+ <string name="toast_start_recording">Qala ukuqopha...</string>
+ <string name="fm_unit">MHz</string>
+ <string name="empty_list">Uhlu lweshaneli alunalutho.</string>
+ <string name="optmenu_rds_settings">Amasethingi e-RDS</string>
+ <string name="toast_channel_searched">Hlolile amashaneli atholakalayo:</string>
+ <string name="already_exists">ivele ikhona</string>
+ <string name="dlg_noantenna_title">faka ama-earphone</string>
+ <string name="add_to_favorite">Engeza Kokuthandwayo</string>
+ <string name="toast_sdcard_insufficient_space">Isikhala asanele kwikhadi le-SD!</string>
+ <string name="dlg_delete_confirm_title">Qinisekisa ukususa kokuthandwayo</string>
+ <string name="optmenu_record">Qopha i-FM</string>
+ <string name="optmenu_earphone">I-earphone</string>
+ <string name="sound_mode">Imowudi yomsindo</string>
+ <string name="toast_already_favorite">Leshaneli isivele ukuhlu lokuthandwayo.</string>
+ <string name="not_available">Okwamanje ayitholakali</string>
+ <string name="toast_channel_deleted">Isuswe ngempumelelo kokuthandwayo.</string>
+ <string name="toast_channel_added">Yongezwe ngokuyimpumelelo kokuthandwayo.</string>
+ <string name="dlg_rds_settings_channel_information">Imniningwane yeshaneli</string>
+ <string name="toast_favorite_full">Ayongezeki ishaneli kuhlu lokuthandwayo ngenxa yokuba igcwele.</string>
+ <string name="btn_save_recording">Gcina</string>
+ <string name="optmenu_search">Sesha</string>
+ <string name="dlg_rds_settings_alternative_frequency">Ifrikwensi Enye</string>
+ <string name="dlg_progress_text">Sesha amashaneli...</string>
+ <string name="optmenu_exit">Phuma</string>
+ <string name="more">Okuningi</string>
+ <string name="btn_discard_recording">Khipha</string>
+ <string name="contmenu_item_edit">Lungisa</string>
+ <string name="toast_cannot_search">Akusesheki amashaneli atholakalayo.</string>
+ <string name="dlg_save_recording_storage_warning">Isikhala sokugcina asanele! Uyafuna ukugcina lokuqopha kwamanje?</string>
+ <string name="toast_in_call">Ngeke ukwazi ukuphumisa umsaka we-FM uma usefonini.</string>
+ <string name="dlg_addedit_station_freq">Ifrikwensi:</string>
+ <string name="toast_recorder_internal_error">Kwenzeke iphutha ngaphakathi kwisiqophi!</string>
+ <string name="dlg_save_recording_title">Gcina ifayela yokuqopha</string>
+ <string name="btn_ok">KULUNGILE</string>
+ <string name="power">Ugesi</string>
+ <string name="contmenu_item_delete">Susa kokuthandwayo</string>
+ <string name="toast_powerup_before_record_warning">Sicela ukhanyise i-FM kuqala!</string>
+ <string name="fm_recorder_name">Isiqophi se-FM</string>
+ <string name="toast_recording_lost_warning">Ukuqopha kwakho kuzolahleka ngenxa yokususwa kwe-SD!</string>
+ <string name="dlg_delete_confirm_text">Unesiqiniseko sokuthi ufuna ukususa leshaneli kokuthandwayo?</string>
+ <string name="default_station_name">Ishanelo Entsha</string>
+ <string name="btn_cancel">Khansela</string>
+ <string name="contmenu_title">Imisebenzi</string>
+ <string name="btn_no">Cha</string>
+ <string name="favorite_manager">Uhlu lweshaneli</string>
+ <string name="toast_invalid_frequency">Ifrikwensi engaqinisekisiwe yendawo yamanje. Indawo eqinisekisiwe yefrikwensi: u-87.5 – 108.0</string>
+ <string name="toast_sdcard_missing">Ikhadi lakho le-SD lilahlekile!</string>
+ <string name="dlg_addedit_station_name">Igama:</string>
+ <string name="dlg_addedit_title_edit">Lungisa ishaneli</string>
+ <string name="toast_invalid_input">Okokugcina okufakiwe phakathi akuqisekiwe, inani eliqinisekisiswe u-0 noma u-5.</string>
+ <string name="edit_recording_name_hint">Bhala igama lefayela lapha</string>
+ <string name="dlg_noantenna_text">Udinga i-earphone njenge eriyeli. Sicela ufake i-earphone yakho.</string>
+ <string name="toast_player_internal_error">Kwenzeke iphutha ngaphakathi kwi-Player!</string>
+</resources> \ No newline at end of file
diff --git a/MediaTek/FmRadio/res/values/strings.xml b/MediaTek/FmRadio/res/values/strings.xml
new file mode 100755
index 0000000..0967189
--- /dev/null
+++ b/MediaTek/FmRadio/res/values/strings.xml
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+ <string name="app_name">FM Radio</string>
+ <string name="favorite_manager">Channel list</string>
+ <string name="add_to_favorite">Add to Favorite</string>
+ <string name="optmenu_search">Search</string>
+ <string name="optmenu_exit">Exit</string>
+ <string name="contmenu_title">Operations</string>
+ <string name="contmenu_item_edit">Edit</string>
+ <string name="contmenu_item_delete">Remove from favorites</string>
+ <string name="dlg_noantenna_text">You need an earphone as antenna. Please plug in your earphone.</string>
+ <string name="dlg_noantenna_title">Plug in earphone</string>
+ <string name="btn_yes">Yes</string>
+ <string name="btn_no">No</string>
+ <string name="btn_ok">OK</string>
+ <string name="btn_cancel">Cancel</string>
+ <string name="dlg_progress_title">Search</string>
+ <string name="dlg_progress_text">Search channels...</string>
+ <string name="dlg_addedit_station_name">Name:</string>
+ <string name="dlg_addedit_station_freq">Frequency:</string>
+ <string name="dlg_addedit_title_edit">Edit Channel</string>
+ <string name="default_station_name">New Channel</string>
+ <string name="dlg_delete_confirm_title">Confirm remove from favorites</string>
+ <string name="dlg_delete_confirm_text">Are you sure you want to remove this channel from favorites?</string>
+ <string name="toast_favorite_full">Cannot add the channel to favorite list because it is full.</string>
+ <string name="toast_already_favorite">This channel is already in favorite list.</string>
+ <string name="toast_channel_deleted">Successfully removed from favorites.</string>
+ <string name="toast_channel_added">Successfully added to favorites.</string>
+ <string name="toast_channel_searched">Searched out available channels:</string>
+ <string name="toast_cannot_search">Cannot search out available channel.</string>
+ <string name="toast_invalid_frequency">Invalid frequency for current location. Valid frequency scope: 87.5-108.0</string>
+ <string name="toast_invalid_input">The last invalid input, valid value is 0 or 5.</string>
+ <string name="optmenu_rds_settings">RDS settings</string>
+ <string name="dlg_rds_settings_channel_information">Channel information</string>
+ <string name="dlg_rds_settings_alternative_frequency">Alternative frequency</string>
+ <string name="sound_mode">Sound mode</string>
+ <string name="more">More</string>
+ <string name="power">Power</string>
+ <string name="toast_in_call">You can not launch FM Radio when you are in call.</string>
+ <string name="empty_list">Channel list is empty.</string>
+ <string name="edit_frequency_overwrite_text">Overwrite</string>
+ <string name="fm_unit">MHz</string>
+ <string name="no_antenna_info">Plug in your earphones to use as a radio antenna.</string>
+ <!-- For FM recording -->
+ <string name="fm_recorder_name">FM Recorder</string>
+ <string name="toast_recording_lost_warning">Your recording will be lost due to SD removal!</string>
+ <string name="toast_start_recording">Start recording...</string>
+ <string name="toast_sdcard_missing">Your SD card is missing!</string>
+ <string name="toast_sdcard_insufficient_space">Insufficient SD card space!</string>
+ <string name="toast_recorder_internal_error">An internal error occured in recorder!</string>
+ <string name="toast_player_internal_error">An internal error occured in player!</string>
+ <string name="toast_powerup_before_record_warning">Please power up FM first!</string>
+ <string name="optmenu_record">Record FM</string>
+ <string name="btn_save_recording">Save</string>
+ <string name="btn_discard_recording">Discard</string>
+ <string name="edit_recording_name_hint">Type file name here</string>
+ <string name="dlg_save_recording_title">Save recording file</string>
+ <string name="dlg_save_recording_storage_warning">Insufficient storage! Do you want to save current recording?</string>
+ <string name="already_exists">already exists</string>
+ <string name="optmenu_speaker">Speaker</string>
+ <string name="optmenu_earphone">Earphone</string>
+ <string name="not_available">Currently not available</string>
+ <string name="add_to_favorite1">Add to preset channels</string>
+ <string name="contmenu_item_delete1">Remove from preset channels</string>
+ <string name="dlg_delete_confirm_title1">Confirm remove from preset channels</string>
+ <string name="dlg_delete_confirm_text1">Are you sure you want to remove this channel from preset channels?</string>
+ <string name="toast_favorite_full1">Cannot add the channel to preset channel list because it is full.</string>
+ <string name="toast_already_favorite1">This channel is already in preset channel list.</string>
+ <string name="toast_channel_deleted1">Successfully removed from preset channels.</string>
+ <string name="toast_channel_added1">Successfully added to preset channels.</string>
+
+ <!-- For Em Rx -->
+ <string name="FMR_Freq_text" translatable="false">Freq(MHz)</string>
+ <string name="FMR_Freq_tune" translatable="false">Tune</string>
+ <string name="FMR_Antenna_text" translatable="false">Antenna Type</string>
+ <string name="FMR_Antenna_short" translatable="false">Short</string>
+ <string name="FMR_Antenna_long" translatable="false">EarPhone</string>
+ <string name="FMR_Status_text" translatable="false">Status</string>
+ <string name="FMR_Force_Stereomono_text" translatable="false">Force Set:</string>
+ <string name="FMR_Status_Stereomono_text" translatable="false">Stereo/Mono:</string>
+ <string name="FMR_Stereomono_stereo" translatable="false">Stereo</string>
+ <string name="FMR_Stereomono_mono" translatable="false">Mono</string>
+ <string name="FMR_Status_Stereomono" translatable="false">detecting...</string>
+ <string name="FMR_Status_RSSI_text" translatable="false">RSSI(dBm):</string>
+ <string name="FMR_Status_RSSI" translatable="false">detecting...</string>
+ <string name="FMR_Status_Caparray_text" translatable="false">CapArray(pF):</string>
+ <string name="FMR_Status_Caparray" translatable="false">detecting...</string>
+ <string name="FMR_RDS_text" translatable="false">RDS</string>
+ <string name="FMR_RDS_Ratio_text" translatable="false">Ratio:</string>
+ <string name="FMR_RDS_Ratio" translatable="false">detecting...</string>
+ <string name="FMR_RDS_PS_text" translatable="false">PS:</string>
+ <string name="FMR_RDS_PS" translatable="false">None.</string>
+ <string name="FMR_RDS_RT_text" translatable="false">RT:</string>
+ <string name="FMR_RDS_RT" translatable="false">None.</string>
+ <string name="FMR_Hardware_version" translatable="false">Hardware Version</string>
+ <string name="FMR_Chip_ID_text" translatable="false">Chip ID</string>
+ <string name="FMR_Chip_ID" translatable="false">None.</string>
+ <string name="FMR_ECO_Version_text" translatable="false">ECO Version</string>
+ <string name="FMR_ECO_Version" translatable="false">None.</string>
+ <string name="FMR_Patch_Version_text" translatable="false">Patch Version</string>
+ <string name="FMR_Patch_Version" translatable="false">None.</string>
+ <string name="FMR_DSP_Version_text" translatable="false">DSP Version</string>
+ <string name="FMR_DSP_Version" translatable="false">None.</string>
+ <string name="FMR_EM_RSSI_THRESHOLD_text" translatable="false">RSSI THRESHOLD</string>
+ <string name="FMR_EM_MUTE_GAIN_text" translatable="false">SMG</string>
+ <string name="FMR_EM_DESENSE_RSSI_text" translatable="false">Desense RSSI</string>
+ <string name="FMR_EM_OK_TEXT" translatable="false">OK</string>
+ <string name="FMR_EM_CMD_text" translatable="false">0X</string>
+ <string name="FMR_EM_CMD_title" translatable="false">CMD EXPAND</string>
+ <string name="FMR_EM_CMD_return" translatable="false">CMD EXPAND RETURN VALUE</string>
+ <string name="FMR_EM_DEFAULT_VALUE" translatable="false">0</string>
+</resources>
diff --git a/MediaTek/FmRadio/res/values/strings_test.xml b/MediaTek/FmRadio/res/values/strings_test.xml
new file mode 100755
index 0000000..1bdedc4
--- /dev/null
+++ b/MediaTek/FmRadio/res/values/strings_test.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="test_success" translatable="false">成功</string>
+ <string name="test_fail" translatable="false">失败</string>
+ <string name="test_search" translatable="false">搜索</string>
+</resources>
diff --git a/MediaTek/FmRadio/res/values/styles.xml b/MediaTek/FmRadio/res/values/styles.xml
new file mode 100755
index 0000000..34c1a83
--- /dev/null
+++ b/MediaTek/FmRadio/res/values/styles.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright Statement:
+
+ This software/firmware and related documentation ("MediaTek Software") are
+ protected under relevant copyright laws. The information contained herein is
+ confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ the prior written permission of MediaTek inc. and/or its licensors, any
+ reproduction, modification, use or disclosure of MediaTek Software, and
+ information contained herein, in whole or in part, shall be strictly
+ prohibited.
+
+ MediaTek Inc. (C) 2011-2014. All rights reserved.
+
+ BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+
+ The following software/firmware and/or related documentation ("MediaTek
+ Software") have been modified by MediaTek Inc. All revisions are subject to
+ any receiver's applicable license agreements with MediaTek Inc.
+-->
+<resources>
+
+ <style name="AppTheme" parent="@android:style/Theme.Material">
+
+ </style>
+
+</resources>
diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioActivity.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioActivity.java
new file mode 100755
index 0000000..f40619c
--- /dev/null
+++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioActivity.java
@@ -0,0 +1,2196 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2011-2014. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.fmradio;
+
+import android.app.ActionBar;
+import android.app.Activity;
+import android.app.Fragment;
+import android.app.FragmentManager;
+import android.app.FragmentTransaction;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.ServiceConnection;
+import android.content.SharedPreferences;
+import android.media.AudioManager;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Message;
+import android.os.SystemClock;
+import android.util.Log;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.PopupMenu;
+import android.widget.PopupMenu.OnDismissListener;
+import android.widget.PopupMenu.OnMenuItemClickListener;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.mediatek.fmradio.dialogs.NoAntennaDialog;
+import com.mediatek.fmradio.dialogs.SearchChannelsDialog;
+import com.mediatek.fmradio.ext.IProjectStringExt;
+
+import java.io.File;
+/* Vanzo:libing on: Thu, 15 May 2014 19:34:51 +0800
+ */
+import java.io.FileReader;
+import java.io.IOException;
+import android.app.ActivityManager;
+import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+import android.hardware.SensorEventListener;
+import android.hardware.SensorManager;
+import android.os.SystemProperties;
+//import com.android.featureoption.FeatureOption;
+// End of Vanzo:libing
+
+/**
+ * This class interact with user, provider FM basic function and FM recording
+ * function
+ */
+public class FmRadioActivity extends Activity implements
+/* Vanzo:libing on: Thu, 15 May 2014 19:36:32 +0800
+ */
+ SensorEventListener,
+// End of Vanzo:libing
+ OnMenuItemClickListener, OnDismissListener,
+ NoAntennaDialog.NoAntennaListener,
+ SearchChannelsDialog.CancelSearchListener,
+ FmRecordDialogFragment.OnRecordingDialogClickListener {
+ // Logging
+ private static final String TAG = "FmRx/Activity";
+
+ // Dialog tags
+ private static final String TAG_SEARCH = "Search";
+ private static final String TAG_SAVE_RECORDINGD = "SaveRecording";
+ private static final String TAG_NO_ANTENNA = "NoAntenna";
+
+ // Use shared preference to store record or play time
+ private static final String REFS_NAME = "FMRecord";
+ private static final String START_RECORD_TIME = "startRecordTime";
+ private static final String START_PLAY_TIME = "startPlayTime";
+
+ // Request code
+ private static final int REQUEST_CODE_FAVORITE = 1;
+
+ // FM
+ private static final String FM = "FM";
+ // Short antenna support
+ private static final boolean SHORT_ANNTENNA_SUPPORT = FmRadioUtils.isFmShortAntennaSupport();
+
+ // UI views
+ private TextView mTextStationName = null;
+ private TextView mTextStationValue = null;
+ // RDS text view
+ private TextView mTextRds = null;
+ // Text view display "FM"
+ private TextView mTextFm = null;
+ // Text View display "MHZ"
+ private TextView mTextMHz = null;
+ private TextView mTxtRecInfoLeft = null;
+ private TextView mTxtRecInfoRight = null;
+ private ImageButton mButtonDecrease = null;
+ private ImageButton mButtonPrevStation = null;
+ private ImageButton mButtonNextStation = null;
+ private ImageButton mButtonIncrease = null;
+ private ImageButton mButtonAddToFavorite = null;
+ private ImageButton mButtonRecord = null;
+ private ImageButton mButtonStop = null;
+ private ImageButton mButtonPlayback = null;
+ private Animation mAnimation = null;
+ private ImageView mAnimImage = null;
+
+ // Layout display recording file information
+ private RelativeLayout mRLRecordInfo = null;
+
+ // Menu items
+ private MenuItem mMenuItemChannelList = null;
+ private MenuItem mMenuItemOverflow = null;
+ private MenuItem mMenuItemPower = null;
+ private PopupMenu mPopupMenu = null;
+
+ // State variables
+ private boolean mIsServiceStarted = false;
+ private boolean mIsServiceBinded = false;
+ private boolean mNeedTuneto = false;
+ private boolean mIsNeedDisablePower = false;
+ private boolean mIsPlaying = false;
+ private boolean mIsInRecordingMode = false;
+ private boolean mIsNeedShowRecordDlg = false;
+ private boolean mIsNeedShowNoAntennaDlg = false;
+ private boolean mIsNeedShowSearchDlg = true;
+ private boolean mIsActivityForeground = true;
+
+ // Record variables
+ private long mRecordStartTime = 0;
+ private long mPlayStartTime = 0;
+ private int mPrevRecorderState = FmRecorder.STATE_INVALID;
+ private int mCurrentStation = FmRadioUtils.DEFAULT_STATION;
+ private int mRecordState = 0;
+
+ // Instance variables
+ private FmRadioService mService = null;
+ private Context mContext = null;
+ private Toast mToast = null;
+ private FragmentManager mFragmentManager = null;
+ private AudioManager mAudioManager = null;
+
+ // Plugin
+ private IProjectStringExt mProjectStringExt = null;
+/* Vanzo:libing on: Fri, 02 Aug 2013 15:31:08 +0800
+ */
+ private static final String GESTURE_SWITCH_FLAG = "persist.sys.gesture_switch";
+ private static final String GESTURE_FMRADIO_FLAG = "persist.sys.gesture_fmradio";
+
+ // 1.first psensor value large than the GESTURE_FMRADIO_MAX_DISTANCE
+ private static int GESTURE_FMRADIO_MAX_DISTANCE = 350;
+ // 2.second psensor value small than the GESTURE_FMRADIO_MIN_DISTANCE
+ private static int GESTURE_FMRADIO_MIN_DISTANCE = 150;
+ // delay time of the gesture run hander,200 is 0.2s
+ private static final int GESTURE_RUN_POST_DELAY_TIME = 200;
+ private SensorManager mSensorManager;
+ private Sensor mSensor = null;
+ private Handler myHandler;
+ private int mPrePsensor = 0;
+
+ private boolean mGestureEnabled;
+ private boolean mFMRadioEnabled;
+ private boolean mHavePsensor = true;
+ private boolean mHadGesture = false;
+// end of vanzo:libing
+/* Vanzo:lupei on: Fri, 28 Aug 2015 14:50:36 +0800
+ * add default gesture distance max min value
+ */
+ //private String DEFAULT_GESTURE_DIST_MAX_MIN = com.android.featureoption.FeatureOption.VANZO_FEATURE_DEFAULT_GESTURE_DISTANCE_MAX_MIN_VALUE;
+// End of Vanzo:lupei
+
+ // Service listener
+ private FmRadioListener mFmRadioListener = new FmRadioListener() {
+ @Override
+ public void onCallBack(Bundle bundle) {
+ int flag = bundle.getInt(FmRadioListener.CALLBACK_FLAG);
+ Log.d(TAG, "call back method flag:" + flag);
+
+ if (flag == FmRadioListener.MSGID_FM_EXIT) {
+ mHandler.removeCallbacksAndMessages(null);
+ }
+
+ // remove tag message first, avoid too many same messages in queue.
+ Message msg = mHandler.obtainMessage(flag);
+ msg.setData(bundle);
+ mHandler.removeMessages(flag);
+ mHandler.sendMessage(msg);
+ }
+ };
+
+ // Handle sdcard unmount event
+ private final BroadcastReceiver mSdcardListener = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+
+ if (Intent.ACTION_MEDIA_MOUNTED.equals(action)) {
+ Log.d(TAG, "Sd card mounted");
+ return;
+ }
+
+ // If not unmount recording sd card, do nothing;
+ if (!isRecordingCardUnmount(intent)) {
+ return;
+ }
+
+ if (Intent.ACTION_MEDIA_EJECT.equals(action)
+ || Intent.ACTION_MEDIA_UNMOUNTED.equals(action)) {
+ FmRecordDialogFragment df = (FmRecordDialogFragment) mFragmentManager
+ .findFragmentByTag(TAG_SAVE_RECORDINGD);
+ if ((null != df && df.getShowsDialog()) || mIsNeedShowRecordDlg) {
+ Log.d(TAG, "recording sd card unmounted,dismiss save dialog");
+ dismissSaveRecordingDialog();
+ mIsNeedShowRecordDlg = false;
+ showToast(getString(R.string.toast_recording_lost_warning));
+ }
+ Log.d(TAG, "Sd card Eject or unmounted");
+ }
+ }
+ };
+
+ // Button click listeners on UI
+ private final View.OnClickListener mButtonClickListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ switch (v.getId()) {
+ case R.id.btn_record:
+ // if power up, record FM, else toast prompt user to power up
+ Log.d(TAG, "btn record: CLICK!!");
+ if (null == mService) {
+ Log.d(TAG, "mService is null");
+ return;
+ }
+ if (!mIsPlaying) {
+ showToast(getString(R.string.toast_powerup_before_record_warning));
+ return;
+ }
+ refreshRecordNotIdle();
+ mRecordStartTime = SystemClock.elapsedRealtime();
+ editSharedPreferences(START_RECORD_TIME, mRecordStartTime);
+ mService.startRecordingAsync();
+ mService.setModifiedRecordingName(null);
+ break;
+
+ case R.id.btn_stop:
+ // stop record and stop play record file
+ Log.d(TAG, "btn stop: CLICK!!");
+ if (null == mService) {
+ Log.d(TAG, "mService is null");
+ return;
+ }
+ refreshRecordNotIdle();
+ mService.stopRecordingAsync();
+ mService.stopPlaybackAsync();
+ break;
+
+ case R.id.btn_playback:
+ Log.d(TAG, "btn playback: CLICK!!");
+ if (null == mService) {
+ Log.d(TAG, "mService is null");
+ return;
+ }
+ refreshRecordNotIdle();
+ mPlayStartTime = SystemClock.elapsedRealtime();
+ editSharedPreferences(START_PLAY_TIME, mPlayStartTime);
+ mService.startPlaybackAsync();
+ break;
+
+ case R.id.button_add_to_favorite:
+ Log.d(TAG, "onClick AddToFavorite start");
+ updateFavoriteStation();
+ Log.d(TAG, "onClick AddToFavorite end");
+ break;
+
+ case R.id.button_decrease:
+ tuneToStation(FmRadioUtils.computeDecreaseStation(mCurrentStation));
+ break;
+
+ case R.id.button_increase:
+ tuneToStation(FmRadioUtils.computeIncreaseStation(mCurrentStation));
+ break;
+
+ case R.id.button_prevstation:
+ Log.d(TAG, "onClick PrevStation");
+ // Search for the previous station.
+ seekStation(mCurrentStation, false); // false: previous station
+ // true: next station
+ break;
+
+ case R.id.button_nextstation:
+ // Search for the next station.
+ seekStation(mCurrentStation, true); // false: previous station
+ // true: next station
+ break;
+
+ default:
+ Log.d(TAG, "invalid view id");
+ break;
+ }
+ }
+ };
+
+ /**
+ * Main thread handler to update UI
+ */
+ private Handler mHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ Log.d(TAG, "mHandler.handleMessage: what = " + msg.what +
+ ",hashcode:" + mHandler.hashCode());
+ Bundle bundle;
+ switch (msg.what) {
+ case FmRadioListener.MSGID_REFRESH:
+ refreshTimeText();
+ break;
+
+ case FmRadioListener.MSGID_POWERUP_FINISHED:
+ bundle = msg.getData();
+ boolean isPowerup = bundle
+ .getBoolean(FmRadioListener.KEY_IS_POWER_UP);
+ mIsPlaying = isPowerup;
+ Log.d(TAG, "updateFMState: FMRadio is powerup = " + isPowerup);
+ stopAnimation();
+ if (isPowerup) {
+ refreshImageButton(true);
+ refreshPopupMenuItem(true);
+ refreshActionMenuItem(true);
+ } else {
+ showToast(getString(R.string.not_available));
+ }
+ // if not powerup success, refresh power to enable.
+ refreshActionMenuPower(true);
+ break;
+
+ case FmRadioListener.MSGID_SWITCH_ANNTENNA:
+ bundle = msg.getData();
+ boolean isSwitch = bundle
+ .getBoolean(FmRadioListener.KEY_IS_SWITCH_ANNTENNA);
+ Log.d(TAG, "[FmRadioActivity.mHandler] swtich antenna: " + isSwitch);
+ if (!isSwitch) {
+ if (mIsActivityForeground) {
+ dismissNoAntennaDialog();
+ showNoAntennaDialog();
+ } else {
+ Log.d(TAG, "need show no antenna dialog after onResume:");
+ mIsNeedShowNoAntennaDlg = true;
+ }
+ stopAnimation();
+ // if not powerup success, refresh power to enable.
+ refreshActionMenuPower(true);
+ } else {
+ mIsNeedShowNoAntennaDlg = false;
+ dismissNoAntennaDialog();
+ }
+ break;
+
+ case FmRadioListener.MSGID_POWERDOWN_FINISHED:
+ bundle = msg.getData();
+ boolean isPowerdown = bundle
+ .getBoolean(FmRadioListener.KEY_IS_POWER_DOWN);
+ mIsPlaying = !isPowerdown;
+ refreshImageButton(false);
+ refreshActionMenuItem(false);
+ refreshPopupMenuItem(false);
+ refreshActionMenuPower(true);
+ break;
+
+ case FmRadioListener.MSGID_TUNE_FINISHED:
+ bundle = msg.getData();
+ boolean tuneFinish = bundle.getBoolean(FmRadioListener.KEY_IS_TUNE);
+ boolean isPowerUp = bundle.getBoolean(FmRadioListener.KEY_IS_POWER_UP);
+ // when power down state, tune from channel list,
+ // will call back send mIsPowerup state.
+ mIsPlaying = mIsPlaying ? mIsPlaying : isPowerUp;
+
+ stopAnimation();
+ // tune finished, should make power enable
+ mIsNeedDisablePower = false;
+ float frequency = bundle.getFloat(FmRadioListener.KEY_TUNE_TO_STATION);
+ mCurrentStation = FmRadioUtils.computeStation(frequency);
+ // After tune to station finished, refresh favorite button and
+ // other button status.
+ refreshStationUI(mCurrentStation);
+ // tune fail,should resume button status
+ if (!tuneFinish) {
+ Log.d(TAG, "mHandler.tune: " + tuneFinish);
+ refreshActionMenuItem(mIsPlaying);
+ refreshImageButton(mIsPlaying);
+ refreshPopupMenuItem(mIsPlaying);
+ refreshActionMenuPower(true);
+ return;
+ }
+ refreshImageButton(true);
+ refreshActionMenuItem(true);
+ refreshPopupMenuItem(true);
+ refreshActionMenuPower(true);
+ break;
+
+ case FmRadioListener.MSGID_SCAN_FINISHED:
+ bundle = msg.getData();
+ // cancel scan happen
+ boolean isScan = bundle.getBoolean(FmRadioListener.KEY_IS_SCAN);
+ int tuneToStation = bundle.getInt(FmRadioListener.KEY_TUNE_TO_STATION);
+ int searchedNum = bundle.getInt(FmRadioListener.KEY_STATION_NUM);
+ refreshActionMenuItem(mIsPlaying);
+ refreshImageButton(mIsPlaying);
+ refreshPopupMenuItem(mIsPlaying);
+ // ebable action menu power items
+ refreshActionMenuPower(true);
+
+ if (!isScan) {
+ dismissSearchDialog();
+ Log.d(TAG, "mHandler.scan canceled. not enter to channel list.");
+ return;
+ }
+
+ mCurrentStation = tuneToStation;
+ // After tune to station finished, refresh favorite button and
+ // other button status.
+ refreshStationUI(mCurrentStation);
+ dismissSearchDialog();
+
+ if (searchedNum == 0) {
+ showToast(getString(R.string.toast_cannot_search));
+ return;
+ }
+
+ enterChannelList();
+ // Show toast to tell user how many stations have been searched
+ showToast(getString(R.string.toast_channel_searched) + " " +
+ String.valueOf(searchedNum));
+ break;
+
+ case FmRadioListener.MSGID_FM_EXIT:
+ finish();
+ break;
+
+ case FmRadioListener.LISTEN_RDSSTATION_CHANGED:
+ bundle = msg.getData();
+ int rdsStation = bundle.getInt(FmRadioListener.KEY_RDS_STATION);
+ refreshStationUI(rdsStation);
+ break;
+
+ case FmRadioListener.LISTEN_PS_CHANGED:
+ case FmRadioListener.LISTEN_RT_CHANGED:
+ bundle = msg.getData();
+ String text = "";
+ String psString = bundle.getString(FmRadioListener.KEY_PS_INFO);
+ String rtString = bundle.getString(FmRadioListener.KEY_RT_INFO);
+ if ((null != psString) && (psString.length() > 0)) {
+ text += psString;
+ }
+ if ((null != rtString) && (rtString.length() > 0)) {
+ if (text.length() > 0) {
+ text += " ";
+ }
+ text += rtString;
+ }
+ showRds(text);
+ break;
+
+ case FmRadioListener.LISTEN_RECORDSTATE_CHANGED:
+ bundle = msg.getData();
+ int recorderState = bundle
+ .getInt(FmRadioListener.KEY_RECORDING_STATE);
+ Log.d(TAG, "FmRadioActivity.mHandler: recorderState = "
+ + recorderState);
+ updateRecordingState(recorderState);
+ break;
+
+ case FmRadioListener.LISTEN_RECORDERROR:
+ bundle = msg.getData();
+ int errorState = bundle
+ .getInt(FmRadioListener.KEY_RECORDING_ERROR_TYPE);
+ updateRecorderError(errorState);
+ break;
+
+ case FmRadioListener.LISTEN_RECORDMODE_CHANGED:
+ bundle = msg.getData();
+ boolean isInRecordingMode = bundle
+ .getBoolean(FmRadioListener.KEY_IS_RECORDING_MODE);
+ exitRecordingMode(isInRecordingMode);
+ break;
+
+ case FmRadioListener.LISTEN_SPEAKER_MODE_CHANGED:
+ bundle = msg.getData();
+ boolean isSpeakerMode = bundle
+ .getBoolean(FmRadioListener.KEY_IS_SPEAKER_MODE);
+ if (null != mPopupMenu) {
+ Menu menu = mPopupMenu.getMenu();
+ menu.findItem(R.id.fm_sound_mode).setTitle(isSpeakerMode ?
+ R.string.optmenu_earphone : R.string.optmenu_speaker);
+ refreshSoundModeVisiable();
+ }
+ break;
+
+ default:
+ Log.d(TAG, "invalid message");
+ break;
+ }
+ Log.d(TAG, "handleMessage");
+ }
+ };
+
+ // When call bind service, it will call service connect. register call back
+ // listener and initial device
+ private final ServiceConnection mServiceConnection = new ServiceConnection() {
+
+ /**
+ * called by system when bind service
+ *
+ * @param className component name
+ * @param service service binder
+ */
+ @Override
+ public void onServiceConnected(ComponentName className, IBinder service) {
+ Log.d(TAG, "FmRadioActivity.onServiceConnected start");
+ mService = ((FmRadioService.ServiceBinder) service).getService();
+ if (null == mService) {
+ Log.e(TAG, "ServiceConnection: Error: can't get Service");
+ finish();
+ return;
+ }
+
+ mService.registerFmRadioListener(mFmRadioListener);
+ if (!mService.isServiceInited()) {
+ Log.d(TAG, "ServiceConnection: FM service is not init");
+ mService.initService(mCurrentStation);
+ powerUpFm();
+ } else {
+ Log.d(TAG, "ServiceConnection: FM service is already init");
+ if (mService.isDeviceOpen()) {
+
+ // ALPS01768123 Need to power up for this case
+ // Without earphone->Start FM->Click Home->Plug in earphone->Enter FM
+ // -> Power Menu will be power down status and disabled
+ // ALPS01811383 Cannot power up when in call, because cannot get AudioFocus
+ if (!mService.isPowerUp() && mService.isModeNormal()) {
+ Log.d(TAG, "Need to power up auto for this case");
+ powerUpFm();
+ } else if (!mService.isPowerUp() && !mService.isModeNormal()) {
+ // if onStop() has been called before resuming this activity during
+ // phone call, need check whether show no-antenna dialog.
+ if (!mIsNeedShowNoAntennaDlg && !mService.isAntennaAvailable()
+ && !FmRadioUtils.isFmShortAntennaSupport()) {
+ Log.w(TAG, "Need to show no antenna dialog for plug out earphone in onPause state");
+ dismissNoAntennaDialog();
+ showNoAntennaDialog();
+ }
+ }
+
+ // tunetostation during changing language,we need to tune
+ // again when service bind success
+ if (mNeedTuneto) {
+ tuneToStation(mCurrentStation);
+ mNeedTuneto = false;
+ }
+ updateCurrentStation();
+ boolean isPlaying = mService.isPowerUp();
+ // back key destroy activity, mIsPlaying will be the default
+ // false.
+ // but it may be true. so the power button will be in wrong
+ // state.
+ mIsPlaying = isPlaying;
+ updateMenuStatus();
+ updateDialogStatus();
+
+ // check whether set play back button enable
+ if (!isRecordFileExist()) {
+ mButtonPlayback.setEnabled(false);
+ }
+ updateRds();
+ restoreRecorderState();
+ } else {
+ // Normal case will not come here
+ // Need to exit FM for this case
+ Log.e(TAG, "ServiceConnection: service is exiting while start FM again");
+ exitService();
+ finish();
+ }
+ }
+ Log.d(TAG, "FmRadioActivity.onServiceConnected end");
+ }
+
+ /**
+ * When unbind service will call this method
+ *
+ * @param className The component name
+ */
+ @Override
+ public void onServiceDisconnected(ComponentName className) {
+ Log.d(TAG, "FmRadioActivity.onServiceDisconnected");
+ }
+ };
+
+ /**
+ * Update FM recording state with given state from FM service
+ *
+ * @param recorderState The recorder state
+ */
+ private void updateRecordingState(int recorderState) {
+ mRecordState = recorderState;
+ refreshRecordingStatus(recorderState);
+
+ switch (recorderState) {
+ case FmRecorder.STATE_RECORDING:
+ showToast(getString(R.string.toast_start_recording));
+ Log.d(TAG, "updateRecordingState:startRecording");
+ mHandler.sendEmptyMessage(FmRadioListener.MSGID_REFRESH);
+ break;
+
+ case FmRecorder.STATE_PLAYBACK:
+ mHandler.sendEmptyMessage(FmRadioListener.MSGID_REFRESH);
+ break;
+
+ case FmRecorder.STATE_IDLE:
+ Log.d(TAG, "updateRecordingState:remove message");
+ mHandler.removeMessages(FmRadioListener.MSGID_REFRESH);
+ break;
+
+ default:
+ mHandler.removeMessages(FmRadioListener.MSGID_REFRESH);
+ break;
+ }
+ }
+
+ /**
+ * Update FM recorder error with given error from FM service
+ *
+ * @param errorType The record error type
+ */
+ private void updateRecorderError(int errorType) {
+ Log.d(TAG, "updateRecorderError.errorType: " + errorType);
+ String showString = null;
+ // In FMRecorder.startRecording() error occurs,then we should set
+ // mButtonRecord enable, because we set mButtonRecord disable ago
+ refreshRecordIdle();
+ switch (errorType) {
+ case FmRecorder.ERROR_SDCARD_NOT_PRESENT:
+ showString = getString(R.string.toast_sdcard_missing);
+ break;
+
+ case FmRecorder.ERROR_SDCARD_INSUFFICIENT_SPACE:
+ showString = getString(R.string.toast_sdcard_insufficient_space);
+ break;
+
+ case FmRecorder.ERROR_RECORDER_INTERNAL:
+ showString = getString(R.string.toast_recorder_internal_error);
+ break;
+
+ case FmRecorder.ERROR_PLAYER_INTERNAL:
+ showString = getString(R.string.toast_player_internal_error);
+ break;
+
+ case FmRadioListener.NOT_AUDIO_FOCUS:
+ showString = getString(R.string.not_available);
+ if (isRecordFileExist()) {
+ refreshPlaybackIdle(true);
+ }
+ break;
+ case FmRecorder.ERROR_RECORDER_INVALID_STATE:
+ showString = getString(R.string.toast_powerup_before_record_warning);
+ break;
+ default:
+ Log.d(TAG, "invalid recorder error");
+ break;
+ }
+
+ showToast(showString);
+ }
+
+ /**
+ * Update FM recorder mode with given mode from FM service
+ *
+ * @param isInRecordingMode The current mode, true if current is in
+ * recording mode
+ */
+ private void exitRecordingMode(boolean isInRecordingMode) {
+ refreshImageButton(mIsPlaying);
+ refreshActionMenuItem(mIsPlaying);
+ refreshPopupMenuItem(mIsPlaying);
+ refreshActionMenuPower(true);
+ if (!isInRecordingMode) {
+ // Service has already set recording mode to false, need to modify
+ // UI here
+ mIsInRecordingMode = false;
+ switchRecordLayout(isInRecordingMode);
+ }
+ }
+
+ /**
+ * Format the given time to be string by hour:minute:second
+ *
+ * @param time The time to be formated
+ *
+ * @return string The formated time
+ */
+ private String getTimeString(int time) {
+ final int oneHour = 3600;
+ int hour = time / oneHour;
+ final int minuteSecond = 60;
+ int minute = (time / minuteSecond) % minuteSecond;
+ int second = time % minuteSecond;
+ String timeString = null;
+
+ if (hour > 0) {
+ final String timeFormatLong = "%02d:%02d:%02d";
+ timeString = String.format(timeFormatLong, hour, minute, second);
+ } else {
+ final String timeFormatShort = "%02d:%02d";
+ timeString = String.format(timeFormatShort, minute, second);
+ }
+
+ return timeString;
+ }
+
+ /**
+ * Update the favorite UI state
+ */
+ private void updateFavoriteStation() {
+ String showString = null;
+ // Judge the current output and switch between the devices.
+ if (FmRadioStation.isFavoriteStation(mContext, mCurrentStation)) {
+ // Need to delete this favorite channel.
+ String stationName = FmRadioStation.getStationName(mContext,
+ mCurrentStation, FmRadioStation.STATION_TYPE_FAVORITE);
+ FmRadioStation.updateStationToDb(mContext, stationName,
+ FmRadioStation.STATION_TYPE_SEARCHED, mCurrentStation);
+ mButtonAddToFavorite
+ .setImageResource(R.drawable.btn_fm_favorite_off_selector);
+ mTextStationName.setText("");
+ showString = mProjectStringExt.getProjectString(mContext,
+ R.string.toast_channel_deleted, R.string.toast_channel_deleted1);
+ } else {
+ // Add the station to favorite
+ String stationName = FmRadioStation.getStationName(mContext,
+ mCurrentStation, FmRadioStation.STATION_TYPE_SEARCHED);
+ if (FmRadioStation.isStationExist(mContext, mCurrentStation,
+ FmRadioStation.STATION_TYPE_SEARCHED)) {
+ FmRadioStation.updateStationToDb(mContext, stationName,
+ FmRadioStation.STATION_TYPE_FAVORITE,
+ mCurrentStation);
+ } else {
+ FmRadioStation.insertStationToDb(mContext, stationName,
+ mCurrentStation, FmRadioStation.STATION_TYPE_FAVORITE);
+ }
+ mButtonAddToFavorite
+ .setImageResource(R.drawable.btn_fm_favorite_on_selector);
+ mTextStationName.setText(stationName);
+ showString = mProjectStringExt.getProjectString(mContext,
+ R.string.toast_channel_added, R.string.toast_channel_added1);
+ }
+ showToast(showString);
+ }
+
+ /**
+ * Edit value which saved in shared preference
+ *
+ * @param key The preferences editor key
+ * @param time The preferences editor value
+ */
+ private void editSharedPreferences(String key, long time) {
+ SharedPreferences sharedPreferences = getSharedPreferences(REFS_NAME, 0);
+ SharedPreferences.Editor editor = sharedPreferences.edit();
+ editor.putLong(key, time);
+ editor.commit();
+ }
+
+ /**
+ * Called when the activity is first created, initial variables
+ *
+ * @param savedInstanceState The saved bundle in onSaveInstanceState
+ */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+/* Vanzo:libing on: Thu, 15 May 2014 18:13:02 +0800
+ * add for gesture
+ */
+ Log.d(TAG, "FMRadio onCreate initPsensorManager()");
+ if (isFmRadioGestureSupport()) {
+ initPsensorManager();
+ }
+// End of Vanzo:libing
+ Log.i(TAG, "FmRadioActivity.onCreate start");
+ // Bind the activity to FM audio stream.
+ setVolumeControlStream(AudioManager.STREAM_MUSIC);
+ setContentView(R.layout.main);
+ mFragmentManager = getFragmentManager();
+ mContext = getApplicationContext();
+
+ FmRadioStation.initFmDatabase(mContext);
+ mProjectStringExt = ExtensionUtils.getExtension(mContext);
+ initUiComponent();
+ registerButtonClickListener();
+ registerSdcardReceiver();
+ mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
+ Log.d(TAG, "FmRadioActivity.onCreate end");
+ }
+/* Vanzo:libing on: Thu, 15 May 2014 18:14:21 +0800
+ * add for gesture
+ */
+ public void initPsensorManager() {
+ return;
+ /*File file = new File("/sys/bus/platform/drivers/als_ps/ps");
+ if (!file.exists()) {
+ mHavePsensor = false;
+ }
+ // has no psensor return
+ if (mHavePsensor == false) {
+ Log.w(TAG, "initPsensorManager() has no psensor !!!");
+ return;
+ }
+ mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
+*/
+/* Vanzo:lupei on: Fri, 28 Aug 2015 14:51:36 +0800
+ * add default gesture distance max min value
+ */
+ /*android.util.Log.d(TAG, "DEFAULT_GESTURE_DIST_MAX_MIN = "+DEFAULT_GESTURE_DIST_MAX_MIN);
+ if (!("".equals(DEFAULT_GESTURE_DIST_MAX_MIN))) {
+ String[] value = DEFAULT_GESTURE_DIST_MAX_MIN.split(",");
+ if (value[0]!= "" && value[1] != "") {
+ GESTURE_FMRADIO_MAX_DISTANCE = Integer.parseInt(value[0]);
+ GESTURE_FMRADIO_MIN_DISTANCE = Integer.parseInt(value[1]);
+ }
+ }*/
+// End of Vanzo:lupei
+
+ }
+
+ public Runnable myRunnable = new Runnable() {
+ @Override
+ public void run() {
+ File file = new File("/sys/bus/platform/drivers/als_ps/ps");
+ if (!file.exists()) {
+ file = new File("/sys/bus/platform/drivers/als_ps_cm3628/ps");
+ }
+ if (file.exists()) {
+ String pSensorValues2 = readFile(file);
+ if (pSensorValues2.trim().contains("-")) {
+ return;
+ }
+ if (pSensorValues2.trim().contains("0x")) {
+ mPrePsensor = Integer.parseInt(pSensorValues2.trim().substring(2), 16);
+ } else {
+ mPrePsensor = Integer.parseInt(pSensorValues2.trim());
+ }
+ android.util.Log.d(TAG, "fmradio isGestureOpen " + isGestureOpen());
+ if (isGestureOpen() && isTopActivity()) {
+ if (mPrePsensor > GESTURE_FMRADIO_MAX_DISTANCE) {
+ mHadGesture = true;
+ } else if (mHadGesture && mPrePsensor < GESTURE_FMRADIO_MIN_DISTANCE) {
+ mHadGesture = false;
+ seekStation(mCurrentStation, true); // false: previous station
+ }
+ }
+ }
+ myHandler.postDelayed(myRunnable, GESTURE_RUN_POST_DELAY_TIME);
+ }
+ };
+
+ private boolean isTopActivity() {
+ ActivityManager am = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
+ ComponentName cn = am.getRunningTasks(2).get(0).topActivity;
+ String topClassName = cn.getClassName();
+ String myClassName = FmRadioActivity.this.getComponentName().getClassName();
+
+ return topClassName.equalsIgnoreCase(myClassName);
+ }
+
+ public void onAccuracyChanged(Sensor sensor, int accuracy) {
+ }
+
+ private static String readFile(File fn) {
+ FileReader f;
+ int len;
+
+ f = null;
+ try {
+ f = new FileReader(fn);
+ String s = "";
+ char[] cbuf = new char[200];
+ while ((len = f.read(cbuf, 0, cbuf.length)) >= 0) {
+ s += String.valueOf(cbuf, 0, len);
+ }
+ return s;
+ } catch (IOException ex) {
+ return "0";
+ } finally {
+ if (f != null) {
+ try {
+ f.close();
+ } catch (IOException ex) {
+ return "0";
+ }
+ }
+ }
+ }
+
+ public void onSensorChanged(SensorEvent event) {
+ }
+
+ private boolean isGestureOpen() {
+ mGestureEnabled = SystemProperties.getInt(GESTURE_SWITCH_FLAG , 0) == 1 ? true : false;
+ mFMRadioEnabled = SystemProperties.getInt(GESTURE_FMRADIO_FLAG , 0) == 1 ? true : false;
+
+ return mGestureEnabled && mFMRadioEnabled;
+ }
+
+ private void stopPsensor() {
+ mSensorManager.unregisterListener(this);
+ if (myHandler != null) {
+ myHandler.removeCallbacks(myRunnable);
+ }
+ }
+
+ private void resumePsensor() {
+ mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
+ mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL);
+
+ myHandler = new Handler();
+ myHandler.post(myRunnable);
+ }
+
+ public static boolean isFmRadioGestureSupport() {
+ boolean enable = false; //FeatureOption.VANZO_FEATURE_FM_RADIO_GESTURE;
+ android.util.Log.i(TAG, "isFmRadioGestureSupport enable = " + enable);
+ return enable;
+ }
+// End of Vanzo:libing
+ /**
+ * Go to channel list activity
+ */
+ private void enterChannelList() {
+ Log.d(TAG, "enterChannelList");
+ if (mService != null) {
+ // AMS change the design for background start
+ // activity. need check app is background in app code
+ if (mIsActivityForeground) {
+ Intent intent = new Intent();
+ intent.setClass(FmRadioActivity.this, FmRadioFavorite.class);
+ startActivityForResult(intent, REQUEST_CODE_FAVORITE);
+ } else {
+ Log.d(TAG, "enterChannelList. activity is background, not enter channel list.");
+ }
+ }
+ }
+
+ /**
+ * Refresh the favorite button with the given station, if the station is
+ * favorite station, show favorite icon, else show non-favorite icon.
+ *
+ * @param station The station frequency
+ */
+ private void refreshStationUI(int station) {
+ // Change the station frequency displayed.
+ mTextStationValue.setText(FmRadioUtils.formatStation(station));
+ // Show or hide the favorite icon
+ if (FmRadioStation.isFavoriteStation(mContext, station)) {
+ mButtonAddToFavorite
+ .setImageResource(R.drawable.btn_fm_favorite_on_selector);
+ mTextStationName.setText(FmRadioStation.getStationName(mContext,
+ station, FmRadioStation.STATION_TYPE_FAVORITE));
+ } else {
+ mButtonAddToFavorite
+ .setImageResource(R.drawable.btn_fm_favorite_off_selector);
+ mTextStationName.setText("");
+ }
+ }
+
+ @SuppressWarnings("deprecation")
+ private void restoreConfiguration() {
+ // after configuration change, need to reduction else the UI is abnormal
+ if (null != getLastNonConfigurationInstance()) {
+ Log.d(TAG,
+ "Configration changes,activity restart,need to reset UI!");
+ Bundle bundle = (Bundle) getLastNonConfigurationInstance();
+ if (null == bundle) {
+ return;
+ }
+ mPrevRecorderState = bundle.getInt("mPrevRecorderState");
+ mRecordState = bundle.getInt("mRecordState");
+ mIsNeedShowRecordDlg = bundle.getBoolean("mIsFreshRecordingStatus");
+ // mIsNeedShowNoAntennaDlg = bundle.getBoolean("mIsNeedShowNoAntennaDlg");
+ mIsNeedShowSearchDlg = bundle.getBoolean("mIsNeedShowSearchDlg");
+ // we doesn't get it from service because the service may be
+ // null because not bind
+ mIsInRecordingMode = bundle.getBoolean("isInRecordingMode");
+ mIsPlaying = bundle.getBoolean("mIsPlaying");
+ Log.d(TAG, "bundle = " + bundle);
+ }
+ }
+
+ /**
+ * Start and bind service, reduction variable values if configuration
+ * changed
+ */
+ @Override
+ public void onStart() {
+ super.onStart();
+ FmRadioService.setActivityIsOnStop(false);
+ Log.d(TAG, "FmRadioActivity.onStart start");
+ // Should start FM service first.
+ if (null == startService(new Intent(FmRadioActivity.this,
+ FmRadioService.class))) {
+ Log.e(TAG, "Error: Cannot start FM service");
+ return;
+ }
+
+ mIsServiceStarted = true;
+ mIsServiceBinded = bindService(new Intent(FmRadioActivity.this,
+ FmRadioService.class), mServiceConnection,
+ Context.BIND_AUTO_CREATE);
+
+ if (!mIsServiceBinded) {
+ Log.e(TAG, "Error: Cannot bind FM service");
+ finish();
+ return;
+ }
+ restoreConfiguration();
+ Log.d(TAG, "FmRadioActivity.onStart end");
+ }
+
+ /**
+ * Refresh UI, when stop search, dismiss search dialog, pop up recording
+ * dialog if FM stopped when recording in background
+ */
+ @Override
+ public void onResume() {
+ super.onResume();
+/* Vanzo:libing on: Thu, 15 May 2014 18:17:38 +0800
+ * add for gesture
+ */
+ Log.d(TAG, "FMRadio onResume isGestureOpen = " + isGestureOpen());
+ if (isFmRadioGestureSupport() && isGestureOpen()) {
+ resumePsensor();
+ }
+// End of Vanzo:libing
+ Log.d(TAG, "FmRadioActivity.onResume start");
+ mIsActivityForeground = true;
+ if (null == mService) {
+ Log.d(TAG, "service has not bind finished");
+ mIsNeedShowNoAntennaDlg = false;
+ return;
+ }
+ updateMenuStatus();
+ updateDialogStatus();
+ if (!isRecordFileExist()) {
+ mButtonPlayback.setEnabled(false);
+ }
+ checkNoAntennaDialogInOnResume();
+ Log.d(TAG, "FmRadioActivity.onResume end");
+ }
+
+ /**
+ * In call and plug out earphone(in onPause state), need to show no antenna dialog but
+ * use mIsNeedShowNoAntennaDlg to save the state, because there is no where to show this dialog after onResume() for this case
+ */
+ private void checkNoAntennaDialogInOnResume() {
+ if (mIsNeedShowNoAntennaDlg && mService != null && !mService.isAntennaAvailable()
+ && !FmRadioUtils.isFmShortAntennaSupport()) {
+ Log.w(TAG, "Need to show no antenna dialog for plug out earphone in onPause state");
+ dismissNoAntennaDialog();
+ showNoAntennaDialog();
+ }
+ }
+
+ /**
+ * When activity is paused call this method, indicate activity enter
+ * background if press exit, power down FM
+ */
+ @Override
+ public void onPause() {
+ Log.d(TAG, "start FmRadioActivity.onPause");
+ mIsActivityForeground = false;
+ /**
+ * Should dismiss before call onSaveInstance, or it will resume
+ * automatic
+ */
+ mIsNeedShowSearchDlg = true;
+ dismissSearchDialog();
+
+ /**
+ * should dismiss before call onSaveInstance, or it will resume
+ * automatic.
+ */
+ FmRecordDialogFragment df = (FmRecordDialogFragment) mFragmentManager
+ .findFragmentByTag(TAG_SAVE_RECORDINGD);
+ if (null != df && df.getShowsDialog()) {
+ Log.d(TAG, "onPause.dismissSaveRecordingDialog()");
+ if (mService != null) {
+ mService.setModifiedRecordingName(df.getRecordingNameToSave());
+ }
+ dismissSaveRecordingDialog();
+ mIsNeedShowRecordDlg = true;
+ }
+
+ // Need to dismiss avoid AMS popup this dialog again for power up will show this dialog
+ if (dismissNoAntennaDialog()) {
+ mIsNeedShowNoAntennaDlg = true;
+ }
+
+ Log.d(TAG, "end FmRadioActivity.onPause");
+ super.onPause();
+ }
+
+ /**
+ * Called when activity enter stopped state, unbind service, if exit
+ * pressed, stop service
+ */
+ @Override
+ public void onStop() {
+ FmRadioService.setActivityIsOnStop(true);
+ Log.d(TAG, "start FmRadioActivity.onStop");
+ if (mIsServiceBinded) {
+ unbindService(mServiceConnection);
+ mIsServiceBinded = false;
+ }
+ mIsNeedShowNoAntennaDlg = false;
+ Log.d(TAG, "end FmRadioActivity.onStop");
+ super.onStop();
+/* Vanzo:libing on: Thu, 15 May 2014 18:15:55 +0800
+ * add for gesture
+ */
+ Log.d(TAG, "FMRadio onStop stopPsensor()");
+ if (isFmRadioGestureSupport()) {
+ stopPsensor();
+ }
+// End of Vanzo:libing
+ }
+
+ /**
+ * W activity destroy, unregister broadcast receiver and remove handler
+ * message
+ */
+ @Override
+ public void onDestroy() {
+ Log.d(TAG, "start FmRadioActivity.onDestroy");
+ unregisterSdcardReceiver();
+ // need to call this function because if doesn't do this,after
+ // configuration change will have many instance and recording time
+ // or playing time will not refresh
+ // Remove all the handle message
+ mHandler.removeCallbacksAndMessages(null);
+ if (mService != null) {
+ mService.unregisterFmRadioListener(mFmRadioListener);
+ }
+ mFmRadioListener = null;
+ if (null != mPopupMenu) {
+ mPopupMenu.dismiss();
+ mPopupMenu = null;
+ }
+ Log.d(TAG, "end FmRadioActivity.onDestroy");
+ super.onDestroy();
+ }
+
+ /**
+ * Create options menu
+ *
+ * @param menu The option menu
+ *
+ * @return true or false indicate need to handle other menu item
+ */
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ Log.d(TAG, "start FmRadioActivity.onCreateOptionsMenu");
+ MenuInflater inflater = getMenuInflater();
+ inflater.inflate(R.menu.fm_action_bar, menu);
+ mMenuItemChannelList = menu.findItem(R.id.fm_channel_list);
+ mMenuItemOverflow = menu.findItem(R.id.fm_menu);
+ mMenuItemPower = menu.findItem(R.id.fm_power);
+ Log.d(TAG, "end FmRadioActivity.onCreateOptionsMenu");
+ return true;
+ }
+
+ /**
+ * Prepare options menu
+ *
+ * @param menu The option menu
+ *
+ * @return true or false indicate need to handle other menu item
+ */
+ @Override
+ public boolean onPrepareOptionsMenu(Menu menu) {
+ Log.d(TAG, "start FmRadioActivity.onPrepareOptionsMenu");
+ mMenuItemChannelList.setVisible(!mIsInRecordingMode);
+ mMenuItemOverflow.setVisible(!mIsInRecordingMode);
+ mMenuItemPower.setVisible(!mIsInRecordingMode);
+ if (null == mService) {
+ Log.d(TAG, "mService is null");
+ return !mIsInRecordingMode;
+ }
+
+ boolean isPlaying = mService.isPowerUp();
+ boolean isMakePowerdown = mService.isMakePowerDown();
+ boolean isSeeking = mService.isSeeking();
+ boolean isScan = mService.isScanning();
+ // if fm power down by other app, should enable power menu, make it to
+ // powerup.
+ refreshActionMenuItem((isSeeking || isScan) ? false : isPlaying);
+ refreshActionMenuPower((isScan || isSeeking)
+ ? false
+ : (isPlaying || (isMakePowerdown && !mIsNeedDisablePower)));
+
+ // check whether show animation
+ if (isSeeking) {
+ Log.d(TAG, "onPrepareOptionsMenu: it is seeking");
+ startAnimation();
+ }
+
+ Log.d(TAG, "end FmRadioActivity.onPrepareOptionsMenu");
+ return !mIsInRecordingMode;
+ }
+
+ /**
+ * Handle event when option item selected
+ *
+ * @param item The clicked item
+ *
+ * @return true or false indicate need to handle other menu item or not
+ */
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ Log.d(TAG, "start FmRadioActivity.onOptionsItemSelected");
+ switch (item.getItemId()) {
+ case android.R.id.home:
+ onBackPressed();
+ break;
+
+ case R.id.fm_channel_list:
+ refreshImageButton(false);
+ refreshActionMenuItem(false);
+ refreshPopupMenuItem(false);
+ refreshActionMenuPower(false);
+ // Show favorite activity.
+ enterChannelList();
+ break;
+
+ case R.id.fm_power:
+ Log.d(TAG, "click fm_power menu");
+ if (mIsPlaying) {
+ refreshImageButton(false);
+ refreshActionMenuItem(false);
+ refreshPopupMenuItem(false);
+ refreshActionMenuPower(false);
+ exitService();
+ break;
+ }
+ powerUpFm();
+ break;
+
+ case R.id.fm_menu:
+ item.setEnabled(false);
+
+ mPopupMenu = new PopupMenu(mContext, findViewById(R.id.fm_menu));
+ Menu menu = mPopupMenu.getMenu();
+ mPopupMenu.getMenuInflater().inflate(R.menu.fm_menu, menu);
+ mPopupMenu.setOnMenuItemClickListener(this);
+ mPopupMenu.setOnDismissListener(this);
+
+ boolean isPlaying = mService.isPowerUp();
+ if (isPlaying) {
+ menu.findItem(R.id.fm_record).setEnabled(true);
+ menu.findItem(R.id.fm_sound_mode).setEnabled(!mService.isBtConnected());
+ menu.findItem(R.id.fm_sound_mode).setTitle(
+ mService.isSpeakerUsed() ? R.string.optmenu_earphone
+ : R.string.optmenu_speaker);
+ menu.findItem(R.id.fm_search).setEnabled(true);
+ }
+ refreshSoundModeVisiable();
+ mPopupMenu.show();
+ break;
+
+ default:
+ Log.e(TAG, "Error: Invalid options menu item.");
+ break;
+ }
+ Log.d(TAG, "end FmRadioActivity.onOptionsItemSelected");
+ return super.onOptionsItemSelected(item);
+ }
+
+ /**
+ * Check whether antenna is available
+ *
+ * @return true or false indicate antenna available or not
+ */
+ private boolean isAntennaAvailable() {
+ return mAudioManager.isWiredHeadsetOn();
+ }
+
+ /**
+ * When on activity result, tune to station which is from channel list
+ *
+ * @param requestCode The request code
+ * @param resultCode The result code
+ * @param data The intent from channel list
+ */
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (RESULT_OK == resultCode) {
+ if (REQUEST_CODE_FAVORITE != requestCode) {
+ Log.e(TAG, "Error: Invalid requestcode.");
+ return;
+ }
+ int iStation = data.getIntExtra(
+ FmRadioFavorite.ACTIVITY_RESULT, mCurrentStation);
+ // Tune to this station.
+ mCurrentStation = iStation;
+ // if tune from channel list, we should disable power menu,
+ // especially for
+ // power down state
+ mIsNeedDisablePower = true;
+ Log.d(TAG, "onActivityForReult:" + mIsNeedDisablePower);
+ if (null == mService) {
+ Log.d(TAG, "activity.onActivityResult mService is null");
+ mNeedTuneto = true;
+ return;
+ }
+ tuneToStation(iStation);
+ return;
+ }
+
+ if (FmRadioStation.isFavoriteStation(mContext, mCurrentStation)) {
+ mButtonAddToFavorite
+ .setImageResource(R.drawable.btn_fm_favorite_on_selector);
+ mTextStationName.setText(FmRadioStation.getStationName(
+ mContext, mCurrentStation,
+ FmRadioStation.STATION_TYPE_FAVORITE));
+ } else {
+ mButtonAddToFavorite
+ .setImageResource(R.drawable.btn_fm_favorite_off_selector);
+ mTextStationName.setText("");
+ }
+
+ // Do not handle other result.
+ Log.v(TAG, "The activity for requestcode " + requestCode
+ + " does not return any data.");
+ }
+
+ /**
+ * Start animation
+ */
+ private void startAnimation() {
+ mAnimImage.setAnimation(mAnimation);
+ mAnimImage.setVisibility(View.VISIBLE);
+ Log.d(TAG, "FmRadioActivity.startAnimation end");
+ }
+
+ /**
+ * Stop animation
+ */
+ private void stopAnimation() {
+ mAnimImage.setVisibility(View.INVISIBLE);
+ mAnimImage.setAnimation(null);
+ }
+
+ /**
+ * Restore recorder state from shared preference
+ */
+ private void restoreRecorderState() {
+ // here should do some recorder related.
+ mIsInRecordingMode = mService.getRecordingMode();
+ mRecordState = mService.getRecorderState();
+ RelativeLayout recInfoBar = (RelativeLayout) findViewById(R.id.rl_recinfo);
+ // if recording or play backing state, should send message trigger
+ // refresh.
+ if ((FmRecorder.STATE_RECORDING == mRecordState)
+ || (FmRecorder.STATE_PLAYBACK == mRecordState)) {
+ SharedPreferences sharedPreferences = getSharedPreferences(REFS_NAME, 0);
+ mRecordStartTime = sharedPreferences.getLong(START_RECORD_TIME, 0);
+ mPlayStartTime = sharedPreferences.getLong(START_PLAY_TIME, 0);
+ recInfoBar.setVisibility(View.VISIBLE);
+ Log.d(TAG, "&&&sendemptyMessage:mRecoderStart:" + mRecordStartTime);
+ mHandler.sendEmptyMessage(FmRadioListener.MSGID_REFRESH);
+ } else {
+ recInfoBar.setVisibility(View.GONE);
+ }
+ // if remove from app list, it will make recorder ui confused.
+ switchRecordLayout(mIsInRecordingMode);
+ changeRecordingMode(mIsInRecordingMode);
+ if (mIsInRecordingMode) {
+ refreshRecordingStatus(FmRecorder.STATE_INVALID);
+ }
+ }
+
+ /**
+ * Power up FM
+ */
+ private void powerUpFm() {
+ Log.v(TAG, "start powerUpFm");
+ refreshImageButton(false);
+ refreshActionMenuItem(false);
+ refreshPopupMenuItem(false);
+ refreshActionMenuPower(false);
+ startAnimation();
+ mService.powerUpAsync(FmRadioUtils.computeFrequency(mCurrentStation));
+ Log.v(TAG, "end powerUpFm");
+ }
+
+ private void setSpeakerPhoneOn(boolean isSpeaker) {
+ if (isSpeaker) {
+ Log.v(TAG, "UseSpeaker");
+ mService.setSpeakerPhoneOn(true);
+ } else {
+ Log.v(TAG, "UseEarphone");
+ mService.setSpeakerPhoneOn(false);
+ }
+ if (null != mPopupMenu) {
+ Menu menu = mPopupMenu.getMenu();
+ menu.findItem(R.id.fm_sound_mode).setTitle(mService.isSpeakerUsed() ?
+ R.string.optmenu_earphone : R.string.optmenu_speaker);
+ }
+ }
+
+ /**
+ * Tune to a station
+ *
+ * @param station The tune station
+ */
+ private void tuneToStation(final int station) {
+ refreshImageButton(false);
+ refreshActionMenuItem(false);
+ refreshPopupMenuItem(false);
+ refreshActionMenuPower(false);
+ mService.tuneStationAsync(FmRadioUtils.computeFrequency(station));
+ if (!mIsPlaying) {
+ startAnimation();
+ }
+ }
+
+ /**
+ * Seek station according current frequency and direction
+ *
+ * @param station The seek start station
+ * @param direction The seek direction
+ */
+ private void seekStation(final int station, boolean direction) {
+ // If the seek AsyncTask has been executed and not canceled, cancel it
+ // before start new.
+ startAnimation();
+ refreshImageButton(false);
+ refreshActionMenuItem(false);
+ refreshPopupMenuItem(false);
+ refreshActionMenuPower(false);
+ mService.seekStationAsync(FmRadioUtils.computeFrequency(station),
+ direction);
+ }
+
+ private void refreshImageButton(boolean enabled) {
+ mButtonDecrease.setEnabled(enabled);
+ mButtonPrevStation.setEnabled(enabled);
+ mButtonNextStation.setEnabled(enabled);
+ mButtonIncrease.setEnabled(enabled);
+ }
+
+ // Refresh action menu except power menu
+ private void refreshActionMenuItem(boolean enabled) {
+ // action menu
+ if (null != mMenuItemChannelList) {
+ // if power down by other app, should disable channelist list, over
+ // menu
+ mMenuItemChannelList.setEnabled(enabled);
+ mMenuItemOverflow.setEnabled(enabled);
+ }
+ }
+
+ // Refresh action menu only power menu
+ private void refreshActionMenuPower(boolean enabled) {
+ Log.d(TAG, "refreshActionMenuPower enabled:" + enabled + ", mIsPlaying:" + mIsPlaying);
+ // action menu
+ if (null != mMenuItemChannelList) {
+ // if fm power down by other app, should enable this button to
+ // powerup.
+ mMenuItemPower.setEnabled(enabled);
+ mMenuItemPower.setIcon(mIsPlaying ? R.drawable.btn_fm_powerup_selector
+ : R.drawable.btn_fm_powerdown_selector);
+ }
+ }
+
+ private void refreshPopupMenuItem(boolean enabled) {
+ if (null != mPopupMenu) {
+ Menu menu = mPopupMenu.getMenu();
+ menu.findItem(R.id.fm_record).setEnabled(enabled);
+ menu.findItem(R.id.fm_search).setEnabled(enabled);
+ menu.findItem(R.id.fm_sound_mode).setEnabled(enabled && !mService.isBtConnected());
+ refreshSoundModeVisiable();
+ }
+ }
+
+ private void refreshSoundModeVisiable() {
+ if (null != mPopupMenu) {
+ Menu menu = mPopupMenu.getMenu();
+ // Need hide only short antenna support and not plug in earphone
+ boolean hideSoundMode = SHORT_ANNTENNA_SUPPORT && !mService.isAntennaAvailable();
+ boolean showSoundMode = !hideSoundMode;
+ menu.findItem(R.id.fm_sound_mode).setVisible(showSoundMode);
+ }
+ }
+
+ private void refreshRecordNotIdle() {
+ mButtonRecord.setEnabled(false);
+ mButtonPlayback.setEnabled(false);
+ mButtonStop.setEnabled(false);
+ }
+
+ private void refreshRecordIdle() {
+ mButtonRecord.setEnabled(true);
+ mButtonPlayback.setEnabled(false);
+ mButtonStop.setEnabled(false);
+ }
+
+ private void refreshPlaybackIdle(boolean btnPlayBack) {
+ mButtonRecord.setEnabled(true);
+ mButtonPlayback.setEnabled(btnPlayBack);
+ mButtonStop.setEnabled(false);
+ }
+
+ private void refreshRecording() {
+ mButtonRecord.setEnabled(false);
+ mButtonPlayback.setEnabled(false);
+ mButtonStop.setEnabled(true);
+ }
+
+ private void refreshPlaybacking() {
+ mButtonRecord.setEnabled(false);
+ mButtonPlayback.setEnabled(false);
+ mButtonStop.setEnabled(true);
+ }
+
+ /**
+ * Called when back pressed
+ */
+ @Override
+ public void onBackPressed() {
+ Log.d(TAG, "begin FmRadioActivity.onBackPressed");
+
+ if (mIsInRecordingMode) {
+ changeRecordingMode(false);
+ if (null == mService) {
+ Log.d(TAG, "mService is null");
+ return;
+ }
+ // no need consider power down and other situation
+ boolean isPlaying = mService.isPowerUp();
+ refreshImageButton(isPlaying);
+ refreshPopupMenuItem(isPlaying);
+ refreshActionMenuItem(isPlaying);
+ refreshActionMenuPower(true);
+ if (mService != null && !mService.isAntennaAvailable()
+ && !FmRadioUtils.isFmShortAntennaSupport()) {
+ Log.w(TAG, "Need to show no antenna dialog for plug out earphone in onPause state");
+ dismissNoAntennaDialog();
+ showNoAntennaDialog();
+ }
+ return;
+ }
+
+ // exit fm, disable all button
+ if (!mIsPlaying && (null != mService) && !mService.isPowerUping()) {
+ refreshImageButton(false);
+ refreshActionMenuItem(false);
+ refreshPopupMenuItem(false);
+ refreshActionMenuPower(false);
+ exitService();
+ return;
+ }
+
+ super.onBackPressed();
+ Log.d(TAG, "end FmRadioActivity.onBackPressed");
+ }
+
+ private void showToast(CharSequence text) {
+ if (null == mToast) {
+ mToast = Toast.makeText(mContext, text, Toast.LENGTH_SHORT);
+ }
+ mToast.setText(text);
+ mToast.show();
+ Log.v(TAG, "FmRadioActivity.showToast: toast = " + text);
+ }
+
+ private void showRds(String text) {
+ mTextRds.setText(text);
+ mTextRds.setSelected(true);
+ Log.v(TAG, "FmRadioActivity.showRds: RDS = " + text);
+ }
+
+ /**
+ * Change recording mode
+ *
+ * @param recordingMode The current recording mode
+ */
+ private void changeRecordingMode(boolean recordingMode) {
+ Log.d(TAG, "changeRecordingMode: " + recordingMode);
+ if (mIsInRecordingMode == recordingMode) {
+ Log.e(TAG, "FM already " + (recordingMode ? "in" : "NOT in")
+ + "recording mode!");
+ return;
+ }
+ mIsInRecordingMode = recordingMode;
+ mService.setRecordingModeAsync(recordingMode);
+ switchRecordLayout(recordingMode);
+ }
+
+ /**
+ * Switch to record layout, if in recorder mode.
+ *
+ * @param recordingMode true in recorder mode, false not in recorder mode
+ */
+ private void switchRecordLayout(boolean recordingMode) {
+ ActionBar actionBar = getActionBar();
+ invalidateOptionsMenu();
+
+ // Set the action bar on the right to be up navigation
+ actionBar.setDisplayHomeAsUpEnabled(recordingMode);
+ actionBar.setHomeButtonEnabled(recordingMode);
+ actionBar.setTitle(recordingMode ? R.string.fm_recorder_name
+ : R.string.app_name);
+
+ LinearLayout recBar = (LinearLayout) findViewById(R.id.bottom_bar_recorder);
+ LinearLayout bottomBar = (LinearLayout) findViewById(R.id.bottom_bar);
+
+ bottomBar.setVisibility(recordingMode ? View.GONE : View.VISIBLE);
+ recBar.setVisibility(recordingMode ? View.VISIBLE : View.GONE);
+ mButtonAddToFavorite.setVisibility(recordingMode ? View.GONE
+ : View.VISIBLE);
+ }
+
+ /**
+ * Update recording UI according record state
+ *
+ * @param stateOverride The recording state
+ */
+ private void refreshRecordingStatus(int stateOverride) {
+ int recorderState = FmRecorder.STATE_INVALID;
+
+ recorderState = (stateOverride == FmRecorder.STATE_INVALID ? mService
+ .getRecorderState() : stateOverride);
+
+ Log.d(TAG, "refreshRecordingStatus: state=" + recorderState);
+ switch (recorderState) {
+ case FmRecorder.STATE_IDLE:
+ long recordTime = mService.getRecordTime();
+ if (recordTime > 0) {
+ if (isRecordFileExist()) {
+ mButtonPlayback.setEnabled(true);
+ }
+
+ if (FmRecorder.STATE_RECORDING == mPrevRecorderState) {
+ Log.d(TAG, "need show recorder dialog.mPrevRecorderState:" +
+ mPrevRecorderState);
+ if (mIsActivityForeground) {
+ showSaveRecordingDialog();
+ } else {
+ mIsNeedShowRecordDlg = true;
+ }
+ }
+ } else {
+ mButtonPlayback.setEnabled(false);
+ }
+
+ refreshPlaybackIdle((recordTime > 0) && isRecordFileExist());
+ mRLRecordInfo.setVisibility(View.GONE);
+ break;
+
+ case FmRecorder.STATE_RECORDING:
+ mTxtRecInfoLeft.setText("");
+ mTxtRecInfoRight.setText("");
+ mTxtRecInfoLeft.setSelected(false);
+ refreshRecording();
+ mRLRecordInfo.setVisibility(View.VISIBLE);
+ break;
+
+ case FmRecorder.STATE_PLAYBACK:
+ String recordingName = mService.getRecordingName();
+ if (null == recordingName) {
+ recordingName = "";
+ }
+ mTxtRecInfoLeft.setText(recordingName);
+ mTxtRecInfoRight.setText("");
+ mTxtRecInfoLeft.setSelected(true);
+ refreshPlaybacking();
+ mRLRecordInfo.setVisibility(View.VISIBLE);
+ break;
+
+ case FmRecorder.STATE_INVALID:
+ refreshRecordIdle();
+ mRLRecordInfo.setVisibility(View.GONE);
+ break;
+
+ default:
+ Log.d(TAG, "invalid record status");
+ break;
+ }
+ mPrevRecorderState = recorderState;
+ Log.d(TAG, "refreshRecordingStatus.mPrevRecorderState:" + mPrevRecorderState);
+ }
+
+ /**
+ * Check whether FM recording temporary file exist
+ *
+ * @return true if FM recording temporary file exist, false not exist FM
+ * recording temporary file
+ */
+ private boolean isRecordFileExist() {
+ String fileName = null;
+ fileName = mService.getRecordingNameWithPath();
+ // if recording file is delete by user, play button disabled
+ File recordingFileToSave = new File(fileName + FmRecorder.RECORDING_FILE_EXTENSION);
+ return recordingFileToSave.exists();
+ }
+
+ /**
+ * use onRetainNonConfigurationInstance because after configuration change,
+ * activity will destroy and create need use this function to save some
+ * important variables
+ */
+ @Override
+ public Object onRetainNonConfigurationInstance() {
+ final int size = 5;
+ Bundle bundle = new Bundle(size);
+ bundle.putBoolean("isInRecordingMode", mIsInRecordingMode);
+ bundle.putInt("mPrevRecorderState", mPrevRecorderState);
+ bundle.putBoolean("mIsFreshRecordingStatus", mIsNeedShowRecordDlg);
+ //bundle.putBoolean("mIsNeedShowNoAntennaDlg", mIsNeedShowNoAntennaDlg);
+ bundle.putBoolean("mIsNeedShowSearchDlg", mIsNeedShowSearchDlg);
+ bundle.putInt("mRecordState", mRecordState);
+ bundle.putBoolean("mIsPlaying", mIsPlaying);
+ Log.d(TAG, "onRetainNonConfigurationInstance() bundle:" + bundle);
+ return bundle;
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ Log.d(TAG, "onSaveInstanceState");
+ super.onSaveInstanceState(outState);
+ }
+
+ /**
+ * Handle event about pop up menu clicked
+ *
+ * @param item The pop up menu item
+ *
+ * @return true or false indicate need to handle other menu item or not
+ */
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ Log.d(TAG, "onMenuItemClick:" + item.getItemId());
+ switch (item.getItemId()) {
+ case R.id.fm_search:
+ // Don't show search dialog when activity is background
+ if (!mIsActivityForeground) {
+ Log.w(TAG, "click searh menu in background, don't show search dialog");
+ return false;
+ }
+ mIsNeedShowSearchDlg = true;
+ refreshImageButton(false);
+ refreshActionMenuItem(false);
+ refreshPopupMenuItem(false);
+ refreshActionMenuPower(false);
+ showSearchDialog();
+ FmRadioStation.cleanSearchedStations(mContext);
+ mService.startScanAsync();
+ break;
+
+ case R.id.fm_sound_mode:
+ setSpeakerPhoneOn(!mService.isSpeakerUsed());
+ break;
+
+ case R.id.fm_record:
+ changeRecordingMode(true);
+ refreshRecordingStatus(FmRecorder.STATE_INVALID);
+ break;
+
+ default:
+ Log.d(TAG, "invalid menu item");
+ break;
+ }
+ return false;
+ }
+
+ /**
+ * Called when PopUp menu dismissed
+ *
+ * @param PopUp The menu which dismiss
+ */
+ @Override
+ public void onDismiss(PopupMenu menu) {
+ Log.d(TAG, "popmenu dismiss listener:" + menu);
+ invalidateOptionsMenu();
+ }
+
+ /**
+ * Exit FM service
+ */
+ private void exitService() {
+ Log.i(TAG, "exitService");
+ if (mIsServiceBinded) {
+ unbindService(mServiceConnection);
+ mIsServiceBinded = false;
+ }
+
+ if (mIsServiceStarted) {
+ boolean isSuccess = stopService(new Intent(
+ FmRadioActivity.this, FmRadioService.class));
+ if (!isSuccess) {
+ Log.e(TAG, "Error: Cannot stop the FM service.");
+ }
+ mIsServiceStarted = false;
+ }
+ }
+
+ /**
+ * Show no antenna dialog
+ */
+ public void showNoAntennaDialog() {
+ NoAntennaDialog newFragment = NoAntennaDialog.newInstance();
+ newFragment.show(mFragmentManager, TAG_NO_ANTENNA);
+ mFragmentManager.executePendingTransactions();
+ }
+
+ /**
+ * Show save recording dialog
+ *
+ * @param name The recording file name
+ */
+ public void showSaveRecordingDialog() {
+ String sdcard = FmRadioService.getRecordingSdcard();
+ String defaultName = mService.getRecordingName();
+ String recordingName = mService.getModifiedRecordingName();
+ FmRecordDialogFragment newFragment =
+ new FmRecordDialogFragment(sdcard, defaultName, recordingName);
+ newFragment.show(mFragmentManager, TAG_SAVE_RECORDINGD);
+ mFragmentManager.executePendingTransactions();
+ }
+
+ /**
+ * Show search dialog
+ */
+ private void showSearchDialog() {
+ SearchChannelsDialog newFragment = SearchChannelsDialog.newInstance();
+ newFragment.show(mFragmentManager, TAG_SEARCH);
+ mFragmentManager.executePendingTransactions();
+ }
+
+ /**
+ * Dismiss search dialog
+ */
+ private void dismissSearchDialog() {
+ SearchChannelsDialog newFragment = (SearchChannelsDialog) mFragmentManager
+ .findFragmentByTag(TAG_SEARCH);
+ if (null != newFragment) {
+ newFragment.dismissAllowingStateLoss();
+ }
+ }
+
+ /**
+ * Dismiss save recording dialog
+ */
+ private void dismissSaveRecordingDialog() {
+ FragmentTransaction ft = mFragmentManager.beginTransaction();
+ Fragment fragment = mFragmentManager.findFragmentByTag(TAG_SAVE_RECORDINGD);
+ if (null != fragment) {
+ ft.remove(fragment);
+ ft.commitAllowingStateLoss();
+ }
+ }
+
+ /**
+ * Check whether recording card is unmounted
+ *
+ * @param intent The intent about sdcard
+ *
+ * @return true or false indicate recording card unmount or not
+ */
+ private boolean isRecordingCardUnmount(Intent intent) {
+ String sdcard = FmRadioService.getRecordingSdcard();
+ String unmountSDCard = intent.getData().toString();
+ Log.d(TAG, "unmount sd card file path: " + unmountSDCard);
+ return unmountSDCard.equalsIgnoreCase("file://" + sdcard) ? true
+ : false;
+ }
+
+ /**
+ * Dismiss no antenna dialog
+ */
+ private boolean dismissNoAntennaDialog() {
+ NoAntennaDialog newFragment = (NoAntennaDialog) mFragmentManager
+ .findFragmentByTag(TAG_NO_ANTENNA);
+ if (null != newFragment) {
+ newFragment.dismissAllowingStateLoss();
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Cancel search progress
+ */
+ public void cancelSearch() {
+ Log.d(TAG, "FmRadioActivity.cancelSearch");
+ mService.stopScan();
+ }
+
+ /**
+ * No antenna continue to operate
+ */
+ @Override
+ public void noAntennaContinue() {
+ // We let user use the app if no antenna.
+ // But we do not automatically start FM.
+ Log.d(TAG, " noAntennaContinue.onClick ok to continue");
+ if (isAntennaAvailable()) {
+ powerUpFm();
+ } else {
+ Log.d(TAG, "noAntennaContinue.earphone is not ready");
+ mService.switchAntennaAsync(1);
+ }
+ }
+
+ /**
+ * No antenna cancel to operate
+ */
+ @Override
+ public void noAntennaCancel() {
+ Log.d(TAG, " onClick Negative");
+ if (mService != null && !mService.isInLockTaskMode()) {
+ exitService();
+ } else {
+ Log.d(TAG, "No need exit Service and Activity cause current is lock mode");
+ }
+ }
+
+ /**
+ * Recording dialog click
+ *
+ * @param recordingName The new recording name
+ */
+ @Override
+ public void onRecordingDialogClick(String recordingName) {
+ mService.saveRecordingAsync(recordingName);
+ mService.setModifiedRecordingName(null);
+ }
+
+ /**
+ * Update rds information
+ */
+ private void updateRds() {
+ if (mIsPlaying) {
+ Bundle bundle = new Bundle(2);
+ bundle.putString(FmRadioListener.KEY_PS_INFO, mService.getPS());
+ bundle.putString(FmRadioListener.KEY_RT_INFO, mService.getLRText());
+ Message msg = mHandler
+ .obtainMessage(FmRadioListener.LISTEN_PS_CHANGED);
+ msg.setData(bundle);
+ mHandler.sendMessage(msg);
+ }
+ }
+
+ /**
+ * Update current station according service station
+ */
+ private void updateCurrentStation() {
+ // get the frequency from service, set frequency in activity, UI,
+ // database
+ // same as the frequency in service
+ int freq = mService.getFrequency();
+ if (FmRadioUtils.isValidStation(freq)) {
+ if (mCurrentStation != freq) {
+ Log.d(TAG, "frequency in service isn't same as in database");
+ mCurrentStation = freq;
+ FmRadioStation.setCurrentStation(mContext, mCurrentStation);
+ refreshStationUI(mCurrentStation);
+ }
+ }
+ }
+
+ /**
+ * Update button status, and dialog status
+ */
+ private void updateDialogStatus() {
+ Log.d(TAG, "updateDialogStatus.mIsNeedShowSearchDlg:" + mIsNeedShowSearchDlg);
+ boolean isScan = mService.isScanning();
+ // check whether show search dialog, because it may be dismissed
+ // onSaveInstance
+ if (isScan && mIsNeedShowSearchDlg) {
+ Log.d(TAG, "updateDialogStatus: show search dialog. isScan is " + isScan);
+ mIsNeedShowSearchDlg = false;
+ showSearchDialog();
+ }
+
+ // check whether show recorder dialog, when activity is foreground
+ if (mIsNeedShowRecordDlg) {
+ Log.d(TAG, "updateDialogStatus.resume recordDlg.mPrevRecorderState:" +
+ mPrevRecorderState);
+ showSaveRecordingDialog();
+ mIsNeedShowRecordDlg = false;
+ }
+
+ /*
+ // check whether show no antenna dialog, when activity is foreground
+ if (mIsNeedShowNoAntennaDlg) {
+ Log.d(TAG, "updateDialogStatus.resume noAntennaDlg:");
+ showNoAntennaDialog();
+ refreshActionMenuPower(true);
+ mIsNeedShowNoAntennaDlg = false;
+ }
+ */
+ }
+
+ /**
+ * Update menu status, and animation
+ */
+ private void updateMenuStatus() {
+ boolean isPlaying = mService.isPowerUp();
+ boolean isPoweruping = mService.isPowerUping();
+ boolean isSeeking = mService.isSeeking();
+ boolean isScan = mService.isScanning();
+ boolean isMakePowerdown = mService.isMakePowerDown();
+ Log.d(TAG, "updateMenuStatus.isSeeking:" + isSeeking);
+ boolean fmStatus = (isScan || isSeeking || isPoweruping);
+ // when seeking, all button should disabled,
+ // else should update as origin status
+ refreshImageButton(fmStatus ? false : isPlaying);
+ refreshPopupMenuItem(fmStatus ? false : isPlaying);
+ refreshActionMenuItem(fmStatus ? false : isPlaying);
+ // if fm power down by other app, should enable power button
+ // to powerup.
+ Log.d(TAG, "updateMenuStatus.mIsNeedDisablePower: " + mIsNeedDisablePower);
+ refreshActionMenuPower(fmStatus ? false :
+ (isPlaying || (isMakePowerdown && !mIsNeedDisablePower)));
+
+ // check whether show animation
+ if (isSeeking || isPoweruping) {
+ Log.d(TAG, "updateMenuStatus. it is seeking or poweruping");
+ startAnimation();
+ }
+ }
+
+ private void initUiComponent() {
+ Log.i(TAG, "initUIComponent");
+ mTextRds = (TextView) findViewById(R.id.text_rds);
+ mTextRds.setText("");
+ mTextFm = (TextView) findViewById(R.id.text_fm);
+ mTextFm.setText(FM);
+ mTextMHz = (TextView) findViewById(R.id.text_mhz);
+ mTextMHz.setText(R.string.fm_unit);
+
+ mTextStationValue = (TextView) findViewById(R.id.station_value);
+ mTxtRecInfoLeft = (TextView) findViewById(R.id.txtRecInfoLeft);
+ mTxtRecInfoRight = (TextView) findViewById(R.id.txtRecInfoRight);
+ mRLRecordInfo = (RelativeLayout) findViewById(R.id.rl_recinfo);
+ mButtonRecord = (ImageButton) findViewById(R.id.btn_record);
+ mButtonStop = (ImageButton) findViewById(R.id.btn_stop);
+ mButtonPlayback = (ImageButton) findViewById(R.id.btn_playback);
+ mButtonAddToFavorite = (ImageButton) findViewById(R.id.button_add_to_favorite);
+ mTextStationName = (TextView) findViewById(R.id.station_name);
+ mButtonDecrease = (ImageButton) findViewById(R.id.button_decrease);
+ mButtonIncrease = (ImageButton) findViewById(R.id.button_increase);
+ mButtonPrevStation = (ImageButton) findViewById(R.id.button_prevstation);
+ mButtonNextStation = (ImageButton) findViewById(R.id.button_nextstation);
+
+ // initial mPopupMenu
+ mPopupMenu = new PopupMenu(mContext, findViewById(R.id.fm_menu));
+ Menu menu = mPopupMenu.getMenu();
+ mPopupMenu.getMenuInflater().inflate(R.menu.fm_menu, menu);
+
+ // put favorite button here since it might be used very early in
+ // changing recording mode
+ mCurrentStation = FmRadioStation.getCurrentStation(mContext);
+ boolean isFavoriteStation = FmRadioStation.isFavoriteStation(mContext,
+ mCurrentStation);
+ // If the current station is in favorite, set its icon to favorite icon;
+ // else, set to none favorite icon.
+ if (isFavoriteStation) {
+ mButtonAddToFavorite
+ .setImageResource(R.drawable.btn_fm_favorite_on_selector);
+ mTextStationName.setText(FmRadioStation.getStationName(mContext,
+ mCurrentStation, FmRadioStation.STATION_TYPE_FAVORITE));
+ } else {
+ mButtonAddToFavorite
+ .setImageResource(R.drawable.btn_fm_favorite_off_selector);
+ }
+
+ mTextStationValue.setText(FmRadioUtils.formatStation(mCurrentStation));
+ mAnimation = (Animation) AnimationUtils.loadAnimation(this,
+ R.drawable.anim);
+ mAnimImage = (ImageView) findViewById(R.id.iv_anim);
+ mAnimImage.setVisibility(View.INVISIBLE);
+ }
+
+ private void registerButtonClickListener() {
+ mButtonRecord.setOnClickListener(mButtonClickListener);
+ mButtonStop.setOnClickListener(mButtonClickListener);
+ mButtonPlayback.setOnClickListener(mButtonClickListener);
+ mButtonAddToFavorite.setOnClickListener(mButtonClickListener);
+ mButtonDecrease.setOnClickListener(mButtonClickListener);
+ mButtonIncrease.setOnClickListener(mButtonClickListener);
+ mButtonPrevStation.setOnClickListener(mButtonClickListener);
+ mButtonNextStation.setOnClickListener(mButtonClickListener);
+ }
+
+ private void registerSdcardReceiver() {
+ IntentFilter iFilter = new IntentFilter();
+ iFilter.addAction(Intent.ACTION_MEDIA_EJECT);
+ iFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
+ iFilter.addAction(Intent.ACTION_MEDIA_MOUNTED);
+ iFilter.addDataScheme("file");
+ registerReceiver(mSdcardListener, iFilter);
+ }
+
+ private void unregisterSdcardReceiver() {
+ unregisterReceiver(mSdcardListener);
+ }
+
+ private void refreshTimeText() {
+ Log.d(TAG, "refreshTimeText:mRecordState:" + mRecordState);
+ if (!mIsInRecordingMode) {
+ Log.d(TAG, "refreshTimeText:mIsInRecordingMode:" + mIsInRecordingMode);
+ if (mRecordState == FmRecorder.STATE_RECORDING) {
+ mService.stopRecordingAsync();
+ } else if (mRecordState == FmRecorder.STATE_PLAYBACK) {
+ mService.stopPlaybackAsync();
+ }
+ return;
+ }
+
+ final int oneSecond = 1000;
+ switch (mRecordState) {
+ case FmRecorder.STATE_RECORDING:
+ int recordTime = (int) ((SystemClock.elapsedRealtime() - mRecordStartTime) /
+ oneSecond);
+ mTxtRecInfoLeft.setText(getTimeString(recordTime));
+ Log.d(TAG, "Recording time = " + mTxtRecInfoLeft.getText());
+ String recordingSdcard = FmRadioService.getRecordingSdcard();
+ if (!FmRadioUtils.hasEnoughSpace(recordingSdcard)) {
+ // recordTime 1s to avoid start() then quickly stop() native exception
+ if (recordTime > 1) {
+ // Insufficient storage
+ mService.stopRecordingAsync();
+ }
+ }
+ break;
+
+ case FmRecorder.STATE_PLAYBACK:
+ int playTime = (int) ((SystemClock.elapsedRealtime() - mPlayStartTime) / oneSecond);
+ mTxtRecInfoRight.setText(getTimeString(playTime));
+ Log.d(TAG, "Playing time = " + mTxtRecInfoRight.getText());
+ break;
+
+ default:
+ break;
+ }
+ mHandler.sendEmptyMessageDelayed(FmRadioListener.MSGID_REFRESH, oneSecond);
+ }
+}
diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioActivity.java~ b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioActivity.java~
new file mode 100755
index 0000000..37ddfdd
--- /dev/null
+++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioActivity.java~
@@ -0,0 +1,2196 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2011-2014. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.fmradio;
+
+import android.app.ActionBar;
+import android.app.Activity;
+import android.app.Fragment;
+import android.app.FragmentManager;
+import android.app.FragmentTransaction;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.ServiceConnection;
+import android.content.SharedPreferences;
+import android.media.AudioManager;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Message;
+import android.os.SystemClock;
+import android.util.Log;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.PopupMenu;
+import android.widget.PopupMenu.OnDismissListener;
+import android.widget.PopupMenu.OnMenuItemClickListener;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.mediatek.fmradio.dialogs.NoAntennaDialog;
+import com.mediatek.fmradio.dialogs.SearchChannelsDialog;
+import com.mediatek.fmradio.ext.IProjectStringExt;
+
+import java.io.File;
+/* Vanzo:libing on: Thu, 15 May 2014 19:34:51 +0800
+ */
+import java.io.FileReader;
+import java.io.IOException;
+import android.app.ActivityManager;
+import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+import android.hardware.SensorEventListener;
+import android.hardware.SensorManager;
+import android.os.SystemProperties;
+//import com.android.featureoption.FeatureOption;
+// End of Vanzo:libing
+
+/**
+ * This class interact with user, provider FM basic function and FM recording
+ * function
+ */
+public class FmRadioActivity extends Activity implements
+/* Vanzo:libing on: Thu, 15 May 2014 19:36:32 +0800
+ */
+ SensorEventListener,
+// End of Vanzo:libing
+ OnMenuItemClickListener, OnDismissListener,
+ NoAntennaDialog.NoAntennaListener,
+ SearchChannelsDialog.CancelSearchListener,
+ FmRecordDialogFragment.OnRecordingDialogClickListener {
+ // Logging
+ private static final String TAG = "FmRx/Activity";
+
+ // Dialog tags
+ private static final String TAG_SEARCH = "Search";
+ private static final String TAG_SAVE_RECORDINGD = "SaveRecording";
+ private static final String TAG_NO_ANTENNA = "NoAntenna";
+
+ // Use shared preference to store record or play time
+ private static final String REFS_NAME = "FMRecord";
+ private static final String START_RECORD_TIME = "startRecordTime";
+ private static final String START_PLAY_TIME = "startPlayTime";
+
+ // Request code
+ private static final int REQUEST_CODE_FAVORITE = 1;
+
+ // FM
+ private static final String FM = "FM";
+ // Short antenna support
+ private static final boolean SHORT_ANNTENNA_SUPPORT = FmRadioUtils.isFmShortAntennaSupport();
+
+ // UI views
+ private TextView mTextStationName = null;
+ private TextView mTextStationValue = null;
+ // RDS text view
+ private TextView mTextRds = null;
+ // Text view display "FM"
+ private TextView mTextFm = null;
+ // Text View display "MHZ"
+ private TextView mTextMHz = null;
+ private TextView mTxtRecInfoLeft = null;
+ private TextView mTxtRecInfoRight = null;
+ private ImageButton mButtonDecrease = null;
+ private ImageButton mButtonPrevStation = null;
+ private ImageButton mButtonNextStation = null;
+ private ImageButton mButtonIncrease = null;
+ private ImageButton mButtonAddToFavorite = null;
+ private ImageButton mButtonRecord = null;
+ private ImageButton mButtonStop = null;
+ private ImageButton mButtonPlayback = null;
+ private Animation mAnimation = null;
+ private ImageView mAnimImage = null;
+
+ // Layout display recording file information
+ private RelativeLayout mRLRecordInfo = null;
+
+ // Menu items
+ private MenuItem mMenuItemChannelList = null;
+ private MenuItem mMenuItemOverflow = null;
+ private MenuItem mMenuItemPower = null;
+ private PopupMenu mPopupMenu = null;
+
+ // State variables
+ private boolean mIsServiceStarted = false;
+ private boolean mIsServiceBinded = false;
+ private boolean mNeedTuneto = false;
+ private boolean mIsNeedDisablePower = false;
+ private boolean mIsPlaying = false;
+ private boolean mIsInRecordingMode = false;
+ private boolean mIsNeedShowRecordDlg = false;
+ private boolean mIsNeedShowNoAntennaDlg = false;
+ private boolean mIsNeedShowSearchDlg = true;
+ private boolean mIsActivityForeground = true;
+
+ // Record variables
+ private long mRecordStartTime = 0;
+ private long mPlayStartTime = 0;
+ private int mPrevRecorderState = FmRecorder.STATE_INVALID;
+ private int mCurrentStation = FmRadioUtils.DEFAULT_STATION;
+ private int mRecordState = 0;
+
+ // Instance variables
+ private FmRadioService mService = null;
+ private Context mContext = null;
+ private Toast mToast = null;
+ private FragmentManager mFragmentManager = null;
+ private AudioManager mAudioManager = null;
+
+ // Plugin
+ private IProjectStringExt mProjectStringExt = null;
+/* Vanzo:libing on: Fri, 02 Aug 2013 15:31:08 +0800
+ */
+ private static final String GESTURE_SWITCH_FLAG = "persist.sys.gesture_switch";
+ private static final String GESTURE_FMRADIO_FLAG = "persist.sys.gesture_fmradio";
+
+ // 1.first psensor value large than the GESTURE_FMRADIO_MAX_DISTANCE
+ private static int GESTURE_FMRADIO_MAX_DISTANCE = 350;
+ // 2.second psensor value small than the GESTURE_FMRADIO_MIN_DISTANCE
+ private static int GESTURE_FMRADIO_MIN_DISTANCE = 150;
+ // delay time of the gesture run hander,200 is 0.2s
+ private static final int GESTURE_RUN_POST_DELAY_TIME = 200;
+ private SensorManager mSensorManager;
+ private Sensor mSensor = null;
+ private Handler myHandler;
+ private int mPrePsensor = 0;
+
+ private boolean mGestureEnabled;
+ private boolean mFMRadioEnabled;
+ private boolean mHavePsensor = true;
+ private boolean mHadGesture = false;
+// end of vanzo:libing
+/* Vanzo:lupei on: Fri, 28 Aug 2015 14:50:36 +0800
+ * add default gesture distance max min value
+ */
+ //private String DEFAULT_GESTURE_DIST_MAX_MIN = com.android.featureoption.FeatureOption.VANZO_FEATURE_DEFAULT_GESTURE_DISTANCE_MAX_MIN_VALUE;
+// End of Vanzo:lupei
+
+ // Service listener
+ private FmRadioListener mFmRadioListener = new FmRadioListener() {
+ @Override
+ public void onCallBack(Bundle bundle) {
+ int flag = bundle.getInt(FmRadioListener.CALLBACK_FLAG);
+ Log.d(TAG, "call back method flag:" + flag);
+
+ if (flag == FmRadioListener.MSGID_FM_EXIT) {
+ mHandler.removeCallbacksAndMessages(null);
+ }
+
+ // remove tag message first, avoid too many same messages in queue.
+ Message msg = mHandler.obtainMessage(flag);
+ msg.setData(bundle);
+ mHandler.removeMessages(flag);
+ mHandler.sendMessage(msg);
+ }
+ };
+
+ // Handle sdcard unmount event
+ private final BroadcastReceiver mSdcardListener = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+
+ if (Intent.ACTION_MEDIA_MOUNTED.equals(action)) {
+ Log.d(TAG, "Sd card mounted");
+ return;
+ }
+
+ // If not unmount recording sd card, do nothing;
+ if (!isRecordingCardUnmount(intent)) {
+ return;
+ }
+
+ if (Intent.ACTION_MEDIA_EJECT.equals(action)
+ || Intent.ACTION_MEDIA_UNMOUNTED.equals(action)) {
+ FmRecordDialogFragment df = (FmRecordDialogFragment) mFragmentManager
+ .findFragmentByTag(TAG_SAVE_RECORDINGD);
+ if ((null != df && df.getShowsDialog()) || mIsNeedShowRecordDlg) {
+ Log.d(TAG, "recording sd card unmounted,dismiss save dialog");
+ dismissSaveRecordingDialog();
+ mIsNeedShowRecordDlg = false;
+ showToast(getString(R.string.toast_recording_lost_warning));
+ }
+ Log.d(TAG, "Sd card Eject or unmounted");
+ }
+ }
+ };
+
+ // Button click listeners on UI
+ private final View.OnClickListener mButtonClickListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ switch (v.getId()) {
+ case R.id.btn_record:
+ // if power up, record FM, else toast prompt user to power up
+ Log.d(TAG, "btn record: CLICK!!");
+ if (null == mService) {
+ Log.d(TAG, "mService is null");
+ return;
+ }
+ if (!mIsPlaying) {
+ showToast(getString(R.string.toast_powerup_before_record_warning));
+ return;
+ }
+ refreshRecordNotIdle();
+ mRecordStartTime = SystemClock.elapsedRealtime();
+ editSharedPreferences(START_RECORD_TIME, mRecordStartTime);
+ mService.startRecordingAsync();
+ mService.setModifiedRecordingName(null);
+ break;
+
+ case R.id.btn_stop:
+ // stop record and stop play record file
+ Log.d(TAG, "btn stop: CLICK!!");
+ if (null == mService) {
+ Log.d(TAG, "mService is null");
+ return;
+ }
+ refreshRecordNotIdle();
+ mService.stopRecordingAsync();
+ mService.stopPlaybackAsync();
+ break;
+
+ case R.id.btn_playback:
+ Log.d(TAG, "btn playback: CLICK!!");
+ if (null == mService) {
+ Log.d(TAG, "mService is null");
+ return;
+ }
+ refreshRecordNotIdle();
+ mPlayStartTime = SystemClock.elapsedRealtime();
+ editSharedPreferences(START_PLAY_TIME, mPlayStartTime);
+ mService.startPlaybackAsync();
+ break;
+
+ case R.id.button_add_to_favorite:
+ Log.d(TAG, "onClick AddToFavorite start");
+ updateFavoriteStation();
+ Log.d(TAG, "onClick AddToFavorite end");
+ break;
+
+ case R.id.button_decrease:
+ tuneToStation(FmRadioUtils.computeDecreaseStation(mCurrentStation));
+ break;
+
+ case R.id.button_increase:
+ tuneToStation(FmRadioUtils.computeIncreaseStation(mCurrentStation));
+ break;
+
+ case R.id.button_prevstation:
+ Log.d(TAG, "onClick PrevStation");
+ // Search for the previous station.
+ seekStation(mCurrentStation, false); // false: previous station
+ // true: next station
+ break;
+
+ case R.id.button_nextstation:
+ // Search for the next station.
+ seekStation(mCurrentStation, true); // false: previous station
+ // true: next station
+ break;
+
+ default:
+ Log.d(TAG, "invalid view id");
+ break;
+ }
+ }
+ };
+
+ /**
+ * Main thread handler to update UI
+ */
+ private Handler mHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ Log.d(TAG, "mHandler.handleMessage: what = " + msg.what +
+ ",hashcode:" + mHandler.hashCode());
+ Bundle bundle;
+ switch (msg.what) {
+ case FmRadioListener.MSGID_REFRESH:
+ refreshTimeText();
+ break;
+
+ case FmRadioListener.MSGID_POWERUP_FINISHED:
+ bundle = msg.getData();
+ boolean isPowerup = bundle
+ .getBoolean(FmRadioListener.KEY_IS_POWER_UP);
+ mIsPlaying = isPowerup;
+ Log.d(TAG, "updateFMState: FMRadio is powerup = " + isPowerup);
+ stopAnimation();
+ if (isPowerup) {
+ refreshImageButton(true);
+ refreshPopupMenuItem(true);
+ refreshActionMenuItem(true);
+ } else {
+ showToast(getString(R.string.not_available));
+ }
+ // if not powerup success, refresh power to enable.
+ refreshActionMenuPower(true);
+ break;
+
+ case FmRadioListener.MSGID_SWITCH_ANNTENNA:
+ bundle = msg.getData();
+ boolean isSwitch = bundle
+ .getBoolean(FmRadioListener.KEY_IS_SWITCH_ANNTENNA);
+ Log.d(TAG, "[FmRadioActivity.mHandler] swtich antenna: " + isSwitch);
+ if (!isSwitch) {
+ if (mIsActivityForeground) {
+ dismissNoAntennaDialog();
+ showNoAntennaDialog();
+ } else {
+ Log.d(TAG, "need show no antenna dialog after onResume:");
+ mIsNeedShowNoAntennaDlg = true;
+ }
+ stopAnimation();
+ // if not powerup success, refresh power to enable.
+ refreshActionMenuPower(true);
+ } else {
+ mIsNeedShowNoAntennaDlg = false;
+ dismissNoAntennaDialog();
+ }
+ break;
+
+ case FmRadioListener.MSGID_POWERDOWN_FINISHED:
+ bundle = msg.getData();
+ boolean isPowerdown = bundle
+ .getBoolean(FmRadioListener.KEY_IS_POWER_DOWN);
+ mIsPlaying = !isPowerdown;
+ refreshImageButton(false);
+ refreshActionMenuItem(false);
+ refreshPopupMenuItem(false);
+ refreshActionMenuPower(true);
+ break;
+
+ case FmRadioListener.MSGID_TUNE_FINISHED:
+ bundle = msg.getData();
+ boolean tuneFinish = bundle.getBoolean(FmRadioListener.KEY_IS_TUNE);
+ boolean isPowerUp = bundle.getBoolean(FmRadioListener.KEY_IS_POWER_UP);
+ // when power down state, tune from channel list,
+ // will call back send mIsPowerup state.
+ mIsPlaying = mIsPlaying ? mIsPlaying : isPowerUp;
+
+ stopAnimation();
+ // tune finished, should make power enable
+ mIsNeedDisablePower = false;
+ float frequency = bundle.getFloat(FmRadioListener.KEY_TUNE_TO_STATION);
+ mCurrentStation = FmRadioUtils.computeStation(frequency);
+ // After tune to station finished, refresh favorite button and
+ // other button status.
+ refreshStationUI(mCurrentStation);
+ // tune fail,should resume button status
+ if (!tuneFinish) {
+ Log.d(TAG, "mHandler.tune: " + tuneFinish);
+ refreshActionMenuItem(mIsPlaying);
+ refreshImageButton(mIsPlaying);
+ refreshPopupMenuItem(mIsPlaying);
+ refreshActionMenuPower(true);
+ return;
+ }
+ refreshImageButton(true);
+ refreshActionMenuItem(true);
+ refreshPopupMenuItem(true);
+ refreshActionMenuPower(true);
+ break;
+
+ case FmRadioListener.MSGID_SCAN_FINISHED:
+ bundle = msg.getData();
+ // cancel scan happen
+ boolean isScan = bundle.getBoolean(FmRadioListener.KEY_IS_SCAN);
+ int tuneToStation = bundle.getInt(FmRadioListener.KEY_TUNE_TO_STATION);
+ int searchedNum = bundle.getInt(FmRadioListener.KEY_STATION_NUM);
+ refreshActionMenuItem(mIsPlaying);
+ refreshImageButton(mIsPlaying);
+ refreshPopupMenuItem(mIsPlaying);
+ // ebable action menu power items
+ refreshActionMenuPower(true);
+
+ if (!isScan) {
+ dismissSearchDialog();
+ Log.d(TAG, "mHandler.scan canceled. not enter to channel list.");
+ return;
+ }
+
+ mCurrentStation = tuneToStation;
+ // After tune to station finished, refresh favorite button and
+ // other button status.
+ refreshStationUI(mCurrentStation);
+ dismissSearchDialog();
+
+ if (searchedNum == 0) {
+ showToast(getString(R.string.toast_cannot_search));
+ return;
+ }
+
+ enterChannelList();
+ // Show toast to tell user how many stations have been searched
+ showToast(getString(R.string.toast_channel_searched) + " " +
+ String.valueOf(searchedNum));
+ break;
+
+ case FmRadioListener.MSGID_FM_EXIT:
+ finish();
+ break;
+
+ case FmRadioListener.LISTEN_RDSSTATION_CHANGED:
+ bundle = msg.getData();
+ int rdsStation = bundle.getInt(FmRadioListener.KEY_RDS_STATION);
+ refreshStationUI(rdsStation);
+ break;
+
+ case FmRadioListener.LISTEN_PS_CHANGED:
+ case FmRadioListener.LISTEN_RT_CHANGED:
+ bundle = msg.getData();
+ String text = "";
+ String psString = bundle.getString(FmRadioListener.KEY_PS_INFO);
+ String rtString = bundle.getString(FmRadioListener.KEY_RT_INFO);
+ if ((null != psString) && (psString.length() > 0)) {
+ text += psString;
+ }
+ if ((null != rtString) && (rtString.length() > 0)) {
+ if (text.length() > 0) {
+ text += " ";
+ }
+ text += rtString;
+ }
+ showRds(text);
+ break;
+
+ case FmRadioListener.LISTEN_RECORDSTATE_CHANGED:
+ bundle = msg.getData();
+ int recorderState = bundle
+ .getInt(FmRadioListener.KEY_RECORDING_STATE);
+ Log.d(TAG, "FmRadioActivity.mHandler: recorderState = "
+ + recorderState);
+ updateRecordingState(recorderState);
+ break;
+
+ case FmRadioListener.LISTEN_RECORDERROR:
+ bundle = msg.getData();
+ int errorState = bundle
+ .getInt(FmRadioListener.KEY_RECORDING_ERROR_TYPE);
+ updateRecorderError(errorState);
+ break;
+
+ case FmRadioListener.LISTEN_RECORDMODE_CHANGED:
+ bundle = msg.getData();
+ boolean isInRecordingMode = bundle
+ .getBoolean(FmRadioListener.KEY_IS_RECORDING_MODE);
+ exitRecordingMode(isInRecordingMode);
+ break;
+
+ case FmRadioListener.LISTEN_SPEAKER_MODE_CHANGED:
+ bundle = msg.getData();
+ boolean isSpeakerMode = bundle
+ .getBoolean(FmRadioListener.KEY_IS_SPEAKER_MODE);
+ if (null != mPopupMenu) {
+ Menu menu = mPopupMenu.getMenu();
+ menu.findItem(R.id.fm_sound_mode).setTitle(isSpeakerMode ?
+ R.string.optmenu_earphone : R.string.optmenu_speaker);
+ refreshSoundModeVisiable();
+ }
+ break;
+
+ default:
+ Log.d(TAG, "invalid message");
+ break;
+ }
+ Log.d(TAG, "handleMessage");
+ }
+ };
+
+ // When call bind service, it will call service connect. register call back
+ // listener and initial device
+ private final ServiceConnection mServiceConnection = new ServiceConnection() {
+
+ /**
+ * called by system when bind service
+ *
+ * @param className component name
+ * @param service service binder
+ */
+ @Override
+ public void onServiceConnected(ComponentName className, IBinder service) {
+ Log.d(TAG, "FmRadioActivity.onServiceConnected start");
+ mService = ((FmRadioService.ServiceBinder) service).getService();
+ if (null == mService) {
+ Log.e(TAG, "ServiceConnection: Error: can't get Service");
+ finish();
+ return;
+ }
+
+ mService.registerFmRadioListener(mFmRadioListener);
+ if (!mService.isServiceInited()) {
+ Log.d(TAG, "ServiceConnection: FM service is not init");
+ mService.initService(mCurrentStation);
+ powerUpFm();
+ } else {
+ Log.d(TAG, "ServiceConnection: FM service is already init");
+ if (mService.isDeviceOpen()) {
+
+ // ALPS01768123 Need to power up for this case
+ // Without earphone->Start FM->Click Home->Plug in earphone->Enter FM
+ // -> Power Menu will be power down status and disabled
+ // ALPS01811383 Cannot power up when in call, because cannot get AudioFocus
+ if (!mService.isPowerUp() && mService.isModeNormal()) {
+ Log.d(TAG, "Need to power up auto for this case");
+ powerUpFm();
+ } else if (!mService.isPowerUp() && !mService.isModeNormal()) {
+ // if onStop() has been called before resuming this activity during
+ // phone call, need check whether show no-antenna dialog.
+ if (!mIsNeedShowNoAntennaDlg && !mService.isAntennaAvailable()
+ && !FmRadioUtils.isFmShortAntennaSupport()) {
+ Log.w(TAG, "Need to show no antenna dialog for plug out earphone in onPause state");
+ dismissNoAntennaDialog();
+ showNoAntennaDialog();
+ }
+ }
+
+ // tunetostation during changing language,we need to tune
+ // again when service bind success
+ if (mNeedTuneto) {
+ tuneToStation(mCurrentStation);
+ mNeedTuneto = false;
+ }
+ updateCurrentStation();
+ boolean isPlaying = mService.isPowerUp();
+ // back key destroy activity, mIsPlaying will be the default
+ // false.
+ // but it may be true. so the power button will be in wrong
+ // state.
+ mIsPlaying = isPlaying;
+ updateMenuStatus();
+ updateDialogStatus();
+
+ // check whether set play back button enable
+ if (!isRecordFileExist()) {
+ mButtonPlayback.setEnabled(false);
+ }
+ updateRds();
+ restoreRecorderState();
+ } else {
+ // Normal case will not come here
+ // Need to exit FM for this case
+ Log.e(TAG, "ServiceConnection: service is exiting while start FM again");
+ exitService();
+ finish();
+ }
+ }
+ Log.d(TAG, "FmRadioActivity.onServiceConnected end");
+ }
+
+ /**
+ * When unbind service will call this method
+ *
+ * @param className The component name
+ */
+ @Override
+ public void onServiceDisconnected(ComponentName className) {
+ Log.d(TAG, "FmRadioActivity.onServiceDisconnected");
+ }
+ };
+
+ /**
+ * Update FM recording state with given state from FM service
+ *
+ * @param recorderState The recorder state
+ */
+ private void updateRecordingState(int recorderState) {
+ mRecordState = recorderState;
+ refreshRecordingStatus(recorderState);
+
+ switch (recorderState) {
+ case FmRecorder.STATE_RECORDING:
+ showToast(getString(R.string.toast_start_recording));
+ Log.d(TAG, "updateRecordingState:startRecording");
+ mHandler.sendEmptyMessage(FmRadioListener.MSGID_REFRESH);
+ break;
+
+ case FmRecorder.STATE_PLAYBACK:
+ mHandler.sendEmptyMessage(FmRadioListener.MSGID_REFRESH);
+ break;
+
+ case FmRecorder.STATE_IDLE:
+ Log.d(TAG, "updateRecordingState:remove message");
+ mHandler.removeMessages(FmRadioListener.MSGID_REFRESH);
+ break;
+
+ default:
+ mHandler.removeMessages(FmRadioListener.MSGID_REFRESH);
+ break;
+ }
+ }
+
+ /**
+ * Update FM recorder error with given error from FM service
+ *
+ * @param errorType The record error type
+ */
+ private void updateRecorderError(int errorType) {
+ Log.d(TAG, "updateRecorderError.errorType: " + errorType);
+ String showString = null;
+ // In FMRecorder.startRecording() error occurs,then we should set
+ // mButtonRecord enable, because we set mButtonRecord disable ago
+ refreshRecordIdle();
+ switch (errorType) {
+ case FmRecorder.ERROR_SDCARD_NOT_PRESENT:
+ showString = getString(R.string.toast_sdcard_missing);
+ break;
+
+ case FmRecorder.ERROR_SDCARD_INSUFFICIENT_SPACE:
+ showString = getString(R.string.toast_sdcard_insufficient_space);
+ break;
+
+ case FmRecorder.ERROR_RECORDER_INTERNAL:
+ showString = getString(R.string.toast_recorder_internal_error);
+ break;
+
+ case FmRecorder.ERROR_PLAYER_INTERNAL:
+ showString = getString(R.string.toast_player_internal_error);
+ break;
+
+ case FmRadioListener.NOT_AUDIO_FOCUS:
+ showString = getString(R.string.not_available);
+ if (isRecordFileExist()) {
+ refreshPlaybackIdle(true);
+ }
+ break;
+ case FmRecorder.ERROR_RECORDER_INVALID_STATE:
+ showString = getString(R.string.toast_powerup_before_record_warning);
+ break;
+ default:
+ Log.d(TAG, "invalid recorder error");
+ break;
+ }
+
+ showToast(showString);
+ }
+
+ /**
+ * Update FM recorder mode with given mode from FM service
+ *
+ * @param isInRecordingMode The current mode, true if current is in
+ * recording mode
+ */
+ private void exitRecordingMode(boolean isInRecordingMode) {
+ refreshImageButton(mIsPlaying);
+ refreshActionMenuItem(mIsPlaying);
+ refreshPopupMenuItem(mIsPlaying);
+ refreshActionMenuPower(true);
+ if (!isInRecordingMode) {
+ // Service has already set recording mode to false, need to modify
+ // UI here
+ mIsInRecordingMode = false;
+ switchRecordLayout(isInRecordingMode);
+ }
+ }
+
+ /**
+ * Format the given time to be string by hour:minute:second
+ *
+ * @param time The time to be formated
+ *
+ * @return string The formated time
+ */
+ private String getTimeString(int time) {
+ final int oneHour = 3600;
+ int hour = time / oneHour;
+ final int minuteSecond = 60;
+ int minute = (time / minuteSecond) % minuteSecond;
+ int second = time % minuteSecond;
+ String timeString = null;
+
+ if (hour > 0) {
+ final String timeFormatLong = "%02d:%02d:%02d";
+ timeString = String.format(timeFormatLong, hour, minute, second);
+ } else {
+ final String timeFormatShort = "%02d:%02d";
+ timeString = String.format(timeFormatShort, minute, second);
+ }
+
+ return timeString;
+ }
+
+ /**
+ * Update the favorite UI state
+ */
+ private void updateFavoriteStation() {
+ String showString = null;
+ // Judge the current output and switch between the devices.
+ if (FmRadioStation.isFavoriteStation(mContext, mCurrentStation)) {
+ // Need to delete this favorite channel.
+ String stationName = FmRadioStation.getStationName(mContext,
+ mCurrentStation, FmRadioStation.STATION_TYPE_FAVORITE);
+ FmRadioStation.updateStationToDb(mContext, stationName,
+ FmRadioStation.STATION_TYPE_SEARCHED, mCurrentStation);
+ mButtonAddToFavorite
+ .setImageResource(R.drawable.btn_fm_favorite_off_selector);
+ mTextStationName.setText("");
+ showString = mProjectStringExt.getProjectString(mContext,
+ R.string.toast_channel_deleted, R.string.toast_channel_deleted1);
+ } else {
+ // Add the station to favorite
+ String stationName = FmRadioStation.getStationName(mContext,
+ mCurrentStation, FmRadioStation.STATION_TYPE_SEARCHED);
+ if (FmRadioStation.isStationExist(mContext, mCurrentStation,
+ FmRadioStation.STATION_TYPE_SEARCHED)) {
+ FmRadioStation.updateStationToDb(mContext, stationName,
+ FmRadioStation.STATION_TYPE_FAVORITE,
+ mCurrentStation);
+ } else {
+ FmRadioStation.insertStationToDb(mContext, stationName,
+ mCurrentStation, FmRadioStation.STATION_TYPE_FAVORITE);
+ }
+ mButtonAddToFavorite
+ .setImageResource(R.drawable.btn_fm_favorite_on_selector);
+ mTextStationName.setText(stationName);
+ showString = mProjectStringExt.getProjectString(mContext,
+ R.string.toast_channel_added, R.string.toast_channel_added1);
+ }
+ showToast(showString);
+ }
+
+ /**
+ * Edit value which saved in shared preference
+ *
+ * @param key The preferences editor key
+ * @param time The preferences editor value
+ */
+ private void editSharedPreferences(String key, long time) {
+ SharedPreferences sharedPreferences = getSharedPreferences(REFS_NAME, 0);
+ SharedPreferences.Editor editor = sharedPreferences.edit();
+ editor.putLong(key, time);
+ editor.commit();
+ }
+
+ /**
+ * Called when the activity is first created, initial variables
+ *
+ * @param savedInstanceState The saved bundle in onSaveInstanceState
+ */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+/* Vanzo:libing on: Thu, 15 May 2014 18:13:02 +0800
+ * add for gesture
+ */
+ Log.d(TAG, "FMRadio onCreate initPsensorManager()");
+ if (isFmRadioGestureSupport()) {
+ initPsensorManager();
+ }
+// End of Vanzo:libing
+ Log.i(TAG, "FmRadioActivity.onCreate start");
+ // Bind the activity to FM audio stream.
+ setVolumeControlStream(AudioManager.STREAM_MUSIC);
+ setContentView(R.layout.main);
+ mFragmentManager = getFragmentManager();
+ mContext = getApplicationContext();
+
+ FmRadioStation.initFmDatabase(mContext);
+ mProjectStringExt = ExtensionUtils.getExtension(mContext);
+ initUiComponent();
+ registerButtonClickListener();
+ registerSdcardReceiver();
+ mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
+ Log.d(TAG, "FmRadioActivity.onCreate end");
+ }
+/* Vanzo:libing on: Thu, 15 May 2014 18:14:21 +0800
+ * add for gesture
+ */
+ public void initPsensorManager() {
+ return;
+ /*File file = new File("/sys/bus/platform/drivers/als_ps/ps");
+ if (!file.exists()) {
+ mHavePsensor = false;
+ }
+ // has no psensor return
+ if (mHavePsensor == false) {
+ Log.w(TAG, "initPsensorManager() has no psensor !!!");
+ return;
+ }
+ mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
+*/
+/* Vanzo:lupei on: Fri, 28 Aug 2015 14:51:36 +0800
+ * add default gesture distance max min value
+ */
+ /*android.util.Log.d(TAG, "DEFAULT_GESTURE_DIST_MAX_MIN = "+DEFAULT_GESTURE_DIST_MAX_MIN);
+ if (!("".equals(DEFAULT_GESTURE_DIST_MAX_MIN))) {
+ String[] value = DEFAULT_GESTURE_DIST_MAX_MIN.split(",");
+ if (value[0]!= "" && value[1] != "") {
+ GESTURE_FMRADIO_MAX_DISTANCE = Integer.parseInt(value[0]);
+ GESTURE_FMRADIO_MIN_DISTANCE = Integer.parseInt(value[1]);
+ }
+ }*/
+// End of Vanzo:lupei
+
+ }
+
+ public Runnable myRunnable = new Runnable() {
+ @Override
+ public void run() {
+ File file = new File("/sys/bus/platform/drivers/als_ps/ps");
+ if (!file.exists()) {
+ file = new File("/sys/bus/platform/drivers/als_ps_cm3628/ps");
+ }
+ if (file.exists()) {
+ String pSensorValues2 = readFile(file);
+ if (pSensorValues2.trim().contains("-")) {
+ return;
+ }
+ if (pSensorValues2.trim().contains("0x")) {
+ mPrePsensor = Integer.parseInt(pSensorValues2.trim().substring(2), 16);
+ } else {
+ mPrePsensor = Integer.parseInt(pSensorValues2.trim());
+ }
+ android.util.Log.d(TAG, "fmradio isGestureOpen " + isGestureOpen());
+ if (isGestureOpen() && isTopActivity()) {
+ if (mPrePsensor > GESTURE_FMRADIO_MAX_DISTANCE) {
+ mHadGesture = true;
+ } else if (mHadGesture && mPrePsensor < GESTURE_FMRADIO_MIN_DISTANCE) {
+ mHadGesture = false;
+ seekStation(mCurrentStation, true); // false: previous station
+ }
+ }
+ }
+ myHandler.postDelayed(myRunnable, GESTURE_RUN_POST_DELAY_TIME);
+ }
+ };
+
+ private boolean isTopActivity() {
+ ActivityManager am = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
+ ComponentName cn = am.getRunningTasks(2).get(0).topActivity;
+ String topClassName = cn.getClassName();
+ String myClassName = FmRadioActivity.this.getComponentName().getClassName();
+
+ return topClassName.equalsIgnoreCase(myClassName);
+ }
+
+ public void onAccuracyChanged(Sensor sensor, int accuracy) {
+ }
+
+ private static String readFile(File fn) {
+ FileReader f;
+ int len;
+
+ f = null;
+ try {
+ f = new FileReader(fn);
+ String s = "";
+ char[] cbuf = new char[200];
+ while ((len = f.read(cbuf, 0, cbuf.length)) >= 0) {
+ s += String.valueOf(cbuf, 0, len);
+ }
+ return s;
+ } catch (IOException ex) {
+ return "0";
+ } finally {
+ if (f != null) {
+ try {
+ f.close();
+ } catch (IOException ex) {
+ return "0";
+ }
+ }
+ }
+ }
+
+ public void onSensorChanged(SensorEvent event) {
+ }
+
+ private boolean isGestureOpen() {
+ mGestureEnabled = SystemProperties.getInt(GESTURE_SWITCH_FLAG , 0) == 1 ? true : false;
+ mFMRadioEnabled = SystemProperties.getInt(GESTURE_FMRADIO_FLAG , 0) == 1 ? true : false;
+
+ return mGestureEnabled && mFMRadioEnabled;
+ }
+
+ private void stopPsensor() {
+ mSensorManager.unregisterListener(this);
+ if (myHandler != null) {
+ myHandler.removeCallbacks(myRunnable);
+ }
+ }
+
+ private void resumePsensor() {
+ mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
+ mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL);
+
+ myHandler = new Handler();
+ myHandler.post(myRunnable);
+ }
+
+ public static boolean isFmRadioGestureSupport() {
+ boolean enable = FeatureOption.VANZO_FEATURE_FM_RADIO_GESTURE;
+ android.util.Log.i(TAG, "isFmRadioGestureSupport enable = " + enable);
+ return enable;
+ }
+// End of Vanzo:libing
+ /**
+ * Go to channel list activity
+ */
+ private void enterChannelList() {
+ Log.d(TAG, "enterChannelList");
+ if (mService != null) {
+ // AMS change the design for background start
+ // activity. need check app is background in app code
+ if (mIsActivityForeground) {
+ Intent intent = new Intent();
+ intent.setClass(FmRadioActivity.this, FmRadioFavorite.class);
+ startActivityForResult(intent, REQUEST_CODE_FAVORITE);
+ } else {
+ Log.d(TAG, "enterChannelList. activity is background, not enter channel list.");
+ }
+ }
+ }
+
+ /**
+ * Refresh the favorite button with the given station, if the station is
+ * favorite station, show favorite icon, else show non-favorite icon.
+ *
+ * @param station The station frequency
+ */
+ private void refreshStationUI(int station) {
+ // Change the station frequency displayed.
+ mTextStationValue.setText(FmRadioUtils.formatStation(station));
+ // Show or hide the favorite icon
+ if (FmRadioStation.isFavoriteStation(mContext, station)) {
+ mButtonAddToFavorite
+ .setImageResource(R.drawable.btn_fm_favorite_on_selector);
+ mTextStationName.setText(FmRadioStation.getStationName(mContext,
+ station, FmRadioStation.STATION_TYPE_FAVORITE));
+ } else {
+ mButtonAddToFavorite
+ .setImageResource(R.drawable.btn_fm_favorite_off_selector);
+ mTextStationName.setText("");
+ }
+ }
+
+ @SuppressWarnings("deprecation")
+ private void restoreConfiguration() {
+ // after configuration change, need to reduction else the UI is abnormal
+ if (null != getLastNonConfigurationInstance()) {
+ Log.d(TAG,
+ "Configration changes,activity restart,need to reset UI!");
+ Bundle bundle = (Bundle) getLastNonConfigurationInstance();
+ if (null == bundle) {
+ return;
+ }
+ mPrevRecorderState = bundle.getInt("mPrevRecorderState");
+ mRecordState = bundle.getInt("mRecordState");
+ mIsNeedShowRecordDlg = bundle.getBoolean("mIsFreshRecordingStatus");
+ // mIsNeedShowNoAntennaDlg = bundle.getBoolean("mIsNeedShowNoAntennaDlg");
+ mIsNeedShowSearchDlg = bundle.getBoolean("mIsNeedShowSearchDlg");
+ // we doesn't get it from service because the service may be
+ // null because not bind
+ mIsInRecordingMode = bundle.getBoolean("isInRecordingMode");
+ mIsPlaying = bundle.getBoolean("mIsPlaying");
+ Log.d(TAG, "bundle = " + bundle);
+ }
+ }
+
+ /**
+ * Start and bind service, reduction variable values if configuration
+ * changed
+ */
+ @Override
+ public void onStart() {
+ super.onStart();
+ FmRadioService.setActivityIsOnStop(false);
+ Log.d(TAG, "FmRadioActivity.onStart start");
+ // Should start FM service first.
+ if (null == startService(new Intent(FmRadioActivity.this,
+ FmRadioService.class))) {
+ Log.e(TAG, "Error: Cannot start FM service");
+ return;
+ }
+
+ mIsServiceStarted = true;
+ mIsServiceBinded = bindService(new Intent(FmRadioActivity.this,
+ FmRadioService.class), mServiceConnection,
+ Context.BIND_AUTO_CREATE);
+
+ if (!mIsServiceBinded) {
+ Log.e(TAG, "Error: Cannot bind FM service");
+ finish();
+ return;
+ }
+ restoreConfiguration();
+ Log.d(TAG, "FmRadioActivity.onStart end");
+ }
+
+ /**
+ * Refresh UI, when stop search, dismiss search dialog, pop up recording
+ * dialog if FM stopped when recording in background
+ */
+ @Override
+ public void onResume() {
+ super.onResume();
+/* Vanzo:libing on: Thu, 15 May 2014 18:17:38 +0800
+ * add for gesture
+ */
+ Log.d(TAG, "FMRadio onResume isGestureOpen = " + isGestureOpen());
+ if (isFmRadioGestureSupport() && isGestureOpen()) {
+ resumePsensor();
+ }
+// End of Vanzo:libing
+ Log.d(TAG, "FmRadioActivity.onResume start");
+ mIsActivityForeground = true;
+ if (null == mService) {
+ Log.d(TAG, "service has not bind finished");
+ mIsNeedShowNoAntennaDlg = false;
+ return;
+ }
+ updateMenuStatus();
+ updateDialogStatus();
+ if (!isRecordFileExist()) {
+ mButtonPlayback.setEnabled(false);
+ }
+ checkNoAntennaDialogInOnResume();
+ Log.d(TAG, "FmRadioActivity.onResume end");
+ }
+
+ /**
+ * In call and plug out earphone(in onPause state), need to show no antenna dialog but
+ * use mIsNeedShowNoAntennaDlg to save the state, because there is no where to show this dialog after onResume() for this case
+ */
+ private void checkNoAntennaDialogInOnResume() {
+ if (mIsNeedShowNoAntennaDlg && mService != null && !mService.isAntennaAvailable()
+ && !FmRadioUtils.isFmShortAntennaSupport()) {
+ Log.w(TAG, "Need to show no antenna dialog for plug out earphone in onPause state");
+ dismissNoAntennaDialog();
+ showNoAntennaDialog();
+ }
+ }
+
+ /**
+ * When activity is paused call this method, indicate activity enter
+ * background if press exit, power down FM
+ */
+ @Override
+ public void onPause() {
+ Log.d(TAG, "start FmRadioActivity.onPause");
+ mIsActivityForeground = false;
+ /**
+ * Should dismiss before call onSaveInstance, or it will resume
+ * automatic
+ */
+ mIsNeedShowSearchDlg = true;
+ dismissSearchDialog();
+
+ /**
+ * should dismiss before call onSaveInstance, or it will resume
+ * automatic.
+ */
+ FmRecordDialogFragment df = (FmRecordDialogFragment) mFragmentManager
+ .findFragmentByTag(TAG_SAVE_RECORDINGD);
+ if (null != df && df.getShowsDialog()) {
+ Log.d(TAG, "onPause.dismissSaveRecordingDialog()");
+ if (mService != null) {
+ mService.setModifiedRecordingName(df.getRecordingNameToSave());
+ }
+ dismissSaveRecordingDialog();
+ mIsNeedShowRecordDlg = true;
+ }
+
+ // Need to dismiss avoid AMS popup this dialog again for power up will show this dialog
+ if (dismissNoAntennaDialog()) {
+ mIsNeedShowNoAntennaDlg = true;
+ }
+
+ Log.d(TAG, "end FmRadioActivity.onPause");
+ super.onPause();
+ }
+
+ /**
+ * Called when activity enter stopped state, unbind service, if exit
+ * pressed, stop service
+ */
+ @Override
+ public void onStop() {
+ FmRadioService.setActivityIsOnStop(true);
+ Log.d(TAG, "start FmRadioActivity.onStop");
+ if (mIsServiceBinded) {
+ unbindService(mServiceConnection);
+ mIsServiceBinded = false;
+ }
+ mIsNeedShowNoAntennaDlg = false;
+ Log.d(TAG, "end FmRadioActivity.onStop");
+ super.onStop();
+/* Vanzo:libing on: Thu, 15 May 2014 18:15:55 +0800
+ * add for gesture
+ */
+ Log.d(TAG, "FMRadio onStop stopPsensor()");
+ if (isFmRadioGestureSupport()) {
+ stopPsensor();
+ }
+// End of Vanzo:libing
+ }
+
+ /**
+ * W activity destroy, unregister broadcast receiver and remove handler
+ * message
+ */
+ @Override
+ public void onDestroy() {
+ Log.d(TAG, "start FmRadioActivity.onDestroy");
+ unregisterSdcardReceiver();
+ // need to call this function because if doesn't do this,after
+ // configuration change will have many instance and recording time
+ // or playing time will not refresh
+ // Remove all the handle message
+ mHandler.removeCallbacksAndMessages(null);
+ if (mService != null) {
+ mService.unregisterFmRadioListener(mFmRadioListener);
+ }
+ mFmRadioListener = null;
+ if (null != mPopupMenu) {
+ mPopupMenu.dismiss();
+ mPopupMenu = null;
+ }
+ Log.d(TAG, "end FmRadioActivity.onDestroy");
+ super.onDestroy();
+ }
+
+ /**
+ * Create options menu
+ *
+ * @param menu The option menu
+ *
+ * @return true or false indicate need to handle other menu item
+ */
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ Log.d(TAG, "start FmRadioActivity.onCreateOptionsMenu");
+ MenuInflater inflater = getMenuInflater();
+ inflater.inflate(R.menu.fm_action_bar, menu);
+ mMenuItemChannelList = menu.findItem(R.id.fm_channel_list);
+ mMenuItemOverflow = menu.findItem(R.id.fm_menu);
+ mMenuItemPower = menu.findItem(R.id.fm_power);
+ Log.d(TAG, "end FmRadioActivity.onCreateOptionsMenu");
+ return true;
+ }
+
+ /**
+ * Prepare options menu
+ *
+ * @param menu The option menu
+ *
+ * @return true or false indicate need to handle other menu item
+ */
+ @Override
+ public boolean onPrepareOptionsMenu(Menu menu) {
+ Log.d(TAG, "start FmRadioActivity.onPrepareOptionsMenu");
+ mMenuItemChannelList.setVisible(!mIsInRecordingMode);
+ mMenuItemOverflow.setVisible(!mIsInRecordingMode);
+ mMenuItemPower.setVisible(!mIsInRecordingMode);
+ if (null == mService) {
+ Log.d(TAG, "mService is null");
+ return !mIsInRecordingMode;
+ }
+
+ boolean isPlaying = mService.isPowerUp();
+ boolean isMakePowerdown = mService.isMakePowerDown();
+ boolean isSeeking = mService.isSeeking();
+ boolean isScan = mService.isScanning();
+ // if fm power down by other app, should enable power menu, make it to
+ // powerup.
+ refreshActionMenuItem((isSeeking || isScan) ? false : isPlaying);
+ refreshActionMenuPower((isScan || isSeeking)
+ ? false
+ : (isPlaying || (isMakePowerdown && !mIsNeedDisablePower)));
+
+ // check whether show animation
+ if (isSeeking) {
+ Log.d(TAG, "onPrepareOptionsMenu: it is seeking");
+ startAnimation();
+ }
+
+ Log.d(TAG, "end FmRadioActivity.onPrepareOptionsMenu");
+ return !mIsInRecordingMode;
+ }
+
+ /**
+ * Handle event when option item selected
+ *
+ * @param item The clicked item
+ *
+ * @return true or false indicate need to handle other menu item or not
+ */
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ Log.d(TAG, "start FmRadioActivity.onOptionsItemSelected");
+ switch (item.getItemId()) {
+ case android.R.id.home:
+ onBackPressed();
+ break;
+
+ case R.id.fm_channel_list:
+ refreshImageButton(false);
+ refreshActionMenuItem(false);
+ refreshPopupMenuItem(false);
+ refreshActionMenuPower(false);
+ // Show favorite activity.
+ enterChannelList();
+ break;
+
+ case R.id.fm_power:
+ Log.d(TAG, "click fm_power menu");
+ if (mIsPlaying) {
+ refreshImageButton(false);
+ refreshActionMenuItem(false);
+ refreshPopupMenuItem(false);
+ refreshActionMenuPower(false);
+ exitService();
+ break;
+ }
+ powerUpFm();
+ break;
+
+ case R.id.fm_menu:
+ item.setEnabled(false);
+
+ mPopupMenu = new PopupMenu(mContext, findViewById(R.id.fm_menu));
+ Menu menu = mPopupMenu.getMenu();
+ mPopupMenu.getMenuInflater().inflate(R.menu.fm_menu, menu);
+ mPopupMenu.setOnMenuItemClickListener(this);
+ mPopupMenu.setOnDismissListener(this);
+
+ boolean isPlaying = mService.isPowerUp();
+ if (isPlaying) {
+ menu.findItem(R.id.fm_record).setEnabled(true);
+ menu.findItem(R.id.fm_sound_mode).setEnabled(!mService.isBtConnected());
+ menu.findItem(R.id.fm_sound_mode).setTitle(
+ mService.isSpeakerUsed() ? R.string.optmenu_earphone
+ : R.string.optmenu_speaker);
+ menu.findItem(R.id.fm_search).setEnabled(true);
+ }
+ refreshSoundModeVisiable();
+ mPopupMenu.show();
+ break;
+
+ default:
+ Log.e(TAG, "Error: Invalid options menu item.");
+ break;
+ }
+ Log.d(TAG, "end FmRadioActivity.onOptionsItemSelected");
+ return super.onOptionsItemSelected(item);
+ }
+
+ /**
+ * Check whether antenna is available
+ *
+ * @return true or false indicate antenna available or not
+ */
+ private boolean isAntennaAvailable() {
+ return mAudioManager.isWiredHeadsetOn();
+ }
+
+ /**
+ * When on activity result, tune to station which is from channel list
+ *
+ * @param requestCode The request code
+ * @param resultCode The result code
+ * @param data The intent from channel list
+ */
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (RESULT_OK == resultCode) {
+ if (REQUEST_CODE_FAVORITE != requestCode) {
+ Log.e(TAG, "Error: Invalid requestcode.");
+ return;
+ }
+ int iStation = data.getIntExtra(
+ FmRadioFavorite.ACTIVITY_RESULT, mCurrentStation);
+ // Tune to this station.
+ mCurrentStation = iStation;
+ // if tune from channel list, we should disable power menu,
+ // especially for
+ // power down state
+ mIsNeedDisablePower = true;
+ Log.d(TAG, "onActivityForReult:" + mIsNeedDisablePower);
+ if (null == mService) {
+ Log.d(TAG, "activity.onActivityResult mService is null");
+ mNeedTuneto = true;
+ return;
+ }
+ tuneToStation(iStation);
+ return;
+ }
+
+ if (FmRadioStation.isFavoriteStation(mContext, mCurrentStation)) {
+ mButtonAddToFavorite
+ .setImageResource(R.drawable.btn_fm_favorite_on_selector);
+ mTextStationName.setText(FmRadioStation.getStationName(
+ mContext, mCurrentStation,
+ FmRadioStation.STATION_TYPE_FAVORITE));
+ } else {
+ mButtonAddToFavorite
+ .setImageResource(R.drawable.btn_fm_favorite_off_selector);
+ mTextStationName.setText("");
+ }
+
+ // Do not handle other result.
+ Log.v(TAG, "The activity for requestcode " + requestCode
+ + " does not return any data.");
+ }
+
+ /**
+ * Start animation
+ */
+ private void startAnimation() {
+ mAnimImage.setAnimation(mAnimation);
+ mAnimImage.setVisibility(View.VISIBLE);
+ Log.d(TAG, "FmRadioActivity.startAnimation end");
+ }
+
+ /**
+ * Stop animation
+ */
+ private void stopAnimation() {
+ mAnimImage.setVisibility(View.INVISIBLE);
+ mAnimImage.setAnimation(null);
+ }
+
+ /**
+ * Restore recorder state from shared preference
+ */
+ private void restoreRecorderState() {
+ // here should do some recorder related.
+ mIsInRecordingMode = mService.getRecordingMode();
+ mRecordState = mService.getRecorderState();
+ RelativeLayout recInfoBar = (RelativeLayout) findViewById(R.id.rl_recinfo);
+ // if recording or play backing state, should send message trigger
+ // refresh.
+ if ((FmRecorder.STATE_RECORDING == mRecordState)
+ || (FmRecorder.STATE_PLAYBACK == mRecordState)) {
+ SharedPreferences sharedPreferences = getSharedPreferences(REFS_NAME, 0);
+ mRecordStartTime = sharedPreferences.getLong(START_RECORD_TIME, 0);
+ mPlayStartTime = sharedPreferences.getLong(START_PLAY_TIME, 0);
+ recInfoBar.setVisibility(View.VISIBLE);
+ Log.d(TAG, "&&&sendemptyMessage:mRecoderStart:" + mRecordStartTime);
+ mHandler.sendEmptyMessage(FmRadioListener.MSGID_REFRESH);
+ } else {
+ recInfoBar.setVisibility(View.GONE);
+ }
+ // if remove from app list, it will make recorder ui confused.
+ switchRecordLayout(mIsInRecordingMode);
+ changeRecordingMode(mIsInRecordingMode);
+ if (mIsInRecordingMode) {
+ refreshRecordingStatus(FmRecorder.STATE_INVALID);
+ }
+ }
+
+ /**
+ * Power up FM
+ */
+ private void powerUpFm() {
+ Log.v(TAG, "start powerUpFm");
+ refreshImageButton(false);
+ refreshActionMenuItem(false);
+ refreshPopupMenuItem(false);
+ refreshActionMenuPower(false);
+ startAnimation();
+ mService.powerUpAsync(FmRadioUtils.computeFrequency(mCurrentStation));
+ Log.v(TAG, "end powerUpFm");
+ }
+
+ private void setSpeakerPhoneOn(boolean isSpeaker) {
+ if (isSpeaker) {
+ Log.v(TAG, "UseSpeaker");
+ mService.setSpeakerPhoneOn(true);
+ } else {
+ Log.v(TAG, "UseEarphone");
+ mService.setSpeakerPhoneOn(false);
+ }
+ if (null != mPopupMenu) {
+ Menu menu = mPopupMenu.getMenu();
+ menu.findItem(R.id.fm_sound_mode).setTitle(mService.isSpeakerUsed() ?
+ R.string.optmenu_earphone : R.string.optmenu_speaker);
+ }
+ }
+
+ /**
+ * Tune to a station
+ *
+ * @param station The tune station
+ */
+ private void tuneToStation(final int station) {
+ refreshImageButton(false);
+ refreshActionMenuItem(false);
+ refreshPopupMenuItem(false);
+ refreshActionMenuPower(false);
+ mService.tuneStationAsync(FmRadioUtils.computeFrequency(station));
+ if (!mIsPlaying) {
+ startAnimation();
+ }
+ }
+
+ /**
+ * Seek station according current frequency and direction
+ *
+ * @param station The seek start station
+ * @param direction The seek direction
+ */
+ private void seekStation(final int station, boolean direction) {
+ // If the seek AsyncTask has been executed and not canceled, cancel it
+ // before start new.
+ startAnimation();
+ refreshImageButton(false);
+ refreshActionMenuItem(false);
+ refreshPopupMenuItem(false);
+ refreshActionMenuPower(false);
+ mService.seekStationAsync(FmRadioUtils.computeFrequency(station),
+ direction);
+ }
+
+ private void refreshImageButton(boolean enabled) {
+ mButtonDecrease.setEnabled(enabled);
+ mButtonPrevStation.setEnabled(enabled);
+ mButtonNextStation.setEnabled(enabled);
+ mButtonIncrease.setEnabled(enabled);
+ }
+
+ // Refresh action menu except power menu
+ private void refreshActionMenuItem(boolean enabled) {
+ // action menu
+ if (null != mMenuItemChannelList) {
+ // if power down by other app, should disable channelist list, over
+ // menu
+ mMenuItemChannelList.setEnabled(enabled);
+ mMenuItemOverflow.setEnabled(enabled);
+ }
+ }
+
+ // Refresh action menu only power menu
+ private void refreshActionMenuPower(boolean enabled) {
+ Log.d(TAG, "refreshActionMenuPower enabled:" + enabled + ", mIsPlaying:" + mIsPlaying);
+ // action menu
+ if (null != mMenuItemChannelList) {
+ // if fm power down by other app, should enable this button to
+ // powerup.
+ mMenuItemPower.setEnabled(enabled);
+ mMenuItemPower.setIcon(mIsPlaying ? R.drawable.btn_fm_powerup_selector
+ : R.drawable.btn_fm_powerdown_selector);
+ }
+ }
+
+ private void refreshPopupMenuItem(boolean enabled) {
+ if (null != mPopupMenu) {
+ Menu menu = mPopupMenu.getMenu();
+ menu.findItem(R.id.fm_record).setEnabled(enabled);
+ menu.findItem(R.id.fm_search).setEnabled(enabled);
+ menu.findItem(R.id.fm_sound_mode).setEnabled(enabled && !mService.isBtConnected());
+ refreshSoundModeVisiable();
+ }
+ }
+
+ private void refreshSoundModeVisiable() {
+ if (null != mPopupMenu) {
+ Menu menu = mPopupMenu.getMenu();
+ // Need hide only short antenna support and not plug in earphone
+ boolean hideSoundMode = SHORT_ANNTENNA_SUPPORT && !mService.isAntennaAvailable();
+ boolean showSoundMode = !hideSoundMode;
+ menu.findItem(R.id.fm_sound_mode).setVisible(showSoundMode);
+ }
+ }
+
+ private void refreshRecordNotIdle() {
+ mButtonRecord.setEnabled(false);
+ mButtonPlayback.setEnabled(false);
+ mButtonStop.setEnabled(false);
+ }
+
+ private void refreshRecordIdle() {
+ mButtonRecord.setEnabled(true);
+ mButtonPlayback.setEnabled(false);
+ mButtonStop.setEnabled(false);
+ }
+
+ private void refreshPlaybackIdle(boolean btnPlayBack) {
+ mButtonRecord.setEnabled(true);
+ mButtonPlayback.setEnabled(btnPlayBack);
+ mButtonStop.setEnabled(false);
+ }
+
+ private void refreshRecording() {
+ mButtonRecord.setEnabled(false);
+ mButtonPlayback.setEnabled(false);
+ mButtonStop.setEnabled(true);
+ }
+
+ private void refreshPlaybacking() {
+ mButtonRecord.setEnabled(false);
+ mButtonPlayback.setEnabled(false);
+ mButtonStop.setEnabled(true);
+ }
+
+ /**
+ * Called when back pressed
+ */
+ @Override
+ public void onBackPressed() {
+ Log.d(TAG, "begin FmRadioActivity.onBackPressed");
+
+ if (mIsInRecordingMode) {
+ changeRecordingMode(false);
+ if (null == mService) {
+ Log.d(TAG, "mService is null");
+ return;
+ }
+ // no need consider power down and other situation
+ boolean isPlaying = mService.isPowerUp();
+ refreshImageButton(isPlaying);
+ refreshPopupMenuItem(isPlaying);
+ refreshActionMenuItem(isPlaying);
+ refreshActionMenuPower(true);
+ if (mService != null && !mService.isAntennaAvailable()
+ && !FmRadioUtils.isFmShortAntennaSupport()) {
+ Log.w(TAG, "Need to show no antenna dialog for plug out earphone in onPause state");
+ dismissNoAntennaDialog();
+ showNoAntennaDialog();
+ }
+ return;
+ }
+
+ // exit fm, disable all button
+ if (!mIsPlaying && (null != mService) && !mService.isPowerUping()) {
+ refreshImageButton(false);
+ refreshActionMenuItem(false);
+ refreshPopupMenuItem(false);
+ refreshActionMenuPower(false);
+ exitService();
+ return;
+ }
+
+ super.onBackPressed();
+ Log.d(TAG, "end FmRadioActivity.onBackPressed");
+ }
+
+ private void showToast(CharSequence text) {
+ if (null == mToast) {
+ mToast = Toast.makeText(mContext, text, Toast.LENGTH_SHORT);
+ }
+ mToast.setText(text);
+ mToast.show();
+ Log.v(TAG, "FmRadioActivity.showToast: toast = " + text);
+ }
+
+ private void showRds(String text) {
+ mTextRds.setText(text);
+ mTextRds.setSelected(true);
+ Log.v(TAG, "FmRadioActivity.showRds: RDS = " + text);
+ }
+
+ /**
+ * Change recording mode
+ *
+ * @param recordingMode The current recording mode
+ */
+ private void changeRecordingMode(boolean recordingMode) {
+ Log.d(TAG, "changeRecordingMode: " + recordingMode);
+ if (mIsInRecordingMode == recordingMode) {
+ Log.e(TAG, "FM already " + (recordingMode ? "in" : "NOT in")
+ + "recording mode!");
+ return;
+ }
+ mIsInRecordingMode = recordingMode;
+ mService.setRecordingModeAsync(recordingMode);
+ switchRecordLayout(recordingMode);
+ }
+
+ /**
+ * Switch to record layout, if in recorder mode.
+ *
+ * @param recordingMode true in recorder mode, false not in recorder mode
+ */
+ private void switchRecordLayout(boolean recordingMode) {
+ ActionBar actionBar = getActionBar();
+ invalidateOptionsMenu();
+
+ // Set the action bar on the right to be up navigation
+ actionBar.setDisplayHomeAsUpEnabled(recordingMode);
+ actionBar.setHomeButtonEnabled(recordingMode);
+ actionBar.setTitle(recordingMode ? R.string.fm_recorder_name
+ : R.string.app_name);
+
+ LinearLayout recBar = (LinearLayout) findViewById(R.id.bottom_bar_recorder);
+ LinearLayout bottomBar = (LinearLayout) findViewById(R.id.bottom_bar);
+
+ bottomBar.setVisibility(recordingMode ? View.GONE : View.VISIBLE);
+ recBar.setVisibility(recordingMode ? View.VISIBLE : View.GONE);
+ mButtonAddToFavorite.setVisibility(recordingMode ? View.GONE
+ : View.VISIBLE);
+ }
+
+ /**
+ * Update recording UI according record state
+ *
+ * @param stateOverride The recording state
+ */
+ private void refreshRecordingStatus(int stateOverride) {
+ int recorderState = FmRecorder.STATE_INVALID;
+
+ recorderState = (stateOverride == FmRecorder.STATE_INVALID ? mService
+ .getRecorderState() : stateOverride);
+
+ Log.d(TAG, "refreshRecordingStatus: state=" + recorderState);
+ switch (recorderState) {
+ case FmRecorder.STATE_IDLE:
+ long recordTime = mService.getRecordTime();
+ if (recordTime > 0) {
+ if (isRecordFileExist()) {
+ mButtonPlayback.setEnabled(true);
+ }
+
+ if (FmRecorder.STATE_RECORDING == mPrevRecorderState) {
+ Log.d(TAG, "need show recorder dialog.mPrevRecorderState:" +
+ mPrevRecorderState);
+ if (mIsActivityForeground) {
+ showSaveRecordingDialog();
+ } else {
+ mIsNeedShowRecordDlg = true;
+ }
+ }
+ } else {
+ mButtonPlayback.setEnabled(false);
+ }
+
+ refreshPlaybackIdle((recordTime > 0) && isRecordFileExist());
+ mRLRecordInfo.setVisibility(View.GONE);
+ break;
+
+ case FmRecorder.STATE_RECORDING:
+ mTxtRecInfoLeft.setText("");
+ mTxtRecInfoRight.setText("");
+ mTxtRecInfoLeft.setSelected(false);
+ refreshRecording();
+ mRLRecordInfo.setVisibility(View.VISIBLE);
+ break;
+
+ case FmRecorder.STATE_PLAYBACK:
+ String recordingName = mService.getRecordingName();
+ if (null == recordingName) {
+ recordingName = "";
+ }
+ mTxtRecInfoLeft.setText(recordingName);
+ mTxtRecInfoRight.setText("");
+ mTxtRecInfoLeft.setSelected(true);
+ refreshPlaybacking();
+ mRLRecordInfo.setVisibility(View.VISIBLE);
+ break;
+
+ case FmRecorder.STATE_INVALID:
+ refreshRecordIdle();
+ mRLRecordInfo.setVisibility(View.GONE);
+ break;
+
+ default:
+ Log.d(TAG, "invalid record status");
+ break;
+ }
+ mPrevRecorderState = recorderState;
+ Log.d(TAG, "refreshRecordingStatus.mPrevRecorderState:" + mPrevRecorderState);
+ }
+
+ /**
+ * Check whether FM recording temporary file exist
+ *
+ * @return true if FM recording temporary file exist, false not exist FM
+ * recording temporary file
+ */
+ private boolean isRecordFileExist() {
+ String fileName = null;
+ fileName = mService.getRecordingNameWithPath();
+ // if recording file is delete by user, play button disabled
+ File recordingFileToSave = new File(fileName + FmRecorder.RECORDING_FILE_EXTENSION);
+ return recordingFileToSave.exists();
+ }
+
+ /**
+ * use onRetainNonConfigurationInstance because after configuration change,
+ * activity will destroy and create need use this function to save some
+ * important variables
+ */
+ @Override
+ public Object onRetainNonConfigurationInstance() {
+ final int size = 5;
+ Bundle bundle = new Bundle(size);
+ bundle.putBoolean("isInRecordingMode", mIsInRecordingMode);
+ bundle.putInt("mPrevRecorderState", mPrevRecorderState);
+ bundle.putBoolean("mIsFreshRecordingStatus", mIsNeedShowRecordDlg);
+ //bundle.putBoolean("mIsNeedShowNoAntennaDlg", mIsNeedShowNoAntennaDlg);
+ bundle.putBoolean("mIsNeedShowSearchDlg", mIsNeedShowSearchDlg);
+ bundle.putInt("mRecordState", mRecordState);
+ bundle.putBoolean("mIsPlaying", mIsPlaying);
+ Log.d(TAG, "onRetainNonConfigurationInstance() bundle:" + bundle);
+ return bundle;
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ Log.d(TAG, "onSaveInstanceState");
+ super.onSaveInstanceState(outState);
+ }
+
+ /**
+ * Handle event about pop up menu clicked
+ *
+ * @param item The pop up menu item
+ *
+ * @return true or false indicate need to handle other menu item or not
+ */
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ Log.d(TAG, "onMenuItemClick:" + item.getItemId());
+ switch (item.getItemId()) {
+ case R.id.fm_search:
+ // Don't show search dialog when activity is background
+ if (!mIsActivityForeground) {
+ Log.w(TAG, "click searh menu in background, don't show search dialog");
+ return false;
+ }
+ mIsNeedShowSearchDlg = true;
+ refreshImageButton(false);
+ refreshActionMenuItem(false);
+ refreshPopupMenuItem(false);
+ refreshActionMenuPower(false);
+ showSearchDialog();
+ FmRadioStation.cleanSearchedStations(mContext);
+ mService.startScanAsync();
+ break;
+
+ case R.id.fm_sound_mode:
+ setSpeakerPhoneOn(!mService.isSpeakerUsed());
+ break;
+
+ case R.id.fm_record:
+ changeRecordingMode(true);
+ refreshRecordingStatus(FmRecorder.STATE_INVALID);
+ break;
+
+ default:
+ Log.d(TAG, "invalid menu item");
+ break;
+ }
+ return false;
+ }
+
+ /**
+ * Called when PopUp menu dismissed
+ *
+ * @param PopUp The menu which dismiss
+ */
+ @Override
+ public void onDismiss(PopupMenu menu) {
+ Log.d(TAG, "popmenu dismiss listener:" + menu);
+ invalidateOptionsMenu();
+ }
+
+ /**
+ * Exit FM service
+ */
+ private void exitService() {
+ Log.i(TAG, "exitService");
+ if (mIsServiceBinded) {
+ unbindService(mServiceConnection);
+ mIsServiceBinded = false;
+ }
+
+ if (mIsServiceStarted) {
+ boolean isSuccess = stopService(new Intent(
+ FmRadioActivity.this, FmRadioService.class));
+ if (!isSuccess) {
+ Log.e(TAG, "Error: Cannot stop the FM service.");
+ }
+ mIsServiceStarted = false;
+ }
+ }
+
+ /**
+ * Show no antenna dialog
+ */
+ public void showNoAntennaDialog() {
+ NoAntennaDialog newFragment = NoAntennaDialog.newInstance();
+ newFragment.show(mFragmentManager, TAG_NO_ANTENNA);
+ mFragmentManager.executePendingTransactions();
+ }
+
+ /**
+ * Show save recording dialog
+ *
+ * @param name The recording file name
+ */
+ public void showSaveRecordingDialog() {
+ String sdcard = FmRadioService.getRecordingSdcard();
+ String defaultName = mService.getRecordingName();
+ String recordingName = mService.getModifiedRecordingName();
+ FmRecordDialogFragment newFragment =
+ new FmRecordDialogFragment(sdcard, defaultName, recordingName);
+ newFragment.show(mFragmentManager, TAG_SAVE_RECORDINGD);
+ mFragmentManager.executePendingTransactions();
+ }
+
+ /**
+ * Show search dialog
+ */
+ private void showSearchDialog() {
+ SearchChannelsDialog newFragment = SearchChannelsDialog.newInstance();
+ newFragment.show(mFragmentManager, TAG_SEARCH);
+ mFragmentManager.executePendingTransactions();
+ }
+
+ /**
+ * Dismiss search dialog
+ */
+ private void dismissSearchDialog() {
+ SearchChannelsDialog newFragment = (SearchChannelsDialog) mFragmentManager
+ .findFragmentByTag(TAG_SEARCH);
+ if (null != newFragment) {
+ newFragment.dismissAllowingStateLoss();
+ }
+ }
+
+ /**
+ * Dismiss save recording dialog
+ */
+ private void dismissSaveRecordingDialog() {
+ FragmentTransaction ft = mFragmentManager.beginTransaction();
+ Fragment fragment = mFragmentManager.findFragmentByTag(TAG_SAVE_RECORDINGD);
+ if (null != fragment) {
+ ft.remove(fragment);
+ ft.commitAllowingStateLoss();
+ }
+ }
+
+ /**
+ * Check whether recording card is unmounted
+ *
+ * @param intent The intent about sdcard
+ *
+ * @return true or false indicate recording card unmount or not
+ */
+ private boolean isRecordingCardUnmount(Intent intent) {
+ String sdcard = FmRadioService.getRecordingSdcard();
+ String unmountSDCard = intent.getData().toString();
+ Log.d(TAG, "unmount sd card file path: " + unmountSDCard);
+ return unmountSDCard.equalsIgnoreCase("file://" + sdcard) ? true
+ : false;
+ }
+
+ /**
+ * Dismiss no antenna dialog
+ */
+ private boolean dismissNoAntennaDialog() {
+ NoAntennaDialog newFragment = (NoAntennaDialog) mFragmentManager
+ .findFragmentByTag(TAG_NO_ANTENNA);
+ if (null != newFragment) {
+ newFragment.dismissAllowingStateLoss();
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Cancel search progress
+ */
+ public void cancelSearch() {
+ Log.d(TAG, "FmRadioActivity.cancelSearch");
+ mService.stopScan();
+ }
+
+ /**
+ * No antenna continue to operate
+ */
+ @Override
+ public void noAntennaContinue() {
+ // We let user use the app if no antenna.
+ // But we do not automatically start FM.
+ Log.d(TAG, " noAntennaContinue.onClick ok to continue");
+ if (isAntennaAvailable()) {
+ powerUpFm();
+ } else {
+ Log.d(TAG, "noAntennaContinue.earphone is not ready");
+ mService.switchAntennaAsync(1);
+ }
+ }
+
+ /**
+ * No antenna cancel to operate
+ */
+ @Override
+ public void noAntennaCancel() {
+ Log.d(TAG, " onClick Negative");
+ if (mService != null && !mService.isInLockTaskMode()) {
+ exitService();
+ } else {
+ Log.d(TAG, "No need exit Service and Activity cause current is lock mode");
+ }
+ }
+
+ /**
+ * Recording dialog click
+ *
+ * @param recordingName The new recording name
+ */
+ @Override
+ public void onRecordingDialogClick(String recordingName) {
+ mService.saveRecordingAsync(recordingName);
+ mService.setModifiedRecordingName(null);
+ }
+
+ /**
+ * Update rds information
+ */
+ private void updateRds() {
+ if (mIsPlaying) {
+ Bundle bundle = new Bundle(2);
+ bundle.putString(FmRadioListener.KEY_PS_INFO, mService.getPS());
+ bundle.putString(FmRadioListener.KEY_RT_INFO, mService.getLRText());
+ Message msg = mHandler
+ .obtainMessage(FmRadioListener.LISTEN_PS_CHANGED);
+ msg.setData(bundle);
+ mHandler.sendMessage(msg);
+ }
+ }
+
+ /**
+ * Update current station according service station
+ */
+ private void updateCurrentStation() {
+ // get the frequency from service, set frequency in activity, UI,
+ // database
+ // same as the frequency in service
+ int freq = mService.getFrequency();
+ if (FmRadioUtils.isValidStation(freq)) {
+ if (mCurrentStation != freq) {
+ Log.d(TAG, "frequency in service isn't same as in database");
+ mCurrentStation = freq;
+ FmRadioStation.setCurrentStation(mContext, mCurrentStation);
+ refreshStationUI(mCurrentStation);
+ }
+ }
+ }
+
+ /**
+ * Update button status, and dialog status
+ */
+ private void updateDialogStatus() {
+ Log.d(TAG, "updateDialogStatus.mIsNeedShowSearchDlg:" + mIsNeedShowSearchDlg);
+ boolean isScan = mService.isScanning();
+ // check whether show search dialog, because it may be dismissed
+ // onSaveInstance
+ if (isScan && mIsNeedShowSearchDlg) {
+ Log.d(TAG, "updateDialogStatus: show search dialog. isScan is " + isScan);
+ mIsNeedShowSearchDlg = false;
+ showSearchDialog();
+ }
+
+ // check whether show recorder dialog, when activity is foreground
+ if (mIsNeedShowRecordDlg) {
+ Log.d(TAG, "updateDialogStatus.resume recordDlg.mPrevRecorderState:" +
+ mPrevRecorderState);
+ showSaveRecordingDialog();
+ mIsNeedShowRecordDlg = false;
+ }
+
+ /*
+ // check whether show no antenna dialog, when activity is foreground
+ if (mIsNeedShowNoAntennaDlg) {
+ Log.d(TAG, "updateDialogStatus.resume noAntennaDlg:");
+ showNoAntennaDialog();
+ refreshActionMenuPower(true);
+ mIsNeedShowNoAntennaDlg = false;
+ }
+ */
+ }
+
+ /**
+ * Update menu status, and animation
+ */
+ private void updateMenuStatus() {
+ boolean isPlaying = mService.isPowerUp();
+ boolean isPoweruping = mService.isPowerUping();
+ boolean isSeeking = mService.isSeeking();
+ boolean isScan = mService.isScanning();
+ boolean isMakePowerdown = mService.isMakePowerDown();
+ Log.d(TAG, "updateMenuStatus.isSeeking:" + isSeeking);
+ boolean fmStatus = (isScan || isSeeking || isPoweruping);
+ // when seeking, all button should disabled,
+ // else should update as origin status
+ refreshImageButton(fmStatus ? false : isPlaying);
+ refreshPopupMenuItem(fmStatus ? false : isPlaying);
+ refreshActionMenuItem(fmStatus ? false : isPlaying);
+ // if fm power down by other app, should enable power button
+ // to powerup.
+ Log.d(TAG, "updateMenuStatus.mIsNeedDisablePower: " + mIsNeedDisablePower);
+ refreshActionMenuPower(fmStatus ? false :
+ (isPlaying || (isMakePowerdown && !mIsNeedDisablePower)));
+
+ // check whether show animation
+ if (isSeeking || isPoweruping) {
+ Log.d(TAG, "updateMenuStatus. it is seeking or poweruping");
+ startAnimation();
+ }
+ }
+
+ private void initUiComponent() {
+ Log.i(TAG, "initUIComponent");
+ mTextRds = (TextView) findViewById(R.id.text_rds);
+ mTextRds.setText("");
+ mTextFm = (TextView) findViewById(R.id.text_fm);
+ mTextFm.setText(FM);
+ mTextMHz = (TextView) findViewById(R.id.text_mhz);
+ mTextMHz.setText(R.string.fm_unit);
+
+ mTextStationValue = (TextView) findViewById(R.id.station_value);
+ mTxtRecInfoLeft = (TextView) findViewById(R.id.txtRecInfoLeft);
+ mTxtRecInfoRight = (TextView) findViewById(R.id.txtRecInfoRight);
+ mRLRecordInfo = (RelativeLayout) findViewById(R.id.rl_recinfo);
+ mButtonRecord = (ImageButton) findViewById(R.id.btn_record);
+ mButtonStop = (ImageButton) findViewById(R.id.btn_stop);
+ mButtonPlayback = (ImageButton) findViewById(R.id.btn_playback);
+ mButtonAddToFavorite = (ImageButton) findViewById(R.id.button_add_to_favorite);
+ mTextStationName = (TextView) findViewById(R.id.station_name);
+ mButtonDecrease = (ImageButton) findViewById(R.id.button_decrease);
+ mButtonIncrease = (ImageButton) findViewById(R.id.button_increase);
+ mButtonPrevStation = (ImageButton) findViewById(R.id.button_prevstation);
+ mButtonNextStation = (ImageButton) findViewById(R.id.button_nextstation);
+
+ // initial mPopupMenu
+ mPopupMenu = new PopupMenu(mContext, findViewById(R.id.fm_menu));
+ Menu menu = mPopupMenu.getMenu();
+ mPopupMenu.getMenuInflater().inflate(R.menu.fm_menu, menu);
+
+ // put favorite button here since it might be used very early in
+ // changing recording mode
+ mCurrentStation = FmRadioStation.getCurrentStation(mContext);
+ boolean isFavoriteStation = FmRadioStation.isFavoriteStation(mContext,
+ mCurrentStation);
+ // If the current station is in favorite, set its icon to favorite icon;
+ // else, set to none favorite icon.
+ if (isFavoriteStation) {
+ mButtonAddToFavorite
+ .setImageResource(R.drawable.btn_fm_favorite_on_selector);
+ mTextStationName.setText(FmRadioStation.getStationName(mContext,
+ mCurrentStation, FmRadioStation.STATION_TYPE_FAVORITE));
+ } else {
+ mButtonAddToFavorite
+ .setImageResource(R.drawable.btn_fm_favorite_off_selector);
+ }
+
+ mTextStationValue.setText(FmRadioUtils.formatStation(mCurrentStation));
+ mAnimation = (Animation) AnimationUtils.loadAnimation(this,
+ R.drawable.anim);
+ mAnimImage = (ImageView) findViewById(R.id.iv_anim);
+ mAnimImage.setVisibility(View.INVISIBLE);
+ }
+
+ private void registerButtonClickListener() {
+ mButtonRecord.setOnClickListener(mButtonClickListener);
+ mButtonStop.setOnClickListener(mButtonClickListener);
+ mButtonPlayback.setOnClickListener(mButtonClickListener);
+ mButtonAddToFavorite.setOnClickListener(mButtonClickListener);
+ mButtonDecrease.setOnClickListener(mButtonClickListener);
+ mButtonIncrease.setOnClickListener(mButtonClickListener);
+ mButtonPrevStation.setOnClickListener(mButtonClickListener);
+ mButtonNextStation.setOnClickListener(mButtonClickListener);
+ }
+
+ private void registerSdcardReceiver() {
+ IntentFilter iFilter = new IntentFilter();
+ iFilter.addAction(Intent.ACTION_MEDIA_EJECT);
+ iFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
+ iFilter.addAction(Intent.ACTION_MEDIA_MOUNTED);
+ iFilter.addDataScheme("file");
+ registerReceiver(mSdcardListener, iFilter);
+ }
+
+ private void unregisterSdcardReceiver() {
+ unregisterReceiver(mSdcardListener);
+ }
+
+ private void refreshTimeText() {
+ Log.d(TAG, "refreshTimeText:mRecordState:" + mRecordState);
+ if (!mIsInRecordingMode) {
+ Log.d(TAG, "refreshTimeText:mIsInRecordingMode:" + mIsInRecordingMode);
+ if (mRecordState == FmRecorder.STATE_RECORDING) {
+ mService.stopRecordingAsync();
+ } else if (mRecordState == FmRecorder.STATE_PLAYBACK) {
+ mService.stopPlaybackAsync();
+ }
+ return;
+ }
+
+ final int oneSecond = 1000;
+ switch (mRecordState) {
+ case FmRecorder.STATE_RECORDING:
+ int recordTime = (int) ((SystemClock.elapsedRealtime() - mRecordStartTime) /
+ oneSecond);
+ mTxtRecInfoLeft.setText(getTimeString(recordTime));
+ Log.d(TAG, "Recording time = " + mTxtRecInfoLeft.getText());
+ String recordingSdcard = FmRadioService.getRecordingSdcard();
+ if (!FmRadioUtils.hasEnoughSpace(recordingSdcard)) {
+ // recordTime 1s to avoid start() then quickly stop() native exception
+ if (recordTime > 1) {
+ // Insufficient storage
+ mService.stopRecordingAsync();
+ }
+ }
+ break;
+
+ case FmRecorder.STATE_PLAYBACK:
+ int playTime = (int) ((SystemClock.elapsedRealtime() - mPlayStartTime) / oneSecond);
+ mTxtRecInfoRight.setText(getTimeString(playTime));
+ Log.d(TAG, "Playing time = " + mTxtRecInfoRight.getText());
+ break;
+
+ default:
+ break;
+ }
+ mHandler.sendEmptyMessageDelayed(FmRadioListener.MSGID_REFRESH, oneSecond);
+ }
+}
diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioContentProvider.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioContentProvider.java
new file mode 100755
index 0000000..5397e9b
--- /dev/null
+++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioContentProvider.java
@@ -0,0 +1,297 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2011-2014. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.fmradio;
+
+import android.content.ContentProvider;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.UriMatcher;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.database.sqlite.SQLiteQueryBuilder;
+import android.net.Uri;
+import android.text.TextUtils;
+import android.util.Log;
+
+/**
+ * This class provider interface to operator FM database table StationList
+ */
+public class FmRadioContentProvider extends ContentProvider {
+ private static final String TAG = "FmRx/Provider";
+
+ // database instance use to operate the database
+ private SQLiteDatabase mSqlDb = null;
+ // database helper use to get database instance
+ private DatabaseHelper mDbHelper = null;
+ // database name
+ private static final String DATABASE_NAME = "FmRadio.db";
+ // database version
+ private static final int DATABASE_VERSION = 1;
+ // table name
+ private static final String TABLE_NAME = "StationList";
+
+ // URI match code
+ private static final int STATION_FREQ = 1;
+ // URI match code
+ private static final int STATION_FREQ_ID = 2;
+ // use to match URI
+ private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
+
+ // match URI with station frequency or station frequency id
+ static {
+ URI_MATCHER.addURI(FmRadioStation.AUTHORITY, FmRadioStation.STATION, STATION_FREQ);
+ URI_MATCHER.addURI(FmRadioStation.AUTHORITY, FmRadioStation.STATION + "/#",
+ STATION_FREQ_ID);
+ }
+
+ /**
+ * Helper to operate database
+ */
+ private static class DatabaseHelper extends SQLiteOpenHelper {
+
+ /**
+ * initial database name and database version
+ *
+ * @param context application context
+ */
+ DatabaseHelper(Context context) {
+ super(context, DATABASE_NAME, null, DATABASE_VERSION);
+ }
+
+ /**
+ * Create database table
+ *
+ * @param db The database
+ */
+ @Override
+ public void onCreate(SQLiteDatabase db) {
+ // Create the table
+ Log.d(TAG, "DatabaseHelper.onCreate");
+ db.execSQL(
+ "Create table "
+ + TABLE_NAME
+ + "("
+ + FmRadioStation.Station._ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ + FmRadioStation.Station.COLUMN_STATION_NAME + " TEXT,"
+ + FmRadioStation.Station.COLUMN_STATION_FREQ + " INTEGER,"
+ + FmRadioStation.Station.COLUMN_STATION_TYPE + " INTEGER"
+ + ");"
+ );
+ }
+
+ /**
+ * Upgrade database
+ *
+ * @param db database
+ * @param oldVersion The old database version
+ * @param newVersion The new database version
+ */
+ @Override
+ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+ Log.i(TAG, "Upgrading database from version " + oldVersion + " to "
+ + newVersion + ", which will destroy all old data");
+ db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
+ onCreate(db);
+ }
+ }
+
+ /**
+ * Delete database table rows with condition
+ *
+ * @param uri The uri to delete
+ * @param selection The where cause to apply, if null will delete all rows
+ * @param selectionArgs The select value
+ *
+ * @return The rows number has be deleted
+ */
+ @Override
+ public int delete(Uri uri, String selection, String[] selectionArgs) {
+ Log.d(TAG, "FmRadioContentProvider.delete");
+ int rows = 0;
+ mSqlDb = mDbHelper.getWritableDatabase();
+ switch (URI_MATCHER.match(uri)) {
+ case STATION_FREQ:
+ rows = mSqlDb.delete(TABLE_NAME, selection, selectionArgs);
+ getContext().getContentResolver().notifyChange(uri, null);
+ break;
+
+ case STATION_FREQ_ID:
+ String stationID = uri.getPathSegments().get(1);
+ rows = mSqlDb.delete(TABLE_NAME,
+ FmRadioStation.Station._ID
+ + "="
+ + stationID
+ + (TextUtils.isEmpty(selection) ? "" : " AND (" + selection + ")"),
+ selectionArgs);
+ getContext().getContentResolver().notifyChange(uri, null);
+ break;
+
+ default:
+ Log.e(TAG, "Error: Unkown URI to delete: " + uri);
+ break;
+ }
+ return rows;
+ }
+
+ /**
+ * Insert values to database with uri
+ *
+ * @param uri The insert uri
+ * @param values The insert values
+ *
+ * @return The uri after inserted
+ */
+ @Override
+ public Uri insert(Uri uri, ContentValues values) {
+ Log.d(TAG, "FmRadioContentProvider.insert");
+ Uri rowUri = null;
+ mSqlDb = mDbHelper.getWritableDatabase();
+ ContentValues v = new ContentValues(values);
+ // Do not insert invalid values.
+ if (!v.containsKey(FmRadioStation.Station.COLUMN_STATION_NAME)
+ || !v.containsKey(FmRadioStation.Station.COLUMN_STATION_FREQ)
+ || !v.containsKey(FmRadioStation.Station.COLUMN_STATION_TYPE)) {
+ Log.e(TAG, "Error: Invalid values.");
+ return rowUri;
+ }
+
+ long rowId = mSqlDb.insert(TABLE_NAME, null, v);
+ if (rowId <= 0) {
+ Log.e(TAG, "Error: Failed to insert row into " + uri);
+ }
+ rowUri = ContentUris.appendId(FmRadioStation.Station.CONTENT_URI.buildUpon(), rowId)
+ .build();
+ getContext().getContentResolver().notifyChange(rowUri, null);
+ return rowUri;
+ }
+
+ /**
+ * Create database helper
+ *
+ * @return true if create database helper success
+ */
+ @Override
+ public boolean onCreate() {
+ mDbHelper = new DatabaseHelper(getContext());
+ return (null == mDbHelper) ? false : true;
+ }
+
+ /**
+ * Query the database with current settings and add information
+ *
+ * @param uri The database uri
+ * @param projection The columns need to query
+ * @param selection The where clause
+ * @param selectionArgs The where value
+ * @param sortOrder The column to sort
+ *
+ * @return The query result cursor
+ */
+ @Override
+ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+ String sortOrder) {
+ SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
+ SQLiteDatabase db = mDbHelper.getReadableDatabase();
+ qb.setTables(TABLE_NAME);
+
+ int match = URI_MATCHER.match(uri);
+
+ if (STATION_FREQ_ID == match) {
+ qb.appendWhere("_id = " + uri.getPathSegments().get(1));
+ }
+
+ Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, sortOrder);
+ if (null != c) {
+ c.setNotificationUri(getContext().getContentResolver(), uri);
+ }
+ return c;
+ }
+
+ /**
+ * Update the database content use content values with current settings and
+ * add information
+ *
+ * @param uri The database uri
+ * @param values The values need to update
+ * @param selection The where clause
+ * @param selectionArgs The where value
+ *
+ * @return The row numbers have changed
+ */
+ @Override
+ public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+ Log.d(TAG, "FmRadioContentProvider.update");
+ int rows = 0;
+ mSqlDb = mDbHelper.getWritableDatabase();
+ switch (URI_MATCHER.match(uri)) {
+ case STATION_FREQ:
+ rows = mSqlDb.update(TABLE_NAME, values, selection, selectionArgs);
+ getContext().getContentResolver().notifyChange(uri, null);
+ break;
+ case STATION_FREQ_ID:
+ String stationID = uri.getPathSegments().get(1);
+ rows = mSqlDb.update(TABLE_NAME,
+ values,
+ FmRadioStation.Station._ID
+ + "="
+ + stationID
+ + (TextUtils.isEmpty(selection) ? "" : " AND (" + selection + ")"),
+ selectionArgs);
+ getContext().getContentResolver().notifyChange(uri, null);
+ break;
+ default:
+ Log.e(TAG, "Error: Unkown URI to update: " + uri);
+ break;
+ }
+ return rows;
+ }
+
+ /**
+ * Get uri type
+ *
+ * @param uri The the uri
+ *
+ * @return The type
+ */
+ @Override
+ public String getType(Uri uri) {
+ return null;
+ }
+}
diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioEmActivity.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioEmActivity.java
new file mode 100755
index 0000000..51fd3dc
--- /dev/null
+++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioEmActivity.java
@@ -0,0 +1,1049 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein
+ * is confidential and proprietary to MediaTek Inc. and/or its licensors.
+ * Without the prior written permission of MediaTek inc. and/or its licensors,
+ * any reproduction, modification, use or disclosure of MediaTek Software,
+ * and information contained herein, in whole or in part, shall be strictly prohibited.
+ *
+ * MediaTek Inc. (C) 2010. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
+ * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+ * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+ * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+ * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
+ * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
+ * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
+ * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
+ * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
+ * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+ * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+ * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
+ * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek Software")
+ * have been modified by MediaTek Inc. All revisions are subject to any receiver's
+ * applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.fmradio;
+
+import android.app.Activity;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.ServiceConnection;
+import android.media.AudioManager;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Message;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.RadioButton;
+import android.widget.RadioGroup;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import java.util.Arrays;
+
+/**
+ * This class is used to provide engineer mode function for hardware test
+ *
+ */
+public class FmRadioEmActivity extends Activity {
+ public static final String TAG = "FmRx/EM";
+
+ private static final String TYPE_MSGID = "MSGID";
+ private static final String RDS_BLER_STRING = "RDS_BLER_STRING";
+ private static final String RDS_RSSI_STRING = "RDS_RSSI_STRING";
+ private static final String RDS_STEREMONO_STRING = "RDS_STEREMONO_STRING";
+ private static final String RDS_CAPARRAY_STRING = "RDS_CAPARRAY_STRING";
+
+ private static final int MSGID_OK = 1;
+ private static final int MSGID_UPDATE_RDS = 2;
+ private static final int MSGID_UPDATE_CURRENT_STATION = 3;
+
+ private static final int MSGID_TICK_EVENT = 6;
+ private static final int MSGID_INIT_OK = 7;
+ private static final int MSGID_POWERUP = 8;
+ private static final int MSGID_TUNE_FNISHED = 9;
+
+ private boolean mIsServiceStarted = false;
+ private boolean mIsServiceBinded = false;
+ private FmRadioService mService = null;
+
+ private boolean mIsPlaying = false; // When start, the radio is not playing.
+
+ // Record whether we are destroying.
+ private boolean mIsDestroying = false;
+ private boolean mIsTickEventExit = false;
+
+ // Strings shown in RDS text view.
+ private String mPSString = "";
+ private String mLRTextString = "";
+
+ private TextView mTextStereoMono = null;
+ private TextView mTextRssi = null;
+ private TextView mTextCapArray = null;
+ private TextView mTextRdsBler = null;
+ private TextView mTextRdsPS = null;
+ private TextView mTextRdsRT = null;
+ private TextView mTextChipID = null;
+ private TextView mTextECOVersion = null;
+ private TextView mTextPatchVersion = null;
+ private TextView mTextDSPVersion = null;
+ private TextView mTextCMDReturn0 = null;
+ private TextView mTextCMDReturn1 = null;
+ private TextView mTextCMDReturn2 = null;
+ private TextView mTextCMDReturn3 = null;
+ private TextView mTextCMDReturn4 = null;
+ private EditText mEditFreq = null;
+
+ private EditText mEditRssiThreshold = null;
+ private EditText mEditMuteGain = null;
+ private EditText mEditDesenseRssi = null;
+ private EditText mEditCMD0 = null;
+ private EditText mEditCMD1 = null;
+ private EditText mEditCMD2 = null;
+ private EditText mEditCMD3 = null;
+ private EditText mEditCMD4 = null;
+ private EditText mEditCMD5 = null;
+ private EditText mEditCMD6 = null;
+ private EditText mEditCMD7 = null;
+ private EditText mEditCMD8 = null;
+ private EditText mEditCMD9 = null;
+ private EditText mEditCMD10 = null;
+ private EditText mEditCMD11 = null;
+ private EditText mEditCMD12 = null;
+ private EditText mEditCMD13 = null;
+ private EditText mEditCMD14 = null;
+ private EditText mEditCMD15 = null;
+ private EditText mEditCMD16 = null;
+ private EditText mEditCMD17 = null;
+ private EditText mEditCMD18 = null;
+ private EditText mEditCMD19 = null;
+ private Button mButtonRssiThreshold = null;
+ private Button mButtonMuteGain = null;
+ private Button mButtonDesenseRssi = null;
+ private Button mButtonCMD = null;
+ private Button mButtonTune = null;
+ private RadioButton mRdAntennaS = null;
+ private RadioButton mRdAntennaL = null;
+ private RadioGroup mRgAntenna = null;
+ private RadioButton mRdStereo = null;
+ private RadioButton mRdMono = null;
+ private Context mContext = null;
+ private Thread mTickEventThread = null;
+
+ // Can not use float to record the station. Because there will be inaccuracy when increase/decrease 0.1
+ private int mCurrentStation = FmRadioUtils.DEFAULT_STATION;
+ private AudioManager mAudioManager = null;
+ private HeadsetConnectionReceiver mHeadsetConnectionReceiver = null;
+
+ /**
+ * use to show update antenna UI
+ *
+ */
+ private class HeadsetConnectionReceiver extends BroadcastReceiver {
+ public void onReceive(Context context, Intent intent) {
+ if (intent.getIntExtra("state", 0) == 0) { // unpluged
+ if (mIsPlaying) {
+ mRgAntenna.check(R.id.FMR_Antenna_short);
+ }
+ } else if (intent.getIntExtra("state", 0) == 1) { // pluged
+ if (mIsPlaying) {
+ mRgAntenna.check(R.id.FMR_Antenna_long);
+ }
+ }
+
+ }
+ };
+
+ /**
+ * click listener
+ */
+ private View.OnClickListener mButtonClickListener = new View.OnClickListener() {
+ /**
+ * handle click event
+ * @param v clicked view
+ */
+ public void onClick(View v) {
+ switch (v.getId()) {
+ case R.id.FMR_Antenna_short:
+ switchAntenna(1);
+ break;
+ case R.id.FMR_Antenna_long:
+ switchAntenna(0);
+ break;
+ case R.id.FMR_Stereomono_stereo:
+// if (!setStereoMono(false)) {
+// Toast.makeText(mContext, "Set Stereo Mono failed.", Toast.LENGTH_SHORT).show();
+// }
+ setStereoMono(false);
+ break;
+ case R.id.FMR_Stereomono_mono:
+// if (!setStereoMono(true)) {
+// Toast.makeText(mContext, "Set Stereo Mono failed.", Toast.LENGTH_SHORT).show();
+// }
+ setStereoMono(true);
+ break;
+ case R.id.FMR_Freq_tune:
+ String s = mEditFreq.getText().toString();
+ float freq = 0;
+ try {
+ freq = Float.valueOf(s);
+
+ // If input not between 87.5 to 108.0
+ int station = FmRadioUtils.computeStation(freq);
+ if (!FmRadioUtils.isValidStation(station)) {
+ Toast.makeText(FmRadioEmActivity.this, "Please input 87.5 ~ 108.0.", Toast.LENGTH_SHORT).show();
+ mEditFreq.setText(FmRadioUtils.formatStation(mCurrentStation));
+ return;
+ }
+ } catch (NumberFormatException e) {
+ Toast.makeText(FmRadioEmActivity.this, "bad float format.", Toast.LENGTH_SHORT).show();
+ mEditFreq.setText(FmRadioUtils.formatStation(mCurrentStation));
+ return;
+ }
+
+
+ // disable button before it finished tune.
+ mButtonTune.setEnabled(false);
+ tuneToStation(FmRadioUtils.computeStation(freq));
+ break;
+ case R.id.FMR_EM_RSSI_THRESHOLD_OK:
+ String rssi = mEditRssiThreshold.getText().toString();
+ int rssi_edit = 0;
+ try {
+ rssi_edit = Integer.valueOf(rssi);
+ } catch (NumberFormatException e) {
+ Log.e(TAG, "click rssi threshold button:" + e);
+ Toast.makeText(FmRadioEmActivity.this, "bad format.", Toast.LENGTH_SHORT).show();
+ mEditFreq.setText("0");
+ return;
+ }
+ mButtonRssiThreshold.setEnabled(false);
+ boolean isRssiOk = mService.setEmth(0, rssi_edit);
+ mButtonRssiThreshold.setEnabled(true);
+ if (isRssiOk) {
+ Toast.makeText(FmRadioEmActivity.this, "Rssi Threshold set OK.", Toast.LENGTH_SHORT).show();
+ } else {
+ Toast.makeText(FmRadioEmActivity.this, "Rssi Threshold set fail.", Toast.LENGTH_SHORT).show();
+ }
+ break;
+ case R.id.FMR_EM_DESENSE_RSSI_OK:
+ String deRssi = mEditDesenseRssi.getText().toString();
+ int deRssi_edit = 0;
+ try {
+ deRssi_edit = Integer.valueOf(deRssi);
+ } catch (NumberFormatException e) {
+ Log.e(TAG, "click desense rssi button:" + e);
+ Toast.makeText(FmRadioEmActivity.this, "bad format.", Toast.LENGTH_SHORT).show();
+ mEditDesenseRssi.setText("0");
+ return;
+ }
+ mButtonDesenseRssi.setEnabled(false);
+ boolean isDeRssiOk = mService.setEmth(1, deRssi_edit);
+ mButtonDesenseRssi.setEnabled(true);
+ if (isDeRssiOk) {
+ Toast.makeText(FmRadioEmActivity.this, "Desense Rssi Threshold set OK.", Toast.LENGTH_SHORT).show();
+ } else {
+ Toast.makeText(FmRadioEmActivity.this, "Desense Rssi Threshold set fail.", Toast.LENGTH_SHORT).show();
+ }
+ break;
+ case R.id.FMR_EM_MUTE_GAIN_OK:
+ String mutegain = mEditMuteGain.getText().toString();
+ int mutegain_edit = 0;
+ try {
+ mutegain_edit = Integer.valueOf(mutegain);
+ } catch (NumberFormatException e) {
+ Log.e(TAG, "click mute gain button:" + e);
+ Toast.makeText(FmRadioEmActivity.this, "bad format.", Toast.LENGTH_SHORT).show();
+ mEditMuteGain.setText("0");
+ return;
+ }
+ mButtonMuteGain.setEnabled(false);
+ boolean isMuteOk = mService.setEmth(2, mutegain_edit);
+ mButtonMuteGain.setEnabled(true);
+ if (isMuteOk) {
+ Toast.makeText(FmRadioEmActivity.this, "Software mute gain set OK.", Toast.LENGTH_SHORT).show();
+ } else {
+ Toast.makeText(FmRadioEmActivity.this, "Software mute gain set fail.", Toast.LENGTH_SHORT).show();
+ }
+ break;
+ case R.id.FMR_EM_CMD_OK:
+ String cmd0 = mEditCMD0.getText().toString();
+ String cmd1 = mEditCMD1.getText().toString();
+ String cmd2 = mEditCMD2.getText().toString();
+ String cmd3 = mEditCMD3.getText().toString();
+ String cmd4 = mEditCMD4.getText().toString();
+ String cmd5 = mEditCMD5.getText().toString();
+ String cmd6 = mEditCMD6.getText().toString();
+ String cmd7 = mEditCMD7.getText().toString();
+ String cmd8 = mEditCMD8.getText().toString();
+ String cmd9 = mEditCMD9.getText().toString();
+ String cmd10 = mEditCMD10.getText().toString();
+ String cmd11 = mEditCMD11.getText().toString();
+ String cmd12 = mEditCMD12.getText().toString();
+ String cmd13 = mEditCMD13.getText().toString();
+ String cmd14 = mEditCMD14.getText().toString();
+ String cmd15 = mEditCMD15.getText().toString();
+ String cmd16 = mEditCMD16.getText().toString();
+ String cmd17 = mEditCMD17.getText().toString();
+ String cmd18 = mEditCMD18.getText().toString();
+ String cmd19 = mEditCMD19.getText().toString();
+ short[] cmdArray = new short[20];
+ try {
+ cmdArray = new short[] {
+ Short.valueOf(cmd0),
+ Short.valueOf(cmd1),
+ Short.valueOf(cmd2),
+ Short.valueOf(cmd3),
+ Short.valueOf(cmd4),
+ Short.valueOf(cmd5),
+ Short.valueOf(cmd6),
+ Short.valueOf(cmd7),
+ Short.valueOf(cmd8),
+ Short.valueOf(cmd9),
+ Short.valueOf(cmd10),
+ Short.valueOf(cmd11),
+ Short.valueOf(cmd12),
+ Short.valueOf(cmd13),
+ Short.valueOf(cmd14),
+ Short.valueOf(cmd15),
+ Short.valueOf(cmd16),
+ Short.valueOf(cmd17),
+ Short.valueOf(cmd18),
+ Short.valueOf(cmd19)};
+ } catch (Exception e) {
+ Log.e(TAG, "click cmd button:" + e);
+ Toast.makeText(FmRadioEmActivity.this, "bad format.", Toast.LENGTH_SHORT).show();
+ return;
+ }
+ short[] cmds = mService.emcmd(cmdArray);
+
+ if (cmds == null) {
+ Toast.makeText(FmRadioEmActivity.this, "cmd execute fail.", Toast.LENGTH_SHORT).show();
+ Log.d(TAG, "cmd expand execute fail");
+ return;
+ }
+ int size = cmds.length;
+ int count = 0;
+ String[] values = new String[]{"","","","",""};
+ int line = -1;
+ while (count < size) {
+ if (count%4 == 0) {
+ line += 1;
+ }
+ values[line] += ("0X" + cmds[count]);
+ ++count;
+ }
+ mTextCMDReturn0.setText(values[0]);
+ mTextCMDReturn1.setText(values[1]);
+ mTextCMDReturn2.setText(values[2]);
+ mTextCMDReturn3.setText(values[3]);
+ mTextCMDReturn4.setText(values[4]);
+ break;
+ default :
+ Log.d(TAG, "invalid view id");
+ }
+ }
+ };
+
+ /**
+ * FM Radio listener
+ */
+ private FmRadioListener mFmRadioListener = new FmRadioListener() {
+
+ /**
+ * call back method from service
+ */
+ public void onCallBack(Bundle bundle) {
+ Message msg = mHandler.obtainMessage(bundle.getInt(FmRadioListener.CALLBACK_FLAG));
+ msg.setData(bundle);
+ mHandler.sendMessage(msg);
+ }
+ };
+
+ /**
+ * Called when the activity is first created.
+ */
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ Log.d(TAG, "begin FMRadioEMActivity.onCreate");
+ // Bind the activity to FM audio stream.
+ setVolumeControlStream(AudioManager.STREAM_MUSIC);
+ setContentView(R.layout.fm_rx_em);
+ // Init FM database
+ mContext = getApplicationContext();
+ FmRadioStation.initFmDatabase(mContext);
+
+ mTextStereoMono = (TextView) findViewById(R.id.FMR_Status_Stereomono);
+ mTextRssi = (TextView) findViewById(R.id.FMR_Status_RSSI);
+ mTextCapArray = (TextView) findViewById(R.id.FMR_Status_Caparray);
+ mTextRdsBler = (TextView) findViewById(R.id.FMR_RDS_Ratio);
+ mTextRdsPS = (TextView) findViewById(R.id.FMR_RDS_PS);
+ mTextRdsRT = (TextView) findViewById(R.id.FMR_RDS_RT);
+ mTextChipID = (TextView) findViewById(R.id.FMR_Chip_ID);
+ mTextECOVersion = (TextView) findViewById(R.id.FMR_ECO_Version);
+ mTextPatchVersion = (TextView) findViewById(R.id.FMR_Patch_Version);
+ mTextDSPVersion = (TextView) findViewById(R.id.FMR_DSP_Version);
+ mTextCMDReturn0 = (TextView) findViewById(R.id.FMR_EM_CMD_RETURN0);
+ mTextCMDReturn1 = (TextView) findViewById(R.id.FMR_EM_CMD_RETURN1);
+ mTextCMDReturn2 = (TextView) findViewById(R.id.FMR_EM_CMD_RETURN2);
+ mTextCMDReturn3 = (TextView) findViewById(R.id.FMR_EM_CMD_RETURN3);
+ mTextCMDReturn4 = (TextView) findViewById(R.id.FMR_EM_CMD_RETURN4);
+ mEditFreq = (EditText) findViewById(R.id.FMR_Freq_edit);
+ mEditRssiThreshold = (EditText) findViewById(R.id.FMR_EM_RSSI_THRESHOLD_edit);
+ mEditMuteGain = (EditText) findViewById(R.id.FMR_EM_MUTE_GAIN_edit);
+ mEditDesenseRssi = (EditText) findViewById(R.id.FMR_EM_DESENSE_RSSI_edit);
+ mEditCMD0 = (EditText) findViewById(R.id.FMR_EM_CMD_edit0);
+ mEditCMD1 = (EditText) findViewById(R.id.FMR_EM_CMD_edit1);
+ mEditCMD2 = (EditText) findViewById(R.id.FMR_EM_CMD_edit2);
+ mEditCMD3 = (EditText) findViewById(R.id.FMR_EM_CMD_edit3);
+ mEditCMD4 = (EditText) findViewById(R.id.FMR_EM_CMD_edit4);
+ mEditCMD5 = (EditText) findViewById(R.id.FMR_EM_CMD_edit5);
+ mEditCMD6 = (EditText) findViewById(R.id.FMR_EM_CMD_edit6);
+ mEditCMD7 = (EditText) findViewById(R.id.FMR_EM_CMD_edit7);
+ mEditCMD8 = (EditText) findViewById(R.id.FMR_EM_CMD_edit8);
+ mEditCMD9 = (EditText) findViewById(R.id.FMR_EM_CMD_edit9);
+ mEditCMD10 = (EditText) findViewById(R.id.FMR_EM_CMD_edit10);
+ mEditCMD11 = (EditText) findViewById(R.id.FMR_EM_CMD_edit11);
+ mEditCMD12 = (EditText) findViewById(R.id.FMR_EM_CMD_edit12);
+ mEditCMD13 = (EditText) findViewById(R.id.FMR_EM_CMD_edit13);
+ mEditCMD14 = (EditText) findViewById(R.id.FMR_EM_CMD_edit14);
+ mEditCMD15 = (EditText) findViewById(R.id.FMR_EM_CMD_edit15);
+ mEditCMD16 = (EditText) findViewById(R.id.FMR_EM_CMD_edit16);
+ mEditCMD17 = (EditText) findViewById(R.id.FMR_EM_CMD_edit17);
+ mEditCMD18 = (EditText) findViewById(R.id.FMR_EM_CMD_edit18);
+ mEditCMD19 = (EditText) findViewById(R.id.FMR_EM_CMD_edit19);
+
+ mButtonRssiThreshold = (Button) findViewById(R.id.FMR_EM_RSSI_THRESHOLD_OK);
+ mButtonMuteGain = (Button) findViewById(R.id.FMR_EM_MUTE_GAIN_OK);
+ mButtonDesenseRssi = (Button) findViewById(R.id.FMR_EM_DESENSE_RSSI_OK);
+ mButtonCMD = (Button) findViewById(R.id.FMR_EM_CMD_OK);
+
+ mButtonTune = (Button) findViewById(R.id.FMR_Freq_tune);
+ mRdAntennaS = (RadioButton) findViewById(R.id.FMR_Antenna_short);
+ mRdAntennaL = (RadioButton) findViewById(R.id.FMR_Antenna_long);
+ mRgAntenna = (RadioGroup) findViewById(R.id.FMR_Antenna_type);
+ mRdStereo = (RadioButton) findViewById(R.id.FMR_Stereomono_stereo);
+ mRdMono = (RadioButton) findViewById(R.id.FMR_Stereomono_mono);
+
+ mRdAntennaS.setOnClickListener(mButtonClickListener);
+ mRdAntennaL.setOnClickListener(mButtonClickListener);
+ mRdStereo.setOnClickListener(mButtonClickListener);
+ mRdMono.setOnClickListener(mButtonClickListener);
+ mButtonTune.setOnClickListener(mButtonClickListener);
+
+ mButtonRssiThreshold.setOnClickListener(mButtonClickListener);
+ mButtonMuteGain.setOnClickListener(mButtonClickListener);
+ mButtonDesenseRssi.setOnClickListener(mButtonClickListener);
+ mButtonCMD.setOnClickListener(mButtonClickListener);
+
+ // Should start FM service first.
+// ComponentName cn = startService(new Intent(FMRadioEMActivity.this, FmRadioService.class));
+// if (null == cn) {
+// Log.e(TAG, "Error: Cannot start FM service");
+// } else {
+// Log.d(TAG, "Start FM service successfully.");
+// mIsServiceStarted = true;
+ /*mIsServiceBinded = bindService(new Intent(FMRadioEMActivity.this, FmRadioService.class), mServiceConnection,
+ Context.BIND_AUTO_CREATE);
+// }
+ if (!mIsServiceBinded) {
+ Log.e(TAG, "Error: Cannot bind FM service");
+ finish();
+ return;
+ } else {
+ Log.d(TAG, "Bind FM service successfully.");
+ }*/
+
+
+ IntentFilter filterHeadset = new IntentFilter();
+ filterHeadset.addAction(Intent.ACTION_HEADSET_PLUG);
+ mHeadsetConnectionReceiver = new HeadsetConnectionReceiver();
+ Log.d(TAG, "Register HeadsetConnectionReceiver");
+ registerReceiver(mHeadsetConnectionReceiver, filterHeadset);
+
+ // Get all the views and set their actions.
+ mCurrentStation = FmRadioStation.getCurrentStation(mContext);
+ mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
+ refreshTextStatus(mIsPlaying);
+ Log.d(TAG, "end FMRadioEMActivity.onCreate");
+ }
+
+ /**
+ * called when bind service
+ */
+ private ServiceConnection mServiceConnection = new ServiceConnection() {
+
+ /**
+ * called when bind service
+ * @param className service name
+ * @param service service
+ */
+ public void onServiceConnected(ComponentName className, IBinder service) {
+ Log.d(TAG, "begin FMRadioEMActivity.onServiceConnected");
+ mService = ((FmRadioService.ServiceBinder)service).getService();
+ if (null == mService) {
+ Log.e(TAG, "Error: null interface");
+ finish();
+ return;
+ }
+
+ mService.registerFmRadioListener(mFmRadioListener);
+ if (!isServiceInited()) {
+ Log.d(TAG, "FM service is not init.");
+ initService(mCurrentStation);
+ refreshTextStatus(false);
+ // InitialThread thread = new InitialThread();
+ // thread.start();
+ // mService.openDeviceAsync();
+ Log.d(TAG, "onService connect.mCurrentStation: " + mCurrentStation);
+ mService.powerUpAsync(FmRadioUtils.computeFrequency(mCurrentStation));
+
+ } else {
+ Log.d(TAG, "FM service is already init.");
+ if (isDeviceOpen()) {
+ // Get the current frequency in service and save it into
+ // database.
+ int iFreq = getFrequency();
+ if (FmRadioUtils.isValidStation(iFreq)) {
+ if (mCurrentStation != iFreq) {
+ Log.d(TAG, "The frequency in FM service is not same as in database.");
+ mCurrentStation = iFreq;
+ // Save the current station frequency into data
+ // base.
+ FmRadioStation.setCurrentStation(mContext, mCurrentStation);
+ } else {
+ Log.d(TAG, "The frequency in FM service is same as in database.");
+ }
+ } else {
+ Log.e(TAG, "Error: invalid frequency in service.");
+ }
+
+ mIsPlaying = isPowerUp();
+
+ if (mIsPlaying) {
+ Log.d(TAG, "FM is already power up.");
+ refreshTextStatus(true);
+ }
+
+ if (mIsPlaying) {
+ // Update the RDS text view.
+ mPSString = getPS();
+ mLRTextString = getLRText();
+ mHandler.sendEmptyMessage(MSGID_UPDATE_RDS);
+ }
+
+ } else {
+ // This is theoretically never happen.
+ Log.e(TAG, "Error: FM device is not open");
+ }
+ mHandler.sendEmptyMessage(MSGID_INIT_OK);
+ }
+ Log.d(TAG, "<<< FMRadioEMActivity.onServiceConnected");
+ }
+
+ public void onServiceDisconnected(ComponentName className) {
+ Log.d(TAG, ">>> FMRadioEMActivity.onServiceDisconnected");
+ mService = null;
+ Log.d(TAG, "<<< FMRadioEMActivity.onServiceDisconnected");
+ }
+ };
+ private Handler mHandler = new Handler() {
+ public void handleMessage(Message msg) {
+ Log.d(TAG, ">>> handleMessage what: " + msg.what);
+ if (mIsDestroying) {
+ Log.d(TAG, "Warning: app is being destroyed.");
+ Log.d(TAG, "<<< handleMessage");
+ return;
+ }
+ Bundle bundle;
+ switch (msg.what) {
+ case MSGID_INIT_OK:
+ mTextChipID.setText(getChipId());
+ mTextECOVersion.setText(getEcoVersion());
+ mTextPatchVersion.setText(getPatchVersion());
+ mTextDSPVersion.setText(getDspVersion());
+ break;
+ case MSGID_TICK_EVENT:
+ bundle = msg.getData();
+ mTextRdsBler.setText(bundle.getString(RDS_BLER_STRING));
+ mTextRssi.setText(bundle.getString(RDS_RSSI_STRING));
+ mTextStereoMono.setText(bundle.getString(RDS_STEREMONO_STRING));
+ mTextCapArray.setText(bundle.getString(RDS_CAPARRAY_STRING));
+ break;
+
+ case FmRadioListener.MSGID_POWERUP_FINISHED:
+ if (isSpeakerUsed()) {
+// switchAntenna(0);
+ mRgAntenna.check(R.id.FMR_Antenna_short);
+ } else {
+// switchAntenna(1);
+ mRgAntenna.check(R.id.FMR_Antenna_long);
+ }
+ bundle = msg.getData();
+ mIsPlaying = bundle.getBoolean(FmRadioListener.KEY_IS_POWER_UP);
+ mHandler.sendEmptyMessage(MSGID_INIT_OK);
+ refreshTextStatus(true);
+ break;
+
+ case FmRadioListener.MSGID_SWITCH_ANNTENNA:
+ bundle = msg.getData();
+ boolean isSwitch = bundle.getBoolean(FmRadioListener.KEY_IS_SWITCH_ANNTENNA);
+ if (isSwitch) {
+// mService.powerUpAsync(FmRadioUtils.computeFrequency(mCurrentStation));
+ Log.d(TAG, "mHandler. switch anntenna ok");
+ }
+ break;
+ case FmRadioListener.MSGID_TUNE_FINISHED:
+ bundle = msg.getData();
+ float frequency = bundle.getFloat(FmRadioListener.KEY_TUNE_TO_STATION);
+ mCurrentStation = FmRadioUtils.computeStation(frequency);
+ // Save the current station frequency into data base.
+// FmRadioStation.setCurrentStation(mContext, mCurrentStation);
+ refreshTextStatus(true);
+ break;
+
+ case FmRadioListener.LISTEN_PS_CHANGED:
+ case FmRadioListener.LISTEN_RT_CHANGED:
+ bundle = msg.getData();
+ mPSString = bundle.getString(FmRadioListener.KEY_PS_INFO);
+ mLRTextString = bundle.getString(FmRadioListener.KEY_RT_INFO);
+ showRDS();
+ break;
+ case FmRadioListener.LISTEN_RDSSTATION_CHANGED:
+ bundle = msg.getData();
+ mCurrentStation = bundle.getInt(FmRadioListener.KEY_RDS_STATION);
+ break;
+ default:
+ Log.d(TAG, "invalid view id");
+ }
+ Log.d(TAG, "<<< handleMessage");
+ }
+
+ };
+
+ private String formatCapArray(int raw) {
+ final float[] pF = { 0.166f, 0.332f, 0.664f, 1.33f, 2.66f, 5.31f, 10.6f, 18.6f };
+
+ float sum = 0.0f;
+ for (int i = 0; i < pF.length; i++) {
+ final int base = 6;
+ sum += (((raw >> (base + i)) & 0x1) == 1 ? pF[i] : 0.0);
+ }
+ return String.format("%.2f", sum);
+ }
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ mIsServiceBinded = bindService(new Intent(FmRadioEmActivity.this, FmRadioService.class), mServiceConnection,
+ Context.BIND_AUTO_CREATE);
+// }
+ if (!mIsServiceBinded) {
+ Log.e(TAG, "Error: Cannot bind FM service");
+ finish();
+ return;
+ } else {
+ Log.d(TAG, "Bind FM service successfully.");
+ }
+ }
+ /**
+ * called when activity resume
+ */
+ public void onResume() {
+ super.onResume();
+ /*final int oneSecond = 1000;
+ mHandler.sendEmptyMessageDelayed(MSGID_TICK_EVENT, oneSecond);*/
+ readTickEvent();
+ }
+
+ /**
+ * called when activity pause
+ */
+ public void onPause() {
+ mHandler.removeMessages(MSGID_TICK_EVENT);
+ stopTickEventThread();
+ super.onPause();
+ }
+
+ @Override
+ protected void onStop() {
+ Log.d(TAG, "start FMRadioActivity.onStop");
+ if (mIsServiceBinded) {
+ unbindService(mServiceConnection);
+ mIsServiceBinded = false;
+ }
+ Log.d(TAG, "end FMRadioActivity.onStop");
+ super.onStop();
+ }
+
+ /**
+ * called when activity destroy
+ */
+ public void onDestroy() {
+ Log.d(TAG, ">>> FMRadioEMActivity.onDestroy");
+ mIsDestroying = true;
+ mHandler.removeCallbacks(null);
+ if (null != mHeadsetConnectionReceiver) {
+ Log.d(TAG, "Unregister headset broadcast receiver.");
+ unregisterReceiver(mHeadsetConnectionReceiver);
+ mHeadsetConnectionReceiver = null;
+ }
+ // Should powerdown FM.
+ if (mIsPlaying) {
+ Log.d(TAG, "FM is Playing. So stop it.");
+// powerDown();
+ mService.powerDownAsync();
+ mIsPlaying = false;
+ }
+ if (null != mService) {
+ mService.unregisterFmRadioListener(mFmRadioListener);
+ }
+ mService = null;
+ mFmRadioListener = null;
+
+
+ Log.d(TAG, "<<< FMRadioEMActivity.onDestroy");
+ super.onDestroy();
+ }
+
+ private boolean isAntennaAvailable() {
+ return mAudioManager.isWiredHeadsetOn();
+ }
+
+ private void tuneToStation(final int iStation) {
+ mService.tuneStationAsync(FmRadioUtils.computeFrequency(iStation));
+ }
+
+
+ private void refreshTextStatus(boolean on) {
+ if (!on) {
+ mTextStereoMono.setText("X");
+ mTextRssi.setText("X");
+ mTextCapArray.setText("X");
+ mTextRdsBler.setText("X");
+ mTextRdsPS.setText("X");
+ mTextRdsRT.setText("X");
+ mEditFreq.setText(FmRadioUtils.formatStation(mCurrentStation));
+ mRgAntenna.clearCheck();
+ mButtonTune.setEnabled(false);
+ } else {
+ mButtonTune.setEnabled(true);
+ }
+ }
+
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ }
+
+ /*private int rdsset(boolean rdson) {
+ return mIsRDSSupported ? setRDS(rdson) : -1;
+ }*/
+
+ private void showRDS() {
+ Log.v(TAG, "FMRadioEMActivity.showRDS PS : " + mPSString + "RT :" + mLRTextString);
+ mTextRdsPS.setText(mPSString);
+ mTextRdsRT.setText(mLRTextString);
+ }
+
+ /**
+ * get chip id
+ * @return chip id
+ */
+ public String getChipId() {
+ int[] hardwareVersion = getHardwareVersion();
+ int chipId = 0;
+ if (null != hardwareVersion) {
+ chipId = hardwareVersion[0];
+ }
+ return getStringValue(chipId);
+ }
+
+ /**
+ * get ECO version
+ * @return ECO version
+ */
+ public String getEcoVersion() {
+ int[] hardwareVersion = getHardwareVersion();
+ int ecoVersion = 0;
+ if (null != hardwareVersion) {
+ ecoVersion = hardwareVersion[1];
+ }
+ return "E" + getStringValue(ecoVersion);
+ }
+
+ /**
+ * get patch version
+ * @return patch version
+ */
+ public String getPatchVersion() {
+ int[] hardwareVersion = getHardwareVersion();
+ int patchVersion = 0;
+ if (null != hardwareVersion) {
+ final int patchVersionPosition = 3;
+ patchVersion = hardwareVersion[patchVersionPosition];
+ }
+ String patchStr = getStringValue(patchVersion);
+ float patch = 0;
+ if (null != patchStr) {
+ try {
+ final int hundred = 100;
+ patch = Float.parseFloat(patchStr) / hundred;
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ }
+ }
+ return Float.toString(patch);
+ }
+
+ /**
+ * get DSP version
+ * @return DSP version
+ */
+ public String getDspVersion() {
+ int[] hardwareVersion = getHardwareVersion();
+ int dspVersion = 0;
+ if (null != hardwareVersion) {
+ dspVersion = hardwareVersion[2];
+ }
+ return "V" + getStringValue(dspVersion);
+ }
+
+ private boolean isDeviceOpen() {
+ if (null != mService) {
+ return mService.isDeviceOpen();
+ }
+ return false;
+ }
+
+ private boolean isPowerUp() {
+ boolean bRet = false;
+ if (null != mService) {
+ return mService.isPowerUp();
+ }
+ return false;
+ }
+
+ private String getPS() {
+ if (null != mService) {
+ return mService.getPS();
+ }
+ return null;
+ }
+
+ private String getLRText() {
+ if (null != mService) {
+ return mService.getLRText();
+ }
+ return null;
+ }
+
+ private boolean isRdsSupported() {
+ if (null != mService) {
+ return mService.isRdsSupported();
+ }
+ return false;
+ }
+
+ private boolean isSpeakerUsed() {
+ if (null != mService) {
+ return mService.isSpeakerUsed();
+ }
+ return true;
+ }
+
+ private void initService(int iCurrentStation) {
+ if (null != mService) {
+ mService.initService(iCurrentStation);
+ }
+ }
+
+ private boolean isServiceInited() {
+ if (null != mService) {
+ return mService.isServiceInited();
+ }
+ return false;
+ }
+
+ private int getFrequency() {
+ if (null != mService) {
+ return mService.getFrequency();
+ }
+ return 0;
+ }
+
+ /**
+ * read cap array
+ * @return cap array
+ */
+ public int readCapArray() {
+ if (null != mService) {
+ return mService.getCapArray();
+ }
+ return 0;
+ }
+
+ /**
+ * get rssi value
+ * @return rssi value
+ */
+ public int readRssi() {
+ if (null != mService) {
+ return mService.getRssi();
+ }
+ return 0;
+ }
+
+ /**
+ * get stereo or mono
+ * @return true is stereo, false mono
+ */
+ public boolean getStereoMono() {
+ if (null != mService) {
+ return mService.getStereoMono();
+ }
+ return false;
+ }
+
+ /**
+ * set stereo or mono
+ * @param isMono mono or not
+ * @return whether success
+ */
+ public void setStereoMono(boolean isMono) {
+// if (null != mService) {
+// return mService.setStereoMono(isMono);
+// }
+// return false;
+ mService.setStereoMono(isMono);
+ }
+
+ /**
+ * switch antenna
+ *
+ * @param antenna
+ * antenna (0, long antenna, 1 short antenna)
+ * @return (0, success; 1 failed; 2 not support)
+ */
+ public void switchAntenna(int type) {
+ /*if (null != mService) {
+ return mService.switchAntenna(type);
+ }
+ return 2;*/
+ mService.switchAntennaAsync(type);
+ }
+
+ /**
+ * read rds bler
+ *
+ * @return rds bler value
+ */
+ public int readRdsBler() {
+ if (null != mService) {
+ return mService.getRdsBler();
+ }
+ return 0;
+ }
+
+ /**
+ * get hardware version
+ * @return hardware version information array(0, ChipId; 1, EcoVersion; 2, PatchVersion; 3,
+ * DSPVersion)
+ */
+ public int[] getHardwareVersion() {
+ int[] hardwareVersion = null;
+ if (null != mService) {
+ hardwareVersion = mService.getHardwareVersion();
+ }
+ Log.v(TAG, "getHardwareversion: " + Arrays.toString(hardwareVersion));
+ return hardwareVersion;
+ }
+
+ /**
+ * get actual version string
+ * @param convertData version data
+ * @return actual version string
+ */
+ public String getStringValue(int convertData) {
+ StringBuilder temp = new StringBuilder();
+ int quotient = convertData;
+ int remainder = 0;
+ while (quotient > 0) {
+ final int hexadecimal = 16;
+ remainder = quotient % hexadecimal;
+ quotient = quotient / hexadecimal;
+ temp = temp.append(remainder);
+ }
+ return temp.reverse().toString();
+ }
+
+ public void readTickEvent() {
+ final int interval = 1000;
+
+ if (null != mTickEventThread) {
+ return;
+ }
+ mTickEventThread = new Thread() {
+ public void run() {
+ Log.d(TAG, ">>> tick envent Thread run()");
+ while (true) {
+ if (mIsTickEventExit) {
+ break;
+ }
+
+ if (isDeviceOpen()) {
+ Bundle bundle = new Bundle(3);
+ bundle.putString(RDS_BLER_STRING, String.format("%d%%", readRdsBler()));
+ bundle.putString(RDS_RSSI_STRING, String.format("%d", readRssi()));
+ bundle.putString(RDS_STEREMONO_STRING, getStereoMono() ? "Stereo" : "Mono");
+ String capStr = "N/A";
+ if (!mRdAntennaL.isChecked()) {
+ capStr = formatCapArray(readCapArray());
+ }
+ bundle.putString(RDS_CAPARRAY_STRING, capStr);
+ Message msg = mHandler.obtainMessage(MSGID_TICK_EVENT);
+ msg.setData(bundle);
+ mHandler.sendMessage(msg);
+ }
+ // Do not handle other events.
+ // Sleep 500ms to reduce inquiry frequency
+ try {
+ final int hundredMillisecond = 1000;
+ Thread.sleep(hundredMillisecond);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ Log.d(TAG, "get tick information");
+ }
+ Log.d(TAG, "<<< tick envent Thread run()");
+ }
+ };
+ Log.d(TAG, "Start tick event Thread.");
+ mTickEventThread.start();
+ }
+
+ private void stopTickEventThread() {
+ Log.d(TAG, ">>> stopTickEventThread");
+ if (null != mTickEventThread) {
+ mIsTickEventExit = true;
+ mTickEventThread = null;
+ }
+ Log.d(TAG, "<<< stopTickEventThread");
+ }
+}
diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioFavorite.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioFavorite.java
new file mode 100755
index 0000000..2ad6807
--- /dev/null
+++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioFavorite.java
@@ -0,0 +1,533 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2011-2014. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.fmradio;
+
+import android.app.ActionBar;
+import android.app.Activity;
+import android.app.Dialog;
+import android.app.LoaderManager.LoaderCallbacks;
+import android.content.Context;
+import android.content.CursorLoader;
+import android.content.Intent;
+import android.content.Loader;
+import android.database.Cursor;
+import android.media.AudioManager;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.util.Log;
+import android.view.ContextMenu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.widget.AdapterView;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.SimpleCursorAdapter;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.mediatek.fmradio.FmRadioService.OnExitListener;
+import com.mediatek.fmradio.dialogs.AddFavoriteDialog;
+import com.mediatek.fmradio.dialogs.DeleteFavoriteDialog;
+import com.mediatek.fmradio.dialogs.EditFavoriteDialog;
+import com.mediatek.fmradio.ext.IProjectStringExt;
+
+/**
+ * This class interact with user, provider edit channel information, such as add
+ * to favorite, edit favorite, delete from favorite
+ */
+public class FmRadioFavorite extends Activity implements LoaderCallbacks<Cursor>,
+ AddFavoriteDialog.AddFavoriteListener, EditFavoriteDialog.EditFavoriteListener,
+ DeleteFavoriteDialog.DeleteFavoriteListener {
+ // Logging
+ private static final String TAG = "FmRx/Favorite";
+
+ private static final String ADD_FAVORITE = "AddFavorite";
+ private static final String EDIT_FAVORITE = "EditFavorite";
+ private static final String DELETE_FAVORITE = "DeleteFavorite";
+
+ public static final String ACTIVITY_RESULT = "ACTIVITY_RESULT";
+
+ private static final int CONTMENU_ID_EDIT = 1; // content menu id edit
+ private static final int CONTMENU_ID_DELETE = 2; // content menu id delete
+ private static final int CONTMENU_ID_ADD = 3; // content menu id add
+
+ private static final String FAVORITE_NAME = "FAVORITE_NAME";
+ private static final String FAVORITE_FREQ = "FAVORITE_FREQ";
+
+ private ListView mLvFavorites = null; // list view
+ private ChannelListAdapter mAdapter = null; // adapter use to update UI
+ private String mDlgStationName = null; // Record the long clicked station name
+ private int mDlgStationFreq = 0; // Record the long clicked station frequency
+ private Context mContext = null; // application context
+ private OnExitListener mExitListener = null;
+
+ // Plugin
+ private IProjectStringExt mProjectStringExt = null;
+
+ /**
+ * on create
+ *
+ * @param savedInstanceState The save instance state
+ */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ Log.d(TAG, "begin FmRadioFavorite.onCreate");
+ // Bind the activity to FM audio stream.
+ setVolumeControlStream(AudioManager.STREAM_MUSIC);
+ getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
+ setContentView(R.layout.favorite);
+ // display action bar and navigation button
+ ActionBar actionBar = getActionBar();
+ actionBar.setTitle(R.string.favorite_manager);
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ mContext = getApplicationContext();
+ if (savedInstanceState != null) {
+ mDlgStationName = savedInstanceState.getString(FAVORITE_NAME);
+ mDlgStationFreq = savedInstanceState.getInt(FAVORITE_FREQ);
+ }
+
+ mProjectStringExt = ExtensionUtils.getExtension(mContext);
+
+ mAdapter = new ChannelListAdapter(
+ this,
+ R.layout.simpleadapter,
+ null,
+ new String[] {
+ FmRadioStation.Station.COLUMN_STATION_TYPE,
+ FmRadioStation.Station.COLUMN_STATION_FREQ,
+ FmRadioStation.Station.COLUMN_STATION_NAME
+ },
+ new int[] {
+ R.id.lv_station_type, R.id.lv_station_freq, R.id.lv_station_name
+ });
+ mLvFavorites = (ListView) findViewById(R.id.station_list);
+ TextView emptyView = (TextView) findViewById(R.id.empty);
+ mLvFavorites.setEmptyView(emptyView);
+ mLvFavorites.setAdapter(mAdapter); // set adapter
+ getLoaderManager().initLoader(0, null, this); // initial loader
+
+ mLvFavorites.setOnItemClickListener(
+ new AdapterView.OnItemClickListener() {
+ /**
+ * Click list item will finish activity and pass value to
+ * other activity
+ *
+ * @param parent adapter view
+ * @param view item view
+ * @param position current position
+ * @param id current id
+ */
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position,
+ long id) {
+ // Set the selected frequency to main UI and finish the
+ // favorite manager.
+ TextView textView = (TextView) view.findViewById(R.id.lv_station_freq);
+ float frequency = 0;
+ try {
+ frequency = Float.parseFloat(textView.getText().toString());
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ }
+ Intent intentResult = new Intent();
+ intentResult.putExtra(ACTIVITY_RESULT, FmRadioUtils
+ .computeStation(frequency));
+ setResult(RESULT_OK, intentResult);
+ finish();
+ }
+ }
+ );
+
+ mLvFavorites.setOnCreateContextMenuListener(
+ /**
+ * create context menu
+ *
+ * @param menu context menu
+ * @param view context menu view
+ * @param menuInfo context menu information
+ */
+ new View.OnCreateContextMenuListener() {
+ @Override
+ public void onCreateContextMenu(ContextMenu menu, View view,
+ ContextMenu.ContextMenuInfo menuInfo) {
+ menu.setHeaderTitle(R.string.contmenu_title);
+ Cursor cursor = mAdapter.getCursor();
+ int pos = ((AdapterView.AdapterContextMenuInfo) menuInfo).position;
+ cursor.moveToPosition(pos);
+ int stationType = cursor.getInt(
+ cursor.getColumnIndex(FmRadioStation.Station.COLUMN_STATION_TYPE));
+ if (FmRadioStation.STATION_TYPE_SEARCHED == stationType) {
+ // Searched station.
+ menu.add(0, CONTMENU_ID_ADD, 0, mProjectStringExt.getProjectString(mContext,
+ R.string.add_to_favorite, R.string.add_to_favorite1));
+ } else {
+ // Favorite station.
+ menu.add(0, CONTMENU_ID_EDIT, 0, R.string.contmenu_item_edit);
+ menu.add(0, CONTMENU_ID_DELETE, 0, mProjectStringExt.getProjectString(mContext,
+ R.string.contmenu_item_delete, R.string.contmenu_item_delete1));
+ }
+ }
+ }
+ );
+
+ // Finish favorite when exit FM
+ mExitListener = new FmRadioService.OnExitListener() {
+ @Override
+ public void onExit() {
+ Log.d(TAG, "onExit()");
+ Handler mainHandler = new Handler(Looper.getMainLooper());
+ mainHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ FmRadioFavorite.this.finish();
+ }
+ });
+ }
+ };
+ FmRadioService.registerExitListener(mExitListener);
+ Log.d(TAG, "end FmRadioFavorite.onCreate");
+ }
+
+ /**
+ * Handle the event when context menu selected
+ *
+ * @param item selected menu item
+ *
+ * @return whether need to handle other context item
+ */
+ @Override
+ public boolean onContextItemSelected(MenuItem item) {
+ // get list view position
+ int position = ((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).position;
+ // get item view
+ View itemView = mLvFavorites.getAdapter().getView(position, null, mLvFavorites);
+ // get station frequency and station name of item view
+ TextView stationFreqView = (TextView) itemView.findViewById(R.id.lv_station_freq);
+ TextView stationNameView = (TextView) itemView.findViewById(R.id.lv_station_name);
+ mDlgStationFreq = FmRadioUtils.computeStation(
+ Float.parseFloat(stationFreqView.getText().toString()));
+ mDlgStationName = stationNameView.getText().toString();
+
+ switch (item.getItemId()) {
+ case CONTMENU_ID_ADD:
+ // show add favorite dialog
+ showAddFavoriteDialog();
+ break;
+
+ case CONTMENU_ID_EDIT:
+ // show edit favorite dialog
+ showEditFavoriteDialog();
+ break;
+
+ case CONTMENU_ID_DELETE:
+ // show delete favorite dialog
+ showDeleteFavoriteDialog();
+ break;
+
+ default:
+ Log.d(TAG, "invalid menu item");
+ break;
+ }
+ return false;
+ }
+
+ /**
+ * When menu is selected
+ *
+ * @param item The selected menu item
+ *
+ * @return true to consume it, false to can handle other
+ */
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (item.getItemId() == android.R.id.home) {
+ super.onBackPressed();
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ /**
+ * Create cursor loader to initial list view
+ *
+ * @param id The id whose loader will be created
+ * @param args Any arguments specified by caller
+ *
+ * @return cursor The loader according query result
+ */
+ @Override
+ public Loader<Cursor> onCreateLoader(int id, Bundle args) {
+ Uri uri = FmRadioStation.Station.CONTENT_URI;
+ String select = FmRadioStation.Station.COLUMN_STATION_TYPE + " IN (?, ?)";
+ String order = FmRadioStation.Station.COLUMN_STATION_TYPE + "," +
+ FmRadioStation.Station.COLUMN_STATION_FREQ;
+ CursorLoader cursorLoader = new CursorLoader(
+ this,
+ uri,
+ FmRadioStation.COLUMNS,
+ select,
+ new String[] {
+ String.valueOf(FmRadioStation.STATION_TYPE_FAVORITE),
+ String.valueOf(FmRadioStation.STATION_TYPE_SEARCHED)
+ },
+ order);
+ return cursorLoader;
+ }
+
+ /**
+ * Swap adapter cursor when load finished
+ *
+ * @param loader The cursor loader
+ * @param data The new cursor
+ */
+ @Override
+ public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
+ mAdapter.swapCursor(data);
+ }
+
+ /**
+ * Set adapter as null when loader reset
+ *
+ * @param loader The cursor loader
+ */
+ @Override
+ public void onLoaderReset(Loader<Cursor> loader) {
+ mAdapter.swapCursor(null);
+ }
+
+ /**
+ * This class use associate cursor with adapter item view
+ */
+ static class ChannelListAdapter extends SimpleCursorAdapter {
+ public ChannelListAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {
+ super(context, layout, c, from, to);
+ }
+
+ /**
+ * This class use to manage view
+ */
+ static class ViewHolder {
+ ImageView mStationTypeView;
+ TextView mStationFreqView;
+ TextView mStationNameView;
+ }
+
+ /**
+ * Create item view
+ *
+ * @param context The context
+ * @param cursor The cursor
+ * @param parent The list view group
+ */
+ @Override
+ public View newView(Context context, Cursor cursor, ViewGroup parent) {
+ View view = super.newView(context, cursor, parent);
+ ViewHolder viewHolder = new ViewHolder();
+ viewHolder.mStationTypeView = (ImageView) view.findViewById(R.id.lv_station_type);
+ viewHolder.mStationFreqView = (TextView) view.findViewById(R.id.lv_station_freq);
+ viewHolder.mStationNameView = (TextView) view.findViewById(R.id.lv_station_name);
+ view.setTag(viewHolder);
+ return view;
+ }
+
+ /**
+ * Bind cursor data to list view
+ *
+ * @param view The item view
+ * @param context The The context
+ * @param cursor The cursor
+ */
+ @Override
+ public void bindView(View view, Context context, Cursor cursor) {
+ ViewHolder viewHolder = (ViewHolder) view.getTag();
+ int stationType = cursor.getInt(
+ cursor.getColumnIndex(FmRadioStation.Station.COLUMN_STATION_TYPE));
+ int stationFreq = cursor.getInt(
+ cursor.getColumnIndex(FmRadioStation.Station.COLUMN_STATION_FREQ));
+ String stationName = cursor.getString(
+ cursor.getColumnIndex(FmRadioStation.Station.COLUMN_STATION_NAME));
+ if (FmRadioStation.STATION_TYPE_FAVORITE == stationType) {
+ viewHolder.mStationTypeView.setImageResource(R.drawable.btn_fm_favorite_on);
+ } else {
+ viewHolder.mStationTypeView.setImageResource(0);
+ }
+ viewHolder.mStationFreqView.setText(FmRadioUtils.formatStation(stationFreq));
+ viewHolder.mStationNameView.setText(stationName);
+ }
+ }
+
+ private void showAddFavoriteDialog() {
+ AddFavoriteDialog fragment = AddFavoriteDialog.newInstance(mDlgStationName,
+ mDlgStationFreq);
+ fragment.show(getFragmentManager(), ADD_FAVORITE);
+
+ }
+
+ private void showEditFavoriteDialog() {
+ EditFavoriteDialog newFragment = EditFavoriteDialog.newInstance(mDlgStationName,
+ mDlgStationFreq);
+ newFragment.show(getFragmentManager(), EDIT_FAVORITE);
+ }
+
+ private void showDeleteFavoriteDialog() {
+ DeleteFavoriteDialog newFragment = DeleteFavoriteDialog.newInstance();
+ newFragment.show(getFragmentManager(), DELETE_FAVORITE);
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ outState.putString(FAVORITE_NAME, mDlgStationName);
+ outState.putInt(FAVORITE_FREQ, mDlgStationFreq);
+ super.onSaveInstanceState(outState);
+ }
+
+ /**
+ * Add searched station as favorite station
+ */
+ public void addFavorite() {
+ AddFavoriteDialog dialogFragment =
+ ((AddFavoriteDialog) getFragmentManager().findFragmentByTag(ADD_FAVORITE));
+ if (null == dialogFragment) {
+ return;
+ }
+
+ Dialog dialog = dialogFragment.getDialog();
+ if (null == dialog) {
+ return;
+ }
+
+ EditText editText = (EditText) dialog.findViewById(R.id.dlg_add_station_name_text);
+ if (null == editText) {
+ return;
+ }
+
+ String newName = editText.getText().toString().trim();
+ // if user not input String, use previous displayed station name
+ // if not have previous displayed station name, use default station name
+ if (0 != newName.length()) {
+ mDlgStationName = newName;
+ }
+ // update the station name and station type in database
+ // according the frequency
+ FmRadioStation.updateStationToDb(mContext, mDlgStationName,
+ FmRadioStation.STATION_TYPE_FAVORITE, mDlgStationFreq);
+ mAdapter.notifyDataSetChanged();
+ }
+
+ /**
+ * Edit favorite station frequency and station name
+ */
+ public void editFavorite() {
+ EditFavoriteDialog dialogFragment =
+ (EditFavoriteDialog) getFragmentManager().findFragmentByTag(EDIT_FAVORITE);
+ if (null == dialogFragment) {
+ return;
+ }
+ Dialog dialog = dialogFragment.getDialog();
+ if (null == dialog) {
+ return;
+ }
+
+ EditText nameEditText = (EditText) dialog.findViewById(R.id.dlg_edit_station_name_text);
+ EditText frequencyEditText =
+ (EditText) dialog.findViewById(R.id.dlg_edit_station_freq_text);
+ if ((null == nameEditText) || (null == frequencyEditText)) {
+ return;
+ }
+ String newName = nameEditText.getText().toString().trim();
+ String newStationFreqStr = frequencyEditText.getText().toString().trim();
+ // if user not input String, use previous displayed station name
+ // if not have previous displayed station name, use default station name
+ if (0 != newName.length()) {
+ mDlgStationName = newName;
+ }
+
+ float newStationFreq = 0;
+ try {
+ newStationFreq = Float.parseFloat(newStationFreqStr);
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ }
+
+ int newStation = FmRadioUtils.computeStation(newStationFreq);
+ if (FmRadioUtils.isValidStation(newStation)) {
+ // if station is exist in channel list delete it
+ // ignore current station, because current station not display in
+ // listview
+ if (FmRadioStation.isStationExist(mContext, newStation,
+ FmRadioStation.STATION_TYPE_FAVORITE) && (newStation != mDlgStationFreq)) {
+ FmRadioStation.deleteStationInDb(mContext, newStation,
+ FmRadioStation.STATION_TYPE_FAVORITE);
+ } else if (FmRadioStation.isStationExist(mContext, newStation,
+ FmRadioStation.STATION_TYPE_SEARCHED)) {
+ FmRadioStation.deleteStationInDb(mContext, newStation,
+ FmRadioStation.STATION_TYPE_SEARCHED);
+ }
+ FmRadioStation.updateStationToDb(mContext, mDlgStationName, mDlgStationFreq,
+ newStation,
+ FmRadioStation.STATION_TYPE_FAVORITE);
+ mAdapter.notifyDataSetChanged();
+ } else {
+ Toast.makeText(getApplicationContext(), R.string.toast_invalid_frequency,
+ Toast.LENGTH_SHORT).show();
+ }
+ }
+
+ /**
+ * Delete favorite from favorite channel list, make it as searched station
+ */
+ public void deleteFavorite() {
+ // update the station type from favorite to searched.
+ FmRadioStation.updateStationToDb(mContext, mDlgStationName,
+ FmRadioStation.STATION_TYPE_SEARCHED, mDlgStationFreq);
+ mAdapter.notifyDataSetChanged();
+ }
+
+ @Override
+ protected void onDestroy() {
+ Log.d(TAG, "onDestory()");
+ FmRadioService.unregisterExitListener(mExitListener);
+ super.onDestroy();
+ }
+}
diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioListener.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioListener.java
new file mode 100755
index 0000000..1250fc6
--- /dev/null
+++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioListener.java
@@ -0,0 +1,140 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2011-2014. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.fmradio;
+
+import android.os.Bundle;
+
+/**
+ * Activity connect FMRadio service should implements this interface to update
+ * ui or status
+ */
+public interface FmRadioListener {
+ /**
+ * directly call back from service to activity
+ */
+ // FM RDS station changed
+ int LISTEN_RDSSTATION_CHANGED = 0x00100010;
+
+ // FM PS information changed
+ int LISTEN_PS_CHANGED = 0x00100011;
+
+ // FM RT information changed
+ int LISTEN_RT_CHANGED = 0x00100100;
+
+ // FM Record state changed
+ int LISTEN_RECORDSTATE_CHANGED = 0x00100101; // 1048833
+
+ // FM record error occur
+ int LISTEN_RECORDERROR = 0x00100110; // 1048848
+
+ // FM record mode change
+ int LISTEN_RECORDMODE_CHANGED = 0x00100111; // 4018849
+
+ // FM Record state changed
+ int LISTEN_SPEAKER_MODE_CHANGED = 0x00101000; // 1052672
+
+ // Bundle keys
+ String SWITCH_ANNTENNA_VALUE = "switch_anntenna_value";
+ String CALLBACK_FLAG = "callback_flag";
+ String KEY_IS_POWER_UP = "key_is_power_up";
+ String KEY_IS_POWER_DOWN = "key_is_power_down";
+ String KEY_IS_SWITCH_ANNTENNA = "key_is_switch_anntenna";
+ String KEY_IS_TUNE = "key_is_tune";
+ String KEY_TUNE_TO_STATION = "key_tune_to_station";
+ String KEY_IS_SEEK = "key_is_seek";
+ String KEY_SEEK_TO_STATION = "key_seek_to_station";
+ String KEY_IS_SCAN = "key_is_scan";
+ String KEY_RDS_STATION = "key_rds_station";
+ String KEY_PS_INFO = "key_ps_info";
+ String KEY_RT_INFO = "key_rt_info";
+ String KEY_STATION_NUM = "key_station_num";
+
+ // Audio focus related
+ String KEY_AUDIOFOCUS_CHANGED = "key_audiofocus_changed";
+
+ // Recording
+ String KEY_RECORDING_STATE = "key_is_recording_state";
+ String KEY_RECORDING_ERROR_TYPE = "key_recording_error_type";
+ String KEY_IS_RECORDING_MODE = "key_is_recording_mode";
+
+ // For change speaker/earphone mode
+ String KEY_IS_SPEAKER_MODE = "key_is_speaker_mode";
+
+ /**
+ * handle message: call back from service to activity
+ */
+ // Message to handle
+ int MSGID_UPDATE_RDS = 1;
+ int MSGID_UPDATE_CURRENT_STATION = 2;
+ int MSGID_ANTENNA_UNAVAILABE = 3;
+ int MSGID_SWITCH_ANNTENNA = 4;
+ int MSGID_SET_RDS_FINISHED = 5;
+ int MSGID_SET_CHANNEL_FINISHED = 6;
+ int MSGID_SET_MUTE_FINISHED = 7;
+ // Fm main
+ int MSGID_POWERUP_FINISHED = 9;
+ int MSGID_POWERDOWN_FINISHED = 10;
+ int MSGID_FM_EXIT = 11;
+ int MSGID_SCAN_CANCELED = 12;
+ int MSGID_SCAN_FINISHED = 13;
+ int MSGID_AUDIOFOCUS_FAILED = 14;
+ int MSGID_TUNE_FINISHED = 15;
+ int MSGID_SEEK_FINISHED = 16;
+ int MSGID_ACTIVE_AF_FINISHED = 18;
+ // Recording
+ int MSGID_RECORD_STATE_CHANGED = 19;
+ int MSGID_RECORD_ERROR = 20;
+ int MSGID_RECORD_MODE_CHANED = 21;
+ int MSGID_STARTRECORDING_FINISHED = 22;
+ int MSGID_STOPRECORDING_FINISHED = 23;
+ int MSGID_STARTPLAYBACK_FINISHED = 24;
+ int MSGID_STOPPLAYBACK_FINISHED = 25;
+ int MSGID_SAVERECORDING_FINISHED = 26;
+ // Audio focus related
+ int MSGID_AUDIOFOCUS_CHANGED = 30;
+
+ int NOT_AUDIO_FOCUS = 33;
+
+ // For refresh time
+ int MSGID_REFRESH = 101;
+
+ /**
+ * Call back method to activity from service
+ */
+ void onCallBack(Bundle bundle);
+}
diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioNative.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioNative.java
new file mode 100755
index 0000000..8f86268
--- /dev/null
+++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioNative.java
@@ -0,0 +1,253 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2011-2014. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.fmradio;
+
+/**
+ * This class define FM native interface, will description FM native interface
+ */
+public class FmRadioNative {
+ static {
+ System.loadLibrary("fmjni");
+ }
+
+ /**
+ * Open FM device, call before power up
+ *
+ * @return (true,success; false, failed)
+ */
+ static native boolean openDev();
+
+ /**
+ * Close FM device, call after power down
+ *
+ * @return (true, success; false, failed)
+ */
+ static native boolean closeDev();
+
+ /**
+ * power up FM with frequency use long antenna
+ *
+ * @param frequency frequency(50KHZ, 87.55; 100KHZ, 87.5)
+ *
+ * @return (true, success; false, failed)
+ */
+ static native boolean powerUp(float frequency);
+
+ /**
+ * Power down FM
+ *
+ * @param type (0, FMRadio; 1, FMTransimitter)
+ *
+ * @return (true, success; false, failed)
+ */
+ static native boolean powerDown(int type);
+
+ /**
+ * tune to frequency
+ *
+ * @param frequency frequency(50KHZ, 87.55; 100KHZ, 87.5)
+ *
+ * @return (true, success; false, failed)
+ */
+ static native boolean tune(float frequency);
+
+ /**
+ * seek with frequency in direction
+ *
+ * @param frequency frequency(50KHZ, 87.55; 100KHZ, 87.5)
+ * @param isUp (true, next channel; false previous channel)
+ *
+ * @return frequency(float)
+ */
+ static native float seek(float frequency, boolean isUp);
+
+ /**
+ * Auto scan(from 87.50-108.00)
+ *
+ * @return The scan channel array(short)
+ */
+ static native short[] autoScan();
+
+ /**
+ * Stop scan, also can stop seek, other native when scan should call stop
+ * scan first, else will execute wait auto scan finish
+ *
+ * @return (true, can stop scan process; false, can't stop scan process)
+ */
+ static native boolean stopScan();
+
+ /**
+ * Open or close rds fuction
+ *
+ * @param rdson The rdson (true, open; false, close)
+ *
+ * @return rdsset
+ */
+ static native int setRds(boolean rdson);
+
+ /**
+ * Read rds events
+ *
+ * @return rds event type
+ */
+ static native short readRds();
+
+ /**
+ * Get program service(program name)
+ *
+ * @return The program name
+ */
+ static native byte[] getPs();
+
+ /**
+ * Get radio text, RDS standard not support Chinese character
+ *
+ * @return The radio text(byte)
+ */
+ static native byte[] getLrText();
+
+ /**
+ *Active alternative frequencies
+ *
+ * @return The frequency(float)
+ */
+ static native short activeAf();
+
+ /**
+ * Mute or unmute FM voice
+ *
+ * @param mute (true, mute; false, unmute)
+ *
+ * @return (true, success; false, failed)
+ */
+ static native int setMute(boolean mute);
+
+ /**
+ * Inquiry if RDS is support in driver
+ *
+ * @return (1, support; 0, NOT support; -1, error)
+ */
+ static native int isRdsSupport();
+
+ /**
+ * Switch antenna
+ *
+ * @param antenna antenna (0, long antenna, 1 short antenna)
+ *
+ * @return (0, success; 1 failed; 2 not support)
+ */
+ static native int switchAntenna(int antenna);
+
+ /**
+ * Set Fm status to tell native RX or TX is on
+ * @param which 0 is RX, 1 is TX
+ * @param on true is on
+ * @return
+ */
+ static native boolean setFmStatus(int which, boolean on);
+
+ /**
+ * Get the native Fm status
+ * @param which 0 is RX ON, 1 is TX ON, 2 is TX Scaning
+ * @return true if dothing
+ */
+ static native boolean getFmStatus(int which);
+
+ // FM EM start
+ /**
+ * get rssi from hardware(use for engineer mode)
+ *
+ * @return rssi value
+ */
+ static native int readRssi();
+
+ /**
+ * Inquiry if fm stereo mono(true, stereo; false mono)
+ *
+ * @return (true, stereo; false, mono)
+ */
+ static native boolean stereoMono();
+
+ /**
+ * Force set to stero/mono mode
+ *
+ * @param isMono
+ * (true, mono; false, stereo)
+ * @return (true, success; false, failed)
+ */
+ static native boolean setStereoMono(boolean isMono);
+
+ /**
+ * Read cap array of short antenna
+ *
+ * @return cap array value
+ */
+ static native short readCapArray();
+
+ /**
+ * read rds bler
+ *
+ * @return rds bler value
+ */
+ static native short readRdsBler();
+
+ /**
+ * send variables to native, and get some variables return.
+ * @param val send to native
+ * @return get value from native
+ */
+ static native short[] emcmd(short[] val);
+
+ /**
+ * set RSSI, desense RSSI, mute gain soft
+ * @param index flag which will execute
+ * (0:rssi threshold,1:desense rssi threshold,2: SGM threshold)
+ * @param value send to native
+ * @return execute ok or not
+ */
+ static native boolean emsetth(int index, int value);
+
+ /**
+ * get hardware version
+ *
+ * @return hardware version information array(0, ChipId; 1, EcoVersion; 2, PatchVersion; 3,
+ * DSPVersion)
+ */
+ static native int[] getHardwareVersion();
+ // FM EM end
+}
diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioService.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioService.java
new file mode 100755
index 0000000..08fb221
--- /dev/null
+++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioService.java
@@ -0,0 +1,2802 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2011-2014. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.fmradio;
+
+import android.app.ActivityManager;
+import android.app.ActivityManager.RunningAppProcessInfo;
+import android.app.Notification;
+import android.app.PendingIntent;
+import android.app.Service;
+import android.bluetooth.BluetoothA2dp;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothProfile;
+import android.content.BroadcastReceiver;
+import android.content.ContentProviderOperation;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.OperationApplicationException;
+import android.content.res.Configuration;
+import android.media.AudioManager;
+import android.media.AudioManager.OnAudioFocusChangeListener;
+import android.media.AudioSystem;
+import android.media.MediaPlayer;
+import android.net.Uri;
+import android.os.Binder;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.os.PowerManager;
+import android.os.PowerManager.WakeLock;
+import android.os.RemoteException;
+import android.util.Log;
+
+import com.mediatek.fmradio.FmRadioStation.Station;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+/* Vanzo:tanglei on: Sat, 14 Mar 2015 11:51:16 +0800
+ */
+//import com.android.featureoption.FeatureOption;
+// End of Vanzo:tanglei
+
+/**
+ * Background service to control FM or do background tasks.
+ */
+public class FmRadioService extends Service implements FmRecorder.OnRecorderStateChangedListener {
+ // Logging
+ private static final String TAG = "FmRx/Service";
+
+ // Broadcast messages from clients to FM service.
+ public static final String ACTION_TOFMSERVICE_POWERDOWN
+ = "com.mediatek.FMRadio.FMRadioService.ACTION_TOFMSERVICE_POWERDOWN";
+ // Broadcast messages to FM Tx service.
+ public static final String ACTION_TOFMTXSERVICE_POWERDOWN
+ = "com.mediatek.FMTransmitter.FMTransmitterService.ACTION_TOFMTXSERVICE_POWERDOWN";
+ // Broadcast messages to mATV service.
+ public static final String ACTION_TOATVSERVICE_POWERDOWN
+ = "com.mediatek.app.mtv.ACTION_REQUEST_SHUTDOWN";
+ // Broadcast messages to music service.
+ public static final String ACTION_TOMUSICSERVICE_POWERDOWN
+ = "com.android.music.musicservicecommand.pause";
+ // Broadcast messages from mATV service.
+ public static final String ACTION_FROMATVSERVICE_POWERUP = "com.mediatek.app.mtv.POWER_ON";
+
+ // Broadcast messages from other sounder APP to FM service
+ private static final String SOUND_POWER_DOWN_MSG = "com.android.music.musicservicecommand";
+ private static final String CMDPAUSE = "pause";
+
+ // HandlerThread Keys
+ private static final String FM_FREQUENCY = "frequency";
+ private static final String OPTION = "option";
+ private static final String RECODING_FILE_NAME = "name";
+
+ // RDS events
+ // PS
+ private static final int RDS_EVENT_PROGRAMNAME = 0x0008;
+ // RT
+ private static final int RDS_EVENT_LAST_RADIOTEXT = 0x0040;
+ // AF
+ private static final int RDS_EVENT_AF = 0x0080;
+
+ // Headset
+ private static final int HEADSET_PLUG_IN = 1;
+ // Short antenna support
+ private static final boolean SHORT_ANNTENNA_SUPPORT = FmRadioUtils.isFmShortAntennaSupport();
+
+ // Notification id
+ private static final int NOTIFICATION_ID = 1;
+
+ // Set audio policy for FM
+ // should check AUDIO_POLICY_FORCE_FOR_MEDIA in audio_policy.h
+ private static final int FOR_PROPRIETARY = 1;
+ // Forced Use value
+ private int mForcedUseForMedia;
+
+ // TX and RX interaction
+ private static final int CURRENT_RX_ON = 0;
+ private static final int CURRENT_TX_ON = 1;
+ private static final int CURRENT_TX_SCAN = 2;
+
+ // FM recorder
+ FmRecorder mFmRecorder = null;
+ private BroadcastReceiver mSdcardListener = null;
+ private int mRecordState = FmRecorder.STATE_INVALID;
+ private int mRecorderErrorType = -1;
+ // If eject record sdcard, should set Value false to not record.
+ // Key is sdcard path(like "/storage/sdcard0"), V is to enable record or
+ // not.
+ private HashMap<String, Boolean> mSdcardStateMap = new HashMap<String, Boolean>();
+ // The show name in save dialog but saved in service
+ // If modify the save title it will be not null, otherwise it will be null
+ private String mModifiedRecordingName = null;
+ // record the listener list, will notify all listener in list
+ private ArrayList<Record> mRecords = new ArrayList<Record>();
+ // record FM whether in recording mode
+ private boolean mIsInRecordingMode = false;
+ // record sd card path when start recording
+ private static String sRecordingSdcard = FmRadioUtils.getDefaultStoragePath();
+
+ // RDS
+ // PS String
+ private String mPSString = "";
+ // RT String
+ private String mLRTextString = "";
+ // PS RT
+ private boolean mIsPSRTEnabled = false;
+ // AF
+ private boolean mIsAFEnabled = false;
+ // RDS thread use to receive the information send by station
+ private Thread mRdsThread = null;
+ // record whether RDS thread exit
+ private boolean mIsRdsThreadExit = false;
+
+ // State variables
+ // Record whether FM is in native scan state
+ private boolean mIsNativeScanning = false;
+ // Record whether FM is in scan thread
+ private boolean mIsScanning = false;
+ // Record whether FM is in seeking state
+ private boolean mIsNativeSeeking = false;
+ // Record whether FM is in native seek
+ private boolean mIsSeeking = false;
+ // Record whether searching progress is canceled
+ private boolean mIsStopScanCalled = false;
+ // Record whether is speaker used
+ private boolean mIsSpeakerUsed = false;
+ // Record whether device is open
+ private boolean mIsDeviceOpen = false;
+ // Record whether FM is power up
+ private boolean mIsPowerUp = false;
+ // Record whether is power uping, if so, should judge in activity back key.
+ private boolean mIsPowerUping = false;
+ // Record whether service is init
+ private boolean mIsServiceInited = false;
+ // Fm power down by loss audio focus,should make power down menu item can
+ // click
+ private boolean mIsMakePowerDown = false;
+
+ // Instance variables
+ private Context mContext = null;
+ private AudioManager mAudioManager = null;
+ private ActivityManager mActivityManager = null;
+ private MediaPlayer mFmPlayer = null;
+ private WakeLock mWakeLock = null;
+ // Audio focus is held or not
+ private boolean mIsAudioFocusHeld = false;
+ // Focus transient lost
+ private boolean mPausedByTransientLossOfFocus = false;
+ private int mCurrentStation = FmRadioUtils.DEFAULT_STATION;
+ // Headset plug state (0:long antenna plug in, 1:long antenna plug out)
+ private int mValueHeadSetPlug = 1;
+ // For bind service
+ private final IBinder mBinder = new ServiceBinder();
+ // Broadcast to receive the external event
+ private FmServiceBroadcastReceiver mBroadcastReceiver = null;
+ // Async handler
+ private FmRadioServiceHandler mFmServiceHandler;
+ // Lock for lose audio focus and receive SOUND_POWER_DOWN_MSG
+ // at the same time
+ // while recording call stop recording not finished(status is still
+ // RECORDING), but
+ // SOUND_POWER_DOWN_MSG will exitFm(), if it is RECORDING will discard the
+ // record.
+ // 1. lose audio focus -> stop recording(lock) -> set to IDLE and show save
+ // dialog
+ // 2. exitFm() -> check the record status, discard it if it is recording
+ // status(lock)
+ // Add this lock the exitFm() while stopRecording()
+ private Object mStopRecordingLock = new Object();
+ // The listener for exit, should finish favorite when exit FM
+ private static OnExitListener sExitListener = null;
+ // Record FmRadioActivity state
+ private static boolean sActivityIsOnStop = false;
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ Log.d(TAG, "FmRadioService.onBind: " + intent);
+ return mBinder;
+ }
+
+ /**
+ * class use to return service instance
+ */
+ public class ServiceBinder extends Binder {
+ /**
+ * get FM service instance
+ *
+ * @return service instance
+ */
+ FmRadioService getService() {
+ return FmRadioService.this;
+ }
+ }
+
+ /**
+ * Broadcast monitor external event, Other app want FM stop, Phone shut
+ * down, screen state, headset state
+ */
+ private class FmServiceBroadcastReceiver extends BroadcastReceiver {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Log.d(TAG, ">>> FmRadioService.onReceive");
+ String action = intent.getAction();
+ String command = intent.getStringExtra("command");
+ Log.d(TAG, "Action/Command: " + action + " / " + command);
+ // other app want FM stop, stop FM
+ if (ACTION_TOFMSERVICE_POWERDOWN.equals(action)
+ || ACTION_FROMATVSERVICE_POWERUP.equals(action)
+ || (SOUND_POWER_DOWN_MSG.equals(action) && CMDPAUSE.equals(command))) {
+ // need remove all messages, make power down will be execute
+ mFmServiceHandler.removeCallbacksAndMessages(null);
+
+ Log.d(TAG, "onReceive.SOUND_POWER_DOWN_MSG. exit FM");
+ exitFm();
+ stopSelf();
+ // phone shut down, so exit FM
+ } else if (Intent.ACTION_SHUTDOWN.equals(action)) {
+ /**
+ * here exitFm, system will send broadcast, system will shut
+ * down, so fm does not need call back to activity
+ */
+ mFmServiceHandler.removeCallbacksAndMessages(null);
+ exitFm();
+ // screen on, if FM play, open rds
+ } else if (Intent.ACTION_SCREEN_ON.equals(action)) {
+
+ setRdsAsync(true);
+ // screen off, if FM play, close rds
+ } else if (Intent.ACTION_SCREEN_OFF.equals(action)) {
+ setRdsAsync(false);
+ // switch antenna when headset plug in or plug out
+ } else if (Intent.ACTION_HEADSET_PLUG.equals(action)) {
+ // switch antenna should not impact audio focus status
+ mValueHeadSetPlug = (intent.getIntExtra("state", -1) == HEADSET_PLUG_IN) ? 0 : 1;
+ switchAntennaAsync(mValueHeadSetPlug);
+
+ if (SHORT_ANNTENNA_SUPPORT) {
+ boolean isSwitch = (switchAntenna(mValueHeadSetPlug) == 0) ? true : false;
+ Log.d(TAG, "onReceive.switch anntenna:isWitch:" + isSwitch);
+
+ // Plug out->Speaker Mode; Plug in->Earphone Mode
+ boolean plugInEarphone = (0 == mValueHeadSetPlug);
+ // Need check to switch to earphone mode for audio will
+ // change to AudioSystem.FORCE_NONE
+ if (plugInEarphone) {
+ mForcedUseForMedia = AudioSystem.FORCE_NONE;
+ mIsSpeakerUsed = false;
+ }
+ //setSpeakerPhoneOn(!plugInEarphone);
+ // Notify UI change to earphone mode, false means not speaker mode
+ Bundle bundle = new Bundle(2);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG,
+ FmRadioListener.LISTEN_SPEAKER_MODE_CHANGED);
+ bundle.putBoolean(FmRadioListener.KEY_IS_SPEAKER_MODE, !plugInEarphone);
+ notifyActivityStateChanged(bundle);
+
+ powerUpAutoIfNeed();
+ } else {
+ // Avoid Service is killed,and receive headset plug in
+ // broadcast again
+ if (!mIsServiceInited) {
+ Log.d(TAG, "onReceive.switch anntenna:service is not init");
+ powerUpAutoIfNeed();
+ return;
+ }
+ /*
+ * If ear phone insert and activity is
+ * foreground. power up FM automatic
+ */
+ if ((0 == mValueHeadSetPlug) && isActivityForeground()) {
+ Log.d(TAG, "onReceive.switch anntenna:need auto power up");
+ powerUpAsync(FmRadioUtils.computeFrequency(mCurrentStation));
+ } else if (1 == mValueHeadSetPlug) {
+ Log.d(TAG, "plug out earphone, need to stop fm");
+ // ALPS01687760 Avoid sound from speaker after plug out earphone when recording
+ // plug out earphone will power down or exit, need to mute first anyway
+ setMute(true);
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SCAN_FINISHED);
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SEEK_FINISHED);
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_TUNE_FINISHED);
+ mFmServiceHandler.removeMessages(
+ FmRadioListener.MSGID_POWERDOWN_FINISHED);
+ mFmServiceHandler.removeMessages(
+ FmRadioListener.MSGID_POWERUP_FINISHED);
+ stopFmFocusLoss(AudioManager.AUDIOFOCUS_LOSS);
+
+ // Need check to switch to earphone mode for audio will
+ // change to AudioSystem.FORCE_NONE
+ setSpeakerPhoneOn(false);
+
+ // Notify UI change to earphone mode, false means not speaker mode
+ Bundle bundle = new Bundle(2);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG,
+ FmRadioListener.LISTEN_SPEAKER_MODE_CHANGED);
+ bundle.putBoolean(FmRadioListener.KEY_IS_SPEAKER_MODE, false);
+ notifyActivityStateChanged(bundle);
+ }
+ }
+
+ } else if (BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED.equals(action)) {
+ int connectState = intent.getIntExtra(BluetoothA2dp.EXTRA_STATE, 0);
+ Log.d(TAG, "ACTION_CONNECTION_STATE_CHANGED: connectState=" + connectState + ", ispowerup="
+ + mIsPowerUp);
+ handleBtConnectState(connectState);
+/* Vanzo:tanglei on: Fri, 13 Mar 2015 21:26:14 +0800
+ * earphone key action
+ */
+ } //else if (FeatureOption.VANZO_FEATURE_EARPHONE_KEY_ACTION && "com.mediatek.FMRadio.FMRadioService.NEXT_STATION".equals(action)) {
+ //seekStationAsync(FmRadioUtils.computeFrequency(mCurrentStation), true);
+// End of Vanzo:tanglei
+ //}
+ else {
+ Log.w(TAG, "Error: undefined action.");
+ }
+ Log.d(TAG, "<<< FmRadioService.onReceive");
+ }
+ }
+
+ /**
+ * ALPS01756692 No sound after click FM app and power key
+ * Need to power up auto for two cases:
+ * case 1: Launcher click FM app, then quickly click Power key to lock phone.
+ * case 2: Launcher click FM app, then quickly click Home key.
+ * Because power up action is in FmRadioActivity.onServiceConnected(), these two cases
+ * will not callback onServiceConnected() cause FmRadioActivity.onStop() has called unbind()
+ */
+ private void powerUpAutoIfNeed() {
+ if ((0 == mValueHeadSetPlug)) {
+ if (!mIsPowerUping && !mIsPowerUp && sActivityIsOnStop) {
+ Log.w(TAG, "Power up for start app then quick click power/home");
+ int iCurrentStation = FmRadioStation.getCurrentStation(mContext);
+ powerUpAsync(FmRadioUtils.computeFrequency(iCurrentStation));
+ }
+ }
+ }
+
+ /**
+ * handle FM over BT connect state
+ *
+ * @param connectState
+ * FM over BT connect state
+ */
+ private void handleBtConnectState(int connectState) {
+ if (!mIsPowerUp) {
+ return;
+ }
+
+ switch (connectState) {
+ case BluetoothA2dp.STATE_CONNECTED:
+ //case BluetoothA2dp.STATE_PLAYING:
+ //case BluetoothA2dp.STATE_CONNECTING:
+ Log.d(TAG, "handleBtConnectState bt connected");
+ changeToEarphoneMode();
+ break;
+ case BluetoothA2dp.STATE_DISCONNECTED:
+ //case BluetoothA2dp.STATE_DISCONNECTING:
+ Log.d(TAG, "handleBtConnectState bt disconnected");
+ changeToEarphoneMode();
+ break;
+ default:
+ Log.d(TAG, "invalid fm over bt connect state");
+ break;
+ }
+
+
+ }
+
+ private void changeToEarphoneMode() {
+ setSpeakerPhoneOn(false);
+ // Notify UI change to earphone mode, false means not speaker mode
+ Bundle bundle = new Bundle(2);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG,
+ FmRadioListener.LISTEN_SPEAKER_MODE_CHANGED);
+ // Always set to earphone mode when bt is connected or disconnected
+ bundle.putBoolean(FmRadioListener.KEY_IS_SPEAKER_MODE, false);
+ notifyActivityStateChanged(bundle);
+ }
+
+ /**
+ * Check if BT is connected
+ * @return true if current is playing with BT earphone
+ */
+ public boolean isBtConnected() {
+ BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();
+ Log.d(TAG, "isBtConnected headset:"
+ + btAdapter.getProfileConnectionState(BluetoothProfile.HEADSET)
+ + ", a2dp:" + btAdapter.getProfileConnectionState(BluetoothProfile.A2DP));
+ int a2dpState = btAdapter.getProfileConnectionState(BluetoothProfile.HEADSET);
+ return (BluetoothProfile.STATE_CONNECTED == a2dpState
+ || BluetoothProfile.STATE_CONNECTING == a2dpState);
+ }
+
+ /**
+ * Handle sdcard mount/unmount event. 1. Update the sdcard state map 2. If
+ * the recording sdcard is unmounted, need to stop and notify
+ */
+ private class SdcardListener extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ // If eject record sdcard, should set this false to not
+ // record.
+ updateSdcardStateMap(intent);
+
+ if (mFmRecorder == null) {
+ Log.w(TAG, "SD receiver: FMRecorder is not present!!");
+ return;
+ }
+
+ String action = intent.getAction();
+ if (Intent.ACTION_MEDIA_EJECT.equals(action) ||
+ Intent.ACTION_MEDIA_UNMOUNTED.equals(action)) {
+ // If not unmount recording sd card, do nothing;
+ if (isRecordingCardUnmount(intent)) {
+ Log.v(TAG, "MEDIA_EJECT");
+ if (mFmRecorder.getState() == FmRecorder.STATE_RECORDING) {
+ Log.d(TAG, "old state is recording");
+ onRecorderError(FmRecorder.ERROR_SDCARD_NOT_PRESENT);
+ mFmRecorder.discardRecording();
+ } else {
+ Bundle bundle = new Bundle(2);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG,
+ FmRadioListener.LISTEN_RECORDSTATE_CHANGED);
+ bundle.putInt(FmRadioListener.KEY_RECORDING_STATE,
+ FmRecorder.STATE_IDLE);
+ notifyActivityStateChanged(bundle);
+ }
+ }
+ return;
+ }
+ }
+ }
+
+ /**
+ * whether antenna available
+ *
+ * @return true, antenna available; false, antenna not available
+ */
+ public boolean isAntennaAvailable() {
+ return mAudioManager.isWiredHeadsetOn();
+ }
+
+ /**
+ * Set FM audio from speaker or not
+ *
+ * @param isSpeaker true if set FM audio from speaker
+ */
+ public void setSpeakerPhoneOn(boolean isSpeaker) {
+ Log.d(TAG, ">>> FmRadioService.useSpeaker: " + isSpeaker);
+ mForcedUseForMedia = isSpeaker ? AudioSystem.FORCE_SPEAKER : AudioSystem.FORCE_NONE;
+ AudioSystem.setForceUse(FOR_PROPRIETARY, mForcedUseForMedia);
+ mIsSpeakerUsed = isSpeaker;
+ Log.d(TAG, "<<< FmRadioService.useSpeaker");
+ }
+
+ private boolean isSpeakerPhoneOn() {
+ return (mForcedUseForMedia == AudioSystem.FORCE_SPEAKER);
+ }
+
+ /**
+ * open FM device, should be call before power up
+ *
+ * @return true if FM device open, false FM device not open
+ */
+ private boolean openDevice() {
+ Log.d(TAG, ">>> FmRadioService.openDevice");
+ if (!mIsDeviceOpen) {
+ mIsDeviceOpen = FmRadioNative.openDev();
+ }
+ Log.d(TAG, "<<< FmRadioService.openDevice: " + mIsDeviceOpen);
+ return mIsDeviceOpen;
+ }
+
+ /**
+ * close FM device
+ *
+ * @return true if close FM device success, false close FM device failed
+ */
+ private boolean closeDevice() {
+ Log.d(TAG, ">>> FmRadioService.closeDevice");
+ boolean isDeviceClose = false;
+ if (mIsDeviceOpen) {
+ isDeviceClose = FmRadioNative.closeDev();
+ mIsDeviceOpen = !isDeviceClose;
+ }
+ Log.d(TAG, "<<< FmRadioService.closeDevice: " + isDeviceClose);
+
+ // quit looper
+ mFmServiceHandler.getLooper().quit();
+ return isDeviceClose;
+ }
+
+ /**
+ * get FM device opened or not
+ *
+ * @return true FM device opened, false FM device closed
+ */
+ public boolean isDeviceOpen() {
+ Log.d(TAG, "FmRadioService.isDeviceOpen: " + mIsDeviceOpen);
+ return mIsDeviceOpen;
+ }
+
+ /**
+ * power up FM, and make FM voice output from earphone
+ *
+ * @param frequency
+ */
+ public void powerUpAsync(float frequency) {
+ mIsPowerUping = true;
+ final int bundleSize = 1;
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_POWERUP_FINISHED);
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_POWERDOWN_FINISHED);
+ Bundle bundle = new Bundle(bundleSize);
+ bundle.putFloat(FM_FREQUENCY, frequency);
+ Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_POWERUP_FINISHED);
+ msg.setData(bundle);
+ mFmServiceHandler.sendMessage(msg);
+ }
+
+ private boolean powerUpFm(float frequency) {
+ Log.d(TAG, ">>> FmRadioService.powerUp: " + frequency);
+ if (mIsPowerUp) {
+ Log.d(TAG, "<<< FmRadioService.powerUp: already power up:" + mIsPowerUp);
+ return true;
+ }
+
+ if (!requestAudioFocus()) {
+ // activity used for update powerdown menu
+ mIsMakePowerDown = true;
+ Log.d(TAG, "FM can't get audio focus when power up");
+ sendBroadcastToStopOtherAPP();
+ return false;
+ }
+
+ // if device open fail when chip reset, it need open device again before
+ // power up
+ if (!mIsDeviceOpen) {
+ openDevice();
+ }
+
+ waitIfTxSearching();
+ Log.d(TAG, "set CURRENT_RX_ON true, CURRENT_TX_ON false");
+ FmRadioNative.setFmStatus(CURRENT_RX_ON, true);
+ FmRadioNative.setFmStatus(CURRENT_TX_ON, false);
+ sendBroadcastToStopOtherAPP();
+
+ Log.d(TAG, "service native power up start");
+ if (!FmRadioNative.powerUp(frequency)) {
+ Log.e(TAG, "Error: powerup failed.");
+ return false;
+ }
+ Log.d(TAG, "service native power up end");
+ mIsPowerUp = true;
+ // need mute after power up
+ setMute(true);
+
+ // activity used for update powerdown menu
+ mIsMakePowerDown = false;
+ Log.d(TAG, "<<< FmRadioService.powerUp: " + mIsPowerUp);
+ return mIsPowerUp;
+ }
+
+ // wait if TX is searching for timing issue
+ private void waitIfTxSearching() {
+ Log.d(TAG, ">>> waitIfTxSearching " + FmRadioNative.getFmStatus(CURRENT_TX_SCAN));
+ long start = System.currentTimeMillis();
+ // true for TX is searching
+ while (FmRadioNative.getFmStatus(CURRENT_TX_SCAN) == true) {
+ if (System.currentTimeMillis() - start > 5000) {
+ Log.e(TAG, "waitIfTxSearching timeout");
+ break;
+ }
+ try {
+ Thread.sleep(100);
+ } catch (Exception e) {
+ }
+ }
+ Log.d(TAG, "<<< waitIfTxSearching");
+ }
+
+ private boolean startPlayFm(float frequency) {
+ Log.d(TAG, ">>> FmRadioService.initDevice: " + frequency);
+
+ mCurrentStation = FmRadioUtils.computeStation(frequency);
+ FmRadioStation.setCurrentStation(mContext, mCurrentStation);
+ // Add notification to the title bar.
+ showNotification();
+
+ // Start the RDS thread if RDS is supported.
+ if (isRdsSupported()) {
+ Log.d(TAG, "RDS is supported. Start the RDS thread.");
+ startRdsThread();
+ }
+
+ if (!FmRadioUtils.isFmSuspendSupport()) {
+ if (!mWakeLock.isHeld()) {
+ mWakeLock.acquire();
+ Log.d(TAG, "acquire wake lock");
+ }
+ }
+ if (mIsSpeakerUsed != isSpeakerPhoneOn()) {
+ setSpeakerPhoneOn(mIsSpeakerUsed);
+ }
+ if (mRecordState != FmRecorder.STATE_PLAYBACK) {
+ enableFmAudio(true);
+ }
+
+ setRds(true);
+ setMute(false);
+
+ Log.d(TAG, "<<< FmRadioService.initDevice: " + mIsPowerUp);
+ return mIsPowerUp;
+ }
+
+ /**
+ * send broadcast to stop other application, such as music, MATV,
+ * FMTransmitter
+ */
+ private void sendBroadcastToStopOtherAPP() {
+ Intent intentToMusic = new Intent(ACTION_TOMUSICSERVICE_POWERDOWN);
+ sendBroadcast(intentToMusic);
+ Intent intentToAtv = new Intent(ACTION_TOATVSERVICE_POWERDOWN);
+ sendBroadcast(intentToAtv);
+ Intent intentToFMTx = new Intent(ACTION_TOFMTXSERVICE_POWERDOWN);
+ sendBroadcast(intentToFMTx);
+ }
+
+ /**
+ * power down FM
+ */
+ public void powerDownAsync() {
+ // if power down Fm, should remove message first.
+ // not remove all messages, because such as recorder message need
+ // to execute after or before power down
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SCAN_FINISHED);
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SEEK_FINISHED);
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_TUNE_FINISHED);
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_POWERDOWN_FINISHED);
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_POWERUP_FINISHED);
+ mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_POWERDOWN_FINISHED);
+ }
+
+ /**
+ * Power down FM
+ *
+ * @return true if power down success
+ */
+ private boolean powerDown() {
+ Log.d(TAG, ">>> FmRadioService.powerDown");
+ if (!mIsPowerUp) {
+ Log.w(TAG, "Error: device is already power down.");
+ return true;
+ }
+
+ setMute(true);
+ setRds(false);
+ enableFmAudio(false);
+
+ // Only need to power down if RX status in native is ON
+ // If TX is on, so need power down(TX is using).
+ boolean isRxOn = FmRadioNative.getFmStatus(CURRENT_RX_ON);
+ boolean powerDownSuccess = false;
+ if (isRxOn) {
+ powerDownSuccess = FmRadioNative.powerDown(0);
+ } else {
+ powerDownSuccess = true;
+ }
+
+ if (!powerDownSuccess) {
+ Log.e(TAG, "Error: powerdown failed.");
+ // activity used for update powerdown menu
+ mIsMakePowerDown = true;
+
+ if (isRdsSupported()) {
+ Log.d(TAG, "RDS is supported. Stop the RDS thread.");
+ stopRdsThread();
+ }
+ mIsPowerUp = false;
+ if (mWakeLock.isHeld()) {
+ mWakeLock.release();
+ Log.d(TAG, "release wake lock");
+ }
+ // Remove the notification in the title bar.
+ removeNotification();
+ Log.d(TAG, "powerdown failed.release some resource.");
+ return false;
+ }
+ // activity used for update powerdown menu
+ mIsMakePowerDown = true;
+
+ if (isRdsSupported()) {
+ Log.d(TAG, "RDS is supported. Stop the RDS thread.");
+ stopRdsThread();
+ }
+ mIsPowerUp = false;
+
+ if (mWakeLock.isHeld()) {
+ mWakeLock.release();
+ Log.d(TAG, "release wake lock");
+ }
+
+ // Remove the notification in the title bar.
+ removeNotification();
+ Log.d(TAG, "<<< FmRadioService.powerDown: true");
+ return true;
+ }
+
+ /**
+ * Check whether FM is power up
+ *
+ * @return true, power up; false, power down.
+ */
+ public boolean isPowerUp() {
+ Log.d(TAG, "FmRadioService.isPowerUp: " + mIsPowerUp);
+ return mIsPowerUp;
+ }
+
+ /**
+ * Check whether FM is power uping. if power uping, activity should call
+ * super.onBackPressed, avoid not execute power down method.
+ *
+ * @return true, power up; false, power down.
+ */
+ public boolean isPowerUping() {
+ Log.d(TAG, "FmRadioService.isPowerUping: " + mIsPowerUping);
+ return mIsPowerUping;
+ }
+
+ /**
+ * Check whether FM is power down by other app.
+ *
+ * @return true, power down; true.
+ */
+ public boolean isMakePowerDown() {
+ Log.d(TAG, "FmRadioService.mIsMakePowerDown: " + mIsMakePowerDown);
+ return mIsMakePowerDown;
+ }
+
+ /**
+ * Tune to a station
+ *
+ * @param frequency The frequency to tune
+ *
+ * @return true, success; false, fail.
+ */
+ public void tuneStationAsync(float frequency) {
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_TUNE_FINISHED);
+ final int bundleSize = 1;
+ Bundle bundle = new Bundle(bundleSize);
+ bundle.putFloat(FM_FREQUENCY, frequency);
+ Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_TUNE_FINISHED);
+ msg.setData(bundle);
+ mFmServiceHandler.sendMessage(msg);
+ }
+
+ private boolean tuneStation(float frequency) {
+ Log.d(TAG, ">>> FmRadioService.tune: " + frequency);
+ if (mIsPowerUp) {
+ setRds(false);
+ Log.d(TAG, "FmRadioService.native tune start");
+ boolean bRet = FmRadioNative.tune(frequency);
+ Log.d(TAG, "FmRadioService.native tune end");
+ if (bRet) {
+ setRds(true);
+ mCurrentStation = FmRadioUtils.computeStation(frequency);
+ FmRadioStation.setCurrentStation(mContext, mCurrentStation);
+ updateNotification();
+ }
+ setMute(false);
+ Log.d(TAG, "<<< FmRadioService.tune: " + bRet);
+ return bRet;
+ }
+
+ // if not support short Antenna and earphone is not insert, not power up
+ if (!isAntennaAvailable() && !SHORT_ANNTENNA_SUPPORT) {
+ Log.d(TAG, "earphone is not insert and short antenna not support");
+ return false;
+ }
+
+ // if not power up yet, should powerup first
+ Log.w(TAG, "FM is not powered up");
+ mIsPowerUping = true;
+ boolean tune = false;
+
+ if (powerUpFm(frequency)) {
+ tune = startPlayFm(frequency);
+ }
+ mIsPowerUping = false;
+ Log.d(TAG, "<<< FmRadioService.tune: mIsPowerup:" + tune);
+ return tune;
+ }
+
+ /**
+ * Seek station according frequency and direction
+ *
+ * @param frequency start frequency(100KHZ, 87.5)
+ * @param isUp direction(true, next station; false, previous station)
+ *
+ * @return the frequency after seek
+ */
+ public void seekStationAsync(float frequency, boolean isUp) {
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SEEK_FINISHED);
+ final int bundleSize = 2;
+ Bundle bundle = new Bundle(bundleSize);
+ bundle.putFloat(FM_FREQUENCY, frequency);
+ bundle.putBoolean(OPTION, isUp);
+ Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_SEEK_FINISHED);
+ msg.setData(bundle);
+ mFmServiceHandler.sendMessage(msg);
+ }
+
+ private float seekStation(float frequency, boolean isUp) {
+ Log.d(TAG, ">>> FmRadioService.seek: " + frequency + " " + isUp);
+ if (!mIsPowerUp) {
+ Log.w(TAG, "FM is not powered up");
+ return -1;
+ }
+
+ setRds(false);
+ mIsNativeSeeking = true;
+ float fRet = FmRadioNative.seek(frequency, isUp);
+ mIsNativeSeeking = false;
+ // make mIsStopScanCalled false, avoid stop scan make this true,
+ // when start scan, it will return null.
+ mIsStopScanCalled = false;
+ Log.d(TAG, "<<< FmRadioService.seek: " + fRet);
+ return fRet;
+ }
+
+ /**
+ * Scan stations
+ */
+ public void startScanAsync() {
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SCAN_FINISHED);
+ mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_SCAN_FINISHED);
+ }
+
+ private int[] startScan() {
+ Log.d(TAG, ">>> FmRadioService.startScan");
+ int[] iChannels = null;
+
+ setRds(false);
+ setMute(true);
+ short[] shortChannels = null;
+ if (!mIsStopScanCalled) {
+ mIsNativeScanning = true;
+ Log.d(TAG, "startScan native method:start");
+ shortChannels = FmRadioNative.autoScan();
+ Log.d(TAG, "startScan native method:end " + Arrays.toString(shortChannels));
+ mIsNativeScanning = false;
+ }
+
+ setRds(true);
+ if (mIsStopScanCalled) {
+ // Received a message to power down FM, or interrupted by a phone
+ // call. Do not return any stations. shortChannels = null;
+ // if cancel scan, return invalid station -100
+ shortChannels = new short[] {
+ -100
+ };
+ mIsStopScanCalled = false;
+ }
+
+ if (null != shortChannels) {
+ int size = shortChannels.length;
+ iChannels = new int[size];
+ for (int i = 0; i < size; i++) {
+ iChannels[i] = shortChannels[i];
+ }
+ }
+ Log.d(TAG, "<<< FmRadioService.startScan: " + Arrays.toString(iChannels));
+ return iChannels;
+ }
+
+ /**
+ * Check FM Radio is in scan progress or not
+ *
+ * @return if in scan progress return true, otherwise return false.
+ */
+ public boolean isScanning() {
+ return mIsScanning;
+ }
+
+ /**
+ * Stop scan progress
+ *
+ * @return true if can stop scan, otherwise return false.
+ */
+ public boolean stopScan() {
+ Log.d(TAG, ">>> FmRadioService.stopScan");
+ if (!mIsPowerUp) {
+ Log.w(TAG, "FM is not powered up");
+ return false;
+ }
+
+ boolean bRet = false;
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SCAN_FINISHED);
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SEEK_FINISHED);
+ if (mIsNativeScanning || mIsNativeSeeking) {
+ mIsStopScanCalled = true;
+ Log.d(TAG, "native stop scan:start");
+ bRet = FmRadioNative.stopScan();
+ Log.d(TAG, "native stop scan:end --" + bRet);
+ }
+ Log.d(TAG, "<<< FmRadioService.stopScan: " + bRet);
+ return bRet;
+ }
+
+ /**
+ * Check FM is in seek progress or not
+ *
+ * @return true if in seek progress, otherwise return false.
+ */
+ public boolean isSeeking() {
+ return mIsNativeSeeking;
+ }
+
+ /**
+ * Set RDS
+ *
+ * @param on true, enable RDS; false, disable RDS.
+ */
+ public void setRdsAsync(boolean on) {
+ final int bundleSize = 1;
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SET_RDS_FINISHED);
+ Bundle bundle = new Bundle(bundleSize);
+ bundle.putBoolean(OPTION, on);
+ Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_SET_RDS_FINISHED);
+ msg.setData(bundle);
+ mFmServiceHandler.sendMessage(msg);
+ }
+
+ private int setRds(boolean on) {
+ if (!mIsPowerUp) {
+ return -1;
+ }
+ Log.d(TAG, ">>> FmRadioService.setRDS: " + on);
+ int ret = -1;
+ if (isRdsSupported()) {
+ ret = FmRadioNative.setRds(on);
+ }
+ setPS("");
+ setLRText("");
+ Log.d(TAG, "<<< FmRadioService.setRDS: " + ret);
+ return ret;
+ }
+
+ /**
+ * Get PS information
+ *
+ * @return PS information
+ */
+ public String getPS() {
+ Log.d(TAG, "FmRadioService.getPS: " + mPSString);
+ return mPSString;
+ }
+
+ /**
+ * Get RT information
+ *
+ * @return RT information
+ */
+ public String getLRText() {
+ Log.d(TAG, "FmRadioService.getLRText: " + mLRTextString);
+ return mLRTextString;
+ }
+
+ /**
+ * Get AF frequency
+ *
+ * @return AF frequency
+ */
+ public void activeAFAsync() {
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_ACTIVE_AF_FINISHED);
+ mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_ACTIVE_AF_FINISHED);
+ }
+
+ private int activeAF() {
+ if (!mIsPowerUp) {
+ Log.w(TAG, "FM is not powered up");
+ return -1;
+ }
+
+ int frequency = FmRadioNative.activeAf();
+ Log.d(TAG, "FmRadioService.activeAF: " + frequency);
+ return frequency;
+ }
+
+ /**
+ * Mute or unmute FM voice
+ *
+ * @param mute true for mute, false for unmute
+ *
+ * @return (true, success; false, failed)
+ */
+ public void setMuteAsync(boolean mute) {
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SET_MUTE_FINISHED);
+ final int bundleSize = 1;
+ Bundle bundle = new Bundle(bundleSize);
+ bundle.putBoolean(OPTION, mute);
+ Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_SET_MUTE_FINISHED);
+ msg.setData(bundle);
+ mFmServiceHandler.sendMessage(msg);
+ }
+
+ private int setMute(boolean mute) {
+ if (!mIsPowerUp) {
+ Log.w(TAG, "FM is not powered up");
+ return -1;
+ }
+ Log.d(TAG, ">>> FmRadioService.setMute: " + mute);
+ int iRet = FmRadioNative.setMute(mute);
+ Log.d(TAG, "<<< FmRadioService.setMute: " + iRet);
+ return iRet;
+ }
+
+ /**
+ * Check whether RDS is support in driver
+ *
+ * @return (true, support; false, not support)
+ */
+ public boolean isRdsSupported() {
+ boolean isRdsSupported = (FmRadioNative.isRdsSupport() == 1);
+ Log.d(TAG, "FmRadioService.isRdsSupported: " + isRdsSupported);
+ return isRdsSupported;
+ }
+
+ /**
+ * Check whether speaker used or not
+ *
+ * @return true if use speaker, otherwise return false
+ */
+ public boolean isSpeakerUsed() {
+ Log.d(TAG, "FmRadioService.isSpeakerUsed: " + mIsSpeakerUsed);
+ return mIsSpeakerUsed;
+ }
+
+ /**
+ * Initial service and current station
+ *
+ * @param iCurrentStation current station frequency
+ */
+ public void initService(int iCurrentStation) {
+ Log.d(TAG, "FmRadioService.initService: " + iCurrentStation);
+ mIsServiceInited = true;
+ mCurrentStation = iCurrentStation;
+ }
+
+ /**
+ * Check service is initialed or not
+ *
+ * @return true if initialed, otherwise return false
+ */
+ public boolean isServiceInited() {
+ Log.d(TAG, "FmRadioService.isServiceInit: " + mIsServiceInited);
+ return mIsServiceInited;
+ }
+
+ /**
+ * Get FM service current station frequency
+ *
+ * @return Current station frequency
+ */
+ public int getFrequency() {
+ Log.d(TAG, "FmRadioService.getFrequency: " + mCurrentStation);
+ return mCurrentStation;
+ }
+
+ /**
+ * Set FM service station frequency
+ *
+ * @param station Current station
+ */
+ public void setFrequency(int station) {
+ mCurrentStation = station;
+ }
+
+ /**
+ * resume FM audio
+ */
+ private void resumeFmAudio() {
+ Log.d(TAG, "FmRadioService.resumeFmAudio");
+ // If not check mIsAudioFocusHeld && mIsPowerup, when scan canceled,
+ // this will be resume first, then execute power down. it will cause
+ // nosise.
+ if (mIsAudioFocusHeld && mIsPowerUp) {
+ enableFmAudio(true);
+ }
+ }
+
+ /**
+ * Switch antenna There are two types of antenna(long and short) If long
+ * antenna(most is this type), must plug in earphone as antenna to receive
+ * FM. If short antenna, means there is a short antenna if phone already,
+ * can receive FM without earphone.
+ *
+ * @param antenna antenna (0, long antenna, 1 short antenna)
+ *
+ * @return (0, success; 1 failed; 2 not support)
+ */
+ public void switchAntennaAsync(int antenna) {
+ final int bundleSize = 1;
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SWITCH_ANNTENNA);
+
+ Bundle bundle = new Bundle(bundleSize);
+ bundle.putInt(FmRadioListener.SWITCH_ANNTENNA_VALUE, antenna);
+ Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_SWITCH_ANNTENNA);
+ msg.setData(bundle);
+ mFmServiceHandler.sendMessage(msg);
+ }
+
+ /**
+ * Need native support whether antenna support interface.
+ *
+ * @param antenna antenna (0, long antenna, 1 short antenna)
+ *
+ * @return (0, success; 1 failed; 2 not support)
+ */
+ private int switchAntenna(int antenna) {
+ Log.d(TAG, ">>> FmRadioService.switchAntenna:" + antenna);
+ // if fm not powerup, switchAntenna will flag whether has earphone
+ int ret = FmRadioNative.switchAntenna(antenna);
+ Log.d(TAG, "<<< FmRadioService.switchAntenna: " + ret);
+ return ret;
+ }
+
+ /**
+ * Start recording
+ */
+ public void startRecordingAsync() {
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_STARTRECORDING_FINISHED);
+ mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_STARTRECORDING_FINISHED);
+ }
+
+ private void startRecording() {
+ Log.d(TAG, ">>> startRecording");
+ if (!mIsPowerUp) {
+ Log.d(TAG, "native is not power up: " + mIsPowerUp);
+ onRecorderError(FmRecorder.ERROR_RECORDER_INVALID_STATE);
+ return;
+ }
+ sRecordingSdcard = FmRadioUtils.getDefaultStoragePath();
+ Log.d(TAG, "default sd card file path: " + sRecordingSdcard);
+ if (sRecordingSdcard == null || sRecordingSdcard.isEmpty()) {
+ Log.d(TAG, "startRecording: may be no sdcard");
+ onRecorderError(FmRecorder.ERROR_SDCARD_NOT_PRESENT);
+ return;
+ }
+
+ if (mFmRecorder == null) {
+ mFmRecorder = new FmRecorder();
+ mFmRecorder.registerRecorderStateListener(FmRadioService.this);
+ }
+
+ if (isSdcardReady(sRecordingSdcard)) {
+ mFmRecorder.startRecording(getApplicationContext());
+ } else {
+ Log.d(TAG, "Cannot record because sdcard is not ready!!");
+ onRecorderError(FmRecorder.ERROR_SDCARD_NOT_PRESENT);
+ }
+ Log.d(TAG, "<<< startRecording");
+ }
+
+ private boolean isSdcardReady(String sdcardPath) {
+ Log.d(TAG, ">>> isSdcardReady: sdcardPath is " + sdcardPath +
+ ", mSdcardStateMap is " + mSdcardStateMap);
+ if (!mSdcardStateMap.isEmpty()) {
+ if (mSdcardStateMap.get(sdcardPath) != null && !mSdcardStateMap.get(sdcardPath)) {
+ Log.d(TAG, "<<< isSdcardReady: return false");
+ return false;
+ }
+ }
+ Log.d(TAG, "<<< isSdcardReady: mSdcardStateMap:" + mSdcardStateMap);
+ return true;
+ }
+
+ /**
+ * stop recording
+ */
+ public void stopRecordingAsync() {
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_STOPRECORDING_FINISHED);
+ mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_STOPRECORDING_FINISHED);
+ }
+
+ private boolean stopRecording() {
+ Log.d(TAG, ">>> stopRecording");
+ if (mFmRecorder == null) {
+ Log.e(TAG, "stopRecording called without a valid recorder!!");
+ return false;
+ }
+ synchronized (mStopRecordingLock) {
+ mFmRecorder.stopRecording();
+ Log.d(TAG, "<<< stopRecording");
+ }
+ return true;
+ }
+
+ /**
+ * Start play recording file
+ */
+ public void startPlaybackAsync() {
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_STARTPLAYBACK_FINISHED);
+ mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_STARTPLAYBACK_FINISHED);
+ }
+
+ private boolean startPlayback() {
+ Log.d(TAG, ">>> startPlayback");
+ if (!requestAudioFocus()) {
+ Log.d(TAG, "can't get audio focus when play recording file");
+ return false;
+ }
+
+ if (mFmRecorder == null) {
+ Log.e(TAG, "FMRecorder is null !!");
+ return false;
+ }
+
+ // Set Mute before start playback
+ mAudioManager.setParameters("AudioFmPreStop=1");
+ setMute(true);
+ enableFmAudio(false);
+
+ mFmRecorder.startPlayback();
+ Log.d(TAG, "<<< startPlayback");
+ return true;
+ }
+
+ /**
+ * stop play recording file
+ */
+ public void stopPlaybackAsync() {
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_STOPPLAYBACK_FINISHED);
+ mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_STOPPLAYBACK_FINISHED);
+ }
+
+ private void stopPlayback() {
+ Log.d(TAG, ">>> stopPlayback");
+ if (mFmRecorder != null) {
+ mFmRecorder.stopPlayback();
+ checkAfterPlayback();
+ }
+ Log.d(TAG, "<<< stopPlayback");
+ }
+
+ /**
+ * Save recording file according name or discard recording file if name is
+ * null
+ *
+ * @param newName New recording file name
+ */
+ public void saveRecordingAsync(String newName) {
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SAVERECORDING_FINISHED);
+ final int bundleSize = 1;
+ Bundle bundle = new Bundle(bundleSize);
+ bundle.putString(RECODING_FILE_NAME, newName);
+ Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_SAVERECORDING_FINISHED);
+ msg.setData(bundle);
+ mFmServiceHandler.sendMessage(msg);
+ }
+
+ private void saveRecording(String newName) {
+ Log.d(TAG, ">>> saveRecording");
+ if (mFmRecorder != null) {
+ if (newName != null) {
+ mFmRecorder.saveRecording(FmRadioService.this, newName);
+ Log.d(TAG, "<<< saveRecording");
+ return;
+ }
+ mFmRecorder.discardRecording();
+ }
+ Log.d(TAG, "<<< saveRecording");
+ }
+
+ /**
+ * Get record time
+ *
+ * @return Record time
+ */
+ public long getRecordTime() {
+ if (mFmRecorder != null) {
+ return mFmRecorder.recordTime();
+ }
+ Log.e(TAG, "FMRecorder is null !!");
+ return 0;
+ }
+
+ /**
+ * Set recording mode
+ *
+ * @param isRecording true, enter recoding mode; false, exit recording mode
+ */
+ public void setRecordingModeAsync(boolean isRecording) {
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_RECORD_MODE_CHANED);
+ final int bundleSize = 1;
+ Bundle bundle = new Bundle(bundleSize);
+ bundle.putBoolean(OPTION, isRecording);
+ Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_RECORD_MODE_CHANED);
+ msg.setData(bundle);
+ mFmServiceHandler.sendMessage(msg);
+ }
+
+ private void setRecordingMode(boolean isRecording) {
+ Log.d(TAG, ">>> setRecordingMode: isRecording=" + isRecording);
+ mIsInRecordingMode = isRecording;
+ if (mFmRecorder != null) {
+ if (!isRecording) {
+ if (mFmRecorder.getState() != FmRecorder.STATE_IDLE) {
+ mFmRecorder.stopRecording();
+ mFmRecorder.stopPlayback();
+ }
+ resumeFmAudio();
+ setMute(false);
+ Log.d(TAG, "<<< setRecordingMode");
+ return;
+ }
+ // reset recorder to unused status
+ mFmRecorder.resetRecorder();
+ }
+ Log.d(TAG, "<<< setRecordingMode");
+ }
+
+ /**
+ * Get current recording mode
+ *
+ * @return if in recording mode return true, otherwise return false;
+ */
+ public boolean getRecordingMode() {
+ return mIsInRecordingMode;
+ }
+
+ /**
+ * Get record state
+ *
+ * @return record state
+ */
+ public int getRecorderState() {
+ if (null != mFmRecorder) {
+ return mFmRecorder.getState();
+ }
+ return FmRecorder.STATE_INVALID;
+ }
+
+ /**
+ * Get recording file name
+ *
+ * @return recording file name
+ */
+ public String getRecordingName() {
+ if (null != mFmRecorder) {
+ return mFmRecorder.getRecordingName();
+ }
+ return null;
+ }
+
+ /**
+ * Get current recording file name with full path
+ *
+ * @return The current recording file name or null
+ */
+ public String getRecordingNameWithPath() {
+ if (null != mFmRecorder) {
+ return mFmRecorder.getRecordingNameWithPath();
+ }
+ return null;
+ }
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ Log.d(TAG, ">>> FmRadioService.onCreate");
+ Log.d(TAG, "short antenna support:" + SHORT_ANNTENNA_SUPPORT);
+ mContext = getApplicationContext();
+ mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
+ mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
+ PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
+ mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
+ mWakeLock.setReferenceCounted(false);
+ sRecordingSdcard = FmRadioUtils.getDefaultStoragePath();
+
+ if (!initFmPlayer()) {
+ Log.e(TAG, "init FMPlayer failed");
+ return;
+ }
+
+ registerFmBroadcastReceiver();
+ registerSdcardReceiver();
+
+ HandlerThread handlerThread = new HandlerThread("FmRadioServiceThread");
+ handlerThread.start();
+ mFmServiceHandler = new FmRadioServiceHandler(handlerThread.getLooper());
+
+ openDevice();
+ // set speaker to default status, avoid setting->clear data.
+ setSpeakerPhoneOn(mIsSpeakerUsed);
+ Log.d(TAG, "<<< FmRadioService.onCreate");
+ }
+
+ private boolean initFmPlayer() {
+ mFmPlayer = new MediaPlayer();
+ if (!FmRadioUtils.isFmSuspendSupport()) {
+ mFmPlayer.setWakeMode(FmRadioService.this, PowerManager.PARTIAL_WAKE_LOCK);
+ }
+ mFmPlayer.setOnErrorListener(mPlayerErrorListener);
+ try {
+ mFmPlayer.setDataSource("THIRDPARTY://MEDIAPLAYER_PLAYERTYPE_FM");
+ } catch (IOException ex) {
+ // notify the user why the file couldn't be opened
+ Log.e(TAG, "setDataSource: " + ex);
+ return false;
+ } catch (IllegalArgumentException ex) {
+ // notify the user why the file couldn't be opened
+ Log.e(TAG, "setDataSource: " + ex);
+ return false;
+ } catch (SecurityException ex) {
+ Log.e(TAG, "setDataSource: " + ex);
+ return false;
+ } catch (IllegalStateException ex) {
+ Log.e(TAG, "setDataSource: " + ex);
+ return false;
+ }
+ mFmPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
+ return true;
+ }
+
+ private void registerFmBroadcastReceiver() {
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(SOUND_POWER_DOWN_MSG);
+ filter.addAction(Intent.ACTION_SHUTDOWN);
+ filter.addAction(Intent.ACTION_SCREEN_ON);
+ filter.addAction(Intent.ACTION_SCREEN_OFF);
+ filter.addAction(Intent.ACTION_HEADSET_PLUG);
+/* Vanzo:tanglei on: Fri, 13 Mar 2015 21:22:01 +0800
+ */
+ //if (FeatureOption.VANZO_FEATURE_EARPHONE_KEY_ACTION) {
+ // filter.addAction("com.mediatek.FMRadio.FMRadioService.NEXT_STATION");
+ //}
+// End of Vanzo:tanglei
+ filter.addAction(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED);
+ filter.addAction(ACTION_TOFMSERVICE_POWERDOWN);
+ filter.addAction(ACTION_FROMATVSERVICE_POWERUP);
+ mBroadcastReceiver = new FmServiceBroadcastReceiver();
+ Log.i(TAG, "Register broadcast receiver.");
+ registerReceiver(mBroadcastReceiver, filter);
+ }
+
+ private void unregisterFmBroadcastReceiver() {
+ if (null != mBroadcastReceiver) {
+ Log.i(TAG, "Unregister broadcast receiver.");
+ unregisterReceiver(mBroadcastReceiver);
+ mBroadcastReceiver = null;
+ }
+ }
+
+ @Override
+ public void onDestroy() {
+ Log.d(TAG, ">>> FmRadioService.onDestroy");
+ mAudioManager.setParameters("AudioFmPreStop=1");
+ setMute(true);
+ // stop rds first, avoid blocking other native method
+ if (isRdsSupported()) {
+ Log.d(TAG, "RDS is supported. Stop the RDS thread.");
+ stopRdsThread();
+ }
+ unregisterFmBroadcastReceiver();
+ unregisterSdcardListener();
+ abandonAudioFocus();
+ exitFm();
+ if (null != mFmRecorder) {
+ mFmRecorder = null;
+ }
+ super.onDestroy();
+ }
+
+ /**
+ * Exit FMRadio application
+ */
+ private void exitFm() {
+ Log.d(TAG, "service.exitFm start");
+ mIsAudioFocusHeld = false;
+ // Stop FM recorder if it is working
+ if (null != mFmRecorder) {
+ synchronized (mStopRecordingLock) {
+ int fmState = mFmRecorder.getState();
+ if (FmRecorder.STATE_PLAYBACK == fmState) {
+ mFmRecorder.stopPlayback();
+ Log.d(TAG, "Stop playback FMRecorder.");
+ } else if (FmRecorder.STATE_RECORDING == fmState) {
+ mFmRecorder.stopRecording();
+ Log.d(TAG, "stop Recording.");
+ }
+
+ // ALPS01789667 Add to DB if exit, there are two cases:
+ // case 1: FileManager play Music->FM receive short audio focus->Fm stop recording
+ // -> FM receive SOUND_POWER_DOWN_MSG->Come here but is IDLE status
+ // case 2: Music play a song->FM receive long audio focus->Come here is RECORDING
+ mFmRecorder.addCurrentRecordingToDb(mContext);
+ }
+ }
+
+ // When exit, we set the audio path back to earphone.
+ if (mIsNativeScanning || mIsNativeSeeking) {
+ stopScan();
+ }
+
+ mFmServiceHandler.removeCallbacksAndMessages(null);
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_FM_EXIT);
+ mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_FM_EXIT);
+ Log.d(TAG, "service.exitFm end");
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ // Change the notification string.
+ if (mIsPowerUp) {
+ showNotification();
+ }
+ }
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+ Log.d(TAG, ">>> FmRadioService.onStartCommand intent: " + intent + " startId: " + startId);
+ int ret = super.onStartCommand(intent, flags, startId);
+ Log.d(TAG, "<<< FmRadioService.onStartCommand: " + ret);
+ return START_NOT_STICKY;
+ }
+
+ /**
+ * Start RDS thread to update RDS information
+ */
+ private void startRdsThread() {
+ Log.d(TAG, ">>> FmRadioService.startRdSThread");
+ mIsRdsThreadExit = false;
+ if (null != mRdsThread) {
+ return;
+ }
+ mRdsThread = new Thread() {
+ public void run() {
+ Log.d(TAG, ">>> RDS Thread run()");
+ while (true) {
+ if (mIsRdsThreadExit) {
+ break;
+ }
+
+ int iRdsEvents = FmRadioNative.readRds();
+ if (iRdsEvents != 0) {
+ Log.d(TAG, "FmRadioNative.readrds events: " + iRdsEvents);
+ }
+
+ if (RDS_EVENT_PROGRAMNAME == (RDS_EVENT_PROGRAMNAME & iRdsEvents)) {
+ Log.d(TAG, "RDS_EVENT_PROGRAMNAME");
+ byte[] bytePS = FmRadioNative.getPs();
+ if (null != bytePS) {
+ setPS(new String(bytePS).trim());
+ }
+ }
+
+ if (RDS_EVENT_LAST_RADIOTEXT == (RDS_EVENT_LAST_RADIOTEXT & iRdsEvents)) {
+ Log.d(TAG, "RDS_EVENT_LAST_RADIOTEXT");
+ byte[] byteLRText = FmRadioNative.getLrText();
+ if (null != byteLRText) {
+ setLRText(new String(byteLRText).trim());
+ }
+ }
+
+ if (RDS_EVENT_AF == (RDS_EVENT_AF & iRdsEvents)) {
+ Log.d(TAG, "RDS_EVENT_AF");
+ /*
+ * add for rds AF
+ */
+ if (mIsScanning || mIsSeeking) {
+ Log.d(TAG, "RDSThread. seek or scan going, no need to tune here");
+ } else if (!mIsPowerUp) {
+ Log.d(TAG, "RDSThread. fm is power down, do nothing.");
+ } else {
+ int iFreq = FmRadioNative.activeAf();
+ if (FmRadioUtils.isValidStation(iFreq)) {
+ // if the new frequency is not equal to current
+ // frequency.
+ if (mCurrentStation == iFreq) {
+ Log.w(TAG, "RDSThread. the new freq is the same as current.");
+ } else {
+ setPS("");
+ setLRText("");
+ if (!mIsScanning && !mIsSeeking) {
+ Log.d(TAG, "RDSThread. seek or scan not going," +
+ "need to tune here");
+ tuneStationAsync(FmRadioUtils.computeFrequency(iFreq));
+ }
+ }
+ }
+ }
+ }
+ // Do not handle other events.
+ // Sleep 500ms to reduce inquiry frequency
+ try {
+ final int hundredMillisecond = 500;
+ Thread.sleep(hundredMillisecond);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ Log.d(TAG, "<<< RDS Thread run()");
+ }
+ };
+
+ Log.d(TAG, "Start RDS Thread.");
+ mRdsThread.start();
+ Log.d(TAG, "<<< FmRadioService.startRdSThread");
+ }
+
+ /**
+ * Stop RDS thread to stop listen station RDS change
+ */
+ private void stopRdsThread() {
+ Log.d(TAG, ">>> FmRadioService.stopRdSThread");
+ if (null != mRdsThread) {
+ // Must call closedev after stopRDSThread.
+ mIsRdsThreadExit = true;
+ mRdsThread = null;
+ }
+ Log.d(TAG, "<<< FmRadioService.stopRdSThread");
+ }
+
+ /**
+ * Set PS information
+ *
+ * @param ps The ps information
+ */
+ private void setPS(String ps) {
+ Log.d(TAG, "FmRadioService.setPS: " + ps + " ,current: " + mPSString);
+ if (0 != mPSString.compareTo(ps)) {
+ mPSString = ps;
+ Bundle bundle = new Bundle(3);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.LISTEN_PS_CHANGED);
+ bundle.putString(FmRadioListener.KEY_PS_INFO, mPSString);
+ bundle.putString(FmRadioListener.KEY_RT_INFO, mLRTextString);
+ notifyActivityStateChanged(bundle);
+ } // else New PS is the same as current
+ }
+
+ /**
+ * Set RT information
+ *
+ * @param lrtText The RT information
+ */
+ private void setLRText(String lrtText) {
+ Log.d(TAG, "FmRadioService.setLRText: " + lrtText + " ,current: " + mLRTextString);
+ if (0 != mLRTextString.compareTo(lrtText)) {
+ mLRTextString = lrtText;
+ Bundle bundle = new Bundle(3);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.LISTEN_RT_CHANGED);
+ bundle.putString(FmRadioListener.KEY_PS_INFO, mPSString);
+ bundle.putString(FmRadioListener.KEY_RT_INFO, mLRTextString);
+ notifyActivityStateChanged(bundle);
+ } // else New RT is the same as current
+ }
+
+ /**
+ * Open or close FM Radio audio
+ *
+ * @param enable true, open FM audio; false, close FM audio;
+ */
+ private void enableFmAudio(boolean enable) {
+ Log.d(TAG, ">>> FmRadioService.enableFmAudio: " + enable);
+ if ((mFmPlayer == null) || !mIsPowerUp) {
+ Log.w(TAG, "mFMPlayer is null in Service.enableFmAudio");
+ return;
+ }
+
+ try {
+ if (!enable) {
+ if (!mFmPlayer.isPlaying()) {
+ Log.d(TAG, "warning: FM audio is already disabled.");
+ return;
+ }
+
+ Log.d(TAG, "call MediaPlayer.stop()");
+ mFmPlayer.stop();
+ Log.d(TAG, "stop FM audio.");
+ return;
+ }
+
+ if (mFmPlayer.isPlaying()) {
+ Log.d(TAG, "warning: FM audio is already enabled.");
+ return;
+ }
+ } catch (IllegalStateException e) {
+ Log.e(TAG, "Exception: Cannot call MediaPlayer isPlaying.", e);
+ }
+
+ try {
+ mFmPlayer.prepare();
+ //if (FmRadioUtils.isFmSuspendSupport()) {
+ // Log.d(TAG, "support FM suspend");
+ // mFmPlayer.startWithoutWakelock();
+ //} else {
+ mFmPlayer.start();
+ //}
+ } catch (IOException e) {
+ Log.e(TAG, "Exception: Cannot call MediaPlayer prepare.", e);
+ } catch (IllegalStateException e) {
+ Log.e(TAG, "Exception: Cannot call MediaPlayer prepare.", e);
+ }
+
+ Log.d(TAG, "Start FM audio.");
+ Log.d(TAG, "<<< FmRadioService.enableFmAudio");
+ }
+
+ /**
+ * Show notification
+ */
+ private void showNotification() {
+ Log.d(TAG, "FmRadioService.showNotification");
+ Intent notificationIntent = new Intent();
+ notificationIntent.setClassName(getPackageName(), FmRadioActivity.class.getName());
+ PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(),
+ 0, notificationIntent, 0);
+ Notification notification = new Notification(R.drawable.fm_title_icon, null,
+ System.currentTimeMillis());
+ notification.flags |= Notification.FLAG_ONGOING_EVENT | Notification.FLAG_NO_CLEAR;
+ String fmUnit = mContext.getString(R.string.fm_unit);
+ String text = FmRadioUtils.formatStation(mCurrentStation) + " " + fmUnit;
+ notification.setLatestEventInfo(getApplicationContext(),
+ getResources().getString(R.string.app_name), text, pendingIntent);
+ Log.d(TAG, "Add notification to the title bar.");
+ startForeground(NOTIFICATION_ID, notification);
+ }
+
+ /**
+ * Remove notification
+ */
+ private void removeNotification() {
+ Log.d(TAG, "FmRadioService.removeNotification");
+ stopForeground(true);
+ }
+
+ /**
+ * Update notification
+ */
+ private void updateNotification() {
+ Log.d(TAG, "FmRadioService.updateNotification");
+ if (mIsPowerUp) {
+ showNotification();
+ }
+ }
+
+ /**
+ * Register sdcard listener for record
+ */
+ private void registerSdcardReceiver() {
+ Log.v(TAG, "registerSdcardReceiver >>> ");
+ if (mSdcardListener == null) {
+ mSdcardListener = new SdcardListener();
+ }
+ IntentFilter filter = new IntentFilter();
+ filter.addDataScheme("file");
+ filter.addAction(Intent.ACTION_MEDIA_MOUNTED);
+ filter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
+ filter.addAction(Intent.ACTION_MEDIA_EJECT);
+ registerReceiver(mSdcardListener, filter);
+ Log.v(TAG, "registerSdcardReceiver <<< ");
+ }
+
+ private void unregisterSdcardListener() {
+ if (null != mSdcardListener) {
+ unregisterReceiver(mSdcardListener);
+ }
+ }
+
+ private void updateSdcardStateMap(Intent intent) {
+ String action = intent.getAction();
+ String sdcardPath = null;
+ Uri mountPointUri = intent.getData();
+ if (mountPointUri != null) {
+ sdcardPath = mountPointUri.getPath();
+ if (sdcardPath != null) {
+ if (Intent.ACTION_MEDIA_EJECT.equals(action)) {
+ Log.d(TAG, "updateSdcardStateMap: ENJECT " + sdcardPath);
+ mSdcardStateMap.put(sdcardPath, false);
+ } else if (Intent.ACTION_MEDIA_UNMOUNTED.equals(action)) {
+ Log.d(TAG, "updateSdcardStateMap: UNMOUNTED " + sdcardPath);
+ mSdcardStateMap.put(sdcardPath, false);
+ } else if (Intent.ACTION_MEDIA_MOUNTED.equals(action)) {
+ Log.d(TAG, "updateSdcardStateMap: MOUNTED " + sdcardPath);
+ mSdcardStateMap.put(sdcardPath, true);
+ }
+ }
+ }
+ }
+
+ /**
+ * Notify FM recorder state
+ *
+ * @param state The current FM recorder state
+ */
+ @Override
+ public void onRecorderStateChanged(int state) {
+ Log.d(TAG, "onRecorderStateChanged: " + state);
+ mRecordState = state;
+ Bundle bundle = new Bundle(2);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.LISTEN_RECORDSTATE_CHANGED);
+ bundle.putInt(FmRadioListener.KEY_RECORDING_STATE, state);
+ notifyActivityStateChanged(bundle);
+ }
+
+ /**
+ * Notify FM recorder error message
+ *
+ * @param error The recorder error type
+ */
+ @Override
+ public void onRecorderError(int error) {
+ Log.d(TAG, "onRecorderError: " + error);
+ // if media server die, will not enable FM audio, and convert to
+ // ERROR_PLAYER_INATERNAL, call back to activity showing toast.
+ mRecorderErrorType = (MediaPlayer.MEDIA_ERROR_SERVER_DIED == error) ?
+ FmRecorder.ERROR_PLAYER_INTERNAL : error;
+
+ Bundle bundle = new Bundle(2);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.LISTEN_RECORDERROR);
+ bundle.putInt(FmRadioListener.KEY_RECORDING_ERROR_TYPE, mRecorderErrorType);
+ notifyActivityStateChanged(bundle);
+
+ // if media server die, should not enable fm, otherwise je will occur.
+ if (FmRecorder.ERROR_PLAYER_INTERNAL == error) {
+ resumeFmAudio();
+ }
+ }
+
+ /**
+ * Notify play FM record file complete
+ */
+ @Override
+ public void onPlayRecordFileComplete() {
+ Log.d(TAG, "service.onPlayRecordFileComplete");
+ checkAfterPlayback();
+ }
+
+ /**
+ * Check and go next(play or show tips) after recorder file play
+ * back finish.
+ * Two cases:
+ * 1. With headset or support short antenna -> play FM
+ * 2. Without headset -> show plug in earphone tips
+ */
+ private void checkAfterPlayback() {
+ if (isHeadSetIn() || SHORT_ANNTENNA_SUPPORT) {
+ // with headset
+ Log.d(TAG, "checkAfterPlayback:eaphone is in,need resume fm");
+ if (mIsPowerUp) {
+ resumeFmAudio();
+ setMute(false);
+ } else {
+ powerUpAsync(FmRadioUtils.computeFrequency(mCurrentStation));
+ }
+ } else {
+ // without headset need show plug in earphone tips
+ Log.d(TAG, "checkAfterPlayback:earphone is out, need show plug in earphone tips");
+ switchAntennaAsync(mValueHeadSetPlug);
+ }
+ }
+
+ /**
+ * Check the headset is plug in or plug out
+ *
+ * @return true for plug in; false for plug out
+ */
+ private boolean isHeadSetIn() {
+ return (0 == mValueHeadSetPlug);
+ }
+
+ private void stopFmFocusLoss(int focusState) {
+ mIsAudioFocusHeld = false;
+ if (mIsNativeScanning || mIsNativeSeeking) {
+ // make stop scan from activity call to service.
+ // notifyActivityStateChanged(FMRadioListener.LISTEN_SCAN_CANCELED);
+ stopScan();
+ Log.d(TAG, "need to stop FM, so stop scan channel.");
+ }
+
+ // using handler thread to update audio focus state
+ updateAudioFocusAync(focusState);
+ Log.d(TAG, "need to stop FM, so powerdown FM.");
+
+ }
+
+ /**
+ * Handle FM Player error
+ */
+ private final MediaPlayer.OnErrorListener mPlayerErrorListener =
+ new MediaPlayer.OnErrorListener() {
+ /**
+ * handle error message
+ *
+ * @param mp occurred error media player
+ * @param what error message
+ * @param extra error message extra
+ *
+ * @return handle error message or not
+ */
+ public boolean onError(MediaPlayer mp, int what, int extra) {
+
+ if (MediaPlayer.MEDIA_ERROR_SERVER_DIED == what) {
+ Log.d(TAG, "onError: MEDIA_SERVER_DIED");
+ if (null != mFmPlayer) {
+ mFmPlayer.release();
+ mFmPlayer = null;
+ }
+ mFmPlayer = new MediaPlayer();
+ if (!FmRadioUtils.isFmSuspendSupport()) {
+ mFmPlayer.setWakeMode(FmRadioService.this, PowerManager.PARTIAL_WAKE_LOCK);
+ }
+ mFmPlayer.setOnErrorListener(mPlayerErrorListener);
+ try {
+ mFmPlayer.setDataSource("THIRDPARTY://MEDIAPLAYER_PLAYERTYPE_FM");
+ mFmPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
+ if (mIsPowerUp) {
+ // set speaker mode according to AP
+ setSpeakerPhoneOn(mIsSpeakerUsed);
+ mFmPlayer.prepare();
+ //if (FmRadioUtils.isFmSuspendSupport()) {
+ // Log.d(TAG, "support FM suspend");
+ // mFmPlayer.startWithoutWakelock();
+ //} else {
+ mFmPlayer.start();
+ //}
+ }
+ } catch (IOException ex) {
+ Log.e(TAG, "setDataSource: " + ex);
+ return false;
+ } catch (IllegalArgumentException ex) {
+ Log.e(TAG, "setDataSource: " + ex);
+ return false;
+ } catch (IllegalStateException ex) {
+ Log.e(TAG, "setDataSource: " + ex);
+ return false;
+ }
+ }
+
+ return true;
+ }
+ };
+
+ /**
+ * Request audio focus
+ *
+ * @return true, success; false, fail;
+ */
+ public boolean requestAudioFocus() {
+ if (mIsAudioFocusHeld) {
+ return true;
+ }
+
+ int audioFocus = mAudioManager.requestAudioFocus(mAudioFocusChangeListener,
+ AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
+ mIsAudioFocusHeld = (AudioManager.AUDIOFOCUS_REQUEST_GRANTED == audioFocus);
+ return mIsAudioFocusHeld;
+ }
+
+ /**
+ * Abandon audio focus
+ */
+ public void abandonAudioFocus() {
+ mAudioManager.abandonAudioFocus(mAudioFocusChangeListener);
+ mIsAudioFocusHeld = false;
+ }
+
+ /**
+ * Use to interact with other voice related app
+ */
+ private final OnAudioFocusChangeListener mAudioFocusChangeListener =
+ new OnAudioFocusChangeListener() {
+ /**
+ * Handle audio focus change ensure message FIFO
+ *
+ * @param focusChange audio focus change state
+ */
+ @Override
+ public void onAudioFocusChange(int focusChange) {
+ Log.d(TAG, "onAudioFocusChange: " + focusChange);
+ switch (focusChange) {
+ case AudioManager.AUDIOFOCUS_LOSS:
+ synchronized (this) {
+ Log.d(TAG, "AudioFocus: received AUDIOFOCUS_LOSS");
+ mAudioManager.setParameters("AudioFmPreStop=1");
+ setMute(true);
+ Log.d(TAG, "onAudioFocusChange.setParameters end");
+ exitFm();
+ stopSelf();
+ }
+ break;
+
+ case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
+ synchronized (this) {
+ mAudioManager.setParameters("AudioFmPreStop=1");
+ setMute(true);
+ Log.d(TAG, "AudioFocus: received AUDIOFOCUS_LOSS_TRANSIENT");
+ stopFmFocusLoss(AudioManager.AUDIOFOCUS_LOSS_TRANSIENT);
+ }
+ break;
+
+ case AudioManager.AUDIOFOCUS_GAIN:
+ synchronized (this) {
+ Log.d(TAG, "AudioFocus: received AUDIOFOCUS_GAIN");
+ updateAudioFocusAync(AudioManager.AUDIOFOCUS_GAIN);
+ }
+ break;
+
+ default:
+ Log.d(TAG, "AudioFocus: Audio focus change, but not need handle");
+ break;
+ }
+ }
+ };
+
+ /**
+ * Audio focus changed, will send message to handler thread. synchronized to
+ * ensure one message can go in this method.
+ *
+ * @param focusState AudioManager state
+ */
+ private synchronized void updateAudioFocusAync(int focusState) {
+ Log.d(TAG, "updateAudioFocusAync: focusState = " + focusState);
+ final int bundleSize = 1;
+ Bundle bundle = new Bundle(bundleSize);
+ bundle.putInt(FmRadioListener.KEY_AUDIOFOCUS_CHANGED, focusState);
+ Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_AUDIOFOCUS_CHANGED);
+ msg.setData(bundle);
+ mFmServiceHandler.sendMessage(msg);
+ }
+
+ /**
+ * Audio focus changed, update FM focus state.
+ *
+ * @param focusState AudioManager state
+ */
+ private void updateAudioFocus(int focusState) {
+ Log.d(TAG, "FmRadioService.updateAudioFocus");
+ switch (focusState) {
+ case AudioManager.AUDIOFOCUS_LOSS:
+ mPausedByTransientLossOfFocus = false;
+ // play back audio will output with music audio
+ // May be affect other recorder app, but the flow can not be
+ // execute earlier,
+ // It should ensure execute after start/stop record.
+ if (mFmRecorder != null) {
+ int fmState = mFmRecorder.getState();
+ Log.d(TAG, "stopFMFocusLoss.recorder state=" + fmState);
+ // only handle recorder state, not handle playback state
+ if (fmState == FmRecorder.STATE_RECORDING) {
+ mFmServiceHandler.removeMessages(
+ FmRadioListener.MSGID_STARTRECORDING_FINISHED);
+ mFmServiceHandler.removeMessages(
+ FmRadioListener.MSGID_STOPRECORDING_FINISHED);
+ stopRecording();
+ }
+ }
+ handlePowerDown();
+ break;
+
+ case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
+ if (mIsPowerUp) {
+ mPausedByTransientLossOfFocus = true;
+ }
+ Log.d(TAG, "AUDIOFOCUS_LOSS_TRANSIENT: mPausedByTransientLossOfFocus:" +
+ mPausedByTransientLossOfFocus);
+ // play back audio will output with music audio
+ // May be affect other recorder app, but the flow can not be
+ // execute earlier,
+ // It should ensure execute after start/stop record.
+ if (mFmRecorder != null) {
+ int fmState = mFmRecorder.getState();
+ Log.d(TAG, "stopFMFocusLoss.recorder state=" + fmState);
+ if (fmState == FmRecorder.STATE_RECORDING) {
+ mFmServiceHandler.removeMessages(
+ FmRadioListener.MSGID_STARTRECORDING_FINISHED);
+ mFmServiceHandler.removeMessages(
+ FmRadioListener.MSGID_STOPRECORDING_FINISHED);
+ stopRecording();
+ }
+ if (fmState == FmRecorder.STATE_PLAYBACK) {
+ mFmServiceHandler.removeMessages(
+ FmRadioListener.MSGID_STARTPLAYBACK_FINISHED);
+ mFmServiceHandler.removeMessages(
+ FmRadioListener.MSGID_STOPPLAYBACK_FINISHED);
+ stopPlayback();
+ }
+ }
+ handlePowerDown();
+ break;
+
+ case AudioManager.AUDIOFOCUS_GAIN:
+ Log.d(TAG, "AUDIOFOCUS_GAIN: mPausedByTransientLossOfFocus:" +
+ mPausedByTransientLossOfFocus);
+ if (!mIsPowerUp && mPausedByTransientLossOfFocus) {
+ mIsPowerUping = true;
+ final int bundleSize = 1;
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_POWERUP_FINISHED);
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_POWERDOWN_FINISHED);
+ Bundle bundle = new Bundle(bundleSize);
+ bundle.putFloat(FM_FREQUENCY, FmRadioUtils.computeFrequency(mCurrentStation));
+ handlePowerUp(bundle);
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ /**
+ * FM Radio listener record
+ */
+ private static class Record {
+ int mHashCode; // hash code
+ FmRadioListener mCallback; // call back
+ }
+
+ /**
+ * Register FM Radio listener, activity get service state should call this
+ * method register FM Radio listener
+ *
+ * @param callback FM Radio listener
+ */
+ public void registerFmRadioListener(FmRadioListener callback) {
+ synchronized (mRecords) {
+ // register callback in AudioProfileService, if the callback is
+ // exist, just replace the event.
+ Record record = null;
+ int hashCode = callback.hashCode();
+ final int n = mRecords.size();
+ for (int i = 0; i < n; i++) {
+ record = mRecords.get(i);
+ if (hashCode == record.mHashCode) {
+ return;
+ }
+ }
+ record = new Record();
+ record.mHashCode = hashCode;
+ record.mCallback = callback;
+ mRecords.add(record);
+ }
+ }
+
+ /**
+ * Call back from service to activity
+ *
+ * @param bundle The message to activity
+ */
+ private void notifyActivityStateChanged(Bundle bundle) {
+ if (!mRecords.isEmpty()) {
+ Log.d(TAG, "notifyActivityStatusChanged:clients = " + mRecords.size());
+ synchronized (mRecords) {
+ Iterator<Record> iterator = mRecords.iterator();
+ while (iterator.hasNext()) {
+ Record record = (Record) iterator.next();
+
+ FmRadioListener listener = record.mCallback;
+
+ if (listener == null) {
+ iterator.remove();
+ return;
+ }
+
+ listener.onCallBack(bundle);
+ }
+ }
+ }
+ }
+
+ /**
+ * Unregister FM Radio listener
+ *
+ * @param callback FM Radio listener
+ */
+ public void unregisterFmRadioListener(FmRadioListener callback) {
+ remove(callback.hashCode());
+ }
+
+ /**
+ * Remove call back according hash code
+ *
+ * @param hashCode The call back hash code
+ */
+ private void remove(int hashCode) {
+ synchronized (mRecords) {
+ Iterator<Record> iterator = mRecords.iterator();
+ while (iterator.hasNext()) {
+ Record record = (Record) iterator.next();
+ if (record.mHashCode == hashCode) {
+ iterator.remove();
+ }
+ }
+ }
+ }
+
+ /**
+ * Check recording sd card is unmount
+ *
+ * @param intent The unmount sd card intent
+ *
+ * @return true or false indicate whether current recording sd card is
+ * unmount or not
+ */
+ public boolean isRecordingCardUnmount(Intent intent) {
+ String unmountSDCard = intent.getData().toString();
+ Log.d(TAG, "unmount sd card file path: " + unmountSDCard);
+ return unmountSDCard.equalsIgnoreCase("file://" + sRecordingSdcard) ? true : false;
+ }
+
+ private int[] insertSearchedStation(int[] channels) {
+ Log.d(TAG, "insertSearchedStation.firstValidChannel:" + Arrays.toString(channels));
+ int firstValidChannel = mCurrentStation;
+ int channelNum = 0;
+ if (null != channels) {
+ Arrays.sort(channels);
+ int size = channels.length;
+ // Save searched stations into database by batch
+ ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
+ String defaultStationName = getString(R.string.default_station_name);
+ for (int i = 0; i < size; i++) {
+ if (FmRadioUtils.isValidStation(channels[i])) {
+ if (0 == channelNum) {
+ firstValidChannel = channels[i];
+ }
+
+ if (!FmRadioStation.isFavoriteStation(mContext, channels[i])) {
+ ops.add(ContentProviderOperation.newInsert(Station.CONTENT_URI)
+ .withValue(Station.COLUMN_STATION_NAME, defaultStationName)
+ .withValue(Station.COLUMN_STATION_FREQ, channels[i])
+ .withValue(Station.COLUMN_STATION_TYPE,
+ FmRadioStation.STATION_TYPE_SEARCHED)
+ .build());
+ }
+ channelNum++;
+ }
+ }
+ // Save search stations to database by batch
+ try {
+ mContext.getContentResolver().applyBatch(FmRadioStation.AUTHORITY, ops);
+ } catch (RemoteException e) {
+ Log.d(TAG, "Exception when applyBatch searched stations " + e);
+ } catch (OperationApplicationException e) {
+ Log.d(TAG, "Exception when applyBatch searched stations " + e);
+ }
+ }
+ Log.d(TAG, "insertSearchedStation.firstValidChannel:" + firstValidChannel +
+ ",channelNum:" + channelNum);
+ return (new int[] {
+ firstValidChannel, channelNum
+ });
+ }
+
+ /**
+ * The background handler
+ */
+ class FmRadioServiceHandler extends Handler {
+ public FmRadioServiceHandler(Looper looper) {
+ super(looper);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ Bundle bundle;
+ boolean isPowerup = false;
+ boolean isSwitch = true;
+
+ switch (msg.what) {
+
+ // power up
+ case FmRadioListener.MSGID_POWERUP_FINISHED:
+ bundle = msg.getData();
+ handlePowerUp(bundle);
+ break;
+
+ // power down
+ case FmRadioListener.MSGID_POWERDOWN_FINISHED:
+ handlePowerDown();
+ break;
+
+ // fm exit
+ case FmRadioListener.MSGID_FM_EXIT:
+ if (mIsSpeakerUsed) {
+ setSpeakerPhoneOn(false);
+ }
+ powerDown();
+ closeDevice();
+ // Release FM player upon exit
+ if (null != mFmPlayer) {
+ mFmPlayer.release();
+ mFmPlayer = null;
+ }
+
+ bundle = new Bundle(1);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.MSGID_FM_EXIT);
+ notifyActivityStateChanged(bundle);
+ // Finish favorite when exit FM
+ if (sExitListener != null) {
+ sExitListener.onExit();
+ }
+ break;
+
+ // switch antenna
+ case FmRadioListener.MSGID_SWITCH_ANNTENNA:
+ bundle = msg.getData();
+ int value = bundle.getInt(FmRadioListener.SWITCH_ANNTENNA_VALUE);
+
+ // if not support short antenna, just notify, not need to switch antenna.
+ if (SHORT_ANNTENNA_SUPPORT) {
+ isSwitch = (switchAntenna(value) == 0) ? true : false;
+ Log.d(TAG, "FmServiceHandler.switch anntenna:isSwitch:" + isSwitch);
+ } else {
+ // if ear phone insert, need dismiss plugin earphone
+ // dialog
+ // if earphone plug out and it is not play recorder
+ // state, show plug dialog.
+ if (0 == value) {
+ Log.d(TAG, "FmServiceHandler.switch anntenna:dismiss dialog");
+ // powerUpAsync(FMRadioUtils.computeFrequency(mCurrentStation));
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG,
+ FmRadioListener.MSGID_SWITCH_ANNTENNA);
+ bundle.putBoolean(FmRadioListener.KEY_IS_SWITCH_ANNTENNA, true);
+ notifyActivityStateChanged(bundle);
+ } else {
+ // ear phone plug out, and recorder state is not
+ // play recorder state,
+ // show dialog.
+ if (mRecordState != FmRecorder.STATE_PLAYBACK) {
+ Log.d(TAG, "FmServiceHandler.switch anntenna:show dialog");
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG,
+ FmRadioListener.MSGID_SWITCH_ANNTENNA);
+ bundle.putBoolean(FmRadioListener.KEY_IS_SWITCH_ANNTENNA, false);
+ notifyActivityStateChanged(bundle);
+ }
+ }
+ }
+ break;
+
+ // tune to station
+ case FmRadioListener.MSGID_TUNE_FINISHED:
+ bundle = msg.getData();
+ float tuneStation = bundle.getFloat(FM_FREQUENCY);
+ boolean isTune = tuneStation(tuneStation);
+ // if tune fail, pass current station to update ui
+ if (!isTune) {
+ tuneStation = FmRadioUtils.computeFrequency(mCurrentStation);
+ }
+ bundle = new Bundle(4);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG,
+ FmRadioListener.MSGID_TUNE_FINISHED);
+ bundle.putBoolean(FmRadioListener.KEY_IS_TUNE, isTune);
+ bundle.putFloat(FmRadioListener.KEY_TUNE_TO_STATION, tuneStation);
+ bundle.putBoolean(FmRadioListener.KEY_IS_POWER_UP, mIsPowerUp);
+ notifyActivityStateChanged(bundle);
+ break;
+
+ // seek to station
+ case FmRadioListener.MSGID_SEEK_FINISHED:
+ bundle = msg.getData();
+ mIsSeeking = true;
+ float seekStation = seekStation(bundle.getFloat(FM_FREQUENCY),
+ bundle.getBoolean(OPTION));
+ boolean isSeekTune = false;
+ int station = FmRadioUtils.computeStation(seekStation);
+ if (FmRadioUtils.isValidStation(station)) {
+ isSeekTune = tuneStation(seekStation);
+ }
+ // if tune fail, pass current station to update ui
+ if (!isSeekTune) {
+ seekStation = FmRadioUtils.computeFrequency(mCurrentStation);
+ }
+ bundle = new Bundle(2);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG,
+ FmRadioListener.MSGID_TUNE_FINISHED);
+ bundle.putBoolean(FmRadioListener.KEY_IS_TUNE, isSeekTune);
+ bundle.putFloat(FmRadioListener.KEY_TUNE_TO_STATION, seekStation);
+ notifyActivityStateChanged(bundle);
+ mIsSeeking = false;
+ break;
+
+ // start scan
+ case FmRadioListener.MSGID_SCAN_FINISHED:
+ int[] channels = null;
+ int[] result = null;
+ int scanTuneStation = 0;
+ boolean isScan = true;
+ mIsScanning = true;
+ if (powerUpFm(FmRadioUtils.DEFAULT_STATION_FLOAT)) {
+ channels = startScan();
+ }
+
+ // check whether cancel scan
+ if ((null != channels) && channels[0] == -100) {
+ Log.d(TAG, "user canceled scan:channels[0]=" + channels[0]);
+ isScan = false;
+ result = new int[] {
+ -1, 0
+ };
+ } else {
+ result = insertSearchedStation(channels);
+ scanTuneStation = result[0];
+ isTune = tuneStation(FmRadioUtils.computeFrequency(scanTuneStation));
+ scanTuneStation = isTune ? scanTuneStation : mCurrentStation;
+ }
+
+ /*
+ * if there is stop command when scan, so it needs to mute
+ * fm avoid fm sound come out.
+ */
+ if (mIsAudioFocusHeld) {
+ Log.d(TAG, "there is not power down command.set mute false");
+ setMute(false);
+ }
+ bundle = new Bundle(4);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG,
+ FmRadioListener.MSGID_SCAN_FINISHED);
+ bundle.putInt(FmRadioListener.KEY_TUNE_TO_STATION, scanTuneStation);
+ bundle.putInt(FmRadioListener.KEY_STATION_NUM, result[1]);
+ bundle.putBoolean(FmRadioListener.KEY_IS_SCAN, isScan);
+ notifyActivityStateChanged(bundle);
+ mIsScanning = false;
+ break;
+
+ // audio focus changed
+ case FmRadioListener.MSGID_AUDIOFOCUS_CHANGED:
+ bundle = msg.getData();
+ int focusState = bundle.getInt(FmRadioListener.KEY_AUDIOFOCUS_CHANGED);
+ updateAudioFocus(focusState);
+ break;
+
+ case FmRadioListener.MSGID_SET_RDS_FINISHED:
+ bundle = msg.getData();
+ setRds(bundle.getBoolean(OPTION));
+ break;
+
+ case FmRadioListener.MSGID_SET_MUTE_FINISHED:
+ bundle = msg.getData();
+ setMute(bundle.getBoolean(OPTION));
+ break;
+
+ case FmRadioListener.MSGID_ACTIVE_AF_FINISHED:
+ activeAF();
+ break;
+
+ /********** recording **********/
+ case FmRadioListener.MSGID_STARTRECORDING_FINISHED:
+ startRecording();
+ break;
+
+ case FmRadioListener.MSGID_STOPRECORDING_FINISHED:
+ stopRecording();
+ break;
+
+ case FmRadioListener.MSGID_STARTPLAYBACK_FINISHED:
+ boolean isStart = startPlayback();
+ // Can not start play back, call back to activity.
+ if (!isStart) {
+ bundle = new Bundle(2);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG,
+ FmRadioListener.LISTEN_RECORDERROR);
+ bundle.putInt(FmRadioListener.KEY_RECORDING_ERROR_TYPE,
+ FmRadioListener.NOT_AUDIO_FOCUS);
+ notifyActivityStateChanged(bundle);
+ }
+ break;
+
+ case FmRadioListener.MSGID_STOPPLAYBACK_FINISHED:
+ stopPlayback();
+ break;
+
+ case FmRadioListener.MSGID_RECORD_MODE_CHANED:
+ bundle = msg.getData();
+ setRecordingMode(bundle.getBoolean(OPTION));
+ break;
+
+ case FmRadioListener.MSGID_SAVERECORDING_FINISHED:
+ bundle = msg.getData();
+ saveRecording(bundle.getString(RECODING_FILE_NAME));
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ }
+
+ /**
+ * handle power down, execute power down and call back to activity.
+ */
+ private void handlePowerDown() {
+ Bundle bundle;
+ boolean isPowerdown = powerDown();
+ bundle = new Bundle(2);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.MSGID_POWERDOWN_FINISHED);
+ bundle.putBoolean(FmRadioListener.KEY_IS_POWER_DOWN, isPowerdown);
+ notifyActivityStateChanged(bundle);
+ }
+
+ /**
+ * handle power up, execute power up and call back to activity.
+ *
+ * @param bundle power up frequency
+ */
+ private void handlePowerUp(Bundle bundle) {
+ boolean isPowerup = false;
+ boolean isSwitch = true;
+ Log.d(TAG, "service handler power up start");
+ float curFrequency = bundle.getFloat(FM_FREQUENCY);
+
+ if (!SHORT_ANNTENNA_SUPPORT && !isAntennaAvailable()) {
+ Log.d(TAG, "call back to activity, earphone is not ready");
+ mIsPowerUping = false;
+ bundle = new Bundle(2);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.MSGID_SWITCH_ANNTENNA);
+ bundle.putBoolean(FmRadioListener.KEY_IS_SWITCH_ANNTENNA, false);
+ notifyActivityStateChanged(bundle);
+ return;
+ }
+
+ if (powerUpFm(curFrequency)) {
+ isPowerup = startPlayFm(curFrequency);
+ mPausedByTransientLossOfFocus = false;
+ }
+ mIsPowerUping = false;
+ bundle = new Bundle(2);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.MSGID_POWERUP_FINISHED);
+ bundle.putBoolean(FmRadioListener.KEY_IS_POWER_UP, isPowerup);
+ notifyActivityStateChanged(bundle);
+ Log.d(TAG, "service handler power up end");
+ }
+
+ /**
+ * check FM is foreground or background
+ */
+ public boolean isActivityForeground() {
+ boolean isForeground = true;
+ List<RunningAppProcessInfo> appProcessInfos = mActivityManager.getRunningAppProcesses();
+ for (RunningAppProcessInfo appProcessInfo : appProcessInfos) {
+ if (appProcessInfo.processName.equals(mContext.getPackageName())) {
+ int importance = appProcessInfo.importance;
+ Log.d(TAG, "isActivityForeground importance:" + importance);
+ if (importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND ||
+ importance == RunningAppProcessInfo.IMPORTANCE_VISIBLE) {
+ Log.d(TAG, "isActivityForeground is foreground");
+ isForeground = true;
+ } else {
+ Log.d(TAG, "isActivityForeground is background");
+ isForeground = false;
+ }
+ break;
+ }
+ }
+ Log.d(TAG, "isActivityForeground return " + isForeground);
+ return isForeground;
+ }
+
+ /**
+ * Check if current is lock task mode. If in this mode, AMS will cannot destory
+ * FmRadioActivity even call finish()
+ * Settings->Security->Screen pinning on
+ * @return true if current screen pinning on FmRadioActivity
+ */
+ public boolean isInLockTaskMode() {
+ Log.d(TAG, "isInLockTaskMode:" + mActivityManager.isInLockTaskMode());
+ return mActivityManager.isInLockTaskMode();
+ }
+
+ /**
+ * Get the recording sdcard path when staring record
+ *
+ * @return sdcard path like "/storage/sdcard0"
+ */
+ public static String getRecordingSdcard() {
+ return sRecordingSdcard;
+ }
+
+ /**
+ * The listener interface for exit
+ */
+ public interface OnExitListener {
+ /**
+ * When Service finish, should notify FmRadioFavorite to finish
+ */
+ void onExit();
+ }
+
+ /**
+ * Register the listener for exit
+ *
+ * @param listener The listener want to know the exit event
+ */
+ public static void registerExitListener(OnExitListener listener) {
+ sExitListener = listener;
+ }
+
+ /**
+ * Unregister the listener for exit
+ *
+ * @param listener The listener want to know the exit event
+ */
+ public static void unregisterExitListener(OnExitListener listener) {
+ sExitListener = null;
+ }
+
+ /**
+ * Get the latest recording name the show name in save dialog but saved in
+ * service
+ *
+ * @return The latest recording name or null for not modified
+ */
+ public String getModifiedRecordingName() {
+ Log.d(TAG, "getRecordingNameInDialog:" + mModifiedRecordingName);
+ return mModifiedRecordingName;
+ }
+
+ /**
+ * Set the latest recording name if modify the default name
+ *
+ * @param name The latest recording name or null for not modified
+ */
+ public void setModifiedRecordingName(String name) {
+ Log.d(TAG, "setRecordingNameInDialog:" + name);
+ mModifiedRecordingName = name;
+ }
+
+ /**
+ * When FmRadioActivity.onStop() set true, FmRadioActivity.onResume() set false;
+ * @param stop
+ */
+ public static void setActivityIsOnStop(boolean stop) {
+ sActivityIsOnStop = stop;
+ }
+
+ /**
+ * Check current is in call/ringtone or not
+ * @return true if is not call mode. false mean is in call or ringtone
+ */
+ public boolean isModeNormal() {
+ int mode = mAudioManager.getMode();
+ Log.d(TAG, "isInCall mode:" + mode);
+ return mode == AudioManager.MODE_NORMAL;
+ }
+
+ // FM Radio EM start
+ /**
+ * Inquiry if fm stereo mono(true, stereo; false mono)
+ *
+ * @return (true, stereo; false, mono)
+ */
+ public boolean getStereoMono() {
+ Log.d(TAG, "FMRadioService.getStereoMono");
+ return FmRadioNative.stereoMono();
+ }
+
+ /**
+ * Force set to stero/mono mode
+ *
+ * @param isMono
+ * (true, mono; false, stereo)
+ * @return (true, success; false, failed)
+ */
+ public boolean setStereoMono(boolean isMono) {
+ Log.d(TAG, "FMRadioService.setStereoMono: isMono=" + isMono);
+ return FmRadioNative.setStereoMono(isMono);
+ }
+
+ /**
+ * set RSSI, desense RSSI, mute gain soft
+ * @param index flag which will execute
+ * (0:rssi threshold,1:desense rssi threshold,2: SGM threshold)
+ * @param value send to native
+ * @return execute ok or not
+ */
+ public boolean setEmth(int index, int value) {
+ Log.d(TAG, ">>> FMRadioService.setEmth: index=" + index + ",value=" + value);
+ boolean isOk = FmRadioNative.emsetth(index, value);
+ Log.d(TAG, "<<< FMRadioService.setEmth: isOk=" + isOk);
+ return isOk;
+ }
+
+ /**
+ * send variables to native, and get some variables return.
+ * @param val send to native
+ * @return get value from native
+ */
+ public short[] emcmd(short[] val) {
+ Log.d(TAG, ">>FMRadioService.emcmd: val=" + val);
+ short[] shortCmds = null;
+ shortCmds = FmRadioNative.emcmd(val);
+ Log.d(TAG, "<<FMRadioService.emcmd:" + shortCmds);
+ return shortCmds;
+ }
+
+ /**
+ * Get hardware version not need async
+ */
+ public int[] getHardwareVersion() {
+ return FmRadioNative.getHardwareVersion();
+ }
+
+ /**
+ * Read cap array method not need async
+ */
+ public int getCapArray() {
+ Log.d(TAG, "FMRadioService.readCapArray");
+ if (!mIsPowerUp) {
+ Log.w(TAG, "FM is not powered up");
+ return -1;
+ }
+ return FmRadioNative.readCapArray();
+ }
+
+ /**
+ * Get rssi not need async
+ */
+ public int getRssi() {
+ Log.d(TAG, "FMRadioService.readRssi");
+ if (!mIsPowerUp) {
+ Log.w(TAG, "FM is not powered up");
+ return -1;
+ }
+ return FmRadioNative.readRssi();
+ }
+
+ /**
+ * read rds bler not need async
+ */
+ public int getRdsBler() {
+ Log.d(TAG, "FMRadioService.readRdsBler");
+ if (!mIsPowerUp) {
+ Log.w(TAG, "FM is not powered up");
+ return -1;
+ }
+ return FmRadioNative.readRdsBler();
+ }
+ // FM Radio EM end
+
+}
diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioService.java~ b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioService.java~
new file mode 100755
index 0000000..41a794f
--- /dev/null
+++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioService.java~
@@ -0,0 +1,2802 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2011-2014. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.fmradio;
+
+import android.app.ActivityManager;
+import android.app.ActivityManager.RunningAppProcessInfo;
+import android.app.Notification;
+import android.app.PendingIntent;
+import android.app.Service;
+import android.bluetooth.BluetoothA2dp;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothProfile;
+import android.content.BroadcastReceiver;
+import android.content.ContentProviderOperation;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.OperationApplicationException;
+import android.content.res.Configuration;
+import android.media.AudioManager;
+import android.media.AudioManager.OnAudioFocusChangeListener;
+import android.media.AudioSystem;
+import android.media.MediaPlayer;
+import android.net.Uri;
+import android.os.Binder;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.os.PowerManager;
+import android.os.PowerManager.WakeLock;
+import android.os.RemoteException;
+import android.util.Log;
+
+import com.mediatek.fmradio.FmRadioStation.Station;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+/* Vanzo:tanglei on: Sat, 14 Mar 2015 11:51:16 +0800
+ */
+//import com.android.featureoption.FeatureOption;
+// End of Vanzo:tanglei
+
+/**
+ * Background service to control FM or do background tasks.
+ */
+public class FmRadioService extends Service implements FmRecorder.OnRecorderStateChangedListener {
+ // Logging
+ private static final String TAG = "FmRx/Service";
+
+ // Broadcast messages from clients to FM service.
+ public static final String ACTION_TOFMSERVICE_POWERDOWN
+ = "com.mediatek.FMRadio.FMRadioService.ACTION_TOFMSERVICE_POWERDOWN";
+ // Broadcast messages to FM Tx service.
+ public static final String ACTION_TOFMTXSERVICE_POWERDOWN
+ = "com.mediatek.FMTransmitter.FMTransmitterService.ACTION_TOFMTXSERVICE_POWERDOWN";
+ // Broadcast messages to mATV service.
+ public static final String ACTION_TOATVSERVICE_POWERDOWN
+ = "com.mediatek.app.mtv.ACTION_REQUEST_SHUTDOWN";
+ // Broadcast messages to music service.
+ public static final String ACTION_TOMUSICSERVICE_POWERDOWN
+ = "com.android.music.musicservicecommand.pause";
+ // Broadcast messages from mATV service.
+ public static final String ACTION_FROMATVSERVICE_POWERUP = "com.mediatek.app.mtv.POWER_ON";
+
+ // Broadcast messages from other sounder APP to FM service
+ private static final String SOUND_POWER_DOWN_MSG = "com.android.music.musicservicecommand";
+ private static final String CMDPAUSE = "pause";
+
+ // HandlerThread Keys
+ private static final String FM_FREQUENCY = "frequency";
+ private static final String OPTION = "option";
+ private static final String RECODING_FILE_NAME = "name";
+
+ // RDS events
+ // PS
+ private static final int RDS_EVENT_PROGRAMNAME = 0x0008;
+ // RT
+ private static final int RDS_EVENT_LAST_RADIOTEXT = 0x0040;
+ // AF
+ private static final int RDS_EVENT_AF = 0x0080;
+
+ // Headset
+ private static final int HEADSET_PLUG_IN = 1;
+ // Short antenna support
+ private static final boolean SHORT_ANNTENNA_SUPPORT = FmRadioUtils.isFmShortAntennaSupport();
+
+ // Notification id
+ private static final int NOTIFICATION_ID = 1;
+
+ // Set audio policy for FM
+ // should check AUDIO_POLICY_FORCE_FOR_MEDIA in audio_policy.h
+ private static final int FOR_PROPRIETARY = 1;
+ // Forced Use value
+ private int mForcedUseForMedia;
+
+ // TX and RX interaction
+ private static final int CURRENT_RX_ON = 0;
+ private static final int CURRENT_TX_ON = 1;
+ private static final int CURRENT_TX_SCAN = 2;
+
+ // FM recorder
+ FmRecorder mFmRecorder = null;
+ private BroadcastReceiver mSdcardListener = null;
+ private int mRecordState = FmRecorder.STATE_INVALID;
+ private int mRecorderErrorType = -1;
+ // If eject record sdcard, should set Value false to not record.
+ // Key is sdcard path(like "/storage/sdcard0"), V is to enable record or
+ // not.
+ private HashMap<String, Boolean> mSdcardStateMap = new HashMap<String, Boolean>();
+ // The show name in save dialog but saved in service
+ // If modify the save title it will be not null, otherwise it will be null
+ private String mModifiedRecordingName = null;
+ // record the listener list, will notify all listener in list
+ private ArrayList<Record> mRecords = new ArrayList<Record>();
+ // record FM whether in recording mode
+ private boolean mIsInRecordingMode = false;
+ // record sd card path when start recording
+ private static String sRecordingSdcard = FmRadioUtils.getDefaultStoragePath();
+
+ // RDS
+ // PS String
+ private String mPSString = "";
+ // RT String
+ private String mLRTextString = "";
+ // PS RT
+ private boolean mIsPSRTEnabled = false;
+ // AF
+ private boolean mIsAFEnabled = false;
+ // RDS thread use to receive the information send by station
+ private Thread mRdsThread = null;
+ // record whether RDS thread exit
+ private boolean mIsRdsThreadExit = false;
+
+ // State variables
+ // Record whether FM is in native scan state
+ private boolean mIsNativeScanning = false;
+ // Record whether FM is in scan thread
+ private boolean mIsScanning = false;
+ // Record whether FM is in seeking state
+ private boolean mIsNativeSeeking = false;
+ // Record whether FM is in native seek
+ private boolean mIsSeeking = false;
+ // Record whether searching progress is canceled
+ private boolean mIsStopScanCalled = false;
+ // Record whether is speaker used
+ private boolean mIsSpeakerUsed = false;
+ // Record whether device is open
+ private boolean mIsDeviceOpen = false;
+ // Record whether FM is power up
+ private boolean mIsPowerUp = false;
+ // Record whether is power uping, if so, should judge in activity back key.
+ private boolean mIsPowerUping = false;
+ // Record whether service is init
+ private boolean mIsServiceInited = false;
+ // Fm power down by loss audio focus,should make power down menu item can
+ // click
+ private boolean mIsMakePowerDown = false;
+
+ // Instance variables
+ private Context mContext = null;
+ private AudioManager mAudioManager = null;
+ private ActivityManager mActivityManager = null;
+ private MediaPlayer mFmPlayer = null;
+ private WakeLock mWakeLock = null;
+ // Audio focus is held or not
+ private boolean mIsAudioFocusHeld = false;
+ // Focus transient lost
+ private boolean mPausedByTransientLossOfFocus = false;
+ private int mCurrentStation = FmRadioUtils.DEFAULT_STATION;
+ // Headset plug state (0:long antenna plug in, 1:long antenna plug out)
+ private int mValueHeadSetPlug = 1;
+ // For bind service
+ private final IBinder mBinder = new ServiceBinder();
+ // Broadcast to receive the external event
+ private FmServiceBroadcastReceiver mBroadcastReceiver = null;
+ // Async handler
+ private FmRadioServiceHandler mFmServiceHandler;
+ // Lock for lose audio focus and receive SOUND_POWER_DOWN_MSG
+ // at the same time
+ // while recording call stop recording not finished(status is still
+ // RECORDING), but
+ // SOUND_POWER_DOWN_MSG will exitFm(), if it is RECORDING will discard the
+ // record.
+ // 1. lose audio focus -> stop recording(lock) -> set to IDLE and show save
+ // dialog
+ // 2. exitFm() -> check the record status, discard it if it is recording
+ // status(lock)
+ // Add this lock the exitFm() while stopRecording()
+ private Object mStopRecordingLock = new Object();
+ // The listener for exit, should finish favorite when exit FM
+ private static OnExitListener sExitListener = null;
+ // Record FmRadioActivity state
+ private static boolean sActivityIsOnStop = false;
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ Log.d(TAG, "FmRadioService.onBind: " + intent);
+ return mBinder;
+ }
+
+ /**
+ * class use to return service instance
+ */
+ public class ServiceBinder extends Binder {
+ /**
+ * get FM service instance
+ *
+ * @return service instance
+ */
+ FmRadioService getService() {
+ return FmRadioService.this;
+ }
+ }
+
+ /**
+ * Broadcast monitor external event, Other app want FM stop, Phone shut
+ * down, screen state, headset state
+ */
+ private class FmServiceBroadcastReceiver extends BroadcastReceiver {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Log.d(TAG, ">>> FmRadioService.onReceive");
+ String action = intent.getAction();
+ String command = intent.getStringExtra("command");
+ Log.d(TAG, "Action/Command: " + action + " / " + command);
+ // other app want FM stop, stop FM
+ if (ACTION_TOFMSERVICE_POWERDOWN.equals(action)
+ || ACTION_FROMATVSERVICE_POWERUP.equals(action)
+ || (SOUND_POWER_DOWN_MSG.equals(action) && CMDPAUSE.equals(command))) {
+ // need remove all messages, make power down will be execute
+ mFmServiceHandler.removeCallbacksAndMessages(null);
+
+ Log.d(TAG, "onReceive.SOUND_POWER_DOWN_MSG. exit FM");
+ exitFm();
+ stopSelf();
+ // phone shut down, so exit FM
+ } else if (Intent.ACTION_SHUTDOWN.equals(action)) {
+ /**
+ * here exitFm, system will send broadcast, system will shut
+ * down, so fm does not need call back to activity
+ */
+ mFmServiceHandler.removeCallbacksAndMessages(null);
+ exitFm();
+ // screen on, if FM play, open rds
+ } else if (Intent.ACTION_SCREEN_ON.equals(action)) {
+
+ setRdsAsync(true);
+ // screen off, if FM play, close rds
+ } else if (Intent.ACTION_SCREEN_OFF.equals(action)) {
+ setRdsAsync(false);
+ // switch antenna when headset plug in or plug out
+ } else if (Intent.ACTION_HEADSET_PLUG.equals(action)) {
+ // switch antenna should not impact audio focus status
+ mValueHeadSetPlug = (intent.getIntExtra("state", -1) == HEADSET_PLUG_IN) ? 0 : 1;
+ switchAntennaAsync(mValueHeadSetPlug);
+
+ if (SHORT_ANNTENNA_SUPPORT) {
+ boolean isSwitch = (switchAntenna(mValueHeadSetPlug) == 0) ? true : false;
+ Log.d(TAG, "onReceive.switch anntenna:isWitch:" + isSwitch);
+
+ // Plug out->Speaker Mode; Plug in->Earphone Mode
+ boolean plugInEarphone = (0 == mValueHeadSetPlug);
+ // Need check to switch to earphone mode for audio will
+ // change to AudioSystem.FORCE_NONE
+ if (plugInEarphone) {
+ mForcedUseForMedia = AudioSystem.FORCE_NONE;
+ mIsSpeakerUsed = false;
+ }
+ //setSpeakerPhoneOn(!plugInEarphone);
+ // Notify UI change to earphone mode, false means not speaker mode
+ Bundle bundle = new Bundle(2);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG,
+ FmRadioListener.LISTEN_SPEAKER_MODE_CHANGED);
+ bundle.putBoolean(FmRadioListener.KEY_IS_SPEAKER_MODE, !plugInEarphone);
+ notifyActivityStateChanged(bundle);
+
+ powerUpAutoIfNeed();
+ } else {
+ // Avoid Service is killed,and receive headset plug in
+ // broadcast again
+ if (!mIsServiceInited) {
+ Log.d(TAG, "onReceive.switch anntenna:service is not init");
+ powerUpAutoIfNeed();
+ return;
+ }
+ /*
+ * If ear phone insert and activity is
+ * foreground. power up FM automatic
+ */
+ if ((0 == mValueHeadSetPlug) && isActivityForeground()) {
+ Log.d(TAG, "onReceive.switch anntenna:need auto power up");
+ powerUpAsync(FmRadioUtils.computeFrequency(mCurrentStation));
+ } else if (1 == mValueHeadSetPlug) {
+ Log.d(TAG, "plug out earphone, need to stop fm");
+ // ALPS01687760 Avoid sound from speaker after plug out earphone when recording
+ // plug out earphone will power down or exit, need to mute first anyway
+ setMute(true);
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SCAN_FINISHED);
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SEEK_FINISHED);
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_TUNE_FINISHED);
+ mFmServiceHandler.removeMessages(
+ FmRadioListener.MSGID_POWERDOWN_FINISHED);
+ mFmServiceHandler.removeMessages(
+ FmRadioListener.MSGID_POWERUP_FINISHED);
+ stopFmFocusLoss(AudioManager.AUDIOFOCUS_LOSS);
+
+ // Need check to switch to earphone mode for audio will
+ // change to AudioSystem.FORCE_NONE
+ setSpeakerPhoneOn(false);
+
+ // Notify UI change to earphone mode, false means not speaker mode
+ Bundle bundle = new Bundle(2);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG,
+ FmRadioListener.LISTEN_SPEAKER_MODE_CHANGED);
+ bundle.putBoolean(FmRadioListener.KEY_IS_SPEAKER_MODE, false);
+ notifyActivityStateChanged(bundle);
+ }
+ }
+
+ } else if (BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED.equals(action)) {
+ int connectState = intent.getIntExtra(BluetoothA2dp.EXTRA_STATE, 0);
+ Log.d(TAG, "ACTION_CONNECTION_STATE_CHANGED: connectState=" + connectState + ", ispowerup="
+ + mIsPowerUp);
+ handleBtConnectState(connectState);
+/* Vanzo:tanglei on: Fri, 13 Mar 2015 21:26:14 +0800
+ * earphone key action
+ */
+ } //else if (FeatureOption.VANZO_FEATURE_EARPHONE_KEY_ACTION && "com.mediatek.FMRadio.FMRadioService.NEXT_STATION".equals(action)) {
+ //seekStationAsync(FmRadioUtils.computeFrequency(mCurrentStation), true);
+// End of Vanzo:tanglei
+ //}
+ else {
+ Log.w(TAG, "Error: undefined action.");
+ }
+ Log.d(TAG, "<<< FmRadioService.onReceive");
+ }
+ }
+
+ /**
+ * ALPS01756692 No sound after click FM app and power key
+ * Need to power up auto for two cases:
+ * case 1: Launcher click FM app, then quickly click Power key to lock phone.
+ * case 2: Launcher click FM app, then quickly click Home key.
+ * Because power up action is in FmRadioActivity.onServiceConnected(), these two cases
+ * will not callback onServiceConnected() cause FmRadioActivity.onStop() has called unbind()
+ */
+ private void powerUpAutoIfNeed() {
+ if ((0 == mValueHeadSetPlug)) {
+ if (!mIsPowerUping && !mIsPowerUp && sActivityIsOnStop) {
+ Log.w(TAG, "Power up for start app then quick click power/home");
+ int iCurrentStation = FmRadioStation.getCurrentStation(mContext);
+ powerUpAsync(FmRadioUtils.computeFrequency(iCurrentStation));
+ }
+ }
+ }
+
+ /**
+ * handle FM over BT connect state
+ *
+ * @param connectState
+ * FM over BT connect state
+ */
+ private void handleBtConnectState(int connectState) {
+ if (!mIsPowerUp) {
+ return;
+ }
+
+ switch (connectState) {
+ case BluetoothA2dp.STATE_CONNECTED:
+ //case BluetoothA2dp.STATE_PLAYING:
+ //case BluetoothA2dp.STATE_CONNECTING:
+ Log.d(TAG, "handleBtConnectState bt connected");
+ changeToEarphoneMode();
+ break;
+ case BluetoothA2dp.STATE_DISCONNECTED:
+ //case BluetoothA2dp.STATE_DISCONNECTING:
+ Log.d(TAG, "handleBtConnectState bt disconnected");
+ changeToEarphoneMode();
+ break;
+ default:
+ Log.d(TAG, "invalid fm over bt connect state");
+ break;
+ }
+
+
+ }
+
+ private void changeToEarphoneMode() {
+ setSpeakerPhoneOn(false);
+ // Notify UI change to earphone mode, false means not speaker mode
+ Bundle bundle = new Bundle(2);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG,
+ FmRadioListener.LISTEN_SPEAKER_MODE_CHANGED);
+ // Always set to earphone mode when bt is connected or disconnected
+ bundle.putBoolean(FmRadioListener.KEY_IS_SPEAKER_MODE, false);
+ notifyActivityStateChanged(bundle);
+ }
+
+ /**
+ * Check if BT is connected
+ * @return true if current is playing with BT earphone
+ */
+ public boolean isBtConnected() {
+ BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();
+ Log.d(TAG, "isBtConnected headset:"
+ + btAdapter.getProfileConnectionState(BluetoothProfile.HEADSET)
+ + ", a2dp:" + btAdapter.getProfileConnectionState(BluetoothProfile.A2DP));
+ int a2dpState = btAdapter.getProfileConnectionState(BluetoothProfile.HEADSET);
+ return (BluetoothProfile.STATE_CONNECTED == a2dpState
+ || BluetoothProfile.STATE_CONNECTING == a2dpState);
+ }
+
+ /**
+ * Handle sdcard mount/unmount event. 1. Update the sdcard state map 2. If
+ * the recording sdcard is unmounted, need to stop and notify
+ */
+ private class SdcardListener extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ // If eject record sdcard, should set this false to not
+ // record.
+ updateSdcardStateMap(intent);
+
+ if (mFmRecorder == null) {
+ Log.w(TAG, "SD receiver: FMRecorder is not present!!");
+ return;
+ }
+
+ String action = intent.getAction();
+ if (Intent.ACTION_MEDIA_EJECT.equals(action) ||
+ Intent.ACTION_MEDIA_UNMOUNTED.equals(action)) {
+ // If not unmount recording sd card, do nothing;
+ if (isRecordingCardUnmount(intent)) {
+ Log.v(TAG, "MEDIA_EJECT");
+ if (mFmRecorder.getState() == FmRecorder.STATE_RECORDING) {
+ Log.d(TAG, "old state is recording");
+ onRecorderError(FmRecorder.ERROR_SDCARD_NOT_PRESENT);
+ mFmRecorder.discardRecording();
+ } else {
+ Bundle bundle = new Bundle(2);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG,
+ FmRadioListener.LISTEN_RECORDSTATE_CHANGED);
+ bundle.putInt(FmRadioListener.KEY_RECORDING_STATE,
+ FmRecorder.STATE_IDLE);
+ notifyActivityStateChanged(bundle);
+ }
+ }
+ return;
+ }
+ }
+ }
+
+ /**
+ * whether antenna available
+ *
+ * @return true, antenna available; false, antenna not available
+ */
+ public boolean isAntennaAvailable() {
+ return mAudioManager.isWiredHeadsetOn();
+ }
+
+ /**
+ * Set FM audio from speaker or not
+ *
+ * @param isSpeaker true if set FM audio from speaker
+ */
+ public void setSpeakerPhoneOn(boolean isSpeaker) {
+ Log.d(TAG, ">>> FmRadioService.useSpeaker: " + isSpeaker);
+ mForcedUseForMedia = isSpeaker ? AudioSystem.FORCE_SPEAKER : AudioSystem.FORCE_NONE;
+ AudioSystem.setForceUse(FOR_PROPRIETARY, mForcedUseForMedia);
+ mIsSpeakerUsed = isSpeaker;
+ Log.d(TAG, "<<< FmRadioService.useSpeaker");
+ }
+
+ private boolean isSpeakerPhoneOn() {
+ return (mForcedUseForMedia == AudioSystem.FORCE_SPEAKER);
+ }
+
+ /**
+ * open FM device, should be call before power up
+ *
+ * @return true if FM device open, false FM device not open
+ */
+ private boolean openDevice() {
+ Log.d(TAG, ">>> FmRadioService.openDevice");
+ if (!mIsDeviceOpen) {
+ mIsDeviceOpen = FmRadioNative.openDev();
+ }
+ Log.d(TAG, "<<< FmRadioService.openDevice: " + mIsDeviceOpen);
+ return mIsDeviceOpen;
+ }
+
+ /**
+ * close FM device
+ *
+ * @return true if close FM device success, false close FM device failed
+ */
+ private boolean closeDevice() {
+ Log.d(TAG, ">>> FmRadioService.closeDevice");
+ boolean isDeviceClose = false;
+ if (mIsDeviceOpen) {
+ isDeviceClose = FmRadioNative.closeDev();
+ mIsDeviceOpen = !isDeviceClose;
+ }
+ Log.d(TAG, "<<< FmRadioService.closeDevice: " + isDeviceClose);
+
+ // quit looper
+ mFmServiceHandler.getLooper().quit();
+ return isDeviceClose;
+ }
+
+ /**
+ * get FM device opened or not
+ *
+ * @return true FM device opened, false FM device closed
+ */
+ public boolean isDeviceOpen() {
+ Log.d(TAG, "FmRadioService.isDeviceOpen: " + mIsDeviceOpen);
+ return mIsDeviceOpen;
+ }
+
+ /**
+ * power up FM, and make FM voice output from earphone
+ *
+ * @param frequency
+ */
+ public void powerUpAsync(float frequency) {
+ mIsPowerUping = true;
+ final int bundleSize = 1;
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_POWERUP_FINISHED);
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_POWERDOWN_FINISHED);
+ Bundle bundle = new Bundle(bundleSize);
+ bundle.putFloat(FM_FREQUENCY, frequency);
+ Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_POWERUP_FINISHED);
+ msg.setData(bundle);
+ mFmServiceHandler.sendMessage(msg);
+ }
+
+ private boolean powerUpFm(float frequency) {
+ Log.d(TAG, ">>> FmRadioService.powerUp: " + frequency);
+ if (mIsPowerUp) {
+ Log.d(TAG, "<<< FmRadioService.powerUp: already power up:" + mIsPowerUp);
+ return true;
+ }
+
+ if (!requestAudioFocus()) {
+ // activity used for update powerdown menu
+ mIsMakePowerDown = true;
+ Log.d(TAG, "FM can't get audio focus when power up");
+ sendBroadcastToStopOtherAPP();
+ return false;
+ }
+
+ // if device open fail when chip reset, it need open device again before
+ // power up
+ if (!mIsDeviceOpen) {
+ openDevice();
+ }
+
+ waitIfTxSearching();
+ Log.d(TAG, "set CURRENT_RX_ON true, CURRENT_TX_ON false");
+ FmRadioNative.setFmStatus(CURRENT_RX_ON, true);
+ FmRadioNative.setFmStatus(CURRENT_TX_ON, false);
+ sendBroadcastToStopOtherAPP();
+
+ Log.d(TAG, "service native power up start");
+ if (!FmRadioNative.powerUp(frequency)) {
+ Log.e(TAG, "Error: powerup failed.");
+ return false;
+ }
+ Log.d(TAG, "service native power up end");
+ mIsPowerUp = true;
+ // need mute after power up
+ setMute(true);
+
+ // activity used for update powerdown menu
+ mIsMakePowerDown = false;
+ Log.d(TAG, "<<< FmRadioService.powerUp: " + mIsPowerUp);
+ return mIsPowerUp;
+ }
+
+ // wait if TX is searching for timing issue
+ private void waitIfTxSearching() {
+ Log.d(TAG, ">>> waitIfTxSearching " + FmRadioNative.getFmStatus(CURRENT_TX_SCAN));
+ long start = System.currentTimeMillis();
+ // true for TX is searching
+ while (FmRadioNative.getFmStatus(CURRENT_TX_SCAN) == true) {
+ if (System.currentTimeMillis() - start > 5000) {
+ Log.e(TAG, "waitIfTxSearching timeout");
+ break;
+ }
+ try {
+ Thread.sleep(100);
+ } catch (Exception e) {
+ }
+ }
+ Log.d(TAG, "<<< waitIfTxSearching");
+ }
+
+ private boolean startPlayFm(float frequency) {
+ Log.d(TAG, ">>> FmRadioService.initDevice: " + frequency);
+
+ mCurrentStation = FmRadioUtils.computeStation(frequency);
+ FmRadioStation.setCurrentStation(mContext, mCurrentStation);
+ // Add notification to the title bar.
+ showNotification();
+
+ // Start the RDS thread if RDS is supported.
+ if (isRdsSupported()) {
+ Log.d(TAG, "RDS is supported. Start the RDS thread.");
+ startRdsThread();
+ }
+
+ if (!FmRadioUtils.isFmSuspendSupport()) {
+ if (!mWakeLock.isHeld()) {
+ mWakeLock.acquire();
+ Log.d(TAG, "acquire wake lock");
+ }
+ }
+ if (mIsSpeakerUsed != isSpeakerPhoneOn()) {
+ setSpeakerPhoneOn(mIsSpeakerUsed);
+ }
+ if (mRecordState != FmRecorder.STATE_PLAYBACK) {
+ enableFmAudio(true);
+ }
+
+ setRds(true);
+ setMute(false);
+
+ Log.d(TAG, "<<< FmRadioService.initDevice: " + mIsPowerUp);
+ return mIsPowerUp;
+ }
+
+ /**
+ * send broadcast to stop other application, such as music, MATV,
+ * FMTransmitter
+ */
+ private void sendBroadcastToStopOtherAPP() {
+ Intent intentToMusic = new Intent(ACTION_TOMUSICSERVICE_POWERDOWN);
+ sendBroadcast(intentToMusic);
+ Intent intentToAtv = new Intent(ACTION_TOATVSERVICE_POWERDOWN);
+ sendBroadcast(intentToAtv);
+ Intent intentToFMTx = new Intent(ACTION_TOFMTXSERVICE_POWERDOWN);
+ sendBroadcast(intentToFMTx);
+ }
+
+ /**
+ * power down FM
+ */
+ public void powerDownAsync() {
+ // if power down Fm, should remove message first.
+ // not remove all messages, because such as recorder message need
+ // to execute after or before power down
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SCAN_FINISHED);
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SEEK_FINISHED);
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_TUNE_FINISHED);
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_POWERDOWN_FINISHED);
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_POWERUP_FINISHED);
+ mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_POWERDOWN_FINISHED);
+ }
+
+ /**
+ * Power down FM
+ *
+ * @return true if power down success
+ */
+ private boolean powerDown() {
+ Log.d(TAG, ">>> FmRadioService.powerDown");
+ if (!mIsPowerUp) {
+ Log.w(TAG, "Error: device is already power down.");
+ return true;
+ }
+
+ setMute(true);
+ setRds(false);
+ enableFmAudio(false);
+
+ // Only need to power down if RX status in native is ON
+ // If TX is on, so need power down(TX is using).
+ boolean isRxOn = FmRadioNative.getFmStatus(CURRENT_RX_ON);
+ boolean powerDownSuccess = false;
+ if (isRxOn) {
+ powerDownSuccess = FmRadioNative.powerDown(0);
+ } else {
+ powerDownSuccess = true;
+ }
+
+ if (!powerDownSuccess) {
+ Log.e(TAG, "Error: powerdown failed.");
+ // activity used for update powerdown menu
+ mIsMakePowerDown = true;
+
+ if (isRdsSupported()) {
+ Log.d(TAG, "RDS is supported. Stop the RDS thread.");
+ stopRdsThread();
+ }
+ mIsPowerUp = false;
+ if (mWakeLock.isHeld()) {
+ mWakeLock.release();
+ Log.d(TAG, "release wake lock");
+ }
+ // Remove the notification in the title bar.
+ removeNotification();
+ Log.d(TAG, "powerdown failed.release some resource.");
+ return false;
+ }
+ // activity used for update powerdown menu
+ mIsMakePowerDown = true;
+
+ if (isRdsSupported()) {
+ Log.d(TAG, "RDS is supported. Stop the RDS thread.");
+ stopRdsThread();
+ }
+ mIsPowerUp = false;
+
+ if (mWakeLock.isHeld()) {
+ mWakeLock.release();
+ Log.d(TAG, "release wake lock");
+ }
+
+ // Remove the notification in the title bar.
+ removeNotification();
+ Log.d(TAG, "<<< FmRadioService.powerDown: true");
+ return true;
+ }
+
+ /**
+ * Check whether FM is power up
+ *
+ * @return true, power up; false, power down.
+ */
+ public boolean isPowerUp() {
+ Log.d(TAG, "FmRadioService.isPowerUp: " + mIsPowerUp);
+ return mIsPowerUp;
+ }
+
+ /**
+ * Check whether FM is power uping. if power uping, activity should call
+ * super.onBackPressed, avoid not execute power down method.
+ *
+ * @return true, power up; false, power down.
+ */
+ public boolean isPowerUping() {
+ Log.d(TAG, "FmRadioService.isPowerUping: " + mIsPowerUping);
+ return mIsPowerUping;
+ }
+
+ /**
+ * Check whether FM is power down by other app.
+ *
+ * @return true, power down; true.
+ */
+ public boolean isMakePowerDown() {
+ Log.d(TAG, "FmRadioService.mIsMakePowerDown: " + mIsMakePowerDown);
+ return mIsMakePowerDown;
+ }
+
+ /**
+ * Tune to a station
+ *
+ * @param frequency The frequency to tune
+ *
+ * @return true, success; false, fail.
+ */
+ public void tuneStationAsync(float frequency) {
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_TUNE_FINISHED);
+ final int bundleSize = 1;
+ Bundle bundle = new Bundle(bundleSize);
+ bundle.putFloat(FM_FREQUENCY, frequency);
+ Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_TUNE_FINISHED);
+ msg.setData(bundle);
+ mFmServiceHandler.sendMessage(msg);
+ }
+
+ private boolean tuneStation(float frequency) {
+ Log.d(TAG, ">>> FmRadioService.tune: " + frequency);
+ if (mIsPowerUp) {
+ setRds(false);
+ Log.d(TAG, "FmRadioService.native tune start");
+ boolean bRet = FmRadioNative.tune(frequency);
+ Log.d(TAG, "FmRadioService.native tune end");
+ if (bRet) {
+ setRds(true);
+ mCurrentStation = FmRadioUtils.computeStation(frequency);
+ FmRadioStation.setCurrentStation(mContext, mCurrentStation);
+ updateNotification();
+ }
+ setMute(false);
+ Log.d(TAG, "<<< FmRadioService.tune: " + bRet);
+ return bRet;
+ }
+
+ // if not support short Antenna and earphone is not insert, not power up
+ if (!isAntennaAvailable() && !SHORT_ANNTENNA_SUPPORT) {
+ Log.d(TAG, "earphone is not insert and short antenna not support");
+ return false;
+ }
+
+ // if not power up yet, should powerup first
+ Log.w(TAG, "FM is not powered up");
+ mIsPowerUping = true;
+ boolean tune = false;
+
+ if (powerUpFm(frequency)) {
+ tune = startPlayFm(frequency);
+ }
+ mIsPowerUping = false;
+ Log.d(TAG, "<<< FmRadioService.tune: mIsPowerup:" + tune);
+ return tune;
+ }
+
+ /**
+ * Seek station according frequency and direction
+ *
+ * @param frequency start frequency(100KHZ, 87.5)
+ * @param isUp direction(true, next station; false, previous station)
+ *
+ * @return the frequency after seek
+ */
+ public void seekStationAsync(float frequency, boolean isUp) {
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SEEK_FINISHED);
+ final int bundleSize = 2;
+ Bundle bundle = new Bundle(bundleSize);
+ bundle.putFloat(FM_FREQUENCY, frequency);
+ bundle.putBoolean(OPTION, isUp);
+ Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_SEEK_FINISHED);
+ msg.setData(bundle);
+ mFmServiceHandler.sendMessage(msg);
+ }
+
+ private float seekStation(float frequency, boolean isUp) {
+ Log.d(TAG, ">>> FmRadioService.seek: " + frequency + " " + isUp);
+ if (!mIsPowerUp) {
+ Log.w(TAG, "FM is not powered up");
+ return -1;
+ }
+
+ setRds(false);
+ mIsNativeSeeking = true;
+ float fRet = FmRadioNative.seek(frequency, isUp);
+ mIsNativeSeeking = false;
+ // make mIsStopScanCalled false, avoid stop scan make this true,
+ // when start scan, it will return null.
+ mIsStopScanCalled = false;
+ Log.d(TAG, "<<< FmRadioService.seek: " + fRet);
+ return fRet;
+ }
+
+ /**
+ * Scan stations
+ */
+ public void startScanAsync() {
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SCAN_FINISHED);
+ mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_SCAN_FINISHED);
+ }
+
+ private int[] startScan() {
+ Log.d(TAG, ">>> FmRadioService.startScan");
+ int[] iChannels = null;
+
+ setRds(false);
+ setMute(true);
+ short[] shortChannels = null;
+ if (!mIsStopScanCalled) {
+ mIsNativeScanning = true;
+ Log.d(TAG, "startScan native method:start");
+ shortChannels = FmRadioNative.autoScan();
+ Log.d(TAG, "startScan native method:end " + Arrays.toString(shortChannels));
+ mIsNativeScanning = false;
+ }
+
+ setRds(true);
+ if (mIsStopScanCalled) {
+ // Received a message to power down FM, or interrupted by a phone
+ // call. Do not return any stations. shortChannels = null;
+ // if cancel scan, return invalid station -100
+ shortChannels = new short[] {
+ -100
+ };
+ mIsStopScanCalled = false;
+ }
+
+ if (null != shortChannels) {
+ int size = shortChannels.length;
+ iChannels = new int[size];
+ for (int i = 0; i < size; i++) {
+ iChannels[i] = shortChannels[i];
+ }
+ }
+ Log.d(TAG, "<<< FmRadioService.startScan: " + Arrays.toString(iChannels));
+ return iChannels;
+ }
+
+ /**
+ * Check FM Radio is in scan progress or not
+ *
+ * @return if in scan progress return true, otherwise return false.
+ */
+ public boolean isScanning() {
+ return mIsScanning;
+ }
+
+ /**
+ * Stop scan progress
+ *
+ * @return true if can stop scan, otherwise return false.
+ */
+ public boolean stopScan() {
+ Log.d(TAG, ">>> FmRadioService.stopScan");
+ if (!mIsPowerUp) {
+ Log.w(TAG, "FM is not powered up");
+ return false;
+ }
+
+ boolean bRet = false;
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SCAN_FINISHED);
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SEEK_FINISHED);
+ if (mIsNativeScanning || mIsNativeSeeking) {
+ mIsStopScanCalled = true;
+ Log.d(TAG, "native stop scan:start");
+ bRet = FmRadioNative.stopScan();
+ Log.d(TAG, "native stop scan:end --" + bRet);
+ }
+ Log.d(TAG, "<<< FmRadioService.stopScan: " + bRet);
+ return bRet;
+ }
+
+ /**
+ * Check FM is in seek progress or not
+ *
+ * @return true if in seek progress, otherwise return false.
+ */
+ public boolean isSeeking() {
+ return mIsNativeSeeking;
+ }
+
+ /**
+ * Set RDS
+ *
+ * @param on true, enable RDS; false, disable RDS.
+ */
+ public void setRdsAsync(boolean on) {
+ final int bundleSize = 1;
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SET_RDS_FINISHED);
+ Bundle bundle = new Bundle(bundleSize);
+ bundle.putBoolean(OPTION, on);
+ Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_SET_RDS_FINISHED);
+ msg.setData(bundle);
+ mFmServiceHandler.sendMessage(msg);
+ }
+
+ private int setRds(boolean on) {
+ if (!mIsPowerUp) {
+ return -1;
+ }
+ Log.d(TAG, ">>> FmRadioService.setRDS: " + on);
+ int ret = -1;
+ if (isRdsSupported()) {
+ ret = FmRadioNative.setRds(on);
+ }
+ setPS("");
+ setLRText("");
+ Log.d(TAG, "<<< FmRadioService.setRDS: " + ret);
+ return ret;
+ }
+
+ /**
+ * Get PS information
+ *
+ * @return PS information
+ */
+ public String getPS() {
+ Log.d(TAG, "FmRadioService.getPS: " + mPSString);
+ return mPSString;
+ }
+
+ /**
+ * Get RT information
+ *
+ * @return RT information
+ */
+ public String getLRText() {
+ Log.d(TAG, "FmRadioService.getLRText: " + mLRTextString);
+ return mLRTextString;
+ }
+
+ /**
+ * Get AF frequency
+ *
+ * @return AF frequency
+ */
+ public void activeAFAsync() {
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_ACTIVE_AF_FINISHED);
+ mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_ACTIVE_AF_FINISHED);
+ }
+
+ private int activeAF() {
+ if (!mIsPowerUp) {
+ Log.w(TAG, "FM is not powered up");
+ return -1;
+ }
+
+ int frequency = FmRadioNative.activeAf();
+ Log.d(TAG, "FmRadioService.activeAF: " + frequency);
+ return frequency;
+ }
+
+ /**
+ * Mute or unmute FM voice
+ *
+ * @param mute true for mute, false for unmute
+ *
+ * @return (true, success; false, failed)
+ */
+ public void setMuteAsync(boolean mute) {
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SET_MUTE_FINISHED);
+ final int bundleSize = 1;
+ Bundle bundle = new Bundle(bundleSize);
+ bundle.putBoolean(OPTION, mute);
+ Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_SET_MUTE_FINISHED);
+ msg.setData(bundle);
+ mFmServiceHandler.sendMessage(msg);
+ }
+
+ private int setMute(boolean mute) {
+ if (!mIsPowerUp) {
+ Log.w(TAG, "FM is not powered up");
+ return -1;
+ }
+ Log.d(TAG, ">>> FmRadioService.setMute: " + mute);
+ int iRet = FmRadioNative.setMute(mute);
+ Log.d(TAG, "<<< FmRadioService.setMute: " + iRet);
+ return iRet;
+ }
+
+ /**
+ * Check whether RDS is support in driver
+ *
+ * @return (true, support; false, not support)
+ */
+ public boolean isRdsSupported() {
+ boolean isRdsSupported = (FmRadioNative.isRdsSupport() == 1);
+ Log.d(TAG, "FmRadioService.isRdsSupported: " + isRdsSupported);
+ return isRdsSupported;
+ }
+
+ /**
+ * Check whether speaker used or not
+ *
+ * @return true if use speaker, otherwise return false
+ */
+ public boolean isSpeakerUsed() {
+ Log.d(TAG, "FmRadioService.isSpeakerUsed: " + mIsSpeakerUsed);
+ return mIsSpeakerUsed;
+ }
+
+ /**
+ * Initial service and current station
+ *
+ * @param iCurrentStation current station frequency
+ */
+ public void initService(int iCurrentStation) {
+ Log.d(TAG, "FmRadioService.initService: " + iCurrentStation);
+ mIsServiceInited = true;
+ mCurrentStation = iCurrentStation;
+ }
+
+ /**
+ * Check service is initialed or not
+ *
+ * @return true if initialed, otherwise return false
+ */
+ public boolean isServiceInited() {
+ Log.d(TAG, "FmRadioService.isServiceInit: " + mIsServiceInited);
+ return mIsServiceInited;
+ }
+
+ /**
+ * Get FM service current station frequency
+ *
+ * @return Current station frequency
+ */
+ public int getFrequency() {
+ Log.d(TAG, "FmRadioService.getFrequency: " + mCurrentStation);
+ return mCurrentStation;
+ }
+
+ /**
+ * Set FM service station frequency
+ *
+ * @param station Current station
+ */
+ public void setFrequency(int station) {
+ mCurrentStation = station;
+ }
+
+ /**
+ * resume FM audio
+ */
+ private void resumeFmAudio() {
+ Log.d(TAG, "FmRadioService.resumeFmAudio");
+ // If not check mIsAudioFocusHeld && mIsPowerup, when scan canceled,
+ // this will be resume first, then execute power down. it will cause
+ // nosise.
+ if (mIsAudioFocusHeld && mIsPowerUp) {
+ enableFmAudio(true);
+ }
+ }
+
+ /**
+ * Switch antenna There are two types of antenna(long and short) If long
+ * antenna(most is this type), must plug in earphone as antenna to receive
+ * FM. If short antenna, means there is a short antenna if phone already,
+ * can receive FM without earphone.
+ *
+ * @param antenna antenna (0, long antenna, 1 short antenna)
+ *
+ * @return (0, success; 1 failed; 2 not support)
+ */
+ public void switchAntennaAsync(int antenna) {
+ final int bundleSize = 1;
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SWITCH_ANNTENNA);
+
+ Bundle bundle = new Bundle(bundleSize);
+ bundle.putInt(FmRadioListener.SWITCH_ANNTENNA_VALUE, antenna);
+ Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_SWITCH_ANNTENNA);
+ msg.setData(bundle);
+ mFmServiceHandler.sendMessage(msg);
+ }
+
+ /**
+ * Need native support whether antenna support interface.
+ *
+ * @param antenna antenna (0, long antenna, 1 short antenna)
+ *
+ * @return (0, success; 1 failed; 2 not support)
+ */
+ private int switchAntenna(int antenna) {
+ Log.d(TAG, ">>> FmRadioService.switchAntenna:" + antenna);
+ // if fm not powerup, switchAntenna will flag whether has earphone
+ int ret = FmRadioNative.switchAntenna(antenna);
+ Log.d(TAG, "<<< FmRadioService.switchAntenna: " + ret);
+ return ret;
+ }
+
+ /**
+ * Start recording
+ */
+ public void startRecordingAsync() {
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_STARTRECORDING_FINISHED);
+ mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_STARTRECORDING_FINISHED);
+ }
+
+ private void startRecording() {
+ Log.d(TAG, ">>> startRecording");
+ if (!mIsPowerUp) {
+ Log.d(TAG, "native is not power up: " + mIsPowerUp);
+ onRecorderError(FmRecorder.ERROR_RECORDER_INVALID_STATE);
+ return;
+ }
+ sRecordingSdcard = FmRadioUtils.getDefaultStoragePath();
+ Log.d(TAG, "default sd card file path: " + sRecordingSdcard);
+ if (sRecordingSdcard == null || sRecordingSdcard.isEmpty()) {
+ Log.d(TAG, "startRecording: may be no sdcard");
+ onRecorderError(FmRecorder.ERROR_SDCARD_NOT_PRESENT);
+ return;
+ }
+
+ if (mFmRecorder == null) {
+ mFmRecorder = new FmRecorder();
+ mFmRecorder.registerRecorderStateListener(FmRadioService.this);
+ }
+
+ if (isSdcardReady(sRecordingSdcard)) {
+ mFmRecorder.startRecording(getApplicationContext());
+ } else {
+ Log.d(TAG, "Cannot record because sdcard is not ready!!");
+ onRecorderError(FmRecorder.ERROR_SDCARD_NOT_PRESENT);
+ }
+ Log.d(TAG, "<<< startRecording");
+ }
+
+ private boolean isSdcardReady(String sdcardPath) {
+ Log.d(TAG, ">>> isSdcardReady: sdcardPath is " + sdcardPath +
+ ", mSdcardStateMap is " + mSdcardStateMap);
+ if (!mSdcardStateMap.isEmpty()) {
+ if (mSdcardStateMap.get(sdcardPath) != null && !mSdcardStateMap.get(sdcardPath)) {
+ Log.d(TAG, "<<< isSdcardReady: return false");
+ return false;
+ }
+ }
+ Log.d(TAG, "<<< isSdcardReady: mSdcardStateMap:" + mSdcardStateMap);
+ return true;
+ }
+
+ /**
+ * stop recording
+ */
+ public void stopRecordingAsync() {
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_STOPRECORDING_FINISHED);
+ mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_STOPRECORDING_FINISHED);
+ }
+
+ private boolean stopRecording() {
+ Log.d(TAG, ">>> stopRecording");
+ if (mFmRecorder == null) {
+ Log.e(TAG, "stopRecording called without a valid recorder!!");
+ return false;
+ }
+ synchronized (mStopRecordingLock) {
+ mFmRecorder.stopRecording();
+ Log.d(TAG, "<<< stopRecording");
+ }
+ return true;
+ }
+
+ /**
+ * Start play recording file
+ */
+ public void startPlaybackAsync() {
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_STARTPLAYBACK_FINISHED);
+ mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_STARTPLAYBACK_FINISHED);
+ }
+
+ private boolean startPlayback() {
+ Log.d(TAG, ">>> startPlayback");
+ if (!requestAudioFocus()) {
+ Log.d(TAG, "can't get audio focus when play recording file");
+ return false;
+ }
+
+ if (mFmRecorder == null) {
+ Log.e(TAG, "FMRecorder is null !!");
+ return false;
+ }
+
+ // Set Mute before start playback
+ mAudioManager.setParameters("AudioFmPreStop=1");
+ setMute(true);
+ enableFmAudio(false);
+
+ mFmRecorder.startPlayback();
+ Log.d(TAG, "<<< startPlayback");
+ return true;
+ }
+
+ /**
+ * stop play recording file
+ */
+ public void stopPlaybackAsync() {
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_STOPPLAYBACK_FINISHED);
+ mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_STOPPLAYBACK_FINISHED);
+ }
+
+ private void stopPlayback() {
+ Log.d(TAG, ">>> stopPlayback");
+ if (mFmRecorder != null) {
+ mFmRecorder.stopPlayback();
+ checkAfterPlayback();
+ }
+ Log.d(TAG, "<<< stopPlayback");
+ }
+
+ /**
+ * Save recording file according name or discard recording file if name is
+ * null
+ *
+ * @param newName New recording file name
+ */
+ public void saveRecordingAsync(String newName) {
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SAVERECORDING_FINISHED);
+ final int bundleSize = 1;
+ Bundle bundle = new Bundle(bundleSize);
+ bundle.putString(RECODING_FILE_NAME, newName);
+ Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_SAVERECORDING_FINISHED);
+ msg.setData(bundle);
+ mFmServiceHandler.sendMessage(msg);
+ }
+
+ private void saveRecording(String newName) {
+ Log.d(TAG, ">>> saveRecording");
+ if (mFmRecorder != null) {
+ if (newName != null) {
+ mFmRecorder.saveRecording(FmRadioService.this, newName);
+ Log.d(TAG, "<<< saveRecording");
+ return;
+ }
+ mFmRecorder.discardRecording();
+ }
+ Log.d(TAG, "<<< saveRecording");
+ }
+
+ /**
+ * Get record time
+ *
+ * @return Record time
+ */
+ public long getRecordTime() {
+ if (mFmRecorder != null) {
+ return mFmRecorder.recordTime();
+ }
+ Log.e(TAG, "FMRecorder is null !!");
+ return 0;
+ }
+
+ /**
+ * Set recording mode
+ *
+ * @param isRecording true, enter recoding mode; false, exit recording mode
+ */
+ public void setRecordingModeAsync(boolean isRecording) {
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_RECORD_MODE_CHANED);
+ final int bundleSize = 1;
+ Bundle bundle = new Bundle(bundleSize);
+ bundle.putBoolean(OPTION, isRecording);
+ Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_RECORD_MODE_CHANED);
+ msg.setData(bundle);
+ mFmServiceHandler.sendMessage(msg);
+ }
+
+ private void setRecordingMode(boolean isRecording) {
+ Log.d(TAG, ">>> setRecordingMode: isRecording=" + isRecording);
+ mIsInRecordingMode = isRecording;
+ if (mFmRecorder != null) {
+ if (!isRecording) {
+ if (mFmRecorder.getState() != FmRecorder.STATE_IDLE) {
+ mFmRecorder.stopRecording();
+ mFmRecorder.stopPlayback();
+ }
+ resumeFmAudio();
+ setMute(false);
+ Log.d(TAG, "<<< setRecordingMode");
+ return;
+ }
+ // reset recorder to unused status
+ mFmRecorder.resetRecorder();
+ }
+ Log.d(TAG, "<<< setRecordingMode");
+ }
+
+ /**
+ * Get current recording mode
+ *
+ * @return if in recording mode return true, otherwise return false;
+ */
+ public boolean getRecordingMode() {
+ return mIsInRecordingMode;
+ }
+
+ /**
+ * Get record state
+ *
+ * @return record state
+ */
+ public int getRecorderState() {
+ if (null != mFmRecorder) {
+ return mFmRecorder.getState();
+ }
+ return FmRecorder.STATE_INVALID;
+ }
+
+ /**
+ * Get recording file name
+ *
+ * @return recording file name
+ */
+ public String getRecordingName() {
+ if (null != mFmRecorder) {
+ return mFmRecorder.getRecordingName();
+ }
+ return null;
+ }
+
+ /**
+ * Get current recording file name with full path
+ *
+ * @return The current recording file name or null
+ */
+ public String getRecordingNameWithPath() {
+ if (null != mFmRecorder) {
+ return mFmRecorder.getRecordingNameWithPath();
+ }
+ return null;
+ }
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ Log.d(TAG, ">>> FmRadioService.onCreate");
+ Log.d(TAG, "short antenna support:" + SHORT_ANNTENNA_SUPPORT);
+ mContext = getApplicationContext();
+ mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
+ mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
+ PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
+ mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
+ mWakeLock.setReferenceCounted(false);
+ sRecordingSdcard = FmRadioUtils.getDefaultStoragePath();
+
+ if (!initFmPlayer()) {
+ Log.e(TAG, "init FMPlayer failed");
+ return;
+ }
+
+ registerFmBroadcastReceiver();
+ registerSdcardReceiver();
+
+ HandlerThread handlerThread = new HandlerThread("FmRadioServiceThread");
+ handlerThread.start();
+ mFmServiceHandler = new FmRadioServiceHandler(handlerThread.getLooper());
+
+ openDevice();
+ // set speaker to default status, avoid setting->clear data.
+ setSpeakerPhoneOn(mIsSpeakerUsed);
+ Log.d(TAG, "<<< FmRadioService.onCreate");
+ }
+
+ private boolean initFmPlayer() {
+ mFmPlayer = new MediaPlayer();
+ if (!FmRadioUtils.isFmSuspendSupport()) {
+ mFmPlayer.setWakeMode(FmRadioService.this, PowerManager.PARTIAL_WAKE_LOCK);
+ }
+ mFmPlayer.setOnErrorListener(mPlayerErrorListener);
+ try {
+ mFmPlayer.setDataSource("THIRDPARTY://MEDIAPLAYER_PLAYERTYPE_FM");
+ } catch (IOException ex) {
+ // notify the user why the file couldn't be opened
+ Log.e(TAG, "setDataSource: " + ex);
+ return false;
+ } catch (IllegalArgumentException ex) {
+ // notify the user why the file couldn't be opened
+ Log.e(TAG, "setDataSource: " + ex);
+ return false;
+ } catch (SecurityException ex) {
+ Log.e(TAG, "setDataSource: " + ex);
+ return false;
+ } catch (IllegalStateException ex) {
+ Log.e(TAG, "setDataSource: " + ex);
+ return false;
+ }
+ mFmPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
+ return true;
+ }
+
+ private void registerFmBroadcastReceiver() {
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(SOUND_POWER_DOWN_MSG);
+ filter.addAction(Intent.ACTION_SHUTDOWN);
+ filter.addAction(Intent.ACTION_SCREEN_ON);
+ filter.addAction(Intent.ACTION_SCREEN_OFF);
+ filter.addAction(Intent.ACTION_HEADSET_PLUG);
+/* Vanzo:tanglei on: Fri, 13 Mar 2015 21:22:01 +0800
+ */
+ //if (FeatureOption.VANZO_FEATURE_EARPHONE_KEY_ACTION) {
+ // filter.addAction("com.mediatek.FMRadio.FMRadioService.NEXT_STATION");
+ //}
+// End of Vanzo:tanglei
+ filter.addAction(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED);
+ filter.addAction(ACTION_TOFMSERVICE_POWERDOWN);
+ filter.addAction(ACTION_FROMATVSERVICE_POWERUP);
+ mBroadcastReceiver = new FmServiceBroadcastReceiver();
+ Log.i(TAG, "Register broadcast receiver.");
+ registerReceiver(mBroadcastReceiver, filter);
+ }
+
+ private void unregisterFmBroadcastReceiver() {
+ if (null != mBroadcastReceiver) {
+ Log.i(TAG, "Unregister broadcast receiver.");
+ unregisterReceiver(mBroadcastReceiver);
+ mBroadcastReceiver = null;
+ }
+ }
+
+ @Override
+ public void onDestroy() {
+ Log.d(TAG, ">>> FmRadioService.onDestroy");
+ mAudioManager.setParameters("AudioFmPreStop=1");
+ setMute(true);
+ // stop rds first, avoid blocking other native method
+ if (isRdsSupported()) {
+ Log.d(TAG, "RDS is supported. Stop the RDS thread.");
+ stopRdsThread();
+ }
+ unregisterFmBroadcastReceiver();
+ unregisterSdcardListener();
+ abandonAudioFocus();
+ exitFm();
+ if (null != mFmRecorder) {
+ mFmRecorder = null;
+ }
+ super.onDestroy();
+ }
+
+ /**
+ * Exit FMRadio application
+ */
+ private void exitFm() {
+ Log.d(TAG, "service.exitFm start");
+ mIsAudioFocusHeld = false;
+ // Stop FM recorder if it is working
+ if (null != mFmRecorder) {
+ synchronized (mStopRecordingLock) {
+ int fmState = mFmRecorder.getState();
+ if (FmRecorder.STATE_PLAYBACK == fmState) {
+ mFmRecorder.stopPlayback();
+ Log.d(TAG, "Stop playback FMRecorder.");
+ } else if (FmRecorder.STATE_RECORDING == fmState) {
+ mFmRecorder.stopRecording();
+ Log.d(TAG, "stop Recording.");
+ }
+
+ // ALPS01789667 Add to DB if exit, there are two cases:
+ // case 1: FileManager play Music->FM receive short audio focus->Fm stop recording
+ // -> FM receive SOUND_POWER_DOWN_MSG->Come here but is IDLE status
+ // case 2: Music play a song->FM receive long audio focus->Come here is RECORDING
+ mFmRecorder.addCurrentRecordingToDb(mContext);
+ }
+ }
+
+ // When exit, we set the audio path back to earphone.
+ if (mIsNativeScanning || mIsNativeSeeking) {
+ stopScan();
+ }
+
+ mFmServiceHandler.removeCallbacksAndMessages(null);
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_FM_EXIT);
+ mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_FM_EXIT);
+ Log.d(TAG, "service.exitFm end");
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ // Change the notification string.
+ if (mIsPowerUp) {
+ showNotification();
+ }
+ }
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+ Log.d(TAG, ">>> FmRadioService.onStartCommand intent: " + intent + " startId: " + startId);
+ int ret = super.onStartCommand(intent, flags, startId);
+ Log.d(TAG, "<<< FmRadioService.onStartCommand: " + ret);
+ return START_NOT_STICKY;
+ }
+
+ /**
+ * Start RDS thread to update RDS information
+ */
+ private void startRdsThread() {
+ Log.d(TAG, ">>> FmRadioService.startRdSThread");
+ mIsRdsThreadExit = false;
+ if (null != mRdsThread) {
+ return;
+ }
+ mRdsThread = new Thread() {
+ public void run() {
+ Log.d(TAG, ">>> RDS Thread run()");
+ while (true) {
+ if (mIsRdsThreadExit) {
+ break;
+ }
+
+ int iRdsEvents = FmRadioNative.readRds();
+ if (iRdsEvents != 0) {
+ Log.d(TAG, "FmRadioNative.readrds events: " + iRdsEvents);
+ }
+
+ if (RDS_EVENT_PROGRAMNAME == (RDS_EVENT_PROGRAMNAME & iRdsEvents)) {
+ Log.d(TAG, "RDS_EVENT_PROGRAMNAME");
+ byte[] bytePS = FmRadioNative.getPs();
+ if (null != bytePS) {
+ setPS(new String(bytePS).trim());
+ }
+ }
+
+ if (RDS_EVENT_LAST_RADIOTEXT == (RDS_EVENT_LAST_RADIOTEXT & iRdsEvents)) {
+ Log.d(TAG, "RDS_EVENT_LAST_RADIOTEXT");
+ byte[] byteLRText = FmRadioNative.getLrText();
+ if (null != byteLRText) {
+ setLRText(new String(byteLRText).trim());
+ }
+ }
+
+ if (RDS_EVENT_AF == (RDS_EVENT_AF & iRdsEvents)) {
+ Log.d(TAG, "RDS_EVENT_AF");
+ /*
+ * add for rds AF
+ */
+ if (mIsScanning || mIsSeeking) {
+ Log.d(TAG, "RDSThread. seek or scan going, no need to tune here");
+ } else if (!mIsPowerUp) {
+ Log.d(TAG, "RDSThread. fm is power down, do nothing.");
+ } else {
+ int iFreq = FmRadioNative.activeAf();
+ if (FmRadioUtils.isValidStation(iFreq)) {
+ // if the new frequency is not equal to current
+ // frequency.
+ if (mCurrentStation == iFreq) {
+ Log.w(TAG, "RDSThread. the new freq is the same as current.");
+ } else {
+ setPS("");
+ setLRText("");
+ if (!mIsScanning && !mIsSeeking) {
+ Log.d(TAG, "RDSThread. seek or scan not going," +
+ "need to tune here");
+ tuneStationAsync(FmRadioUtils.computeFrequency(iFreq));
+ }
+ }
+ }
+ }
+ }
+ // Do not handle other events.
+ // Sleep 500ms to reduce inquiry frequency
+ try {
+ final int hundredMillisecond = 500;
+ Thread.sleep(hundredMillisecond);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ Log.d(TAG, "<<< RDS Thread run()");
+ }
+ };
+
+ Log.d(TAG, "Start RDS Thread.");
+ mRdsThread.start();
+ Log.d(TAG, "<<< FmRadioService.startRdSThread");
+ }
+
+ /**
+ * Stop RDS thread to stop listen station RDS change
+ */
+ private void stopRdsThread() {
+ Log.d(TAG, ">>> FmRadioService.stopRdSThread");
+ if (null != mRdsThread) {
+ // Must call closedev after stopRDSThread.
+ mIsRdsThreadExit = true;
+ mRdsThread = null;
+ }
+ Log.d(TAG, "<<< FmRadioService.stopRdSThread");
+ }
+
+ /**
+ * Set PS information
+ *
+ * @param ps The ps information
+ */
+ private void setPS(String ps) {
+ Log.d(TAG, "FmRadioService.setPS: " + ps + " ,current: " + mPSString);
+ if (0 != mPSString.compareTo(ps)) {
+ mPSString = ps;
+ Bundle bundle = new Bundle(3);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.LISTEN_PS_CHANGED);
+ bundle.putString(FmRadioListener.KEY_PS_INFO, mPSString);
+ bundle.putString(FmRadioListener.KEY_RT_INFO, mLRTextString);
+ notifyActivityStateChanged(bundle);
+ } // else New PS is the same as current
+ }
+
+ /**
+ * Set RT information
+ *
+ * @param lrtText The RT information
+ */
+ private void setLRText(String lrtText) {
+ Log.d(TAG, "FmRadioService.setLRText: " + lrtText + " ,current: " + mLRTextString);
+ if (0 != mLRTextString.compareTo(lrtText)) {
+ mLRTextString = lrtText;
+ Bundle bundle = new Bundle(3);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.LISTEN_RT_CHANGED);
+ bundle.putString(FmRadioListener.KEY_PS_INFO, mPSString);
+ bundle.putString(FmRadioListener.KEY_RT_INFO, mLRTextString);
+ notifyActivityStateChanged(bundle);
+ } // else New RT is the same as current
+ }
+
+ /**
+ * Open or close FM Radio audio
+ *
+ * @param enable true, open FM audio; false, close FM audio;
+ */
+ private void enableFmAudio(boolean enable) {
+ Log.d(TAG, ">>> FmRadioService.enableFmAudio: " + enable);
+ if ((mFmPlayer == null) || !mIsPowerUp) {
+ Log.w(TAG, "mFMPlayer is null in Service.enableFmAudio");
+ return;
+ }
+
+ try {
+ if (!enable) {
+ if (!mFmPlayer.isPlaying()) {
+ Log.d(TAG, "warning: FM audio is already disabled.");
+ return;
+ }
+
+ Log.d(TAG, "call MediaPlayer.stop()");
+ mFmPlayer.stop();
+ Log.d(TAG, "stop FM audio.");
+ return;
+ }
+
+ if (mFmPlayer.isPlaying()) {
+ Log.d(TAG, "warning: FM audio is already enabled.");
+ return;
+ }
+ } catch (IllegalStateException e) {
+ Log.e(TAG, "Exception: Cannot call MediaPlayer isPlaying.", e);
+ }
+
+ try {
+ mFmPlayer.prepare();
+ //if (FmRadioUtils.isFmSuspendSupport()) {
+ // Log.d(TAG, "support FM suspend");
+ // mFmPlayer.startWithoutWakelock();
+ //} else {
+ mFmPlayer.start();
+ //}
+ } catch (IOException e) {
+ Log.e(TAG, "Exception: Cannot call MediaPlayer prepare.", e);
+ } catch (IllegalStateException e) {
+ Log.e(TAG, "Exception: Cannot call MediaPlayer prepare.", e);
+ }
+
+ Log.d(TAG, "Start FM audio.");
+ Log.d(TAG, "<<< FmRadioService.enableFmAudio");
+ }
+
+ /**
+ * Show notification
+ */
+ private void showNotification() {
+ Log.d(TAG, "FmRadioService.showNotification");
+ Intent notificationIntent = new Intent();
+ notificationIntent.setClassName(getPackageName(), FmRadioActivity.class.getName());
+ PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(),
+ 0, notificationIntent, 0);
+ Notification notification = new Notification(R.drawable.fm_title_icon, null,
+ System.currentTimeMillis());
+ notification.flags |= Notification.FLAG_ONGOING_EVENT | Notification.FLAG_NO_CLEAR;
+ String fmUnit = mContext.getString(R.string.fm_unit);
+ String text = FmRadioUtils.formatStation(mCurrentStation) + " " + fmUnit;
+ notification.setLatestEventInfo(getApplicationContext(),
+ getResources().getString(R.string.app_name), text, pendingIntent);
+ Log.d(TAG, "Add notification to the title bar.");
+ startForeground(NOTIFICATION_ID, notification);
+ }
+
+ /**
+ * Remove notification
+ */
+ private void removeNotification() {
+ Log.d(TAG, "FmRadioService.removeNotification");
+ stopForeground(true);
+ }
+
+ /**
+ * Update notification
+ */
+ private void updateNotification() {
+ Log.d(TAG, "FmRadioService.updateNotification");
+ if (mIsPowerUp) {
+ showNotification();
+ }
+ }
+
+ /**
+ * Register sdcard listener for record
+ */
+ private void registerSdcardReceiver() {
+ Log.v(TAG, "registerSdcardReceiver >>> ");
+ if (mSdcardListener == null) {
+ mSdcardListener = new SdcardListener();
+ }
+ IntentFilter filter = new IntentFilter();
+ filter.addDataScheme("file");
+ filter.addAction(Intent.ACTION_MEDIA_MOUNTED);
+ filter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
+ filter.addAction(Intent.ACTION_MEDIA_EJECT);
+ registerReceiver(mSdcardListener, filter);
+ Log.v(TAG, "registerSdcardReceiver <<< ");
+ }
+
+ private void unregisterSdcardListener() {
+ if (null != mSdcardListener) {
+ unregisterReceiver(mSdcardListener);
+ }
+ }
+
+ private void updateSdcardStateMap(Intent intent) {
+ String action = intent.getAction();
+ String sdcardPath = null;
+ Uri mountPointUri = intent.getData();
+ if (mountPointUri != null) {
+ sdcardPath = mountPointUri.getPath();
+ if (sdcardPath != null) {
+ if (Intent.ACTION_MEDIA_EJECT.equals(action)) {
+ Log.d(TAG, "updateSdcardStateMap: ENJECT " + sdcardPath);
+ mSdcardStateMap.put(sdcardPath, false);
+ } else if (Intent.ACTION_MEDIA_UNMOUNTED.equals(action)) {
+ Log.d(TAG, "updateSdcardStateMap: UNMOUNTED " + sdcardPath);
+ mSdcardStateMap.put(sdcardPath, false);
+ } else if (Intent.ACTION_MEDIA_MOUNTED.equals(action)) {
+ Log.d(TAG, "updateSdcardStateMap: MOUNTED " + sdcardPath);
+ mSdcardStateMap.put(sdcardPath, true);
+ }
+ }
+ }
+ }
+
+ /**
+ * Notify FM recorder state
+ *
+ * @param state The current FM recorder state
+ */
+ @Override
+ public void onRecorderStateChanged(int state) {
+ Log.d(TAG, "onRecorderStateChanged: " + state);
+ mRecordState = state;
+ Bundle bundle = new Bundle(2);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.LISTEN_RECORDSTATE_CHANGED);
+ bundle.putInt(FmRadioListener.KEY_RECORDING_STATE, state);
+ notifyActivityStateChanged(bundle);
+ }
+
+ /**
+ * Notify FM recorder error message
+ *
+ * @param error The recorder error type
+ */
+ @Override
+ public void onRecorderError(int error) {
+ Log.d(TAG, "onRecorderError: " + error);
+ // if media server die, will not enable FM audio, and convert to
+ // ERROR_PLAYER_INATERNAL, call back to activity showing toast.
+ mRecorderErrorType = (MediaPlayer.MEDIA_ERROR_SERVER_DIED == error) ?
+ FmRecorder.ERROR_PLAYER_INTERNAL : error;
+
+ Bundle bundle = new Bundle(2);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.LISTEN_RECORDERROR);
+ bundle.putInt(FmRadioListener.KEY_RECORDING_ERROR_TYPE, mRecorderErrorType);
+ notifyActivityStateChanged(bundle);
+
+ // if media server die, should not enable fm, otherwise je will occur.
+ if (FmRecorder.ERROR_PLAYER_INTERNAL == error) {
+ resumeFmAudio();
+ }
+ }
+
+ /**
+ * Notify play FM record file complete
+ */
+ @Override
+ public void onPlayRecordFileComplete() {
+ Log.d(TAG, "service.onPlayRecordFileComplete");
+ checkAfterPlayback();
+ }
+
+ /**
+ * Check and go next(play or show tips) after recorder file play
+ * back finish.
+ * Two cases:
+ * 1. With headset or support short antenna -> play FM
+ * 2. Without headset -> show plug in earphone tips
+ */
+ private void checkAfterPlayback() {
+ if (isHeadSetIn() || SHORT_ANNTENNA_SUPPORT) {
+ // with headset
+ Log.d(TAG, "checkAfterPlayback:eaphone is in,need resume fm");
+ if (mIsPowerUp) {
+ resumeFmAudio();
+ setMute(false);
+ } else {
+ powerUpAsync(FmRadioUtils.computeFrequency(mCurrentStation));
+ }
+ } else {
+ // without headset need show plug in earphone tips
+ Log.d(TAG, "checkAfterPlayback:earphone is out, need show plug in earphone tips");
+ switchAntennaAsync(mValueHeadSetPlug);
+ }
+ }
+
+ /**
+ * Check the headset is plug in or plug out
+ *
+ * @return true for plug in; false for plug out
+ */
+ private boolean isHeadSetIn() {
+ return (0 == mValueHeadSetPlug);
+ }
+
+ private void stopFmFocusLoss(int focusState) {
+ mIsAudioFocusHeld = false;
+ if (mIsNativeScanning || mIsNativeSeeking) {
+ // make stop scan from activity call to service.
+ // notifyActivityStateChanged(FMRadioListener.LISTEN_SCAN_CANCELED);
+ stopScan();
+ Log.d(TAG, "need to stop FM, so stop scan channel.");
+ }
+
+ // using handler thread to update audio focus state
+ updateAudioFocusAync(focusState);
+ Log.d(TAG, "need to stop FM, so powerdown FM.");
+
+ }
+
+ /**
+ * Handle FM Player error
+ */
+ private final MediaPlayer.OnErrorListener mPlayerErrorListener =
+ new MediaPlayer.OnErrorListener() {
+ /**
+ * handle error message
+ *
+ * @param mp occurred error media player
+ * @param what error message
+ * @param extra error message extra
+ *
+ * @return handle error message or not
+ */
+ public boolean onError(MediaPlayer mp, int what, int extra) {
+
+ if (MediaPlayer.MEDIA_ERROR_SERVER_DIED == what) {
+ Log.d(TAG, "onError: MEDIA_SERVER_DIED");
+ if (null != mFmPlayer) {
+ mFmPlayer.release();
+ mFmPlayer = null;
+ }
+ mFmPlayer = new MediaPlayer();
+ if (!FmRadioUtils.isFmSuspendSupport()) {
+ mFmPlayer.setWakeMode(FmRadioService.this, PowerManager.PARTIAL_WAKE_LOCK);
+ }
+ mFmPlayer.setOnErrorListener(mPlayerErrorListener);
+ try {
+ mFmPlayer.setDataSource("THIRDPARTY://MEDIAPLAYER_PLAYERTYPE_FM");
+ mFmPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
+ if (mIsPowerUp) {
+ // set speaker mode according to AP
+ setSpeakerPhoneOn(mIsSpeakerUsed);
+ mFmPlayer.prepare();
+ if (FmRadioUtils.isFmSuspendSupport()) {
+ Log.d(TAG, "support FM suspend");
+ mFmPlayer.startWithoutWakelock();
+ } else {
+ mFmPlayer.start();
+ }
+ }
+ } catch (IOException ex) {
+ Log.e(TAG, "setDataSource: " + ex);
+ return false;
+ } catch (IllegalArgumentException ex) {
+ Log.e(TAG, "setDataSource: " + ex);
+ return false;
+ } catch (IllegalStateException ex) {
+ Log.e(TAG, "setDataSource: " + ex);
+ return false;
+ }
+ }
+
+ return true;
+ }
+ };
+
+ /**
+ * Request audio focus
+ *
+ * @return true, success; false, fail;
+ */
+ public boolean requestAudioFocus() {
+ if (mIsAudioFocusHeld) {
+ return true;
+ }
+
+ int audioFocus = mAudioManager.requestAudioFocus(mAudioFocusChangeListener,
+ AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
+ mIsAudioFocusHeld = (AudioManager.AUDIOFOCUS_REQUEST_GRANTED == audioFocus);
+ return mIsAudioFocusHeld;
+ }
+
+ /**
+ * Abandon audio focus
+ */
+ public void abandonAudioFocus() {
+ mAudioManager.abandonAudioFocus(mAudioFocusChangeListener);
+ mIsAudioFocusHeld = false;
+ }
+
+ /**
+ * Use to interact with other voice related app
+ */
+ private final OnAudioFocusChangeListener mAudioFocusChangeListener =
+ new OnAudioFocusChangeListener() {
+ /**
+ * Handle audio focus change ensure message FIFO
+ *
+ * @param focusChange audio focus change state
+ */
+ @Override
+ public void onAudioFocusChange(int focusChange) {
+ Log.d(TAG, "onAudioFocusChange: " + focusChange);
+ switch (focusChange) {
+ case AudioManager.AUDIOFOCUS_LOSS:
+ synchronized (this) {
+ Log.d(TAG, "AudioFocus: received AUDIOFOCUS_LOSS");
+ mAudioManager.setParameters("AudioFmPreStop=1");
+ setMute(true);
+ Log.d(TAG, "onAudioFocusChange.setParameters end");
+ exitFm();
+ stopSelf();
+ }
+ break;
+
+ case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
+ synchronized (this) {
+ mAudioManager.setParameters("AudioFmPreStop=1");
+ setMute(true);
+ Log.d(TAG, "AudioFocus: received AUDIOFOCUS_LOSS_TRANSIENT");
+ stopFmFocusLoss(AudioManager.AUDIOFOCUS_LOSS_TRANSIENT);
+ }
+ break;
+
+ case AudioManager.AUDIOFOCUS_GAIN:
+ synchronized (this) {
+ Log.d(TAG, "AudioFocus: received AUDIOFOCUS_GAIN");
+ updateAudioFocusAync(AudioManager.AUDIOFOCUS_GAIN);
+ }
+ break;
+
+ default:
+ Log.d(TAG, "AudioFocus: Audio focus change, but not need handle");
+ break;
+ }
+ }
+ };
+
+ /**
+ * Audio focus changed, will send message to handler thread. synchronized to
+ * ensure one message can go in this method.
+ *
+ * @param focusState AudioManager state
+ */
+ private synchronized void updateAudioFocusAync(int focusState) {
+ Log.d(TAG, "updateAudioFocusAync: focusState = " + focusState);
+ final int bundleSize = 1;
+ Bundle bundle = new Bundle(bundleSize);
+ bundle.putInt(FmRadioListener.KEY_AUDIOFOCUS_CHANGED, focusState);
+ Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_AUDIOFOCUS_CHANGED);
+ msg.setData(bundle);
+ mFmServiceHandler.sendMessage(msg);
+ }
+
+ /**
+ * Audio focus changed, update FM focus state.
+ *
+ * @param focusState AudioManager state
+ */
+ private void updateAudioFocus(int focusState) {
+ Log.d(TAG, "FmRadioService.updateAudioFocus");
+ switch (focusState) {
+ case AudioManager.AUDIOFOCUS_LOSS:
+ mPausedByTransientLossOfFocus = false;
+ // play back audio will output with music audio
+ // May be affect other recorder app, but the flow can not be
+ // execute earlier,
+ // It should ensure execute after start/stop record.
+ if (mFmRecorder != null) {
+ int fmState = mFmRecorder.getState();
+ Log.d(TAG, "stopFMFocusLoss.recorder state=" + fmState);
+ // only handle recorder state, not handle playback state
+ if (fmState == FmRecorder.STATE_RECORDING) {
+ mFmServiceHandler.removeMessages(
+ FmRadioListener.MSGID_STARTRECORDING_FINISHED);
+ mFmServiceHandler.removeMessages(
+ FmRadioListener.MSGID_STOPRECORDING_FINISHED);
+ stopRecording();
+ }
+ }
+ handlePowerDown();
+ break;
+
+ case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
+ if (mIsPowerUp) {
+ mPausedByTransientLossOfFocus = true;
+ }
+ Log.d(TAG, "AUDIOFOCUS_LOSS_TRANSIENT: mPausedByTransientLossOfFocus:" +
+ mPausedByTransientLossOfFocus);
+ // play back audio will output with music audio
+ // May be affect other recorder app, but the flow can not be
+ // execute earlier,
+ // It should ensure execute after start/stop record.
+ if (mFmRecorder != null) {
+ int fmState = mFmRecorder.getState();
+ Log.d(TAG, "stopFMFocusLoss.recorder state=" + fmState);
+ if (fmState == FmRecorder.STATE_RECORDING) {
+ mFmServiceHandler.removeMessages(
+ FmRadioListener.MSGID_STARTRECORDING_FINISHED);
+ mFmServiceHandler.removeMessages(
+ FmRadioListener.MSGID_STOPRECORDING_FINISHED);
+ stopRecording();
+ }
+ if (fmState == FmRecorder.STATE_PLAYBACK) {
+ mFmServiceHandler.removeMessages(
+ FmRadioListener.MSGID_STARTPLAYBACK_FINISHED);
+ mFmServiceHandler.removeMessages(
+ FmRadioListener.MSGID_STOPPLAYBACK_FINISHED);
+ stopPlayback();
+ }
+ }
+ handlePowerDown();
+ break;
+
+ case AudioManager.AUDIOFOCUS_GAIN:
+ Log.d(TAG, "AUDIOFOCUS_GAIN: mPausedByTransientLossOfFocus:" +
+ mPausedByTransientLossOfFocus);
+ if (!mIsPowerUp && mPausedByTransientLossOfFocus) {
+ mIsPowerUping = true;
+ final int bundleSize = 1;
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_POWERUP_FINISHED);
+ mFmServiceHandler.removeMessages(FmRadioListener.MSGID_POWERDOWN_FINISHED);
+ Bundle bundle = new Bundle(bundleSize);
+ bundle.putFloat(FM_FREQUENCY, FmRadioUtils.computeFrequency(mCurrentStation));
+ handlePowerUp(bundle);
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ /**
+ * FM Radio listener record
+ */
+ private static class Record {
+ int mHashCode; // hash code
+ FmRadioListener mCallback; // call back
+ }
+
+ /**
+ * Register FM Radio listener, activity get service state should call this
+ * method register FM Radio listener
+ *
+ * @param callback FM Radio listener
+ */
+ public void registerFmRadioListener(FmRadioListener callback) {
+ synchronized (mRecords) {
+ // register callback in AudioProfileService, if the callback is
+ // exist, just replace the event.
+ Record record = null;
+ int hashCode = callback.hashCode();
+ final int n = mRecords.size();
+ for (int i = 0; i < n; i++) {
+ record = mRecords.get(i);
+ if (hashCode == record.mHashCode) {
+ return;
+ }
+ }
+ record = new Record();
+ record.mHashCode = hashCode;
+ record.mCallback = callback;
+ mRecords.add(record);
+ }
+ }
+
+ /**
+ * Call back from service to activity
+ *
+ * @param bundle The message to activity
+ */
+ private void notifyActivityStateChanged(Bundle bundle) {
+ if (!mRecords.isEmpty()) {
+ Log.d(TAG, "notifyActivityStatusChanged:clients = " + mRecords.size());
+ synchronized (mRecords) {
+ Iterator<Record> iterator = mRecords.iterator();
+ while (iterator.hasNext()) {
+ Record record = (Record) iterator.next();
+
+ FmRadioListener listener = record.mCallback;
+
+ if (listener == null) {
+ iterator.remove();
+ return;
+ }
+
+ listener.onCallBack(bundle);
+ }
+ }
+ }
+ }
+
+ /**
+ * Unregister FM Radio listener
+ *
+ * @param callback FM Radio listener
+ */
+ public void unregisterFmRadioListener(FmRadioListener callback) {
+ remove(callback.hashCode());
+ }
+
+ /**
+ * Remove call back according hash code
+ *
+ * @param hashCode The call back hash code
+ */
+ private void remove(int hashCode) {
+ synchronized (mRecords) {
+ Iterator<Record> iterator = mRecords.iterator();
+ while (iterator.hasNext()) {
+ Record record = (Record) iterator.next();
+ if (record.mHashCode == hashCode) {
+ iterator.remove();
+ }
+ }
+ }
+ }
+
+ /**
+ * Check recording sd card is unmount
+ *
+ * @param intent The unmount sd card intent
+ *
+ * @return true or false indicate whether current recording sd card is
+ * unmount or not
+ */
+ public boolean isRecordingCardUnmount(Intent intent) {
+ String unmountSDCard = intent.getData().toString();
+ Log.d(TAG, "unmount sd card file path: " + unmountSDCard);
+ return unmountSDCard.equalsIgnoreCase("file://" + sRecordingSdcard) ? true : false;
+ }
+
+ private int[] insertSearchedStation(int[] channels) {
+ Log.d(TAG, "insertSearchedStation.firstValidChannel:" + Arrays.toString(channels));
+ int firstValidChannel = mCurrentStation;
+ int channelNum = 0;
+ if (null != channels) {
+ Arrays.sort(channels);
+ int size = channels.length;
+ // Save searched stations into database by batch
+ ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
+ String defaultStationName = getString(R.string.default_station_name);
+ for (int i = 0; i < size; i++) {
+ if (FmRadioUtils.isValidStation(channels[i])) {
+ if (0 == channelNum) {
+ firstValidChannel = channels[i];
+ }
+
+ if (!FmRadioStation.isFavoriteStation(mContext, channels[i])) {
+ ops.add(ContentProviderOperation.newInsert(Station.CONTENT_URI)
+ .withValue(Station.COLUMN_STATION_NAME, defaultStationName)
+ .withValue(Station.COLUMN_STATION_FREQ, channels[i])
+ .withValue(Station.COLUMN_STATION_TYPE,
+ FmRadioStation.STATION_TYPE_SEARCHED)
+ .build());
+ }
+ channelNum++;
+ }
+ }
+ // Save search stations to database by batch
+ try {
+ mContext.getContentResolver().applyBatch(FmRadioStation.AUTHORITY, ops);
+ } catch (RemoteException e) {
+ Log.d(TAG, "Exception when applyBatch searched stations " + e);
+ } catch (OperationApplicationException e) {
+ Log.d(TAG, "Exception when applyBatch searched stations " + e);
+ }
+ }
+ Log.d(TAG, "insertSearchedStation.firstValidChannel:" + firstValidChannel +
+ ",channelNum:" + channelNum);
+ return (new int[] {
+ firstValidChannel, channelNum
+ });
+ }
+
+ /**
+ * The background handler
+ */
+ class FmRadioServiceHandler extends Handler {
+ public FmRadioServiceHandler(Looper looper) {
+ super(looper);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ Bundle bundle;
+ boolean isPowerup = false;
+ boolean isSwitch = true;
+
+ switch (msg.what) {
+
+ // power up
+ case FmRadioListener.MSGID_POWERUP_FINISHED:
+ bundle = msg.getData();
+ handlePowerUp(bundle);
+ break;
+
+ // power down
+ case FmRadioListener.MSGID_POWERDOWN_FINISHED:
+ handlePowerDown();
+ break;
+
+ // fm exit
+ case FmRadioListener.MSGID_FM_EXIT:
+ if (mIsSpeakerUsed) {
+ setSpeakerPhoneOn(false);
+ }
+ powerDown();
+ closeDevice();
+ // Release FM player upon exit
+ if (null != mFmPlayer) {
+ mFmPlayer.release();
+ mFmPlayer = null;
+ }
+
+ bundle = new Bundle(1);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.MSGID_FM_EXIT);
+ notifyActivityStateChanged(bundle);
+ // Finish favorite when exit FM
+ if (sExitListener != null) {
+ sExitListener.onExit();
+ }
+ break;
+
+ // switch antenna
+ case FmRadioListener.MSGID_SWITCH_ANNTENNA:
+ bundle = msg.getData();
+ int value = bundle.getInt(FmRadioListener.SWITCH_ANNTENNA_VALUE);
+
+ // if not support short antenna, just notify, not need to switch antenna.
+ if (SHORT_ANNTENNA_SUPPORT) {
+ isSwitch = (switchAntenna(value) == 0) ? true : false;
+ Log.d(TAG, "FmServiceHandler.switch anntenna:isSwitch:" + isSwitch);
+ } else {
+ // if ear phone insert, need dismiss plugin earphone
+ // dialog
+ // if earphone plug out and it is not play recorder
+ // state, show plug dialog.
+ if (0 == value) {
+ Log.d(TAG, "FmServiceHandler.switch anntenna:dismiss dialog");
+ // powerUpAsync(FMRadioUtils.computeFrequency(mCurrentStation));
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG,
+ FmRadioListener.MSGID_SWITCH_ANNTENNA);
+ bundle.putBoolean(FmRadioListener.KEY_IS_SWITCH_ANNTENNA, true);
+ notifyActivityStateChanged(bundle);
+ } else {
+ // ear phone plug out, and recorder state is not
+ // play recorder state,
+ // show dialog.
+ if (mRecordState != FmRecorder.STATE_PLAYBACK) {
+ Log.d(TAG, "FmServiceHandler.switch anntenna:show dialog");
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG,
+ FmRadioListener.MSGID_SWITCH_ANNTENNA);
+ bundle.putBoolean(FmRadioListener.KEY_IS_SWITCH_ANNTENNA, false);
+ notifyActivityStateChanged(bundle);
+ }
+ }
+ }
+ break;
+
+ // tune to station
+ case FmRadioListener.MSGID_TUNE_FINISHED:
+ bundle = msg.getData();
+ float tuneStation = bundle.getFloat(FM_FREQUENCY);
+ boolean isTune = tuneStation(tuneStation);
+ // if tune fail, pass current station to update ui
+ if (!isTune) {
+ tuneStation = FmRadioUtils.computeFrequency(mCurrentStation);
+ }
+ bundle = new Bundle(4);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG,
+ FmRadioListener.MSGID_TUNE_FINISHED);
+ bundle.putBoolean(FmRadioListener.KEY_IS_TUNE, isTune);
+ bundle.putFloat(FmRadioListener.KEY_TUNE_TO_STATION, tuneStation);
+ bundle.putBoolean(FmRadioListener.KEY_IS_POWER_UP, mIsPowerUp);
+ notifyActivityStateChanged(bundle);
+ break;
+
+ // seek to station
+ case FmRadioListener.MSGID_SEEK_FINISHED:
+ bundle = msg.getData();
+ mIsSeeking = true;
+ float seekStation = seekStation(bundle.getFloat(FM_FREQUENCY),
+ bundle.getBoolean(OPTION));
+ boolean isSeekTune = false;
+ int station = FmRadioUtils.computeStation(seekStation);
+ if (FmRadioUtils.isValidStation(station)) {
+ isSeekTune = tuneStation(seekStation);
+ }
+ // if tune fail, pass current station to update ui
+ if (!isSeekTune) {
+ seekStation = FmRadioUtils.computeFrequency(mCurrentStation);
+ }
+ bundle = new Bundle(2);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG,
+ FmRadioListener.MSGID_TUNE_FINISHED);
+ bundle.putBoolean(FmRadioListener.KEY_IS_TUNE, isSeekTune);
+ bundle.putFloat(FmRadioListener.KEY_TUNE_TO_STATION, seekStation);
+ notifyActivityStateChanged(bundle);
+ mIsSeeking = false;
+ break;
+
+ // start scan
+ case FmRadioListener.MSGID_SCAN_FINISHED:
+ int[] channels = null;
+ int[] result = null;
+ int scanTuneStation = 0;
+ boolean isScan = true;
+ mIsScanning = true;
+ if (powerUpFm(FmRadioUtils.DEFAULT_STATION_FLOAT)) {
+ channels = startScan();
+ }
+
+ // check whether cancel scan
+ if ((null != channels) && channels[0] == -100) {
+ Log.d(TAG, "user canceled scan:channels[0]=" + channels[0]);
+ isScan = false;
+ result = new int[] {
+ -1, 0
+ };
+ } else {
+ result = insertSearchedStation(channels);
+ scanTuneStation = result[0];
+ isTune = tuneStation(FmRadioUtils.computeFrequency(scanTuneStation));
+ scanTuneStation = isTune ? scanTuneStation : mCurrentStation;
+ }
+
+ /*
+ * if there is stop command when scan, so it needs to mute
+ * fm avoid fm sound come out.
+ */
+ if (mIsAudioFocusHeld) {
+ Log.d(TAG, "there is not power down command.set mute false");
+ setMute(false);
+ }
+ bundle = new Bundle(4);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG,
+ FmRadioListener.MSGID_SCAN_FINISHED);
+ bundle.putInt(FmRadioListener.KEY_TUNE_TO_STATION, scanTuneStation);
+ bundle.putInt(FmRadioListener.KEY_STATION_NUM, result[1]);
+ bundle.putBoolean(FmRadioListener.KEY_IS_SCAN, isScan);
+ notifyActivityStateChanged(bundle);
+ mIsScanning = false;
+ break;
+
+ // audio focus changed
+ case FmRadioListener.MSGID_AUDIOFOCUS_CHANGED:
+ bundle = msg.getData();
+ int focusState = bundle.getInt(FmRadioListener.KEY_AUDIOFOCUS_CHANGED);
+ updateAudioFocus(focusState);
+ break;
+
+ case FmRadioListener.MSGID_SET_RDS_FINISHED:
+ bundle = msg.getData();
+ setRds(bundle.getBoolean(OPTION));
+ break;
+
+ case FmRadioListener.MSGID_SET_MUTE_FINISHED:
+ bundle = msg.getData();
+ setMute(bundle.getBoolean(OPTION));
+ break;
+
+ case FmRadioListener.MSGID_ACTIVE_AF_FINISHED:
+ activeAF();
+ break;
+
+ /********** recording **********/
+ case FmRadioListener.MSGID_STARTRECORDING_FINISHED:
+ startRecording();
+ break;
+
+ case FmRadioListener.MSGID_STOPRECORDING_FINISHED:
+ stopRecording();
+ break;
+
+ case FmRadioListener.MSGID_STARTPLAYBACK_FINISHED:
+ boolean isStart = startPlayback();
+ // Can not start play back, call back to activity.
+ if (!isStart) {
+ bundle = new Bundle(2);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG,
+ FmRadioListener.LISTEN_RECORDERROR);
+ bundle.putInt(FmRadioListener.KEY_RECORDING_ERROR_TYPE,
+ FmRadioListener.NOT_AUDIO_FOCUS);
+ notifyActivityStateChanged(bundle);
+ }
+ break;
+
+ case FmRadioListener.MSGID_STOPPLAYBACK_FINISHED:
+ stopPlayback();
+ break;
+
+ case FmRadioListener.MSGID_RECORD_MODE_CHANED:
+ bundle = msg.getData();
+ setRecordingMode(bundle.getBoolean(OPTION));
+ break;
+
+ case FmRadioListener.MSGID_SAVERECORDING_FINISHED:
+ bundle = msg.getData();
+ saveRecording(bundle.getString(RECODING_FILE_NAME));
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ }
+
+ /**
+ * handle power down, execute power down and call back to activity.
+ */
+ private void handlePowerDown() {
+ Bundle bundle;
+ boolean isPowerdown = powerDown();
+ bundle = new Bundle(2);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.MSGID_POWERDOWN_FINISHED);
+ bundle.putBoolean(FmRadioListener.KEY_IS_POWER_DOWN, isPowerdown);
+ notifyActivityStateChanged(bundle);
+ }
+
+ /**
+ * handle power up, execute power up and call back to activity.
+ *
+ * @param bundle power up frequency
+ */
+ private void handlePowerUp(Bundle bundle) {
+ boolean isPowerup = false;
+ boolean isSwitch = true;
+ Log.d(TAG, "service handler power up start");
+ float curFrequency = bundle.getFloat(FM_FREQUENCY);
+
+ if (!SHORT_ANNTENNA_SUPPORT && !isAntennaAvailable()) {
+ Log.d(TAG, "call back to activity, earphone is not ready");
+ mIsPowerUping = false;
+ bundle = new Bundle(2);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.MSGID_SWITCH_ANNTENNA);
+ bundle.putBoolean(FmRadioListener.KEY_IS_SWITCH_ANNTENNA, false);
+ notifyActivityStateChanged(bundle);
+ return;
+ }
+
+ if (powerUpFm(curFrequency)) {
+ isPowerup = startPlayFm(curFrequency);
+ mPausedByTransientLossOfFocus = false;
+ }
+ mIsPowerUping = false;
+ bundle = new Bundle(2);
+ bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.MSGID_POWERUP_FINISHED);
+ bundle.putBoolean(FmRadioListener.KEY_IS_POWER_UP, isPowerup);
+ notifyActivityStateChanged(bundle);
+ Log.d(TAG, "service handler power up end");
+ }
+
+ /**
+ * check FM is foreground or background
+ */
+ public boolean isActivityForeground() {
+ boolean isForeground = true;
+ List<RunningAppProcessInfo> appProcessInfos = mActivityManager.getRunningAppProcesses();
+ for (RunningAppProcessInfo appProcessInfo : appProcessInfos) {
+ if (appProcessInfo.processName.equals(mContext.getPackageName())) {
+ int importance = appProcessInfo.importance;
+ Log.d(TAG, "isActivityForeground importance:" + importance);
+ if (importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND ||
+ importance == RunningAppProcessInfo.IMPORTANCE_VISIBLE) {
+ Log.d(TAG, "isActivityForeground is foreground");
+ isForeground = true;
+ } else {
+ Log.d(TAG, "isActivityForeground is background");
+ isForeground = false;
+ }
+ break;
+ }
+ }
+ Log.d(TAG, "isActivityForeground return " + isForeground);
+ return isForeground;
+ }
+
+ /**
+ * Check if current is lock task mode. If in this mode, AMS will cannot destory
+ * FmRadioActivity even call finish()
+ * Settings->Security->Screen pinning on
+ * @return true if current screen pinning on FmRadioActivity
+ */
+ public boolean isInLockTaskMode() {
+ Log.d(TAG, "isInLockTaskMode:" + mActivityManager.isInLockTaskMode());
+ return mActivityManager.isInLockTaskMode();
+ }
+
+ /**
+ * Get the recording sdcard path when staring record
+ *
+ * @return sdcard path like "/storage/sdcard0"
+ */
+ public static String getRecordingSdcard() {
+ return sRecordingSdcard;
+ }
+
+ /**
+ * The listener interface for exit
+ */
+ public interface OnExitListener {
+ /**
+ * When Service finish, should notify FmRadioFavorite to finish
+ */
+ void onExit();
+ }
+
+ /**
+ * Register the listener for exit
+ *
+ * @param listener The listener want to know the exit event
+ */
+ public static void registerExitListener(OnExitListener listener) {
+ sExitListener = listener;
+ }
+
+ /**
+ * Unregister the listener for exit
+ *
+ * @param listener The listener want to know the exit event
+ */
+ public static void unregisterExitListener(OnExitListener listener) {
+ sExitListener = null;
+ }
+
+ /**
+ * Get the latest recording name the show name in save dialog but saved in
+ * service
+ *
+ * @return The latest recording name or null for not modified
+ */
+ public String getModifiedRecordingName() {
+ Log.d(TAG, "getRecordingNameInDialog:" + mModifiedRecordingName);
+ return mModifiedRecordingName;
+ }
+
+ /**
+ * Set the latest recording name if modify the default name
+ *
+ * @param name The latest recording name or null for not modified
+ */
+ public void setModifiedRecordingName(String name) {
+ Log.d(TAG, "setRecordingNameInDialog:" + name);
+ mModifiedRecordingName = name;
+ }
+
+ /**
+ * When FmRadioActivity.onStop() set true, FmRadioActivity.onResume() set false;
+ * @param stop
+ */
+ public static void setActivityIsOnStop(boolean stop) {
+ sActivityIsOnStop = stop;
+ }
+
+ /**
+ * Check current is in call/ringtone or not
+ * @return true if is not call mode. false mean is in call or ringtone
+ */
+ public boolean isModeNormal() {
+ int mode = mAudioManager.getMode();
+ Log.d(TAG, "isInCall mode:" + mode);
+ return mode == AudioManager.MODE_NORMAL;
+ }
+
+ // FM Radio EM start
+ /**
+ * Inquiry if fm stereo mono(true, stereo; false mono)
+ *
+ * @return (true, stereo; false, mono)
+ */
+ public boolean getStereoMono() {
+ Log.d(TAG, "FMRadioService.getStereoMono");
+ return FmRadioNative.stereoMono();
+ }
+
+ /**
+ * Force set to stero/mono mode
+ *
+ * @param isMono
+ * (true, mono; false, stereo)
+ * @return (true, success; false, failed)
+ */
+ public boolean setStereoMono(boolean isMono) {
+ Log.d(TAG, "FMRadioService.setStereoMono: isMono=" + isMono);
+ return FmRadioNative.setStereoMono(isMono);
+ }
+
+ /**
+ * set RSSI, desense RSSI, mute gain soft
+ * @param index flag which will execute
+ * (0:rssi threshold,1:desense rssi threshold,2: SGM threshold)
+ * @param value send to native
+ * @return execute ok or not
+ */
+ public boolean setEmth(int index, int value) {
+ Log.d(TAG, ">>> FMRadioService.setEmth: index=" + index + ",value=" + value);
+ boolean isOk = FmRadioNative.emsetth(index, value);
+ Log.d(TAG, "<<< FMRadioService.setEmth: isOk=" + isOk);
+ return isOk;
+ }
+
+ /**
+ * send variables to native, and get some variables return.
+ * @param val send to native
+ * @return get value from native
+ */
+ public short[] emcmd(short[] val) {
+ Log.d(TAG, ">>FMRadioService.emcmd: val=" + val);
+ short[] shortCmds = null;
+ shortCmds = FmRadioNative.emcmd(val);
+ Log.d(TAG, "<<FMRadioService.emcmd:" + shortCmds);
+ return shortCmds;
+ }
+
+ /**
+ * Get hardware version not need async
+ */
+ public int[] getHardwareVersion() {
+ return FmRadioNative.getHardwareVersion();
+ }
+
+ /**
+ * Read cap array method not need async
+ */
+ public int getCapArray() {
+ Log.d(TAG, "FMRadioService.readCapArray");
+ if (!mIsPowerUp) {
+ Log.w(TAG, "FM is not powered up");
+ return -1;
+ }
+ return FmRadioNative.readCapArray();
+ }
+
+ /**
+ * Get rssi not need async
+ */
+ public int getRssi() {
+ Log.d(TAG, "FMRadioService.readRssi");
+ if (!mIsPowerUp) {
+ Log.w(TAG, "FM is not powered up");
+ return -1;
+ }
+ return FmRadioNative.readRssi();
+ }
+
+ /**
+ * read rds bler not need async
+ */
+ public int getRdsBler() {
+ Log.d(TAG, "FMRadioService.readRdsBler");
+ if (!mIsPowerUp) {
+ Log.w(TAG, "FM is not powered up");
+ return -1;
+ }
+ return FmRadioNative.readRdsBler();
+ }
+ // FM Radio EM end
+
+}
diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioStation.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioStation.java
new file mode 100755
index 0000000..7e24db2
--- /dev/null
+++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioStation.java
@@ -0,0 +1,524 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2011-2014. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.fmradio;
+
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
+import android.provider.BaseColumns;
+import android.util.Log;
+
+/**
+ * This class provider interface to operator databases, use by activity and
+ * service
+ */
+public class FmRadioStation {
+ private static final String TAG = "FmRx/Station";
+ // authority use composite content provider uri
+ public static final String AUTHORITY = "com.mediatek.fmradio.FmRadioContentProvider";
+ // use to composite content provider uri
+ public static final String STATION = "station";
+ // default current station name
+ private static final String CURRENT_STATION_NAME = "FmDfltSttnNm";
+
+ // Default RDS settings
+ // PS RT whether open
+ private static final boolean DEFAULT_PSRT_ENABLED = false;
+ // AF whether open
+ private static final boolean DEFAULT_AF_ENABLED = false;
+ // TA whether open
+ private static final boolean DEFAULT_TA_ENABLED = false;
+
+ // Station types.
+ public static final int STATION_TYPE_CURRENT = 1;
+ public static final int STATION_TYPE_FAVORITE = 2;
+ public static final int STATION_TYPE_SEARCHED = 3;
+ // just use to save rds, not really station type
+ private static final int STATION_TYPE_RDS_SETTING = 4;
+
+ // RDS setting items
+ // save PSRT set
+ public static final int RDS_SETTING_FREQ_PSRT = 1;
+ // save AF set
+ public static final int RDS_SETTING_FREQ_AF = 2;
+ // save TA set
+ public static final int RDS_SETTING_FREQ_TA = 3;
+ // RDS setting values for every item
+ public static final String RDS_SETTING_VALUE_ENABLED = "ENABLED";
+ public static final String RDS_SETTING_VALUE_DISABLED = "DISABLED";
+
+ // stationList table in database columns
+ static final String COLUMNS[] = new String[] {
+ Station._ID,
+ Station.COLUMN_STATION_NAME,
+ Station.COLUMN_STATION_FREQ,
+ // Use this type to identify different stations.
+ Station.COLUMN_STATION_TYPE
+ };
+
+ /**
+ * This class provider the columns of StationList table
+ */
+ public static final class Station implements BaseColumns {
+ public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + STATION);
+ // Extra columns of the table: COLUMN_STATION_NAME COLUMN_STATION_FREQ
+ // COLUMN_STATION_TYPE
+ public static final String COLUMN_STATION_NAME = "COLUMN_STATION_NAME";
+ public static final String COLUMN_STATION_FREQ = "COLUMN_STATION_FREQ";
+ public static final String COLUMN_STATION_TYPE = "COLUMN_STATION_TYPE";
+ }
+
+ /**
+ * Init FM database for current station and RDS setting
+ *
+ * @param context The context
+ */
+ public static void initFmDatabase(Context context) {
+ // Init current station, if no current station in database, set to be
+ // FIXED_STATION_FREQ
+ Cursor cur = context.getContentResolver().query(
+ Station.CONTENT_URI,
+ new String[] {
+ Station.COLUMN_STATION_FREQ
+ },
+ Station.COLUMN_STATION_TYPE + "=?",
+ new String[] {
+ String.valueOf(STATION_TYPE_CURRENT)
+ },
+ null);
+ if (null != cur) {
+ try {
+ if (!cur.moveToFirst()) {
+ // Can't find current station, insert FIXED_STATION_FREQ to db
+ final int size = 3;
+ ContentValues values = new ContentValues(size);
+ values.put(Station.COLUMN_STATION_NAME, CURRENT_STATION_NAME);
+ values.put(Station.COLUMN_STATION_FREQ, FmRadioUtils.DEFAULT_STATION);
+ values.put(Station.COLUMN_STATION_TYPE, STATION_TYPE_CURRENT);
+ context.getContentResolver().insert(Station.CONTENT_URI, values);
+ }
+ } finally {
+ cur.close();
+ }
+ }
+
+ // Init PSRT, AF and TA
+ int[] types = new int[] {
+ RDS_SETTING_FREQ_PSRT, RDS_SETTING_FREQ_AF, RDS_SETTING_FREQ_TA
+ };
+ boolean[] enables = new boolean[] {
+ DEFAULT_PSRT_ENABLED,
+ DEFAULT_AF_ENABLED, DEFAULT_TA_ENABLED
+ };
+ for (int i = 0; i < types.length; i++) {
+ cur = context.getContentResolver().query(
+ Station.CONTENT_URI,
+ new String[] {
+ Station.COLUMN_STATION_NAME
+ },
+ Station.COLUMN_STATION_FREQ + "=" + String.valueOf(types[i]),
+ null,
+ null);
+ if (null != cur) {
+ try {
+ if (!cur.moveToFirst()) {
+ final int size = 3;
+ ContentValues values = new ContentValues(size);
+ values.put(Station.COLUMN_STATION_NAME, enables[i] ?
+ RDS_SETTING_VALUE_ENABLED : RDS_SETTING_VALUE_DISABLED);
+ values.put(Station.COLUMN_STATION_FREQ, types[i]);
+ values.put(Station.COLUMN_STATION_TYPE, STATION_TYPE_RDS_SETTING);
+ context.getContentResolver().insert(Station.CONTENT_URI, values);
+ }
+ } finally {
+ cur.close();
+ }
+ }
+ }
+ Log.d(TAG, "FmRadioStation.initFmDatabase");
+ }
+
+ /**
+ * Insert station information to database
+ *
+ * @param context The context
+ * @param stationName The station name
+ * @param stationFreq The station frequency
+ * @param stationType The station type
+ */
+ public static void insertStationToDb(Context context, String stationName,
+ int stationFreq, int stationType) {
+ Log.d(TAG, "FmRadioStation.insertStationToDb start");
+ final int size = 3;
+ ContentValues values = new ContentValues(size);
+ values.put(Station.COLUMN_STATION_NAME, stationName);
+ values.put(Station.COLUMN_STATION_FREQ, stationFreq);
+ values.put(Station.COLUMN_STATION_TYPE, stationType);
+ context.getContentResolver().insert(Station.CONTENT_URI, values);
+ Log.d(TAG, "FmRadioStation.insertStationToDb end");
+ }
+
+ /**
+ * Update station name, station frequency according original station
+ * frequency, station type
+ *
+ * @param context The context
+ * @param stationName The new station's name
+ * @param oldStationFreq The old station frequency
+ * @param newStationFreq The new station frequency
+ * @param stationType The old station type
+ */
+ public static void updateStationToDb(Context context, String stationName, int oldStationFreq,
+ int newStationFreq, int stationType) {
+ final int size = 3;
+ ContentValues values = new ContentValues(size);
+ values.put(Station.COLUMN_STATION_NAME, stationName);
+ values.put(Station.COLUMN_STATION_FREQ, newStationFreq);
+ values.put(Station.COLUMN_STATION_TYPE, stationType);
+ context.getContentResolver().update(
+ Station.CONTENT_URI,
+ values,
+ Station.COLUMN_STATION_FREQ + "=? AND " + Station.COLUMN_STATION_TYPE + "=?",
+ new String[] {
+ String.valueOf(oldStationFreq), String.valueOf(stationType)
+ });
+ Log.d(TAG, "FmRadioStation.updateStationToDb: name = " + stationName +
+ ", new freq = " + newStationFreq);
+ }
+
+ /**
+ * Update station name and station type according station frequency
+ *
+ * @param context The context
+ * @param newStationName The station new name
+ * @param newStationType The station new type
+ * @param stationFreq The original station frequency
+ */
+ public static void updateStationToDb(Context context, String newStationName,
+ int newStationType, int stationFreq) {
+ final int size = 3;
+ ContentValues values = new ContentValues(size);
+ values.put(Station.COLUMN_STATION_NAME, newStationName);
+ values.put(Station.COLUMN_STATION_FREQ, stationFreq);
+ values.put(Station.COLUMN_STATION_TYPE, newStationType);
+ context.getContentResolver().update(
+ Station.CONTENT_URI,
+ values,
+ Station.COLUMN_STATION_FREQ + "=? AND " +
+ Station.COLUMN_STATION_TYPE + "<>" + STATION_TYPE_CURRENT,
+ new String[] {
+ String.valueOf(stationFreq)
+ });
+ Log.d(TAG, "FmRadioStation.updateStationToDb: new name = " + newStationName
+ + ", new freq type = " + newStationType);
+ }
+
+ /**
+ * Delete station according station frequency and station type
+ *
+ * @param context The context
+ * @param stationFreq The station frequency
+ * @param stationType The station type
+ */
+ public static void deleteStationInDb(Context context, int stationFreq, int stationType) {
+ context.getContentResolver().delete(
+ Station.CONTENT_URI,
+ Station.COLUMN_STATION_FREQ + "=? AND " + Station.COLUMN_STATION_TYPE + "=?",
+ new String[] {
+ String.valueOf(stationFreq), String.valueOf(stationType)
+ });
+ Log.d(TAG, "FmRadioStation.deleteStationInDb: freq = " + stationFreq +
+ ", type = " + stationType);
+ }
+
+ /**
+ * Judge a station whether exist according station frequency and station
+ * type
+ *
+ * @param context The context
+ * @param stationFreq The station frequency
+ * @param stationType The station type
+ *
+ * @return true or false indicate whether station is exist
+ */
+ public static boolean isStationExist(Context context, int stationFreq, int stationType) {
+ Log.d(TAG, ">>> isStationExist: stationFreq=" + stationFreq +
+ ",stationType=" + stationType);
+ boolean isExist = false;
+ Cursor cur = context.getContentResolver().query(
+ Station.CONTENT_URI,
+ new String[] {
+ Station.COLUMN_STATION_NAME
+ },
+ Station.COLUMN_STATION_FREQ + "=? AND " + Station.COLUMN_STATION_TYPE + "=?",
+ new String[] {
+ String.valueOf(stationFreq), String.valueOf(stationType)
+ },
+ null);
+ if (null != cur) {
+ try {
+ if (cur.moveToFirst()) {
+ // This station is exist
+ isExist = true;
+ }
+ } finally {
+ cur.close();
+ }
+ }
+ Log.d(TAG, "<<< isStationExist: " + isExist);
+ return isExist;
+ }
+
+ /**
+ * Judge a station whether exist according station frequency
+ *
+ * @param context The context
+ * @param stationFreq The station frequency
+ * @param stationType The station type
+ *
+ * @return true or false indicate whether station is exist
+ */
+ public static boolean isStationExistInChList(Context context, int stationFreq) {
+ Log.d(TAG, ">>> isStationExist: stationFreq=" + stationFreq);
+ boolean isExist = false;
+ Cursor cur = context.getContentResolver().query(
+ Station.CONTENT_URI,
+ new String[] {
+ Station.COLUMN_STATION_NAME
+ },
+ Station.COLUMN_STATION_FREQ + "=? AND " + Station.COLUMN_STATION_TYPE + "<>1",
+ new String[] {
+ String.valueOf(stationFreq)
+ },
+ null);
+ if (null != cur) {
+ try {
+ if (cur.moveToFirst()) {
+ // This station is exist
+ isExist = true;
+ }
+ } finally {
+ cur.close();
+ }
+ }
+ Log.d(TAG, "<<< isStationExist: " + isExist);
+ return isExist;
+ }
+
+ /**
+ * Get current station from database
+ *
+ * @param context The context
+ *
+ * @return the station which station type is current
+ */
+ public static int getCurrentStation(Context context) {
+ int currentStation = FmRadioUtils.DEFAULT_STATION;
+ Cursor cur = context.getContentResolver().query(
+ Station.CONTENT_URI,
+ new String[] {
+ Station.COLUMN_STATION_FREQ
+ },
+ Station.COLUMN_STATION_TYPE + "=?",
+ new String[] {
+ String.valueOf(STATION_TYPE_CURRENT)
+ },
+ null);
+ if (null != cur) {
+ try {
+ if (cur.moveToFirst()) {
+ currentStation = cur.getInt(0);
+ if (!FmRadioUtils.isValidStation(currentStation)) {
+ // If current station is invalid, use default and update
+ // the database
+ currentStation = FmRadioUtils.DEFAULT_STATION;
+ setCurrentStation(context, currentStation);
+ Log.w(TAG, "current station is invalid, use default!");
+ }
+ }
+ } finally {
+ cur.close();
+ }
+ }
+ Log.d(TAG, "FmRadioStation.getCurrentStation: " + currentStation);
+ return currentStation;
+ }
+
+ /**
+ * Set current station
+ *
+ * @param context The context
+ * @param station The station frequency
+ */
+ public static void setCurrentStation(Context context, int station) {
+ Log.d(TAG, "FmRadioStation.setCurrentStation start");
+ // Update current station to database.
+ final int size = 3;
+ ContentValues values = new ContentValues(size);
+ values.put(Station.COLUMN_STATION_NAME, CURRENT_STATION_NAME);
+ values.put(Station.COLUMN_STATION_FREQ, station);
+ values.put(Station.COLUMN_STATION_TYPE, STATION_TYPE_CURRENT);
+ context.getContentResolver().update(
+ Station.CONTENT_URI,
+ values,
+ Station.COLUMN_STATION_NAME + "=? AND " + Station.COLUMN_STATION_TYPE + "=?",
+ new String[] {
+ CURRENT_STATION_NAME, String.valueOf(STATION_TYPE_CURRENT)
+ });
+ Log.d(TAG, "FmRadioStation.setCurrentStation end");
+ }
+
+ /**
+ * Clean all stations which station type is searched
+ *
+ * @param context The context
+ */
+ public static void cleanSearchedStations(Context context) {
+ Log.d(TAG, "FmRadioStation.cleanSearchedStations start");
+ context.getContentResolver().delete(
+ Station.CONTENT_URI,
+ Station.COLUMN_STATION_TYPE + "=" + String.valueOf(STATION_TYPE_SEARCHED),
+ null);
+ Log.d(TAG, "FmRadioStation.cleanSearchedStations end");
+ }
+
+ /**
+ * Get station name according station frequency and station type
+ *
+ * @param context The context
+ * @param stationFreq The station frequency
+ * @param stationType The station type
+ *
+ * @return The station name
+ */
+ public static String getStationName(Context context, int stationFreq, int stationType) {
+ Log.d(TAG, "FmRadioStation.getStationName: type = "
+ + stationType + ", freq = " + stationFreq);
+ // If can't find this station id database, return default station name
+ String stationName = context.getString(R.string.default_station_name);
+ Cursor cur = context.getContentResolver().query(
+ Station.CONTENT_URI,
+ new String[] {
+ Station.COLUMN_STATION_NAME
+ },
+ Station.COLUMN_STATION_FREQ + "=? AND " + Station.COLUMN_STATION_TYPE + "=?",
+ new String[] {
+ String.valueOf(stationFreq), String.valueOf(stationType)
+ },
+ null);
+ if (null != cur) {
+ try {
+ if (cur.moveToFirst()) {
+ stationName = cur.getString(0);
+ }
+ } finally {
+ cur.close();
+ }
+ }
+ Log.d(TAG, "FmRadioStation.getStationName: stationName = " + stationName);
+ return stationName;
+ }
+
+ /**
+ * Judge whether station is a favorite station
+ *
+ * @param context The context
+ * @param iStation The station frequency
+ *
+ * @return true or false indicate whether station type is favorite
+ */
+ public static boolean isFavoriteStation(Context context, int iStation) {
+ return isStationExist(context, iStation, STATION_TYPE_FAVORITE);
+ }
+
+ /**
+ * Get station count according station type
+ *
+ * @param context The context
+ * @param stationType The station type
+ *
+ * @return The numbers of station according station type
+ */
+ public static int getStationCount(Context context, int stationType) {
+ Log.d(TAG, "FmRadioStation.getStationCount Type: " + stationType);
+ int stationNus = 0;
+ Cursor cur = context.getContentResolver().query(
+ Station.CONTENT_URI,
+ COLUMNS,
+ Station.COLUMN_STATION_TYPE + "=?",
+ new String[] {
+ String.valueOf(stationType)
+ },
+ null);
+ if (null != cur) {
+ try {
+ stationNus = cur.getCount();
+ } finally {
+ cur.close();
+ }
+ }
+ Log.d(TAG, "FmRadioStation.getStationCount: " + stationNus);
+ return stationNus;
+ }
+
+ /**
+ * Clear all station of FMRadio database
+ *
+ * @param context The application context
+ */
+ public static void cleanAllStations(Context context) {
+ Uri uri = Station.CONTENT_URI;
+ Cursor cur = context.getContentResolver().query(uri, COLUMNS, null, null, null);
+ if (null != cur) {
+ try {
+ cur.moveToFirst();
+ while (!cur.isAfterLast()) {
+ // Have find one station.
+ uri = ContentUris.appendId(Station.CONTENT_URI.buildUpon(),
+ cur.getInt(cur.getColumnIndex(Station._ID))).build();
+ context.getContentResolver().delete(uri, null, null);
+ cur.moveToNext();
+ }
+ } finally {
+ cur.close();
+ }
+ }
+ }
+}
diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioUtils.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioUtils.java
new file mode 100755
index 0000000..71bf6a0
--- /dev/null
+++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioUtils.java
@@ -0,0 +1,262 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2011-2014. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.fmradio;
+
+import android.content.Context;
+import android.os.Environment;
+import android.os.StatFs;
+import android.os.SystemProperties;
+import android.os.storage.StorageManager;
+import android.util.Log;
+
+import java.util.Locale;
+
+/**
+ * This class provider interface to compute station and frequency, get project
+ * string
+ */
+public class FmRadioUtils {
+ private static final String TAG = "FmRx/Utils";
+
+ // FM station variables
+ public static final int DEFAULT_STATION = 1000;
+ public static final float DEFAULT_STATION_FLOAT = computeFrequency(DEFAULT_STATION);
+ // maximum station frequency
+ private static final int HIGHEST_STATION = 1080;
+ // minimum station frequency
+ private static final int LOWEST_STATION = 875;
+ // station step
+ private static final int STEP = 1;
+ // convert rate
+ private static final int CONVERT_RATE = 10;
+
+/* Vanzo:yujianpeng on: Fri, 30 Jan 2015 14:44:52 +0800
+ * add FM FactoryMode
+ */
+ private static final String HEADSET_STATE_PATH = "/sys/class/switch/h2w/state";
+// End of Vanzo:yujianpeng
+ // minimum storage space for record
+ public static final long LOW_SPACE_THRESHOLD = 512 * 1024;
+ // StorageManager For FM record
+ private static StorageManager sStorageManager = null;
+ // short antenna
+ private static final boolean IS_FM_SHORT_ANTENNA_SUPPORT = SystemProperties.getBoolean(
+ "ro.mtk_fm_short_antenna_support", false);
+ // FM suspend feature
+ private static final boolean IS_FM_SUSPEND_SUPPORT = SystemProperties.getBoolean(
+ "ro.mtk_tc1_fm_at_suspend", false);
+
+ /**
+ * Whether the frequency is valid.
+ *
+ * @param station The FM station
+ *
+ * @return true if the frequency is in the valid scale, otherwise return
+ * false
+ */
+ public static boolean isValidStation(int station) {
+ boolean isValid = (station >= LOWEST_STATION && station <= HIGHEST_STATION);
+ Log.v(TAG, "isValidStation: freq = " + station + ", valid = " + isValid);
+ return isValid;
+ }
+
+ /**
+ * Compute increase station frequency
+ *
+ * @param station The station frequency
+ *
+ * @return station The frequency after increased
+ */
+ public static int computeIncreaseStation(int station) {
+ int result = station + STEP;
+ if (result > HIGHEST_STATION) {
+ result = LOWEST_STATION;
+ }
+ return result;
+ }
+
+ /**
+ * Compute decrease station frequency
+ *
+ * @param station The station frequency
+ *
+ * @return station The frequency after decreased
+ */
+ public static int computeDecreaseStation(int station) {
+ int result = station - STEP;
+ if (result < LOWEST_STATION) {
+ result = HIGHEST_STATION;
+ }
+ return result;
+ }
+
+ /**
+ * Compute station value with given frequency
+ *
+ * @param frequency The station frequency
+ *
+ * @return station The result value
+ */
+ public static int computeStation(float frequency) {
+ return (int) (frequency * CONVERT_RATE);
+ }
+
+ /**
+ * Compute frequency value with given station
+ *
+ * @param station The station value
+ *
+ * @return station The frequency
+ */
+ public static float computeFrequency(int station) {
+ return (float) station / CONVERT_RATE;
+ }
+
+ /**
+ * According station to get frequency string
+ *
+ * @param station for 100KZ, range 875-1080
+ *
+ * @return string like 87.5
+ */
+ public static String formatStation(int station) {
+ float frequency = (float) station / CONVERT_RATE;
+ String result = String.format(Locale.ENGLISH, "%.1f",
+ Float.valueOf(frequency));
+ return result;
+ }
+
+ /**
+ * Get the phone storage path
+ *
+ * @return The phone storage path
+ */
+ public static String getDefaultStoragePath() {
+ return Environment.getExternalStorageDirectory().getPath();
+ }
+
+ /**
+ * Get the default storage state
+ *
+ * @return The default storage state
+ */
+ public static String getDefaultStorageState(Context context) {
+ ensureStorageManager(context);
+ String state = sStorageManager.getVolumeState(getDefaultStoragePath());
+ Log.d(TAG, "getDefaultStorageState() return state:" + state);
+ return state;
+ }
+
+ private static void ensureStorageManager(Context context) {
+ if (sStorageManager == null) {
+ sStorageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
+ }
+ }
+
+ /**
+ * Get the FM play list path
+ *
+ * @param context The context
+ *
+ * @return The FM play list path
+ */
+ public static String getPlaylistPath(Context context) {
+ ensureStorageManager(context);
+ String[] externalStoragePaths = sStorageManager.getVolumePaths();
+ String path = externalStoragePaths[0] + "/Playlists/";
+ return path;
+ }
+
+/* Vanzo:yujianpeng on: Fri, 30 Jan 2015 14:46:21 +0800
+ * add FM FactoryMode
+ */
+ static boolean isWiredHeadsetReallyOn() {
+ try {
+ char[] buffer = new char[8];
+ java.io.FileReader file = new java.io.FileReader(HEADSET_STATE_PATH);
+ int len = file.read(buffer, 0, 8);
+ int state = Integer.valueOf((new String(buffer, 0, len)).trim());
+ file.close();
+ return (state == 1 || state == 2);
+ } catch (java.io.FileNotFoundException e) {
+ e.printStackTrace();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return false;
+ }
+// End of Vanzo:yujianpeng
+ /**
+ * Check if has enough space for record
+ *
+ * @param recordingSdcard The recording sdcard path
+ *
+ * @return true if has enough space for record
+ */
+ public static boolean hasEnoughSpace(String recordingSdcard) {
+ boolean ret = false;
+ try {
+ StatFs fs = new StatFs(recordingSdcard);
+ long blocks = fs.getAvailableBlocks();
+ long blockSize = fs.getBlockSize();
+ long spaceLeft = blocks * blockSize;
+ Log.d(TAG, "hasEnoughSpace: available space=" + spaceLeft);
+ ret = spaceLeft > LOW_SPACE_THRESHOLD ? true : false;
+ } catch (IllegalArgumentException e) {
+ Log.e(TAG, "sdcard may be unmounted:" + recordingSdcard);
+ }
+ return ret;
+ }
+
+ /**
+ * Check if support short antenna. If true, can play FM without headset
+ * @return true if support
+ */
+ public static boolean isFmShortAntennaSupport() {
+ return IS_FM_SHORT_ANTENNA_SUPPORT;
+ }
+
+ /**
+ * Check if support FM suspend feature. If true, will not aquire wakelock.
+ * @return true if support
+ */
+ public static boolean isFmSuspendSupport() {
+ return IS_FM_SUSPEND_SUPPORT;
+ }
+
+}
diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRecordDialogFragment.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRecordDialogFragment.java
new file mode 100755
index 0000000..a44c15e
--- /dev/null
+++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRecordDialogFragment.java
@@ -0,0 +1,333 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2011-2014. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.fmradio;
+
+import android.app.Activity;
+import android.app.DialogFragment;
+import android.os.Bundle;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import java.io.File;
+
+/**
+ * The dialog fragment for save recording file
+ */
+public class FmRecordDialogFragment extends DialogFragment {
+ private static final String TAG = "FmRx/RecordDlg";
+
+ // save recording file button
+ private Button mButtonSave = null;
+ // discard recording file button
+ private Button mButtonDiscard = null;
+ // rename recording file edit text
+ private EditText mRecordingNameEditText = null;
+ // recording file default name
+ private String mDefaultRecordingName = null;
+ // recording file to save name
+ private String mRecordingNameToSave = null;
+ // text view which show storage warning
+ private TextView mStorageWarningTextView = null;
+ private OnRecordingDialogClickListener mListener = null;
+
+ // The default filename need't to check whether exist
+ private boolean mIsNeedCheckFilenameExist = false;
+ // record sd card path when start recording
+ private String mRecordingSdcard = null;
+
+ /**
+ * FM record dialog fragment, because fragment manager need empty
+ * constructor to instantiated this dialog fragment when configuration
+ * change
+ */
+ public FmRecordDialogFragment() {
+ }
+
+ /**
+ * FM record dialog fragment according name, should pass value recording
+ * file name
+ *
+ * @param defaultName The default file name in FileSystem
+ * @param recordingName The name in the dialog for show and save
+ */
+ public FmRecordDialogFragment(String sdcard, String defaultName, String recordingName) {
+ mRecordingSdcard = sdcard;
+ mDefaultRecordingName = defaultName;
+ mRecordingNameToSave = recordingName;
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ try {
+ mListener = (OnRecordingDialogClickListener) activity;
+ } catch (ClassCastException e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * When onCreate Set dialog style
+ *
+ * @param savedInstanceState The save instance state
+ */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ Log.d(TAG, ">>onCreate() savedInstanceState:" + savedInstanceState);
+ setStyle(DialogFragment.STYLE_NO_TITLE, 0);
+ Log.d(TAG, "<<onCreate()");
+ }
+
+ /**
+ * Inflate view and get the operation button
+ *
+ * @param inflater The layout inflater
+ * @param container The view group container
+ * @param savedInstanceState The save instance state
+ *
+ * @return The inflater view
+ */
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.fm_recorder_dialog, container, false);
+ mButtonSave = (Button) view.findViewById(R.id.fm_recording_btn_save);
+ mButtonSave.setOnClickListener(mButtonOnClickListener);
+
+ mButtonDiscard = (Button) view.findViewById(R.id.fm_recording_btn_discard);
+ mButtonDiscard.setOnClickListener(mButtonOnClickListener);
+
+ mStorageWarningTextView = (TextView) view
+ .findViewById(R.id.save_recording_storage_warning);
+
+ // Set the recording edit text
+ mRecordingNameEditText = (EditText) view.findViewById(R.id.fm_recording_text);
+ return view;
+ }
+
+ /**
+ * Set the dialog edit text and other attribute
+ */
+ @Override
+ public void onResume() {
+ super.onResume();
+ Log.d(TAG, ">>onResume()");
+
+ // check if storage is OK, if not enough storage, make view visible
+ if (!FmRadioUtils.hasEnoughSpace(mRecordingSdcard)) {
+ mStorageWarningTextView.setVisibility(View.VISIBLE);
+ }
+
+ // have define in fm_recorder_dialog.xml length at most
+ // 250(maxFileLength - suffixLength)
+ mRecordingNameEditText.setSingleLine(true);
+
+ if (mDefaultRecordingName != null) {
+ if (null != mRecordingNameToSave) {
+ // this case just for,fragment recreate
+ mRecordingNameEditText.setText(mRecordingNameToSave);
+ if ("".equals(mRecordingNameToSave)) {
+ mButtonSave.setEnabled(false);
+ }
+ } else {
+ mRecordingNameEditText.setText(mDefaultRecordingName);
+ }
+
+ mRecordingNameEditText.selectAll();
+ }
+ mRecordingNameEditText.setHint(getActivity().getResources().getString(
+ R.string.edit_recording_name_hint));
+ mRecordingNameEditText.requestFocus();
+ setTextChangedCallback();
+ getDialog().setCanceledOnTouchOutside(false);
+ getDialog().getWindow().setSoftInputMode(
+ WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE
+ | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
+ Log.d(TAG, "<<onResume()");
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ Log.d(TAG, ">>onSaveInstanceState()");
+ super.onSaveInstanceState(outState);
+ }
+
+ @Override
+ public void onDestroy() {
+ Log.d(TAG, ">>onDestroy()");
+ mDefaultRecordingName = null;
+ mRecordingNameToSave = null;
+ mListener = null;
+ Log.d(TAG, "<<onDestroy()");
+ super.onDestroy();
+ }
+
+ /**
+ * This method register callback and set filter to Edit, in order to make
+ * sure that user input is legal. The input can't be illegal filename and
+ * can't be too long.
+ */
+ private void setTextChangedCallback() {
+ mRecordingNameEditText.addTextChangedListener(new TextWatcher() {
+ // not use, so don't need to implement it
+ @Override
+ public void afterTextChanged(Editable arg0) {
+ }
+
+ // not use, so don't need to implement it
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ }
+
+ /**
+ * check user input whether include invalid character
+ */
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ Log.d(TAG, "onTextChanged() s:" + s + ", start:" + start +
+ ", before:" + before + ", count:" + count);
+ // Filename changed, so we should check the new filename is
+ // whether exist.
+ mIsNeedCheckFilenameExist = true;
+ String recordName = s.toString().trim();
+ // Characters not allowed by file system
+ if (recordName.length() <= 0
+ || recordName.startsWith(".")
+ || recordName.matches(".*[/\\\\:*?\"<>|\t].*")) {
+ mButtonSave.setEnabled(false);
+ } else {
+ mButtonSave.setEnabled(true);
+ }
+
+ mRecordingNameToSave = mRecordingNameEditText.getText().toString().trim();
+ Log.d(TAG, "onTextChanged mRecordingNameToSave:" + mRecordingNameToSave);
+ }
+ });
+ }
+
+ private OnClickListener mButtonOnClickListener = new OnClickListener() {
+ /**
+ * Define the button operation
+ */
+ @Override
+ public void onClick(View v) {
+
+ switch (v.getId()) {
+ case R.id.fm_recording_btn_save:
+ String msg = null;
+ // Check the recording name whether exist
+ mRecordingNameToSave = mRecordingNameEditText.getText().toString().trim();
+ File recordingFolderPath = new File(mRecordingSdcard, "FM Recording");
+ File recordingFileToSave =
+ new File(recordingFolderPath, mRecordingNameToSave
+ + FmRecorder.RECORDING_FILE_EXTENSION);
+
+ // If the new name is same as default name ,need't to check!
+ if (mDefaultRecordingName == null) {
+ Log.e(TAG, "Error:recording file is not exist!");
+ return;
+ }
+ if (mDefaultRecordingName.equals(mRecordingNameToSave)) {
+ mIsNeedCheckFilenameExist = false;
+ } else {
+ mIsNeedCheckFilenameExist = true;
+ }
+
+ Log.d(TAG, "save:" + mDefaultRecordingName + "->" + mRecordingNameToSave +
+ ", " + mIsNeedCheckFilenameExist);
+ if (recordingFileToSave.exists() && mIsNeedCheckFilenameExist) {
+ // show a toast notification if can't renaming a file/folder
+ // to the same name
+ msg = mRecordingNameEditText.getText().toString() + " "
+ + getActivity().getResources().getString(R.string.already_exists);
+ Log.d(TAG, "file " + mRecordingNameToSave + ".ogg is already exists!");
+ Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT).show();
+ } else {
+ if (null != mListener) {
+ mListener.onRecordingDialogClick(mRecordingNameToSave);
+ }
+ dismissAllowingStateLoss();
+ }
+ break;
+
+ case R.id.fm_recording_btn_discard:
+ if (null != mListener) {
+ mListener.onRecordingDialogClick(null);
+ }
+ dismissAllowingStateLoss();
+ Log.d(TAG, "Discard FM recording file. ");
+ break;
+
+ default:
+ break;
+ }
+ }
+ };
+
+ /**
+ * The listener for click Save or Discard
+ */
+ public interface OnRecordingDialogClickListener {
+ /**
+ * Record dialog click callback
+ *
+ * @param recordingName The user input recording name
+ */
+ void onRecordingDialogClick(String recordingName);
+ }
+
+ /**
+ * Get the latest modified recording name
+ *
+ * @return The latest modified recording name
+ */
+ public String getRecordingNameToSave() {
+ return mRecordingNameToSave;
+ }
+}
diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRecorder.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRecorder.java
new file mode 100755
index 0000000..be7452c
--- /dev/null
+++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRecorder.java
@@ -0,0 +1,807 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2011-2014. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.fmradio;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.database.Cursor;
+import android.media.MediaPlayer;
+import android.media.MediaRecorder;
+import android.media.MediaScannerConnection;
+import android.net.Uri;
+import android.os.Environment;
+import android.os.SystemClock;
+import android.provider.MediaStore;
+import android.text.format.DateFormat;
+import android.util.Log;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+/**
+ * This class provider interface to recording, stop recording, save recording
+ * file, play recording file
+ */
+public class FmRecorder implements MediaPlayer.OnCompletionListener,
+ MediaPlayer.OnErrorListener, MediaRecorder.OnErrorListener {
+ private static final String TAG = "FmRx/Recorder";
+ // file prefix
+ private static final String RECORDING_FILE_PREFIX = "FM";
+ // file extensition
+ public static final String RECORDING_FILE_EXTENSION = ".3gpp";
+ // recording file folder
+ private static final String FM_RECORD_FOLDER = "FM Recording";
+ private static final String RECORDING_FILE_TYPE = "audio/3gpp";
+ private static final String RECORDING_FILE_SOURCE = "FM Recordings";
+ // error type no sdcard
+ public static final int ERROR_SDCARD_NOT_PRESENT = 0;
+ // error type sdcard not have enough space
+ public static final int ERROR_SDCARD_INSUFFICIENT_SPACE = 1;
+ // error type can't write sdcard
+ public static final int ERROR_SDCARD_WRITE_FAILED = 2;
+ // error type recorder internal error occur
+ public static final int ERROR_RECORDER_INTERNAL = 3;
+ // error type player internal error occur
+ public static final int ERROR_PLAYER_INTERNAL = 4;
+ // error type recorder state is invalid
+ public static final int ERROR_RECORDER_INVALID_STATE = 5;
+ // FM Recorder state not recording and not playing
+ public static final int STATE_IDLE = 5;
+ // FM Recorder state recording
+ public static final int STATE_RECORDING = 6;
+ // FM Recorder state playing
+ public static final int STATE_PLAYBACK = 7;
+ // FM Recorder state invalid, need to check
+ public static final int STATE_INVALID = -1;
+
+ // use to record current FM recorder state
+ public int mInternalState = STATE_IDLE;
+ // the recording time after start recording
+ private long mRecordTime = 0;
+ // record start time
+ private long mRecordStartTime = 0;
+ // current record file
+ private File mRecordFile = null;
+ // record current record file is saved by user
+ private boolean mIsRecordingFileSaved = false;
+ // listener use for notify service the record state or error state
+ private OnRecorderStateChangedListener mStateListener = null;
+ // player use for play recording file
+ private MediaPlayer mPlayer = null;
+ // recorder use for record file
+ private MediaRecorder mRecorder = null;
+
+ /**
+ * Start recording the voice of FM, also check the pre-conditions, if not
+ * meet, will return an error message to the caller. if can start recording
+ * success, will set FM record state to recording and notify to the caller
+ */
+ public void startRecording(Context context) {
+ Log.d(TAG, ">> startRecording");
+ mRecordTime = 0;
+
+ // Check external storage
+ if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
+ Log.e(TAG, "No external storage available");
+ setError(ERROR_SDCARD_NOT_PRESENT);
+ return;
+ }
+
+ String recordingSdcard = FmRadioUtils.getDefaultStoragePath();
+ // check whether have sufficient storage space, if not will notify
+ // caller error message
+ if (!FmRadioUtils.hasEnoughSpace(recordingSdcard)) {
+ setError(ERROR_SDCARD_INSUFFICIENT_SPACE);
+ Log.e(TAG, "SD card does not have sufficient space!!");
+ return;
+ }
+
+ // get external storage directory
+ File sdDir = new File(recordingSdcard);
+ Log.d(TAG, "external storage dir = " + sdDir.getAbsolutePath());
+ File recordingDir = new File(sdDir, FM_RECORD_FOLDER);
+ // exist a file named FM Recording, so can't create FM recording folder
+ if (recordingDir.exists() && !recordingDir.isDirectory()) {
+ Log.e(TAG, "A FILE with name \"FM Recording\" already exists!!");
+ setError(ERROR_SDCARD_WRITE_FAILED);
+ return;
+ } else if (!recordingDir.exists()) { // try to create recording folder
+ boolean mkdirResult = recordingDir.mkdir();
+ if (!mkdirResult) { // create recording file failed
+ setError(ERROR_RECORDER_INTERNAL);
+ return;
+ }
+ }
+ // create recording temporary file
+ long curTime = System.currentTimeMillis();
+ Date date = new Date(curTime);
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.ENGLISH);
+ String time = simpleDateFormat.format(date);
+ StringBuilder stringBuilder = new StringBuilder();
+ stringBuilder.append(RECORDING_FILE_PREFIX).append(
+ "_").append(time).append(RECORDING_FILE_EXTENSION);
+ String name = stringBuilder.toString();
+ mRecordFile = new File(recordingDir, name);
+ try {
+ if (mRecordFile.createNewFile()) {
+ Log.e(TAG, "createNewFile success");
+ }
+ } catch (IOException ioex) {
+ Log.e(TAG, "IOException while createTempFile: " + ioex);
+ ioex.printStackTrace();
+ setError(ERROR_SDCARD_WRITE_FAILED);
+ return;
+ }
+ // set record parameter and start recording
+ try {
+ Log.d(TAG, "new record file is:" + mRecordFile.getName());
+
+ mRecorder = new MediaRecorder();
+ Log.d(TAG, "startRecording: create new media record instance");
+ mRecorder.setOnErrorListener(this);
+ mRecorder.setAudioSource(MediaRecorder.AudioSource.FM_TUNER);
+ mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
+ mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
+ final int samplingRate = 44100;
+ mRecorder.setAudioSamplingRate(samplingRate);
+ final int bitRate = 128000;
+ mRecorder.setAudioEncodingBitRate(bitRate);
+ final int channels = 2;
+ mRecorder.setAudioChannels(channels);
+ mRecorder.setOutputFile(mRecordFile.getAbsolutePath());
+ mRecorder.prepare();
+ mRecordStartTime = SystemClock.elapsedRealtime();
+ mRecorder.start();
+ mIsRecordingFileSaved = false;
+ Log.d(TAG, "startRecording: start");
+ } catch (IllegalStateException e) {
+ Log.e(TAG, "IllegalStateException while starting recording!", e);
+ setError(ERROR_RECORDER_INTERNAL);
+ return;
+ } catch (IOException e) {
+ Log.e(TAG, "IOException while starting recording!", e);
+ setError(ERROR_RECORDER_INTERNAL);
+ return;
+ } catch (RuntimeException e) {
+ Log.e(TAG, "RuntimeException while start recording", e);
+ setError(ERROR_RECORDER_INTERNAL);
+ return;
+ }
+ setState(STATE_RECORDING);
+ Log.d(TAG, "<< startRecording");
+ }
+
+ /**
+ * Stop recording, compute recording time and update FM recorder state
+ */
+ public void stopRecording() {
+ Log.d(TAG, ">> stopRecording");
+ if (STATE_RECORDING != mInternalState) {
+ Log.w(TAG, "stopRecording() called in wrong state!!");
+ return;
+ }
+
+ mRecordTime = SystemClock.elapsedRealtime() - mRecordStartTime;
+ stopRecorder();
+ setState(STATE_IDLE);
+ Log.d(TAG, "<< stopRecording");
+ }
+
+ /**
+ * Play current recorded file, if failed notify error message to caller, if
+ * success update FM recorder state
+ */
+ public void startPlayback() {
+ Log.d(TAG, ">> startPlayback");
+ if (null == mRecordFile) {
+ Log.e(TAG, "no file to playback!");
+ return;
+ }
+
+ mPlayer = new MediaPlayer();
+ try {
+ mPlayer.setDataSource(mRecordFile.getAbsolutePath());
+ Log.d(TAG, "MediaPlayer.setDataSource(" + mRecordFile.getAbsolutePath() + ")");
+ mPlayer.setOnCompletionListener(this);
+ mPlayer.setOnErrorListener(this);
+ mPlayer.prepare();
+ Log.d(TAG, "MediaPlayer.prepare()");
+ mPlayer.start();
+ } catch (IOException e) {
+ Log.e(TAG, "Exception while trying to playback recording file: " + e);
+ setError(ERROR_PLAYER_INTERNAL);
+ return;
+ } catch (IllegalArgumentException e) {
+ Log.e(TAG, "Exception while trying to playback recording file: " + e);
+ setError(ERROR_PLAYER_INTERNAL);
+ return;
+ } catch (SecurityException e) {
+ Log.e(TAG, "Exception while trying to playback recording file: " + e);
+ setError(ERROR_PLAYER_INTERNAL);
+ return;
+ } catch (IllegalStateException e) {
+ Log.e(TAG, "Exception while trying to playback recording file: " + e);
+ setError(ERROR_PLAYER_INTERNAL);
+ return;
+ }
+ setState(STATE_PLAYBACK);
+ Log.d(TAG, "<< startPlayback");
+ }
+
+ /**
+ * Stop playing the current recording file, and update FM recorder state
+ */
+ public void stopPlayback() {
+ Log.d(TAG, ">> stopPlayback");
+ if (null == mPlayer || STATE_PLAYBACK != mInternalState ||
+ (null != mPlayer && !mPlayer.isPlaying())) {
+ Log.w(TAG, "stopPlayback called in wrong state!!");
+ // need call back to update button status
+ setState(STATE_IDLE);
+ return;
+ }
+ stopPlayer();
+ setState(STATE_IDLE);
+ Log.d(TAG, "<< stopPlayback");
+ }
+
+ /**
+ * Compute the current record time
+ *
+ * @return The current record time
+ */
+ public long recordTime() {
+ if (STATE_RECORDING == mInternalState) {
+ mRecordTime = SystemClock.elapsedRealtime() - mRecordStartTime;
+ }
+ return mRecordTime;
+ }
+
+ /**
+ * Get FM recorder current state
+ *
+ * @return FM recorder current state
+ */
+ public int getState() {
+ return mInternalState;
+ }
+
+ /**
+ * Get current recording file name
+ *
+ * @return The current recording file name
+ */
+ public String getRecordingName() {
+ if (null != mRecordFile) {
+ String fileName = mRecordFile.getName();
+ if (fileName.toLowerCase().endsWith(RECORDING_FILE_EXTENSION)
+ && fileName.length() > RECORDING_FILE_EXTENSION.length()) {
+ // remove the extension sub string first
+ fileName = fileName.substring(0, fileName.length() -
+ RECORDING_FILE_EXTENSION.length());
+ }
+ return fileName;
+ }
+ return null;
+ }
+
+ /**
+ * Get current recording file name with full path
+ *
+ * @return The current recording file name with path
+ */
+ public String getRecordingNameWithPath() {
+ if (null != mRecordFile) {
+ String fileName = mRecordFile.getAbsolutePath();
+ if (fileName.toLowerCase().endsWith(RECORDING_FILE_EXTENSION)
+ && fileName.length() > RECORDING_FILE_EXTENSION.length()) {
+ // remove the extension sub string first
+ fileName = fileName.substring(0, fileName.length() -
+ RECORDING_FILE_EXTENSION.length());
+ }
+ Log.d(TAG, "getRecordingNameWithPath: fileName is " + fileName);
+ return fileName;
+ }
+ return null;
+ }
+
+ /**
+ * Save recording with the given name, and save recording file info to
+ * database
+ *
+ * @param context The context
+ * @param newName The name to override default recording name
+ */
+ public void saveRecording(Context context, String newName) {
+ Log.d(TAG, ">> saveRecording(" + newName + ")");
+ if (null == mRecordFile) {
+ Log.e(TAG, "<< saveRecording: recording file is null!");
+ return;
+ }
+
+ File parentFile = mRecordFile.getParentFile();
+ if (null == parentFile) {
+ Log.e(TAG, "<< saveRecording: parent recording file is null!");
+ return;
+ }
+
+ // rename the recording file with given name
+ if (null != newName && !newName.equals(getRecordingName())) {
+ File sdFile = new File(parentFile.getPath(),
+ newName + RECORDING_FILE_EXTENSION);
+ if (sdFile.exists()) {
+ Log.w(TAG, "A file with the same new name will be deleted: " +
+ sdFile.getAbsolutePath());
+ if (!sdFile.delete()) {
+ Log.e(TAG, "can't delete the file already exits");
+ }
+ }
+ if (null != parentFile) {
+ if (!mRecordFile.renameTo(new File(parentFile.getPath(),
+ newName + RECORDING_FILE_EXTENSION))) {
+ Log.e(TAG, "can't rename file, use default name to save");
+ newName = getRecordingName();
+ }
+ mRecordFile = new File(parentFile.getPath(),
+ newName + RECORDING_FILE_EXTENSION);
+ }
+ }
+ mIsRecordingFileSaved = true;
+ // save recording file info to database
+ addCurrentRecordingToDb(context);
+ Log.d(TAG, "<< saveRecording(" + newName + ")");
+ }
+
+ /**
+ * Discard current recording file, release recorder and player
+ */
+ public void discardRecording() {
+ Log.d(TAG, ">> discardRecording");
+ // release recorder
+ if ((STATE_RECORDING == mInternalState) && (null != mRecorder)) {
+ stopRecorder();
+ // release player
+ } else if ((STATE_PLAYBACK == mInternalState) && (null != mPlayer)) {
+ stopPlayer();
+ }
+
+ if (null != mRecordFile && !mIsRecordingFileSaved) {
+ if (!mRecordFile.delete()) {
+ // deletion failed, possibly due to hot plug out SD card
+ Log.d(TAG, "discardRecording: deletion failed!");
+ }
+ mRecordFile = null;
+ mRecordStartTime = 0;
+ mRecordTime = 0;
+ }
+ setState(STATE_IDLE);
+ Log.d(TAG, "<< discardRecording");
+ }
+
+ /**
+ * Set the callback use to notify FM recorder state and error message
+ *
+ * @param listener the callback
+ */
+ public void registerRecorderStateListener(OnRecorderStateChangedListener listener) {
+ mStateListener = listener;
+ }
+
+ /**
+ * Interface to notify FM recorder state and error message
+ */
+ public interface OnRecorderStateChangedListener {
+ /**
+ * notify FM recorder state
+ *
+ * @param state current FM recorder state
+ */
+ void onRecorderStateChanged(int state);
+
+ /**
+ * notify FM recorder error message
+ *
+ * @param error error type
+ */
+ void onRecorderError(int error);
+
+ /**
+ * notify play FM record file complete
+ */
+ void onPlayRecordFileComplete();
+ }
+
+ /**
+ * When complete current recording file, release player and update FM
+ * recorder state to idle
+ *
+ * @param mp The current player
+ */
+ @Override
+ public void onCompletion(MediaPlayer mp) {
+ Log.d(TAG, ">> MediaPlayer.onCompletion");
+ synchronized (this) {
+ if (null != mPlayer) {
+ mPlayer.stop();
+ mPlayer.release();
+ mPlayer = null;
+ }
+ }
+ setState(STATE_IDLE);
+ if (null != mStateListener) {
+ mStateListener.onPlayRecordFileComplete();
+ }
+ Log.d(TAG, "<< MediaPlayer.onCompletion");
+ }
+
+ /**
+ * If player occur error, release player, notify error message, update FM
+ * recorder state to idle
+ *
+ * @param mp The current player
+ * @param what The error message type
+ * @param extra The error message extra
+ * @return true or false indicate handle this error or not
+ */
+ @Override
+ public boolean onError(MediaPlayer mp, int what, int extra) {
+ Log.e(TAG, "MediaPlayer.onError: what=" + what + ", extra=" + extra);
+ int error = (MediaPlayer.MEDIA_ERROR_SERVER_DIED == what) ? what : ERROR_PLAYER_INTERNAL;
+ setError(error);
+ synchronized (this) {
+ if (null != mPlayer) {
+ mPlayer.release();
+ mPlayer = null;
+ }
+ }
+ if (STATE_PLAYBACK == mInternalState) {
+ setState(STATE_IDLE);
+ }
+ return true;
+ }
+
+ /**
+ * When recorder occur error, release player, notify error message, and
+ * update FM recorder state to idle
+ *
+ * @param mr The current recorder
+ * @param what The error message type
+ * @param extra The error message extra
+ */
+ @Override
+ public void onError(MediaRecorder mr, int what, int extra) {
+ Log.e(TAG, "MediaRecorder.onError: what=" + what + ", extra=" + extra);
+ stopRecorder();
+ setError(ERROR_RECORDER_INTERNAL);
+ if (STATE_RECORDING == mInternalState) {
+ setState(STATE_IDLE);
+ }
+ }
+
+ /**
+ * Reset FM recorder
+ */
+ public void resetRecorder() {
+ if (mRecorder != null) {
+ mRecorder.release();
+ mRecorder = null;
+ }
+ if (mPlayer != null) {
+ mPlayer.release();
+ mPlayer = null;
+ }
+ mRecordFile = null;
+ mRecordStartTime = 0;
+ mRecordTime = 0;
+ mInternalState = STATE_IDLE;
+ }
+
+ /**
+ * Notify error message to the callback
+ *
+ * @param error FM recorder error type
+ */
+ private void setError(int error) {
+ Log.e(TAG, "setError: " + error);
+ if (null != mStateListener) {
+ mStateListener.onRecorderError(error);
+ }
+ }
+
+ /**
+ * Notify FM recorder state message to the callback
+ *
+ * @param state FM recorder current state
+ */
+ private void setState(int state) {
+ mInternalState = state;
+ if (null != mStateListener) {
+ mStateListener.onRecorderStateChanged(state);
+ }
+ }
+
+ /**
+ * Save recording file info to database
+ *
+ * @param context application context
+ */
+ public void addCurrentRecordingToDb(final Context context) {
+ Log.v(TAG, ">> addCurrentRecordingToDb");
+ if (null == mRecordFile || !mRecordFile.exists()) {
+ Log.e(TAG, "<< addCurrentRecordingToDb: file does not exists");
+ return;
+ }
+ long curTime = System.currentTimeMillis();
+ long modDate = mRecordFile.lastModified();
+ Date date = new Date(curTime);
+
+// java.text.DateFormat dateFormatter = DateFormat.getDateFormat(context);
+// java.text.DateFormat timeFormatter = DateFormat.getTimeFormat(context);
+ String title = getRecordingName();
+// StringBuilder stringBuilder = new StringBuilder();
+// stringBuilder.append(FM_RECORD_FOLDER).append(" ").append(
+// dateFormatter.format(date)).append(" ").append(
+// timeFormatter.format(date));
+// String artist = stringBuilder.toString();
+
+ final int size = 8;
+ ContentValues cv = new ContentValues(size);
+ cv.put(MediaStore.Audio.Media.IS_MUSIC, 1);
+ cv.put(MediaStore.Audio.Media.TITLE, title);
+ cv.put(MediaStore.Audio.Media.DATA, mRecordFile.getAbsolutePath());
+ final int oneSecond = 1000;
+ cv.put(MediaStore.Audio.Media.DATE_ADDED, (int) (curTime / oneSecond));
+ cv.put(MediaStore.Audio.Media.DATE_MODIFIED, (int) (modDate / oneSecond));
+ cv.put(MediaStore.Audio.Media.MIME_TYPE, RECORDING_FILE_TYPE);
+// cv.put(MediaStore.Audio.Media.ARTIST, artist);
+ cv.put(MediaStore.Audio.Media.ALBUM, RECORDING_FILE_SOURCE);
+ cv.put(MediaStore.Audio.Media.DURATION, mRecordTime);
+
+ int recordingId = addToMediaDB(context, cv);
+ if (-1 == recordingId) {
+ // insert failed
+ return;
+ }
+ int playlistId = getPlaylistId(context);
+ if (-1 == playlistId) {
+ // play list not exist, create FM Recording play list
+ playlistId = createPlaylist(context);
+ }
+ if (-1 == playlistId) {
+ // insert playlist failed
+ return;
+ }
+ // insert item to FM recording play list
+ addToPlaylist(context, playlistId, recordingId);
+ // Notify applications listening to the scanner events that
+ // a recorded audio file just created.
+ // Connect to mediascanner to update duration
+ MediaScannerConnection.scanFile(context,
+ new String[] {
+ mRecordFile.getAbsolutePath()
+ }, null, null);
+ }
+
+ private int getPlaylistId(final Context context) {
+ Cursor playlistCursor = context.getContentResolver().query(
+ MediaStore.Audio.Playlists.getContentUri("external"),
+ new String[] {
+ MediaStore.Audio.Playlists._ID
+ },
+ MediaStore.Audio.Playlists.DATA + "=?",
+ new String[] {
+ FmRadioUtils.getPlaylistPath(context) + RECORDING_FILE_SOURCE
+ },
+ null);
+ int playlistId = -1;
+ if (null != playlistCursor) {
+ try {
+ if (playlistCursor.moveToFirst()) {
+ playlistId = playlistCursor.getInt(0);
+ }
+ } finally {
+ playlistCursor.close();
+ }
+ }
+ return playlistId;
+ }
+
+ private int createPlaylist(final Context context) {
+ final int size = 1;
+ ContentValues cv = new ContentValues(size);
+ cv.put(MediaStore.Audio.Playlists.NAME, RECORDING_FILE_SOURCE);
+ Log.d(TAG, "addToPlaylist: insert playlist");
+ Uri newPlaylistUri = context.getContentResolver().insert(
+ MediaStore.Audio.Playlists.getContentUri("external"), cv);
+ if (newPlaylistUri == null) {
+ Log.d(TAG, "createPlaylist: insert failed");
+ return -1;
+ }
+ return Integer.valueOf(newPlaylistUri.getLastPathSegment());
+ }
+
+ private int addToMediaDB(final Context context, final ContentValues cv) {
+ Uri insertResult = null;
+ int recordingId = -1;
+
+ Cursor existItems = context.getContentResolver().query(
+ MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
+ new String[] {
+ "_id"
+ },
+ MediaStore.Audio.Media.DATA + "=?",
+ new String[] {
+ mRecordFile.getAbsolutePath()
+ },
+ null);
+
+ if (null != existItems) {
+ try {
+
+ if (existItems.moveToFirst()) {
+ // there's already a file with the same name in DB, update
+ // the item.
+ recordingId = existItems.getInt(0);
+ Log.d(TAG, "existing items update recording id" + recordingId);
+ int rowCnt = context.getContentResolver().update(
+ MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
+ cv,
+ MediaStore.Audio.Media.DATA + "=?",
+ new String[] {
+ mRecordFile.getAbsolutePath()
+ });
+
+ } else {
+ // not exist file has a same name in DB, insert the item.
+ Log.d(TAG, "addToMediaDB: insert data");
+ insertResult = context.getContentResolver().insert(
+ MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, cv);
+ if (null != insertResult) {
+ recordingId = Integer.valueOf(insertResult.getLastPathSegment());
+ }
+ }
+ } finally {
+ existItems.close();
+ existItems = null;
+ }
+ }
+ return recordingId;
+ }
+
+ private void addToPlaylist(final Context context, final int playlistId, final int recordingId) {
+ if (-1 == playlistId) {
+ return;
+ }
+ Uri membersUri = MediaStore.Audio.Playlists.Members.getContentUri("external", playlistId);
+ Cursor itemInMembers = context.getContentResolver().query(membersUri,
+ new String[] {
+ MediaStore.Audio.Playlists.Members.AUDIO_ID
+ },
+ MediaStore.Audio.Playlists.Members.AUDIO_ID + "=?",
+ new String[] {
+ String.valueOf(recordingId)
+ }, null);
+ if (null != itemInMembers) {
+ try {
+ if (itemInMembers.moveToFirst()) {
+ // Item already in playlist member,
+ // no further actions (modify play_order is difficult,
+ // since a same audio_id can appear multiple times in one
+ // playlist
+ // with different play_order)
+ Log.d(TAG, "addToPlaylist new item already in playlists.members table");
+ return;
+ }
+ } finally {
+ itemInMembers.close();
+ itemInMembers = null;
+ }
+ }
+ Log.d(TAG, "addToPlaylist: query members");
+ Cursor membersCursor = context.getContentResolver().query(
+ membersUri,
+ new String[] {
+ "count(*)"
+ },
+ null,
+ null,
+ null);
+
+ if (null != membersCursor) {
+ try {
+ if (membersCursor.moveToFirst()) {
+ // insert item to playlist
+ int base = membersCursor.getInt(0);
+ final int size = 2;
+ ContentValues cv = new ContentValues(size);
+ cv.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, Integer.valueOf(base));
+ cv.put(MediaStore.Audio.Playlists.Members.AUDIO_ID, recordingId);
+ Log.d(TAG, "addToPlaylist: insert to members");
+ context.getContentResolver().insert(membersUri, cv);
+ }
+ } finally {
+ membersCursor.close();
+ membersCursor = null;
+ }
+ }
+ }
+
+ private void stopRecorder() {
+ synchronized (this) {
+ if (null != mRecorder) {
+ try {
+ mRecorder.stop();
+ Log.d(TAG, "stopRecorder: stop");
+ } catch (IllegalStateException ex) {
+ Log.e(TAG, "IllegalStateException ocurr" + ex);
+ setError(ERROR_RECORDER_INTERNAL);
+ } catch (RuntimeException exception) {
+ // modified for stop recording failed.
+ // native recorder will throw runtime exception such as
+ // in case of start recording and stop it immediately
+ Log.e(TAG, "RuntimeException ocurr" + exception);
+ setError(ERROR_RECORDER_INTERNAL);
+ } finally {
+ mRecorder.release();
+ Log.d(TAG, "stopRecorder: release");
+ mRecorder = null;
+ }
+ }
+ }
+ }
+
+ private void stopPlayer() {
+ synchronized (this) {
+ if (null != mPlayer) {
+ try {
+ mPlayer.stop();
+ } catch (IllegalStateException e) {
+ Log.e(TAG, "IllegalStateException while discard recording!");
+ setError(ERROR_PLAYER_INTERNAL);
+ return;
+ } finally {
+ mPlayer.release();
+ mPlayer = null;
+ }
+ }
+ }
+ }
+}
diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/TestFM.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/TestFM.java
new file mode 100755
index 0000000..accd31d
--- /dev/null
+++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/TestFM.java
@@ -0,0 +1,168 @@
+package com.mediatek.fmradio;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.media.AudioManager;
+import android.media.AudioSystem;
+import android.media.MediaPlayer;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+
+import java.io.IOException;
+/* Vanzo:fenghaitao on: Tue, 30 Jun 2015 15:04:11 +0800
+ * force use speaker
+ */
+//import com.android.featureoption.FeatureOption;
+// End of Vanzo:fenghaitao
+public class TestFM extends Activity implements OnClickListener {
+
+ public static final String TAG = "FM radio service";
+ /* Vanzo:zhuhandong on: Fri, 27 Apr 2015 15:57:27 +0800
+ * here to user speaker
+ * private static final int FOR_PROPRIETARY = 5;
+ */
+ private static final int FOR_PROPRIETARY = 1;
+ // End of Vanzo: zhuhandong
+
+ private Button mSuccess = null;
+
+ private Button mFail = null;
+
+ private Button mSearch = null;
+
+ private float mFrequency = 97.1f;
+
+ private MediaPlayer mMP = null;
+
+ private boolean mIsSearch = false;
+
+ private Handler mHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ if (msg.what == 1) {
+ mSearch.setEnabled(true);
+ }
+ }
+ };
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.test_view);
+
+ mSuccess = (Button) findViewById(R.id.success);
+ mFail = (Button) findViewById(R.id.fail);
+ mSearch = (Button) findViewById(R.id.search);
+ mSuccess.setOnClickListener(this);
+ mSuccess.setEnabled(false);
+ mFail.setOnClickListener(this);
+ mSearch.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (!mIsSearch) {
+ mSuccess.setEnabled(true);
+ mIsSearch = true;
+ new Thread() {
+ public void run() {
+ mFrequency = autoSearch(mFrequency, true);
+ FmRadioNative.tune(mFrequency);
+ FmRadioNative.setMute(false);
+ mIsSearch = false;
+ }
+ }.start();
+ }
+ }
+ });
+
+ mSearch.setEnabled(false);
+ new Thread() {
+ public void run() {
+ FmRadioNative.openDev();
+ mMP = new MediaPlayer();
+ try {
+ mMP.setDataSource("THIRDPARTY://MEDIAPLAYER_PLAYERTYPE_FM");
+ } catch (IOException ex) {
+ Log.e(TAG, "setDataSource: " + ex);
+ return;
+ } catch (IllegalArgumentException ex) {
+ Log.e(TAG, "setDataSource: " + ex);
+ return;
+ } catch (IllegalStateException ex) {
+ Log.e(TAG, "setDataSource: " + ex);
+ return;
+ }
+ mMP.setAudioStreamType(AudioManager.STREAM_MUSIC);
+ enableFMAudio(true);
+/* Vanzo:fenghaitao on: Tue, 30 Jun 2015 15:05:06 +0800
+ * force use speaker
+ if (isHeadset()) {
+ */
+ //if (isHeadset() && !FeatureOption.VANZO_FEATURE_FM_ONLY_USE_EARPHONE) {
+// End of Vanzo:fenghaitao
+ //setForceUseSpeaker(true);
+ //}
+ FmRadioNative.powerUp(mFrequency);
+ FmRadioNative.setMute(false);
+ mHandler.sendEmptyMessage(1);
+ }
+ }.start();
+ }
+
+ @Override
+ public void onClick(View v) {
+ Intent data = new Intent();
+ data.putExtra("result", v == mSuccess);
+ setResult(RESULT_OK, data);
+ finish();
+ }
+
+ private void enableFMAudio(boolean bEnable) {
+ if (bEnable) {
+ if (mMP.isPlaying()) {
+ Log.e(TAG, "Error: FM audio is already enabled.");
+ } else {
+ try {
+ mMP.prepare();
+ } catch (Exception e) {
+ Log.e(TAG, "Exception: Cannot call MediaPlayer prepare.");
+ }
+ mMP.start();
+ }
+ } else {
+ if (mMP.isPlaying()) {
+ mMP.stop();
+ mMP.reset();
+ mMP.release();
+ } else {
+ Log.e(TAG, "Error: FM audio is already disabled.");
+ }
+ }
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ enableFMAudio(false);
+ FmRadioNative.closeDev();
+ setForceUseSpeaker(false);
+ FmRadioNative.stopScan();
+ }
+
+ private float autoSearch(float action, boolean isUp) {
+ return FmRadioNative.seek(action, isUp);
+ }
+
+ private void setForceUseSpeaker(boolean isOn) {
+ int forcedUseForMedia = isOn ? AudioSystem.FORCE_SPEAKER : AudioSystem.FORCE_NONE;
+ AudioSystem.setForceUse(FOR_PROPRIETARY, forcedUseForMedia);
+ }
+
+ private boolean isHeadset() {
+ return FmRadioUtils.isWiredHeadsetReallyOn();
+ }
+}
diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/TestFM.java~ b/MediaTek/FmRadio/src/com/mediatek/fmradio/TestFM.java~
new file mode 100755
index 0000000..27e9be0
--- /dev/null
+++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/TestFM.java~
@@ -0,0 +1,168 @@
+package com.mediatek.fmradio;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.media.AudioManager;
+import android.media.AudioSystem;
+import android.media.MediaPlayer;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+
+import java.io.IOException;
+/* Vanzo:fenghaitao on: Tue, 30 Jun 2015 15:04:11 +0800
+ * force use speaker
+ */
+//import com.android.featureoption.FeatureOption;
+// End of Vanzo:fenghaitao
+public class TestFM extends Activity implements OnClickListener {
+
+ public static final String TAG = "FM radio service";
+ /* Vanzo:zhuhandong on: Fri, 27 Apr 2015 15:57:27 +0800
+ * here to user speaker
+ * private static final int FOR_PROPRIETARY = 5;
+ */
+ private static final int FOR_PROPRIETARY = 1;
+ // End of Vanzo: zhuhandong
+
+ private Button mSuccess = null;
+
+ private Button mFail = null;
+
+ private Button mSearch = null;
+
+ private float mFrequency = 97.1f;
+
+ private MediaPlayer mMP = null;
+
+ private boolean mIsSearch = false;
+
+ private Handler mHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ if (msg.what == 1) {
+ mSearch.setEnabled(true);
+ }
+ }
+ };
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.test_view);
+
+ mSuccess = (Button) findViewById(R.id.success);
+ mFail = (Button) findViewById(R.id.fail);
+ mSearch = (Button) findViewById(R.id.search);
+ mSuccess.setOnClickListener(this);
+ mSuccess.setEnabled(false);
+ mFail.setOnClickListener(this);
+ mSearch.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (!mIsSearch) {
+ mSuccess.setEnabled(true);
+ mIsSearch = true;
+ new Thread() {
+ public void run() {
+ mFrequency = autoSearch(mFrequency, true);
+ FmRadioNative.tune(mFrequency);
+ FmRadioNative.setMute(false);
+ mIsSearch = false;
+ }
+ }.start();
+ }
+ }
+ });
+
+ mSearch.setEnabled(false);
+ new Thread() {
+ public void run() {
+ FmRadioNative.openDev();
+ mMP = new MediaPlayer();
+ try {
+ mMP.setDataSource("THIRDPARTY://MEDIAPLAYER_PLAYERTYPE_FM");
+ } catch (IOException ex) {
+ Log.e(TAG, "setDataSource: " + ex);
+ return;
+ } catch (IllegalArgumentException ex) {
+ Log.e(TAG, "setDataSource: " + ex);
+ return;
+ } catch (IllegalStateException ex) {
+ Log.e(TAG, "setDataSource: " + ex);
+ return;
+ }
+ mMP.setAudioStreamType(AudioManager.STREAM_MUSIC);
+ enableFMAudio(true);
+/* Vanzo:fenghaitao on: Tue, 30 Jun 2015 15:05:06 +0800
+ * force use speaker
+ if (isHeadset()) {
+ */
+ if (isHeadset() && !FeatureOption.VANZO_FEATURE_FM_ONLY_USE_EARPHONE) {
+// End of Vanzo:fenghaitao
+ setForceUseSpeaker(true);
+ }
+ FmRadioNative.powerUp(mFrequency);
+ FmRadioNative.setMute(false);
+ mHandler.sendEmptyMessage(1);
+ }
+ }.start();
+ }
+
+ @Override
+ public void onClick(View v) {
+ Intent data = new Intent();
+ data.putExtra("result", v == mSuccess);
+ setResult(RESULT_OK, data);
+ finish();
+ }
+
+ private void enableFMAudio(boolean bEnable) {
+ if (bEnable) {
+ if (mMP.isPlaying()) {
+ Log.e(TAG, "Error: FM audio is already enabled.");
+ } else {
+ try {
+ mMP.prepare();
+ } catch (Exception e) {
+ Log.e(TAG, "Exception: Cannot call MediaPlayer prepare.");
+ }
+ mMP.start();
+ }
+ } else {
+ if (mMP.isPlaying()) {
+ mMP.stop();
+ mMP.reset();
+ mMP.release();
+ } else {
+ Log.e(TAG, "Error: FM audio is already disabled.");
+ }
+ }
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ enableFMAudio(false);
+ FmRadioNative.closeDev();
+ setForceUseSpeaker(false);
+ FmRadioNative.stopScan();
+ }
+
+ private float autoSearch(float action, boolean isUp) {
+ return FmRadioNative.seek(action, isUp);
+ }
+
+ private void setForceUseSpeaker(boolean isOn) {
+ int forcedUseForMedia = isOn ? AudioSystem.FORCE_SPEAKER : AudioSystem.FORCE_NONE;
+ AudioSystem.setForceUse(FOR_PROPRIETARY, forcedUseForMedia);
+ }
+
+ private boolean isHeadset() {
+ return FmRadioUtils.isWiredHeadsetReallyOn();
+ }
+}
diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/AddFavoriteDialog.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/AddFavoriteDialog.java
new file mode 100755
index 0000000..3c65f4c
--- /dev/null
+++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/AddFavoriteDialog.java
@@ -0,0 +1,137 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2011-2014. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.fmradio.dialogs;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.TextView;
+
+import com.mediatek.fmradio.ExtensionUtils;
+import com.mediatek.fmradio.FmRadioUtils;
+import com.mediatek.fmradio.R;
+import com.mediatek.fmradio.ext.IProjectStringExt;
+
+/**
+ * Add a station as favorite caller should implement AddFavoriteListener
+ */
+public class AddFavoriteDialog extends DialogFragment {
+ private static final String STATION_NAME = "station_name";
+ private static final String STATION_FREQ = "station_freq";
+ private AddFavoriteListener mListener = null;
+
+ /**
+ * Create add favorite dialog instance according station name and station
+ * frequency
+ *
+ * @param stationName The station name
+ * @param stationFreq The station frequency
+ * @return add favorite dialog instance
+ */
+ public static AddFavoriteDialog newInstance(String stationName, int stationFreq) {
+ AddFavoriteDialog fragment = new AddFavoriteDialog();
+ Bundle args = new Bundle(2);
+ args.putString(STATION_NAME, stationName);
+ args.putInt(STATION_FREQ, stationFreq);
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ /**
+ * Add favorite listener, caller should implement
+ */
+ public interface AddFavoriteListener {
+ /**
+ * Add a station as favorite
+ */
+ void addFavorite();
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ try {
+ mListener = (AddFavoriteListener) activity;
+ } catch (ClassCastException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ String stationName = getArguments().getString(STATION_NAME);
+ int stationFreq = getArguments().getInt(STATION_FREQ);
+ Context context = getActivity().getApplicationContext();
+ IProjectStringExt projectStringExt = ExtensionUtils.getExtension(context);
+ View v = View.inflate(getActivity(), R.layout.addstation, null);
+ EditText editTextStationName = (EditText) v.findViewById(R.id.dlg_add_station_name_text);
+ ((TextView) v.findViewById(R.id.dlg_add_station_freq_text))
+ .setText(FmRadioUtils.formatStation(stationFreq));
+ // if not have current station name, hint with default station name
+ // else hint current station name
+ if (null == stationName || "".equals(stationName)) {
+ editTextStationName.setHint(R.string.default_station_name);
+ } else {
+ editTextStationName.setHint(stationName);
+ }
+ editTextStationName.requestFocus();
+ editTextStationName.requestFocusFromTouch();
+ editTextStationName.setText("");
+ return new AlertDialog.Builder(getActivity())
+ // Must call setTitle here or the title will not be displayed.
+ .setTitle(projectStringExt.getProjectString(context,
+ R.string.add_to_favorite, R.string.add_to_favorite1))
+ .setView(v)
+ .setPositiveButton(R.string.btn_ok, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ mListener.addFavorite();
+ }
+ }).setNegativeButton(R.string.btn_cancel, null) // cancel button
+ // not need to
+ // handle
+ // any thing
+ .create();
+ }
+
+}
diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/DeleteFavoriteDialog.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/DeleteFavoriteDialog.java
new file mode 100755
index 0000000..f0f3fb7
--- /dev/null
+++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/DeleteFavoriteDialog.java
@@ -0,0 +1,107 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2011-2014. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.fmradio.dialogs;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.Bundle;
+
+import com.mediatek.fmradio.ExtensionUtils;
+import com.mediatek.fmradio.R;
+import com.mediatek.fmradio.ext.IProjectStringExt;
+
+/**
+ * Delete favorite from favorite channel list, caller should implement
+ * DeleteFavoriteListener
+ */
+public class DeleteFavoriteDialog extends DialogFragment {
+ private DeleteFavoriteListener mListener = null;
+
+ /**
+ * Create delete favorite dialog instance, caller should implement
+ * DeleFavoriteListener
+ *
+ * @return delete favorite dialog
+ */
+ public static DeleteFavoriteDialog newInstance() {
+ return new DeleteFavoriteDialog();
+ }
+
+ /**
+ * Delete favorite listener
+ */
+ public interface DeleteFavoriteListener {
+ /**
+ * Delete favorite from favorite channel list
+ */
+ void deleteFavorite();
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ try {
+ mListener = (DeleteFavoriteListener) activity;
+ } catch (ClassCastException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ Context context = getActivity().getApplicationContext();
+ IProjectStringExt projectStringExt = ExtensionUtils.getExtension(context);
+ return new AlertDialog.Builder(getActivity())
+ .setTitle(projectStringExt.getProjectString(context,
+ R.string.dlg_delete_confirm_title, R.string.dlg_delete_confirm_title1))
+ .setMessage(projectStringExt.getProjectString(context,
+ R.string.dlg_delete_confirm_text, R.string.dlg_delete_confirm_text1))
+ .setPositiveButton(R.string.btn_ok, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ mListener.deleteFavorite();
+ }
+ })
+ .setNegativeButton(R.string.btn_cancel, null)
+ .create();
+ }
+
+}
diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/EditFavoriteDialog.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/EditFavoriteDialog.java
new file mode 100755
index 0000000..3e360ce
--- /dev/null
+++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/EditFavoriteDialog.java
@@ -0,0 +1,225 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2011-2014. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.fmradio.dialogs;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.text.Editable;
+import android.text.InputFilter;
+import android.text.Selection;
+import android.text.Spanned;
+import android.text.TextWatcher;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+
+import com.mediatek.fmradio.FmRadioStation;
+import com.mediatek.fmradio.FmRadioUtils;
+import com.mediatek.fmradio.R;
+
+/**
+ * Edit favorite station name and frequency, caller should implement
+ * EditFavoriteListener
+ */
+public class EditFavoriteDialog extends DialogFragment {
+ private static final String STATION_NAME = "station_name";
+ private static final String STATION_FREQ = "station_freq";
+ private EditFavoriteListener mListener = null;
+ private EditText mEditTextFrequency = null;
+
+ /**
+ * Create edit favorite dialog instance, caller should implement edit
+ * favorite listener
+ *
+ * @param stationName The station name
+ * @param stationFreq The station frequency
+ * @return edit favorite dialog
+ */
+ public static EditFavoriteDialog newInstance(String stationName, int stationFreq) {
+ EditFavoriteDialog fragment = new EditFavoriteDialog();
+ Bundle args = new Bundle(2);
+ args.putString(STATION_NAME, stationName);
+ args.putInt(STATION_FREQ, stationFreq);
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ /**
+ * Edit favorite listener
+ */
+ public interface EditFavoriteListener {
+ /**
+ * Edit favorite station name and station frequency
+ */
+ void editFavorite();
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ try {
+ mListener = (EditFavoriteListener) activity;
+ } catch (ClassCastException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ String stationName = getArguments().getString(STATION_NAME);
+ int stationFreq = getArguments().getInt(STATION_FREQ);
+ View v = View.inflate(getActivity(), R.layout.editstation, null);
+ EditText editTextStationName = (EditText) v.findViewById(R.id.dlg_edit_station_name_text);
+ mEditTextFrequency = (EditText) v.findViewById(R.id.dlg_edit_station_freq_text);
+
+ final int lengthOf100Khz = 5;
+ final int maxFrequencyLength = lengthOf100Khz;
+ mEditTextFrequency.setFilters(new InputFilter[] {
+ mFilter,
+ new InputFilter.LengthFilter(maxFrequencyLength)
+ });
+
+ mEditTextFrequency.addTextChangedListener(mWatcher100KHZ);
+
+ mEditTextFrequency.setText(FmRadioUtils.formatStation(stationFreq));
+ if (null == stationName || "".equals(stationName)) {
+ editTextStationName.setHint(R.string.default_station_name);
+ } else {
+ editTextStationName.setHint(stationName);
+ }
+ editTextStationName.requestFocus();
+ editTextStationName.requestFocusFromTouch();
+ // Edit
+ editTextStationName.setText(stationName);
+ Editable text = editTextStationName.getText();
+ Selection.setSelection(text, text.length());
+ return new AlertDialog.Builder(getActivity())
+ // Must call setTitle here or the title will not be displayed.
+ .setTitle(getString(R.string.dlg_addedit_title_edit)).setView(v)
+ .setPositiveButton(R.string.edit_frequency_overwrite_text,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ mListener.editFavorite();
+ }
+ })
+ .setNegativeButton(R.string.btn_cancel, null)
+ .create();
+ }
+
+ InputFilter mFilter = new InputFilter() {
+
+ public CharSequence filter(CharSequence source, int start, int end, Spanned dest,
+ int dstart, int dend) {
+ final int accuracy = 1;
+
+ if ("".equals(source.toString())) {
+ return null;
+ }
+
+ // according the point divide string
+ String[] splitArray = dest.toString().split("\\.");
+ // input have point, should delete the redundant
+ if (splitArray.length > 1) {
+ String fraction = splitArray[1];
+ int deleteIndex = fraction.length() + 1 - accuracy;
+ if (deleteIndex > 0) {
+ int dotIndex = dest.toString().indexOf(".") + 1;
+ if (dstart >= dotIndex) {
+ if ((end - deleteIndex) >= start) {
+ return source.subSequence(start, end - deleteIndex);
+ }
+ } else {
+ return dest.subSequence(dstart, dend) + source.toString();
+ }
+ }
+ }
+ return null;
+ }
+ };
+
+ // Add for 100khz
+ // add for overwrite frequency feature
+ private TextWatcher mWatcher100KHZ = new TextWatcher() {
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ if (null == getDialog()) {
+ return;
+ }
+ CharSequence cs = mEditTextFrequency.getText();
+ float frequency = 0;
+ try {
+ frequency = Float.parseFloat(cs.toString());
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ }
+ final int convertData = 10;
+ int station = Math.round(frequency * convertData);
+ Button positiveButton = ((AlertDialog) getDialog())
+ .getButton(DialogInterface.BUTTON_POSITIVE);
+
+ if (null != positiveButton) {
+ if (FmRadioStation.isStationExistInChList(
+ getActivity().getApplicationContext(), station)) {
+ positiveButton.setText(R.string.edit_frequency_overwrite_text);
+ } else {
+ positiveButton.setText(R.string.btn_ok);
+ }
+ }
+ }
+
+ /**
+ * No need to implement
+ */
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ }
+
+ /**
+ * No need to implement
+ */
+ @Override
+ public void afterTextChanged(Editable s) {
+ }
+ };
+
+}
diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/NoAntennaDialog.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/NoAntennaDialog.java
new file mode 100755
index 0000000..2d702f0
--- /dev/null
+++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/NoAntennaDialog.java
@@ -0,0 +1,124 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2011-2014. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.fmradio.dialogs;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnKeyListener;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.KeyEvent;
+
+import com.mediatek.fmradio.R;
+
+/**
+ * No antenna dialog, caller should implement NoAntennaListener
+ */
+public class NoAntennaDialog extends DialogFragment {
+ private static final String TAG = "FmRx/NoAntennaDialog";
+ private NoAntennaListener mListener = null;
+
+ /**
+ * Create no antenna dialog instance, caller should implement
+ * NoAntennaListener
+ */
+ public static NoAntennaDialog newInstance() {
+ return new NoAntennaDialog();
+ }
+
+ /**
+ * No antenna listener
+ */
+ public interface NoAntennaListener {
+ /**
+ * Continue to operate when no antenna
+ */
+ void noAntennaContinue();
+
+ /**
+ * Cancel operate when no antenna
+ */
+ void noAntennaCancel();
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ try {
+ mListener = (NoAntennaListener) activity;
+ } catch (ClassCastException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+ builder.setMessage(R.string.no_antenna_info)
+ .setTitle(R.string.dlg_noantenna_title)
+ .setPositiveButton(R.string.btn_yes, new DialogInterface.OnClickListener() {
+
+ public void onClick(DialogInterface dialog, int which) {
+ mListener.noAntennaContinue();
+ }
+ })
+ .setNegativeButton(R.string.btn_no, new DialogInterface.OnClickListener() {
+
+ public void onClick(DialogInterface dialog, int which) {
+ mListener.noAntennaCancel();
+ }
+ });
+ AlertDialog d = builder.create();
+ d.setCanceledOnTouchOutside(false);
+ d.setOnKeyListener(new OnKeyListener() {
+ @Override
+ public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
+ if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
+ Log.d(TAG, "click back key, need to exit fm");
+ mListener.noAntennaCancel();
+ }
+ return false;
+ }
+ });
+ return d;
+ }
+
+}
diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/SearchChannelsDialog.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/SearchChannelsDialog.java
new file mode 100755
index 0000000..3e049a0
--- /dev/null
+++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/SearchChannelsDialog.java
@@ -0,0 +1,111 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2011-2014. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.fmradio.dialogs;
+
+import android.app.Activity;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.app.ProgressDialog;
+import android.content.DialogInterface;
+import android.os.Bundle;
+
+import com.mediatek.fmradio.R;
+
+/**
+ * This class provider search dialog and cancel search function, caller should
+ * implement CancelSearchListener
+ */
+public class SearchChannelsDialog extends DialogFragment {
+ private CancelSearchListener mListener = null;
+
+ /**
+ * Create search channels dialog instance, caller should implement
+ * CancelSearchListener
+ *
+ * @return The dialog instance
+ */
+ public static SearchChannelsDialog newInstance() {
+ return new SearchChannelsDialog();
+ }
+
+ /**
+ * Cancel search listener
+ */
+ public interface CancelSearchListener {
+ /**
+ * Cancel search
+ */
+ void cancelSearch();
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ try {
+ mListener = (CancelSearchListener) activity;
+ } catch (ClassCastException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ String message = getActivity().getString(R.string.dlg_progress_text);
+ ProgressDialog searchDialog = new ProgressDialog(getActivity());
+ searchDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
+ searchDialog.setMessage(message);
+ searchDialog.setTitle(R.string.dlg_progress_title);
+ searchDialog.setCancelable(true);
+ // if not set, user touch outside of FMRadio will cancel search
+ searchDialog.setCanceledOnTouchOutside(false);
+ searchDialog.setButton(getString(R.string.btn_cancel),
+ new DialogInterface.OnClickListener() {
+
+ public void onClick(DialogInterface dialog, int which) {
+ mListener.cancelSearch();
+ }
+ });
+ return searchDialog;
+ }
+
+ @Override
+ public void onCancel(DialogInterface dialog) {
+ mListener.cancelSearch();
+ }
+
+}
diff --git a/MediaTek/FmRadio/tests/Android.mk b/MediaTek/FmRadio/tests/Android.mk
new file mode 100755
index 0000000..0e3521a
--- /dev/null
+++ b/MediaTek/FmRadio/tests/Android.mk
@@ -0,0 +1,57 @@
+# Copyright Statement:
+#
+# This software/firmware and related documentation ("MediaTek Software") are
+# protected under relevant copyright laws. The information contained herein
+# is confidential and proprietary to MediaTek Inc. and/or its licensors.
+# Without the prior written permission of MediaTek inc. and/or its licensors,
+# any reproduction, modification, use or disclosure of MediaTek Software,
+# and information contained herein, in whole or in part, shall be strictly prohibited.
+#
+# MediaTek Inc. (C) 2010. All rights reserved.
+#
+# BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+# THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+# RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
+# AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+# NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+# SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+# SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
+# THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
+# THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
+# CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
+# SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+# STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
+# CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+# AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+# OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
+# MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+#
+# The following software/firmware and/or related documentation ("MediaTek Software")
+# have been modified by MediaTek Inc. All revisions are subject to any receiver's
+# applicable license agreements with MediaTek Inc.
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+
+
+# We only want this apk build for tests.
+LOCAL_MODULE_TAGS := tests
+LOCAL_CERTIFICATE := platform
+
+LOCAL_JAVA_LIBRARIES := android.test.runner
+LOCAL_STATIC_JAVA_LIBRARIES := librobotium4
+
+# Include all test java files.
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := FmRadioTests
+
+LOCAL_INSTRUMENTATION_FOR := FmRadio
+
+include $(BUILD_PACKAGE)
+
+# Use the folloing include to make our test apk.
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/MediaTek/FmRadio/tests/AndroidManifest.xml b/MediaTek/FmRadio/tests/AndroidManifest.xml
new file mode 100755
index 0000000..1f8d990
--- /dev/null
+++ b/MediaTek/FmRadio/tests/AndroidManifest.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.mediatek.fmradio.tests"
+ android:versionCode="1"
+ android:versionName="1.0">
+ <uses-permission android:name="android.permission.ACCESS_FM" />
+
+ <application>
+ <uses-library android:name="android.test.runner" />
+ <!-- uses-library android:name="com.jayway.android.robotium" /> -->
+ </application>
+
+ <instrumentation
+ android:name=".FmRadioFunctionRunner"
+ android:label="FM Radio function auto-tests"
+ android:targetPackage="com.mediatek.fmradio" />
+ <instrumentation
+ android:name=".FmRadioPerformanceRunner"
+ android:label="FM Radio performance auto-tests"
+ android:targetPackage="com.mediatek.fmradio" />
+ <instrumentation
+ android:name="com.mediatek.fmradio.tests.FmRadioLaunchPerformance"
+ android:label="FmRadio Launch Performance"
+ android:targetPackage="com.mediatek.fmradio" />
+
+ <uses-permission android:name="android.permission.RUN_INSTRUMETATION" />
+</manifest>
diff --git a/MediaTek/FmRadio/tests/NOTICE b/MediaTek/FmRadio/tests/NOTICE
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/MediaTek/FmRadio/tests/NOTICE
diff --git a/MediaTek/FmRadio/tests/README b/MediaTek/FmRadio/tests/README
new file mode 100755
index 0000000..6a66800
--- /dev/null
+++ b/MediaTek/FmRadio/tests/README
@@ -0,0 +1,25 @@
+FmRadioTests.apk is the unit test of FmRadio.apk.
+
+This library is pre-built by MediaTek internal.
+
+WHAT IT DOES?
+=============
+It is designed to unit text for FM radio application.
+
+HOW IT WAS BUILT?
+==================
+It needs the following library from AOSP:
+1. framework.jar
+
+and the following libs from MediaTek:
+1. FmRadio.apk
+2. librobotium4.jar
+
+All source/dependency modules of this module are already put in
+'vendor/mediatek/libs' folder.
+
+HOW TO USE IT?
+==============
+1. Install FmRadioTests.apk in mediatek platform.
+2. Use adb command to run test:
+adb shell am instrument -w com.mediatek.fmradio.tests/.FmRadioFunctionRunner
diff --git a/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioActivityTest.java b/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioActivityTest.java
new file mode 100755
index 0000000..f7039c7
--- /dev/null
+++ b/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioActivityTest.java
@@ -0,0 +1,1054 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2010. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.fmradio.tests;
+
+import java.io.File;
+import com.jayway.android.robotium.solo.Solo;
+
+import android.app.ActionBar;
+import android.app.AlertDialog;
+import android.app.Instrumentation;
+import android.app.Instrumentation.ActivityMonitor;
+import android.content.Context;
+import android.database.Cursor;
+import android.media.AudioManager;
+import android.media.AudioManager.OnAudioFocusChangeListener;
+import android.net.Uri;
+import android.test.ActivityInstrumentationTestCase2;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.MenuInflater;
+import android.view.View;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ImageButton;
+import android.widget.TextView;
+
+import com.mediatek.fmradio.FmRadioActivity;
+import com.mediatek.fmradio.FmRadioFavorite;
+import com.mediatek.fmradio.FmRadioUtils;
+import com.mediatek.fmradio.FmRadioStation;
+import com.mediatek.fmradio.R;
+
+public class FmRadioActivityTest extends ActivityInstrumentationTestCase2<FmRadioActivity> {
+ private Instrumentation mInstrumentation = null;
+ private Solo mSolo = null;
+ private Context mContext = null;
+ private ActivityMonitor mActivityMonitor = null;
+
+ private ActionBar mActionBar = null;
+ private FmRadioActivity mFmRadioActivity = null;
+ private FmRadioFavorite mFmRadioFavorite = null;
+ private AudioManager mAudioManager = null;
+ private OnAudioFocusChangeListener mFMAudioFocusChangeListener = null;
+
+ // bottom bar
+ private ImageButton mButtonDecrease = null;
+ private ImageButton mButtonPrevStation = null;
+ private ImageButton mButtonNextStation = null;
+ private ImageButton mButtonIncrease = null;
+// private ImageButton mButtonPlayStop = null;
+ private MenuInflater mMenuInflater = null;
+ // the star
+ private ImageButton mButtonAddToFavorite = null;
+ // record bar
+ private ImageButton mButtonRecord = null;
+ private ImageButton mButtonStop = null;
+ private ImageButton mButtonPlayback = null;
+ private AlertDialog mDialogRDSSetting = null;
+
+ private Button mButtonRecordSave = null;
+ private EditText mEditTextRecordName = null;
+
+ private static final String CONTENTURI = "content://com.mediatek.fmradio.FmRadioContentProvider/station";
+
+ private TextView mTextViewFrequency = null;
+ private static final int CHECK_TIME = 100;
+ private static final int SHORT_TIME = 2000;
+ private static final int ONE_SECOND = 1000;
+ private static final int EXECUTE_TIME = 500;
+ private static final int TIMEOUT = 5000;
+ private static final int WAIT_TEAR_DOWN = 3000;
+ private static final int WAIT_MOUNT_UNMOUNT = 7000;
+ private static final int RECORDING_FILE_TIME = 10000;
+
+ private static final long SEARCH_TIME = 20000;
+ private static final int CONVERT_RATE = 10;
+ private static final int TUNE_STEP = 1;
+ private static final String TAG = "FmRadioFunctionTest";
+
+ public FmRadioActivityTest() {
+ super("com.mediatek.fmradio", FmRadioActivity.class);
+ }
+
+ public FmRadioActivityTest(String pkg, Class<FmRadioActivity> activityClass) {
+ super("com.mediatek.fmradio", FmRadioActivity.class);
+ }
+
+ @Override
+ protected void setUp() {
+ try {
+ super.setUp();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ setActivityInitialTouchMode(false);
+ mInstrumentation = this.getInstrumentation();
+ assertNotNull(mInstrumentation);
+ mFmRadioActivity = getActivity();
+ assertNotNull(mFmRadioActivity);
+ mSolo = new Solo(getInstrumentation(), mFmRadioActivity);
+ mContext = mFmRadioActivity.getApplicationContext();
+ mAudioManager =
+ (AudioManager) mFmRadioActivity.getSystemService(mContext.AUDIO_SERVICE);
+ waitForPowerupWithTimeout(TIMEOUT);
+ //waitForInitedWithTimeout(TIMEOUT);
+
+ mButtonDecrease = (ImageButton) mFmRadioActivity.findViewById(R.id.button_decrease);
+ mButtonPrevStation = (ImageButton) mFmRadioActivity.findViewById(R.id.button_prevstation);
+ mButtonNextStation = (ImageButton) mFmRadioActivity.findViewById(R.id.button_nextstation);
+ mButtonIncrease = (ImageButton) mFmRadioActivity.findViewById(R.id.button_increase);
+
+ mButtonAddToFavorite = (ImageButton) mFmRadioActivity
+ .findViewById(R.id.button_add_to_favorite);
+
+ mButtonRecord = (ImageButton) mFmRadioActivity.findViewById(R.id.btn_record);
+ mButtonStop = (ImageButton) mFmRadioActivity.findViewById(R.id.btn_stop);
+ mButtonPlayback = (ImageButton) mFmRadioActivity.findViewById(R.id.btn_playback);
+
+ mTextViewFrequency = (TextView) mFmRadioActivity
+ .findViewById(R.id.station_value);
+ }
+
+ // click play/stop button.
+ public void testCase01_PowerUpAndPowerDown() {
+ boolean isPlaying = false;
+ // test FM power down
+ makeFMPowerUp();
+ mInstrumentation.waitForIdleSync();
+ FmRadioTestCaseUtil.requestFocusGain(mAudioManager);
+ mSolo.sleep(SHORT_TIME);
+ checkFMStopState();
+
+ // test FM power up
+ mInstrumentation
+ .invokeMenuActionSync(mFmRadioActivity, R.id.fm_power, 0);
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(SHORT_TIME);
+ checkFMPlayingState();
+ }
+
+ // click speaker/earphone menu item.
+ public void testCase02_SwitchSpeakerAndEarphone() {
+ if (!mButtonDecrease.isEnabled()) {
+ makeFMPowerUp();
+ }
+ String earphone = mFmRadioActivity.getString(R.string.optmenu_earphone);
+ String speaker = mFmRadioActivity.getString(R.string.optmenu_speaker);
+ // test FM switch to speaker
+ switchSpeaker();
+ mSolo.sleep(EXECUTE_TIME);
+ mInstrumentation
+ .invokeMenuActionSync(mFmRadioActivity, R.id.fm_menu, 0);
+ assertTrue(mSolo.searchText(earphone));
+ mSolo.goBack();
+ // test FM switch to earphone
+ switchEarphone();
+ mSolo.sleep(EXECUTE_TIME);
+ mInstrumentation
+ .invokeMenuActionSync(mFmRadioActivity, R.id.fm_menu, 0);
+ assertTrue(mSolo.searchText(speaker));
+ mSolo.goBack();
+ }
+
+ // click favorite star.
+ public void testCase03_AddDeleteFavoriteChannels() {
+ int station = 0;
+ // test add channel as favorite
+ station = FmRadioTestCaseUtil.getStationFromUI(mTextViewFrequency);
+ deleteChannelFromFavorite(station);
+ clickView(mButtonAddToFavorite);
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(SHORT_TIME);
+ assertTrue(FmRadioStation.isFavoriteStation(mFmRadioActivity, station));
+
+ // test delete channel from favorite
+ station = FmRadioTestCaseUtil.getStationFromUI(mTextViewFrequency);
+ addChannelAsFavorite(station);
+ clickView(mButtonAddToFavorite);
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(SHORT_TIME);
+ assertFalse(FmRadioStation.isFavoriteStation(mFmRadioActivity, station));
+ }
+
+ // click tune frequency.
+ public void testCase04_TuneFrequency() {
+ int tuneStation = 0, currentStation = 0;
+ if (!mButtonDecrease.isEnabled()) {
+ makeFMPowerUp();
+ }
+ // test decrease 0.1 MHZ
+ tuneStation = FmRadioTestCaseUtil.getStationFromUI(mTextViewFrequency);
+ clickView(mButtonDecrease);
+ mInstrumentation.waitForIdleSync();
+ tuneStation -= TUNE_STEP;
+ if (tuneStation < FmRadioTestCaseUtil.LOWEST_STATION) {
+ tuneStation = FmRadioTestCaseUtil.HIGHEST_STATION;
+ }
+ // add sleep time, because instrumentation waitForIdleSync just wait for
+ // UI thread end, must wait for all hardware and database operation end
+ mSolo.sleep(SHORT_TIME);
+ currentStation = FmRadioStation.getCurrentStation(mFmRadioActivity);
+ assertEquals(tuneStation, currentStation);
+
+ // add to favorite
+ testCase03_AddDeleteFavoriteChannels();
+
+ // test increase 0.1 MHZ
+ tuneStation = FmRadioTestCaseUtil.getStationFromUI(mTextViewFrequency);
+ clickView(mButtonIncrease);
+ mInstrumentation.waitForIdleSync();
+ tuneStation += TUNE_STEP;
+ if (tuneStation > FmRadioTestCaseUtil.HIGHEST_STATION) {
+ tuneStation = FmRadioTestCaseUtil.LOWEST_STATION;
+ }
+ mSolo.sleep(SHORT_TIME);
+ currentStation = FmRadioStation.getCurrentStation(mFmRadioActivity);
+ assertEquals(tuneStation, currentStation);
+ }
+
+ // click tune station
+ public void testCase05_SwitchChannel() {
+ int oldStation = 0, stationFromUI = 0, stationFromDB = 0;
+ if (!mButtonPrevStation.isEnabled()) {
+ makeFMPowerUp();
+ }
+
+ // test seek previous station
+ oldStation = FmRadioTestCaseUtil.getStationFromUI(mTextViewFrequency);
+ clickView(mButtonPrevStation);
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(TIMEOUT);
+ stationFromUI = FmRadioTestCaseUtil
+ .getStationFromUI(mTextViewFrequency);
+ // check station change
+ assertTrue(oldStation != stationFromUI);
+
+ // test seek next station
+ oldStation = FmRadioTestCaseUtil.getStationFromUI(mTextViewFrequency);
+ clickView(mButtonNextStation);
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(TIMEOUT);
+ stationFromUI = FmRadioTestCaseUtil
+ .getStationFromUI(mTextViewFrequency);
+ // check station change
+ assertTrue(oldStation != stationFromUI);
+ }
+
+ // click cancel when search channel. click back key when search channel.
+ public void testCase06_CancelChannelSearch() {
+ // check cancel scan when power up
+ startScanWhenPowerUp();
+ checkCancelScan();
+ checkFMPlayingState();
+
+ }
+
+ // search channel and tune to one station.
+ public void testCase07_SearchChannels() {
+ // check scan when power up
+ startScanWhenPowerUp();
+ checkFinishScan();
+ }
+
+ // enter channel list activity
+ public void testCase08_EnterChannelList() {
+ Log.d(TAG, ">>> testCase08_EnterChannelList");
+ if (!mButtonDecrease.isEnabled()) {
+ makeFMPowerUp();
+ }
+ mActivityMonitor = new ActivityMonitor(
+ "com.mediatek.fmradio.FmRadioFavorite", null, false);
+ mInstrumentation.addMonitor(mActivityMonitor);
+ mInstrumentation.invokeMenuActionSync(mFmRadioActivity,
+ R.id.fm_channel_list, 0);
+ mFmRadioFavorite = (FmRadioFavorite) mActivityMonitor
+ .waitForActivityWithTimeout(TIMEOUT);
+ assertNotNull(mFmRadioFavorite);
+ mSolo.sleep(SHORT_TIME);
+ Uri uri = Uri.parse(CONTENTURI);
+ Cursor c = mFmRadioFavorite.getContentResolver().query(
+ uri,
+ new String[] { FmRadioStation.Station._ID,
+ FmRadioStation.Station.COLUMN_STATION_FREQ,
+ FmRadioStation.Station.COLUMN_STATION_TYPE }, null,
+ null, null);
+ assertTrue(c != null && c.getCount() > 0);
+ Log.d(TAG, "testCase08_EnterChannelList count:" + c.getCount());
+ try {
+ if (c != null) {
+ c.moveToFirst();
+ while (!c.isAfterLast()) {
+ int stationFreq = c.getInt(1);
+ int stationType = c.getInt(2);
+ if ((FmRadioStation.STATION_TYPE_FAVORITE == stationType)
+ || (FmRadioStation.STATION_TYPE_SEARCHED == stationType)) {
+ Log.d(TAG, "testCase08_EnterChannelList stationFreq:" + stationFreq
+ + ", stationType:" + stationType);
+ assertTrue(FmRadioTestCaseUtil.isExistInChannelList(
+ mFmRadioFavorite, stationFreq));
+ }
+ c.moveToNext();
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ if (c != null) {
+ c.close();
+ }
+ }
+ mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
+ Log.d(TAG, "<<< testCase08_EnterChannelList");
+ }
+
+ // when play fm, audio focus loss, and stop fm
+ public void testCase09_CheckFocusLoss() {
+ mInstrumentation.waitForIdleSync();
+ makeFMPowerDown();
+
+ // check when power up, music get focus, fm power down
+ //mInstrumentation
+ // .invokeMenuActionSync(mFmRadioActivity, R.id.fm_power, 0);
+ //mInstrumentation.waitForIdleSync();
+ mSolo.sleep(EXECUTE_TIME);
+ //FmRadioTestCaseUtil.requestFocusGain(mAudioManager);
+ //mInstrumentation.waitForIdleSync();
+ checkFMStopState();
+ //mSolo.sleep(SHORT_TIME);
+
+ mSolo.sleep(SHORT_TIME);
+ // fm is power up, check when fm is searching, focus is loss, fm power down
+ startScanWhenPowerUp();
+ mSolo.sleep(SHORT_TIME);
+ FmRadioTestCaseUtil.requestFocusGain(mAudioManager);
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(TIMEOUT);
+ // check music is active, fm is power down
+ checkFMStopState();
+ }
+
+ public void testCase10_EnterRecordingMode() {
+ enterRecordingMode();
+ mSolo.sleep(SHORT_TIME);
+ checkRecordNotSaveIdle();
+ mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
+ mInstrumentation.waitForIdleSync();
+ checkFMPlayingState();
+ }
+
+ // recording, discard, save.
+ public void testCase11_RecordingAndSave() {
+ enterRecordingMode();
+ mSolo.sleep(SHORT_TIME);
+ // judge whether enter recording mode
+ checkRecordNotSaveIdle();
+
+ // test recording
+ clickView(mButtonRecord);
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(SHORT_TIME);
+ checkRecordingState();
+ // make recording time have 3 seconds
+ mSolo.sleep(SHORT_TIME);
+ // test stop reocording and save recording file
+ clickView(mButtonStop);
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(SHORT_TIME);
+ checkRecordingStopState();
+
+ // enter some illegal characters
+ mEditTextRecordName = (EditText) mSolo.getView(R.id.fm_recording_text);
+ String fileName = mEditTextRecordName.getText().toString();
+ mSolo.clearEditText(mEditTextRecordName);
+ mSolo.enterText(mEditTextRecordName, "test:");
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(SHORT_TIME);
+ mButtonRecordSave = (Button) mSolo.getView(R.id.fm_recording_btn_save);
+ assertFalse(mButtonRecordSave.isEnabled());
+ // enter some legal characters
+ mSolo.clearEditText(mEditTextRecordName);
+ mSolo.enterText(mEditTextRecordName, fileName);
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(SHORT_TIME);
+ assertTrue(mButtonRecordSave.isEnabled());
+
+ // click discard not save file
+ mSolo.clickOnButton(mContext.getString(R.string.btn_discard_recording));
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(SHORT_TIME);
+ checkRecordNotSaveIdle();
+
+ // recording and make focus at OK button of save recording dialog
+ clickView(mButtonRecord);
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(SHORT_TIME);
+ checkRecordingState();
+ // make recording time have 3 seconds
+ mSolo.sleep(SHORT_TIME);
+ // test stop reocording and save recording file
+ clickView(mButtonStop);
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(SHORT_TIME);
+ checkRecordingStopState();
+
+ // click OK button of save recording dialog
+ mSolo.clickOnButton(mContext.getString(R.string.btn_save_recording));
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(SHORT_TIME);
+ checkRecordHasSavedIdle();
+ mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
+ mInstrumentation.waitForIdleSync();
+ }
+
+ // recording and playback.
+ public void testCase12_RecordingAndPlayBack() {
+ enterRecordingMode();
+ mSolo.sleep(TIMEOUT);
+ // judge whether enter recording mode
+ checkRecordNotSaveIdle();
+
+ // test recording
+ clickView(mButtonRecord);
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(SHORT_TIME);
+ checkRecordingState();
+ // make recording time have 3 seconds
+ mSolo.sleep(SHORT_TIME);
+ // test stop reocording and save recording file
+ clickView(mButtonStop);
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(SHORT_TIME);
+ checkRecordingStopState();
+
+ // click OK button of save recording dialog
+ mSolo.clickOnButton(mContext.getString(R.string.btn_save_recording));
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(SHORT_TIME);
+ checkRecordHasSavedIdle();
+
+ // test playback recording file
+ clickView(mButtonPlayback);
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(EXECUTE_TIME);
+ checkPlayingBackState();
+ mSolo.sleep(TIMEOUT);
+ checkPlayingBackFinished();
+ mSolo.sleep(SHORT_TIME);
+
+ mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
+ mInstrumentation.waitForIdleSync();
+ }
+
+ // test fm recreate when scan, and fm is powerup state.
+ public void testCase14_relaunchFmWhenCancelScan() {
+ Log.d(TAG, ">>> testCase14_relaunchFmWhenCancelScan");
+ int oldStation = FmRadioTestCaseUtil.getStationFromUI(mTextViewFrequency);
+ String cancel = mFmRadioActivity.getString(R.string.btn_cancel);
+ // test cancel scan
+ checkRelaunchWhenScan();
+ // mInstrumentation.waitForIdleSync();
+ mSolo.clickOnButton(cancel);
+ //mInstrumentation.waitForIdleSync();
+ mSolo.sleep(SHORT_TIME);
+ checkFMPlayingState();
+
+ int stationFromUI = FmRadioTestCaseUtil
+ .getStationFromUI(mTextViewFrequency);
+ // check station not change
+ assertTrue(oldStation == stationFromUI);
+
+ checkRelaunchWhenScan();
+ checkFinishScan();
+
+ }
+
+ // mount, unmount sd card when recording
+ /*public void testCase15_mountUnmountWhenRecording() {
+ FmRadioTestCaseUtil.mountSDCard(mContext);
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(WAIT_MOUNT_UNMOUNT);
+ mSolo.sleep(SHORT_TIME);
+ enterRecordingMode();
+ mSolo.sleep(SHORT_TIME);
+ checkRecordNotSaveIdle();
+ String toastStartRecord = mContext.getString(R.string.toast_start_recording);
+ String toastSdCardMiss = mContext.getString(R.string.toast_sdcard_missing);
+ String save = mFmRadioActivity.getString(R.string.btn_save_recording);
+ String discard = mFmRadioActivity.getString(R.string.btn_discard_recording);
+ // unmount sd card when recording
+
+ clickView(mButtonRecord);
+ assertTrue(mSolo.waitForText(toastStartRecord, 0, SHORT_TIME));
+ mSolo.sleep(SHORT_TIME);
+ FmRadioTestCaseUtil.unmountSDCard(mContext);
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(WAIT_MOUNT_UNMOUNT);
+ assertFalse(mSolo.searchButton(save, true));
+ checkRecordNotSaveIdle();
+
+ // click record after unmount
+ clickView(mButtonRecord);
+ assertTrue(mSolo.waitForText(toastSdCardMiss));
+ checkRecordNotSaveIdle();
+
+ // check mount sd card and stop recording, popup save dialog, then unmount sd card
+ FmRadioTestCaseUtil.mountSDCard(mContext);
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(WAIT_MOUNT_UNMOUNT);
+ clickView(mButtonRecord);
+ assertTrue(mSolo.waitForText(toastStartRecord, 0, SHORT_TIME));
+ mSolo.sleep(SHORT_TIME);
+ clickView(mButtonStop);
+ mInstrumentation.waitForIdleSync();
+ assertTrue(mSolo.searchButton(save, true));
+ FmRadioTestCaseUtil.unmountSDCard(mContext);
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(WAIT_MOUNT_UNMOUNT);
+ assertFalse(mSolo.searchButton(save, true));
+
+ // mount sdcard finally
+ FmRadioTestCaseUtil.mountSDCard(mContext);
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(WAIT_MOUNT_UNMOUNT);
+ mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
+ mInstrumentation.waitForIdleSync();
+ }
+
+ // mount, unmount sd card when recording
+ public void testCase16_mountUnmountWhenPlayback() {
+ // mount sdcard first
+ FmRadioTestCaseUtil.mountSDCard(mContext);
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(WAIT_MOUNT_UNMOUNT);
+
+ // record some and playback
+ String save = mContext.getString(R.string.btn_save_recording);
+ String error = mContext.getString(R.string.toast_player_internal_error);
+ mSolo.sleep(SHORT_TIME);
+ enterRecordingMode();
+ mSolo.sleep(SHORT_TIME);
+
+ clickView(mButtonRecord);
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(RECORDING_FILE_TIME);
+ clickView(mButtonStop);
+ mInstrumentation.waitForIdleSync();
+ assertTrue(mSolo.searchButton(save, true));
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(SHORT_TIME);
+ mSolo.clickOnButton(save);
+ mSolo.sleep(SHORT_TIME);
+ clickView(mButtonPlayback);
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(SHORT_TIME);
+
+ // unmount sd card
+ FmRadioTestCaseUtil.unmountSDCard(mContext);
+ mInstrumentation.waitForIdleSync();
+ assertTrue(mSolo.waitForText(error, 0, WAIT_MOUNT_UNMOUNT));
+ mSolo.sleep(WAIT_MOUNT_UNMOUNT);
+ checkRecordNotSaveIdle();
+ mSolo.sleep(SHORT_TIME);
+
+ // mount sdcard finally
+ FmRadioTestCaseUtil.mountSDCard(mContext);
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(WAIT_MOUNT_UNMOUNT);
+ }*/
+
+ // check fm exit when power up state
+ public void testCase17_FmExit() {
+ boolean isPlaying = false;
+ // test FM power down
+ makeFMPowerUp();
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(SHORT_TIME);
+
+ // test FM power up
+ mInstrumentation
+ .invokeMenuActionSync(mFmRadioActivity, R.id.fm_power, 0);
+ mSolo.sleep(SHORT_TIME);
+ }
+
+ // check fm back key when power down state
+ public void testCase18_FmBackKeyExit() {
+ boolean isPlaying = false;
+ makeFMPowerUp();
+ mInstrumentation.waitForIdleSync();
+ FmRadioTestCaseUtil.requestFocusGain(mAudioManager);
+ mSolo.sleep(SHORT_TIME);
+ checkFMStopState();
+ mSolo.goBack();
+ mSolo.sleep(SHORT_TIME);
+ }
+
+ // check fm tune from channel list
+ public void testCase19_relaunchFmTuneToStation() {
+ boolean isPlaying = false;
+ makeFMPowerUp();
+ // add to favorite
+ int station = 0;
+ // test add channel as favorite
+ station = FmRadioTestCaseUtil.getStationFromUI(mTextViewFrequency);
+ deleteChannelFromFavorite(station);
+ clickView(mButtonAddToFavorite);
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(SHORT_TIME);
+ assertTrue(FmRadioStation.isFavoriteStation(mFmRadioActivity, station));
+
+ // test FM power up
+ mInstrumentation
+ .invokeMenuActionSync(mFmRadioActivity, R.id.fm_channel_list, 0);
+ mSolo.sleep(SHORT_TIME);
+ mInstrumentation.waitForIdleSync();
+ FmRadioTestCaseUtil.requestFocusGain(mAudioManager);
+ mSolo.sleep(SHORT_TIME);
+
+ relaunchFm();
+ mFmRadioFavorite = (FmRadioFavorite) mSolo.getCurrentActivity();
+ mSolo = new Solo(mInstrumentation, mFmRadioFavorite);
+ mContext = mFmRadioFavorite.getApplicationContext();
+ station = FmRadioTestCaseUtil.getStationFromUI(mTextViewFrequency);
+ String pStation = String.valueOf((float) station / CONVERT_RATE);
+ mSolo.clickOnText(pStation);
+ mInstrumentation.waitForIdleSync();
+ // delete favorite
+ deleteChannelFromFavorite(station);
+ mSolo.sleep(SHORT_TIME);
+ checkFMPlayingState();
+ }
+
+ // recorder. save same name recorder file
+ public void testCase20_saveRecorderWithSameName() {
+ enterRecordingMode();
+ File sdDir = new File(FmRadioUtils.getDefaultStoragePath());
+ File recordingFile = new File(sdDir.getPath() + "/FM Recording", "recorder_file.ogg");
+ if (recordingFile.exists()) {
+ recordingFile.delete();
+ }
+ mSolo.sleep(SHORT_TIME);
+
+ // record some and playback
+ String save = mContext.getString(R.string.btn_save_recording);
+ String error = mContext.getString(R.string.toast_player_internal_error);
+
+ // save recorder file
+ clickView(mButtonRecord);
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(SHORT_TIME);
+ clickView(mButtonStop);
+ mInstrumentation.waitForIdleSync();
+ assertTrue(mSolo.searchButton(save, true));
+ mInstrumentation.waitForIdleSync();
+ EditText editText = (EditText) mSolo.getView(R.id.fm_recording_text);
+ mSolo.clearEditText(editText);
+ mSolo.enterText(editText, "recorder_file");
+ mInstrumentation.waitForIdleSync();
+ InputMethodManager inputMethodManager = (InputMethodManager) mSolo.getCurrentActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
+ inputMethodManager.toggleSoftInput(0, 0);
+ mSolo.clickOnButton(save);
+ mSolo.sleep(SHORT_TIME);
+
+ // save recorder file with same name
+ clickView(mButtonRecord);
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(SHORT_TIME);
+ clickView(mButtonStop);
+ mInstrumentation.waitForIdleSync();
+ assertTrue(mSolo.searchButton(save, true));
+ mInstrumentation.waitForIdleSync();
+ editText = (EditText) mSolo.getView(R.id.fm_recording_text);
+ mSolo.clearEditText(editText);
+ mSolo.enterText(editText, "recorder_file");
+ mInstrumentation.waitForIdleSync();
+ InputMethodManager inputMethodManager2 = (InputMethodManager) mSolo.getCurrentActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
+ inputMethodManager2.toggleSoftInput(0, 0);
+ mSolo.clickOnButton(save);
+
+ // check file has exist
+ String hasFile = mContext.getString(R.string.already_exists);
+ assertTrue(mSolo.waitForText(hasFile, 0, SHORT_TIME));
+
+ // discard save record file
+ String discard = mFmRadioActivity.getString(R.string.btn_discard_recording);
+ mSolo.clickOnButton(discard);
+ mInstrumentation.waitForIdleSync();
+// File sdDir = new File(FmRadioUtils.getInternalStoragePath());
+// File recordingFile = new File(sdDir.getPath() + "/FM Recording", "recorder_file");
+ if (recordingFile.exists()) {
+ recordingFile.delete();
+ }
+
+ checkRecordNotSaveIdle();
+ }
+
+ // check scan dialog, and fm is powerup sate when recreate
+ private void checkRelaunchWhenScan() {
+ Log.d(TAG, ">>> checkRelaunchWhenScan");
+ startScanWhenPowerUp();
+ //mSolo.sleep(ONE_SECOND);
+ String cancel = mFmRadioActivity.getString(R.string.btn_cancel);
+ boolean isVisible = mSolo.searchButton(cancel, true);
+ assertTrue(isVisible);
+
+ //relaunch after start scan
+ relaunchFm();
+ //mInstrumentation.waitForIdleSync();
+ mSolo.sleep(ONE_SECOND);
+ Log.d(TAG, "current activity:" + mSolo.getCurrentActivity().getComponentName());
+ initialRel();
+ mSolo.sleep(ONE_SECOND);
+ //check dialog is shown after relaunch
+ isVisible = mSolo.searchButton(cancel, true);
+ assertTrue(isVisible);
+ Log.d(TAG, "<<< checkRelaunchWhenScan");
+ }
+
+ private void relaunchFm() {
+ mSolo.getCurrentActivity().runOnUiThread(new Runnable() {
+
+ @Override
+ public void run() {
+ Log.d(TAG, "sub thread relaunchFm start");
+ mSolo.getCurrentActivity().recreate();
+ Log.d(TAG, "sub thread relaunchFm end");
+ }
+ });
+ }
+
+ private void enterRecordingMode() {
+ if (!mButtonDecrease.isEnabled()) {
+ makeFMPowerUp();
+ }
+ mInstrumentation
+ .invokeMenuActionSync(mFmRadioActivity, R.id.fm_menu, 0);
+ mSolo.sleep(EXECUTE_TIME);
+ String record = mFmRadioActivity.getString(R.string.optmenu_record);
+ mSolo.clickOnText(record);
+ mInstrumentation.waitForIdleSync();
+ }
+
+ // check ui and state when no recording file saved.
+ public void checkRecordNotSaveIdle() {
+ assertTrue(mButtonRecord.isEnabled());
+ assertFalse(mButtonPlayback.isEnabled());
+ assertFalse(mButtonStop.isEnabled());
+ assertTrue(mButtonAddToFavorite.getVisibility() == View.GONE);
+ }
+
+ // check ui and state while recording.
+ public void checkRecordingState() {
+ assertFalse(mButtonRecord.isEnabled());
+ assertFalse(mButtonPlayback.isEnabled());
+ assertTrue(mButtonStop.isEnabled());
+ assertTrue(mButtonAddToFavorite.getVisibility() == View.GONE);
+ }
+
+ // check ui and state when recording stop
+ public void checkRecordingStopState() {
+ mButtonRecordSave = (Button) mSolo.getView(R.id.fm_recording_btn_save);
+ assertTrue(mButtonRecordSave.isEnabled());
+ assertTrue(mButtonAddToFavorite.getVisibility() == View.GONE);
+ }
+
+ // check ui and state when save an recording file.
+ public void checkRecordHasSavedIdle() {
+ assertTrue(mButtonRecord.isEnabled());
+ assertTrue(mButtonPlayback.isEnabled());
+ assertFalse(mButtonStop.isEnabled());
+ assertTrue(mButtonAddToFavorite.getVisibility() == View.GONE);
+ }
+
+ // check ui and state while playing back an recordfing file.
+ public void checkPlayingBackState() {
+ assertFalse(mButtonRecord.isEnabled());
+ assertFalse(mButtonPlayback.isEnabled());
+ assertTrue(mButtonStop.isEnabled());
+ assertTrue(mButtonAddToFavorite.getVisibility() == View.GONE);
+ }
+
+ // check ui and state when play back an recording file finish.
+ public void checkPlayingBackFinished() {
+ assertTrue(mButtonRecord.isEnabled());
+ assertTrue(mButtonPlayback.isEnabled());
+ assertFalse(mButtonStop.isEnabled());
+ assertTrue(mButtonAddToFavorite.getVisibility() == View.GONE);
+ }
+
+ // check state, if cancel scan
+ public void checkCancelScan() {
+ mSolo.sleep(SHORT_TIME);
+ String cancel = mFmRadioActivity.getString(R.string.btn_cancel);
+ mSolo.clickOnText(cancel);
+ mInstrumentation.waitForIdleSync();
+ int currentStation = (Integer) FmRadioTestCaseUtil
+ .getVariableFromActivity(mFmRadioActivity, "mCurrentStation");
+ assertEquals(currentStation,
+ FmRadioTestCaseUtil.getStationFromUI(mTextViewFrequency));
+ mSolo.sleep(SHORT_TIME);
+ }
+
+ // check state, if finish scan
+ public void checkFinishScan() {
+ Log.d(TAG, ">>> checkFinishScan");
+ //mInstrumentation.waitForIdleSync();
+ mActivityMonitor = mInstrumentation.addMonitor(
+ FmRadioFavorite.class.getName(), null, false);
+ Log.d(TAG, "current activity:" + mSolo.getCurrentActivity().getComponentName());
+ mFmRadioFavorite = (FmRadioFavorite) mInstrumentation
+ .waitForMonitorWithTimeout(mActivityMonitor, SEARCH_TIME);
+ mSolo.sleep(SHORT_TIME);
+ Log.d(TAG, "mFmRadioFavorite is " + mFmRadioFavorite);
+ assertNotNull(mFmRadioFavorite);
+
+ // test data in database.
+ Uri uri = Uri.parse(CONTENTURI);
+ Cursor c = mFmRadioFavorite.getContentResolver().query(
+ uri,
+ new String[] { FmRadioStation.Station._ID,
+ FmRadioStation.Station.COLUMN_STATION_FREQ,
+ FmRadioStation.Station.COLUMN_STATION_TYPE }, null,
+ null, null);
+ assertTrue(c != null && c.getCount() > 0);
+ int stationFreq = 0;
+ int stationType = 0;
+ if (c != null) {
+ c.moveToFirst();
+ while (!c.isAfterLast()) {
+ stationFreq = c.getInt(1);
+ stationType = c.getInt(2);
+ Log.d(TAG, "station =" + stationFreq);
+ if (FmRadioStation.STATION_TYPE_SEARCHED == stationType) {
+ assertTrue(FmRadioTestCaseUtil.isExistInChannelList(
+ mFmRadioFavorite, stationFreq));
+ }
+ c.moveToNext();
+ }
+ }
+ if (c != null) {
+ c.close();
+ }
+
+ // click the last station in listview to play.
+ String pStation = String.valueOf((float) stationFreq / CONVERT_RATE);
+ mSolo.clickOnText(pStation);
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(SHORT_TIME);
+ assertEquals(stationFreq,
+ FmRadioTestCaseUtil.getStationFromUI(mTextViewFrequency));
+
+ checkFMPlayingState();
+ }
+
+ private void switchEarphone() {
+ if (!mButtonDecrease.isEnabled()) {
+ makeFMPowerUp();
+ }
+ mInstrumentation
+ .invokeMenuActionSync(mFmRadioActivity, R.id.fm_menu, 0);
+ String earphone = mFmRadioActivity.getString(R.string.optmenu_earphone);
+ mSolo.clickOnText(earphone);
+ mInstrumentation.waitForIdleSync();
+ }
+
+ private void switchSpeaker() {
+ if (!mButtonDecrease.isEnabled()) {
+ makeFMPowerUp();
+ }
+ mInstrumentation
+ .invokeMenuActionSync(mFmRadioActivity, R.id.fm_menu, 0);
+ String speaker = mFmRadioActivity.getString(R.string.optmenu_speaker);
+ mSolo.clickOnText(speaker);
+ mInstrumentation.waitForIdleSync();
+ }
+
+ private void deleteChannelFromFavorite(int station) {
+ if (FmRadioStation.isFavoriteStation(mFmRadioActivity, station)) {
+ clickView(mButtonAddToFavorite);
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(SHORT_TIME);
+ }
+ }
+
+ private void addChannelAsFavorite(int station) {
+ if (!FmRadioStation.isFavoriteStation(mFmRadioActivity, station)) {
+ clickView(mButtonAddToFavorite);
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(SHORT_TIME);
+ }
+
+ }
+
+ private void makeFMPowerUp() {
+ boolean isPlaying = false;
+ isPlaying = (Boolean) FmRadioTestCaseUtil.getVariableFromActivity(
+ mFmRadioActivity, "mIsPlaying");
+ if (!isPlaying) {
+ mInstrumentation
+ .invokeMenuActionSync(mFmRadioActivity, R.id.fm_power, 0);
+ }
+ //mInstrumentation.waitForIdleSync();
+ mSolo.sleep(TIMEOUT);
+ }
+
+ private void makeFMPowerDown() {
+ boolean isPlaying = true;
+ isPlaying = (Boolean) FmRadioTestCaseUtil.getVariableFromActivity(
+ mFmRadioActivity, "mIsPlaying");
+ if (isPlaying) {
+ FmRadioTestCaseUtil.requestFocusGain(mAudioManager);
+ }
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(SHORT_TIME);
+ }
+
+ private void clickView(final View view) {
+ try {
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ view.performClick();
+ }
+ });
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+
+ private void waitForInitedWithTimeout(long timeOut) {
+ long startTime = System.currentTimeMillis();
+ boolean isInited = (Boolean) FmRadioTestCaseUtil
+ .getVariableFromMethod(mFmRadioActivity, "isServiceInited");
+ while (!isInited) {
+ if (System.currentTimeMillis() - startTime > timeOut) {
+ break;
+ }
+ mSolo.sleep(CHECK_TIME);
+ }
+ }
+
+ private void waitForPowerupWithTimeout(long timeOut) {
+
+ long startTime = System.currentTimeMillis();
+ boolean isPlaying = (Boolean) FmRadioTestCaseUtil
+ .getVariableFromActivity(mFmRadioActivity, "mIsPlaying");
+ while (!isPlaying) {
+ if (System.currentTimeMillis() - startTime > timeOut) {
+ break;
+ }
+ mSolo.sleep(CHECK_TIME);
+ }
+ }
+
+ // start scan when power up state
+ private void startScanWhenPowerUp() {
+ if (!mButtonDecrease.isEnabled()) {
+ makeFMPowerUp();
+ }
+ mInstrumentation
+ .invokeMenuActionSync(mFmRadioActivity, R.id.fm_menu, 0);
+ mInstrumentation.waitForIdleSync();
+ mSolo.sleep(ONE_SECOND);
+ String search = mFmRadioActivity.getString(R.string.optmenu_search);
+ mSolo.clickOnText(search);
+ }
+
+ // check play FM layout button enable
+ public void checkFMPlayingState() {
+ assertTrue(mButtonDecrease.isEnabled());
+ assertTrue(mButtonIncrease.isEnabled());
+ assertTrue(mButtonNextStation.isEnabled());
+ assertTrue(mButtonPrevStation.isEnabled());
+
+ }
+
+ // check play FM layout button enable
+ public void checkFMStopState() {
+ assertFalse(mButtonDecrease.isEnabled());
+ assertFalse(mButtonPrevStation.isEnabled());
+ assertFalse(mButtonNextStation.isEnabled());
+ assertFalse(mButtonIncrease.isEnabled());
+ }
+
+ public void initialRel() {
+ mFmRadioActivity = (FmRadioActivity) mSolo.getCurrentActivity();
+ mSolo = new Solo(mInstrumentation, mFmRadioActivity);
+ mContext = mFmRadioActivity.getApplicationContext();
+ assertNotNull(mFmRadioActivity);
+ mButtonPrevStation = (ImageButton) mFmRadioActivity.findViewById(R.id.button_prevstation);
+ mButtonNextStation = (ImageButton) mFmRadioActivity.findViewById(R.id.button_nextstation);
+ mButtonDecrease = (ImageButton) mFmRadioActivity.findViewById(R.id.button_decrease);
+ mButtonIncrease = (ImageButton) mFmRadioActivity.findViewById(R.id.button_increase);
+
+ mButtonAddToFavorite = (ImageButton) mFmRadioActivity
+ .findViewById(R.id.button_add_to_favorite);
+
+ mTextViewFrequency = (TextView) mFmRadioActivity
+ .findViewById(R.id.station_value);
+ }
+
+ @Override
+ protected void tearDown() {
+ mSolo.finishOpenedActivities();
+ mInstrumentation.waitForIdleSync();
+ FmRadioTestCaseUtil.sleep(WAIT_TEAR_DOWN);
+ try {
+ mSolo.finalize();
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ try {
+ super.tearDown();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+}
diff --git a/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioFavoriteTest.java b/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioFavoriteTest.java
new file mode 100755
index 0000000..841a727
--- /dev/null
+++ b/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioFavoriteTest.java
@@ -0,0 +1,261 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2010. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.fmradio.tests;
+import android.app.Instrumentation;
+import android.test.ActivityInstrumentationTestCase2;
+import android.view.View;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.EditText;
+import android.widget.ListAdapter;
+import android.widget.ListView;
+import android.widget.TextView;
+import android.content.Context;
+
+import com.jayway.android.robotium.solo.Solo;
+import com.mediatek.fmradio.FmRadioActivity;
+import com.mediatek.fmradio.FmRadioFavorite;
+import com.mediatek.fmradio.FmRadioStation;
+import com.mediatek.fmradio.R;
+
+
+public class FmRadioFavoriteTest extends
+ ActivityInstrumentationTestCase2<FmRadioFavorite> {
+ private Solo mSolo = null;
+ private TextView mTextViewFrequency = null;
+ private FmRadioFavorite mFmRadioFavorite = null;
+ private FmRadioActivity mFmRadioActivity = null;
+ private Context mContext = null;
+ private Instrumentation mInstrumentation = null;
+ private static final int CONVERT_RATE = 10;
+ private static final long SLEEP_TIME = 2000;
+
+ public FmRadioFavoriteTest() {
+ super("com.mediatek.fmradio", FmRadioFavorite.class);
+ }
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mSolo = new Solo(getInstrumentation(), getActivity());
+ mInstrumentation = getInstrumentation();
+ mFmRadioFavorite = (FmRadioFavorite) getActivity();
+ mContext = mFmRadioFavorite.getApplicationContext();
+ }
+ public void testCase01_AddToFavorite() {
+ boolean find = false;
+ float frequency = 0;
+ int stationInList = 0;
+ ListView listView = (ListView) mFmRadioFavorite.findViewById(R.id.station_list);
+ FmRadioTestCaseUtil.sleep(SLEEP_TIME);
+ assertTrue((listView != null) && (listView.getCount() > 0));
+ ListAdapter listAdapter = listView.getAdapter();
+ for (int i = 0; i < listView.getCount(); i++) {
+ View view = listAdapter.getView(i, null, listView);
+ TextView textView = (TextView) view.findViewById(R.id.lv_station_freq);
+ String frequencyStr = textView.getText().toString();
+ try {
+ frequency = Float.parseFloat(frequencyStr);
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ }
+ stationInList = (int) (frequency * CONVERT_RATE);
+ if (!FmRadioStation.isFavoriteStation(mFmRadioFavorite, stationInList)) {
+ mSolo.clickLongOnText(frequencyStr);
+ mSolo.clickOnText(FmRadioTestCaseUtil.getProjectString(mContext, R.string.add_to_favorite1, R.string.add_to_favorite));
+ mInstrumentation.waitForIdleSync();
+ InputMethodManager inputMethodManager = (InputMethodManager) mSolo.getCurrentActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
+ inputMethodManager.toggleSoftInput(0, 0);
+ mSolo.clickOnButton(mContext.getString(R.string.btn_ok));
+ mInstrumentation.waitForIdleSync();
+ sleep(SLEEP_TIME);
+ assertTrue(FmRadioStation.isFavoriteStation(mFmRadioFavorite, stationInList));
+ return ;
+ }
+ }
+
+ }
+ public void testCase02_EditFavoriteChannel() {
+ boolean find = false;
+ float frequency = 0;
+ int stationInList = 0;
+ ListView listView = (ListView) mFmRadioFavorite.findViewById(R.id.station_list);
+ FmRadioTestCaseUtil.sleep(SLEEP_TIME);
+ assertTrue((listView != null) && (listView.getCount() > 0));
+ ListAdapter listAdapter = listView.getAdapter();
+ for (int i = 0; i < listView.getCount(); i++) {
+ View view = listAdapter.getView(i, null, listView);
+ TextView textView = (TextView) view.findViewById(R.id.lv_station_freq);
+ String frequencyStr = textView.getText().toString();
+ try {
+ frequency = Float.parseFloat(frequencyStr);
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ }
+ stationInList = (int) (frequency * CONVERT_RATE);
+ if (FmRadioStation.isFavoriteStation(mFmRadioFavorite, stationInList)) {
+ mSolo.clickLongOnText(frequencyStr);
+ mSolo.clickOnText(mContext.getString(R.string.contmenu_item_edit));
+ EditText editText = (EditText) mSolo.getView(R.id.dlg_edit_station_name_text);
+ mSolo.clearEditText(editText);
+ mSolo.enterText(editText, "aaa");
+ mInstrumentation.waitForIdleSync();
+ InputMethodManager inputMethodManager = (InputMethodManager) mSolo.getCurrentActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
+ inputMethodManager.toggleSoftInput(0, 0);
+ mSolo.clickOnButton(mContext.getString(R.string.edit_frequency_overwrite_text));
+ mInstrumentation.waitForIdleSync();
+ sleep(SLEEP_TIME);
+ assertEquals("aaa", FmRadioStation.getStationName(mFmRadioFavorite, stationInList, FmRadioStation.STATION_TYPE_FAVORITE));
+ return ;
+ }
+ }
+ }
+ public void testCase03_DeleteFromFavorite() throws Throwable {
+ boolean find = false;
+ float frequency = 0;
+ int stationInList = 0;
+ final ListView listView = (ListView) mFmRadioFavorite.findViewById(R.id.station_list);
+ FmRadioTestCaseUtil.sleep(SLEEP_TIME);
+ assertTrue((listView != null) && (listView.getCount() > 0));
+ ListAdapter listAdapter = listView.getAdapter();
+ for (int i = 0; i < listView.getCount(); i++) {
+ View view = listAdapter.getView(i, null, listView);
+ TextView textView = (TextView) view.findViewById(R.id.lv_station_freq);
+ String frequencyStr = textView.getText().toString();
+ try {
+ frequency = Float.parseFloat(frequencyStr);
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ }
+ stationInList = (int) (frequency * CONVERT_RATE);
+ if (FmRadioStation.isFavoriteStation(mFmRadioFavorite, stationInList)) {
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ listView.setSelection(0);
+ }
+ });
+ mSolo.sleep(3000);
+ mSolo.clickLongOnText(frequencyStr);
+ mSolo.clickOnText(FmRadioTestCaseUtil.getProjectString(mContext, R.string.contmenu_item_delete1, R.string.contmenu_item_delete));
+ mInstrumentation.waitForIdleSync();
+ mSolo.clickOnButton(mContext.getString(R.string.btn_ok));
+ mInstrumentation.waitForIdleSync();
+ sleep(SLEEP_TIME);
+ assertFalse(FmRadioStation.isFavoriteStation(mFmRadioFavorite, stationInList));
+ return ;
+ }
+ }
+ }
+
+ // edit a favorite to a favorite frequency
+ public void testCase04_EditFavoriteToFavorite() throws Throwable {
+ boolean find = false;
+ float frequency = 0;
+ int stationInList = 0;
+ String preFavoritaFreq = "";
+ ListView listView = (ListView) mFmRadioFavorite.findViewById(R.id.station_list);
+ FmRadioTestCaseUtil.sleep(SLEEP_TIME);
+ assertTrue((listView != null) && (listView.getCount() > 0));
+ ListAdapter listAdapter = listView.getAdapter();
+ int count = listView.getCount();
+ for (int i = 0; i < count; i++) {
+ int favoriateCount = 0;
+ View view = listAdapter.getView(i, null, listView);
+ TextView textView = (TextView) view.findViewById(R.id.lv_station_freq);
+ String frequencyStr = textView.getText().toString();
+ try {
+ frequency = Float.parseFloat(frequencyStr);
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ }
+ stationInList = (int) (frequency * CONVERT_RATE);
+ if (FmRadioStation.isFavoriteStation(mFmRadioFavorite, stationInList)) {
+ favoriateCount += 1;
+ preFavoritaFreq = frequencyStr;
+ }
+ // add to favoriate
+ if (!FmRadioStation.isFavoriteStation(mFmRadioFavorite, stationInList)) {
+ mSolo.clickLongOnText(frequencyStr);
+ mSolo.clickOnText(FmRadioTestCaseUtil.getProjectString(mContext, R.string.add_to_favorite1, R.string.add_to_favorite));
+ mInstrumentation.waitForIdleSync();
+ InputMethodManager inputMethodManager = (InputMethodManager) mSolo.getCurrentActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
+ inputMethodManager.toggleSoftInput(0, 0);
+ mSolo.clickOnButton(mContext.getString(R.string.btn_ok));
+ mInstrumentation.waitForIdleSync();
+ sleep(SLEEP_TIME);
+ assertTrue(FmRadioStation.isFavoriteStation(mFmRadioFavorite, stationInList));
+ // edit favoriate to exist favorite
+ if (favoriateCount > 0) {
+ mSolo.clickLongOnText(frequencyStr);
+ mSolo.clickOnText(mContext.getString(R.string.contmenu_item_edit));
+ EditText editText = (EditText) mSolo.getView(R.id.dlg_edit_station_name_text);
+ mSolo.clearEditText(editText);
+ mSolo.enterText(editText, preFavoritaFreq);
+ mInstrumentation.waitForIdleSync();
+ InputMethodManager inputMethodManager2 = (InputMethodManager) mSolo.getCurrentActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
+ inputMethodManager2.toggleSoftInput(0, 0);
+ mSolo.clickOnButton(mContext.getString(R.string.btn_ok));
+ mInstrumentation.waitForIdleSync();
+ sleep(SLEEP_TIME);
+ assertEquals(preFavoritaFreq, FmRadioStation.getStationName(mFmRadioFavorite, stationInList, FmRadioStation.STATION_TYPE_FAVORITE));
+ break;
+ }
+ }
+ }
+ testCase03_DeleteFromFavorite();
+ }
+
+ private void sleep(long milliseconds) {
+ try {
+ Thread.sleep(milliseconds);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ FmRadioTestCaseUtil.sleep(SLEEP_TIME);
+ try {
+ mSolo.finalize();
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ super.tearDown();
+ }
+
+}
diff --git a/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioFunctionRunner.java b/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioFunctionRunner.java
new file mode 100755
index 0000000..7658b2f
--- /dev/null
+++ b/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioFunctionRunner.java
@@ -0,0 +1,59 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2010. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.fmradio.tests;
+
+import junit.framework.TestSuite;
+
+import android.test.InstrumentationTestRunner;
+import android.test.InstrumentationTestSuite;
+
+public class FmRadioFunctionRunner extends InstrumentationTestRunner {
+ @Override
+ public TestSuite getAllTests() {
+ InstrumentationTestSuite suite = new InstrumentationTestSuite(this);
+ suite.addTestSuite(FmRadioActivityTest.class);
+ suite.addTestSuite(FmRadioFavoriteTest.class);
+ return suite;
+ }
+
+ @Override
+ public ClassLoader getLoader() {
+ return FmRadioFunctionRunner.class.getClassLoader();
+ }
+
+}
diff --git a/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioLaunchPerformance.java b/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioLaunchPerformance.java
new file mode 100755
index 0000000..828690c
--- /dev/null
+++ b/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioLaunchPerformance.java
@@ -0,0 +1,59 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2010. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.fmradio.tests;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.test.LaunchPerformanceBase;
+
+public class FmRadioLaunchPerformance extends LaunchPerformanceBase {
+ @Override
+ public void onCreate(Bundle arguments) {
+ super.onCreate(arguments);
+ mIntent.setClassName(getTargetContext(),
+ "com.mediatek.fmradio.FmRadioActivity");
+ start();
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ LaunchApp();
+ finish(Activity.RESULT_OK, mResults);
+ }
+} \ No newline at end of file
diff --git a/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioPerformanceRunner.java b/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioPerformanceRunner.java
new file mode 100755
index 0000000..ad25cd4
--- /dev/null
+++ b/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioPerformanceRunner.java
@@ -0,0 +1,57 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2010. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.fmradio.tests;
+
+import junit.framework.TestSuite;
+import android.test.InstrumentationTestRunner;
+import android.test.InstrumentationTestSuite;
+
+public class FmRadioPerformanceRunner extends InstrumentationTestRunner {
+ @Override
+ public TestSuite getAllTests() {
+ InstrumentationTestSuite suite = new InstrumentationTestSuite(this);
+ suite.addTestSuite(FmRadioPerformanceTest.class);
+ return suite;
+ }
+
+ @Override
+ public ClassLoader getLoader() {
+ return FmRadioPerformanceRunner.class.getClassLoader();
+ }
+
+}
diff --git a/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioPerformanceTest.java b/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioPerformanceTest.java
new file mode 100755
index 0000000..7bc3bf0
--- /dev/null
+++ b/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioPerformanceTest.java
@@ -0,0 +1,554 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2010. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.fmradio.tests;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import android.app.Activity;
+import android.app.Instrumentation;
+import android.content.Context;
+import android.media.AudioManager;
+import android.test.ActivityInstrumentationTestCase2;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.EditText;
+import android.widget.ImageButton;
+import android.widget.ListAdapter;
+import android.widget.TextView;
+import android.widget.ListView;
+import android.app.Instrumentation.ActivityMonitor;
+import com.jayway.android.robotium.solo.Solo;
+
+import com.mediatek.fmradio.FmRadioActivity;
+import com.mediatek.fmradio.FmRadioFavorite;
+import com.mediatek.fmradio.FmRadioStation;
+import com.mediatek.fmradio.R;
+
+public class FmRadioPerformanceTest extends ActivityInstrumentationTestCase2<FmRadioActivity> {
+
+ public FmRadioPerformanceTest(Class<FmRadioActivity> activityClass) {
+ super(activityClass);
+ }
+
+ public FmRadioPerformanceTest() {
+ super(FmRadioActivity.class);
+ }
+
+ private AudioManager mAudioManager = null;
+
+ // bottom bar
+ private ImageButton mButtonDecrease = null;
+ private ImageButton mButtonPrevStation = null;
+ private ImageButton mButtonNextStation = null;
+ private ImageButton mButtonIncrease = null;
+// private ImageButton mButtonPlayStop = null;
+
+ private ImageButton mButtonAddToFavorite = null;
+
+ private TextView mTextViewFrequency = null;
+
+ private static final long TIMEOUT = 5000;
+ private static final long CHECK_TIME = 100;
+ private static final long SHORT_TIME = 3000;
+ private static final long WAIT_UI_STATE_CHANGE = 10000;
+ private static final long WAIT_SCAN_FINISH = 20000;
+ private static final long WAIT_TEAR_DOWN = 3000;
+ private static final long SLEEP_TIME = 2000;
+ private static final long RDS_TIME_OUT = 10 * 60 * 1000;
+ private static final int CONVERT_RATE = 10;
+ private static final int EXECUTE_TIME = 500;
+ private static final String TAG = "FmRadioPerformanceTest";
+
+ private FmRadioActivity mFmRadioActivity = null;
+ private Instrumentation mInstrumentation = null;
+ private ActivityMonitor mActivityMonitor = null;
+ private FmRadioFavorite mFmRadioFavorite = null;
+ private Solo mSolo = null;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ Log.i(TAG, "setUp");
+ setActivityInitialTouchMode(false);
+ mFmRadioActivity = getActivity();
+ assertNotNull(mFmRadioActivity);
+ mInstrumentation = getInstrumentation();
+ assertNotNull(mInstrumentation);
+ mSolo = new Solo(getInstrumentation(), mFmRadioActivity);
+ Context mContext = mFmRadioActivity.getApplicationContext();
+ mAudioManager = (AudioManager) mFmRadioActivity.getSystemService(mContext.AUDIO_SERVICE);
+ // Makesure FmRadio is playing and initialed
+ waitForPowerupWithTimeout(TIMEOUT);
+ boolean isPlaying = getBooleanFromVariable(mFmRadioActivity, "mIsPlaying");
+ assertTrue(isPlaying);
+ waitForInitedWithTimeout(TIMEOUT);
+ boolean isInited = getBooleanFromVariable(mFmRadioActivity, "mIsServiceBinded");
+ assertTrue(isInited);
+ mButtonDecrease = (ImageButton) mFmRadioActivity.findViewById(R.id.button_decrease);
+ mButtonPrevStation = (ImageButton) mFmRadioActivity.findViewById(R.id.button_prevstation);
+ mButtonNextStation = (ImageButton) mFmRadioActivity.findViewById(R.id.button_nextstation);
+ mButtonIncrease = (ImageButton) mFmRadioActivity.findViewById(R.id.button_increase);
+// mButtonPlayStop = (ImageButton) mFmRadioActivity.findViewById(R.id.button_play_stop);
+
+ mButtonAddToFavorite = (ImageButton) mFmRadioActivity.findViewById(R.id.button_add_to_favorite);
+ mTextViewFrequency = (TextView) mFmRadioActivity.findViewById(R.id.station_value);
+ }
+
+
+ private void waitForInitedWithTimeout(long timeOut) {
+ Log.i(TAG, ">>>waitForInitedWithTimeout");
+
+ long startTime = System.currentTimeMillis();
+ while (!getBooleanFromVariable(mFmRadioActivity, "mIsServiceBinded")) {
+ if (System.currentTimeMillis() - startTime > timeOut) {
+ break;
+ }
+ sleep(CHECK_TIME);
+ }
+ Log.i(TAG, "<<<waitForInitedWithTimeout");
+
+ }
+
+ private void waitForPowerupWithTimeout(long timeOut) {
+ Log.i(TAG, ">>>waitForPowerupWithTimeout");
+
+ long startTime = System.currentTimeMillis();
+ while (!getBooleanFromVariable(mFmRadioActivity, "mIsPlaying")) {
+ if (System.currentTimeMillis() - startTime > timeOut) {
+ break;
+ }
+ sleep(CHECK_TIME);
+ }
+ Log.i(TAG, "<<<waitForPowerupWithTimeout");
+ }
+
+ /**
+ * Test scan channel performance.
+ */
+ public void testCase00_ScanChannelPerformance() throws Exception {
+ if (!mButtonDecrease.isEnabled()) {
+ makeFMPowerUp();
+ }
+ mInstrumentation.invokeMenuActionSync(mFmRadioActivity, R.id.fm_menu, 0);
+ mInstrumentation.waitForIdleSync();
+ mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_DOWN);
+ mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_UP);
+ mInstrumentation.waitForIdleSync();
+ long startTime = System.currentTimeMillis();
+ Log.i(TAG, "[Performance test][FmRadio] scan channel start [" + startTime + "]");
+ mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_CENTER);
+ sleep(WAIT_SCAN_FINISH);
+ mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
+ sleep(SHORT_TIME);
+ }
+
+ /**
+ * Test open channel performance.
+ */
+ /*public void testCase01_ChannelOpenPerformance() throws Exception {
+ int station = getStationFromUI();
+ addChannelAsFavorite(station);
+ clickView(mButtonIncrease);
+ sleep(SHORT_TIME);
+ mInstrumentation.invokeMenuActionSync(mFmRadioActivity, R.id.fm_channel_list, 0);
+ mActivityMonitor = new ActivityMonitor("com.mediatek.fmradio.FmRadioFavorite", null, false);
+ mInstrumentation.addMonitor(mActivityMonitor);
+ mFmRadioFavorite = (FmRadioFavorite) mActivityMonitor.waitForActivityWithTimeout(TIMEOUT);
+ assertNotNull(mFmRadioFavorite);
+ ListView listView = (ListView) mFmRadioFavorite.findViewById(R.id.station_list);
+ mSolo.clickOnView(listView.getChildAt(0));
+ long startTime = System.currentTimeMillis();
+ Log.i(TAG, "[Performance test][FmRadio] open channel start [" + startTime + "]");
+ sleep(WAIT_UI_STATE_CHANGE);
+
+ }*/
+
+ /**
+ * Test increase and decrease 0.1 MHz / 0.05 MHZ performance.
+ */
+ public void testCase02_FrequencyChangePerformance() throws Exception {
+
+ // test decrease frequency performance
+ long startTime = System.currentTimeMillis();
+ Log.i(TAG, "[Performance test][FmRadio] decrease frequency start [" + startTime + "]");
+ clickView(mButtonDecrease);
+ sleep(WAIT_UI_STATE_CHANGE);
+
+ // test increase frequency performance
+ startTime = System.currentTimeMillis();
+ Log.i(TAG, "[Performance test][FmRadio] increase frequency start [" + startTime + "]");
+ clickView(mButtonIncrease);
+ sleep(WAIT_UI_STATE_CHANGE);
+
+ }
+
+ /**
+ * Test seek channel performance.
+ */
+ public void testCase03_SeekChannelPerformance() throws Exception {
+ // test seek previous station performance
+ int stationGap = 0;
+ int currentStation = FmRadioStation.getCurrentStation(mFmRadioActivity);
+ long startTime = System.currentTimeMillis();
+ Log.i(TAG, "[Performance test][FmRadio] seek previous channel start [" + startTime + "]");
+ clickView(mButtonPrevStation);
+ sleep(WAIT_UI_STATE_CHANGE);
+ int searchStation = FmRadioStation.getCurrentStation(mFmRadioActivity);
+ if (searchStation > currentStation) {
+ stationGap = searchStation - currentStation;
+ Log.i(TAG, "[Performance test][FmRadio] Test FmRadio seek time stationStep [" + (float) stationGap / CONVERT_RATE + "]");
+ } else if (searchStation < currentStation) {
+ stationGap = FmRadioTestCaseUtil.HIGHEST_STATION - currentStation + searchStation - FmRadioTestCaseUtil.LOWEST_STATION;
+ Log.i(TAG, "[Performance test][FmRadio] Test FmRadio seek time stationStep [" + (float) stationGap / CONVERT_RATE + "]");
+ } else {
+ Log.e(TAG, "SearchStation Unchanged");
+ }
+ // test seek next station frequency performance
+ currentStation = FmRadioStation.getCurrentStation(mFmRadioActivity);
+ startTime = System.currentTimeMillis();
+ Log.i(TAG, "[Performance test][FmRadio] seek next channel start [" + startTime + "]");
+ clickView(mButtonNextStation);
+ sleep(WAIT_UI_STATE_CHANGE);
+ if (searchStation > currentStation) {
+ stationGap = searchStation - currentStation;
+ Log.i(TAG, "[Performance test][FmRadio] Test FmRadio seek time stationStep [" + (float) stationGap / CONVERT_RATE + "]");
+ } else if (searchStation < currentStation) {
+ stationGap = FmRadioTestCaseUtil.HIGHEST_STATION - currentStation + searchStation - FmRadioTestCaseUtil.LOWEST_STATION;
+ Log.i(TAG, "[Performance test][FmRadio] Test FmRadio seek time stationStep [" + (float) stationGap / CONVERT_RATE + "]");
+ } else {
+ Log.e(TAG, "SearchStation Unchanged");
+ }
+ }
+
+ /**
+ * Test switch earphone and speaker performance.
+ */
+ public void testCase04_SwitchSpeakerEarphone() throws Exception {
+ if (!mButtonDecrease.isEnabled()) {
+ makeFMPowerUp();
+ }
+ String earphone = mFmRadioActivity.getString(R.string.optmenu_earphone);
+ String speaker = mFmRadioActivity.getString(R.string.optmenu_speaker);
+
+ sleep(SHORT_TIME);
+ // test switch speaker performance
+ mInstrumentation.invokeMenuActionSync(mFmRadioActivity, R.id.fm_menu, 0);
+ mSolo.clickOnText(speaker);
+ sleep(SHORT_TIME);
+ mInstrumentation.invokeMenuActionSync(mFmRadioActivity, R.id.fm_menu, 0);
+ assertTrue(mSolo.searchText(earphone));
+ mInstrumentation.waitForIdleSync();
+
+ // test switch earphone performance
+ mInstrumentation.invokeMenuActionSync(mFmRadioActivity, R.id.fm_menu, 0);
+ mSolo.clickOnText(earphone);
+ sleep(SHORT_TIME);
+ mInstrumentation.invokeMenuActionSync(mFmRadioActivity, R.id.fm_menu, 0);
+ assertTrue(mSolo.searchText(speaker));
+ }
+
+ /**
+ * Test power up performance.
+ */
+ public void testCase05_PowerUpPerformance() throws Exception {
+ if (mButtonDecrease.isEnabled()) {
+ makeFMPowerDown();
+ }
+ // test power up performance
+ long startTime = System.currentTimeMillis();
+ Log.i(TAG, "[Performance test][FmRadio] power up start [" + startTime + "]");
+// clickView(mButtonPlayStop);
+ mInstrumentation.invokeMenuActionSync(mFmRadioActivity, R.id.fm_power, 0);
+ sleep(WAIT_UI_STATE_CHANGE);
+ }
+
+ /**
+ * Test get rds performance
+ * start time: tune to 91.4 finished
+ * end time: rds information show
+ */
+ public void testCase06_RDSPerformance() {
+ int station = 0;
+ // test add channel as favorite
+ station = FmRadioTestCaseUtil.getStationFromUI(mTextViewFrequency);
+ if (!FmRadioStation.isFavoriteStation(mFmRadioActivity, station)) {
+ clickView(mButtonAddToFavorite);
+ mInstrumentation.waitForIdleSync();
+ FmRadioTestCaseUtil.sleep(SHORT_TIME);
+ }
+
+ // enter channel list
+ mInstrumentation.invokeMenuActionSync(mFmRadioActivity,
+ R.id.fm_channel_list, 0);
+ mActivityMonitor = new ActivityMonitor(
+ "com.mediatek.fmradio.FmRadioFavorite", null, false);
+ mInstrumentation.addMonitor(mActivityMonitor);
+ mFmRadioFavorite = (FmRadioFavorite) mActivityMonitor
+ .waitForActivityWithTimeout(TIMEOUT);
+ assertNotNull(mFmRadioFavorite);
+ // edit this station to rds station91.4
+ float frequency = 0;
+ int stationInList = 0;
+ ListView listView = (ListView) mFmRadioFavorite.findViewById(R.id.station_list);
+ FmRadioTestCaseUtil.sleep(SLEEP_TIME);
+ assertTrue((listView != null) && (listView.getCount() > 0));
+ ListAdapter listAdapter = listView.getAdapter();
+ for (int i = 0; i < listView.getCount(); i++) {
+ View view = listAdapter.getView(i, null, listView);
+ TextView textView = (TextView) view.findViewById(R.id.lv_station_freq);
+ String frequencyStr = textView.getText().toString();
+ try {
+ frequency = Float.parseFloat(frequencyStr);
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ }
+ stationInList = (int) (frequency * CONVERT_RATE);
+ if (FmRadioStation.isFavoriteStation(mFmRadioFavorite, stationInList)) {
+ mSolo.clickLongOnText(frequencyStr);
+ mSolo.clickOnText(mFmRadioFavorite.getString(R.string.contmenu_item_edit));
+ EditText editText = (EditText) mSolo.getView(R.id.dlg_edit_station_freq_text);
+ mSolo.clearEditText(editText);
+ mSolo.enterText(editText, "91.4");
+ mInstrumentation.waitForIdleSync();
+ InputMethodManager inputMethodManager = (InputMethodManager) mSolo.getCurrentActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
+ inputMethodManager.toggleSoftInput(0, 0);
+ if (FmRadioStation.isStationExistInChList(mFmRadioFavorite, 914)) {
+ mSolo.clickOnText(mFmRadioFavorite.getString(R.string.edit_frequency_overwrite_text));
+ } else {
+ mSolo.clickOnText(mFmRadioFavorite.getString(R.string.btn_ok));
+ }
+ mInstrumentation.waitForIdleSync();
+ sleep(SLEEP_TIME);
+// assertEquals("aaa", FmRadioStation.getStationName(mFmRadioFavorite, stationInList, FmRadioStation.STATION_TYPE_FAVORITE));
+ break;
+ }
+ }
+
+ // tune to RDS station 91.4
+ mSolo.clickOnText("91.4");
+ long startTuneTime = System.currentTimeMillis();
+ Log.i(TAG, "[Performance test][FmRadio] open channel start [" + startTuneTime + "]");
+ mInstrumentation.waitForIdleSync();
+ // test increase frequency performance
+ long startTime = System.currentTimeMillis();
+ Log.i(TAG, "[Performance test][FmRadio] receive RDS start [" + startTime + "]");
+
+ // check RDS info is change
+ final TextView rdsTextView = (TextView) FmRadioTestCaseUtil.getVariableFromActivity(mFmRadioActivity, "mTextRDS");
+ long scapeTime = 0;
+ while (true) {
+ String rdsInfo = rdsTextView.getText().toString();
+ if (!"".equals(rdsInfo)) {
+ long endTime = System.currentTimeMillis();
+ Log.i(TAG, "[Performance test][FmRadio] receive RDS end [" + endTime + "]");
+ break;
+ }
+ try {
+ scapeTime = System.currentTimeMillis() - startTime;
+ sleep(CHECK_TIME);
+ } catch (Exception e) {
+ }
+ // if time > 10min, end time will be 10min
+ if (scapeTime > RDS_TIME_OUT) {
+ long endTime = System.currentTimeMillis();
+ Log.i(TAG, "[Performance test][FmRadio] receive RDS end [" + endTime + "]");
+ break;
+ }
+ }
+ }
+
+ public void testCase07_PowerDownPerformance() throws Exception {
+ if (!mButtonDecrease.isEnabled()) {
+ makeFMPowerUp();
+ }
+ // test power down performance
+ long startTime = System.currentTimeMillis();
+ Log.i(TAG, "[Performance test][FmRadio] power down start [" + startTime + "]");
+ FmRadioTestCaseUtil.requestFocusGain(mAudioManager);
+ sleep(WAIT_UI_STATE_CHANGE);
+ }
+
+ private void makeFMPowerUp() {
+ boolean isPlaying = false;
+ isPlaying = getBooleanFromVariable(mFmRadioActivity, "mIsPlaying");
+ if (!isPlaying) {
+ mInstrumentation
+ .invokeMenuActionSync(mFmRadioActivity, R.id.fm_power, 0);
+ }
+ sleep(WAIT_UI_STATE_CHANGE);
+
+ }
+
+ private void makeFMPowerDown() {
+ boolean isPlaying = true;
+ isPlaying = getBooleanFromVariable(mFmRadioActivity, "mIsPlaying");
+ if (isPlaying) {
+ FmRadioTestCaseUtil.requestFocusGain(mAudioManager);
+ }
+ sleep(WAIT_UI_STATE_CHANGE);
+
+ }
+
+ private void switchEarphone() {
+ if (!mButtonDecrease.isEnabled()) {
+ makeFMPowerUp();
+ }
+ mInstrumentation
+ .invokeMenuActionSync(mFmRadioActivity, R.id.fm_menu, 0);
+ String earphone = mFmRadioActivity.getString(R.string.optmenu_earphone);
+ mSolo.clickOnText(earphone);
+ mInstrumentation.waitForIdleSync();
+ }
+
+ private void switchSpeaker() {
+ if (!mButtonDecrease.isEnabled()) {
+ makeFMPowerUp();
+ }
+ mInstrumentation
+ .invokeMenuActionSync(mFmRadioActivity, R.id.fm_menu, 0);
+ String speaker = mFmRadioActivity.getString(R.string.optmenu_speaker);
+ mSolo.clickOnText(speaker);
+ mInstrumentation.waitForIdleSync();
+
+ }
+
+ private boolean getBooleanFromVariable(Activity activity, String variable) {
+ Field field = null;
+ boolean value = false;
+ try {
+ field = FmRadioActivity.class.getDeclaredField(variable);
+ field.setAccessible(true);
+ value = ((Boolean) field.get(activity)).booleanValue();
+ } catch (SecurityException e) {
+ e.printStackTrace();
+ } catch (NoSuchFieldException e) {
+ e.printStackTrace();
+ } catch (IllegalArgumentException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ return value;
+ }
+
+ private boolean getBooleanFromMethod(Activity activity, String method) {
+
+ boolean value = false;
+ Class c = mFmRadioActivity.getClass();
+ try {
+ Method m = (Method) c.getDeclaredMethod(method, new Class[] {});
+ m.setAccessible(true);
+ value = (Boolean) m.invoke(activity, new Object[] {});
+ } catch (SecurityException e) {
+ e.printStackTrace();
+ } catch (NoSuchMethodException e) {
+ e.printStackTrace();
+ } catch (IllegalArgumentException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ } catch (InvocationTargetException e) {
+ e.printStackTrace();
+ }
+ return value;
+ }
+
+ private void clickView(final View view) {
+ try {
+ runTestOnUiThread(new Runnable() {
+ public void run() {
+ view.performClick();
+
+ }
+ });
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+
+ private void sleep(long milliseconds) {
+ try {
+ Thread.sleep(milliseconds);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void addChannelAsFavorite(int station) {
+ if (!FmRadioStation.isFavoriteStation(mFmRadioActivity, station)) {
+ clickView(mButtonAddToFavorite);
+ mInstrumentation.waitForIdleSync();
+ sleep(SHORT_TIME);
+ }
+
+ }
+
+ private int getStationFromUI() {
+ int station = 0;
+ float frequency = 0;
+ mTextViewFrequency = (TextView) mFmRadioActivity.findViewById(R.id.station_value);
+ String frequencyStr = mTextViewFrequency.getText().toString();
+ try {
+ frequency = Float.parseFloat(frequencyStr);
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ }
+ station = (int) (frequency * CONVERT_RATE);
+ return station;
+
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ Log.i(TAG, "tearDown");
+ try {
+ mSolo.finalize();
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ mSolo.finishOpenedActivities();
+ sleep(WAIT_TEAR_DOWN);
+ super.tearDown();
+ }
+
+
+}
diff --git a/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioTestCaseUtil.java b/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioTestCaseUtil.java
new file mode 100755
index 0000000..f34a8c1
--- /dev/null
+++ b/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioTestCaseUtil.java
@@ -0,0 +1,219 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2010. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.fmradio.tests;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import android.app.Activity;
+import android.content.Context;
+import android.media.AudioManager;
+import android.media.AudioManager.OnAudioFocusChangeListener;
+import android.util.Log;
+import android.view.View;
+import android.widget.ListAdapter;
+import android.widget.ListView;
+import android.widget.TextView;
+import junit.framework.Assert;
+//import com.mediatek.storage.StorageManagerEx;
+import com.mediatek.fmradio.FmRadioActivity;
+import com.mediatek.fmradio.R;
+
+public class FmRadioTestCaseUtil {
+ // FM station variables
+ public static final int DEFAULT_STATION = 1000;
+ // maximum station frequency
+ public static final int HIGHEST_STATION = 1080;
+ // minimum station frequency
+ public static final int LOWEST_STATION = 875;
+
+ // minimum storage space for record
+ public static final long LOW_SPACE_THRESHOLD = 512 * 1024;
+
+ public static final int CONVERT_RATE = 10;
+ public static final long CHECK_TIME = 200;
+ public static final String OP = android.os.SystemProperties.get("ro.operator.optr");
+ public static final boolean IS_CMCC = ("OP01").equals(OP); // whether is CMCC project
+ private static final String TAG = "FmRadioTestCaseUtil";
+
+ // check station is in channel list.
+ public static boolean isExistInChannelList(Activity activity, int station) {
+
+ boolean find = false;
+ float frequency = 0;
+ int stationInList = 0;
+ ListView listView = (ListView) activity.findViewById(R.id.station_list);
+ sleep(CHECK_TIME);
+ Assert.assertTrue((listView != null) && (listView.getCount() > 0));
+ ListAdapter listAdapter = listView.getAdapter();
+ int stationCount = listView.getCount();
+ Log.d(TAG, "isExistInChannelList stationCount:" + stationCount);
+ for (int i = 0; i < stationCount; i++) {
+ View view = listAdapter.getView(i, null, listView);
+ TextView textView = (TextView) view.findViewById(R.id.lv_station_freq);
+ String frequencyStr = textView.getText().toString();
+ try {
+ frequency = Float.parseFloat(frequencyStr);
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ }
+ stationInList = (int) (frequency * CONVERT_RATE);
+ Log.d(TAG, "isExistInChannelList i:" + i + ", frequencyStr:" + frequencyStr +
+ ", stationInList:" + stationInList);
+ if (station == stationInList) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // get station fraom UI.
+ public static int getStationFromUI(TextView textView) {
+ int station = 0;
+ float frequency = 0;
+ String frequencyStr = textView.getText().toString();
+ try {
+ frequency = Float.parseFloat(frequencyStr);
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ }
+ station = (int) (frequency * CONVERT_RATE);
+ return station;
+ }
+
+ // sleep
+ public static void sleep(long milliseconds) {
+ try {
+ Thread.sleep(milliseconds);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ // get variable from method.
+ public static Object getVariableFromMethod(Activity activity, String method) {
+ Object value = false;
+ Class c = activity.getClass();
+ try {
+ Method m = (Method) c.getDeclaredMethod(method, new Class[] {});
+ m.setAccessible(true);
+ value = m.invoke(activity, new Object[] {});
+ } catch (SecurityException e) {
+ e.printStackTrace();
+ } catch (NoSuchMethodException e) {
+ e.printStackTrace();
+ } catch (IllegalArgumentException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ } catch (InvocationTargetException e) {
+ e.printStackTrace();
+ }
+ return value;
+ }
+
+ // get variable from activity.
+ public static Object getVariableFromActivity(Activity activity, String variable) {
+ Field field = null;
+ Object value = null;
+ try {
+ field = FmRadioActivity.class.getDeclaredField(variable);
+ field.setAccessible(true);
+ value = field.get(activity);
+ } catch (SecurityException e) {
+ e.printStackTrace();
+ } catch (NoSuchFieldException e) {
+ e.printStackTrace();
+ } catch (IllegalArgumentException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ return value;
+ }
+
+ public static String getProjectString(Context context, int cmccResId, int normalResId) {
+ return IS_CMCC ? context.getString(cmccResId) : context.getString(normalResId);
+ }
+
+// public static void mountSDCard(Context context) {
+// try {
+// getMountService().mountVolume(StorageManagerEx.getDefaultPath());
+// } catch (RemoteException e) {
+// }
+// }
+
+// public static void unmountSDCard(Context context) {
+// try {
+// getMountService().unmountVolume(StorageManagerEx.getDefaultPath(),
+// true, false);
+// } catch (RemoteException e) {
+// }
+// }
+//
+// private static IMountService getMountService() {
+// IMountService mountService = null;
+// IBinder service = ServiceManager.getService("mount");
+// Assert.assertNotNull(service);
+// mountService = IMountService.Stub.asInterface(service);
+// return mountService;
+// }
+
+ private static OnAudioFocusChangeListener mAudioFocusListener = new OnAudioFocusChangeListener() {
+ public void onAudioFocusChange(int focusChange) {
+ switch (focusChange) {
+ case AudioManager.AUDIOFOCUS_LOSS:
+ Log.d(TAG, "request audio focus loss");
+ break;
+ case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
+ Log.d(TAG, "request audio focus loss transient");
+ break;
+ case AudioManager.AUDIOFOCUS_GAIN:
+ Log.d(TAG, "request audio focus gain");
+ break;
+ default :
+ break;
+ }
+ }
+ };
+ public static void requestFocusGain(AudioManager audioManager) {
+ audioManager.requestAudioFocus(mAudioFocusListener,
+ AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
+ }
+}
diff --git a/MediaTek/FmRadio/turnkey/com/mediatek/fmradio/ExtensionUtils.java b/MediaTek/FmRadio/turnkey/com/mediatek/fmradio/ExtensionUtils.java
new file mode 100755
index 0000000..d560f17
--- /dev/null
+++ b/MediaTek/FmRadio/turnkey/com/mediatek/fmradio/ExtensionUtils.java
@@ -0,0 +1,67 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+ *
+ * MediaTek Inc. (C) 2010. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek
+ * Software") have been modified by MediaTek Inc. All revisions are subject to
+ * any receiver's applicable license agreements with MediaTek Inc.
+ */
+
+package com.mediatek.fmradio;
+
+import android.content.Context;
+
+import com.mediatek.common.MPlugin;
+import com.mediatek.fmradio.ext.IProjectStringExt;
+import com.mediatek.fmradio.ext.DefaultProjectStringExt;
+
+/**
+ * get plugin instance.
+ */
+public class ExtensionUtils {
+ /**
+ * get IProjectStringExt instance.
+ */
+ public static IProjectStringExt getExtension(
+ Context context) {
+ IProjectStringExt ext = null;
+ try {
+ ext = (IProjectStringExt) MPlugin.createInstance(IProjectStringExt.class.getName(),
+ context);
+ } finally {
+ if (ext == null) {
+ ext = new DefaultProjectStringExt();
+ }
+ }
+
+ return ext;
+ }
+}