├── Android.mk
├── AndroidManifest.xml
├── README
├── res
├── drawable-hdpi
│ ├── album_border_large.1.png
│ ├── alert_dialog_icon.png
│ ├── btn_arrow_left_default.png
│ ├── btn_arrow_left_press.png
│ ├── btn_arrow_left_selected.png
│ ├── btn_arrow_right_default.png
│ ├── btn_arrow_right_press.png
│ ├── btn_arrow_right_selected.png
│ ├── button_loudspeaker_off.png
│ ├── button_loudspeaker_on.png
│ ├── button_power_off.png
│ ├── button_power_on.png
│ ├── favorite_bg.png
│ ├── favorite_button_pressed.png
│ ├── favorite_line.png
│ ├── fmradio_background.jpg
│ ├── freq_indicator.png
│ ├── ic_btn_forward.png
│ ├── ic_btn_preset.png
│ ├── ic_btn_search.png
│ ├── ic_btn_search_stop.png
│ ├── ic_launcher_fm_tx.png
│ ├── ic_launcher_fmradio.png
│ ├── ic_menu_record.png
│ ├── ic_signal_2.png
│ ├── ic_silent_mode.png
│ ├── ic_silent_mode_off.png
│ ├── ic_status_fm_tx.png
│ ├── ic_stereo.png
│ ├── icon.png
│ ├── image_border_bg_normal.9.png
│ ├── stat_notify_fm.png
│ ├── station_freq_bg.png
│ ├── transparent.9.png
│ ├── tuner_view_0.png
│ ├── tuner_view_1.png
│ ├── tuner_view_2.png
│ ├── tuner_view_3.png
│ ├── tuner_view_4.png
│ ├── tuner_view_5.png
│ └── tuner_view_6.png
├── drawable-mdpi
│ ├── album_border_large.1.png
│ ├── alert_dialog_icon.png
│ ├── btn_arrow_left_default.png
│ ├── btn_arrow_left_press.png
│ ├── btn_arrow_left_selected.png
│ ├── btn_arrow_right_default.png
│ ├── btn_arrow_right_press.png
│ ├── btn_arrow_right_selected.png
│ ├── button_loudspeaker_off.png
│ ├── button_loudspeaker_on.png
│ ├── button_power_off.png
│ ├── button_power_on.png
│ ├── favorite_bg.png
│ ├── favorite_button_pressed.png
│ ├── favorite_line.png
│ ├── fmradio_background.jpg
│ ├── freq_indicator.png
│ ├── ic_btn_forward.png
│ ├── ic_btn_preset.png
│ ├── ic_btn_search.png
│ ├── ic_btn_search_stop.png
│ ├── ic_launcher_fm_tx.png
│ ├── ic_launcher_fmradio.png
│ ├── ic_menu_record.png
│ ├── ic_signal_2.png
│ ├── ic_silent_mode.png
│ ├── ic_silent_mode_off.png
│ ├── ic_status_fm_tx.png
│ ├── ic_stereo.png
│ ├── icon.png
│ ├── image_border_bg_normal.9.png
│ ├── stat_notify_fm.png
│ ├── station_freq_bg.png
│ ├── transparent.9.png
│ ├── tuner_view_0.png
│ ├── tuner_view_1.png
│ ├── tuner_view_2.png
│ ├── tuner_view_3.png
│ ├── tuner_view_4.png
│ ├── tuner_view_5.png
│ └── tuner_view_6.png
├── drawable
│ ├── btn_arrow_left.xml
│ ├── btn_arrow_right.xml
│ ├── favorite_button_bg.xml
│ ├── freq_indicator_seek.xml
│ └── station_border.xml
├── layout
│ ├── alert_dialog_list.xml
│ ├── alert_dialog_text_entry.xml
│ ├── fmradio.xml
│ ├── frequency_picker.xml
│ ├── frequency_picker_dialog.xml
│ └── statusbar.xml
├── values-de
│ ├── arrays.xml
│ └── strings.xml
├── values-fr
│ ├── arrays.xml
│ └── strings.xml
├── values-it
│ ├── arrays.xml
│ └── strings.xml
├── values-ja
│ ├── arrays.xml
│ └── strings.xml
├── values-ru
│ ├── arrays.xml
│ └── strings.xml
├── values-zh-rCN
│ ├── arrays.xml
│ └── strings.xml
├── values-zh-rTW
│ ├── arrays.xml
│ └── strings.xml
└── values
│ ├── arrays.xml
│ ├── strings.xml
│ └── styles.xml
└── src
└── com
└── android
└── fm
├── radio
├── FMMediaButtonIntentReceiver.java
├── FMRadio.java
├── FMRadioService.java
├── FmSharedPreferences.java
├── FreqIndicator.java
├── IFMRadioService.aidl
├── IFMRadioServiceCallbacks.aidl
├── PresetList.java
├── PresetStation.java
├── Settings.java
└── TunerView.java
└── utils
├── FrequencyPicker.java
└── FrequencyPickerDialog.java
/Android.mk:
--------------------------------------------------------------------------------
1 | LOCAL_PATH:= $(call my-dir)
2 | include $(CLEAR_VARS)
3 |
4 | LOCAL_MODULE_TAGS := optional
5 |
6 | LOCAL_SRC_FILES := $(call all-subdir-java-files) \
7 | src/com/android/fm/radio/IFMRadioServiceCallbacks.aidl \
8 | src/com/android/fm/radio/IFMRadioService.aidl \
9 |
10 | LOCAL_PACKAGE_NAME := FM
11 | LOCAL_CERTIFICATE := platform
12 |
13 | include $(BUILD_PACKAGE)
14 |
--------------------------------------------------------------------------------
/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
19 |
20 |
21 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/README:
--------------------------------------------------------------------------------
1 | FM Radio app from MIUI (www.miui.com).
2 |
3 |
--------------------------------------------------------------------------------
/res/drawable-hdpi/album_border_large.1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/album_border_large.1.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/alert_dialog_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/alert_dialog_icon.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/btn_arrow_left_default.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/btn_arrow_left_default.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/btn_arrow_left_press.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/btn_arrow_left_press.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/btn_arrow_left_selected.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/btn_arrow_left_selected.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/btn_arrow_right_default.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/btn_arrow_right_default.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/btn_arrow_right_press.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/btn_arrow_right_press.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/btn_arrow_right_selected.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/btn_arrow_right_selected.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/button_loudspeaker_off.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/button_loudspeaker_off.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/button_loudspeaker_on.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/button_loudspeaker_on.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/button_power_off.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/button_power_off.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/button_power_on.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/button_power_on.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/favorite_bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/favorite_bg.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/favorite_button_pressed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/favorite_button_pressed.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/favorite_line.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/favorite_line.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/fmradio_background.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/fmradio_background.jpg
--------------------------------------------------------------------------------
/res/drawable-hdpi/freq_indicator.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/freq_indicator.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/ic_btn_forward.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/ic_btn_forward.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/ic_btn_preset.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/ic_btn_preset.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/ic_btn_search.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/ic_btn_search.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/ic_btn_search_stop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/ic_btn_search_stop.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/ic_launcher_fm_tx.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/ic_launcher_fm_tx.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/ic_launcher_fmradio.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/ic_launcher_fmradio.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/ic_menu_record.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/ic_menu_record.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/ic_signal_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/ic_signal_2.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/ic_silent_mode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/ic_silent_mode.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/ic_silent_mode_off.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/ic_silent_mode_off.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/ic_status_fm_tx.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/ic_status_fm_tx.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/ic_stereo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/ic_stereo.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/icon.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/image_border_bg_normal.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/image_border_bg_normal.9.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/stat_notify_fm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/stat_notify_fm.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/station_freq_bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/station_freq_bg.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/transparent.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/transparent.9.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/tuner_view_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/tuner_view_0.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/tuner_view_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/tuner_view_1.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/tuner_view_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/tuner_view_2.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/tuner_view_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/tuner_view_3.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/tuner_view_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/tuner_view_4.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/tuner_view_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/tuner_view_5.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/tuner_view_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-hdpi/tuner_view_6.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/album_border_large.1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/album_border_large.1.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/alert_dialog_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/alert_dialog_icon.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/btn_arrow_left_default.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/btn_arrow_left_default.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/btn_arrow_left_press.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/btn_arrow_left_press.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/btn_arrow_left_selected.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/btn_arrow_left_selected.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/btn_arrow_right_default.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/btn_arrow_right_default.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/btn_arrow_right_press.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/btn_arrow_right_press.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/btn_arrow_right_selected.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/btn_arrow_right_selected.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/button_loudspeaker_off.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/button_loudspeaker_off.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/button_loudspeaker_on.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/button_loudspeaker_on.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/button_power_off.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/button_power_off.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/button_power_on.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/button_power_on.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/favorite_bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/favorite_bg.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/favorite_button_pressed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/favorite_button_pressed.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/favorite_line.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/favorite_line.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/fmradio_background.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/fmradio_background.jpg
--------------------------------------------------------------------------------
/res/drawable-mdpi/freq_indicator.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/freq_indicator.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/ic_btn_forward.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/ic_btn_forward.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/ic_btn_preset.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/ic_btn_preset.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/ic_btn_search.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/ic_btn_search.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/ic_btn_search_stop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/ic_btn_search_stop.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/ic_launcher_fm_tx.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/ic_launcher_fm_tx.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/ic_launcher_fmradio.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/ic_launcher_fmradio.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/ic_menu_record.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/ic_menu_record.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/ic_signal_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/ic_signal_2.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/ic_silent_mode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/ic_silent_mode.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/ic_silent_mode_off.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/ic_silent_mode_off.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/ic_status_fm_tx.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/ic_status_fm_tx.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/ic_stereo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/ic_stereo.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/icon.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/image_border_bg_normal.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/image_border_bg_normal.9.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/stat_notify_fm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/stat_notify_fm.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/station_freq_bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/station_freq_bg.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/transparent.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/transparent.9.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/tuner_view_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/tuner_view_0.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/tuner_view_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/tuner_view_1.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/tuner_view_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/tuner_view_2.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/tuner_view_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/tuner_view_3.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/tuner_view_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/tuner_view_4.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/tuner_view_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/tuner_view_5.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/tuner_view_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanogenMod/android_packages_apps_FM/4c9d4abc1f17f88e523bc42eea4530d74fbc4da5/res/drawable-mdpi/tuner_view_6.png
--------------------------------------------------------------------------------
/res/drawable/btn_arrow_left.xml:
--------------------------------------------------------------------------------
1 |
2 |
29 |
30 |
31 |
33 |
34 |
36 |
37 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/res/drawable/btn_arrow_right.xml:
--------------------------------------------------------------------------------
1 |
2 |
29 |
30 |
31 |
32 |
34 |
35 |
37 |
38 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/res/drawable/favorite_button_bg.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/res/drawable/freq_indicator_seek.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/res/drawable/station_border.xml:
--------------------------------------------------------------------------------
1 |
28 |
29 |
30 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/res/layout/alert_dialog_list.xml:
--------------------------------------------------------------------------------
1 |
2 |
29 |
33 |
34 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/res/layout/alert_dialog_text_entry.xml:
--------------------------------------------------------------------------------
1 |
2 |
29 |
33 |
34 |
48 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/res/layout/fmradio.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
10 |
11 |
12 |
21 |
24 |
29 |
32 |
37 |
40 |
45 |
48 |
53 |
56 |
57 |
58 |
59 |
60 |
69 |
76 |
77 |
83 |
92 |
93 |
94 |
101 |
102 |
103 |
104 |
105 |
116 |
117 |
118 |
130 |
131 |
132 |
--------------------------------------------------------------------------------
/res/layout/frequency_picker.xml:
--------------------------------------------------------------------------------
1 |
2 |
19 |
24 |
25 |
33 |
34 |
35 |
44 |
45 |
--------------------------------------------------------------------------------
/res/layout/frequency_picker_dialog.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
--------------------------------------------------------------------------------
/res/layout/statusbar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
14 |
15 |
16 |
21 |
22 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/res/values-de/arrays.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | - Nichts tun (bleibt eingeschaltet)
5 | - Ursprünglicher BT-Zustand
6 | - Eingabeaufforderung
7 | - Immer ausschalten
8 |
9 |
10 |
11 | - Stereo
12 | - Mono
13 |
14 |
15 |
16 | - 5 Minuten
17 | - 15 Minuten
18 | - 30 Minuten
19 | - Unendlich
20 |
21 |
22 |
23 | - Alle Sender
24 | - Hits (Erwachsene)
25 | - Klassik
26 | - Klassik Rock
27 | - College
28 | - Country
29 | - Notruf
30 | - Notruf Test
31 | - Fremdsprachen
32 | - Information
33 | - Jazz
34 | - Nachrichten
35 | - Nostalgie
36 | - Oldies
37 | - Persönlichkeit
38 | - Anrufsendung
39 | - Religiöse Musik
40 | - Religiöse Gespräche
41 | - Rhythm and Blues
42 | - Rock
43 | - Soft
44 | - Soft Rock
45 | - Soft Rhythm and Blues
46 | - Sport
47 | - Gespräche
48 | - Top 40
49 | - Wetter
50 |
51 |
52 |
53 | - Alle Sender
54 | - Kultur, Kirche und Gesellschaft
55 | - Politik und Zeitgeschehen
56 | - Kinderprogramm
57 | - Countrymusik
58 | - Dokumentation
59 | - Hörspiel und Literatur
60 | - Leichte Musik
61 | - Bildung
62 | - Notruf
63 | - Notruf Test
64 | - Finanzen
65 | - Volksmusic
66 | - Information
67 | - Jazz
68 | - Leichte Klassik
69 | - Freizeit
70 | - Nachrichten
71 | - Einheimische Musik
72 | - Andere Musik
73 | - Oldies
74 | - Anrufsendung
75 | - Popmusik
76 | - Religion
77 | - Rockmusik
78 | - Wissenschaft
79 | - Ernsthafte Klassik
80 | - Soziales
81 | - Sport
82 | - Reisen
83 | - Verschiedenes
84 | - Wetter
85 |
86 |
87 |
88 | - Umbenennen
89 | - Automatische Auswahl
90 | - Löschen
91 |
92 |
93 |
94 | - Nordamerika
95 | - Europa
96 | - Japan
97 | - Japan (erweitert)
98 | - Australien
99 | - Österreich
100 | - Belgien
101 | - Brasilien
102 | - China
103 | - Tschechien
104 | - Dänemark
105 | - Finnland
106 | - Frankreich
107 | - Deutschland
108 | - Griechenland
109 | - Hongkong
110 | - Indien
111 | - Irland
112 | - Italien
113 | - Korea
114 | - Mexiko
115 | - Niederlande
116 | - Neuseeland
117 | - Norwegen
118 | - Polen
119 | - Portugal
120 | - Russland
121 | - Singapur
122 | - Slowakei
123 | - Spanien
124 | - Schweiz
125 | - Schweden
126 | - Taiwan
127 | - Türkei
128 | - Großbritannien
129 | - Vereinigte Staaten
130 |
131 |
132 |
133 | - Nordamerika (87.5MHz bis 108.0MHz in 200 Khz Schritten)
134 | - Europa (87.5MHz bis 108.0MHz in 100 Khz Schritten)
135 | - Japan (76.0MHz bis 90.0MHz in 100 Khz Schritten)
136 | - Japan (erweitert) (90.0MHz bis 108.0MHz in 100 Khz Schritten)
137 | - Australien (87.7MHz bis 108.0MHz in 100 Khz Schritten)
138 | - Österreich (87.5MHz bis 108.0MHz in 50 Khz Schritten)
139 | - Belgien (87.5MHz bis 108.0MHz in 100 Khz Schritten)
140 | - Brasilien (87.8MHz bis 108.0MHz in 200 Khz Step)
141 | - China (87.0MHz bis 108.0MHz in 100 Khz Schritten)
142 | - Tschechien (87.5MHz bis 108.0MHz in 100 Khz Schritten)
143 | - Dänemark (87.5MHz bis 108.0MHz in 100 Khz Schritten)
144 | - Finnland (87.5MHz bis 108.0MHz in 100 Khz Schritten)
145 | - Frankreich (87.5MHz bis 108.0MHz in 100 Khz Schritten)
146 | - Deutschland (87.5MHz bis 108.0MHz in 100 Khz Schritten)
147 | - Griechenland (87.5MHz bis 108.0MHz in 100 Khz Schritten)
148 | - Hongkong (87.5MHz bis 108.0MHz in 100 Khz Schritten)
149 | - Indien (91.0MHz bis 106.4MHz in 100 Khz Schritten)
150 | - Irland (87.5MHz bis 108.0MHz in 100 Khz Schritten)
151 | - Italien (87.5MHz bis 108.0MHz in 100 Khz Schritten)
152 | - Korea (87.5MHz bis 108.0MHz in 200 Khz Schritten)
153 | - Mexiko (88.1MHz bis 107.9MHz in 200 Khz Schritten)
154 | - Niederlande (87.5MHz bis 108.0MHz in 100 Khz Schritten)
155 | - Neuseeland (88.0MHz bis 107.0MHz in 100 Khz Schritten)
156 | - Norwegen (87.5MHz bis 108.0MHz in 100 Khz Schritten)
157 | - Polen (88.0MHz bis 108.0MHz in 100 Khz Schritten)
158 | - Portugal (87.5MHz bis 108.0MHz in 100 Khz Schritten)
159 | - Russland (87.5MHz bis 108.0MHz in 100 Khz Schritten)
160 | - Singapur (88.0MHz bis 108.0MHz in 100 Khz Schritten)
161 | - Slowakei (87.5MHz bis 108.0MHz in 100 Khz Schritten)
162 | - Spanien (87.5MHz bis 108.0MHz in 100 Khz Schritten)
163 | - Schweiz (87.5MHz bis 108.0MHz in 100 Khz Schritten)
164 | - Schweden (87.5MHz bis 108.0MHz in 100 Khz Schritten)
165 | - Taiwan (87.5MHz bis 108.0MHz in 100 Khz Schritten)
166 | - Türkei (87.5MHz bis 108.0MHz in 100 Khz Schritten)
167 | - Großbritannien (87.5MHz bis 108.0MHz in 100 Khz Schritten)
168 | - Vereinigte Staaten (88.1MHz bis 107.9MHz in 200 Khz Schritten)
169 |
170 |
171 |
--------------------------------------------------------------------------------
/res/values-de/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | UKW Radio
4 | UKW Transmitter
5 | Löschen
6 | UKW Radio: "%1$s" MHz
7 |
8 | Regionalband wählen
9 | Einstellungen
10 | Regionalband
11 |
12 | Audioausgang
13 | Audioausgang wählen
14 |
15 | Aufnahmedauer
16 | Aufnahmedauer wählen
17 |
18 | Ausweichfrequenz
19 | Automatische Auswahl aktiviert
20 | Automatische Auswahl deaktiviert
21 |
22 | Zurücksetzen
23 | Einstellungen zurücksetzen
24 | Zurück
25 |
26 | Zurücksetzen bestätigen
27 | Dies wird alle Einstellungen und Senderspeicher löschen!
28 |
29 | Zurück zur letzten Ansicht
30 | Einstellungen zurücksetzen
31 | Alle Einstellungen werden mit Standardwerten überschrieben
32 |
33 | OK
34 | Abbrechen
35 |
36 | Suche "%1$s"
37 |
38 | Operation fehlgeschlagen
39 | Die Operation ist fehlgeschlagen. Mögliche Gründe sind:
40 | Es ist kein Headset als Antenne angeschlossen,
41 | Bluethooth ist nicht aktiviert,
42 | ein Telefongespräch ist aktiv
43 | oder die Radioanwendung wurde geschlossen.
44 | Bitte überprüfen und die Radioanwendung erneut starten.
45 |
46 |
47 | UKW Radio ist nicht eingeschaltet
48 |
49 |
50 | Bitte ein kabelgebundenes Headset als Antenne anschließen.
51 | Bluetooth zur Verwendung des Radios aktivieren...
52 | Bitte Bluetooth aktivieren
53 |
54 | Über
55 | UKW Radioanwendung von MIUI - http://www.miui.com
56 |
57 | BT aus
58 | Nachfragen, ob Bluetooth ausgeschaltet werden soll, wenn Radio ausgeschaltet wird
59 | Bluetooth ebenfalls auschalten?
60 | Ja
61 | Nein
62 |
63 | Bluetooth bei Radio aus
64 | Immer ausschalten, wie ursprünglich, Nachfrage, etc.
65 | Verhalten für Bluetooth wählen
66 |
67 | Headset und Bluetooth
68 | Verhalten von Bluetooth nachfragen, wenn Headset entfernt wird
69 |
70 |
--------------------------------------------------------------------------------
/res/values-fr/arrays.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | - Ne rien faire (Reste actif)
6 | - Restaurer l\'état initial
7 | - Demander
8 | - Toujours désactiver
9 |
10 |
11 |
12 | - Stéréo
13 | - Mono
14 |
15 |
16 |
17 | - 5 minutes
18 | - 15 minutes
19 | - 30 minutes
20 | - Illimité
21 |
22 |
23 |
24 |
25 | - Toutes les stations
26 | - Culture
27 | - Magazine
28 | - Programmes pour enfants
29 | - Musique country
30 | - Documentaire
31 | - Dramatique
32 | - Chansons
33 | - Éducation
34 | - Alerte !
35 | - Test d\'alerte
36 | - Économie et finance
37 | - Musique folklorique
38 | - Information
39 | - Jazz
40 | - Classique léger
41 | - Loisirs
42 | - Info-Service
43 | - Chansons du pays
44 | - Autre musique
45 | - Musique rétro
46 | - Ligne ouverte et interactivité
47 | - Pop
48 | - Religion
49 | - Rock
50 | - Sciences
51 | - Musique classique
52 | - Société
53 | - Sport
54 | - Voyages
55 | - Divertissement
56 | - Météo
57 |
58 |
59 |
60 | - Renommer
61 | - Sélection auto
62 | - Supprimer
63 |
64 |
65 |
66 | - Amérique de Nord
67 | - Europe
68 | - Japon
69 | - Japon (Large)
70 | - Australie
71 | - Autriche
72 | - Belgique
73 | - Brésil
74 | - Chine
75 | - Rép. Tchèque
76 | - Danemark
77 | - Finlande
78 | - France
79 | - Allemagne
80 | - Grèce
81 | - Hong Kong
82 | - Inde
83 | - Irlande
84 | - Italie
85 | - Corée
86 | - Mexique
87 | - Pays-Bas
88 | - Nouvelle Zélande
89 | - Norvège
90 | - Pologne
91 | - Portugal
92 | - Russie
93 | - Singapour
94 | - Slovaquie
95 | - Espagne
96 | - Suisse
97 | - Suède
98 | - Taïwan
99 | - Turique
100 | - Royaume-Uni
101 | - États-Unis
102 |
103 |
104 |
105 | - Amérique du Nord (De 87.5MHz à 108.0MHz par pas de 200 Khz)
106 | - Europe (De 87.5MHz à 108.0MHz par pas de 100 Khz)
107 | - Japon (De 76.0MHz à 90.0MHz par pas de 100 Khz)
108 | - Japon (Large) (De 90.0MHz à 108.0MHz par pas de 100 Khz)
109 | - Australie (De 87.7MHz à 108.0MHz par pas de 100 Khz)
110 | - Autriche (De 87.5MHz à 108.0MHz par pas de 50 Khz)
111 | - Belgique (De 87.5MHz à 108.0MHz par pas de 100 Khz)
112 | - Brésil (De 87.8MHz à 108.0MHz par pas de 200 Khz Step)
113 | - Chine (De 87.0MHz à 108.0MHz par pas de 100 Khz)
114 | - Rép. Tchèque (De 87.5MHz à 108.0MHz par pas de 100 Khz)
115 | - Danemark (De 87.5MHz à 108.0MHz par pas de 100 Khz)
116 | - Finlande (De 87.5MHz à 108.0MHz par pas de 100 Khz)
117 | - France (De 87.5MHz à 108.0MHz par pas de 100 Khz)
118 | - Allemagne (De 87.5MHz à 108.0MHz par pas de 100 Khz)
119 | - Grèce (De 87.5MHz à 108.0MHz par pas de 100 Khz)
120 | - Hong Kong (De 87.5MHz à 108.0MHz par pas de 100 Khz)
121 | - par pas dede (De 91.0MHz à 106.4MHz par pas de 100 Khz)
122 | - Irlande (De 87.5MHz à 108.0MHz par pas de 100 Khz)
123 | - Italie (De 87.5MHz à 108.0MHz par pas de 100 Khz)
124 | - Corée (De 87.5MHz à 108.0MHz par pas de 200 Khz)
125 | - Mexique (De 88.1MHz à 107.9MHz par pas de 200 Khz)
126 | - Pays-Bas (De 87.5MHz à 108.0MHz par pas de 100 Khz)
127 | - Nouvelle Zélande (De 88.0MHz à 107.0MHz par pas de 100 Khz)
128 | - Norvège (De 87.5MHz à 108.0MHz par pas de 100 Khz)
129 | - Pologne (De 88.0MHz à 108.0MHz par pas de 100 Khz)
130 | - Portugal (De 87.5MHz à 108.0MHz par pas de 100 Khz)
131 | - Russie (De 87.5MHz à 108.0MHz par pas de 100 Khz)
132 | - Singapour (De 88.0MHz à 108.0MHz par pas de 100 Khz)
133 | - Slovaquie (De 87.5MHz à 108.0MHz par pas de 100 Khz)
134 | - Esapgne (De 87.5MHz à 108.0MHz par pas de 100 Khz)
135 | - Suisse (De 87.5MHz à 108.0MHz par pas de 100 Khz)
136 | - Suède (De 87.5MHz à 108.0MHz par pas de 100 Khz)
137 | - Taïwan (De 87.5MHz à 108.0MHz par pas de 100 Khz)
138 | - Turquie (De 87.5MHz à 108.0MHz par pas de 100 Khz)
139 | - Royaume-Uni (De 87.5MHz à 108.0MHz par pas de 100 Khz)
140 | - États-Unis (De 88.1MHz à 107.9MHz par pas de 200 Khz)
141 |
142 |
143 |
--------------------------------------------------------------------------------
/res/values-fr/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Radio FM
4 | Transmetteur FM
5 | Supprimer
6 | Radio FM : "%1$s" MHz
7 |
8 | Sélectionner la bande
9 | Paramètres
10 | Bande régionale
11 |
12 | Sortie audio
13 | Choisir la sortie audio
14 |
15 | Durée de l\'enregistrement
16 | Choisir la durée de l\'enregistrement
17 |
18 | Fréquence alternative
19 | Sélection automatique activée
20 | Sélection automatique désactivée
21 |
22 | Remise à zéro
23 | Rétablir les paramètres par défaut
24 | Retour
25 |
26 | Confirmer la suppression des paramètres
27 | Tous les paramètres seront effacés y compris les présélections
28 |
29 | Retour à la vue précédente
30 | Restaurer les paramètres
31 | Remplacer les paramètres par ceux d\'origine
32 |
33 | OK
34 | Annuler
35 |
36 | Recherche de "%1$s"
37 |
38 | L\'opération a échoué
39 | L\'opération a échoué. Les causes possibles sont:
40 | Vous n\'avez pas branché de casque filaire servant d\'antenne,
41 | vous n\'avez pas activé Bluetooth,
42 | un appel est en cours ou l\'application FM a été quittée.
43 | Veuillez vérifier cela puis redémarrez la radio FM.
44 |
45 |
46 | La radio FM n\'est pas active
47 |
48 |
49 | Veuillez brancher un casque filaire qui sera utilisé comme antenne FM
50 | Veuillez activer Bluetooth afin de pouvoir utiliser la puce FM
51 | Veuillez activer Bluetooth
52 |
53 | À propos
54 | Application Radio FM par MIUI - http://www.miui.com
55 |
56 | Désactiver BT à la sortie
57 | Demander la désactivation de Bluetooth lors de la fermeture de la radio
58 | Voulez-vous désactiver Bluetooth ?
59 | Oui
60 | Non
61 |
62 | Comportement de BT à la fermeture
63 | Toujours désactiver, restaurer l\'état initial, demander, etc.
64 | Choisir un comportement Bluetooth
65 | Débranchement du casque
66 | Appliquer l\'action de fermeture Bluetooth lorsque le casque est débranché
67 |
68 |
--------------------------------------------------------------------------------
/res/values-it/arrays.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | - Niente (Rimane attivo)
7 | - Ripristina stato BT iniziale
8 | - Prompt di richiesta
9 | - Disattiva sempre
10 |
11 |
12 |
13 | - Stereo
14 | - Mono
15 |
16 |
17 |
18 | - 5 minuti
19 | - 15 minuti
20 | - 30 minuti
21 | - Illimitata
22 |
23 |
24 |
25 | - Tutte le stazioni
26 | - Adult Hits
27 | - Classica
28 | - Classic Rock
29 | - College
30 | - Country
31 | - Emergency
32 | - Emergency Test
33 | - Lingua straniera
34 | - Informazioni
35 | - Jazz
36 | - News
37 | - Nostalgia
38 | - Hit del passato
39 | - Personality
40 | - Public
41 | - Musica religiosa
42 | - Dibattito religioso
43 | - Rhythm and Blues
44 | - Rock
45 | - Soft
46 | - Soft Rock
47 | - Soft Rhythm and Blues
48 | - Sport
49 | - Dibattito
50 | - Top 40
51 | - Meteo
52 |
53 |
54 |
55 | - Tutte le stazioni
56 | - Cultura
57 | - Attualità
58 | - Programmi per bambini
59 | - Country
60 | - Documentario
61 | - Drama
62 | - Easy Listening Music
63 | - Education
64 | - Emergency
65 | - Emergency Test
66 | - Finanza
67 | - Folk
68 | - Informazioni
69 | - Jazz
70 | - Classica leggera
71 | - Tempo libero
72 | - News
73 | - Musica nazionale
74 | - Altra musica
75 | - Hit del passato
76 | - Phone In
77 | - Pop
78 | - Religione
79 | - Rock
80 | - Scienza
81 | - Classica
82 | - Affari pubblici
83 | - Sport
84 | - Viaggio
85 | - Varie
86 | - Meteo
87 |
88 |
89 |
90 | - Rinomina
91 | - Selezione automatica
92 | - Elimina
93 |
94 |
95 |
96 | - Nord America
97 | - Europa
98 | - Giappone
99 | - Giappone (Esteso)
100 | - Australia
101 | - Austria
102 | - Belgio
103 | - Brasile
104 | - Cina
105 | - Repubblica Ceca
106 | - Danimarca
107 | - Finlandia
108 | - Francia
109 | - Germania
110 | - Grecia
111 | - Hong Kong
112 | - India
113 | - Irlanda
114 | - Italia
115 | - Corea
116 | - Messico
117 | - Paesi Bassi
118 | - Nuova Zelanda
119 | - Norvegia
120 | - Polonia
121 | - Portogallo
122 | - Russia
123 | - Singapore
124 | - Slovacchia
125 | - Spagna
126 | - Svizzera
127 | - Svezia
128 | - Taiwan
129 | - Turchia
130 | - Regno unito
131 | - Stati Uniti
132 |
133 |
134 |
135 | - Nord America (87.5MHz a 108.0MHz In Steps da 200 Khz)
136 | - Europa (87.5MHz a 108.0MHz In Steps da 100 Khz)
137 | - Giappone (76.0MHz a 90.0MHz In Steps da 100 Khz)
138 | - Giappone (Esteso) (90.0MHz a 108.0MHz In Steps da 100 Khz)
139 | - Australia (87.7MHz a 108.0MHz In Steps da 100 Khz)
140 | - Austria (87.5MHz a 108.0MHz In Steps da 50 Khz)
141 | - Belgio (87.5MHz a 108.0MHz In Steps da 100 Khz)
142 | - Brasile (87.8MHz a 108.0MHz In Steps da 200 Khz)
143 | - Cina (87.0MHz a 108.0MHz In Steps da 100 Khz)
144 | - Repubblica Ceca (87.5MHz a 108.0MHz In Steps da 100 Khz)
145 | - Danimarca (87.5MHz a 108.0MHz In Steps da 100 Khz)
146 | - Finlandia (87.5MHz a 108.0MHz In Steps da 100 Khz)
147 | - Francia (87.5MHz a 108.0MHz In Steps da 100 Khz)
148 | - Germania (87.5MHz a 108.0MHz In Steps da 100 Khz)
149 | - Grecia (87.5MHz a 108.0MHz In Steps da 100 Khz)
150 | - Hong Kong (87.5MHz a 108.0MHz In Steps da 100 Khz)
151 | - India (91.0MHz a 106.4MHz In Steps da 100 Khz)
152 | - Irlanda (87.5MHz a 108.0MHz In Steps da 100 Khz)
153 | - Italia (87.5MHz a 108.0MHz In Steps da 100 Khz)
154 | - Corea (87.5MHz a 108.0MHz In Steps da 200 Khz)
155 | - Messico (88.1MHz a 107.9MHz In Steps da 200 Khz)
156 | - Paesi Bassi (87.5MHz a 108.0MHz In Steps 100 Khz)
157 | - Nuova Zelanda (88.0MHz a 107.0MHz In Steps da 100 Khz)
158 | - Norvegia (87.5MHz a 108.0MHz In Steps da 100 Khz)
159 | - Polonia (88.0MHz a 108.0MHz In Steps da 100 Khz)
160 | - Portogallo (87.5MHz a 108.0MHz In Steps da 100 Khz)
161 | - Russia (87.5MHz a 108.0MHz In Steps da 100 Khz)
162 | - Singapore (88.0MHz a 108.0MHz In Steps da 100 Khz)
163 | - Slovacchia (87.5MHz a 108.0MHz In Steps da 100 Khz)
164 | - Spagna (87.5MHz a 108.0MHz In Steps da 100 Khz)
165 | - Svizzera (87.5MHz a 108.0MHz In Steps da 100 Khz)
166 | - Svezia (87.5MHz a 108.0MHz In Steps da 100 Khz)
167 | - Taiwan (87.5MHz a 108.0MHz In Steps da 100 Khz)
168 | - Turchia (87.5MHz a 108.0MHz In Steps da 100 Khz)
169 | - Regno Unito (87.5MHz a 108.0MHz In Steps da 100 Khz)
170 | - Stati Uniti (88.1MHz a 107.9MHz In Steps da 200 Khz)
171 |
172 |
173 |
--------------------------------------------------------------------------------
/res/values-it/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Radio FM
4 | Trasmettitore FM
5 | Elimina
6 | Radio FM "%1$s" MHz
7 |
8 | Seleziona banda
9 | Impostazioni
10 | Banda
11 |
12 | Modalità uscita audio
13 | Seleziona uscita audio
14 |
15 | Durata registrazione
16 | Seleziona durata registrazione
17 |
18 | Frequenza alternativa
19 | Selezione automatica attiva
20 | Selezione automatica non attiva
21 |
22 | Ripristina impostazioni iniziali
23 | Ripristina impostazioni iniziali
24 | Indietro
25 |
26 | Conferma reset impostazioni
27 | Questo eliminerà tutte le impostazioni inclusi i Preset
28 |
29 | Ritorna a schermata precedente
30 | Ripristina impostazioni iniziali
31 | Ripristina tutte le impostazioni
32 |
33 | Conferma
34 | Annulla
35 |
36 | Cerca"%1$s"
37 |
38 | Operazione fallita
39 | Operazione non riuscita. Le possibili cause sono: le cuffie non sono collegate, il Bluetooth non è abilitato, si sta effettuando una chiamata, La radio FM è stata chiusa. Riprovare dopo aver premuto il pulsante ON/OFF, quindi riavviare la radio FM.
40 |
41 | Frequenza
42 | Radio FM spenta
43 |
44 | Errore! Collegare il cavo delle cuffie come antenna FM
45 | Attendere prego, si sta abilitando il Bluetooth per attivare la radio FM...
46 | Errore! Si prega di attivare il Bluetooth per avviare la Radio FM
47 |
48 | Info
49 | Applicazione Radio FM creata da MIUI- http://www.miui.com
50 |
51 | Prompt disatt. BT
52 | Visualizza prompt di richiesta per disattivazione Bluetooth allo spegnimento della radio
53 | Vuoi disattivare il Bluetooth?
54 | Si
55 | No
56 |
57 | Gestione BT
58 | Disattiva sempre, ripristina stato iniziale, prompt, etc.
59 | Scegli comportamento Bluetooth
60 |
61 | Gestione cuffie e BT
62 | Invoca il comportamento del Bluetooth anche alla rimozione delle cuffie
63 |
64 |
--------------------------------------------------------------------------------
/res/values-ja/arrays.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | - 何もしない(有効のままにする)
7 | - 元の状態にもどす
8 | - ユーザに尋ねる
9 | - いつも無効にする
10 |
11 |
12 |
13 | - ステレオ
14 | - モノラル
15 |
16 |
17 |
18 | - 5分
19 | - 15分
20 | - 30分
21 | - 無制限
22 |
23 |
24 |
25 | - リネーム
26 | - 自動選択
27 | - 削除
28 |
29 |
30 |
31 | - 北米
32 | - ヨーロッパ
33 | - 日本
34 | - 日本(ワイド)
35 | - オーストラリア
36 | - オーストリア
37 | - ベルギー
38 | - ブラジル
39 | - 中国
40 | - チェコ
41 | - デンマーク
42 | - フィンランド
43 | - フランス
44 | - ドイツ
45 | - ギリシャ
46 | - 香港
47 | - インド
48 | - アイルランド
49 | - イタリア
50 | - 韓国
51 | - メキシコ
52 | - オランダ
53 | - ニュージーランド
54 | - ノルウェー
55 | - ポーランド
56 | - ポルトガル
57 | - ロシア
58 | - シンガポール
59 | - スロバキア
60 | - スペイン
61 | - スイス
62 | - スウェーデン
63 | - 台湾
64 | - トルコ
65 | - イギリス
66 | - 合衆国
67 |
68 |
69 |
70 | - 北米 (87.5MHz〜108.0MHz, 200Khz間隔)
71 | - ヨーロッパ (87.5MHz〜108.0MHz, 100Khz間隔)
72 | - 日本 (76.0MHz〜90.0MHz, 100Khz間隔)
73 | - 日本(ワイド) (90.0MHz〜108.0MHz, 100Khz間隔)
74 | - オーストラリア (87.7MHz〜108.0MHz, 100Khz間隔)
75 | - オーストリア (87.5MHz〜108.0MHz, 50Khz間隔)
76 | - ベルギー (87.5MHz〜108.0MHz, 100Khz間隔)
77 | - ブラジル (87.8MHz〜108.0MHz, 200Khz Step)
78 | - 中国 (87.0MHz〜108.0MHz, 100Khz間隔)
79 | - チェコ (87.5MHz〜108.0MHz, 100Khz間隔)
80 | - デンマーク (87.5MHz〜108.0MHz, 100Khz間隔)
81 | - フィンランド (87.5MHz〜108.0MHz, 100Khz間隔)
82 | - フランス (87.5MHz〜108.0MHz, 100Khz間隔)
83 | - ドイツ (87.5MHz〜108.0MHz, 100Khz間隔)
84 | - ギリシャ (87.5MHz〜108.0MHz, 100Khz間隔)
85 | - 香港 (87.5MHz〜108.0MHz, 100Khz間隔)
86 | - インド (91.0MHz〜106.4MHz, 100Khz間隔)
87 | - アイルランド (87.5MHz〜108.0MHz, 100Khz間隔)
88 | - イタリア (87.5MHz〜108.0MHz, 100Khz間隔)
89 | - 韓国 (87.5MHz〜108.0MHz, 200Khz間隔)
90 | - メキシコ (88.1MHz〜107.9MHz, 200Khz間隔)
91 | - オランダ (87.5MHz〜108.0MHz, 100Khz間隔)
92 | - ニュージーランド (88.0MHz〜107.0MHz, 100Khz間隔)
93 | - ノルウェー (87.5MHz〜108.0MHz, 100Khz間隔)
94 | - ポーランド (88.0MHz〜108.0MHz, 100Khz間隔)
95 | - ポルトガル (87.5MHz〜108.0MHz, 100Khz間隔)
96 | - ロシア (87.5MHz〜108.0MHz, 100Khz間隔)
97 | - シンガポール (88.0MHz〜108.0MHz, 100Khz間隔)
98 | - スロバキア (87.5MHz〜108.0MHz, 100Khz間隔)
99 | - スペイン (87.5MHz〜108.0MHz, 100Khz間隔)
100 | - スイス (87.5MHz〜108.0MHz, 100Khz間隔)
101 | - スウェーデン (87.5MHz〜108.0MHz, 100Khz間隔)
102 | - 台湾 (87.5MHz〜108.0MHz, 100Khz間隔)
103 | - トルコ (87.5MHz〜108.0MHz, 100Khz間隔)
104 | - イギリス (87.5MHz〜108.0MHz, 100Khz間隔)
105 | - 合衆国 (88.1MHz〜107.9MHz, 200Khz間隔)
106 |
107 |
108 |
109 |
110 |
111 |
--------------------------------------------------------------------------------
/res/values-ja/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | FMラジオ
4 | FMトランスミッタ
5 | 削除
6 | FMラジオ"%1$s" MHz
7 |
8 | バンド地域を選択
9 | 設定
10 | バンド地域
11 |
12 | オーディオ出力モード
13 | オーディオ出力を選択
14 |
15 | 録音時間
16 | 録音時間を選択
17 |
18 | 代替の周波数
19 | 自動選択有効
20 | 自動選択無効
21 |
22 | 設定をリセット
23 | 設定をリセットします
24 | 戻る
25 |
26 | リセットの確認
27 | プリセットを含め、全ての設定が削除されます。
28 |
29 | 前のビューに戻る
30 | 初期設定に戻す
31 | 全ての設定をリセットする
32 |
33 | OK
34 | キャンセル
35 |
36 | 検索 "%1$s"
37 |
38 | FM操作失敗
39 | 操作は失敗しました。考えられる原因: アンテナとして利用される有線のヘッドセットが接続されていない、Bluetoothを有効にしていない、電話で通話中、あるいはFMが終了しているなどです。確認して再度お試しください。
40 |
41 |
42 |
43 | %2$d:%5$02d
44 |
45 |
46 | FMラジオはオンになっていません
47 |
48 |
49 | 有線のヘッドセットを接続してください。FMアンテナとして利用されます。
50 | FMラジオサポートのためにBuetoothを有効にしています...
51 | Bluetoothを有効にしてください
52 |
53 | 情報
54 | MIUIによるFMラジオアプリケーション - http://www.miui.com
55 |
56 | ラジオオフでBTを無効にするか尋ねる
57 | ラジオのスイッチをオフにしたときに、Bluetoothを無効にするか尋ねます
58 | Bluetoothを無効にしますか?
59 | はい
60 | いいえ
61 |
62 | ラジオオフ時のBluetooth動作
63 | いつも無効にする, 元の状態に戻す, ユーザに尋ねるなど
64 | Bluetoothの動作を選択
65 | ヘッドセットとBluetooth
66 | ヘッドセット接続を解除したときBluetoothの動作も連動させる
67 |
68 |
--------------------------------------------------------------------------------
/res/values-ru/arrays.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | - Ничего не делать (остается включенным)
7 | - Восстанавливать исходное состояние BT
8 | - Запрос действия у пользователя
9 | - Всегда выключать
10 |
11 |
12 |
13 | - Стерео
14 | - Моно
15 |
16 |
17 |
18 | - 5 минут
19 | - 15 минут
20 | - 30 минут
21 | - Без ограничений
22 |
23 |
24 |
25 |
26 | - Все станции
27 | - Старые хиты
28 | - Классическая
29 | - Классический рок
30 | - Колледж
31 | - Кантри
32 | - Экстренный
33 | - Экстренный. Тест
34 | - Иностранный язык
35 | - Информация
36 | - Джаз
37 | - Новости
38 | - Ностальгия
39 | - Прошлое
40 | - Личность
41 | - Общественные
42 | - Религиозная музыка
43 | - Религиозные разговоры
44 | - R\'n\'B
45 | - Рок
46 | - Лёгкая
47 | - Лёгкий рок
48 | - Лёгкий R\'n\'B
49 | - Спорт
50 | - Разговоры
51 | - Топ 40
52 | - Погода
53 |
54 |
55 |
56 | - Все станции
57 | - Культура
58 | - Текущие разговоры
59 | - Детские программы
60 | - Кантри
61 | - Документалистика
62 | - Драма
63 | - Легкая музыка
64 | - Образование
65 | - Экстренный
66 | - Экстренный. Тест
67 | - Финансы
68 | - Народная музыка
69 | - Информация
70 | - Джаз
71 | - Легкая классическая
72 | - Досуг
73 | - Новости
74 | - Национальная музыка
75 | - Другая музыка
76 | - Старая музыка
77 | - Phone In
78 | - Поп музыка
79 | - Религиозная
80 | - Рок музыка
81 | - Наука
82 | - Серьёзная классика
83 | - Социальные вопросы
84 | - Спорт
85 | - Путешествия
86 | - Разнообразная
87 | - Погода
88 |
89 |
90 |
91 | - Переименовать
92 | - Автовыбор
93 | - Удалить
94 |
95 |
96 |
97 |
98 | - Австралия
99 | - Австрия
100 | - Бельгия
101 | - Бразилия
102 | - Великобритания
103 | - Германия
104 | - Гон Конг
105 | - Греция
106 | - Дания
107 | - Европа
108 | - Индия
109 | - Ирландия
110 | - Испания
111 | - Италия
112 | - Китай
113 | - Корея
114 | - Мексика
115 | - Нидерланды
116 | - Новая Зеландия
117 | - Норвегия
118 | - Польша
119 | - Португалия
120 | - Россия
121 | - Северная Америка
122 | - Сингапур
123 | - Словакия
124 | - США
125 | - Тайвань
126 | - Турция
127 | - Финляндия
128 | - Франция
129 | - Чехия
130 | - Швейцария
131 | - Швеция
132 | - Япония (широкий)
133 | - Япония
134 |
135 |
136 |
137 | - Австралия (87.7MHz до 108.0MHz при шаге 100 Khz)
138 | - Австрия (87.5MHz до 108.0MHz при шаге 50 Khz)
139 | - Бельгия (87.5MHz до 108.0MHz при шаге 100 Khz)
140 | - Бразилия (87.8MHz до 108.0MHz при шаге 200 Khz)
141 | - Великобритания (87.5MHz до 108.0MHz при шаге 100 Khz)
142 | - Германия (87.5MHz до 108.0MHz при шаге 100 Khz)
143 | - Гон Конг (87.5MHz до 108.0MHz при шаге 100 Khz)
144 | - Греция (87.5MHz до 108.0MHz при шаге 100 Khz)
145 | - Дания (87.5MHz до 108.0MHz при шаге 100 Khz)
146 | - Европа (87.5MHz до 108.0MHz при шаге 100 Khz)
147 | - Индия (91.0MHz до 106.4MHz при шаге 100 Khz)
148 | - Ирландия (87.5MHz до 108.0MHz при шаге 100 Khz)
149 | - Испания (87.5MHz до 108.0MHz при шаге 100 Khz)
150 | - Италия (87.5MHz до 108.0MHz при шаге 100 Khz)
151 | - Китай (87.0MHz до 108.0MHz при шаге 100 Khz)
152 | - Корея (87.5MHz до 108.0MHz при шаге 200 Khz)
153 | - Мексика (88.1MHz до 107.9MHz при шаге 200 Khz)
154 | - Нидерланды (87.5MHz до 108.0MHz при шаге 100 Khz)
155 | - Новая Зеландия (88.0MHz до 107.0MHz при шаге 100 Khz)
156 | - Норвегия (87.5MHz до 108.0MHz при шаге 100 Khz)
157 | - Польша (88.0MHz до 108.0MHz при шаге 100 Khz)
158 | - Португалия (87.5MHz до 108.0MHz при шаге 100 Khz)
159 | - Россия (87.5MHz до 108.0MHz при шаге 100 Khz)
160 | - Северная Америка (87.5MHz до 108.0MHz при шаге 200 Khz)
161 | - Сингапур (88.0MHz до 108.0MHz при шаге 100 Khz)
162 | - Словакия (87.5MHz до 108.0MHz при шаге 100 Khz)
163 | - США (88.1MHz до 107.9MHz при шаге 200 Khz)
164 | - Тайвань (87.5MHz до 108.0MHz при шаге 100 Khz)
165 | - Турция (87.5MHz до 108.0MHz при шаге 100 Khz)
166 | - Финляндия (87.5MHz до 108.0MHz при шаге 100 Khz)
167 | - Франция (87.5MHz до 108.0MHz при шаге 100 Khz)
168 | - Чехия (87.5MHz до 108.0MHz при шаге 100 Khz)
169 | - Швейцария (87.5MHz до 108.0MHz при шаге 100 Khz)
170 | - Швеция (87.5MHz до 108.0MHz при шаге 100 Khz)
171 | - Япония (76.0MHz до 90.0MHz при шаге 100 Khz)
172 | - Япония (широкий) (90.0MHz до 108.0MHz при шаге 100 Khz)
173 |
174 |
175 |
176 |
--------------------------------------------------------------------------------
/res/values-ru/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | FM радио
4 | FM передатчик
5 | Удалить
6 | FM радио: "%1$s" MHz
7 |
8 | Выбор региона
9 | Настройки
10 | Регионы
11 |
12 | Режим аудиовыхода
13 | Выбор аудиовыхода
14 |
15 | Продолжительность записи
16 | Выбор продолжительность записи
17 |
18 | Дополнительная частота
19 | Автоматический выбор включен
20 | Автоматический выбор выключен
21 |
22 | Сброс настроек
23 | Сброс настроек
24 | Назад
25 |
26 | Подтверждение сброса
27 | Удаляться все настройки, включая установки!
28 |
29 | Возврат к предыдущему виду
30 | Сброс настроек
31 | Сброс всех настроек до умолчания
32 |
33 | OK
34 | Отмена
35 |
36 | Поиск"%1$s"
37 |
38 | Сбой FM операции
39 | Сбой операции. Возможные причины: не подключена проводная гарнитура как антена, не включен Bluetooth, телефон в режиме разговора или FM радио закрыто. Пожалуйста, проверьте и попробуйте еще раз.
40 |
41 |
42 |
43 | %2$d:%5$02d
44 |
45 |
46 | FM радио не включено
47 |
48 |
49 | Пожалуйста, подключить проводную гарнитуру, которая будет использоваться в качестве FM антенны.
50 | Включение Bluetooth для поддержки FM радио...
51 | Пожалуйста, включите Bluetooth
52 |
53 | О программе
54 | Приложение FM радио от MIUI - http://www.miui.com
55 |
56 | Запрос на выключение BT, когда выключается радио
57 | Запрос у пользователя выключение Bluetooth, когда FM радио выключается
58 | Вы желаете выключить Bluetooth?
59 | Да
60 | Нет
61 |
62 | Режим Bluetooth при выключении радио
63 | Всегда выключать, восстанавливать начальное состояние, подсказки и т.д.
64 | Выбор режима Bluetooth
65 |
66 | Гарнитура и Bluetooth режим
67 | Вызывать режим Bluetooth, когда гарнитура отключена
68 |
69 |
70 |
--------------------------------------------------------------------------------
/res/values-zh-rCN/arrays.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | - 立体声
7 | - 单声道
8 |
9 |
10 |
11 | - 5分钟
12 | - 15分钟
13 | - 30分钟
14 | - 直到停止
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/res/values-zh-rCN/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | FM收音机
4 | FM发射
5 | 删除
6 | FM调频"%1$s"兆赫
7 |
8 | Select Regional Band
9 | 设置
10 | Regional Band
11 |
12 | Audio Output Mode
13 | Select Audio Output
14 |
15 | Record Duration
16 | Select Record Duration
17 |
18 | Alternate Frequency
19 | Auto Select Enabled
20 | Auto Select Disabled
21 |
22 | 恢复默认设置
23 | 恢复默认设置
24 | Back
25 |
26 | Confirm Reset Settings
27 | This will delete all settings including Presets
28 |
29 | Return to previous view
30 | Revert to Factory Defaults
31 | Reset all settings
32 |
33 | 确认
34 | 取消
35 |
36 | 搜索"%1$s"
37 |
38 | FM操作失败
39 | 操作失败。可能原因有:没有插上有线耳机作为天线,或者没有打开蓝牙芯片,或者正处于通话中,或FM已关闭。请处理以上情况后再尝试弹起ON/OFF按钮,再按下ON/OFF按钮重启FM。
40 |
41 |
42 |
43 |
44 | %2$d:%5$02d
45 |
46 |
47 | FM收音机未开启
48 |
49 |
50 | 错误!请插上有线耳机作为FM天线
51 | 请稍候,打开蓝牙启动FM芯片...
52 | 错误!请打开蓝牙以启动FM芯片
53 |
54 |
55 |
--------------------------------------------------------------------------------
/res/values-zh-rTW/arrays.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | - 立体声
7 | - 单声道
8 |
9 |
10 |
11 | - 5分钟
12 | - 15分钟
13 | - 30分钟
14 | - 直到停止
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/res/values-zh-rTW/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | FM收音机
4 | FM发射
5 | 删除
6 | FM调频"%1$s"兆赫
7 |
8 | Select Regional Band
9 | 设置
10 | Regional Band
11 |
12 | Audio Output Mode
13 | Select Audio Output
14 |
15 | Record Duration
16 | Select Record Duration
17 |
18 | Alternate Frequency
19 | Auto Select Enabled
20 | Auto Select Disabled
21 |
22 | 恢复默认设置
23 | 恢复默认设置
24 | Back
25 |
26 | Confirm Reset Settings
27 | This will delete all settings including Presets
28 |
29 | Return to previous view
30 | Revert to Factory Defaults
31 | Reset all settings
32 |
33 | 确认
34 | 取消
35 |
36 | 搜索"%1$s"
37 |
38 | FM操作失败
39 | 操作失败。可能原因有:没有插上有线耳机作为天线,或者没有打开蓝牙芯片,或者正处于通话中,或FM已关闭。请处理以上情况后再尝试弹起ON/OFF按钮,再按下ON/OFF按钮重启FM。
40 |
41 |
42 |
43 |
44 | %2$d:%5$02d
45 |
46 |
47 | FM收音机未开启
48 |
49 |
50 | 错误!请插上有线耳机作为FM天线
51 | 请稍候,打开蓝牙启动FM芯片...
52 | 错误!请打开蓝牙以启动FM芯片
53 |
54 |
55 |
--------------------------------------------------------------------------------
/res/values/arrays.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | - Do nothing (Remains enabled)
7 | - Restore initial BT state
8 | - Prompt for user action
9 | - Always disable
10 |
11 |
12 |
13 | - 0
14 | - 1
15 | - 2
16 | - 3
17 |
18 |
19 |
20 | - Stereo
21 | - Mono
22 |
23 |
24 |
25 | - 0
26 | - 1
27 |
28 |
29 |
30 | - 5 minutes
31 | - 15 minutes
32 | - 30 minutes
33 | - Unlimited
34 |
35 |
36 |
37 |
38 | - 5
39 | - 15
40 | - 30
41 | - -1
42 |
43 |
44 |
45 | - All Stations
46 | - Adult Hits
47 | - Classical
48 | - Classic Rock
49 | - College
50 | - Country
51 | - Emergency
52 | - Emergency Test
53 | - Foreign Language
54 | - Information
55 | - Jazz
56 | - News
57 | - Nostalgia
58 | - Oldies
59 | - Personality
60 | - Public
61 | - Religious Music
62 | - Religious Talk
63 | - Rhythm and Blues
64 | - Rock
65 | - Soft
66 | - Soft Rock
67 | - Soft Rhythm and Blues
68 | - Sports
69 | - Talk
70 | - Top 40
71 | - Weather
72 |
73 |
74 |
75 | - 0
76 | - 7
77 | - 15
78 | - 6
79 | - 23
80 | - 10
81 | - 31
82 | - 30
83 | - 18
84 | - 2
85 | - 14
86 | - 1
87 | - 13
88 | - 11
89 | - 21
90 | - 22
91 | - 19
92 | - 20
93 | - 16
94 | - 5
95 | - 12
96 | - 8
97 | - 17
98 | - 3
99 | - 4
100 | - 9
101 | - 29
102 |
103 |
104 |
105 |
106 | - All Stations
107 | - Culture
108 | - Current Affairs
109 | - Children programs
110 | - Country Music
111 | - Documentary
112 | - Drama
113 | - Easy Listening Music
114 | - Education
115 | - Emergency
116 | - Emergency Test
117 | - Finance
118 | - Folk Music
119 | - Information
120 | - Jazz Music
121 | - Light classical
122 | - Leisure
123 | - News
124 | - National Music
125 | - Other Music
126 | - Oldies Music
127 | - Phone In
128 | - Pop Music
129 | - Religion
130 | - Rock Music
131 | - Science
132 | - Serious classical
133 | - Social Affairs
134 | - Sport
135 | - Travel
136 | - Varied
137 | - Weather
138 |
139 |
140 |
141 | - 0
142 | - 7
143 | - 2
144 | - 18
145 | - 25
146 | - 29
147 | - 6
148 | - 12
149 | - 5
150 | - 31
151 | - 30
152 | - 17
153 | - 28
154 | - 3
155 | - 24
156 | - 13
157 | - 23
158 | - 1
159 | - 26
160 | - 15
161 | - 27
162 | - 21
163 | - 10
164 | - 20
165 | - 11
166 | - 8
167 | - 14
168 | - 19
169 | - 4
170 | - 22
171 | - 9
172 | - 16
173 |
174 |
175 |
176 | - Rename
177 | - Auto-Select
178 | - Delete
179 |
180 |
181 |
182 |
183 | - North America
184 | - Europe
185 | - Japan
186 | - Japan (Wide)
187 | - Australia
188 | - Austria
189 | - Belgium
190 | - Brazil
191 | - China
192 | - Czech
193 | - Denmark
194 | - Finland
195 | - France
196 | - Germany
197 | - Greece
198 | - Hong Kong
199 | - India
200 | - Ireland
201 | - Italy
202 | - Korea
203 | - Mexico
204 | - Netherlands
205 | - New Zealand
206 | - Norway
207 | - Poland
208 | - Portugal
209 | - Russia
210 | - Singapore
211 | - Slovakia
212 | - Spain
213 | - Switzerland
214 | - Sweden
215 | - Taiwan
216 | - Turkey
217 | - United Kingdom
218 | - United States
219 |
220 |
221 |
222 | - 0
223 | - 1
224 | - 2
225 | - 3
226 | - 4
227 | - 5
228 | - 6
229 | - 7
230 | - 8
231 | - 9
232 | - 10
233 | - 11
234 | - 12
235 | - 13
236 | - 14
237 | - 15
238 | - 16
239 | - 17
240 | - 18
241 | - 19
242 | - 20
243 | - 21
244 | - 22
245 | - 23
246 | - 24
247 | - 25
248 | - 26
249 | - 27
250 | - 28
251 | - 29
252 | - 30
253 | - 31
254 | - 32
255 | - 33
256 | - 34
257 | - 35
258 |
259 |
260 |
261 | - North America (87.5MHz To 108.0MHz In 200 Khz Steps)
262 | - Europe (87.5MHz To 108.0MHz In 100 Khz Steps)
263 | - Japan (76.0MHz To 90.0MHz In 100 Khz Steps)
264 | - Japan (Wide) (90.0MHz To 108.0MHz In 100 Khz Steps)
265 | - Australia (87.7MHz To 108.0MHz In 100 Khz Steps)
266 | - Austria (87.5MHz To 108.0MHz In 50 Khz Steps)
267 | - Belgium (87.5MHz To 108.0MHz In 100 Khz Steps)
268 | - Brazil (87.8MHz To 108.0MHz In 200 Khz Step)
269 | - China (87.0MHz To 108.0MHz In 100 Khz Steps)
270 | - Czech (87.5MHz To 108.0MHz In 100 Khz Steps)
271 | - Denmark (87.5MHz To 108.0MHz In 100 Khz Steps)
272 | - Finland (87.5MHz To 108.0MHz In 100 Khz Steps)
273 | - France (87.5MHz To 108.0MHz In 100 Khz Steps)
274 | - Germany (87.5MHz To 108.0MHz In 100 Khz Steps)
275 | - Greece (87.5MHz To 108.0MHz In 100 Khz Steps)
276 | - Hong Kong (87.5MHz To 108.0MHz In 100 Khz Steps)
277 | - India (91.0MHz To 106.4MHz In 100 Khz Steps)
278 | - Ireland (87.5MHz To 108.0MHz In 100 Khz Steps)
279 | - Italy (87.5MHz To 108.0MHz In 100 Khz Steps)
280 | - Korea (87.5MHz To 108.0MHz In 200 Khz Steps)
281 | - Mexico (88.1MHz To 107.9MHz In 200 Khz Steps)
282 | - Netherlands (87.5MHz To 108.0MHz In 100 Khz Steps)
283 | - New Zealand (88.0MHz To 107.0MHz In 100 Khz Steps)
284 | - Norway (87.5MHz To 108.0MHz In 100 Khz Steps)
285 | - Poland (88.0MHz To 108.0MHz In 100 Khz Steps)
286 | - Portugal (87.5MHz To 108.0MHz In 100 Khz Steps)
287 | - Russia (87.5MHz To 108.0MHz In 100 Khz Steps)
288 | - Singapore (88.0MHz To 108.0MHz In 100 Khz Steps)
289 | - Slovakia (87.5MHz To 108.0MHz In 100 Khz Steps)
290 | - Spain (87.5MHz To 108.0MHz In 100 Khz Steps)
291 | - Switzerland (87.5MHz To 108.0MHz In 100 Khz Steps)
292 | - Sweden (87.5MHz To 108.0MHz In 100 Khz Steps)
293 | - Taiwan (87.5MHz To 108.0MHz In 100 Khz Steps)
294 | - Turkey (87.5MHz To 108.0MHz In 100 Khz Steps)
295 | - United Kingdom (87.5MHz To 108.0MHz In 100 Khz Steps)
296 | - United States (88.1MHz To 107.9MHz In 200 Khz Steps)
297 |
298 |
299 |
300 |
--------------------------------------------------------------------------------
/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | FM Radio
4 | FM Transmitter
5 | Delete
6 | FM Radio: "%1$s" MHz
7 |
8 | Select regional band
9 | Settings
10 | Regional band
11 |
12 | Audio output mode
13 | Select audio output
14 |
15 | Record duration
16 | Select record duration
17 |
18 | Alternate frequency
19 | Auto select enabled
20 | Auto select disabled
21 |
22 | Reset settings
23 | Reset settings
24 | Back
25 |
26 | Confirm Resets
27 | This will delete all settings including presets!
28 |
29 | Return to previous view
30 | Reset settings
31 | Reset all settings to defaults
32 |
33 | OK
34 | Cancel
35 |
36 | Search"%1$s"
37 |
38 | FM operation failed
39 | The operation failed. Possible causes are: you did not plug in the wired headset as an antenna, did not enable Bluetooth, the phone is in a call, or FM has been closed. Please check and try again.
40 |
41 |
42 |
43 | %2$d:%5$02d
44 |
45 |
46 | FM radio is not turned on
47 |
48 |
49 | Please plug in a wired headset which will be used as an FM antenna.
50 | Enabling Bluetooth for FM radio support..
51 | Please enable Bluetooth
52 |
53 | About
54 | FM Radio application by MIUI - http://www.miui.com
55 |
56 | Prompt to disable BT on radio off
57 | Prompt user to disable Bluetooth when radio is switched off
58 | Do you want to disable Bluetooth?
59 | Yes
60 | No
61 |
62 | Bluetooth behaviour on radio off
63 | Always disable, restore initial state, prompt, etc.
64 | Choose a Bluetooth behaviour
65 |
66 | Headset and Bluetooth behaviour
67 | Invoke Bluetooth behaviour when headset is removed
68 |
69 |
70 |
--------------------------------------------------------------------------------
/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
13 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/src/com/android/fm/radio/FMMediaButtonIntentReceiver.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (C) 2007 The Android Open Source Project
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.android.fm.radio;
18 |
19 | import android.content.BroadcastReceiver;
20 | import android.content.Context;
21 | import android.content.Intent;
22 | import android.view.KeyEvent;
23 | import android.util.Log;
24 |
25 | /**
26 | *
27 | */
28 | public class FMMediaButtonIntentReceiver extends BroadcastReceiver {
29 |
30 | private final static String LOGTAG = "FMMediaButtonIntentReceiver";
31 |
32 | @Override
33 | public void onReceive(Context context, Intent intent) {
34 | if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) {
35 | Log.d(LOGTAG,"ACTION_MEDIA_BUTTON Intent received");
36 |
37 | KeyEvent event = (KeyEvent)
38 | intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
39 |
40 | if (event == null) {
41 | return;
42 | }
43 |
44 | int keycode = event.getKeyCode();
45 | int action = event.getAction();
46 |
47 | if (action == KeyEvent.ACTION_DOWN) {
48 | String command = null;
49 |
50 | switch (keycode) {
51 | case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
52 | command = FMRadioService.CMDTOGGLEPAUSE;
53 | break;
54 | case KeyEvent.KEYCODE_MEDIA_NEXT:
55 | command = FMRadioService.CMDNEXT;
56 | break;
57 | case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
58 | command = FMRadioService.CMDPREVIOUS;
59 | break;
60 | }
61 | Log.d(LOGTAG, "KeyEvent received: "+command);
62 |
63 | if (command != null) {
64 | Log.d(LOGTAG, "Preparing to broadcast Intent to FMRadioService");
65 |
66 | // The service may or may not be running, but we need to send it
67 | // a command.
68 | Intent i = new Intent(context, FMRadioService.class);
69 | i.setAction(FMRadioService.SERVICECMD);
70 | i.putExtra(FMRadioService.CMDNAME, command);
71 |
72 | Log.d(LOGTAG, "Broadcasting Intent -> "+i.toString());
73 | context.startService(i);
74 | }
75 | }
76 |
77 | if (isOrderedBroadcast()) {
78 | abortBroadcast();
79 | }
80 | }
81 | }
82 | }
83 |
--------------------------------------------------------------------------------
/src/com/android/fm/radio/FreqIndicator.java:
--------------------------------------------------------------------------------
1 | package com.android.fm.radio;
2 |
3 | import android.content.Context;
4 | import android.util.AttributeSet;
5 | import android.widget.SeekBar;
6 |
7 | public class FreqIndicator extends SeekBar {
8 |
9 | private int lowerLimit = 0;
10 |
11 | public FreqIndicator(Context context) {
12 | super(context);
13 | }
14 |
15 | public FreqIndicator(Context context, AttributeSet attrs) {
16 | super(context, attrs);
17 | }
18 |
19 | /**
20 | *
21 | * @param frequency something like 87500(87.5MHz), 103900(103.9MHz)
22 | */
23 | public void setFrequency(int frequency) {
24 | setProgress(frequency - lowerLimit);
25 | }
26 |
27 | /**
28 | *
29 | * @param frequency something like 87500(87.5MHz), 103900(103.9MHz)
30 | */
31 | public int getFrequency() {
32 | return getProgress() + lowerLimit;
33 | }
34 |
35 | /**
36 | * @param minFrequency something like 87500(87.5MHz)
37 | */
38 | public void setMinFrequency(int minFrequency) {
39 | lowerLimit = minFrequency;
40 | }
41 |
42 | /**
43 | * @return something like 87500(87.5MHz)
44 | */
45 | public int getMinFrequency() {
46 | return lowerLimit;
47 | }
48 |
49 | }
50 |
--------------------------------------------------------------------------------
/src/com/android/fm/radio/IFMRadioService.aidl:
--------------------------------------------------------------------------------
1 | package com.android.fm.radio;
2 |
3 | import com.android.fm.radio.IFMRadioServiceCallbacks;
4 |
5 | interface IFMRadioService
6 | {
7 | boolean fmOn();
8 | boolean fmOff();
9 | boolean isFmOn();
10 | boolean fmReconfigure();
11 | void registerCallbacks(IFMRadioServiceCallbacks cb);
12 | void unregisterCallbacks();
13 | boolean mute();
14 | boolean routeAudio(int device);
15 | boolean unMute();
16 | boolean isMuted();
17 | boolean tune(int frequency);
18 | boolean seek(boolean up);
19 | boolean scan(int pty);
20 | boolean seekPI(int piCode);
21 | boolean searchStrongStationList(int numStations);
22 | int[] getSearchList();
23 | boolean cancelSearch();
24 | String getProgramService();
25 | String getRadioText();
26 | int getProgramType();
27 | int getProgramID();
28 | boolean setLowPowerMode(boolean bLowPower);
29 | int getPowerMode();
30 | boolean enableAutoAF(boolean bEnable);
31 | boolean enableStereo(boolean bEnable);
32 | boolean isAntennaAvailable();
33 | boolean isWiredHeadsetAvailable();
34 | }
35 |
36 |
--------------------------------------------------------------------------------
/src/com/android/fm/radio/IFMRadioServiceCallbacks.aidl:
--------------------------------------------------------------------------------
1 | package com.android.fm.radio;
2 |
3 | interface IFMRadioServiceCallbacks
4 | {
5 | void onEnabled();
6 | void onDisabled();
7 |
8 | void onTuneStatusChanged();
9 | void onProgramServiceChanged();
10 | void onRadioTextChanged();
11 | void onAlternateFrequencyChanged();
12 | void onSignalStrengthChanged();
13 | void onSearchComplete();
14 | void onSearchListComplete();
15 | void onMute(boolean bMuted);
16 | void onAudioUpdate(boolean bStereo);
17 | void onStationRDSSupported(boolean bRDSSupported);
18 | }
19 |
--------------------------------------------------------------------------------
/src/com/android/fm/radio/PresetList.java:
--------------------------------------------------------------------------------
1 |
2 | package com.android.fm.radio;
3 |
4 | import java.util.ArrayList;
5 | import java.util.List;
6 |
7 | public class PresetList {
8 | private List mPresetList = new ArrayList();
9 |
10 | private int mCurrentStation = 0;
11 |
12 | private String mListName = "";
13 |
14 | public PresetList(String name) {
15 | mListName = name;
16 | }
17 |
18 | public String getName() {
19 | return mListName;
20 | }
21 |
22 | public String toString() {
23 | return mListName;
24 | }
25 |
26 | public synchronized int getStationCount() {
27 | return mPresetList.size();
28 | }
29 |
30 | public synchronized String getStationName(int stationNum) {
31 | String name = "";
32 | if (mPresetList.size() > stationNum) {
33 | name = mPresetList.get(stationNum).getName();
34 | }
35 | return name;
36 | }
37 |
38 | public synchronized int getStationFrequency(int stationNum) {
39 | int frequency = 102100;
40 | if (mPresetList.size() > stationNum) {
41 | frequency = mPresetList.get(stationNum).getFrequency();
42 | }
43 | return frequency;
44 | }
45 |
46 | public void setName(String name) {
47 | mListName = name;
48 | }
49 |
50 | public synchronized void setStationFrequency(int stationNum, int frequency) {
51 | PresetStation mStation = mPresetList.get(stationNum);
52 | mStation.setFrequency(frequency);
53 | }
54 |
55 | public synchronized void setStationName(int stationNum, String name) {
56 | PresetStation mStation = mPresetList.get(stationNum);
57 | mStation.setName(name);
58 | }
59 |
60 | public synchronized PresetStation getStationFromIndex(int index) {
61 | int totalPresets = mPresetList.size();
62 | PresetStation station = null;
63 | if (index < totalPresets) {
64 | station = mPresetList.get(index);
65 | }
66 | return station;
67 | }
68 |
69 | public synchronized PresetStation getStationFromFrequency(int frequency) {
70 | int totalPresets = mPresetList.size();
71 | for (int presetNum = 0; presetNum < totalPresets; presetNum++) {
72 | PresetStation station = mPresetList.get(presetNum);
73 | if (station != null) {
74 | if (frequency == station.getFrequency()) {
75 | return station;
76 | }
77 | }
78 | }
79 | return null;
80 | }
81 |
82 | public synchronized PresetStation addStation(String name, int freq) {
83 | PresetStation addStation = new PresetStation(name, freq);
84 | if (addStation != null) {
85 | mPresetList.add(addStation);
86 | }
87 | return addStation;
88 | }
89 |
90 | public synchronized PresetStation addStation(PresetStation station) {
91 | PresetStation addStation = null;
92 | if (station != null) {
93 | addStation = new PresetStation(station);
94 | mPresetList.add(addStation);
95 | }
96 | return addStation;
97 | }
98 |
99 | public synchronized void removeStation(int index) {
100 | int totalPresets = mPresetList.size();
101 | if (index < totalPresets) {
102 | mPresetList.remove(index);
103 | }
104 | }
105 |
106 | public synchronized void removeStation(PresetStation station) {
107 | int index = mPresetList.indexOf(station);
108 | int totalPresets = mPresetList.size();
109 | if (index < totalPresets) {
110 | mPresetList.remove(index);
111 | }
112 | }
113 |
114 | public synchronized void clear() {
115 | mPresetList.clear();
116 | }
117 |
118 | /*
119 | * If a user selects a new station in this list, this routine will be called
120 | * to to update the list.
121 | */
122 | public synchronized boolean setSelectedStation(PresetStation selectStation) {
123 | int totalPresets = mPresetList.size();
124 | if (selectStation != null) {
125 | for (int presetNum = 0; presetNum < totalPresets; presetNum++) {
126 | PresetStation station = mPresetList.get(presetNum);
127 | if (station != null) {
128 | if (selectStation.getFrequency() == station.getFrequency()) {
129 | if (selectStation.getName().equalsIgnoreCase(station.getName())) {
130 | mCurrentStation = presetNum;
131 | return true;
132 | }
133 | }
134 | }
135 | }
136 | }
137 | return false;
138 | }
139 |
140 | /*
141 | * Check if the same station already exists in a List to update the list.
142 | */
143 | public synchronized boolean sameStationExists(PresetStation compareStation) {
144 | int totalPresets = mPresetList.size();
145 | if (compareStation != null) {
146 | for (int presetNum = 0; presetNum < totalPresets; presetNum++) {
147 | PresetStation station = mPresetList.get(presetNum);
148 | if (station != null) {
149 | if (compareStation.getFrequency() == station.getFrequency()) {
150 | return true;
151 | }
152 | }
153 | }
154 | }
155 | return false;
156 | }
157 |
158 | /*
159 | * If a user selects a new station in this list, this routine will be called
160 | * to to update the list.
161 | */
162 | public synchronized boolean setSelectedStation(int stationIndex) {
163 | boolean foundStation = false;
164 | int totalPresets = mPresetList.size();
165 | if (stationIndex < totalPresets) {
166 | mCurrentStation = stationIndex;
167 | foundStation = true;
168 | }
169 | return foundStation;
170 | }
171 |
172 | public synchronized PresetStation getSelectedStation() {
173 | int totalPresets = mPresetList.size();
174 | PresetStation station = null;
175 | if (mCurrentStation < totalPresets) {
176 | station = mPresetList.get(mCurrentStation);
177 | }
178 | return station;
179 | }
180 |
181 | public synchronized PresetStation selectNextStation() {
182 | int totalPresets = mPresetList.size();
183 | PresetStation station = null;
184 | if (totalPresets > 0) {
185 | mCurrentStation++;
186 | if ((mCurrentStation) >= totalPresets) {
187 | mCurrentStation = 0;
188 | }
189 | station = mPresetList.get(mCurrentStation);
190 | }
191 | return station;
192 | }
193 |
194 | public synchronized PresetStation selectPrevStation() {
195 | int totalPresets = mPresetList.size();
196 | PresetStation station = null;
197 | if (totalPresets > 0) {
198 | mCurrentStation--;
199 | if (mCurrentStation < 0) {
200 | mCurrentStation = totalPresets - 1;
201 | }
202 | station = mPresetList.get(mCurrentStation);
203 | }
204 | return station;
205 | }
206 |
207 | public synchronized void selectStation(PresetStation selectStation) {
208 | int totalPresets = mPresetList.size();
209 | if (selectStation != null) {
210 | for (int presetNum = 0; presetNum < totalPresets; presetNum++) {
211 | PresetStation station = mPresetList.get(presetNum);
212 | if (station != null) {
213 | if (selectStation.getFrequency() == station.getFrequency()) {
214 | mCurrentStation = presetNum;
215 | return;
216 | }
217 | }
218 | }
219 | }
220 | }
221 |
222 | }
223 |
--------------------------------------------------------------------------------
/src/com/android/fm/radio/PresetStation.java:
--------------------------------------------------------------------------------
1 |
2 | package com.android.fm.radio;
3 |
4 | import android.hardware.fmradio.FmReceiver;
5 | import android.text.TextUtils;
6 |
7 | public class PresetStation {
8 | private String mName = "";
9 |
10 | private int mFrequency = 102100;
11 |
12 | private int mPty = 0;
13 |
14 | private int mPI = 0;
15 |
16 | private String mPtyStr = "";
17 |
18 | private String mPIStr = "";
19 |
20 | private boolean mRDSSupported = false;
21 |
22 | public PresetStation(String name, int frequency) {
23 | mName = name;
24 | /*
25 | * setFrequency set the name to "Frequency" String if Name is empty
26 | */
27 | setFrequency(frequency);
28 | }
29 |
30 | public PresetStation(PresetStation station) {
31 | Copy(station);
32 | /*
33 | * setFrequency set the name to "Frequency" String if Name is empty
34 | */
35 | setFrequency(station.getFrequency());
36 | }
37 |
38 | public void Copy(PresetStation station) {
39 | /*
40 | * Let copy just do a copy without any manipulation
41 | */
42 | mName = station.getName();
43 | mFrequency = station.getFrequency();
44 | mPI = station.getPI();
45 | mPty = station.getPty();
46 | mRDSSupported = station.getRDSSupported();
47 |
48 | mPtyStr = station.getPtyString();
49 | mPIStr = station.getPIString();
50 | }
51 |
52 | public boolean equals(PresetStation station) {
53 | boolean equal = false;
54 | if (mFrequency == station.getFrequency()) {
55 | if (mPty == (station.getPty())) {
56 | if (mPI == (station.getPI())) {
57 | if (mRDSSupported == (station.getRDSSupported())) {
58 | equal = true;
59 | }
60 | }
61 | }
62 | }
63 | return equal;
64 | }
65 |
66 | public void setName(String name) {
67 | if (!TextUtils.isEmpty(name)) {
68 | mName = name;
69 | } else {
70 | mName = "" + mFrequency / 1000.0;
71 | }
72 | }
73 |
74 | public void setFrequency(int freq) {
75 | mFrequency = freq;
76 | /* If no name set it to the frequency */
77 | if (TextUtils.isEmpty(mName)) {
78 | mName = "" + mFrequency / 1000.0;
79 | }
80 | return;
81 | }
82 |
83 | public void setPty(int pty) {
84 | mPty = pty;
85 | mPtyStr = PresetStation.parsePTY(mPty);
86 | }
87 |
88 | public void setPI(int pi) {
89 | mPI = pi;
90 | mPIStr = PresetStation.parsePI(mPI);
91 | }
92 |
93 | public void setRDSSupported(boolean rds) {
94 | mRDSSupported = rds;
95 | }
96 |
97 | public String getName() {
98 | return mName;
99 | }
100 |
101 | public int getFrequency() {
102 | return mFrequency;
103 | }
104 |
105 | /**
106 | * Routine to get the Frequency in String from an integer
107 | *
108 | * @param frequency : Frequency to be converted (ex: 96500)
109 | * @return String : Frequency in String form (ex: 96.5)
110 | */
111 | public static String getFrequencyString(int frequency) {
112 | double frequencyDbl = frequency / 1000.0;
113 | String frequencyString = "" + frequencyDbl;
114 | return frequencyString;
115 | }
116 |
117 | public int getPty() {
118 | return mPty;
119 | }
120 |
121 | public String getPtyString() {
122 | return mPtyStr;
123 | }
124 |
125 | public int getPI() {
126 | return mPI;
127 | }
128 |
129 | public String getPIString() {
130 | return mPIStr;
131 | }
132 |
133 | public boolean getRDSSupported() {
134 | return mRDSSupported;
135 | }
136 |
137 | /**
138 | * Routine parses the PI Code from Integer to Call Sign String Example:
139 | * 0x54A6 -> KZZY
140 | */
141 | public static String parsePI(int piCode) {
142 | String callSign = "";
143 | if ((piCode >> 8) == 0xAF) {// CALL LETTERS THAT MAP TO PI CODES = _ _ 0
144 | // 0.
145 | piCode = ((piCode & 0xFF) << 8);
146 | }
147 | /*
148 | * Run the second exception NOTE: For 9 special cases 1000,2000,..,9000
149 | * a double mapping occurs utilizing exceptions 1 and 2:
150 | * 1000->A100->AFA1;2000->A200->AFA2; ... ;
151 | * 8000->A800->AFA8;9000->A900->AFA9
152 | */
153 | if ((piCode >> 12) == 0xA) {// CALL LETTERS THAT MAP TO PI CODES = _ 0 _
154 | // _.
155 | piCode = ((piCode & 0xF00) << 4) + (piCode & 0xFF);
156 | }
157 | if ((piCode >= 0x1000) && (piCode <= 0x994E)) {
158 | String ShartChar;
159 | /* KAAA - KZZZ */
160 | if ((piCode >= 0x1000) && (piCode <= 0x54A7)) {
161 | piCode -= 0x1000;
162 | ShartChar = "K";
163 | } else { /* WAAA - WZZZ */
164 | piCode -= 0x54A8;
165 | ShartChar = "W";
166 | }
167 | int CharDiv = piCode / 26;
168 | int CharPos = piCode - (CharDiv * 26);
169 | char c3 = (char) ('A' + CharPos);
170 |
171 | piCode = CharDiv;
172 | CharDiv = piCode / 26;
173 | CharPos = piCode - (CharDiv * 26);
174 | char c2 = (char) ('A' + CharPos);
175 |
176 | piCode = CharDiv;
177 | CharDiv = piCode / 26;
178 | CharPos = piCode - (CharDiv * 26);
179 | char c1 = (char) ('A' + CharPos);
180 | callSign = ShartChar + c1 + c2 + c3;
181 | } else if ((piCode >= 0x9950) && (piCode <= 0x9EFF)) {// 3-LETTER-ONLY
182 | // CALL LETTERS
183 | callSign = get3LetterCallSign(piCode);
184 | } else {// NATIONALLY-LINKED RADIO STATIONS CARRYING DIFFERENT CALL
185 | // LETTERS
186 | callSign = getOtherCallSign(piCode);
187 | }
188 | return callSign;
189 | }
190 |
191 | private static String getOtherCallSign(int piCode) {
192 | String callSign = "";
193 | if ((piCode >= 0xB001) && (piCode <= 0xBF01)) {
194 | callSign = "NPR";
195 | } else if ((piCode >= 0xB002) && (piCode <= 0xBF02)) {
196 | callSign = "CBC English";
197 | } else if ((piCode >= 0xB003) && (piCode <= 0xBF03)) {
198 | callSign = "CBC French";
199 | }
200 | return callSign;
201 | }
202 |
203 | private static String get3LetterCallSign(int piCode) {
204 | String callSign = "";
205 | switch (piCode) {
206 | case 0x99A5: {
207 | callSign = "KBW";
208 | break;
209 | }
210 | case 0x9992: {
211 | callSign = "KOY";
212 | break;
213 | }
214 | case 0x9978: {
215 | callSign = "WHO";
216 | break;
217 | }
218 | case 0x99A6: {
219 | callSign = "KCY";
220 | break;
221 | }
222 | case 0x9993: {
223 | callSign = "KPQ";
224 | break;
225 | }
226 | case 0x999C: {
227 | callSign = "WHP";
228 | break;
229 | }
230 | case 0x9990: {
231 | callSign = "KDB";
232 | break;
233 | }
234 | case 0x9964: {
235 | callSign = "KQV";
236 | break;
237 | }
238 | case 0x999D: {
239 | callSign = "WIL";
240 | break;
241 | }
242 | case 0x99A7: {
243 | callSign = "KDF";
244 | break;
245 | }
246 | case 0x9994: {
247 | callSign = "KSD";
248 | break;
249 | }
250 | case 0x997A: {
251 | callSign = "WIP";
252 | break;
253 | }
254 | case 0x9950: {
255 | callSign = "KEX";
256 | break;
257 | }
258 | case 0x9965: {
259 | callSign = "KSL";
260 | break;
261 | }
262 | case 0x99B3: {
263 | callSign = "WIS";
264 | break;
265 | }
266 | case 0x9951: {
267 | callSign = "KFH";
268 | break;
269 | }
270 | case 0x9966: {
271 | callSign = "KUJ";
272 | break;
273 | }
274 | case 0x997B: {
275 | callSign = "WJR";
276 | break;
277 | }
278 | case 0x9952: {
279 | callSign = "KFI";
280 | break;
281 | }
282 | case 0x9995: {
283 | callSign = "KUT";
284 | break;
285 | }
286 | case 0x99B4: {
287 | callSign = "WJW";
288 | break;
289 | }
290 | case 0x9953: {
291 | callSign = "KGA";
292 | break;
293 | }
294 | case 0x9967: {
295 | callSign = "KVI";
296 | break;
297 | }
298 | case 0x99B5: {
299 | callSign = "WJZ";
300 | break;
301 | }
302 | case 0x9991: {
303 | callSign = "KGB";
304 | break;
305 | }
306 | case 0x9968: {
307 | callSign = "KWG";
308 | break;
309 | }
310 | case 0x997C: {
311 | callSign = "WKY";
312 | break;
313 | }
314 | case 0x9954: {
315 | callSign = "KGO";
316 | break;
317 | }
318 | case 0x9996: {
319 | callSign = "KXL";
320 | break;
321 | }
322 | case 0x997D: {
323 | callSign = "WLS";
324 | break;
325 | }
326 | case 0x9955: {
327 | callSign = "KGU";
328 | break;
329 | }
330 | case 0x9997: {
331 | callSign = "KXO";
332 | break;
333 | }
334 | case 0x997E: {
335 | callSign = "WLW";
336 | break;
337 | }
338 | case 0x9956: {
339 | callSign = "KGW";
340 | break;
341 | }
342 | case 0x996B: {
343 | callSign = "KYW";
344 | break;
345 | }
346 | case 0x999E: {
347 | callSign = "WMC";
348 | break;
349 | }
350 | case 0x9957: {
351 | callSign = "KGY";
352 | break;
353 | }
354 | case 0x9999: {
355 | callSign = "WBT";
356 | break;
357 | }
358 | case 0x999F: {
359 | callSign = "WMT";
360 | break;
361 | }
362 | case 0x99AA: {
363 | callSign = "KHQ";
364 | break;
365 | }
366 | case 0x996D: {
367 | callSign = "WBZ";
368 | break;
369 | }
370 | case 0x9981: {
371 | callSign = "WOC";
372 | break;
373 | }
374 | case 0x9958: {
375 | callSign = "KID";
376 | break;
377 | }
378 | case 0x996E: {
379 | callSign = "WDZ";
380 | break;
381 | }
382 | case 0x99A0: {
383 | callSign = "WOI";
384 | break;
385 | }
386 | case 0x9959: {
387 | callSign = "KIT";
388 | break;
389 | }
390 | case 0x996F: {
391 | callSign = "WEW";
392 | break;
393 | }
394 | case 0x9983: {
395 | callSign = "WOL";
396 | break;
397 | }
398 | case 0x995A: {
399 | callSign = "KJR";
400 | break;
401 | }
402 | case 0x999A: {
403 | callSign = "WGH";
404 | break;
405 | }
406 | case 0x9984: {
407 | callSign = "WOR";
408 | break;
409 | }
410 | case 0x995B: {
411 | callSign = "KLO";
412 | break;
413 | }
414 | case 0x9971: {
415 | callSign = "WGL";
416 | break;
417 | }
418 | case 0x99A1: {
419 | callSign = "WOW";
420 | break;
421 | }
422 | case 0x995C: {
423 | callSign = "KLZ";
424 | break;
425 | }
426 | case 0x9972: {
427 | callSign = "WGN";
428 | break;
429 | }
430 | case 0x99B9: {
431 | callSign = "WRC";
432 | break;
433 | }
434 | case 0x995D: {
435 | callSign = "KMA";
436 | break;
437 | }
438 | case 0x9973: {
439 | callSign = "WGR";
440 | break;
441 | }
442 | case 0x99A2: {
443 | callSign = "WRR";
444 | break;
445 | }
446 | case 0x995E: {
447 | callSign = "KMJ";
448 | break;
449 | }
450 | case 0x999B: {
451 | callSign = "WGY";
452 | break;
453 | }
454 | case 0x99A3: {
455 | callSign = "WSB";
456 | break;
457 | }
458 | case 0x995F: {
459 | callSign = "KNX";
460 | break;
461 | }
462 | case 0x9975: {
463 | callSign = "WHA";
464 | break;
465 | }
466 | case 0x99A4: {
467 | callSign = "WSM";
468 | break;
469 | }
470 | case 0x9960: {
471 | callSign = "KOA";
472 | break;
473 | }
474 | case 0x9976: {
475 | callSign = "WHB";
476 | break;
477 | }
478 | case 0x9988: {
479 | callSign = "WWJ";
480 | break;
481 | }
482 | case 0x99AB: {
483 | callSign = "KOB";
484 | break;
485 | }
486 | case 0x9977: {
487 | callSign = "WHK";
488 | break;
489 | }
490 | case 0x9989: {
491 | callSign = "WWL";
492 | break;
493 | }
494 | }
495 | return callSign;
496 | }
497 |
498 | /**
499 | * Get the Text String for the Program type Code
500 | */
501 | public static String parsePTY(int pty) {
502 | String ptyStr = "";
503 | int rdsStd = FmSharedPreferences.getFMConfiguration().getRdsStd();
504 | if (rdsStd == FmReceiver.FM_RDS_STD_RBDS) {
505 | ptyStr = getRBDSPtyString(pty);
506 | } else if (rdsStd == FmReceiver.FM_RDS_STD_RDS) {
507 | ptyStr = getRDSPtyString(pty);
508 | }
509 | return (ptyStr);
510 | }
511 |
512 | /**
513 | * get the Text String for the RBDS Program type Code
514 | */
515 | public static String getRBDSPtyString(int pty) {
516 | String ptyStr = "";
517 | switch (pty) {
518 | case 1: {
519 | ptyStr = "News";
520 | break;
521 | }
522 | case 2: {
523 | ptyStr = "Information";
524 | break;
525 | }
526 | case 3: {
527 | ptyStr = "Sports";
528 | break;
529 | }
530 | case 4: {
531 | ptyStr = "Talk";
532 | break;
533 | }
534 | case 5: {
535 | ptyStr = "Rock";
536 | break;
537 | }
538 | case 6: {
539 | ptyStr = "Classic Rock";
540 | break;
541 | }
542 | case 7: {
543 | ptyStr = "Adult Hits";
544 | break;
545 | }
546 | case 8: {
547 | ptyStr = "Soft Rock";
548 | break;
549 | }
550 | case 9: {
551 | ptyStr = "Top 40";
552 | break;
553 | }
554 | case 10: {
555 | ptyStr = "Country";
556 | break;
557 | }
558 | case 11: {
559 | ptyStr = "Oldies";
560 | break;
561 | }
562 | case 12: {
563 | ptyStr = "Soft";
564 | break;
565 | }
566 | case 13: {
567 | ptyStr = "Nostalgia";
568 | break;
569 | }
570 | case 14: {
571 | ptyStr = "Jazz";
572 | break;
573 | }
574 | case 15: {
575 | ptyStr = "Classical";
576 | break;
577 | }
578 | case 16: {
579 | ptyStr = "Rhythm and Blues";
580 | break;
581 | }
582 | case 17: {
583 | ptyStr = "Soft Rhythm and Blues";
584 | break;
585 | }
586 | case 18: {
587 | ptyStr = "Foreign Language";
588 | break;
589 | }
590 | case 19: {
591 | ptyStr = "Religious Music";
592 | break;
593 | }
594 | case 20: {
595 | ptyStr = "Religious Talk";
596 | break;
597 | }
598 | case 21: {
599 | ptyStr = "Personality";
600 | break;
601 | }
602 | case 22: {
603 | ptyStr = "Public";
604 | break;
605 | }
606 | case 23: {
607 | ptyStr = "College";
608 | break;
609 | }
610 | case 29: {
611 | ptyStr = "Weather";
612 | break;
613 | }
614 | case 30: {
615 | ptyStr = "Emergency Test";
616 | break;
617 | }
618 | case 31: {
619 | ptyStr = "Emergency";
620 | break;
621 | }
622 | default: {
623 | ptyStr = "";
624 | // Log.e(FMRadio.LOGTAG, "Unknown RBDS ProgramType [" + pty +
625 | // "]");
626 | break;
627 | }
628 | }
629 | return ptyStr;
630 | }
631 |
632 | /** get the Text String for the Program type Code */
633 | public static String getRDSPtyString(int pty) {
634 | String ptyStr = "";
635 | switch (pty) {
636 | case 1: {
637 | ptyStr = "News";
638 | break;
639 | }
640 | case 2: {
641 | ptyStr = "Current Affairs";
642 | break;
643 | }
644 | case 3: {
645 | ptyStr = "Information";
646 | break;
647 | }
648 | case 4: {
649 | ptyStr = "Sport";
650 | break;
651 | }
652 | case 5: {
653 | ptyStr = "Education";
654 | break;
655 | }
656 | case 6: {
657 | ptyStr = "Drama";
658 | break;
659 | }
660 | case 7: {
661 | ptyStr = "Culture";
662 | break;
663 | }
664 | case 8: {
665 | ptyStr = "Science";
666 | break;
667 | }
668 | case 9: {
669 | ptyStr = "Varied";
670 | break;
671 | }
672 | case 10: {
673 | ptyStr = "Pop Music";
674 | break;
675 | }
676 | case 11: {
677 | ptyStr = "Rock Music";
678 | break;
679 | }
680 | case 12: {
681 | ptyStr = "Easy Listening Music";
682 | break;
683 | }
684 | case 13: {
685 | ptyStr = "Light classical";
686 | break;
687 | }
688 | case 14: {
689 | ptyStr = "Serious classical";
690 | break;
691 | }
692 | case 15: {
693 | ptyStr = "Other Music";
694 | break;
695 | }
696 | case 16: {
697 | ptyStr = "Weather";
698 | break;
699 | }
700 | case 17: {
701 | ptyStr = "Finance";
702 | break;
703 | }
704 | case 18: {
705 | ptyStr = "Children programs";
706 | break;
707 | }
708 | case 19: {
709 | ptyStr = "Social Affairs";
710 | break;
711 | }
712 | case 20: {
713 | ptyStr = "Religion";
714 | break;
715 | }
716 | case 21: {
717 | ptyStr = "Phone In";
718 | break;
719 | }
720 | case 22: {
721 | ptyStr = "Travel";
722 | break;
723 | }
724 | case 23: {
725 | ptyStr = "Leisure";
726 | break;
727 | }
728 | case 24: {
729 | ptyStr = "Jazz Music";
730 | break;
731 | }
732 | case 25: {
733 | ptyStr = "Country Music";
734 | break;
735 | }
736 | case 26: {
737 | ptyStr = "National Music";
738 | break;
739 | }
740 | case 27: {
741 | ptyStr = "Oldies Music";
742 | break;
743 | }
744 | case 28: {
745 | ptyStr = "Folk Music";
746 | break;
747 | }
748 | case 29: {
749 | ptyStr = "Documentary";
750 | break;
751 | }
752 | case 30: {
753 | ptyStr = "Emergency Test";
754 | break;
755 | }
756 | case 31: {
757 | ptyStr = "Emergency";
758 | break;
759 | }
760 | default: {
761 | ptyStr = "";
762 | // Log.e(FMRadio.LOGTAG, "Unknown RDS ProgramType [" + pty +
763 | // "]");
764 | break;
765 | }
766 | }
767 | return ptyStr;
768 | }
769 |
770 | }
771 |
--------------------------------------------------------------------------------
/src/com/android/fm/radio/Settings.java:
--------------------------------------------------------------------------------
1 |
2 | package com.android.fm.radio;
3 |
4 | import com.android.fm.R;
5 |
6 | import android.app.AlertDialog;
7 | import android.app.Dialog;
8 | import android.content.DialogInterface;
9 | import android.content.Intent;
10 | import android.content.SharedPreferences;
11 | import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
12 | import android.net.Uri;
13 | import android.os.Bundle;
14 | import android.preference.CheckBoxPreference;
15 | import android.preference.ListPreference;
16 | import android.preference.Preference;
17 | import android.preference.PreferenceActivity;
18 | import android.preference.PreferenceCategory;
19 | import android.preference.PreferenceScreen;
20 | import android.preference.Preference.OnPreferenceClickListener;
21 | import android.util.Log;
22 |
23 | public class Settings extends PreferenceActivity implements OnSharedPreferenceChangeListener,
24 | OnPreferenceClickListener {
25 | public static final String RX_MODE = "rx_mode";
26 |
27 | public static final String REGIONAL_BAND_KEY = "regional_band";
28 |
29 | public static final String AUDIO_OUTPUT_KEY = "audio_output_mode";
30 |
31 | public static final String RECORD_DURATION_KEY = "record_duration";
32 |
33 | public static final String AUTO_AF = "af_checkbox_preference";
34 |
35 | public static final String BT_EXIT_BEHAVIOUR = "bt_exit_behaviour";
36 |
37 | public static final String HEADSET_DC_BEHAVIOUR = "headset_exit_behaviour";
38 |
39 | public static final String RESTORE_FACTORY_DEFAULT = "revert_to_fac";
40 |
41 | private static final String ABOUT_KEY = "about";
42 |
43 | public static final int RESTORE_FACTORY_DEFAULT_INT = 1;
44 |
45 | public static final String RESTORE_FACTORY_DEFAULT_ACTION = "com.android.fm.radio.settings.revert_to_defaults";
46 |
47 | private static final String LOGTAG = FMRadio.LOGTAG;
48 |
49 | private ListPreference mBandPreference;
50 |
51 | private ListPreference mAudioPreference;
52 |
53 | private ListPreference mRecordDurPreference;
54 |
55 | private CheckBoxPreference mAfPref;
56 |
57 | private ListPreference mBluetoothBehaviour;
58 |
59 | private CheckBoxPreference mRemoveHeadset;
60 |
61 | private Preference mRestoreDefaultPreference;
62 |
63 | private Preference mAboutPreference;
64 |
65 | private FmSharedPreferences mPrefs = null;
66 |
67 | private boolean mRxMode = false;
68 |
69 | @Override
70 | protected void onCreate(Bundle savedInstanceState) {
71 | super.onCreate(savedInstanceState);
72 | Intent intent = getIntent();
73 | if (intent != null) {
74 | mRxMode = intent.getBooleanExtra(RX_MODE, false);
75 | }
76 | mPrefs = new FmSharedPreferences(this);
77 | if (mPrefs != null) {
78 | setPreferenceScreen(createPreferenceHierarchy());
79 | }
80 | }
81 |
82 | private PreferenceScreen createPreferenceHierarchy() {
83 | int index = 0;
84 | if (mPrefs == null) {
85 | return null;
86 | }
87 | // Root
88 | PreferenceScreen root = getPreferenceManager().createPreferenceScreen(this);
89 |
90 | // Band/Country
91 | String[] summaryBandItems = getResources().getStringArray(R.array.regional_band_summary);
92 | mBandPreference = new ListPreference(this);
93 | mBandPreference.setEntries(R.array.regional_band_entries);
94 | mBandPreference.setEntryValues(R.array.regional_band_values);
95 | mBandPreference.setDialogTitle(R.string.sel_band_menu);
96 | mBandPreference.setKey(REGIONAL_BAND_KEY);
97 | mBandPreference.setTitle(R.string.regional_band);
98 | index = FmSharedPreferences.getCountry();
99 | Log.d(LOGTAG, "createPreferenceHierarchy: Country: " + index);
100 | // Get the preference and list the value.
101 | if ((index < 0) || (index >= summaryBandItems.length)) {
102 | index = 0;
103 | }
104 | Log.d(LOGTAG, "createPreferenceHierarchy: CountrySummary: " + summaryBandItems[index]);
105 | mBandPreference.setSummary(summaryBandItems[index]);
106 | mBandPreference.setValueIndex(index);
107 | root.addPreference(mBandPreference);
108 |
109 | if (mRxMode) {
110 | // Audio Output (Stereo or Mono)
111 | String[] summaryAudioModeItems = getResources()
112 | .getStringArray(R.array.ster_mon_entries);
113 | mAudioPreference = new ListPreference(this);
114 | mAudioPreference.setEntries(R.array.ster_mon_entries);
115 | mAudioPreference.setEntryValues(R.array.ster_mon_values);
116 | mAudioPreference.setDialogTitle(R.string.sel_audio_output);
117 | mAudioPreference.setKey(AUDIO_OUTPUT_KEY);
118 | mAudioPreference.setTitle(R.string.aud_output_mode);
119 | boolean audiomode = FmSharedPreferences.getAudioOutputMode();
120 | if (audiomode) {
121 | index = 0;
122 | } else {
123 | index = 1;
124 | }
125 | Log.d(LOGTAG, "createPreferenceHierarchy: audiomode: " + audiomode);
126 | mAudioPreference.setSummary(summaryAudioModeItems[index]);
127 | mAudioPreference.setValueIndex(index);
128 | root.addPreference(mAudioPreference);
129 |
130 | // AF Auto Enable (Checkbox)
131 | mAfPref = new CheckBoxPreference(this);
132 | mAfPref.setKey(AUTO_AF);
133 | mAfPref.setTitle(R.string.auto_select_af);
134 | mAfPref.setSummaryOn(R.string.auto_select_af_enabled);
135 | mAfPref.setSummaryOff(R.string.auto_select_af_disabled);
136 | boolean bAFAutoSwitch = FmSharedPreferences.getAutoAFSwitch();
137 | Log.d(LOGTAG, "createPreferenceHierarchy: bAFAutoSwitch: " + bAFAutoSwitch);
138 | mAfPref.setChecked(bAFAutoSwitch);
139 | root.addPreference(mAfPref);
140 |
141 | if (FMRadio.RECORDING_ENABLE) {
142 | String[] summaryRecordItems = getResources().getStringArray(
143 | R.array.record_durations_entries);
144 | mRecordDurPreference = new ListPreference(this);
145 | mRecordDurPreference.setEntries(R.array.record_durations_entries);
146 | mRecordDurPreference.setEntryValues(R.array.record_duration_values);
147 | mRecordDurPreference.setDialogTitle(R.string.sel_rec_dur);
148 | mRecordDurPreference.setKey(RECORD_DURATION_KEY);
149 | mRecordDurPreference.setTitle(R.string.record_dur);
150 | index = FmSharedPreferences.getRecordDuration();
151 | Log.d(LOGTAG, "createPreferenceHierarchy: recordDuration: " + index);
152 | // Get the preference and list the value.
153 | if ((index < 0) || (index >= summaryRecordItems.length)) {
154 | index = 0;
155 | }
156 | Log.d(LOGTAG, "createPreferenceHierarchy: recordDurationSummary: "
157 | + summaryRecordItems[index]);
158 | mRecordDurPreference.setSummary(summaryRecordItems[index]);
159 | mRecordDurPreference.setValueIndex(index);
160 | root.addPreference(mRecordDurPreference);
161 | }
162 | }
163 |
164 | mBluetoothBehaviour = new ListPreference(this);
165 | mBluetoothBehaviour.setEntries(R.array.bt_exit_behaviour_entries);
166 | mBluetoothBehaviour.setEntryValues(R.array.bt_exit_behaviour_values);
167 | mBluetoothBehaviour.setDialogTitle(R.string.pref_bt_behaviour_on_exit_dialog_title);
168 | mBluetoothBehaviour.setKey(BT_EXIT_BEHAVIOUR);
169 | mBluetoothBehaviour.setTitle(R.string.pref_bt_behaviour_on_exit_title);
170 | mBluetoothBehaviour.setSummary(R.string.pref_bt_behaviour_on_exit_summary);
171 | root.addPreference(mBluetoothBehaviour);
172 |
173 | mRemoveHeadset = new CheckBoxPreference(this);
174 | mRemoveHeadset.setKey(HEADSET_DC_BEHAVIOUR);
175 | mRemoveHeadset.setTitle(R.string.pref_headset_behaviour_title);
176 | mRemoveHeadset.setSummary(R.string.pref_headset_behaviour_summary);
177 | mRemoveHeadset.setChecked(FmSharedPreferences.getHeadsetDcBehaviour());
178 | root.addPreference(mRemoveHeadset);
179 |
180 | mRestoreDefaultPreference = new Preference(this);
181 | mRestoreDefaultPreference.setTitle(R.string.settings_revert_defaults_title);
182 | mRestoreDefaultPreference.setKey(RESTORE_FACTORY_DEFAULT);
183 | mRestoreDefaultPreference.setSummary(R.string.settings_revert_defaults_summary);
184 | mRestoreDefaultPreference.setOnPreferenceClickListener(this);
185 | root.addPreference(mRestoreDefaultPreference);
186 |
187 | // Add a new category
188 | PreferenceCategory prefCat = new PreferenceCategory(this);
189 | prefCat.setTitle(R.string.about_title);
190 | root.addPreference(prefCat);
191 |
192 | mAboutPreference = new Preference(this);
193 | mAboutPreference.setTitle(R.string.about_title);
194 | mAboutPreference.setKey(ABOUT_KEY);
195 | mAboutPreference.setSummary(R.string.about_summary);
196 | mAboutPreference.setOnPreferenceClickListener(this);
197 | root.addPreference(mAboutPreference);
198 |
199 | return root;
200 | }
201 |
202 | public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
203 | if (key.equals(REGIONAL_BAND_KEY)) {
204 | String[] summaryBandItems = getResources()
205 | .getStringArray(R.array.regional_band_summary);
206 | String valueStr = sharedPreferences.getString(key, "");
207 | int index = 0;
208 | if (valueStr != null) {
209 | index = mBandPreference.findIndexOfValue(valueStr);
210 | }
211 | if ((index < 0) || (index >= summaryBandItems.length)) {
212 | index = 0;
213 | mBandPreference.setValueIndex(0);
214 | }
215 | Log.d(LOGTAG, "onSharedPreferenceChanged: Country Change: " + index);
216 | mBandPreference.setSummary(summaryBandItems[index]);
217 | FmSharedPreferences.setCountry(index);
218 | FMRadio.fmConfigure();
219 | } else {
220 | if (mRxMode) {
221 | if (key.equals(AUTO_AF)) {
222 | boolean bAFAutoSwitch = mAfPref.isChecked();
223 | Log.d(LOGTAG, "onSharedPreferenceChanged: Auto AF Enable: " + bAFAutoSwitch);
224 | FmSharedPreferences.setAutoAFSwitch(bAFAutoSwitch);
225 | FMRadio.fmAutoAFSwitch();
226 | } else if (key.equals(RECORD_DURATION_KEY)) {
227 | if (FMRadio.RECORDING_ENABLE) {
228 | String[] recordItems = getResources().getStringArray(
229 | R.array.record_durations_entries);
230 | String valueStr = mRecordDurPreference.getValue();
231 | int index = 0;
232 | if (valueStr != null) {
233 | index = mRecordDurPreference.findIndexOfValue(valueStr);
234 | }
235 | if ((index < 0) || (index >= recordItems.length)) {
236 | index = 0;
237 | mRecordDurPreference.setValueIndex(index);
238 | }
239 | Log
240 | .d(LOGTAG, "onSharedPreferenceChanged: recorddur: "
241 | + recordItems[index]);
242 | mRecordDurPreference.setSummary(recordItems[index]);
243 | FmSharedPreferences.setRecordDuration(index);
244 | }
245 | } else if (key.equals(AUDIO_OUTPUT_KEY)) {
246 | String[] bandItems = getResources().getStringArray(R.array.ster_mon_entries);
247 | String valueStr = mAudioPreference.getValue();
248 | int index = 0;
249 | if (valueStr != null) {
250 | index = mAudioPreference.findIndexOfValue(valueStr);
251 | }
252 | if (index != 1) {
253 | if (index != 0) {
254 | index = 0;
255 | /* It shud be 0(Stereo) or 1(Mono) */
256 | mAudioPreference.setValueIndex(index);
257 | }
258 | }
259 | Log.d(LOGTAG, "onSharedPreferenceChanged: audiomode: " + bandItems[index]);
260 | mAudioPreference.setSummary(bandItems[index]);
261 | if (index == 0) {
262 | // Stereo
263 | FmSharedPreferences.setAudioOutputMode(true);
264 | } else {
265 | // Mono
266 | FmSharedPreferences.setAudioOutputMode(false);
267 | }
268 | FMRadio.fmAudioOutputMode();
269 | }
270 | else if (key.equals(BT_EXIT_BEHAVIOUR)) {
271 | String[] btChoices = getResources().getStringArray(R.array.bt_exit_behaviour_entries);
272 | String valueStr = mBluetoothBehaviour.getValue();
273 | Log.d(LOGTAG, "onSharedPreferenceChanged: BT behaviour: " + btChoices[mBluetoothBehaviour.findIndexOfValue(valueStr)]);
274 | FmSharedPreferences.setBluetoothExitBehaviour(Integer.parseInt(valueStr));
275 | }
276 | else if (key.equals(HEADSET_DC_BEHAVIOUR)) {
277 | boolean bRemoveHeadset = mRemoveHeadset.isChecked();
278 | Log.d(LOGTAG, "onSharedPreferenceChanged: Remove Headset Enable: " + bRemoveHeadset);
279 | FmSharedPreferences.setHeadsetDcBehaviour(bRemoveHeadset);
280 | }
281 | }
282 | }
283 | if (mPrefs != null) {
284 | mPrefs.Save();
285 | }
286 | }
287 |
288 | public boolean onPreferenceClick(Preference preference) {
289 | boolean handled = false;
290 | if (preference == mRestoreDefaultPreference) {
291 | showDialog(RESTORE_FACTORY_DEFAULT_INT);
292 | } else if (preference == mAboutPreference) {
293 | Intent viewIntent = new Intent("android.intent.action.VIEW", Uri.parse("http://www.miui.com"));
294 | startActivity(viewIntent);
295 | handled = true;
296 | }
297 |
298 | return handled;
299 | }
300 |
301 | @Override
302 | protected Dialog onCreateDialog(int id) {
303 | switch (id) {
304 | case RESTORE_FACTORY_DEFAULT_INT:
305 | return new AlertDialog.Builder(this).setIcon(R.drawable.alert_dialog_icon)
306 | .setTitle(R.string.settings_revert_confirm_title).setMessage(
307 | R.string.settings_revert_confirm_msg).setPositiveButton(
308 | R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
309 | public void onClick(DialogInterface dialog, int whichButton) {
310 | Intent data = new Intent(RESTORE_FACTORY_DEFAULT_ACTION);
311 | setResult(RESULT_OK, data);
312 | restoreSettingsDefault();
313 | finish();
314 | }
315 |
316 | }).setNegativeButton(R.string.alert_dialog_cancel,
317 | new DialogInterface.OnClickListener() {
318 | public void onClick(DialogInterface dialog, int whichButton) {
319 | }
320 | }).create();
321 | default:
322 | break;
323 | }
324 | return null;
325 | }
326 |
327 | private void restoreSettingsDefault() {
328 | if (mPrefs != null) {
329 | mBandPreference.setValueIndex(0);
330 | if (mRxMode) {
331 | mAudioPreference.setValueIndex(0);
332 | if (FMRadio.RECORDING_ENABLE) {
333 | mRecordDurPreference.setValueIndex(0);
334 | }
335 | mAfPref.setChecked(false);
336 | FmSharedPreferences.SetDefaults();
337 | } else {
338 | FmSharedPreferences.setCountry(FmSharedPreferences.REGIONAL_BAND_NORTH_AMERICA);
339 | }
340 | mPrefs.Save();
341 | }
342 | }
343 |
344 | @Override
345 | protected void onResume() {
346 | super.onResume();
347 | getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
348 | }
349 |
350 | @Override
351 | protected void onPause() {
352 | super.onPause();
353 | getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(
354 | this);
355 | }
356 |
357 | }
358 |
--------------------------------------------------------------------------------
/src/com/android/fm/radio/TunerView.java:
--------------------------------------------------------------------------------
1 | package com.android.fm.radio;
2 |
3 | import com.android.fm.R;
4 | import android.content.Context;
5 | import android.util.AttributeSet;
6 | import android.util.Log;
7 | import android.view.MotionEvent;
8 | import android.widget.ImageView;
9 |
10 | public class TunerView extends ImageView {
11 |
12 | public interface OnMoveListener{
13 |
14 | /**
15 | * @param tunerView1
16 | * @param step the amount of movement for tunerview, >0 means move to RIGHT,
17 | * <0 means move to LEFT. 1 means 1 step to RIGHT, -1 means 1 step to LEFT
18 | */
19 | void onMove(TunerView tunerView, int step);
20 | }
21 |
22 | private static final int MOVE_RIGHT_THRESHOLD = 5;
23 | private static final int MOVE_LEFT_THRESHOLD = -5;
24 |
25 | private int mTotalMove = 0;
26 |
27 | private int mLastMotionX = 0;
28 |
29 | private OnMoveListener mListener;
30 |
31 | private int mIndex = 0;
32 | private static final int MININDEX = 0;
33 | private static final int MAXINDEX = 6;
34 | private static int[] TunerViewBackgrounds = new int[] {
35 | R.drawable.tuner_view_0,
36 | R.drawable.tuner_view_1,
37 | R.drawable.tuner_view_2,
38 | R.drawable.tuner_view_3,
39 | R.drawable.tuner_view_4,
40 | R.drawable.tuner_view_5,
41 | R.drawable.tuner_view_6
42 | };
43 |
44 | public TunerView(Context context) {
45 | super(context);
46 | setClickable(true);
47 | }
48 |
49 | public TunerView(Context context, AttributeSet attrs) {
50 | super(context, attrs);
51 | setClickable(true);
52 | }
53 |
54 | public void setOnMoveListener(OnMoveListener l) {
55 | mListener = l;
56 | }
57 |
58 | @Override
59 | public boolean onTouchEvent(MotionEvent event) {
60 | final int action = event.getAction();
61 | final int x = (int)event.getX();
62 |
63 | switch (action) {
64 | case MotionEvent.ACTION_MOVE:{
65 | if (mLastMotionX == 0) {
66 | mLastMotionX = x;
67 | } else {
68 | final int scrollX = x - mLastMotionX;
69 | mLastMotionX = x;
70 | if (mListener != null && scrollX != 0) {
71 | mTotalMove += scrollX;
72 | if (mTotalMove > MOVE_RIGHT_THRESHOLD) {
73 | mListener.onMove(this, 1);
74 | moveRightUI();
75 | mTotalMove = 0;
76 | } else if (mTotalMove < MOVE_LEFT_THRESHOLD) {
77 | mListener.onMove(this, -1);
78 | moveLeftUI();
79 | mTotalMove = 0;
80 | }
81 | }
82 | }
83 | return true;
84 | }
85 | case MotionEvent.ACTION_UP:
86 | case MotionEvent.ACTION_CANCEL:
87 | // intentionally fall through
88 | mLastMotionX = 0;
89 | default:
90 | return super.onTouchEvent(event);
91 | }
92 | }
93 |
94 | private void moveRightUI() {
95 | mIndex++;
96 | if (mIndex > MAXINDEX) {
97 | mIndex = MININDEX;
98 | }
99 | setImageResource(TunerViewBackgrounds[mIndex]);
100 | }
101 |
102 | private void moveLeftUI() {
103 | mIndex--;
104 | if (mIndex < MININDEX) {
105 | mIndex = MAXINDEX;
106 | }
107 | setImageResource(TunerViewBackgrounds[mIndex]);
108 | }
109 | }
110 |
--------------------------------------------------------------------------------
/src/com/android/fm/utils/FrequencyPicker.java:
--------------------------------------------------------------------------------
1 |
2 | package com.android.fm.utils;
3 |
4 | import android.content.Context;
5 | import android.os.Parcel;
6 | import android.os.Parcelable;
7 | import android.util.AttributeSet;
8 | import android.util.SparseArray;
9 | import android.view.LayoutInflater;
10 | import android.widget.FrameLayout;
11 |
12 | import com.android.fm.R;
13 | import android.widget.NumberPicker;
14 | import android.widget.NumberPicker.OnChangedListener;
15 |
16 | /**
17 | * A view for selecting the frequency For a dialog using this view, see
18 | * {FrequencyPickerDialog}.
19 | */
20 |
21 | public class FrequencyPicker extends FrameLayout {
22 |
23 | /* UI Components */
24 | private final NumberPicker mMHzPicker;
25 |
26 | private final NumberPicker mKHzPicker;
27 |
28 | /**
29 | * How we notify users the Frequency has changed.
30 | */
31 | private OnFrequencyChangedListener mOnFrequencyChangedListener;
32 |
33 | private int mFrequency;
34 |
35 | private int mMin;
36 |
37 | private int mMax;
38 |
39 | private int mStep;
40 |
41 | private int mMhz;
42 |
43 | private int mKhz;
44 |
45 | /**
46 | * The callback used to indicate the user changes the Frequency.
47 | */
48 | public interface OnFrequencyChangedListener {
49 |
50 | /**
51 | * @param view The view associated with this listener.
52 | * @param frequency The Frequency that was set.
53 | */
54 | void onFrequencyChanged(FrequencyPicker view, int frequency);
55 | }
56 |
57 | public FrequencyPicker(Context context) {
58 | this(context, null);
59 | }
60 |
61 | public FrequencyPicker(Context context, AttributeSet attrs) {
62 | this(context, attrs, 0);
63 | }
64 |
65 | public FrequencyPicker(Context context, AttributeSet attrs, int defStyle) {
66 | super(context, attrs, defStyle);
67 |
68 | LayoutInflater inflater = (LayoutInflater) context
69 | .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
70 | inflater.inflate(R.layout.frequency_picker, this, true);
71 |
72 | mMHzPicker = (NumberPicker) findViewById(R.id.mhz);
73 | mMHzPicker.setSpeed(100);
74 |
75 | mMHzPicker.setOnChangeListener(new OnChangedListener() {
76 | public void onChanged(NumberPicker picker, int oldVal, int newVal) {
77 | mMhz = newVal;
78 | mFrequency = (mMhz * 1000) + (getFrequencyKHz(mKhz, mMin, mStep));
79 | validateFrequencyRange();
80 | if (mOnFrequencyChangedListener != null) {
81 | mOnFrequencyChangedListener
82 | .onFrequencyChanged(FrequencyPicker.this, mFrequency);
83 | }
84 | }
85 | });
86 | mKHzPicker = (NumberPicker) findViewById(R.id.khz);
87 | mKHzPicker.setSpeed(100);
88 | mKHzPicker.setOnChangeListener(new OnChangedListener() {
89 | public void onChanged(NumberPicker picker, int oldVal, int newVal) {
90 | mKhz = newVal;
91 | mFrequency = (mMhz * 1000) + (getFrequencyKHz(mKhz, mMin, mStep));
92 |
93 | validateFrequencyRange();
94 |
95 | if (mOnFrequencyChangedListener != null) {
96 | mOnFrequencyChangedListener
97 | .onFrequencyChanged(FrequencyPicker.this, mFrequency);
98 | }
99 | }
100 | });
101 |
102 | updateSpinnerRange();
103 |
104 | if (!isEnabled()) {
105 | setEnabled(false);
106 | }
107 | }
108 |
109 | @Override
110 | public void setEnabled(boolean enabled) {
111 | super.setEnabled(enabled);
112 | mMHzPicker.setEnabled(enabled);
113 | mKHzPicker.setEnabled(enabled);
114 | }
115 |
116 | public void updateFrequency(int frequency) {
117 | mFrequency = frequency;
118 | updateSpinners();
119 | }
120 |
121 | private static class SavedState extends BaseSavedState {
122 |
123 | private final int mMHZ;
124 |
125 | private final int mKHZ;
126 |
127 | /**
128 | * Constructor called from {@link FrequencyPicker#onSaveInstanceState()}
129 | */
130 | private SavedState(Parcelable superState, int mhz, int khz) {
131 | super(superState);
132 | mMHZ = mhz;
133 | mKHZ = khz;
134 | }
135 |
136 | /**
137 | * Constructor called from {@link #CREATOR}
138 | */
139 | private SavedState(Parcel in) {
140 | super(in);
141 | mMHZ = in.readInt();
142 | mKHZ = in.readInt();
143 | }
144 |
145 | public int getMHz() {
146 | return mMHZ;
147 | }
148 |
149 | public int getKHz() {
150 | return mKHZ;
151 | }
152 |
153 | @Override
154 | public void writeToParcel(Parcel dest, int flags) {
155 | super.writeToParcel(dest, flags);
156 | dest.writeInt(mMHZ);
157 | dest.writeInt(mKHZ);
158 | }
159 |
160 | public static final Parcelable.Creator CREATOR = new Creator() {
161 |
162 | public SavedState createFromParcel(Parcel in) {
163 | return new SavedState(in);
164 | }
165 |
166 | public SavedState[] newArray(int size) {
167 | return new SavedState[size];
168 | }
169 | };
170 | }
171 |
172 | /**
173 | * Override so we are in complete control of save / restore for this widget.
174 | */
175 | @Override
176 | protected void dispatchRestoreInstanceState(SparseArray container) {
177 | dispatchThawSelfOnly(container);
178 | }
179 |
180 | @Override
181 | protected Parcelable onSaveInstanceState() {
182 | Parcelable superState = super.onSaveInstanceState();
183 |
184 | return new SavedState(superState, mMhz, mKhz);
185 | }
186 |
187 | @Override
188 | protected void onRestoreInstanceState(Parcelable state) {
189 | SavedState ss = (SavedState) state;
190 | super.onRestoreInstanceState(ss.getSuperState());
191 | mMhz = ss.getMHz();
192 | mKhz = ss.getKHz();
193 | }
194 |
195 | private String[] getKHzStrings(int min, int stepSize) {
196 | if (stepSize == 100) {
197 | return (get100KHzStrings());
198 | } else if (stepSize == 50) {
199 | return (get50KHzStrings());
200 | }
201 | return (get200KHzStrings(min));
202 | }
203 |
204 | private int getKHzCount(int stepSize) {
205 | if (stepSize == 100) {
206 | return (10);
207 | } else if (stepSize == 50) {
208 | return (20);
209 | }
210 | return (5);
211 | }
212 |
213 | private int getCurrentKHz(int frequency, int min, int stepSize) {
214 | if (stepSize == 100) {
215 | return (getCurrent100KHz(frequency));
216 | } else if (stepSize == 50) {
217 | return (getCurrent50KHz(frequency));
218 | }
219 | return (getCurrent200KHz(frequency, min));
220 | }
221 |
222 | private int getFrequencyKHz(int kHz, int min, int stepSize) {
223 | if (stepSize == 100) {
224 | return (getFrequency100KHz(kHz));
225 | } else if (stepSize == 50) {
226 | return (getFrequency50KHz(kHz));
227 | }
228 | return (getFrequency200KHz(kHz, min));
229 | }
230 |
231 | private int getFrequency100KHz(int kHz) {
232 | int frequencykhz = ((kHz - 1) * 100);
233 | // Log.d("FMRadio", "FP: getCurrent100KHz: " + frequencykhz);
234 | return (frequencykhz);
235 | }
236 |
237 | private int getFrequency50KHz(int kHz) {
238 | int frequencykhz = ((kHz - 1) * 50);
239 | // Log.d("FMRadio", "FP: getCurrent100KHz: " + frequencykhz);
240 | return (frequencykhz);
241 | }
242 |
243 | private int getFrequency200KHz(int kHz, int min) {
244 | int frequencykhz = ((kHz - 1) * 200);
245 | if (min % 200 != 0) {
246 | frequencykhz = ((kHz - 1) * 200) + 100;
247 | }
248 | // Log.d("FMRadio", "FP: getCurrent200KHz: " + frequencykhz);
249 | return (frequencykhz);
250 | }
251 |
252 | private int getCurrent100KHz(int frequency) {
253 | int khz = ((frequency % 1000) / 100);
254 | // Log.d("FMRadio", "FP: getCurrent100KHz: " + khz);
255 | return (khz + 1);
256 | }
257 |
258 | private int getCurrent50KHz(int frequency) {
259 | int khz = ((frequency % 1000) / 50);
260 | // Log.d("FMRadio", "FP: getCurrent50KHz: " + khz);
261 | return (khz + 1);
262 | }
263 |
264 | private int getCurrent200KHz(int frequency, int min) {
265 | int khz = ((frequency % 1000) / 200);
266 | // Log.d("FMRadio", "FP: getCurrent200KHz: " + khz);
267 | return (khz + 1);
268 | }
269 |
270 | private String[] get50KHzStrings() {
271 | String[] khzStrings = {
272 | "00", "05", "10", "15", "20", "25", "30", "35", "40", "45", "50", "55", "60", "65",
273 | "70", "75", "80", "85", "90", "95"
274 | };
275 | // Log.d("FMRadio", "FP: get50KHzStrings");
276 | return khzStrings;
277 | }
278 |
279 | private String[] get100KHzStrings() {
280 | String[] khzStrings = {
281 | "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"
282 | };
283 | // Log.d("FMRadio", "FP: get100KHzStrings");
284 | return khzStrings;
285 | }
286 |
287 | private String[] get200KHzStrings(int min) {
288 | if (min % 200 == 0) {
289 | return (getEven200KHzStrings());
290 | }
291 | return (getOdd200KHzStrings());
292 | }
293 |
294 | private String[] getEven200KHzStrings() {
295 | String[] khzStrings = {
296 | "0", "2", "4", "6", "8"
297 | };
298 | // Log.d("FMRadio", "FP: getEven200KHzStrings");
299 | return khzStrings;
300 | }
301 |
302 | private String[] getOdd200KHzStrings() {
303 | String[] khzStrings = {
304 | "1", "3", "5", "7", "9"
305 | };
306 | // Log.d("FMRadio", "FP: getOdd200KHzStrings");
307 | return khzStrings;
308 | }
309 |
310 | /**
311 | * Initialize the state.
312 | *
313 | * @param year The initial year.
314 | * @param monthOfYear The initial month.
315 | * @param dayOfMonth The initial day of the month.
316 | * @param onDateChangedListener How user is notified date is changed by
317 | * user, can be null.
318 | */
319 | public void init(int min, int max, int step, int frequency,
320 | OnFrequencyChangedListener onFrequencyChangedListener) {
321 |
322 | mMin = min;
323 | mMax = max;
324 | mStep = step;
325 | mFrequency = frequency;
326 | mOnFrequencyChangedListener = onFrequencyChangedListener;
327 |
328 | updateSpinners();
329 | }
330 |
331 | private void updateSpinnerRange() {
332 | String[] khzStrings = getKHzStrings(mMin, mStep);
333 | int khzNumSteps = getKHzCount(mStep);
334 |
335 | mMHzPicker.setRange(mMin / 1000, mMax / 1000);
336 | mKHzPicker.setRange(1, khzNumSteps, khzStrings);
337 | }
338 |
339 | private void updateSpinners() {
340 | int khzNumSteps = getKHzCount(mStep);
341 | updateSpinnerRange();
342 | mMhz = (int) (mFrequency / 1000);
343 | mKhz = getCurrentKHz(mFrequency, mMin, mStep);
344 | if ((mMin / 1000 <= mMhz) && (mMax / 1000 >= mMhz)) {
345 | mMHzPicker.setCurrent(mMhz);
346 | }
347 | if (mKhz <= khzNumSteps) {
348 | mKHzPicker.setCurrent(mKhz);
349 | }
350 | }
351 |
352 | private void validateFrequencyRange() {
353 | boolean bUpdateSpinner = false;
354 | if (mFrequency < mMin) {
355 | mFrequency = mMin;
356 | bUpdateSpinner = true;
357 | }
358 | if (mFrequency > mMax) {
359 | mFrequency = mMax;
360 | bUpdateSpinner = true;
361 | }
362 | if (bUpdateSpinner == true) {
363 | updateSpinners();
364 | }
365 | }
366 |
367 | public int getFrequency() {
368 | return (mFrequency);
369 | }
370 |
371 | public static String formatFrequencyString(int frequency) {
372 | // 87500 => 875, 93750 => 937
373 | int temp = frequency / 100;
374 | // 875=>87.5 937=>93.7
375 | double frequncyToShow = temp / 10.0;
376 | return String.valueOf(frequncyToShow);
377 | }
378 | }
379 |
--------------------------------------------------------------------------------
/src/com/android/fm/utils/FrequencyPickerDialog.java:
--------------------------------------------------------------------------------
1 |
2 | package com.android.fm.utils;
3 |
4 | import android.app.AlertDialog;
5 | import android.content.Context;
6 | import android.content.DialogInterface;
7 | import android.content.DialogInterface.OnClickListener;
8 | import android.os.Bundle;
9 | import android.util.Log;
10 | import android.view.LayoutInflater;
11 | import android.view.View;
12 | import android.hardware.fmradio.FmConfig;
13 | import android.hardware.fmradio.FmReceiver;
14 |
15 | import com.android.fm.R;
16 | import com.android.fm.radio.FmSharedPreferences;
17 | import com.android.fm.utils.FrequencyPicker.OnFrequencyChangedListener;
18 |
19 | /**
20 | * A simple dialog containing an FrequencyPicker.
21 | */
22 | public class FrequencyPickerDialog extends AlertDialog implements OnClickListener,
23 | OnFrequencyChangedListener {
24 |
25 | private static final String FREQUENCY = "FREQUENCY";
26 |
27 | private static final String FREQ_MIN = "FREQ_MIN";
28 |
29 | private static final String FREQ_MAX = "FREQ_MAX";
30 |
31 | private static final String FREQ_STEP = "FREQ_STEP";
32 |
33 | private final FrequencyPicker mFrequencyPicker;
34 |
35 | private final OnFrequencySetListener mCallBack;
36 |
37 | private int mMinFrequency;
38 |
39 | private int mMaxFrequency;
40 |
41 | private int mChannelSpacing;
42 |
43 | /**
44 | * The callback used to indicate the user is done filling in the date.
45 | */
46 | public interface OnFrequencySetListener {
47 |
48 | void onFrequencySet(FrequencyPicker view, int frequency);
49 | }
50 |
51 | /**
52 | */
53 | public FrequencyPickerDialog(Context context, FmConfig fmConfig, int frequency,
54 | OnFrequencySetListener callback) {
55 | // this(context, android.R.style.Theme_Dialog, fmConfig, frequency,
56 | // callback);
57 | this(context, com.android.internal.R.style.Theme_Dialog_Alert, fmConfig, frequency,
58 | callback);
59 | }
60 |
61 | /**
62 | */
63 | public FrequencyPickerDialog(Context context, int theme, FmConfig fmConfig, int frequency,
64 | OnFrequencySetListener callback) {
65 | super(context, theme);
66 | mMinFrequency = fmConfig.getLowerLimit();
67 | mMaxFrequency = fmConfig.getUpperLimit();
68 | mChannelSpacing = 200;
69 | if (FmReceiver.FM_CHSPACE_200_KHZ == fmConfig.getChSpacing()) {
70 | mChannelSpacing = 200;
71 | } else if (FmReceiver.FM_CHSPACE_100_KHZ == fmConfig.getChSpacing()) {
72 | mChannelSpacing = 100;
73 | } else if (FmReceiver.FM_CHSPACE_50_KHZ == fmConfig.getChSpacing()) {
74 | mChannelSpacing = 50;
75 | }
76 | String frequencyString = getContext().getString(R.string.stat_notif_frequency,
77 | FrequencyPicker.formatFrequencyString(frequency));
78 | setTitle(frequencyString);
79 | mCallBack = callback;
80 |
81 | setButton(context.getString(R.string.alert_dialog_ok), this);
82 | setButton2(context.getString(R.string.alert_dialog_cancel), (OnClickListener) null);
83 |
84 | LayoutInflater inflater = (LayoutInflater) context
85 | .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
86 | View view = inflater.inflate(R.layout.frequency_picker_dialog, null);
87 | setView(view);
88 | mFrequencyPicker = (FrequencyPicker) view.findViewById(R.id.frequencyPicker);
89 | if (mFrequencyPicker != null) {
90 | mFrequencyPicker.init(mMinFrequency, mMaxFrequency, mChannelSpacing, frequency, this);
91 | } else {
92 | Log.e("fmRadio", "Failed to find ID: R.id.frequencyPicker");
93 | }
94 | }
95 |
96 | public void UpdateFrequency(int frequency) {
97 | String frequencyString = getContext().getString(R.string.stat_notif_frequency,
98 | FrequencyPicker.formatFrequencyString(frequency));
99 | setTitle(frequencyString);
100 | mFrequencyPicker.updateFrequency(frequency);
101 | }
102 |
103 | public void onClick(DialogInterface dialog, int which) {
104 | if (mCallBack != null) {
105 | mFrequencyPicker.clearFocus();
106 | int frequency = mFrequencyPicker.getFrequency();
107 | mCallBack.onFrequencySet(mFrequencyPicker, frequency);
108 | }
109 | }
110 |
111 | public void onFrequencyChanged(FrequencyPicker view, int frequency) {
112 | UpdateFrequency(frequency);
113 | }
114 |
115 | @Override
116 | public Bundle onSaveInstanceState() {
117 | Bundle state = super.onSaveInstanceState();
118 | state.putInt(FREQUENCY, mFrequencyPicker.getFrequency());
119 | state.putInt(FREQ_MIN, mMinFrequency);
120 | state.putInt(FREQ_MAX, mMaxFrequency);
121 | state.putInt(FREQ_STEP, mChannelSpacing);
122 | return state;
123 | }
124 |
125 | @Override
126 | public void onRestoreInstanceState(Bundle savedInstanceState) {
127 | super.onRestoreInstanceState(savedInstanceState);
128 | int frequency = savedInstanceState.getInt(FREQUENCY);
129 | mMinFrequency = savedInstanceState.getInt(FREQ_MIN);
130 | mMaxFrequency = savedInstanceState.getInt(FREQ_MAX);
131 | mChannelSpacing = savedInstanceState.getInt(FREQ_STEP);
132 | mFrequencyPicker.init(mMinFrequency, mMaxFrequency, mChannelSpacing, frequency, this);
133 | String frequencyString = getContext().getString(R.string.stat_notif_frequency,
134 | FrequencyPicker.formatFrequencyString(frequency));
135 | setTitle(frequencyString);
136 | }
137 | }
138 |
--------------------------------------------------------------------------------